ngx-joyride
Version:
An Angular Tour (Joyride) library built entirely in Angular, without using any heavy external dependencies like Bootstrap or JQuery. From now on you can easily guide your users through your site showing them all the sections and features.
176 lines • 37.4 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./document.service";
import * as i2 from "./joyride-options.service";
export class JoyrideBackdropService {
constructor(documentService, optionsService, rendererFactory) {
this.documentService = documentService;
this.optionsService = optionsService;
this.rendererFactory = rendererFactory;
this.lastXScroll = 0;
this.lastYScroll = 0;
this.setRenderer();
}
setRenderer() {
this.renderer = this.rendererFactory.createRenderer(null, null);
}
draw(step) {
this.elementRef = step.targetViewContainer;
this.targetAbsoluteTop = this.getTargetTotalTop(step);
this.targetAbsoluteLeft = this.getTargetTotalLeft(step);
this.currentBackdropContainer = this.renderer.createElement('div');
this.renderer.addClass(this.currentBackdropContainer, 'backdrop-container');
this.renderer.setStyle(this.currentBackdropContainer, 'position', 'fixed');
this.renderer.setStyle(this.currentBackdropContainer, 'top', '0px');
this.renderer.setStyle(this.currentBackdropContainer, 'left', '0px');
this.renderer.setStyle(this.currentBackdropContainer, 'width', '100%');
this.renderer.setStyle(this.currentBackdropContainer, 'height', '100%');
this.renderer.setStyle(this.currentBackdropContainer, 'z-index', '1000');
this.renderer.setAttribute(this.currentBackdropContainer, 'id', 'backdrop-' + step.name);
this.backdropContent = this.renderer.createElement('div');
this.renderer.addClass(this.backdropContent, 'backdrop-content');
this.renderer.setStyle(this.backdropContent, 'position', 'relative');
this.renderer.setStyle(this.backdropContent, 'height', '100%');
this.renderer.setStyle(this.backdropContent, 'display', 'flex');
this.renderer.setStyle(this.backdropContent, 'flex-direction', 'column');
this.renderer.appendChild(this.currentBackdropContainer, this.backdropContent);
this.backdropTop = this.renderer.createElement('div');
this.renderer.addClass(this.backdropTop, 'joyride-backdrop');
this.renderer.addClass(this.backdropTop, 'backdrop-top');
this.renderer.setStyle(this.backdropTop, 'width', '100%');
this.renderer.setStyle(this.backdropTop, 'height', this.targetAbsoluteTop - this.lastYScroll + 'px');
this.renderer.setStyle(this.backdropTop, 'flex-shrink', '0');
this.renderer.setStyle(this.backdropTop, 'background-color', `rgba(${this.optionsService.getBackdropColor()}, 0.7)`);
this.renderer.appendChild(this.backdropContent, this.backdropTop);
this.backdropMiddleContainer = this.renderer.createElement('div');
this.renderer.addClass(this.backdropMiddleContainer, 'backdrop-middle-container');
this.renderer.setStyle(this.backdropMiddleContainer, 'height', this.elementRef.element.nativeElement.offsetHeight + 'px');
this.renderer.setStyle(this.backdropMiddleContainer, 'width', '100%');
this.renderer.setStyle(this.backdropMiddleContainer, 'flex-shrink', '0');
this.renderer.appendChild(this.backdropContent, this.backdropMiddleContainer);
this.backdropMiddleContent = this.renderer.createElement('div');
this.renderer.addClass(this.backdropMiddleContent, 'backdrop-middle-content');
this.renderer.setStyle(this.backdropMiddleContent, 'display', 'flex');
this.renderer.setStyle(this.backdropMiddleContent, 'width', '100%');
this.renderer.setStyle(this.backdropMiddleContent, 'height', '100%');
this.renderer.appendChild(this.backdropMiddleContainer, this.backdropMiddleContent);
this.leftBackdrop = this.renderer.createElement('div');
this.renderer.addClass(this.leftBackdrop, 'joyride-backdrop');
this.renderer.addClass(this.leftBackdrop, 'backdrop-left');
this.renderer.setStyle(this.leftBackdrop, 'flex-shrink', '0');
this.renderer.setStyle(this.leftBackdrop, 'width', this.targetAbsoluteLeft - this.lastXScroll + 'px');
this.renderer.setStyle(this.leftBackdrop, 'background-color', `rgba(${this.optionsService.getBackdropColor()}, 0.7)`);
this.renderer.appendChild(this.backdropMiddleContent, this.leftBackdrop);
this.targetBackdrop = this.renderer.createElement('div');
this.renderer.addClass(this.targetBackdrop, 'backdrop-target');
this.renderer.setStyle(this.targetBackdrop, 'flex-shrink', '0');
this.renderer.setStyle(this.targetBackdrop, 'width', this.elementRef.element.nativeElement.offsetWidth + 'px');
this.renderer.appendChild(this.backdropMiddleContent, this.targetBackdrop);
this.rightBackdrop = this.renderer.createElement('div');
this.renderer.addClass(this.rightBackdrop, 'joyride-backdrop');
this.renderer.addClass(this.rightBackdrop, 'backdrop-right');
this.renderer.setStyle(this.rightBackdrop, 'width', '100%');
this.renderer.setStyle(this.rightBackdrop, 'background-color', `rgba(${this.optionsService.getBackdropColor()}, 0.7)`);
this.renderer.appendChild(this.backdropMiddleContent, this.rightBackdrop);
this.backdropBottom = this.renderer.createElement('div');
this.renderer.addClass(this.backdropBottom, 'joyride-backdrop');
this.renderer.addClass(this.backdropBottom, 'backdrop-bottom');
this.renderer.setStyle(this.backdropBottom, 'width', '100%');
this.renderer.setStyle(this.backdropBottom, 'height', '100%');
this.renderer.setStyle(this.backdropBottom, 'background-color', `rgba(${this.optionsService.getBackdropColor()}, 0.7)`);
this.renderer.appendChild(this.backdropContent, this.backdropBottom);
this.removeLastBackdrop();
this.drawCurrentBackdrop();
this.lastBackdropContainer = this.currentBackdropContainer;
}
remove() {
this.removeLastBackdrop();
}
redrawTarget(step) {
this.targetAbsoluteLeft = this.getTargetTotalLeft(step);
this.targetAbsoluteTop = this.getTargetTotalTop(step);
this.handleVerticalScroll(step);
this.handleHorizontalScroll(step);
}
getTargetTotalTop(step) {
let targetVC = step.targetViewContainer;
return step.isElementOrAncestorFixed
? this.documentService.getElementFixedTop(targetVC.element)
: this.documentService.getElementAbsoluteTop(targetVC.element);
}
getTargetTotalLeft(step) {
let targetVC = step.targetViewContainer;
return step.isElementOrAncestorFixed
? this.documentService.getElementFixedLeft(targetVC.element)
: this.documentService.getElementAbsoluteLeft(targetVC.element);
}
redraw(step, scroll) {
if (this.lastYScroll !== scroll.scrollY) {
this.lastYScroll = scroll.scrollY;
if (this.elementRef) {
this.handleVerticalScroll(step);
}
}
if (this.lastXScroll !== scroll.scrollX) {
this.lastXScroll = scroll.scrollX;
if (this.elementRef) {
this.handleHorizontalScroll(step);
}
}
}
handleHorizontalScroll(step) {
let newBackdropLeftWidth = step.isElementOrAncestorFixed ? this.targetAbsoluteLeft : this.targetAbsoluteLeft - this.lastXScroll;
if (newBackdropLeftWidth >= 0) {
this.renderer.setStyle(this.leftBackdrop, 'width', newBackdropLeftWidth + 'px');
this.renderer.setStyle(this.targetBackdrop, 'width', this.elementRef.element.nativeElement.offsetWidth + 'px');
}
else {
this.handleTargetPartialWidth(newBackdropLeftWidth);
}
}
handleTargetPartialWidth(newBackdropLeftWidth) {
this.renderer.setStyle(this.leftBackdrop, 'width', 0 + 'px');
let visibleTargetWidth = this.elementRef.element.nativeElement.offsetWidth + newBackdropLeftWidth;
if (visibleTargetWidth >= 0) {
this.renderer.setStyle(this.targetBackdrop, 'width', visibleTargetWidth + 'px');
}
else {
this.renderer.setStyle(this.targetBackdrop, 'width', 0 + 'px');
}
}
handleVerticalScroll(step) {
let newBackdropTopHeight = step.isElementOrAncestorFixed ? this.targetAbsoluteTop : this.targetAbsoluteTop - this.lastYScroll;
if (newBackdropTopHeight >= 0) {
this.renderer.setStyle(this.backdropTop, 'height', newBackdropTopHeight + 'px');
this.renderer.setStyle(this.backdropMiddleContainer, 'height', this.elementRef.element.nativeElement.offsetHeight + 'px');
}
else {
this.handleTargetPartialHeight(newBackdropTopHeight);
}
}
handleTargetPartialHeight(newBackdropTopHeight) {
this.renderer.setStyle(this.backdropTop, 'height', 0 + 'px');
let visibleTargetHeight = this.elementRef.element.nativeElement.offsetHeight + newBackdropTopHeight;
if (visibleTargetHeight >= 0) {
this.renderer.setStyle(this.backdropMiddleContainer, 'height', visibleTargetHeight + 'px');
}
else {
this.renderer.setStyle(this.backdropMiddleContainer, 'height', 0 + 'px');
}
}
removeLastBackdrop() {
if (this.lastBackdropContainer) {
this.renderer.removeChild(document.body, this.lastBackdropContainer);
this.lastBackdropContainer = undefined;
}
}
drawCurrentBackdrop() {
this.renderer.appendChild(document.body, this.currentBackdropContainer);
}
}
JoyrideBackdropService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideBackdropService, deps: [{ token: i1.DocumentService }, { token: i2.JoyrideOptionsService }, { token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable });
JoyrideBackdropService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideBackdropService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideBackdropService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.DocumentService }, { type: i2.JoyrideOptionsService }, { type: i0.RendererFactory2 }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam95cmlkZS1iYWNrZHJvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWpveXJpZGUvc3JjL2xpYi9zZXJ2aWNlcy9qb3lyaWRlLWJhY2tkcm9wLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBaUQsTUFBTSxlQUFlLENBQUM7Ozs7QUFPMUYsTUFBTSxPQUFPLHNCQUFzQjtJQWtCL0IsWUFDcUIsZUFBZ0MsRUFDaEMsY0FBcUMsRUFDckMsZUFBaUM7UUFGakMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUFOOUMsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFPNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxXQUFXO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFpQjtRQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx3QkFBd0Is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O1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDNUU7SUFDTCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3RCLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztTQUMxQztJQUNMLENBQUM7SUFFTyxtQkFBbUI7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM1RSxDQUFDOzttSEF6TVEsc0JBQXNCO3VIQUF0QixzQkFBc0I7MkZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFJlbmRlcmVyMiwgUmVuZGVyZXJGYWN0b3J5MiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9jdW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9kb2N1bWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFNjcm9sbCB9IGZyb20gJy4vZXZlbnQtbGlzdGVuZXIuc2VydmljZSc7XG5pbXBvcnQgeyBKb3lyaWRlT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuL2pveXJpZGUtb3B0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IEpveXJpZGVTdGVwIH0gZnJvbSAnLi4vbW9kZWxzL2pveXJpZGUtc3RlcC5jbGFzcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKb3lyaWRlQmFja2Ryb3BTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gICAgcHJpdmF0ZSBjdXJyZW50QmFja2Ryb3BDb250YWluZXI6IGFueTtcbiAgICBwcml2YXRlIGxhc3RCYWNrZHJvcENvbnRhaW5lcjogYW55O1xuICAgIHByaXZhdGUgYmFja2Ryb3BDb250ZW50OiBhbnk7XG4gICAgcHJpdmF0ZSBiYWNrZHJvcFRvcDogYW55O1xuICAgIHByaXZhdGUgYmFja2Ryb3BCb3R0b206IGFueTtcbiAgICBwcml2YXRlIGJhY2tkcm9wTWlkZGxlQ29udGFpbmVyOiBhbnk7XG4gICAgcHJpdmF0ZSBiYWNrZHJvcE1pZGRsZUNvbnRlbnQ6IGFueTtcbiAgICBwcml2YXRlIGxlZnRCYWNrZHJvcDogYW55O1xuICAgIHByaXZhdGUgdGFyZ2V0QmFja2Ryb3A6IGFueTtcbiAgICBwcml2YXRlIHJpZ2h0QmFja2Ryb3A6IGFueTtcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IFZpZXdDb250YWluZXJSZWY7XG4gICAgcHJpdmF0ZSB0YXJnZXRBYnNvbHV0ZVRvcDogbnVtYmVyO1xuICAgIHByaXZhdGUgdGFyZ2V0QWJzb2x1dGVMZWZ0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBsYXN0WFNjcm9sbDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGxhc3RZU2Nyb2xsOiBudW1iZXIgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uc1NlcnZpY2U6IEpveXJpZGVPcHRpb25zU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTJcbiAgICApIHtcbiAgICAgICAgdGhpcy5zZXRSZW5kZXJlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UmVuZGVyZXIoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcbiAgICB9XG5cbiAgICBkcmF3KHN0ZXA6IEpveXJpZGVTdGVwKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IHN0ZXAudGFyZ2V0Vmlld0NvbnRhaW5lcjtcbiAgICAgICAgdGhpcy50YXJnZXRBYnNvbHV0ZVRvcCA9IHRoaXMuZ2V0VGFyZ2V0VG90YWxUb3Aoc3RlcCk7XG4gICAgICAgIHRoaXMudGFyZ2V0QWJzb2x1dGVMZWZ0ID0gdGhpcy5nZXRUYXJnZXRUb3RhbExlZnQoc3RlcCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50QmFja2Ryb3BDb250YWluZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuY3VycmVudEJhY2tkcm9wQ29udGFpbmVyLCAnYmFja2Ryb3AtY29udGFpbmVyJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jdXJyZW50QmFja2Ryb3BDb250YWluZXIsICdwb3NpdGlvbicsICdmaXhlZCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY3VycmVudEJhY2tkcm9wQ29udGFpbmVyLCAndG9wJywgJzBweCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY3VycmVudEJhY2tkcm9wQ29udGFpbmVyLCAnbGVmdCcsICcwcHgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmN1cnJlbnRCYWNrZHJvcENvbnRhaW5lciwgJ3dpZHRoJywgJzEwMCUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmN1cnJlbnRCYWNrZHJvcENvbnRhaW5lciwgJ2hlaWdodCcsICcxMDAlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jdXJyZW50QmFja2Ryb3BDb250YWluZXIsICd6LWluZGV4JywgJzEwMDAnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5jdXJyZW50QmFja2Ryb3BDb250YWluZXIsICdpZCcsICdiYWNrZHJvcC0nICsgc3RlcC5uYW1lKTtcblxuICAgICAgICB0aGlzLmJhY2tkcm9wQ29udGVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5iYWNrZHJvcENvbnRlbnQsICdiYWNrZHJvcC1jb250ZW50Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iYWNrZHJvcENvbnRlbnQsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BDb250ZW50LCAnaGVpZ2h0JywgJzEwMCUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tkcm9wQ29udGVudCwgJ2Rpc3BsYXknLCAnZmxleCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BDb250ZW50LCAnZmxleC1kaXJlY3Rpb24nLCAnY29sdW1uJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5jdXJyZW50QmFja2Ryb3BDb250YWluZXIsIHRoaXMuYmFja2Ryb3BDb250ZW50KTtcblxuICAgICAgICB0aGlzLmJhY2tkcm9wVG9wID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJhY2tkcm9wVG9wLCAnam95cmlkZS1iYWNrZHJvcCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYmFja2Ryb3BUb3AsICdiYWNrZHJvcC10b3AnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tkcm9wVG9wLCAnd2lkdGgnLCAnMTAwJScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BUb3AsICdoZWlnaHQnLCB0aGlzLnRhcmdldEFic29sdXRlVG9wIC0gdGhpcy5sYXN0WVNjcm9sbCArICdweCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BUb3AsICdmbGV4LXNocmluaycsICcwJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iYWNrZHJvcFRvcCwgJ2JhY2tncm91bmQtY29sb3InLCBgcmdiYSgke3RoaXMub3B0aW9uc1NlcnZpY2UuZ2V0QmFja2Ryb3BDb2xvcigpfSwgMC43KWApO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuYmFja2Ryb3BDb250ZW50LCB0aGlzLmJhY2tkcm9wVG9wKTtcblxuICAgICAgICB0aGlzLmJhY2tkcm9wTWlkZGxlQ29udGFpbmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJhY2tkcm9wTWlkZGxlQ29udGFpbmVyLCAnYmFja2Ryb3AtbWlkZGxlLWNvbnRhaW5lcicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BNaWRkbGVDb250YWluZXIsICdoZWlnaHQnLCB0aGlzLmVsZW1lbnRSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BNaWRkbGVDb250YWluZXIsICd3aWR0aCcsICcxMDAlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5iYWNrZHJvcE1pZGRsZUNvbnRhaW5lciwgJ2ZsZXgtc2hyaW5rJywgJzAnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmJhY2tkcm9wQ29udGVudCwgdGhpcy5iYWNrZHJvcE1pZGRsZUNvbnRhaW5lcik7XG5cbiAgICAgICAgdGhpcy5iYWNrZHJvcE1pZGRsZUNvbnRlbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYmFja2Ryb3BNaWRkbGVDb250ZW50LCAnYmFja2Ryb3AtbWlkZGxlLWNvbnRlbnQnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tkcm9wTWlkZGxlQ29udGVudCwgJ2Rpc3BsYXknLCAnZmxleCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BNaWRkbGVDb250ZW50LCAnd2lkdGgnLCAnMTAwJScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BNaWRkbGVDb250ZW50LCAnaGVpZ2h0JywgJzEwMCUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmJhY2tkcm9wTWlkZGxlQ29udGFpbmVyLCB0aGlzLmJhY2tkcm9wTWlkZGxlQ29udGVudCk7XG5cbiAgICAgICAgdGhpcy5sZWZ0QmFja2Ryb3AgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubGVmdEJhY2tkcm9wLCAnam95cmlkZS1iYWNrZHJvcCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMubGVmdEJhY2tkcm9wLCAnYmFja2Ryb3AtbGVmdCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubGVmdEJhY2tkcm9wLCAnZmxleC1zaHJpbmsnLCAnMCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubGVmdEJhY2tkcm9wLCAnd2lkdGgnLCB0aGlzLnRhcmdldEFic29sdXRlTGVmdCAtIHRoaXMubGFzdFhTY3JvbGwgKyAncHgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmxlZnRCYWNrZHJvcCwgJ2JhY2tncm91bmQtY29sb3InLCBgcmdiYSgke3RoaXMub3B0aW9uc1NlcnZpY2UuZ2V0QmFja2Ryb3BDb2xvcigpfSwgMC43KWApO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuYmFja2Ryb3BNaWRkbGVDb250ZW50LCB0aGlzLmxlZnRCYWNrZHJvcCk7XG5cbiAgICAgICAgdGhpcy50YXJnZXRCYWNrZHJvcCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy50YXJnZXRCYWNrZHJvcCwgJ2JhY2tkcm9wLXRhcmdldCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFyZ2V0QmFja2Ryb3AsICdmbGV4LXNocmluaycsICcwJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50YXJnZXRCYWNrZHJvcCwgJ3dpZHRoJywgdGhpcy5lbGVtZW50UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArICdweCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuYmFja2Ryb3BNaWRkbGVDb250ZW50LCB0aGlzLnRhcmdldEJhY2tkcm9wKTtcblxuICAgICAgICB0aGlzLnJpZ2h0QmFja2Ryb3AgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMucmlnaHRCYWNrZHJvcCwgJ2pveXJpZGUtYmFja2Ryb3AnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnJpZ2h0QmFja2Ryb3AsICdiYWNrZHJvcC1yaWdodCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmlnaHRCYWNrZHJvcCwgJ3dpZHRoJywgJzEwMCUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpZ2h0QmFja2Ryb3AsICdiYWNrZ3JvdW5kLWNvbG9yJywgYHJnYmEoJHt0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldEJhY2tkcm9wQ29sb3IoKX0sIDAuNylgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmJhY2tkcm9wTWlkZGxlQ29udGVudCwgdGhpcy5yaWdodEJhY2tkcm9wKTtcblxuICAgICAgICB0aGlzLmJhY2tkcm9wQm90dG9tID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmJhY2tkcm9wQm90dG9tLCAnam95cmlkZS1iYWNrZHJvcCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuYmFja2Ryb3BCb3R0b20sICdiYWNrZHJvcC1ib3R0b20nKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tkcm9wQm90dG9tLCAnd2lkdGgnLCAnMTAwJScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BCb3R0b20sICdoZWlnaHQnLCAnMTAwJScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BCb3R0b20sICdiYWNrZ3JvdW5kLWNvbG9yJywgYHJnYmEoJHt0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldEJhY2tkcm9wQ29sb3IoKX0sIDAuNylgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmJhY2tkcm9wQ29udGVudCwgdGhpcy5iYWNrZHJvcEJvdHRvbSk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVMYXN0QmFja2Ryb3AoKTtcbiAgICAgICAgdGhpcy5kcmF3Q3VycmVudEJhY2tkcm9wKCk7XG4gICAgICAgIHRoaXMubGFzdEJhY2tkcm9wQ29udGFpbmVyID0gdGhpcy5jdXJyZW50QmFja2Ryb3BDb250YWluZXI7XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnJlbW92ZUxhc3RCYWNrZHJvcCgpO1xuICAgIH1cblxuICAgIHJlZHJhd1RhcmdldChzdGVwOiBKb3lyaWRlU3RlcCkge1xuICAgICAgICB0aGlzLnRhcmdldEFic29sdXRlTGVmdCA9IHRoaXMuZ2V0VGFyZ2V0VG90YWxMZWZ0KHN0ZXApO1xuICAgICAgICB0aGlzLnRhcmdldEFic29sdXRlVG9wID0gdGhpcy5nZXRUYXJnZXRUb3RhbFRvcChzdGVwKTtcbiAgICAgICAgdGhpcy5oYW5kbGVWZXJ0aWNhbFNjcm9sbChzdGVwKTtcbiAgICAgICAgdGhpcy5oYW5kbGVIb3Jpem9udGFsU2Nyb2xsKHN0ZXApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VGFyZ2V0VG90YWxUb3Aoc3RlcDogSm95cmlkZVN0ZXApIHtcbiAgICAgICAgbGV0IHRhcmdldFZDID0gc3RlcC50YXJnZXRWaWV3Q29udGFpbmVyO1xuICAgICAgICByZXR1cm4gc3RlcC5pc0VsZW1lbnRPckFuY2VzdG9yRml4ZWRcbiAgICAgICAgICAgID8gdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0RWxlbWVudEZpeGVkVG9wKHRhcmdldFZDLmVsZW1lbnQpXG4gICAgICAgICAgICA6IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldEVsZW1lbnRBYnNvbHV0ZVRvcCh0YXJnZXRWQy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRhcmdldFRvdGFsTGVmdChzdGVwOiBKb3lyaWRlU3RlcCkge1xuICAgICAgICBsZXQgdGFyZ2V0VkMgPSBzdGVwLnRhcmdldFZpZXdDb250YWluZXI7XG5cbiAgICAgICAgcmV0dXJuIHN0ZXAuaXNFbGVtZW50T3JBbmNlc3RvckZpeGVkXG4gICAgICAgICAgICA/IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldEVsZW1lbnRGaXhlZExlZnQodGFyZ2V0VkMuZWxlbWVudClcbiAgICAgICAgICAgIDogdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0RWxlbWVudEFic29sdXRlTGVmdCh0YXJnZXRWQy5lbGVtZW50KTtcbiAgICB9XG4gICAgcmVkcmF3KHN0ZXA6IEpveXJpZGVTdGVwLCBzY3JvbGw6IFNjcm9sbCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0WVNjcm9sbCAhPT0gc2Nyb2xsLnNjcm9sbFkpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFlTY3JvbGwgPSBzY3JvbGwuc2Nyb2xsWTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnRSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVZlcnRpY2FsU2Nyb2xsKHN0ZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxhc3RYU2Nyb2xsICE9PSBzY3JvbGwuc2Nyb2xsWCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0WFNjcm9sbCA9IHNjcm9sbC5zY3JvbGxYO1xuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSG9yaXpvbnRhbFNjcm9sbChzdGVwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlSG9yaXpvbnRhbFNjcm9sbChzdGVwOiBKb3lyaWRlU3RlcCkge1xuICAgICAgICBsZXQgbmV3QmFja2Ryb3BMZWZ0V2lkdGggPSBzdGVwLmlzRWxlbWVudE9yQW5jZXN0b3JGaXhlZCA/IHRoaXMudGFyZ2V0QWJzb2x1dGVMZWZ0IDogdGhpcy50YXJnZXRBYnNvbHV0ZUxlZnQgLSB0aGlzLmxhc3RYU2Nyb2xsO1xuXG4gICAgICAgIGlmIChuZXdCYWNrZHJvcExlZnRXaWR0aCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubGVmdEJhY2tkcm9wLCAnd2lkdGgnLCBuZXdCYWNrZHJvcExlZnRXaWR0aCArICdweCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhcmdldEJhY2tkcm9wLCAnd2lkdGgnLCB0aGlzLmVsZW1lbnRSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgJ3B4Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRhcmdldFBhcnRpYWxXaWR0aChuZXdCYWNrZHJvcExlZnRXaWR0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVRhcmdldFBhcnRpYWxXaWR0aChuZXdCYWNrZHJvcExlZnRXaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5sZWZ0QmFja2Ryb3AsICd3aWR0aCcsIDAgKyAncHgnKTtcbiAgICAgICAgbGV0IHZpc2libGVUYXJnZXRXaWR0aCA9IHRoaXMuZWxlbWVudFJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyBuZXdCYWNrZHJvcExlZnRXaWR0aDtcbiAgICAgICAgaWYgKHZpc2libGVUYXJnZXRXaWR0aCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFyZ2V0QmFja2Ryb3AsICd3aWR0aCcsIHZpc2libGVUYXJnZXRXaWR0aCArICdweCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhcmdldEJhY2tkcm9wLCAnd2lkdGgnLCAwICsgJ3B4Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVZlcnRpY2FsU2Nyb2xsKHN0ZXA6IEpveXJpZGVTdGVwKSB7XG4gICAgICAgIGxldCBuZXdCYWNrZHJvcFRvcEhlaWdodCA9IHN0ZXAuaXNFbGVtZW50T3JBbmNlc3RvckZpeGVkID8gdGhpcy50YXJnZXRBYnNvbHV0ZVRvcCA6IHRoaXMudGFyZ2V0QWJzb2x1dGVUb3AgLSB0aGlzLmxhc3RZU2Nyb2xsO1xuXG4gICAgICAgIGlmIChuZXdCYWNrZHJvcFRvcEhlaWdodCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BUb3AsICdoZWlnaHQnLCBuZXdCYWNrZHJvcFRvcEhlaWdodCArICdweCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tkcm9wTWlkZGxlQ29udGFpbmVyLCAnaGVpZ2h0JywgdGhpcy5lbGVtZW50UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKyAncHgnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVGFyZ2V0UGFydGlhbEhlaWdodChuZXdCYWNrZHJvcFRvcEhlaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVRhcmdldFBhcnRpYWxIZWlnaHQobmV3QmFja2Ryb3BUb3BIZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuYmFja2Ryb3BUb3AsICdoZWlnaHQnLCAwICsgJ3B4Jyk7XG4gICAgICAgIGxldCB2aXNpYmxlVGFyZ2V0SGVpZ2h0ID0gdGhpcy5lbGVtZW50UmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKyBuZXdCYWNrZHJvcFRvcEhlaWdodDtcbiAgICAgICAgaWYgKHZpc2libGVUYXJnZXRIZWlnaHQgPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tkcm9wTWlkZGxlQ29udGFpbmVyLCAnaGVpZ2h0JywgdmlzaWJsZVRhcmdldEhlaWdodCArICdweCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJhY2tkcm9wTWlkZGxlQ29udGFpbmVyLCAnaGVpZ2h0JywgMCArICdweCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVMYXN0QmFja2Ryb3AoKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RCYWNrZHJvcENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCB0aGlzLmxhc3RCYWNrZHJvcENvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLmxhc3RCYWNrZHJvcENvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZHJhd0N1cnJlbnRCYWNrZHJvcCgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCB0aGlzLmN1cnJlbnRCYWNrZHJvcENvbnRhaW5lcik7XG4gICAgfVxufVxuIl19