@ruc-lib/tour-guide 2.1.8 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,382 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, Renderer2, ElementRef, ViewChild } from '@angular/core';
2
- import { DEFAULT_VALUES, defaultTourGuideConfig } from '../model/default-config.model';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/material/button";
6
- import * as i3 from "@angular/material/card";
7
- export class RuclibTourGuideComponent {
8
- /**
9
- * class constructor
10
- * @param tourGuideService
11
- * @param renderer
12
- */
13
- constructor(renderer) {
14
- this.renderer = renderer;
15
- this.rucEvent = new EventEmitter();
16
- this.showStartButton = false;
17
- this.dataSource = [];
18
- this.currentStepIndex = 0;
19
- this.showTour = false;
20
- this.startTourButtonLabel = DEFAULT_VALUES?.startTourButtonLabel;
21
- this.config = defaultTourGuideConfig;
22
- /**
23
- * method to navigate between tour slides or skip tour using left, right and skip key
24
- * @param event
25
- * @returns
26
- */
27
- this.handleKey = (event) => {
28
- if (!this.showTour)
29
- return;
30
- if (event.key === DEFAULT_VALUES.arrowRight)
31
- this.nextStep();
32
- else if (event.key === DEFAULT_VALUES.arrowLeft)
33
- this.previousStep();
34
- else if (event.key === DEFAULT_VALUES.escape)
35
- this.skip();
36
- };
37
- }
38
- /**
39
- * handling input data changes
40
- * updating default config with user provided config
41
- * @param changes
42
- */
43
- ngOnChanges(changes) {
44
- if (changes && changes['rucInputData'] && changes['rucInputData'].currentValue) {
45
- this.config = { ...this.config, ...changes['rucInputData'].currentValue };
46
- }
47
- }
48
- /**
49
- * handling change on component initilization
50
- */
51
- ngOnInit() {
52
- document.addEventListener('keydown', this.handleKey);
53
- this.resizeListener = this.debounce(() => this.highlightElement(), 150);
54
- window.addEventListener('resize', this.resizeListener);
55
- if (!this.showStartButton) {
56
- this.startTour();
57
- }
58
- }
59
- /**
60
- * this method handle the start of tour guide fetaure
61
- */
62
- startTour() {
63
- this.showTour = true;
64
- this.lockScroll();
65
- setTimeout(() => {
66
- if (!this.originalParent) {
67
- this.originalParent = this.renderer.parentNode(this.overlayRef?.nativeElement);
68
- }
69
- if (this.overlayRef) {
70
- this.renderer.appendChild(document.body, this.overlayRef?.nativeElement);
71
- }
72
- this.currentStepIndex = 0;
73
- if (this.config.type === 'advance') {
74
- this.highlightElement();
75
- }
76
- }, 10);
77
- }
78
- /**
79
- * this method handle the navigation to next tour guide feature
80
- */
81
- nextStep() {
82
- this.removeHighlight();
83
- this.currentStepIndex++;
84
- if (this.currentStepIndex < this.dataSource.length) {
85
- if (this.config.type === 'advance')
86
- this.highlightElement();
87
- }
88
- else {
89
- this.currentStepIndex--;
90
- this.showTour = false;
91
- this.unlockScroll();
92
- this.rucEvent.emit({ eventName: 'onTourComplete', eventOutput: null });
93
- if (this.overlayRef) {
94
- this.renderer.removeChild(document.body, this.overlayRef.nativeElement);
95
- }
96
- }
97
- }
98
- /**
99
- * this method allow us to navigate back to previous tour guide feature
100
- */
101
- previousStep() {
102
- if (this.currentStepIndex > 0) {
103
- this.removeHighlight();
104
- this.currentStepIndex--;
105
- if (this.config.type === 'advance')
106
- this.highlightElement();
107
- }
108
- }
109
- /**
110
- * method to skip the tour guide thats in progress
111
- */
112
- skip() {
113
- this.removeHighlight();
114
- this.showTour = false;
115
- this.unlockScroll();
116
- this.rucEvent.emit({ eventName: 'onTourSkip', eventOutput: null });
117
- if (this.overlayRef) {
118
- this.renderer.removeChild(document.body, this.overlayRef.nativeElement);
119
- }
120
- }
121
- /**
122
- * method to highlight feature area and changin details popup based on provide config
123
- * @returns
124
- */
125
- async highlightElement() {
126
- const step = this.dataSource[this.currentStepIndex];
127
- if (this.config.type === 'simple' || !step?.selector) {
128
- return;
129
- }
130
- // 1. Find and scroll to the element
131
- this.currentElement = await this.findElementAndScroll(step.selector);
132
- if (!this.currentElement) {
133
- return;
134
- }
135
- // 2. Apply highlight styles
136
- this.applyHighlightStyles(this.currentElement);
137
- // 3. Calculate and apply popup position
138
- this.calculateAndApplyPopupPosition(this.currentElement, step.position);
139
- // 4. Create the visual hole in the overlay
140
- this.createTransparentHole();
141
- }
142
- /**
143
- * Finds an element by its selector, scrolls it into view, and waits for the scroll to complete.
144
- * @param selector The CSS selector for the target element.
145
- * @returns A promise that resolves to the HTMLElement or undefined if not found.
146
- */
147
- async findElementAndScroll(selector) {
148
- const element = document.querySelector(selector);
149
- if (!element) {
150
- return undefined;
151
- }
152
- element.scrollIntoView({ behavior: 'smooth', block: 'center' });
153
- await this.waitForScroll();
154
- return element;
155
- }
156
- /**
157
- * Applies CSS classes and styles to visually highlight the target element.
158
- * @param element The element to highlight.
159
- */
160
- applyHighlightStyles(element) {
161
- this.renderer.addClass(element, 'tour-highlight');
162
- this.renderer.setStyle(element, 'position', 'relative');
163
- this.renderer.setStyle(element, 'z-index', '10000');
164
- }
165
- /**
166
- * Calculates the optimal position for the tour popup and applies it.
167
- * @param element The highlighted element.
168
- * @param position The desired position ('auto', 'top', 'bottom', 'left', 'right').
169
- */
170
- calculateAndApplyPopupPosition(element, position = 'auto') {
171
- const rect = element.getBoundingClientRect();
172
- const offset = this.getAbsoluteOffset(element);
173
- // Determine the best position if set to 'auto'
174
- const finalPosition = this.determineAutoPosition(position, rect);
175
- // Get the top/left coordinates based on the position
176
- let coords = this.computePopupCoordinates(finalPosition, offset, element);
177
- // Ensure the coordinates are within the viewport
178
- coords = this.clampPopupCoordinates(coords);
179
- // Apply the final styles to the popup
180
- this.popupStyle = {
181
- top: `${coords.top}px`,
182
- left: `${coords.left}px`
183
- };
184
- // Ensure the popup itself is visible
185
- this.scrollPopupIntoView();
186
- }
187
- /**
188
- * Determines the best placement for the popup when position is 'auto'.
189
- * @param position The configured position.
190
- * @param rect The BoundingClientRect of the target element.
191
- * @returns The calculated final position.
192
- */
193
- determineAutoPosition(position, rect) {
194
- if (position !== 'auto') {
195
- return position;
196
- }
197
- const { padding, width: popupWidth, height: popupHeight, safeMargin } = DEFAULT_VALUES.popup;
198
- const fitsTop = rect.top >= popupHeight + padding;
199
- const fitsBottom = window.innerHeight - rect.bottom >= popupHeight + padding + safeMargin;
200
- const fitsRight = window.innerWidth - rect.right >= popupWidth + padding;
201
- const fitsLeft = rect.left >= popupWidth + padding;
202
- if (fitsRight)
203
- return 'right';
204
- if (fitsBottom)
205
- return 'bottom';
206
- if (fitsLeft)
207
- return 'left';
208
- if (fitsTop)
209
- return 'top';
210
- return 'bottom'; // fallback
211
- }
212
- /**
213
- * Computes the top and left coordinates for the popup based on the target element and desired position.
214
- * @param position The final position for the popup.
215
- * @param offset The absolute offset of the target element.
216
- * @param element The target element.
217
- * @returns An object with top and left coordinates.
218
- */
219
- computePopupCoordinates(position, offset, element) {
220
- const { padding, width: popupWidth, height: popupHeight } = DEFAULT_VALUES.popup;
221
- let top = DEFAULT_VALUES.popup.top;
222
- let left = DEFAULT_VALUES.popup.left;
223
- switch (position) {
224
- case 'top':
225
- top = offset.top - popupHeight - padding - 20;
226
- left = offset.left + element.offsetWidth / 2 - popupWidth / 2;
227
- break;
228
- case 'bottom':
229
- top = offset.top + element.offsetHeight + padding;
230
- left = offset.left + element.offsetWidth / 2 - popupWidth / 2;
231
- break;
232
- case 'left':
233
- top = offset.top + element.offsetHeight / 2 - popupHeight / 2;
234
- left = offset.left - popupWidth - padding + 50;
235
- break;
236
- case 'right':
237
- top = offset.top + element.offsetHeight / 2 - popupHeight / 2;
238
- left = offset.left + element.offsetWidth + padding;
239
- break;
240
- }
241
- return { top, left };
242
- }
243
- /**
244
- * Clamps the popup's coordinates to ensure it stays within the visible viewport.
245
- * @param coords The calculated top and left coordinates.
246
- * @returns The adjusted coordinates.
247
- */
248
- clampPopupCoordinates(coords) {
249
- const { padding, width: popupWidth, height: popupHeight, safeMargin } = DEFAULT_VALUES.popup;
250
- const scrollTop = window.scrollY;
251
- const scrollLeft = window.scrollX;
252
- const maxTop = scrollTop + window.innerHeight - popupHeight - safeMargin;
253
- const maxLeft = scrollLeft + window.innerWidth - popupWidth - padding;
254
- const top = Math.max(scrollTop + padding, Math.min(coords.top, maxTop));
255
- const left = Math.max(scrollLeft + padding, Math.min(coords.left, maxLeft));
256
- return { top, left };
257
- }
258
- /**
259
- * If the popup is rendered inside a scrollable container, this ensures it's scrolled into view.
260
- */
261
- scrollPopupIntoView() {
262
- setTimeout(() => {
263
- const popupEl = document.querySelector('.tour-popup');
264
- popupEl?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
265
- }, 50);
266
- }
267
- /**
268
- * method to execute highlight process after scroll
269
- * @returns
270
- */
271
- waitForScroll() {
272
- return new Promise(resolve => setTimeout(resolve, 100)); // ⏱️ Adjust delay if needed
273
- }
274
- /**
275
- * method to create transparent hole in overlay for visibility of highlighted area
276
- */
277
- createTransparentHole() {
278
- if (!this.currentElement)
279
- return;
280
- setTimeout(() => {
281
- const padding = 5;
282
- const rect = this.currentElement?.getBoundingClientRect();
283
- const top = Math.max(rect?.top - padding, 0);
284
- const left = Math.max(rect?.left - padding, 0);
285
- const width = rect?.width + padding * 2;
286
- const height = rect?.height + padding * 2;
287
- const holeElement = document.querySelector('.hole');
288
- this.renderer.setStyle(holeElement, 'left', `${left}px`);
289
- this.renderer.setStyle(holeElement, 'top', `${top}px`);
290
- this.renderer.setStyle(holeElement, 'width', `${width}px`);
291
- this.renderer.setStyle(holeElement, 'height', `${height}px`);
292
- }, 50);
293
- }
294
- /**
295
- * method to get absolute offset
296
- * @param element
297
- * @returns
298
- */
299
- getAbsoluteOffset(element) {
300
- let top = 0, left = 0;
301
- let el = element;
302
- while (el) {
303
- top += el.offsetTop - el.scrollTop + el.clientTop;
304
- left += el.offsetLeft - el.scrollLeft + el.clientLeft;
305
- el = el.offsetParent;
306
- }
307
- return { top, left };
308
- }
309
- /**
310
- * method to lock scroll when tour guide is active
311
- */
312
- lockScroll() {
313
- this.renderer.setStyle(document.body, 'overflow', 'hidden');
314
- this.renderer.setStyle(document.documentElement, 'overflow', 'hidden');
315
- document.documentElement.classList.add('tour-scroll-lock');
316
- }
317
- /**
318
- * method to unlock scroll when tour guide is not active
319
- */
320
- unlockScroll() {
321
- this.renderer.removeStyle(document.body, 'overflow');
322
- this.renderer.removeStyle(document.documentElement, 'overflow');
323
- document.documentElement.classList.remove('tour-scroll-lock');
324
- }
325
- /**
326
- * method to remove highlight when tour is skipped or done
327
- */
328
- removeHighlight() {
329
- if (this.currentElement) {
330
- this.renderer.removeClass(this.currentElement, 'tour-highlight');
331
- this.renderer.removeStyle(this.currentElement, 'z-index');
332
- this.renderer.removeStyle(this.currentElement, 'position');
333
- this.renderer.removeStyle(this.currentElement, 'box-shadow');
334
- }
335
- }
336
- /**
337
- * debounce method for smooth operation
338
- * @param fn
339
- * @param delay
340
- * @returns
341
- */
342
- debounce(fn, delay) {
343
- let timeout;
344
- return () => {
345
- clearTimeout(timeout);
346
- timeout = setTimeout(() => fn(), delay);
347
- };
348
- }
349
- /**
350
- * handling change on component destroy
351
- */
352
- ngOnDestroy() {
353
- document.removeEventListener('keydown', this.handleKey);
354
- // Clean up: move overlay back (optional)
355
- if (this.overlayRef && this.originalParent) {
356
- this.renderer.appendChild(this.originalParent, this.overlayRef.nativeElement);
357
- }
358
- if (this.resizeListener) {
359
- window.removeEventListener('resize', this.resizeListener);
360
- }
361
- }
362
- }
363
- RuclibTourGuideComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibTourGuideComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
364
- RuclibTourGuideComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RuclibTourGuideComponent, selector: "uxp-ruclib-tour-guide", inputs: { rucInputData: "rucInputData", customTheme: "customTheme", showStartButton: "showStartButton", dataSource: "dataSource" }, outputs: { rucEvent: "rucEvent" }, viewQueries: [{ propertyName: "overlayRef", first: true, predicate: ["overlayRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<button color=\"primary\" *ngIf=\"showStartButton\" mat-raised-button (click)=\"startTour()\">\r\n {{startTourButtonLabel}}\r\n</button>\r\n\r\n<div id=\"tour-container\" class=\"{{ customTheme }}\" *ngIf=\"showTour\">\r\n <div #overlayRef class=\"tour-overlay\" *ngIf=\"currentStepIndex < dataSource.length\">\r\n <mat-card appearance=\"outlined\" class=\"tour-popup\" [style.minWidth]=\"config.defaultPopupWidth\"\r\n [style.minHeight]=\"dataSource[currentStepIndex].shape === 'circle' ? config.defaultPopupWidth : 'auto'\"\r\n [style.width]=\"dataSource[currentStepIndex].width || config.defaultPopupWidth\"\r\n [style.height]=\"dataSource[currentStepIndex].shape === 'circle' ? dataSource[currentStepIndex].width || config.defaultPopupWidth : 'auto'\"\r\n [ngClass]=\"dataSource[currentStepIndex].shape || 'rounded'\"\r\n [ngStyle]=\"config.type === 'advance' ? popupStyle : null\" class=\"{{config.type}}\">\r\n\r\n <!-- tour modal title -->\r\n <mat-card-header class=\"tour-guide-title\">\r\n <mat-card-title [style.fontSize]=\"config.titleFontSize\" *ngIf=\"dataSource[currentStepIndex].title\">\r\n {{ dataSource[currentStepIndex].title }}\r\n </mat-card-title>\r\n </mat-card-header>\r\n\r\n <mat-card-content>\r\n <!-- tour content details -->\r\n <div class=\"tour-guide-content\" [style.fontSize]=\"config.contentFontSize\">\r\n <div [innerHTML]=\"dataSource[currentStepIndex].content\"></div>\r\n </div>\r\n\r\n <!-- tour step counter -->\r\n <div class=\"tour-guide-step-counter\" [style.justifyContent]=\"config.stepCountAlignment\">\r\n {{config.stepCountStartText}} {{ currentStepIndex + 1 }} {{config.stepCountMiddleText}} {{\r\n dataSource.length }}\r\n </div>\r\n </mat-card-content>\r\n\r\n <!-- tour action buttons -->\r\n <mat-card-actions class=\"tour-guide-action-buttons\" [style.justifyContent]=\"config.buttonsAlignment\">\r\n <button mat-raised-button [style.fontSize]=\"config.buttonsFontSize\" *ngIf=\"config.showSkipButton\"\r\n (click)=\"skip()\">{{config.skipButtonText}}</button>\r\n\r\n <button mat-raised-button [style.fontSize]=\"config.buttonsFontSize\" (click)=\"previousStep()\"\r\n [disabled]=\"currentStepIndex === 0\">{{config.prevButtonText}}</button>\r\n\r\n <button mat-raised-button [style.fontSize]=\"config.buttonsFontSize\" (click)=\"nextStep()\">\r\n {{ currentStepIndex === dataSource.length - 1 ? config.finishButtonText : config.nextButtonText\r\n }}\r\n </button>\r\n </mat-card-actions>\r\n </mat-card>\r\n\r\n <!-- hole on overlayer for highlighted content -->\r\n <div class=\"hole\" [style.borderColor]=\"config.highlightBorderColor\"\r\n [style.borderWidth]=\"config.highlightBorderWidth\"></div>\r\n </div>\r\n\r\n</div>", styles: [".tour-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:99999;pointer-events:auto;display:flex;align-items:center;justify-content:center}::ng-deep .tour-scroll-lock *{overscroll-behavior:none;overflow:hidden!important;scrollbar-width:none;-ms-overflow-style:none}.tour-popup{position:absolute;padding:0;border-radius:4px;box-shadow:0 4px 12px #0000004d;z-index:10000;pointer-events:auto;display:flex;flex-direction:column;gap:.5rem;font-family:Arial,sans-serif;transition:all .3s ease;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;animation:fadeSlideIn .3s ease-out;-webkit-animation:fadeSlideIn .3s ease-out}.tour-guide-title{margin:5px 0}.tour-guide-action-buttons{display:flex;justify-content:end;gap:.5rem;min-height:45px}.tour-guide-action-buttons button{padding:0rem .5rem;border:none;border-radius:4px;font-size:.9rem;cursor:pointer;transition:background .2s ease;height:25px}.tour-guide-action-buttons button:focus-visible{outline:none!important}.tour-guide-action-buttons button[disabled]{cursor:not-allowed}.tour-guide-step-counter{font-size:.8rem;display:flex;justify-content:start;margin-top:20px}.tour-highlight{position:relative!important;z-index:10000!important;border-radius:4px;transition:box-shadow .3s ease}@keyframes fadeSlideIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.hole{position:absolute;width:0px;height:0px;z-index:3;top:0%;left:0%;box-shadow:0 0 0 9999px #000c;background:transparent;border:2px solid #57d914;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px}.tour-popup.rounded{border-radius:12px}.tour-popup.rectangle{border-radius:0}.tour-popup.circle{border-radius:50%;justify-content:center;padding:2rem;text-align:center;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%}.tour-popup.circle .tour-guide-title{padding:0 1rem;justify-content:center}.tour-popup.circle .tour-guide-action-buttons,.tour-popup.circle .tour-guide-step-counter{justify-content:center!important}.mat-mdc-card-header,.mat-mdc-card-content{padding:0 10px!important}.mdc-button{min-width:50px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i3.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }] });
365
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibTourGuideComponent, decorators: [{
366
- type: Component,
367
- args: [{ selector: 'uxp-ruclib-tour-guide', template: "<button color=\"primary\" *ngIf=\"showStartButton\" mat-raised-button (click)=\"startTour()\">\r\n {{startTourButtonLabel}}\r\n</button>\r\n\r\n<div id=\"tour-container\" class=\"{{ customTheme }}\" *ngIf=\"showTour\">\r\n <div #overlayRef class=\"tour-overlay\" *ngIf=\"currentStepIndex < dataSource.length\">\r\n <mat-card appearance=\"outlined\" class=\"tour-popup\" [style.minWidth]=\"config.defaultPopupWidth\"\r\n [style.minHeight]=\"dataSource[currentStepIndex].shape === 'circle' ? config.defaultPopupWidth : 'auto'\"\r\n [style.width]=\"dataSource[currentStepIndex].width || config.defaultPopupWidth\"\r\n [style.height]=\"dataSource[currentStepIndex].shape === 'circle' ? dataSource[currentStepIndex].width || config.defaultPopupWidth : 'auto'\"\r\n [ngClass]=\"dataSource[currentStepIndex].shape || 'rounded'\"\r\n [ngStyle]=\"config.type === 'advance' ? popupStyle : null\" class=\"{{config.type}}\">\r\n\r\n <!-- tour modal title -->\r\n <mat-card-header class=\"tour-guide-title\">\r\n <mat-card-title [style.fontSize]=\"config.titleFontSize\" *ngIf=\"dataSource[currentStepIndex].title\">\r\n {{ dataSource[currentStepIndex].title }}\r\n </mat-card-title>\r\n </mat-card-header>\r\n\r\n <mat-card-content>\r\n <!-- tour content details -->\r\n <div class=\"tour-guide-content\" [style.fontSize]=\"config.contentFontSize\">\r\n <div [innerHTML]=\"dataSource[currentStepIndex].content\"></div>\r\n </div>\r\n\r\n <!-- tour step counter -->\r\n <div class=\"tour-guide-step-counter\" [style.justifyContent]=\"config.stepCountAlignment\">\r\n {{config.stepCountStartText}} {{ currentStepIndex + 1 }} {{config.stepCountMiddleText}} {{\r\n dataSource.length }}\r\n </div>\r\n </mat-card-content>\r\n\r\n <!-- tour action buttons -->\r\n <mat-card-actions class=\"tour-guide-action-buttons\" [style.justifyContent]=\"config.buttonsAlignment\">\r\n <button mat-raised-button [style.fontSize]=\"config.buttonsFontSize\" *ngIf=\"config.showSkipButton\"\r\n (click)=\"skip()\">{{config.skipButtonText}}</button>\r\n\r\n <button mat-raised-button [style.fontSize]=\"config.buttonsFontSize\" (click)=\"previousStep()\"\r\n [disabled]=\"currentStepIndex === 0\">{{config.prevButtonText}}</button>\r\n\r\n <button mat-raised-button [style.fontSize]=\"config.buttonsFontSize\" (click)=\"nextStep()\">\r\n {{ currentStepIndex === dataSource.length - 1 ? config.finishButtonText : config.nextButtonText\r\n }}\r\n </button>\r\n </mat-card-actions>\r\n </mat-card>\r\n\r\n <!-- hole on overlayer for highlighted content -->\r\n <div class=\"hole\" [style.borderColor]=\"config.highlightBorderColor\"\r\n [style.borderWidth]=\"config.highlightBorderWidth\"></div>\r\n </div>\r\n\r\n</div>", styles: [".tour-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:99999;pointer-events:auto;display:flex;align-items:center;justify-content:center}::ng-deep .tour-scroll-lock *{overscroll-behavior:none;overflow:hidden!important;scrollbar-width:none;-ms-overflow-style:none}.tour-popup{position:absolute;padding:0;border-radius:4px;box-shadow:0 4px 12px #0000004d;z-index:10000;pointer-events:auto;display:flex;flex-direction:column;gap:.5rem;font-family:Arial,sans-serif;transition:all .3s ease;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;animation:fadeSlideIn .3s ease-out;-webkit-animation:fadeSlideIn .3s ease-out}.tour-guide-title{margin:5px 0}.tour-guide-action-buttons{display:flex;justify-content:end;gap:.5rem;min-height:45px}.tour-guide-action-buttons button{padding:0rem .5rem;border:none;border-radius:4px;font-size:.9rem;cursor:pointer;transition:background .2s ease;height:25px}.tour-guide-action-buttons button:focus-visible{outline:none!important}.tour-guide-action-buttons button[disabled]{cursor:not-allowed}.tour-guide-step-counter{font-size:.8rem;display:flex;justify-content:start;margin-top:20px}.tour-highlight{position:relative!important;z-index:10000!important;border-radius:4px;transition:box-shadow .3s ease}@keyframes fadeSlideIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.hole{position:absolute;width:0px;height:0px;z-index:3;top:0%;left:0%;box-shadow:0 0 0 9999px #000c;background:transparent;border:2px solid #57d914;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px}.tour-popup.rounded{border-radius:12px}.tour-popup.rectangle{border-radius:0}.tour-popup.circle{border-radius:50%;justify-content:center;padding:2rem;text-align:center;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%}.tour-popup.circle .tour-guide-title{padding:0 1rem;justify-content:center}.tour-popup.circle .tour-guide-action-buttons,.tour-popup.circle .tour-guide-step-counter{justify-content:center!important}.mat-mdc-card-header,.mat-mdc-card-content{padding:0 10px!important}.mdc-button{min-width:50px}\n"] }]
368
- }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { rucEvent: [{
369
- type: Output
370
- }], rucInputData: [{
371
- type: Input
372
- }], customTheme: [{
373
- type: Input
374
- }], showStartButton: [{
375
- type: Input
376
- }], dataSource: [{
377
- type: Input
378
- }], overlayRef: [{
379
- type: ViewChild,
380
- args: ['overlayRef']
381
- }] } });
382
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLXRvdXItZ3VpZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9ydWNsaWItdG91ci1ndWlkZS9ydWNsaWItdG91ci1ndWlkZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi10b3VyLWd1aWRlL3J1Y2xpYi10b3VyLWd1aWRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFxQixVQUFVLEVBQUUsU0FBUyxFQUEyQyxNQUFNLGVBQWUsQ0FBQztBQUVySyxPQUFPLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7O0FBT3ZGLE1BQU0sT0FBTyx3QkFBd0I7SUFrQm5DOzs7O09BSUc7SUFDSCxZQUNVLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUF2Qm5CLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBR3BDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGVBQVUsR0FBeUIsRUFBRSxDQUFDO1FBSXhDLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUlyQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLHlCQUFvQixHQUFHLGNBQWMsRUFBRSxvQkFBb0IsQ0FBQztRQUU1RCxXQUFNLEdBQUcsc0JBQXNCLENBQUM7UUFxVnZDOzs7O1dBSUc7UUFDSyxjQUFTLEdBQUcsQ0FBQyxLQUFvQixFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO2dCQUFFLE9BQU87WUFDM0IsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLGNBQWMsQ0FBQyxVQUFVO2dCQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDeEQsSUFBSSxLQUFLLENBQUMsR0FBRyxL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S0FBYTtRQUM1QyxJQUFJLE9BQVksQ0FBQztRQUNqQixPQUFPLEdBQUcsRUFBRTtZQUNWLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4RCx5Q0FBeUM7UUFDekMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQy9FO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzNEO0lBQ0gsQ0FBQzs7c0hBN1lVLHdCQUF3QjswR0FBeEIsd0JBQXdCLG1XQ1RyQyx3b0dBcURNOzRGRDVDTyx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCO2dHQUt2QixRQUFRO3NCQUFqQixNQUFNO2dCQUNFLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRW1CLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBSZW5kZXJlcjIsIE9uSW5pdCwgT25EZXN0cm95LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUb3VyR3VpZGVDb25maWcsIFRvdXJHdWlkZURhdGEgfSBmcm9tICcuLi9tb2RlbC90b3VyLWd1aWRlLm1vZGVsJztcclxuaW1wb3J0IHsgREVGQVVMVF9WQUxVRVMsIGRlZmF1bHRUb3VyR3VpZGVDb25maWcgfSBmcm9tICcuLi9tb2RlbC9kZWZhdWx0LWNvbmZpZy5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3V4cC1ydWNsaWItdG91ci1ndWlkZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3J1Y2xpYi10b3VyLWd1aWRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ydWNsaWItdG91ci1ndWlkZS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUnVjbGliVG91ckd1aWRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgQE91dHB1dCgpIHJ1Y0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQElucHV0KCkgcnVjSW5wdXREYXRhITogVG91ckd1aWRlQ29uZmlnO1xyXG4gIEBJbnB1dCgpIGN1c3RvbVRoZW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgc2hvd1N0YXJ0QnV0dG9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGF0YVNvdXJjZTogQXJyYXk8VG91ckd1aWRlRGF0YT4gPSBbXTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnb3ZlcmxheVJlZicpIG92ZXJsYXlSZWYhOiBFbGVtZW50UmVmO1xyXG5cclxuICBwdWJsaWMgY3VycmVudFN0ZXBJbmRleCA9IDA7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RWxlbWVudD86IEhUTUxFbGVtZW50O1xyXG4gIHB1YmxpYyBwb3B1cFN0eWxlITogeyB0b3A6IHN0cmluZzsgbGVmdDogc3RyaW5nIH07XHJcbiAgcHJpdmF0ZSBvcmlnaW5hbFBhcmVudD86IEhUTUxFbGVtZW50O1xyXG4gIHB1YmxpYyBzaG93VG91ciA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzdGFydFRvdXJCdXR0b25MYWJlbCA9IERFRkFVTFRfVkFMVUVTPy5zdGFydFRvdXJCdXR0b25MYWJlbDtcclxuICBwcml2YXRlIHJlc2l6ZUxpc3RlbmVyOiBhbnk7XHJcbiAgcHVibGljIGNvbmZpZyA9IGRlZmF1bHRUb3VyR3VpZGVDb25maWc7XHJcblxyXG4gIC8qKlxyXG4gICAqIGNsYXNzIGNvbnN0cnVjdG9yXHJcbiAgICogQHBhcmFtIHRvdXJHdWlkZVNlcnZpY2UgXHJcbiAgICogQHBhcmFtIHJlbmRlcmVyIFxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXHJcbiAgKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICAqIGhhbmRsaW5nIGlucHV0IGRhdGEgY2hhbmdlc1xyXG4gICAgKiB1cGRhdGluZyBkZWZhdWx0IGNvbmZpZyB3aXRoIHVzZXIgcHJvdmlkZWQgY29uZmlnXHJcbiAgICAqIEBwYXJhbSBjaGFuZ2VzIFxyXG4gICAgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzWydydWNJbnB1dERhdGEnXSAmJiBjaGFuZ2VzWydydWNJbnB1dERhdGEnXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCAuLi5jaGFuZ2VzWydydWNJbnB1dERhdGEnXS5jdXJyZW50VmFsdWUgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogaGFuZGxpbmcgY2hhbmdlIG9uIGNvbXBvbmVudCBpbml0aWxpemF0aW9uXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXkpO1xyXG4gICAgdGhpcy5yZXNpemVMaXN0ZW5lciA9IHRoaXMuZGVib3VuY2UoKCkgPT4gdGhpcy5oaWdobGlnaHRFbGVtZW50KCksIDE1MCk7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemVMaXN0ZW5lcik7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNob3dTdGFydEJ1dHRvbikge1xyXG4gICAgICB0aGlzLnN0YXJ0VG91cigpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiB0aGlzIG1ldGhvZCBoYW5kbGUgdGhlIHN0YXJ0IG9mIHRvdXIgZ3VpZGUgZmV0YXVyZVxyXG4gICAqL1xyXG4gIHN0YXJ0VG91cigpIHtcclxuICAgIHRoaXMuc2hvd1RvdXIgPSB0cnVlO1xyXG4gICAgdGhpcy5sb2NrU2Nyb2xsKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLm9yaWdpbmFsUGFyZW50KSB7XHJcbiAgICAgICB0aGlzLm9yaWdpbmFsUGFyZW50ID0gdGhpcy5yZW5kZXJlci5wYXJlbnROb2RlKHRoaXMub3ZlcmxheVJlZj8ubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuYm9keSwgdGhpcy5vdmVybGF5UmVmPy5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSAwO1xyXG4gICAgICBpZiAodGhpcy5jb25maWcudHlwZSA9PT0gJ2FkdmFuY2UnKSB7XHJcbiAgICAgICAgdGhpcy5oaWdobGlnaHRFbGVtZW50KCk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogdGhpcyBtZXRob2QgaGFuZGxlIHRoZSBuYXZpZ2F0aW9uIHRvIG5leHQgdG91ciBndWlkZSBmZWF0dXJlXHJcbiAgICovXHJcbiAgbmV4dFN0ZXAoKSB7XHJcbiAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgdGhpcy5jdXJyZW50U3RlcEluZGV4Kys7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcEluZGV4IDwgdGhpcy5kYXRhU291cmNlLmxlbmd0aCkge1xyXG4gICAgICBpZiAodGhpcy5jb25maWcudHlwZSA9PT0gJ2FkdmFuY2UnKSB0aGlzLmhpZ2hsaWdodEVsZW1lbnQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xyXG4gICAgICB0aGlzLnNob3dUb3VyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudW5sb2NrU2Nyb2xsKCk7XHJcbiAgICAgIHRoaXMucnVjRXZlbnQuZW1pdCh7IGV2ZW50TmFtZTogJ29uVG91ckNvbXBsZXRlJywgZXZlbnRPdXRwdXQ6IG51bGwgfSk7XHJcbiAgICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIHRoaXMub3ZlcmxheVJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogdGhpcyBtZXRob2QgYWxsb3cgdXMgdG8gbmF2aWdhdGUgYmFjayB0byBwcmV2aW91cyB0b3VyIGd1aWRlIGZlYXR1cmVcclxuICAgKi9cclxuICBwcmV2aW91c1N0ZXAoKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcEluZGV4ID4gMCkge1xyXG4gICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXgtLTtcclxuICAgICAgaWYgKHRoaXMuY29uZmlnLnR5cGUgPT09ICdhZHZhbmNlJykgdGhpcy5oaWdobGlnaHRFbGVtZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBtZXRob2QgdG8gc2tpcCB0aGUgdG91ciBndWlkZSB0aGF0cyBpbiBwcm9ncmVzc1xyXG4gICAqL1xyXG4gIHNraXAoKSB7XHJcbiAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodCgpO1xyXG4gICAgdGhpcy5zaG93VG91ciA9IGZhbHNlO1xyXG4gICAgdGhpcy51bmxvY2tTY3JvbGwoKTtcclxuICAgIHRoaXMucnVjRXZlbnQuZW1pdCh7IGV2ZW50TmFtZTogJ29uVG91clNraXAnLCBldmVudE91dHB1dDogbnVsbCB9KTtcclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5ib2R5LCB0aGlzLm92ZXJsYXlSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBtZXRob2QgdG8gaGlnaGxpZ2h0IGZlYXR1cmUgYXJlYSBhbmQgY2hhbmdpbiBkZXRhaWxzIHBvcHVwIGJhc2VkIG9uIHByb3ZpZGUgY29uZmlnXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBoaWdobGlnaHRFbGVtZW50KCkge1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuZGF0YVNvdXJjZVt0aGlzLmN1cnJlbnRTdGVwSW5kZXhdO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLnR5cGUgPT09ICdzaW1wbGUnIHx8ICFzdGVwPy5zZWxlY3Rvcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMS4gRmluZCBhbmQgc2Nyb2xsIHRvIHRoZSBlbGVtZW50XHJcbiAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudEFuZFNjcm9sbChzdGVwLnNlbGVjdG9yKTtcclxuICAgIGlmICghdGhpcy5jdXJyZW50RWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gQXBwbHkgaGlnaGxpZ2h0IHN0eWxlc1xyXG4gICAgdGhpcy5hcHBseUhpZ2hsaWdodFN0eWxlcyh0aGlzLmN1cnJlbnRFbGVtZW50KTtcclxuXHJcbiAgICAvLyAzLiBDYWxjdWxhdGUgYW5kIGFwcGx5IHBvcHVwIHBvc2l0aW9uXHJcbiAgICB0aGlzLmNhbGN1bGF0ZUFuZEFwcGx5UG9wdXBQb3NpdGlvbih0aGlzLmN1cnJlbnRFbGVtZW50LCBzdGVwLnBvc2l0aW9uKTtcclxuXHJcbiAgICAvLyA0LiBDcmVhdGUgdGhlIHZpc3VhbCBob2xlIGluIHRoZSBvdmVybGF5XHJcbiAgICB0aGlzLmNyZWF0ZVRyYW5zcGFyZW50SG9sZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmluZHMgYW4gZWxlbWVudCBieSBpdHMgc2VsZWN0b3IsIHNjcm9sbHMgaXQgaW50byB2aWV3LCBhbmQgd2FpdHMgZm9yIHRoZSBzY3JvbGwgdG8gY29tcGxldGUuXHJcbiAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgSFRNTEVsZW1lbnQgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZpbmRFbGVtZW50QW5kU2Nyb2xsKHNlbGVjdG9yOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkPiB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcclxuICAgIGF3YWl0IHRoaXMud2FpdEZvclNjcm9sbCgpO1xyXG4gICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBsaWVzIENTUyBjbGFzc2VzIGFuZCBzdHlsZXMgdG8gdmlzdWFsbHkgaGlnaGxpZ2h0IHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBoaWdobGlnaHQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseUhpZ2hsaWdodFN0eWxlcyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAndG91ci1oaWdobGlnaHQnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICd6LWluZGV4JywgJzEwMDAwJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxjdWxhdGVzIHRoZSBvcHRpbWFsIHBvc2l0aW9uIGZvciB0aGUgdG91ciBwb3B1cCBhbmQgYXBwbGllcyBpdC5cclxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgaGlnaGxpZ2h0ZWQgZWxlbWVudC5cclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGRlc2lyZWQgcG9zaXRpb24gKCdhdXRvJywgJ3RvcCcsICdib3R0b20nLCAnbGVmdCcsICdyaWdodCcpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2FsY3VsYXRlQW5kQXBwbHlQb3B1cFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjogc3RyaW5nID0gJ2F1dG8nKTogdm9pZCB7XHJcbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuZ2V0QWJzb2x1dGVPZmZzZXQoZWxlbWVudCk7XHJcblxyXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBiZXN0IHBvc2l0aW9uIGlmIHNldCB0byAnYXV0bydcclxuICAgIGNvbnN0IGZpbmFsUG9zaXRpb24gPSB0aGlzLmRldGVybWluZUF1dG9Qb3NpdGlvbihwb3NpdGlvbiwgcmVjdCk7XHJcblxyXG4gICAgLy8gR2V0IHRoZSB0b3AvbGVmdCBjb29yZGluYXRlcyBiYXNlZCBvbiB0aGUgcG9zaXRpb25cclxuICAgIGxldCBjb29yZHMgPSB0aGlzLmNvbXB1dGVQb3B1cENvb3JkaW5hdGVzKGZpbmFsUG9zaXRpb24sIG9mZnNldCwgZWxlbWVudCk7XHJcblxyXG4gICAgLy8gRW5zdXJlIHRoZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoZSB2aWV3cG9ydFxyXG4gICAgY29vcmRzID0gdGhpcy5jbGFtcFBvcHVwQ29vcmRpbmF0ZXMoY29vcmRzKTtcclxuXHJcbiAgICAvLyBBcHBseSB0aGUgZmluYWwgc3R5bGVzIHRvIHRoZSBwb3B1cFxyXG4gICAgdGhpcy5wb3B1cFN0eWxlID0ge1xyXG4gICAgICB0b3A6IGAke2Nvb3Jkcy50b3B9cHhgLFxyXG4gICAgICBsZWZ0OiBgJHtjb29yZHMubGVmdH1weGBcclxuICAgIH07XHJcblxyXG4gICAgLy8gRW5zdXJlIHRoZSBwb3B1cCBpdHNlbGYgaXMgdmlzaWJsZVxyXG4gICAgdGhpcy5zY3JvbGxQb3B1cEludG9WaWV3KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBiZXN0IHBsYWNlbWVudCBmb3IgdGhlIHBvcHVwIHdoZW4gcG9zaXRpb24gaXMgJ2F1dG8nLlxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgY29uZmlndXJlZCBwb3NpdGlvbi5cclxuICAgKiBAcGFyYW0gcmVjdCBUaGUgQm91bmRpbmdDbGllbnRSZWN0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgKiBAcmV0dXJucyBUaGUgY2FsY3VsYXRlZCBmaW5hbCBwb3NpdGlvbi5cclxuICAgKi9cclxuICBwcml2YXRlIGRldGVybWluZUF1dG9Qb3NpdGlvbihwb3NpdGlvbjogc3RyaW5nLCByZWN0OiBET01SZWN0KTogc3RyaW5nIHtcclxuICAgIGlmIChwb3NpdGlvbiAhPT0gJ2F1dG8nKSB7XHJcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IHBhZGRpbmcsIHdpZHRoOiBwb3B1cFdpZHRoLCBoZWlnaHQ6IHBvcHVwSGVpZ2h0LCBzYWZlTWFyZ2luIH0gPSBERUZBVUxUX1ZBTFVFUy5wb3B1cDtcclxuXHJcbiAgICBjb25zdCBmaXRzVG9wID0gcmVjdC50b3AgPj0gcG9wdXBIZWlnaHQgKyBwYWRkaW5nO1xyXG4gICAgY29uc3QgZml0c0JvdHRvbSA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHJlY3QuYm90dG9tID49IHBvcHVwSGVpZ2h0ICsgcGFkZGluZyArIHNhZmVNYXJnaW47XHJcbiAgICBjb25zdCBmaXRzUmlnaHQgPSB3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QucmlnaHQgPj0gcG9wdXBXaWR0aCArIHBhZGRpbmc7XHJcbiAgICBjb25zdCBmaXRzTGVmdCA9IHJlY3QubGVmdCA+PSBwb3B1cFdpZHRoICsgcGFkZGluZztcclxuXHJcbiAgICBpZiAoZml0c1JpZ2h0KSByZXR1cm4gJ3JpZ2h0JztcclxuICAgIGlmIChmaXRzQm90dG9tKSByZXR1cm4gJ2JvdHRvbSc7XHJcbiAgICBpZiAoZml0c0xlZnQpIHJldHVybiAnbGVmdCc7XHJcbiAgICBpZiAoZml0c1RvcCkgcmV0dXJuICd0b3AnO1xyXG4gICAgcmV0dXJuICdib3R0b20nOyAvLyBmYWxsYmFja1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHV0ZXMgdGhlIHRvcCBhbmQgbGVmdCBjb29yZGluYXRlcyBmb3IgdGhlIHBvcHVwIGJhc2VkIG9uIHRoZSB0YXJnZXQgZWxlbWVudCBhbmQgZGVzaXJlZCBwb3NpdGlvbi5cclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGZpbmFsIHBvc2l0aW9uIGZvciB0aGUgcG9wdXAuXHJcbiAgICogQHBhcmFtIG9mZnNldCBUaGUgYWJzb2x1dGUgb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdG9wIGFuZCBsZWZ0IGNvb3JkaW5hdGVzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY29tcHV0ZVBvcHVwQ29vcmRpbmF0ZXMocG9zaXRpb246IHN0cmluZywgb2Zmc2V0OiB7IHRvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIgfSwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB7IHRvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIgfSB7XHJcbiAgICBjb25zdCB7IHBhZGRpbmcsIHdpZHRoOiBwb3B1cFdpZHRoLCBoZWlnaHQ6IHBvcHVwSGVpZ2h0IH0gPSBERUZBVUxUX1ZBTFVFUy5wb3B1cDtcclxuICAgIGxldCB0b3AgPSBERUZBVUxUX1ZBTFVFUy5wb3B1cC50b3A7XHJcbiAgICBsZXQgbGVmdCA9IERFRkFVTFRfVkFMVUVTLnBvcHVwLmxlZnQ7XHJcblxyXG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xyXG4gICAgICBjYXNlICd0b3AnOlxyXG4gICAgICAgIHRvcCA9IG9mZnNldC50b3AgLSBwb3B1cEhlaWdodCAtIHBhZGRpbmcgLSAyMDtcclxuICAgICAgICBsZWZ0ID0gb2Zmc2V0LmxlZnQgKyBlbGVtZW50Lm9mZnNldFdpZHRoIC8gMiAtIHBvcHVwV2lkdGggLyAyO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgIHRvcCA9IG9mZnNldC50b3AgKyBlbGVtZW50Lm9mZnNldEhlaWdodCArIHBhZGRpbmc7XHJcbiAgICAgICAgbGVmdCA9IG9mZnNldC5sZWZ0ICsgZWxlbWVudC5vZmZzZXRXaWR0aCAvIDIgLSBwb3B1cFdpZHRoIC8gMjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgdG9wID0gb2Zmc2V0LnRvcCArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMiAtIHBvcHVwSGVpZ2h0IC8gMjtcclxuICAgICAgICBsZWZ0ID0gb2Zmc2V0LmxlZnQgLSBwb3B1cFdpZHRoIC0gcGFkZGluZyArIDUwO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdyaWdodCc6XHJcbiAgICAgICAgdG9wID0gb2Zmc2V0LnRvcCArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMiAtIHBvcHVwSGVpZ2h0IC8gMjtcclxuICAgICAgICBsZWZ0ID0gb2Zmc2V0LmxlZnQgKyBlbGVtZW50Lm9mZnNldFdpZHRoICsgcGFkZGluZztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIHJldHVybiB7IHRvcCwgbGVmdCB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xhbXBzIHRoZSBwb3B1cCdzIGNvb3JkaW5hdGVzIHRvIGVuc3VyZSBpdCBzdGF5cyB3aXRoaW4gdGhlIHZpc2libGUgdmlld3BvcnQuXHJcbiAgICogQHBhcmFtIGNvb3JkcyBUaGUgY2FsY3VsYXRlZCB0b3AgYW5kIGxlZnQgY29vcmRpbmF0ZXMuXHJcbiAgICogQHJldHVybnMgVGhlIGFkanVzdGVkIGNvb3JkaW5hdGVzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xhbXBQb3B1cENvb3JkaW5hdGVzKGNvb3JkczogeyB0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyIH0pOiB7IHRvcDogbnVtYmVyLCBsZWZ0OiBudW1iZXIgfSB7XHJcbiAgICBjb25zdCB7IHBhZGRpbmcsIHdpZHRoOiBwb3B1cFdpZHRoLCBoZWlnaHQ6IHBvcHVwSGVpZ2h0LCBzYWZlTWFyZ2luIH0gPSBERUZBVUxUX1ZBTFVFUy5wb3B1cDtcclxuICAgIGNvbnN0IHNjcm9sbFRvcCA9IHdpbmRvdy5zY3JvbGxZO1xyXG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHdpbmRvdy5zY3JvbGxYO1xyXG5cclxuICAgIGNvbnN0IG1heFRvcCA9IHNjcm9sbFRvcCArIHdpbmRvdy5pbm5lckhlaWdodCAtIHBvcHVwSGVpZ2h0IC0gc2FmZU1hcmdpbjtcclxuICAgIGNvbnN0IG1heExlZnQgPSBzY3JvbGxMZWZ0ICsgd2luZG93LmlubmVyV2lkdGggLSBwb3B1cFdpZHRoIC0gcGFkZGluZztcclxuXHJcbiAgICBjb25zdCB0b3AgPSBNYXRoLm1heChzY3JvbGxUb3AgKyBwYWRkaW5nLCBNYXRoLm1pbihjb29yZHMudG9wLCBtYXhUb3ApKTtcclxuICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heChzY3JvbGxMZWZ0ICsgcGFkZGluZywgTWF0aC5taW4oY29vcmRzLmxlZnQsIG1heExlZnQpKTtcclxuXHJcbiAgICByZXR1cm4geyB0b3AsIGxlZnQgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIHRoZSBwb3B1cCBpcyByZW5kZXJlZCBpbnNpZGUgYSBzY3JvbGxhYmxlIGNvbnRhaW5lciwgdGhpcyBlbnN1cmVzIGl0J3Mgc2Nyb2xsZWQgaW50byB2aWV3LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2Nyb2xsUG9wdXBJbnRvVmlldygpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zdCBwb3B1cEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvdXItcG9wdXAnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgcG9wdXBFbD8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBtZXRob2QgdG8gZXhlY3V0ZSBoaWdobGlnaHQgcHJvY2VzcyBhZnRlciBzY3JvbGwgXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB3YWl0Rm9yU2Nyb2xsKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTsgLy8g4o+x77iPIEFkanVzdCBkZWxheSBpZiBuZWVkZWRcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIG1ldGhvZCB0byBjcmVhdGUgdHJhbnNwYXJlbnQgaG9sZSBpbiBvdmVybGF5IGZvciB2aXNpYmlsaXR5IG9mIGhpZ2hsaWdodGVkIGFyZWFcclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZVRyYW5zcGFyZW50SG9sZSgpIHtcclxuICAgIGlmKCF0aGlzLmN1cnJlbnRFbGVtZW50KSByZXR1cm47XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgcGFkZGluZyA9IDU7XHJcbiAgICAgIGNvbnN0IHJlY3Q6IGFueSA9IHRoaXMuY3VycmVudEVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBjb25zdCB0b3AgPSBNYXRoLm1heChyZWN0Py50b3AgLSBwYWRkaW5nLCAwKTtcclxuICAgICAgY29uc3QgbGVmdCA9IE1hdGgubWF4KHJlY3Q/LmxlZnQgLSBwYWRkaW5nLCAwKTtcclxuICAgICAgY29uc3Qgd2lkdGggPSByZWN0Py53aWR0aCArIHBhZGRpbmcgKiAyO1xyXG4gICAgICBjb25zdCBoZWlnaHQgPSByZWN0Py5oZWlnaHQgKyBwYWRkaW5nICogMjtcclxuXHJcbiAgICAgIGNvbnN0IGhvbGVFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhvbGUnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShob2xlRWxlbWVudCwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaG9sZUVsZW1lbnQsICd0b3AnLCBgJHt0b3B9cHhgKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShob2xlRWxlbWVudCwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShob2xlRWxlbWVudCwgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xyXG4gICAgfSwgNTApXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBtZXRob2QgdG8gZ2V0IGFic29sdXRlIG9mZnNldFxyXG4gICAqIEBwYXJhbSBlbGVtZW50IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0QWJzb2x1dGVPZmZzZXQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfSB7XHJcbiAgICBsZXQgdG9wID0gMCwgbGVmdCA9IDA7XHJcbiAgICBsZXQgZWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnQ7XHJcblxyXG4gICAgd2hpbGUgKGVsKSB7XHJcbiAgICAgIHRvcCArPSBlbC5vZmZzZXRUb3AgLSBlbC5zY3JvbGxUb3AgKyBlbC5jbGllbnRUb3A7XHJcbiAgICAgIGxlZnQgKz0gZWwub2Zmc2V0TGVmdCAtIGVsLnNjcm9sbExlZnQgKyBlbC5jbGllbnRMZWZ0O1xyXG4gICAgICBlbCA9IGVsLm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB0b3AsIGxlZnQgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIG1ldGhvZCB0byBsb2NrIHNjcm9sbCB3aGVuIHRvdXIgZ3VpZGUgaXMgYWN0aXZlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2NrU2Nyb2xsKCkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb2N1bWVudC5ib2R5LCAnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ292ZXJmbG93JywgJ2hpZGRlbicpO1xyXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RvdXItc2Nyb2xsLWxvY2snKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIG1ldGhvZCB0byB1bmxvY2sgc2Nyb2xsIHdoZW4gdG91ciBndWlkZSBpcyBub3QgYWN0aXZlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1bmxvY2tTY3JvbGwoKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGRvY3VtZW50LmJvZHksICdvdmVyZmxvdycpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdvdmVyZmxvdycpO1xyXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3RvdXItc2Nyb2xsLWxvY2snKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIG1ldGhvZCB0byByZW1vdmUgaGlnaGxpZ2h0IHdoZW4gdG91ciBpcyBza2lwcGVkIG9yIGRvbmVcclxuICAgKi9cclxuICBwcml2YXRlIHJlbW92ZUhpZ2hsaWdodCgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5jdXJyZW50RWxlbWVudCwgJ3RvdXItaGlnaGxpZ2h0Jyk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5jdXJyZW50RWxlbWVudCwgJ3otaW5kZXgnKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmN1cnJlbnRFbGVtZW50LCAncG9zaXRpb24nKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmN1cnJlbnRFbGVtZW50LCAnYm94LXNoYWRvdycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogbWV0aG9kIHRvIG5hdmlnYXRlIGJldHdlZW4gdG91ciBzbGlkZXMgb3Igc2tpcCB0b3VyIHVzaW5nIGxlZnQsIHJpZ2h0IGFuZCBza2lwIGtleVxyXG4gICAqIEBwYXJhbSBldmVudCBcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZUtleSA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gICAgaWYgKCF0aGlzLnNob3dUb3VyKSByZXR1cm47XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSBERUZBVUxUX1ZBTFVFUy5hcnJvd1JpZ2h0KSB0aGlzLm5leHRTdGVwKCk7XHJcbiAgICBlbHNlIGlmIChldmVudC5rZXkgPT09IERFRkFVTFRfVkFMVUVTLmFycm93TGVmdCkgdGhpcy5wcmV2aW91c1N0ZXAoKTtcclxuICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gREVGQVVMVF9WQUxVRVMuZXNjYXBlKSB0aGlzLnNraXAoKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBkZWJvdW5jZSBtZXRob2QgZm9yIHNtb290aCBvcGVyYXRpb25cclxuICAgKiBAcGFyYW0gZm4gXHJcbiAgICogQHBhcmFtIGRlbGF5IFxyXG4gICAqIEByZXR1cm5zIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGVib3VuY2UoZm46ICgpID0+IHZvaWQsIGRlbGF5OiBudW1iZXIpIHtcclxuICAgIGxldCB0aW1lb3V0OiBhbnk7XHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGZuKCksIGRlbGF5KTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBoYW5kbGluZyBjaGFuZ2Ugb24gY29tcG9uZW50IGRlc3Ryb3lcclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleSk7XHJcblxyXG4gICAgLy8gQ2xlYW4gdXA6IG1vdmUgb3ZlcmxheSBiYWNrIChvcHRpb25hbClcclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYgJiYgdGhpcy5vcmlnaW5hbFBhcmVudCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMub3JpZ2luYWxQYXJlbnQsIHRoaXMub3ZlcmxheVJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXNpemVMaXN0ZW5lcikge1xyXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemVMaXN0ZW5lcik7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxidXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKm5nSWY9XCJzaG93U3RhcnRCdXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwic3RhcnRUb3VyKClcIj5cclxuICAgIHt7c3RhcnRUb3VyQnV0dG9uTGFiZWx9fVxyXG48L2J1dHRvbj5cclxuXHJcbjxkaXYgaWQ9XCJ0b3VyLWNvbnRhaW5lclwiIGNsYXNzPVwie3sgY3VzdG9tVGhlbWUgfX1cIiAqbmdJZj1cInNob3dUb3VyXCI+XHJcbiAgICA8ZGl2ICNvdmVybGF5UmVmIGNsYXNzPVwidG91ci1vdmVybGF5XCIgKm5nSWY9XCJjdXJyZW50U3RlcEluZGV4IDwgZGF0YVNvdXJjZS5sZW5ndGhcIj5cclxuICAgICAgICA8bWF0LWNhcmQgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCIgY2xhc3M9XCJ0b3VyLXBvcHVwXCIgW3N0eWxlLm1pbldpZHRoXT1cImNvbmZpZy5kZWZhdWx0UG9wdXBXaWR0aFwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5taW5IZWlnaHRdPVwiZGF0YVNvdXJjZVtjdXJyZW50U3RlcEluZGV4XS5zaGFwZSA9PT0gJ2NpcmNsZScgPyBjb25maWcuZGVmYXVsdFBvcHVwV2lkdGggOiAnYXV0bydcIlxyXG4gICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiZGF0YVNvdXJjZVtjdXJyZW50U3RlcEluZGV4XS53aWR0aCB8fCBjb25maWcuZGVmYXVsdFBvcHVwV2lkdGhcIlxyXG4gICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImRhdGFTb3VyY2VbY3VycmVudFN0ZXBJbmRleF0uc2hhcGUgPT09ICdjaXJjbGUnID8gZGF0YVNvdXJjZVtjdXJyZW50U3RlcEluZGV4XS53aWR0aCB8fCBjb25maWcuZGVmYXVsdFBvcHVwV2lkdGggOiAnYXV0bydcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJkYXRhU291cmNlW2N1cnJlbnRTdGVwSW5kZXhdLnNoYXBlIHx8ICdyb3VuZGVkJ1wiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbmZpZy50eXBlID09PSAnYWR2YW5jZScgPyBwb3B1cFN0eWxlIDogbnVsbFwiIGNsYXNzPVwie3tjb25maWcudHlwZX19XCI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIHRvdXIgbW9kYWwgdGl0bGUgLS0+XHJcbiAgICAgICAgICAgIDxtYXQtY2FyZC1oZWFkZXIgY2xhc3M9XCJ0b3VyLWd1aWRlLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQtdGl0bGUgW3N0eWxlLmZvbnRTaXplXT1cImNvbmZpZy50aXRsZUZvbnRTaXplXCIgKm5nSWY9XCJkYXRhU291cmNlW2N1cnJlbnRTdGVwSW5kZXhdLnRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZGF0YVNvdXJjZVtjdXJyZW50U3RlcEluZGV4XS50aXRsZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtY2FyZC10aXRsZT5cclxuICAgICAgICAgICAgPC9tYXQtY2FyZC1oZWFkZXI+XHJcblxyXG4gICAgICAgICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICAgICAgICAgIDwhLS0gdG91ciBjb250ZW50IGRldGFpbHMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG91ci1ndWlkZS1jb250ZW50XCIgW3N0eWxlLmZvbnRTaXplXT1cImNvbmZpZy5jb250ZW50Rm9udFNpemVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZGF0YVNvdXJjZVtjdXJyZW50U3RlcEluZGV4XS5jb250ZW50XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIHRvdXIgc3RlcCBjb3VudGVyIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvdXItZ3VpZGUtc3RlcC1jb3VudGVyXCIgW3N0eWxlLmp1c3RpZnlDb250ZW50XT1cImNvbmZpZy5zdGVwQ291bnRBbGlnbm1lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZy5zdGVwQ291bnRTdGFydFRleHR9fSB7eyBjdXJyZW50U3RlcEluZGV4ICsgMSB9fSB7e2NvbmZpZy5zdGVwQ291bnRNaWRkbGVUZXh0fX0ge3tcclxuICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlLmxlbmd0aCB9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gdG91ciBhY3Rpb24gYnV0dG9ucyAtLT5cclxuICAgICAgICAgICAgPG1hdC1jYXJkLWFjdGlvbnMgY2xhc3M9XCJ0b3VyLWd1aWRlLWFjdGlvbi1idXR0b25zXCIgW3N0eWxlLmp1c3RpZnlDb250ZW50XT1cImNvbmZpZy5idXR0b25zQWxpZ25tZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIFtzdHlsZS5mb250U2l6ZV09XCJjb25maWcuYnV0dG9uc0ZvbnRTaXplXCIgKm5nSWY9XCJjb25maWcuc2hvd1NraXBCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJza2lwKClcIj57e2NvbmZpZy5za2lwQnV0dG9uVGV4dH19PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbc3R5bGUuZm9udFNpemVdPVwiY29uZmlnLmJ1dHRvbnNGb250U2l6ZVwiIChjbGljayk9XCJwcmV2aW91c1N0ZXAoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRTdGVwSW5kZXggPT09IDBcIj57e2NvbmZpZy5wcmV2QnV0dG9uVGV4dH19PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbc3R5bGUuZm9udFNpemVdPVwiY29uZmlnLmJ1dHRvbnNGb250U2l6ZVwiIChjbGljayk9XCJuZXh0U3RlcCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudFN0ZXBJbmRleCA9PT0gZGF0YVNvdXJjZS5sZW5ndGggLSAxID8gY29uZmlnLmZpbmlzaEJ1dHRvblRleHQgOiBjb25maWcubmV4dEJ1dHRvblRleHRcclxuICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbWF0LWNhcmQtYWN0aW9ucz5cclxuICAgICAgICA8L21hdC1jYXJkPlxyXG5cclxuICAgICAgICA8IS0tIGhvbGUgb24gb3ZlcmxheWVyIGZvciBoaWdobGlnaHRlZCBjb250ZW50IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJob2xlXCIgW3N0eWxlLmJvcmRlckNvbG9yXT1cImNvbmZpZy5oaWdobGlnaHRCb3JkZXJDb2xvclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJXaWR0aF09XCJjb25maWcuaGlnaGxpZ2h0Qm9yZGVyV2lkdGhcIj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9kaXY+Il19
@@ -1,20 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { RuclibTourGuideComponent } from './ruclib-tour-guide/ruclib-tour-guide.component';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import { MatCardModule } from '@angular/material/card';
6
- import * as i0 from "@angular/core";
7
- export class RuclibTourGuideModule {
8
- }
9
- RuclibTourGuideModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibTourGuideModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
- RuclibTourGuideModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RuclibTourGuideModule, declarations: [RuclibTourGuideComponent], imports: [CommonModule, MatButtonModule, MatCardModule], exports: [RuclibTourGuideComponent] });
11
- RuclibTourGuideModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibTourGuideModule, imports: [CommonModule, MatButtonModule, MatCardModule] });
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibTourGuideModule, decorators: [{
13
- type: NgModule,
14
- args: [{
15
- imports: [CommonModule, MatButtonModule, MatCardModule],
16
- declarations: [RuclibTourGuideComponent],
17
- exports: [RuclibTourGuideComponent],
18
- }]
19
- }] });
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLXRvdXItZ3VpZGUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydWNsaWItdG91ci1ndWlkZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDM0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFPdkQsTUFBTSxPQUFPLHFCQUFxQjs7bUhBQXJCLHFCQUFxQjtvSEFBckIscUJBQXFCLGlCQUhqQix3QkFBd0IsYUFEN0IsWUFBWSxFQUFFLGVBQWUsRUFBRSxhQUFhLGFBRTVDLHdCQUF3QjtvSEFFdkIscUJBQXFCLFlBSnRCLFlBQVksRUFBRSxlQUFlLEVBQUUsYUFBYTs0RkFJM0MscUJBQXFCO2tCQUxqQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDO29CQUN2RCxZQUFZLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztvQkFDeEMsT0FBTyxFQUFFLENBQUMsd0JBQXdCLENBQUM7aUJBQ3BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUnVjbGliVG91ckd1aWRlQ29tcG9uZW50IH0gZnJvbSAnLi9ydWNsaWItdG91ci1ndWlkZS9ydWNsaWItdG91ci1ndWlkZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0Q2FyZE1vZHVsZV0sXHJcbiAgZGVjbGFyYXRpb25zOiBbUnVjbGliVG91ckd1aWRlQ29tcG9uZW50XSxcclxuICBleHBvcnRzOiBbUnVjbGliVG91ckd1aWRlQ29tcG9uZW50XSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFJ1Y2xpYlRvdXJHdWlkZU1vZHVsZSB7fVxyXG4iXX0=
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLWxpYi10b3VyLWd1aWRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1Yy1saWItdG91ci1ndWlkZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==