UNPKG

@tripetto/runner-autoscroll

Version:

Autoscroll UI for running Tripetto forms and surveys.

449 lines (448 loc) 42.4 kB
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from "@angular/core"; import { isPromise } from "@tripetto/runner"; import { run } from "@tripetto/runner-autoscroll"; import * as i0 from "@angular/core"; export class TripettoAutoscrollComponent { /** Retrieves a reference to the runner instance. */ get controller() { return this.runnerController; } /** Retrieves the running definition. */ get definition() { return this.runnerController?.definition || this.initialDefinition; } /** Specifies the definition to run. */ set definition(definition) { if (this.runnerController && definition) { this.zone.runOutsideAngular(() => { if (isPromise(definition)) { definition.then((value) => { if (value) { this.runnerController.definition = value; } }); } else if (definition) { this.runnerController.l10n = definition; } }); return; } this.initialDefinition = definition; } /** Retrieves the view mode of the runner. */ get view() { return this.runnerController?.view || this.initialView || "live"; } /** Specifies the view mode of the runner. */ set view(view) { if (this.runnerController) { this.zone.runOutsideAngular(() => { this.runnerController.view = view; }); return; } this.initialView = view; } /** Retrieves the styles (colors, font, size, etc.) for the runner. */ get styles() { return this.runnerController?.styles || this.initialStyles; } /** Specifies the styles (colors, font, size, etc.) for the runner. */ set styles(styles) { if (this.runnerController) { this.zone.runOutsideAngular(() => { if (isPromise(styles)) { styles.then((value) => { if (value) { this.runnerController.styles = value; } }); } else if (styles) { this.runnerController.styles = styles; } }); return; } this.initialStyles = styles; } /** Retrieves the localization (locale and translation) information. */ get l10n() { return this.runnerController?.l10n || this.initialL10n; } /** Specifies the localization (locale and translation) information. */ set l10n(l10n) { if (this.runnerController) { this.zone.runOutsideAngular(() => { if (isPromise(l10n)) { l10n.then((value) => { if (value) { this.runnerController.l10n = value; } }); } else if (l10n) { this.runnerController.l10n = l10n; } }); return; } this.initialL10n = l10n; } /** Reference to a builder instance to enable live preview for the builder. */ set builder(ref) { if (!ref) { this.builderController = undefined; } else { new Promise((resolve) => { const fnAwait = () => { if (typeof ref === "function") { const builder = ref(); if (builder) { return resolve(builder.controller); } } else if (ref.controller) { return resolve(ref.controller); } requestAnimationFrame(fnAwait); }; fnAwait(); }).then((controller) => { this.builderController = controller; controller.hook("OnChange", "synchronous", (changeEvent) => { if (this.runnerController) { this.runnerController.definition = changeEvent.definition; } }); controller.hook("OnEdit", "synchronous", (editEvent) => { this.runnerController?.doPreview(editEvent.data); }); }); } } get builder() { return ( this.builderController && { controller: this.builderController, } ); } constructor(element, zone) { this.element = element; this.zone = zone; /** Invoked when the runner is ready. */ this.onReady = new EventEmitter(); /** Invoked when the runner processed a change. */ this.onChange = new EventEmitter(); /** Invoked when data can be imported into the instance. */ this.onImport = new EventEmitter(); /** Invoked when the data in the runner is changed. */ this.onData = new EventEmitter(); /** Specifies a function that is invoked when the user performs an action. */ this.onAction = new EventEmitter(); /** Invoked when the runner is about to end and submits data. */ this.onSubmit = new EventEmitter(); /** Invoked when the runner is completed (after the data is submitted). */ this.onComplete = new EventEmitter(); /** Specifies a function that is invoked when an edit action is requested. */ this.onEdit = new EventEmitter(); /** Specifies a function that is invoked when the runner is "touched" by a user. */ this.onTouch = new EventEmitter(); /** Invoked when the runner is destroyed. */ this.onDestroy = new EventEmitter(); } ngOnInit() { this.zone.runOutsideAngular(async () => { this.runnerController = await run({ element: this.element.nativeElement, definition: this.definition, view: this.initialView, display: this.display, snapshot: this.snapshot, styles: this.styles, persistent: this.persistent, license: this.license, removeBranding: this.removeBranding, attachments: this.attachments, className: this.className, customStyle: this.customStyle, customCSS: this.customCSS, l10n: this.l10n, language: this.language, locale: this.locale, translations: this.translations, onReady: (instance) => this.onReady.emit(instance), onChange: (instance) => this.onChange.emit(instance), onImport: (instance) => this.onImport.emit(instance), onData: (instance) => this.onData.emit(instance), onAction: (type, definition, block) => this.onAction.emit({ type, definition, block, }), onSubmit: (instance, language, locale, namespace) => this.onSubmit.emit({ instance, language, locale, namespace, }), onComplete: (instance, id) => this.onComplete.emit({ instance, id, }), onEdit: (type, id) => { if (this.builderController) { switch (type) { case "prologue": this.builderController.edit("prologue"); break; case "epilogue": this.builderController.edit("epilogue", id); break; case "block": if (id) { this.builderController.edit("node", id); } break; } } this.onEdit.emit({ type, id, }); }, onReload: this.onReload, onPause: this.onPause, onTouch: () => this.onTouch.emit(), onDestroy: () => this.onDestroy.emit(), }); }); } ngOnDestroy() { if (this.runnerController) { this.runnerController.destroy(); this.runnerController = this.builderController = undefined; } } } TripettoAutoscrollComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: TripettoAutoscrollComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component, }); TripettoAutoscrollComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: TripettoAutoscrollComponent, selector: "tripetto-runner-autoscroll", inputs: { definition: "definition", view: "view", styles: "styles", l10n: "l10n", display: "display", snapshot: "snapshot", persistent: "persistent", license: "license", removeBranding: "removeBranding", attachments: "attachments", className: "className", customStyle: "customStyle", customCSS: "customCSS", language: "language", locale: "locale", translations: "translations", onReload: "onReload", onPause: "onPause", builder: "builder", }, outputs: { onReady: "onReady", onChange: "onChange", onImport: "onImport", onData: "onData", onAction: "onAction", onSubmit: "onSubmit", onComplete: "onComplete", onEdit: "onEdit", onTouch: "onTouch", onDestroy: "onDestroy", }, ngImport: i0, template: "", isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: TripettoAutoscrollComponent, decorators: [ { type: Component, args: [ { selector: "tripetto-runner-autoscroll", template: "", changeDetection: ChangeDetectionStrategy.OnPush, }, ], }, ], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { definition: [ { type: Input, }, ], view: [ { type: Input, }, ], styles: [ { type: Input, }, ], l10n: [ { type: Input, }, ], display: [ { type: Input, }, ], snapshot: [ { type: Input, }, ], persistent: [ { type: Input, }, ], license: [ { type: Input, }, ], removeBranding: [ { type: Input, }, ], attachments: [ { type: Input, }, ], className: [ { type: Input, }, ], customStyle: [ { type: Input, }, ], customCSS: [ { type: Input, }, ], language: [ { type: Input, }, ], locale: [ { type: Input, }, ], translations: [ { type: Input, }, ], onReady: [ { type: Output, }, ], onChange: [ { type: Output, }, ], onImport: [ { type: Output, }, ], onData: [ { type: Output, }, ], onAction: [ { type: Output, }, ], onSubmit: [ { type: Output, }, ], onComplete: [ { type: Output, }, ], onEdit: [ { type: Output, }, ], onTouch: [ { type: Output, }, ], onDestroy: [ { type: Output, }, ], onReload: [ { type: Input, }, ], onPause: [ { type: Input, }, ], builder: [ { type: Input, }, ], }, }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbmd1bGFyL3Byb2plY3RzL3J1bm5lci9zcmMvbGliL3J1bm5lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUE2QixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkksT0FBTyxFQUErRCxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRyxPQUFPLEVBT0gsR0FBRyxHQUNOLE1BQU0sNkJBQTZCLENBQUM7O0FBU3JDLE1BQU0sT0FBTywyQkFBMkI7SUFRcEMsb0RBQW9EO0lBQ3BELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUN2RSxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLElBQWEsVUFBVSxDQUFDLFVBQXNFO1FBQzFGLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLFVBQVUsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDN0IsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ3ZCLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDdEIsSUFBSSxLQUFLLEVBQUU7NEJBQ1AsSUFBSSxDQUFDLGdCQUFpQixDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7eUJBQzdDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2lCQUNOO3FCQUFNLElBQUksVUFBVSxFQUFFO29CQUNuQixJQUFJLENBQUMsZ0JBQWlCLENBQUMsSUFB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c0JBQWhCLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdPLE9BQU87c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgSURlZmluaXRpb24sIElIb29rUGF5bG9hZCwgSVNuYXBzaG90LCBJbnN0YW5jZSwgTDEwbiwgVEwxMG4sIGlzUHJvbWlzZSB9IGZyb20gXCJAdHJpcGV0dG8vcnVubmVyXCI7XG5pbXBvcnQge1xuICAgIElBdXRvc2Nyb2xsUnVubmVyLFxuICAgIElBdXRvc2Nyb2xsU25hcHNob3QsXG4gICAgSUF1dG9zY3JvbGxTdHlsZXMsXG4gICAgSUJ1aWxkZXJJbnN0YW5jZSxcbiAgICBUQXV0b3Njcm9sbERpc3BsYXksXG4gICAgVEF1dG9zY3JvbGxQYXVzZSxcbiAgICBydW4sXG59IGZyb20gXCJAdHJpcGV0dG8vcnVubmVyLWF1dG9zY3JvbGxcIjtcbmltcG9ydCB7IElSdW5uZXJBdHRhY2htZW50cywgVFJ1bm5lclByZXZpZXdEYXRhLCBUUnVubmVyVmlld3MgfSBmcm9tIFwiQHRyaXBldHRvL3J1bm5lci1yZWFjdC1ob29rXCI7XG5pbXBvcnQgeyBDU1NQcm9wZXJ0aWVzIH0gZnJvbSBcInJlYWN0XCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcInRyaXBldHRvLXJ1bm5lci1hdXRvc2Nyb2xsXCIsXG4gICAgdGVtcGxhdGU6IFwiXCIsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRyaXBldHRvQXV0b3Njcm9sbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJ1bm5lckNvbnRyb2xsZXI/OiBJQXV0b3Njcm9sbFJ1bm5lcjtcbiAgICBwcml2YXRlIGJ1aWxkZXJDb250cm9sbGVyPzogSUJ1aWxkZXJJbnN0YW5jZTtcbiAgICBwcml2YXRlIGluaXRpYWxEZWZpbml0aW9uPzogSURlZmluaXRpb24gfCBQcm9taXNlPElEZWZpbml0aW9uIHwgdW5kZWZpbmVkPjtcbiAgICBwcml2YXRlIGluaXRpYWxWaWV3PzogVFJ1bm5lclZpZXdzIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgaW5pdGlhbFN0eWxlcz86IElBdXRvc2Nyb2xsU3R5bGVzIHwgUHJvbWlzZTxJQXV0b3Njcm9sbFN0eWxlcyB8IHVuZGVmaW5lZD47XG4gICAgcHJpdmF0ZSBpbml0aWFsTDEwbj86IFRMMTBuIHwgUHJvbWlzZTxUTDEwbiB8IHVuZGVmaW5lZD47XG5cbiAgICAvKiogUmV0cmlldmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBydW5uZXIgaW5zdGFuY2UuICovXG4gICAgZ2V0IGNvbnRyb2xsZXIoKTogSUF1dG9zY3JvbGxSdW5uZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXJDb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKiBSZXRyaWV2ZXMgdGhlIHJ1bm5pbmcgZGVmaW5pdGlvbi4gKi9cbiAgICBnZXQgZGVmaW5pdGlvbigpOiBJRGVmaW5pdGlvbiB8IFByb21pc2U8SURlZmluaXRpb24gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyQ29udHJvbGxlcj8uZGVmaW5pdGlvbiB8fCB0aGlzLmluaXRpYWxEZWZpbml0aW9uO1xuICAgIH1cblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIGRlZmluaXRpb24gdG8gcnVuLiAqL1xuICAgIEBJbnB1dCgpIHNldCBkZWZpbml0aW9uKGRlZmluaXRpb246IElEZWZpbml0aW9uIHwgUHJvbWlzZTxJRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlciAmJiBkZWZpbml0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb21pc2UoZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbi50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyIS5kZWZpbml0aW9uID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIhLmwxMG4gPSBkZWZpbml0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxEZWZpbml0aW9uID0gZGVmaW5pdGlvbjtcbiAgICB9XG5cbiAgICAvKiogUmV0cmlldmVzIHRoZSB2aWV3IG1vZGUgb2YgdGhlIHJ1bm5lci4gKi9cbiAgICBnZXQgdmlldygpOiBUUnVubmVyVmlld3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXJDb250cm9sbGVyPy52aWV3IHx8IHRoaXMuaW5pdGlhbFZpZXcgfHwgXCJsaXZlXCI7XG4gICAgfVxuXG4gICAgLyoqIFNwZWNpZmllcyB0aGUgdmlldyBtb2RlIG9mIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgc2V0IHZpZXcodmlldzogVFJ1bm5lclZpZXdzKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyIS52aWV3ID0gdmlldztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxWaWV3ID0gdmlldztcbiAgICB9XG5cbiAgICAvKiogUmV0cmlldmVzIHRoZSBzdHlsZXMgKGNvbG9ycywgZm9udCwgc2l6ZSwgZXRjLikgZm9yIHRoZSBydW5uZXIuICovXG4gICAgZ2V0IHN0eWxlcygpOiBJQXV0b3Njcm9sbFN0eWxlcyB8IFByb21pc2U8SUF1dG9zY3JvbGxTdHlsZXMgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyQ29udHJvbGxlcj8uc3R5bGVzIHx8IHRoaXMuaW5pdGlhbFN0eWxlcztcbiAgICB9XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBzdHlsZXMgKGNvbG9ycywgZm9udCwgc2l6ZSwgZXRjLikgZm9yIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgc2V0IHN0eWxlcyhzdHlsZXM6IElBdXRvc2Nyb2xsU3R5bGVzIHwgUHJvbWlzZTxJQXV0b3Njcm9sbFN0eWxlcyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKHN0eWxlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIhLnN0eWxlcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIhLnN0eWxlcyA9IHN0eWxlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsU3R5bGVzID0gc3R5bGVzO1xuICAgIH1cblxuICAgIC8qKiBSZXRyaWV2ZXMgdGhlIGxvY2FsaXphdGlvbiAobG9jYWxlIGFuZCB0cmFuc2xhdGlvbikgaW5mb3JtYXRpb24uICovXG4gICAgZ2V0IGwxMG4oKTogVEwxMG4gfCBQcm9taXNlPFRMMTBuIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bm5lckNvbnRyb2xsZXI/LmwxMG4gfHwgdGhpcy5pbml0aWFsTDEwbjtcbiAgICB9XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBsb2NhbGl6YXRpb24gKGxvY2FsZSBhbmQgdHJhbnNsYXRpb24pIGluZm9ybWF0aW9uLiAqL1xuICAgIEBJbnB1dCgpIHNldCBsMTBuKGwxMG46IFRMMTBuIHwgUHJvbWlzZTxUTDEwbiB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKGwxMG4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGwxMG4udGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlciEubDEwbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGwxMG4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyIS5sMTBuID0gbDEwbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0aWFsTDEwbiA9IGwxMG47XG4gICAgfVxuXG4gICAgLyoqIFNwZWNpZmllcyB0aGUgZGlzcGxheSBtb2RlIG9mIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgZGlzcGxheT86IFRBdXRvc2Nyb2xsRGlzcGxheTtcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIHNuYXBzaG90IHRoYXQgc2hvdWxkIGJlIHJlc3RvcmVkLiAqL1xuICAgIEBJbnB1dCgpIHNuYXBzaG90PzogSVNuYXBzaG90PElBdXRvc2Nyb2xsU25hcHNob3Q+IHwgUHJvbWlzZTxJU25hcHNob3Q8SUF1dG9zY3JvbGxTbmFwc2hvdD4gfCB1bmRlZmluZWQ+O1xuXG4gICAgLyoqIFRyeSB0byBzdG9yZSBzZXNzaW9ucyBpbiB0aGUgbG9jYWwgc3RvcmUgdG8gcHJlc2VydmUgcGVyc2lzdGVuY3kgb24gbmF2aWdhdGlvbiBiZXR3ZWVuIG11bHRpcGxlIHBhZ2VzIHRoYXQgaG9zdCB0aGUgcnVubmVyLiAqL1xuICAgIEBJbnB1dCgpIHBlcnNpc3RlbnQ/OiBib29sZWFuO1xuXG4gICAgLyoqIFNwZWNpZmllcyBhIGxpY2Vuc2UgY29kZSBmb3IgdGhlIHJ1bm5lci4gKi9cbiAgICBASW5wdXQoKSBsaWNlbnNlPzogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG4gICAgLyoqIFJlbW92ZXMgYWxsIFRyaXBldHRvIGJyYW5kaW5nIHdoZW4gYSB2YWxpZCBsaWNlbnNlIGlzIHN1cHBsaWVkLiAqL1xuICAgIEBJbnB1dCgpIHJlbW92ZUJyYW5kaW5nPzogYm9vbGVhbjtcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIGF0dGFjaG1lbnRzIGhhbmRsZXIuICovXG4gICAgQElucHV0KCkgYXR0YWNobWVudHM/OiBJUnVubmVyQXR0YWNobWVudHM7XG5cbiAgICAvKiogU3BlY2lmaWVzIGEgY3VzdG9tIGNsYXNzIG5hbWUgZm9yIHRoZSBIVE1MIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgcnVubmVyLiAqL1xuICAgIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAgIC8qKiBTcGVjaWZpZXMgdGhlIGlubGluZSBzdHlsZSBmb3IgdGhlIEhUTUwgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBydW5uZXIuICovXG4gICAgQElucHV0KCkgY3VzdG9tU3R5bGU/OiBDU1NQcm9wZXJ0aWVzO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGN1c3RvbSBDU1MgcnVsZXMuXG4gICAgICogVG8gc3BlY2lmeSBydWxlcyBmb3IgYSBzcGVjaWZpYyBibG9jaywgdXNlIHRoaXMgc2VsZWN0b3I6IFtkYXRhLWJsb2NrPVwiPGJsb2NrIGlkZW50aWZpZXI+XCJdIHsgLi4uIH1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBjdXN0b21DU1M/OiBzdHJpbmc7XG5cbiAgICAvKiogU3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQgbGFuZ3VhZ2UgKHdoZW4gbm8gbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkIGluIHRoZSBkZWZpbml0aW9uKS4gKi9cbiAgICBASW5wdXQoKSBsYW5ndWFnZT86IHN0cmluZztcblxuICAgIC8qKiBQcm92aWRlcyBsb2NhbGUgaW5mb3JtYXRpb24uICovXG4gICAgQElucHV0KCkgbG9jYWxlPzogTDEwbi5JTG9jYWxlIHwgKChsb2NhbGU6IHN0cmluZykgPT4gTDEwbi5JTG9jYWxlIHwgUHJvbWlzZTxMMTBuLklMb2NhbGUgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkKTtcblxuICAgIC8qKiBQcm92aWRlcyB0cmFuc2xhdGlvbnMuICovXG4gICAgQElucHV0KCkgdHJhbnNsYXRpb25zPzpcbiAgICAgICAgfCBMMTBuLlRUcmFuc2xhdGlvblxuICAgICAgICB8IEwxMG4uVFRyYW5zbGF0aW9uW11cbiAgICAgICAgfCAoKFxuICAgICAgICAgICAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgICAgICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHZlcnNpb246IHN0cmluZ1xuICAgICAgICAgICkgPT4gTDEwbi5UVHJhbnNsYXRpb24gfCBMMTBuLlRUcmFuc2xhdGlvbltdIHwgUHJvbWlzZTxMMTBuLlRUcmFuc2xhdGlvbiB8IEwxMG4uVFRyYW5zbGF0aW9uW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkKTtcblxuICAgIC8qKiBJbnZva2VkIHdoZW4gdGhlIHJ1bm5lciBpcyByZWFkeS4gKi9cbiAgICBAT3V0cHV0KCkgb25SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8SW5zdGFuY2U+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBydW5uZXIgcHJvY2Vzc2VkIGEgY2hhbmdlLiAqL1xuICAgIEBPdXRwdXQoKSBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW5zdGFuY2U+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIGRhdGEgY2FuIGJlIGltcG9ydGVkIGludG8gdGhlIGluc3RhbmNlLiAqL1xuICAgIEBPdXRwdXQoKSBvbkltcG9ydCA9IG5ldyBFdmVudEVtaXR0ZXI8SW5zdGFuY2U+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBkYXRhIGluIHRoZSBydW5uZXIgaXMgY2hhbmdlZC4gKi9cbiAgICBAT3V0cHV0KCkgb25EYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxJbnN0YW5jZT4oKTtcblxuICAgIC8qKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgdXNlciBwZXJmb3JtcyBhbiBhY3Rpb24uICovXG4gICAgQE91dHB1dCgpIG9uQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6IFwic3RhcnRcIiB8IFwic3RhZ2VcIiB8IFwidW5zdGFnZVwiIHwgXCJmb2N1c1wiIHwgXCJibHVyXCIgfCBcInBhdXNlXCIgfCBcImNvbXBsZXRlXCI7XG4gICAgICAgIHJlYWRvbmx5IGRlZmluaXRpb246IHtcbiAgICAgICAgICAgIHJlYWRvbmx5IGZpbmdlcnByaW50OiBzdHJpbmc7XG4gICAgICAgICAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRvbmx5IGJsb2NrPzoge1xuICAgICAgICAgICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIH0+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBydW5uZXIgaXMgYWJvdXQgdG8gZW5kIGFuZCBzdWJtaXRzIGRhdGEuICovXG4gICAgQE91dHB1dCgpIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIHJlYWRvbmx5IGluc3RhbmNlOiBJbnN0YW5jZTtcbiAgICAgICAgcmVhZG9ubHkgbGFuZ3VhZ2U6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgbG9jYWxlOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIH0+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBydW5uZXIgaXMgY29tcGxldGVkIChhZnRlciB0aGUgZGF0YSBpcyBzdWJtaXR0ZWQpLiAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIHJlYWRvbmx5IGluc3RhbmNlOiBJbnN0YW5jZTtcbiAgICAgICAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gICAgfT4oKTtcblxuICAgIC8qKiBTcGVjaWZpZXMgYSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgd2hlbiBhbiBlZGl0IGFjdGlvbiBpcyByZXF1ZXN0ZWQuICovXG4gICAgQE91dHB1dCgpIG9uRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgICAgICByZWFkb25seSB0eXBlOiBcInByb2xvZ3VlXCIgfCBcImVwaWxvZ3VlXCIgfCBcInN0eWxlc1wiIHwgXCJsMTBuXCIgfCBcImJsb2NrXCI7XG4gICAgICAgIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAgIH0+KCk7XG5cbiAgICAvKiogU3BlY2lmaWVzIGEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIHJ1bm5lciBpcyBcInRvdWNoZWRcIiBieSBhIHVzZXIuICovXG4gICAgQE91dHB1dCgpIG9uVG91Y2ggPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogSW52b2tlZCB3aGVuIHRoZSBydW5uZXIgaXMgZGVzdHJveWVkLiAqL1xuICAgIEBPdXRwdXQoKSBvbkRlc3Ryb3kgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogU3BlY2lmaWVzIGEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIHJ1bm5lciB3YW50cyB0byByZWxvYWQgdGhlIGRlZmluaXRpb24uICovXG4gICAgQElucHV0KCkgb25SZWxvYWQ/OiAoKSA9PiBJRGVmaW5pdGlvbiB8IFByb21pc2U8SURlZmluaXRpb24+O1xuXG4gICAgLyoqIFNwZWNpZmllcyBhIGZ1bmN0aW9uIG9yIHJlY2lwZSB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgcnVubmVyIHdhbnRzIHRvIHBhdXNlLiAqL1xuICAgIEBJbnB1dCgpIG9uUGF1c2U/OiBUQXV0b3Njcm9sbFBhdXNlO1xuXG4gICAgLyoqIFJlZmVyZW5jZSB0byBhIGJ1aWxkZXIgaW5zdGFuY2UgdG8gZW5hYmxlIGxpdmUgcHJldmlldyBmb3IgdGhlIGJ1aWxkZXIuICovXG4gICAgQElucHV0KCkgc2V0IGJ1aWxkZXIoXG4gICAgICAgIHJlZjpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgY29udHJvbGxlcjogSUJ1aWxkZXJJbnN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgY29udHJvbGxlcjogSUJ1aWxkZXJJbnN0YW5jZTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHwgdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICAgIGlmICghcmVmKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmU6IChjb250cm9sbGVyOiBJQnVpbGRlckluc3RhbmNlKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm5Bd2FpdCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVpbGRlciA9IHJlZigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVpbGRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGJ1aWxkZXIuY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVmLmNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlZi5jb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmbkF3YWl0KTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgZm5Bd2FpdCgpO1xuICAgICAgICAgICAgfSkudGhlbigoY29udHJvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuXG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5ob29rPFxuICAgICAgICAgICAgICAgICAgICBcIk9uQ2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIElIb29rUGF5bG9hZDxcIk9uQ2hhbmdlXCI+ICYge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgZGVmaW5pdGlvbjogSURlZmluaXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+KFwiT25DaGFuZ2VcIiwgXCJzeW5jaHJvbm91c1wiLCAoY2hhbmdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyLmRlZmluaXRpb24gPSBjaGFuZ2VFdmVudC5kZWZpbml0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmhvb2s8XCJPbkVkaXRcIiwgSUhvb2tQYXlsb2FkPFwiT25FZGl0XCI+ICYgeyByZWFkb25seSBkYXRhOiBUUnVubmVyUHJldmlld0RhdGEgfT4oXG4gICAgICAgICAgICAgICAgICAgIFwiT25FZGl0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3luY2hyb25vdXNcIixcbiAgICAgICAgICAgICAgICAgICAgKGVkaXRFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyPy5kb1ByZXZpZXcoZWRpdEV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGJ1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyICYmIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyOiB0aGlzLmJ1aWxkZXJDb250cm9sbGVyLFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgem9uZTogTmdab25lXG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJ1bm5lckNvbnRyb2xsZXIgPSBhd2FpdCBydW4oe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246IHRoaXMuZGVmaW5pdGlvbixcbiAgICAgICAgICAgICAgICB2aWV3OiB0aGlzLmluaXRpYWxWaWV3LFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRoaXMuZGlzcGxheSxcbiAgICAgICAgICAgICAgICBzbmFwc2hvdDogdGhpcy5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IHRoaXMuc3R5bGVzLFxuICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQ6IHRoaXMucGVyc2lzdGVudCxcbiAgICAgICAgICAgICAgICBsaWNlbnNlOiB0aGlzLmxpY2Vuc2UsXG4gICAgICAgICAgICAgICAgcmVtb3ZlQnJhbmRpbmc6IHRoaXMucmVtb3ZlQnJhbmRpbmcsXG4gICAgICAgICAgICAgICAgYXR0YWNobWVudHM6IHRoaXMuYXR0YWNobWVudHMsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICBjdXN0b21TdHlsZTogdGhpcy5jdXN0b21TdHlsZSxcbiAgICAgICAgICAgICAgICBjdXN0b21DU1M6IHRoaXMuY3VzdG9tQ1NTLFxuICAgICAgICAgICAgICAgIGwxMG46IHRoaXMubDEwbixcbiAgICAgICAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uczogdGhpcy50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgICAgICAgb25SZWFkeTogKGluc3RhbmNlKSA9PiB0aGlzLm9uUmVhZHkuZW1pdChpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgb25DaGFuZ2U6IChpbnN0YW5jZSkgPT4gdGhpcy5vbkNoYW5nZS5lbWl0KGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBvbkltcG9ydDogKGluc3RhbmNlKSA9PiB0aGlzLm9uSW1wb3J0LmVtaXQoaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgIG9uRGF0YTogKGluc3RhbmNlKSA9PiB0aGlzLm9uRGF0YS5lbWl0KGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBvbkFjdGlvbjogKHR5cGUsIGRlZmluaXRpb24sIGJsb2NrKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQWN0aW9uLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgb25TdWJtaXQ6IChpbnN0YW5jZSwgbGFuZ3VhZ2UsIGxvY2FsZSwgbmFtZXNwYWNlKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU3VibWl0LmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgb25Db21wbGV0ZTogKGluc3RhbmNlLCBpZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNvbXBsZXRlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgb25FZGl0OiAodHlwZSwgaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRlckNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJwcm9sb2d1ZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXJDb250cm9sbGVyLmVkaXQoXCJwcm9sb2d1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVwaWxvZ3VlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbnRyb2xsZXIuZWRpdChcImVwaWxvZ3VlXCIsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJsb2NrXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29udHJvbGxlci5lZGl0KFwibm9kZVwiLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRWRpdC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvblJlbG9hZDogdGhpcy5vblJlbG9hZCxcbiAgICAgICAgICAgICAgICBvblBhdXNlOiB0aGlzLm9uUGF1c2UsXG4gICAgICAgICAgICAgICAgb25Ub3VjaDogKCkgPT4gdGhpcy5vblRvdWNoLmVtaXQoKSxcbiAgICAgICAgICAgICAgICBvbkRlc3Ryb3k6ICgpID0+IHRoaXMub25EZXN0cm95LmVtaXQoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyQ29udHJvbGxlcikge1xuICAgICAgICAgICAgdGhpcy5ydW5uZXJDb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMucnVubmVyQ29udHJvbGxlciA9IHRoaXMuYnVpbGRlckNvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=