@seniorsistemas/angular-components 19.2.0 → 19.3.1

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.
Files changed (36) hide show
  1. package/dynamic-form/dynamic-form/dynamic-form.directive.d.ts +3 -0
  2. package/dynamic-form/dynamic-form/form-field/configurations/fields/field.d.ts +7 -0
  3. package/dynamic-form/public-api.d.ts +2 -3
  4. package/esm2022/dynamic-form/dynamic-form/dynamic-form.directive.mjs +17 -1
  5. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/field.mjs +1 -1
  6. package/esm2022/dynamic-form/public-api.mjs +3 -4
  7. package/esm2022/lib/locale/fallback.mjs +10 -2
  8. package/esm2022/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.mjs +460 -0
  9. package/esm2022/spotlight/lib/spotlight/spotlight-step.directive.mjs +50 -0
  10. package/esm2022/spotlight/lib/spotlight/spotlight-tour.service.mjs +251 -0
  11. package/esm2022/spotlight/lib/spotlight/spotlight.component.mjs +193 -0
  12. package/esm2022/spotlight/lib/spotlight/types/spotlight-position.mjs +2 -0
  13. package/esm2022/spotlight/lib/spotlight/types/spotlight-step.mjs +2 -0
  14. package/esm2022/spotlight/lib/spotlight/types/spotlight-stop-event.mjs +2 -0
  15. package/esm2022/spotlight/public-api.mjs +4 -0
  16. package/esm2022/spotlight/seniorsistemas-angular-components-spotlight.mjs +5 -0
  17. package/esm2022/table/lib/table/table-column/table-columns.component.mjs +3 -3
  18. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +16 -0
  19. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  20. package/fesm2022/seniorsistemas-angular-components-spotlight.mjs +947 -0
  21. package/fesm2022/seniorsistemas-angular-components-spotlight.mjs.map +1 -0
  22. package/fesm2022/seniorsistemas-angular-components-table.mjs +2 -2
  23. package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
  24. package/fesm2022/seniorsistemas-angular-components.mjs +9 -1
  25. package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
  26. package/package.json +7 -1
  27. package/spotlight/README.md +311 -0
  28. package/spotlight/index.d.ts +5 -0
  29. package/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.d.ts +70 -0
  30. package/spotlight/lib/spotlight/spotlight-step.directive.d.ts +28 -0
  31. package/spotlight/lib/spotlight/spotlight-tour.service.d.ts +146 -0
  32. package/spotlight/lib/spotlight/spotlight.component.d.ts +82 -0
  33. package/spotlight/lib/spotlight/types/spotlight-position.d.ts +1 -0
  34. package/spotlight/lib/spotlight/types/spotlight-step.d.ts +21 -0
  35. package/spotlight/lib/spotlight/types/spotlight-stop-event.d.ts +13 -0
  36. package/spotlight/public-api.d.ts +6 -0
@@ -0,0 +1,251 @@
1
+ import { Overlay } from '@angular/cdk/overlay';
2
+ import { ComponentPortal } from '@angular/cdk/portal';
3
+ import { computed, EnvironmentInjector, inject, Injectable, signal } from '@angular/core';
4
+ import { Subject } from 'rxjs';
5
+ import { SpotlightOverlayComponent } from './spotlight-overlay/spotlight-overlay.component';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Serviço central do Spotlight Tour.
9
+ *
10
+ * Gerencia o estado do tour (passos, índice atual, ativo/inativo), a navegação entre
11
+ * passos e o registro de elementos do DOM associados a cada `stepId`.
12
+ *
13
+ * Use `start()` para iniciar um tour com múltiplos passos ou `spotlight()` para
14
+ * exibir um destaque simples em um único elemento.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // Tour com múltiplos passos
19
+ * this.tourService.start([
20
+ * { stepId: 'passo-1', title: 'Título', message: 'Mensagem' },
21
+ * { stepId: 'passo-2', title: 'Título', message: 'Mensagem' },
22
+ * ]);
23
+ *
24
+ * // Destaque simples
25
+ * this.tourService.spotlight('meu-elemento', { title: 'Dica', message: 'Detalhes' });
26
+ * ```
27
+ */
28
+ export class SpotlightTourService {
29
+ overlay = inject(Overlay);
30
+ environmentInjector = inject(EnvironmentInjector);
31
+ overlayRef = null;
32
+ _steps = signal([]);
33
+ _currentIndex = signal(0);
34
+ _isActive = signal(false);
35
+ _registrationVersion = signal(0);
36
+ _registeredElements = new Map();
37
+ _pendingDoNotShowAgain = false;
38
+ _stopped$ = new Subject();
39
+ _stepChanged$ = new Subject();
40
+ /** Signal somente-leitura que indica se o tour está ativo no momento. */
41
+ isActive = this._isActive.asReadonly();
42
+ /** Signal somente-leitura com o índice (0-based) do passo exibido atualmente. */
43
+ currentIndex = this._currentIndex.asReadonly();
44
+ /** Signal computado com o total de passos do tour em andamento. */
45
+ totalSteps = computed(() => this._steps().length);
46
+ /** Signal computado com os dados do passo atualmente exibido. */
47
+ currentStep = computed(() => this._steps()[this._currentIndex()]);
48
+ /**
49
+ * Observable emitido quando o tour é encerrado, seja por conclusão, interrupção
50
+ * ou descarte. Carrega um `SpotlightStopEvent` com o motivo e o estado final.
51
+ */
52
+ stopped$ = this._stopped$.asObservable();
53
+ /**
54
+ * Observable emitido sempre que o passo exibido muda, incluindo o início do tour.
55
+ * Carrega um `SpotlightStepChangedEvent` com o `stepId` e o índice do novo passo.
56
+ */
57
+ stepChanged$ = this._stepChanged$.asObservable();
58
+ /**
59
+ * Signal somente-leitura incrementado a cada chamada de `registerElement` ou
60
+ * `unregisterElement`. Permite que outros componentes reajam a mudanças no
61
+ * registro de elementos sem polling.
62
+ */
63
+ registrationVersion = this._registrationVersion.asReadonly();
64
+ /**
65
+ * Inicia um tour com a lista de passos fornecida.
66
+ *
67
+ * O tour começa pelo primeiro passo da lista. Emite `stepChanged$` para o passo inicial.
68
+ * Se `steps` for um array vazio, o método não faz nada.
69
+ * Se já houver um tour ativo, ele é encerrado (emitindo `stopped$` com `reason: 'interrupted'`)
70
+ * antes de o novo tour começar.
71
+ *
72
+ * @param steps Lista de passos a percorrer em ordem.
73
+ */
74
+ start(steps) {
75
+ if (steps.length === 0)
76
+ return;
77
+ if (this._isActive()) {
78
+ this.stop();
79
+ }
80
+ this._steps.set(steps);
81
+ this._currentIndex.set(0);
82
+ this._isActive.set(true);
83
+ this.attachOverlay();
84
+ this._stepChanged$.next({ stepId: steps[0].stepId, stepIndex: 0, totalSteps: steps.length });
85
+ }
86
+ /**
87
+ * Exibe um destaque simples (passo único) no elemento identificado por `stepId`.
88
+ *
89
+ * Equivalente a chamar `start()` com um array de um único passo.
90
+ * O checkbox "Não mostrar novamente" é exibido por padrão (`showDoNotShowAgain: true`);
91
+ * passe `showDoNotShowAgain: false` em `config` para suprimi-lo.
92
+ *
93
+ * @param stepId ID do elemento registrado via `sSpotlightStep` ou `registerElement`.
94
+ * @param config Configuração visual e comportamental do destaque.
95
+ */
96
+ spotlight(stepId, config) {
97
+ const step = { stepId, ...config };
98
+ this.start([step]);
99
+ }
100
+ /**
101
+ * Avança para o próximo passo do tour.
102
+ *
103
+ * Se o passo atual definir `beforeNext`, aguarda sua resolução antes de avançar.
104
+ * No último passo, encerra o tour com `reason: 'completed'`.
105
+ *
106
+ * @param doNotShowAgain Quando `true`, o evento `stopped$` será emitido com
107
+ * `doNotShowAgain: true` ao concluir o tour. Relevante apenas no último passo.
108
+ */
109
+ next(doNotShowAgain = false) {
110
+ const current = this.currentStep();
111
+ this._pendingDoNotShowAgain = doNotShowAgain;
112
+ if (current?.beforeNext) {
113
+ const result = current.beforeNext();
114
+ if (result instanceof Promise) {
115
+ result.then(() => this.advance()).catch(() => { });
116
+ }
117
+ else {
118
+ this.advance();
119
+ }
120
+ }
121
+ else {
122
+ this.advance();
123
+ }
124
+ }
125
+ /**
126
+ * Retorna ao passo anterior do tour.
127
+ *
128
+ * Se o passo atual definir `beforePrevious`, aguarda sua resolução antes de voltar.
129
+ * Não faz nada se o tour estiver no primeiro passo.
130
+ */
131
+ previous() {
132
+ if (this._currentIndex() <= 0)
133
+ return;
134
+ const current = this.currentStep();
135
+ if (current?.beforePrevious) {
136
+ const result = current.beforePrevious();
137
+ if (result instanceof Promise) {
138
+ result.then(() => this.retreat()).catch(() => { });
139
+ }
140
+ else {
141
+ this.retreat();
142
+ }
143
+ }
144
+ else {
145
+ this.retreat();
146
+ }
147
+ }
148
+ /**
149
+ * Encerra o tour imediatamente e emite o evento `stopped$`.
150
+ *
151
+ * @param event Dados parciais do evento de parada. Valores não fornecidos são
152
+ * preenchidos com os defaults: `reason: 'interrupted'`, `doNotShowAgain: false`
153
+ * e o `stepId`/`stepIndex`/`totalSteps` do momento atual.
154
+ */
155
+ stop(event) {
156
+ const steps = this._steps();
157
+ const index = this._currentIndex();
158
+ const fullEvent = {
159
+ reason: 'interrupted',
160
+ doNotShowAgain: false,
161
+ stepId: steps[index]?.stepId ?? '',
162
+ stepIndex: index,
163
+ totalSteps: steps.length,
164
+ ...event,
165
+ };
166
+ this._isActive.set(false);
167
+ this._steps.set([]);
168
+ this._currentIndex.set(0);
169
+ this._pendingDoNotShowAgain = false;
170
+ this._stopped$.next(fullEvent);
171
+ this.detachOverlay();
172
+ }
173
+ /**
174
+ * Registra um elemento do DOM como alvo do passo identificado por `stepId`.
175
+ *
176
+ * Normalmente chamado pela diretiva `sSpotlightStep`. Use diretamente apenas
177
+ * quando precisar registrar elementos criados programaticamente.
178
+ *
179
+ * @param stepId ID único do passo ao qual o elemento pertence.
180
+ * @param el Referência ao elemento do DOM.
181
+ */
182
+ registerElement(stepId, el) {
183
+ this._registeredElements.set(stepId, el);
184
+ this._registrationVersion.update((v) => v + 1);
185
+ }
186
+ /**
187
+ * Remove o registro do elemento associado a `stepId`.
188
+ *
189
+ * Normalmente chamado pela diretiva `sSpotlightStep` no `ngOnDestroy`.
190
+ *
191
+ * @param stepId ID do passo cujo elemento deve ser removido.
192
+ */
193
+ unregisterElement(stepId) {
194
+ this._registeredElements.delete(stepId);
195
+ this._registrationVersion.update((v) => v + 1);
196
+ }
197
+ /**
198
+ * Retorna o `ElementRef` registrado para o `stepId` informado,
199
+ * ou `undefined` se nenhum elemento estiver registrado.
200
+ *
201
+ * @param stepId ID do passo a buscar.
202
+ */
203
+ getElement(stepId) {
204
+ return this._registeredElements.get(stepId);
205
+ }
206
+ advance() {
207
+ const steps = this._steps();
208
+ const currentIndex = this._currentIndex();
209
+ if (currentIndex < steps.length - 1) {
210
+ const newIndex = currentIndex + 1;
211
+ this._pendingDoNotShowAgain = false;
212
+ this._currentIndex.set(newIndex);
213
+ this._stepChanged$.next({ stepId: steps[newIndex].stepId, stepIndex: newIndex, totalSteps: steps.length });
214
+ }
215
+ else {
216
+ this.stop({ reason: 'completed', doNotShowAgain: this._pendingDoNotShowAgain });
217
+ }
218
+ }
219
+ retreat() {
220
+ const steps = this._steps();
221
+ const newIndex = this._currentIndex() - 1;
222
+ this._currentIndex.set(newIndex);
223
+ this._stepChanged$.next({ stepId: steps[newIndex].stepId, stepIndex: newIndex, totalSteps: steps.length });
224
+ }
225
+ attachOverlay() {
226
+ if (this.overlayRef) {
227
+ return;
228
+ }
229
+ this.overlayRef = this.overlay.create({
230
+ hasBackdrop: false,
231
+ scrollStrategy: this.overlay.scrollStrategies.noop(),
232
+ positionStrategy: this.overlay.position().global(),
233
+ });
234
+ const portal = new ComponentPortal(SpotlightOverlayComponent, null, this.environmentInjector);
235
+ this.overlayRef.attach(portal);
236
+ }
237
+ detachOverlay() {
238
+ if (this.overlayRef) {
239
+ this.overlayRef.detach();
240
+ this.overlayRef.dispose();
241
+ this.overlayRef = null;
242
+ }
243
+ }
244
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightTourService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
245
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightTourService, providedIn: 'root' });
246
+ }
247
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightTourService, decorators: [{
248
+ type: Injectable,
249
+ args: [{ providedIn: 'root' }]
250
+ }] });
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXRvdXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL2xpYi9zcG90bGlnaHQvc3BvdGxpZ2h0LXRvdXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQWMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7QUFPNUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxPQUFPLG9CQUFvQjtJQUNaLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFM0QsVUFBVSxHQUFzQixJQUFJLENBQUM7SUFFNUIsTUFBTSxHQUFHLE1BQU0sQ0FBMEIsRUFBRSxDQUFDLENBQUM7SUFDN0MsYUFBYSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqQyxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUU3RCxzQkFBc0IsR0FBRyxLQUFLLENBQUM7SUFFdEIsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFzQixDQUFDO0lBQzlDLGFBQWEs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QUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDOUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVPLGFBQWE7UUFDakIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQzNCLENBQUM7SUFDTCxDQUFDO3dHQS9PUSxvQkFBb0I7NEdBQXBCLG9CQUFvQixjQURQLE1BQU07OzRGQUNuQixvQkFBb0I7a0JBRGhDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIEVsZW1lbnRSZWYsIEVudmlyb25tZW50SW5qZWN0b3IsIGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU3BvdGxpZ2h0T3ZlcmxheUNvbXBvbmVudCB9IGZyb20gJy4vc3BvdGxpZ2h0LW92ZXJsYXkvc3BvdGxpZ2h0LW92ZXJsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFNwb3RsaWdodENvbmZpZywgU3BvdGxpZ2h0U3RlcCB9IGZyb20gJy4vdHlwZXMvc3BvdGxpZ2h0LXN0ZXAnO1xuaW1wb3J0IHsgU3BvdGxpZ2h0U3RlcENoYW5nZWRFdmVudCwgU3BvdGxpZ2h0U3RvcEV2ZW50IH0gZnJvbSAnLi90eXBlcy9zcG90bGlnaHQtc3RvcC1ldmVudCc7XG5cbi8qKiBAaW50ZXJuYWwgKi9cbnR5cGUgU3BvdGxpZ2h0U3RlcEludGVybmFsID0gU3BvdGxpZ2h0U3RlcCAmIHsgc2hvd0RvTm90U2hvd0FnYWluPzogYm9vbGVhbiB9O1xuXG4vKipcbiAqIFNlcnZpw6dvIGNlbnRyYWwgZG8gU3BvdGxpZ2h0IFRvdXIuXG4gKlxuICogR2VyZW5jaWEgbyBlc3RhZG8gZG8gdG91ciAocGFzc29zLCDDrW5kaWNlIGF0dWFsLCBhdGl2by9pbmF0aXZvKSwgYSBuYXZlZ2HDp8OjbyBlbnRyZVxuICogcGFzc29zIGUgbyByZWdpc3RybyBkZSBlbGVtZW50b3MgZG8gRE9NIGFzc29jaWFkb3MgYSBjYWRhIGBzdGVwSWRgLlxuICpcbiAqIFVzZSBgc3RhcnQoKWAgcGFyYSBpbmljaWFyIHVtIHRvdXIgY29tIG3Dumx0aXBsb3MgcGFzc29zIG91IGBzcG90bGlnaHQoKWAgcGFyYVxuICogZXhpYmlyIHVtIGRlc3RhcXVlIHNpbXBsZXMgZW0gdW0gw7puaWNvIGVsZW1lbnRvLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBUb3VyIGNvbSBtw7psdGlwbG9zIHBhc3Nvc1xuICogdGhpcy50b3VyU2VydmljZS5zdGFydChbXG4gKiAgIHsgc3RlcElkOiAncGFzc28tMScsIHRpdGxlOiAnVMOtdHVsbycsIG1lc3NhZ2U6ICdNZW5zYWdlbScgfSxcbiAqICAgeyBzdGVwSWQ6ICdwYXNzby0yJywgdGl0bGU6ICdUw610dWxvJywgbWVzc2FnZTogJ01lbnNhZ2VtJyB9LFxuICogXSk7XG4gKlxuICogLy8gRGVzdGFxdWUgc2ltcGxlc1xuICogdGhpcy50b3VyU2VydmljZS5zcG90bGlnaHQoJ21ldS1lbGVtZW50bycsIHsgdGl0bGU6ICdEaWNhJywgbWVzc2FnZTogJ0RldGFsaGVzJyB9KTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFNwb3RsaWdodFRvdXJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudEluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xuXG4gICAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdGVwcyA9IHNpZ25hbDxTcG90bGlnaHRTdGVwSW50ZXJuYWxbXT4oW10pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRJbmRleCA9IHNpZ25hbCgwKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pc0FjdGl2ZSA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVnaXN0cmF0aW9uVmVyc2lvbiA9IHNpZ25hbCgwKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JlZ2lzdGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBFbGVtZW50UmVmPigpO1xuXG4gICAgcHJpdmF0ZSBfcGVuZGluZ0RvTm90U2hvd0FnYWluID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdG9wcGVkJCA9IG5ldyBTdWJqZWN0PFNwb3RsaWdodFN0b3BFdmVudD4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdGVwQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxTcG90bGlnaHRTdGVwQ2hhbmdlZEV2ZW50PigpO1xuXG4gICAgLyoqIFNpZ25hbCBzb21lbnRlLWxlaXR1cmEgcXVlIGluZGljYSBzZSBvIHRvdXIgZXN0w6EgYXRpdm8gbm8gbW9tZW50by4gKi9cbiAgICByZWFkb25seSBpc0FjdGl2ZSA9IHRoaXMuX2lzQWN0aXZlLmFzUmVhZG9ubHkoKTtcblxuICAgIC8qKiBTaWduYWwgc29tZW50ZS1sZWl0dXJhIGNvbSBvIMOtbmRpY2UgKDAtYmFzZWQpIGRvIHBhc3NvIGV4aWJpZG8gYXR1YWxtZW50ZS4gKi9cbiAgICByZWFkb25seSBjdXJyZW50SW5kZXggPSB0aGlzLl9jdXJyZW50SW5kZXguYXNSZWFkb25seSgpO1xuXG4gICAgLyoqIFNpZ25hbCBjb21wdXRhZG8gY29tIG8gdG90YWwgZGUgcGFzc29zIGRvIHRvdXIgZW0gYW5kYW1lbnRvLiAqL1xuICAgIHJlYWRvbmx5IHRvdGFsU3RlcHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9zdGVwcygpLmxlbmd0aCk7XG5cbiAgICAvKiogU2lnbmFsIGNvbXB1dGFkbyBjb20gb3MgZGFkb3MgZG8gcGFzc28gYXR1YWxtZW50ZSBleGliaWRvLiAqL1xuICAgIHJlYWRvbmx5IGN1cnJlbnRTdGVwID0gY29tcHV0ZWQ8U3BvdGxpZ2h0U3RlcEludGVybmFsIHwgdW5kZWZpbmVkPigoKSA9PiB0aGlzLl9zdGVwcygpW3RoaXMuX2N1cnJlbnRJbmRleCgpXSk7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhYmxlIGVtaXRpZG8gcXVhbmRvIG8gdG91ciDDqSBlbmNlcnJhZG8sIHNlamEgcG9yIGNvbmNsdXPDo28sIGludGVycnVww6fDo29cbiAgICAgKiBvdSBkZXNjYXJ0ZS4gQ2FycmVnYSB1bSBgU3BvdGxpZ2h0U3RvcEV2ZW50YCBjb20gbyBtb3Rpdm8gZSBvIGVzdGFkbyBmaW5hbC5cbiAgICAgKi9cbiAgICByZWFkb25seSBzdG9wcGVkJDogT2JzZXJ2YWJsZTxTcG90bGlnaHRTdG9wRXZlbnQ+ID0gdGhpcy5fc3RvcHBlZCQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZhYmxlIGVtaXRpZG8gc2VtcHJlIHF1ZSBvIHBhc3NvIGV4aWJpZG8gbXVkYSwgaW5jbHVpbmRvIG8gaW7DrWNpbyBkbyB0b3VyLlxuICAgICAqIENhcnJlZ2EgdW0gYFNwb3RsaWdodFN0ZXBDaGFuZ2VkRXZlbnRgIGNvbSBvIGBzdGVwSWRgIGUgbyDDrW5kaWNlIGRvIG5vdm8gcGFzc28uXG4gICAgICovXG4gICAgcmVhZG9ubHkgc3RlcENoYW5nZWQkOiBPYnNlcnZhYmxlPFNwb3RsaWdodFN0ZXBDaGFuZ2VkRXZlbnQ+ID0gdGhpcy5fc3RlcENoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgLyoqXG4gICAgICogU2lnbmFsIHNvbWVudGUtbGVpdHVyYSBpbmNyZW1lbnRhZG8gYSBjYWRhIGNoYW1hZGEgZGUgYHJlZ2lzdGVyRWxlbWVudGAgb3VcbiAgICAgKiBgdW5yZWdpc3RlckVsZW1lbnRgLiBQZXJtaXRlIHF1ZSBvdXRyb3MgY29tcG9uZW50ZXMgcmVhamFtIGEgbXVkYW7Dp2FzIG5vXG4gICAgICogcmVnaXN0cm8gZGUgZWxlbWVudG9zIHNlbSBwb2xsaW5nLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblZlcnNpb24gPSB0aGlzLl9yZWdpc3RyYXRpb25WZXJzaW9uLmFzUmVhZG9ubHkoKTtcblxuICAgIC8qKlxuICAgICAqIEluaWNpYSB1bSB0b3VyIGNvbSBhIGxpc3RhIGRlIHBhc3NvcyBmb3JuZWNpZGEuXG4gICAgICpcbiAgICAgKiBPIHRvdXIgY29tZcOnYSBwZWxvIHByaW1laXJvIHBhc3NvIGRhIGxpc3RhLiBFbWl0ZSBgc3RlcENoYW5nZWQkYCBwYXJhIG8gcGFzc28gaW5pY2lhbC5cbiAgICAgKiBTZSBgc3RlcHNgIGZvciB1bSBhcnJheSB2YXppbywgbyBtw6l0b2RvIG7Do28gZmF6IG5hZGEuXG4gICAgICogU2UgasOhIGhvdXZlciB1bSB0b3VyIGF0aXZvLCBlbGUgw6kgZW5jZXJyYWRvIChlbWl0aW5kbyBgc3RvcHBlZCRgIGNvbSBgcmVhc29uOiAnaW50ZXJydXB0ZWQnYClcbiAgICAgKiBhbnRlcyBkZSBvIG5vdm8gdG91ciBjb21lw6dhci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGVwcyBMaXN0YSBkZSBwYXNzb3MgYSBwZXJjb3JyZXIgZW0gb3JkZW0uXG4gICAgICovXG4gICAgc3RhcnQoc3RlcHM6IFNwb3RsaWdodFN0ZXBbXSk6IHZvaWQge1xuICAgICAgICBpZiAoc3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3RlcHMuc2V0KHN0ZXBzIGFzIFNwb3RsaWdodFN0ZXBJbnRlcm5hbFtdKTtcbiAgICAgICAgdGhpcy5fY3VycmVudEluZGV4LnNldCgwKTtcbiAgICAgICAgdGhpcy5faXNBY3RpdmUuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmF0dGFjaE92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5fc3RlcENoYW5nZWQkLm5leHQoeyBzdGVwSWQ6IHN0ZXBzWzBdLnN0ZXBJZCwgc3RlcEluZGV4OiAwLCB0b3RhbFN0ZXBzOiBzdGVwcy5sZW5ndGggfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhpYmUgdW0gZGVzdGFxdWUgc2ltcGxlcyAocGFzc28gw7puaWNvKSBubyBlbGVtZW50byBpZGVudGlmaWNhZG8gcG9yIGBzdGVwSWRgLlxuICAgICAqXG4gICAgICogRXF1aXZhbGVudGUgYSBjaGFtYXIgYHN0YXJ0KClgIGNvbSB1bSBhcnJheSBkZSB1bSDDum5pY28gcGFzc28uXG4gICAgICogTyBjaGVja2JveCBcIk7Do28gbW9zdHJhciBub3ZhbWVudGVcIiDDqSBleGliaWRvIHBvciBwYWRyw6NvIChgc2hvd0RvTm90U2hvd0FnYWluOiB0cnVlYCk7XG4gICAgICogcGFzc2UgYHNob3dEb05vdFNob3dBZ2FpbjogZmFsc2VgIGVtIGBjb25maWdgIHBhcmEgc3VwcmltaS1sby5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGVwSWQgSUQgZG8gZWxlbWVudG8gcmVnaXN0cmFkbyB2aWEgYHNTcG90bGlnaHRTdGVwYCBvdSBgcmVnaXN0ZXJFbGVtZW50YC5cbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYcOnw6NvIHZpc3VhbCBlIGNvbXBvcnRhbWVudGFsIGRvIGRlc3RhcXVlLlxuICAgICAqL1xuICAgIHNwb3RsaWdodChzdGVwSWQ6IHN0cmluZywgY29uZmlnOiBTcG90bGlnaHRDb25maWcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RlcDogU3BvdGxpZ2h0U3RlcEludGVybmFsID0geyBzdGVwSWQsIC4uLmNvbmZpZyB9O1xuICAgICAgICB0aGlzLnN0YXJ0KFtzdGVwXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXZhbsOnYSBwYXJhIG8gcHLDs3hpbW8gcGFzc28gZG8gdG91ci5cbiAgICAgKlxuICAgICAqIFNlIG8gcGFzc28gYXR1YWwgZGVmaW5pciBgYmVmb3JlTmV4dGAsIGFndWFyZGEgc3VhIHJlc29sdcOnw6NvIGFudGVzIGRlIGF2YW7Dp2FyLlxuICAgICAqIE5vIMO6bHRpbW8gcGFzc28sIGVuY2VycmEgbyB0b3VyIGNvbSBgcmVhc29uOiAnY29tcGxldGVkJ2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9Ob3RTaG93QWdhaW4gUXVhbmRvIGB0cnVlYCwgbyBldmVudG8gYHN0b3BwZWQkYCBzZXLDoSBlbWl0aWRvIGNvbVxuICAgICAqICAgYGRvTm90U2hvd0FnYWluOiB0cnVlYCBhbyBjb25jbHVpciBvIHRvdXIuIFJlbGV2YW50ZSBhcGVuYXMgbm8gw7psdGltbyBwYXNzby5cbiAgICAgKi9cbiAgICBuZXh0KGRvTm90U2hvd0FnYWluID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFN0ZXAoKTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0RvTm90U2hvd0FnYWluID0gZG9Ob3RTaG93QWdhaW47XG5cbiAgICAgICAgaWYgKGN1cnJlbnQ/LmJlZm9yZU5leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGN1cnJlbnQuYmVmb3JlTmV4dCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudGhlbigoKSA9PiB0aGlzLmFkdmFuY2UoKSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBhbyBwYXNzbyBhbnRlcmlvciBkbyB0b3VyLlxuICAgICAqXG4gICAgICogU2UgbyBwYXNzbyBhdHVhbCBkZWZpbmlyIGBiZWZvcmVQcmV2aW91c2AsIGFndWFyZGEgc3VhIHJlc29sdcOnw6NvIGFudGVzIGRlIHZvbHRhci5cbiAgICAgKiBOw6NvIGZheiBuYWRhIHNlIG8gdG91ciBlc3RpdmVyIG5vIHByaW1laXJvIHBhc3NvLlxuICAgICAqL1xuICAgIHByZXZpb3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudEluZGV4KCkgPD0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRTdGVwKCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQ/LmJlZm9yZVByZXZpb3VzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjdXJyZW50LmJlZm9yZVByZXZpb3VzKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCgpID0+IHRoaXMucmV0cmVhdCgpKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmV0cmVhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXRyZWF0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmNlcnJhIG8gdG91ciBpbWVkaWF0YW1lbnRlIGUgZW1pdGUgbyBldmVudG8gYHN0b3BwZWQkYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudCBEYWRvcyBwYXJjaWFpcyBkbyBldmVudG8gZGUgcGFyYWRhLiBWYWxvcmVzIG7Do28gZm9ybmVjaWRvcyBzw6NvXG4gICAgICogICBwcmVlbmNoaWRvcyBjb20gb3MgZGVmYXVsdHM6IGByZWFzb246ICdpbnRlcnJ1cHRlZCdgLCBgZG9Ob3RTaG93QWdhaW46IGZhbHNlYFxuICAgICAqICAgZSBvIGBzdGVwSWRgL2BzdGVwSW5kZXhgL2B0b3RhbFN0ZXBzYCBkbyBtb21lbnRvIGF0dWFsLlxuICAgICAqL1xuICAgIHN0b3AoZXZlbnQ/OiBQYXJ0aWFsPFNwb3RsaWdodFN0b3BFdmVudD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RlcHMgPSB0aGlzLl9zdGVwcygpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2N1cnJlbnRJbmRleCgpO1xuICAgICAgICBjb25zdCBmdWxsRXZlbnQ6IFNwb3RsaWdodFN0b3BFdmVudCA9IHtcbiAgICAgICAgICAgIHJlYXNvbjogJ2ludGVycnVwdGVkJyxcbiAgICAgICAgICAgIGRvTm90U2hvd0FnYWluOiBmYWxzZSxcbiAgICAgICAgICAgIHN0ZXBJZDogc3RlcHNbaW5kZXhdPy5zdGVwSWQgPz8gJycsXG4gICAgICAgICAgICBzdGVwSW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgdG90YWxTdGVwczogc3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2lzQWN0aXZlLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuX3N0ZXBzLnNldChbXSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleC5zZXQoMCk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdEb05vdFNob3dBZ2FpbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdG9wcGVkJC5uZXh0KGZ1bGxFdmVudCk7XG4gICAgICAgIHRoaXMuZGV0YWNoT3ZlcmxheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtIGVsZW1lbnRvIGRvIERPTSBjb21vIGFsdm8gZG8gcGFzc28gaWRlbnRpZmljYWRvIHBvciBgc3RlcElkYC5cbiAgICAgKlxuICAgICAqIE5vcm1hbG1lbnRlIGNoYW1hZG8gcGVsYSBkaXJldGl2YSBgc1Nwb3RsaWdodFN0ZXBgLiBVc2UgZGlyZXRhbWVudGUgYXBlbmFzXG4gICAgICogcXVhbmRvIHByZWNpc2FyIHJlZ2lzdHJhciBlbGVtZW50b3MgY3JpYWRvcyBwcm9ncmFtYXRpY2FtZW50ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGVwSWQgSUQgw7puaWNvIGRvIHBhc3NvIGFvIHF1YWwgbyBlbGVtZW50byBwZXJ0ZW5jZS5cbiAgICAgKiBAcGFyYW0gZWwgUmVmZXLDqm5jaWEgYW8gZWxlbWVudG8gZG8gRE9NLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyRWxlbWVudChzdGVwSWQ6IHN0cmluZywgZWw6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEVsZW1lbnRzLnNldChzdGVwSWQsIGVsKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0cmF0aW9uVmVyc2lvbi51cGRhdGUoKHYpID0+IHYgKyAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgbyByZWdpc3RybyBkbyBlbGVtZW50byBhc3NvY2lhZG8gYSBgc3RlcElkYC5cbiAgICAgKlxuICAgICAqIE5vcm1hbG1lbnRlIGNoYW1hZG8gcGVsYSBkaXJldGl2YSBgc1Nwb3RsaWdodFN0ZXBgIG5vIGBuZ09uRGVzdHJveWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RlcElkIElEIGRvIHBhc3NvIGN1am8gZWxlbWVudG8gZGV2ZSBzZXIgcmVtb3ZpZG8uXG4gICAgICovXG4gICAgdW5yZWdpc3RlckVsZW1lbnQoc3RlcElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZEVsZW1lbnRzLmRlbGV0ZShzdGVwSWQpO1xuICAgICAgICB0aGlzLl9yZWdpc3RyYXRpb25WZXJzaW9uLnVwZGF0ZSgodikgPT4gdiArIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBgRWxlbWVudFJlZmAgcmVnaXN0cmFkbyBwYXJhIG8gYHN0ZXBJZGAgaW5mb3JtYWRvLFxuICAgICAqIG91IGB1bmRlZmluZWRgIHNlIG5lbmh1bSBlbGVtZW50byBlc3RpdmVyIHJlZ2lzdHJhZG8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RlcElkIElEIGRvIHBhc3NvIGEgYnVzY2FyLlxuICAgICAqL1xuICAgIGdldEVsZW1lbnQoc3RlcElkOiBzdHJpbmcpOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRFbGVtZW50cy5nZXQoc3RlcElkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkdmFuY2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5fc3RlcHMoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5fY3VycmVudEluZGV4KCk7XG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPCBzdGVwcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nRG9Ob3RTaG93QWdhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleC5zZXQobmV3SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc3RlcENoYW5nZWQkLm5leHQoeyBzdGVwSWQ6IHN0ZXBzW25ld0luZGV4XS5zdGVwSWQsIHN0ZXBJbmRleDogbmV3SW5kZXgsIHRvdGFsU3RlcHM6IHN0ZXBzLmxlbmd0aCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCh7IHJlYXNvbjogJ2NvbXBsZXRlZCcsIGRvTm90U2hvd0FnYWluOiB0aGlzLl9wZW5kaW5nRG9Ob3RTaG93QWdhaW4gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJldHJlYXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5fc3RlcHMoKTtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSB0aGlzLl9jdXJyZW50SW5kZXgoKSAtIDE7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbmRleC5zZXQobmV3SW5kZXgpO1xuICAgICAgICB0aGlzLl9zdGVwQ2hhbmdlZCQubmV4dCh7IHN0ZXBJZDogc3RlcHNbbmV3SW5kZXhdLnN0ZXBJZCwgc3RlcEluZGV4OiBuZXdJbmRleCwgdG90YWxTdGVwczogc3RlcHMubGVuZ3RoIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoU3BvdGxpZ2h0T3ZlcmxheUNvbXBvbmVudCwgbnVsbCwgdGhpcy5lbnZpcm9ubWVudEluamVjdG9yKTtcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmLmF0dGFjaChwb3J0YWwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGV0YWNoT3ZlcmxheSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiJdfQ==
@@ -0,0 +1,193 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, input, output, signal, TemplateRef } from '@angular/core';
3
+ import { TranslateModule } from '@ngx-translate/core';
4
+ import { ButtonModule } from '@seniorsistemas/angular-components/button';
5
+ import { CheckboxComponent } from '@seniorsistemas/angular-components/checkbox';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@seniorsistemas/angular-components/button";
9
+ import * as i3 from "@ngx-translate/core";
10
+ /**
11
+ * Componente de popover do Spotlight.
12
+ *
13
+ * Exibe o card de destaque com título, mensagem, seta direcional, contador de passos,
14
+ * botões de navegação e, em modo simples (passo único), o checkbox "não mostrar novamente".
15
+ *
16
+ * Este componente é instanciado programaticamente pelo `SpotlightOverlayComponent`
17
+ * via CDK Overlay. Normalmente não é usado diretamente no template.
18
+ */
19
+ export class SpotlightComponent {
20
+ /** Título do popover. Aceita string ou `TemplateRef` para conteúdo dinâmico. */
21
+ title = input('');
22
+ /** Mensagem principal do popover. Aceita string ou `TemplateRef` para conteúdo dinâmico. */
23
+ message = input();
24
+ /** Template opcional para área de mídia/conteúdo customizado acima da mensagem. */
25
+ content = input(null);
26
+ /** Posição do popover em relação ao elemento alvo. @default 'bottom-center' */
27
+ position = input('bottom-center');
28
+ /** Número do passo atual (1-based) exibido no contador. @default 1 */
29
+ currentStep = input(1);
30
+ /** Total de passos do tour, usado no contador e para controle de botões. @default 1 */
31
+ totalSteps = input(1);
32
+ /**
33
+ * Exibe o checkbox "não mostrar novamente" (apenas em passo único).
34
+ * Passe `false` para suprimir o checkbox quando não for necessário persistir a preferência.
35
+ * @default true
36
+ */
37
+ showDoNotShowAgain = input(true);
38
+ /** Lista de botões de ação adicionais exibidos na área de rodapé. */
39
+ actions = input([]);
40
+ /**
41
+ * Deslocamento em pixels para posicionar a seta manualmente no eixo principal.
42
+ * Quando `null`, o alinhamento é controlado pela `position`. @default null
43
+ */
44
+ arrowOffsetPx = input(null);
45
+ /** Emitido ao clicar no botão de fechar (X). */
46
+ closed = output();
47
+ /** Emitido ao clicar em "Próximo". */
48
+ next = output();
49
+ /** Emitido ao clicar em "Voltar". */
50
+ previous = output();
51
+ /** Emitido ao clicar em "Entendido" (modo simples, passo único). */
52
+ understand = output();
53
+ /** Estado atual do checkbox "não mostrar novamente". */
54
+ isDoNotShowAgainChecked = signal(false);
55
+ static instanceCount = 0;
56
+ /** @internal */
57
+ instanceId = `spotlight-${++SpotlightComponent.instanceCount}`;
58
+ /** @internal */
59
+ titleId = `${this.instanceId}-title`;
60
+ /** @internal */
61
+ descId = `${this.instanceId}-desc`;
62
+ get titleTemplate() {
63
+ const v = this.title();
64
+ return v instanceof TemplateRef ? v : null;
65
+ }
66
+ get titleString() {
67
+ const v = this.title();
68
+ return v instanceof TemplateRef ? '' : (v ?? '');
69
+ }
70
+ get messageTemplate() {
71
+ const v = this.message();
72
+ return v instanceof TemplateRef ? v : null;
73
+ }
74
+ get messageString() {
75
+ const v = this.message();
76
+ return v instanceof TemplateRef ? '' : (v ?? '');
77
+ }
78
+ get arrowPosition() {
79
+ const [direction] = this.position().split('-');
80
+ const [, alignment] = this.position().split('-');
81
+ const oppositeDirection = this.getOppositeDirection(direction);
82
+ return `${oppositeDirection}-${alignment}`;
83
+ }
84
+ get isArrowTop() {
85
+ return this.arrowPosition.startsWith('top-');
86
+ }
87
+ get isArrowBottom() {
88
+ return this.arrowPosition.startsWith('bottom-');
89
+ }
90
+ get isArrowLeft() {
91
+ return this.arrowPosition.startsWith('left-');
92
+ }
93
+ get isArrowRight() {
94
+ return this.arrowPosition.startsWith('right-');
95
+ }
96
+ get arrowRotation() {
97
+ const direction = this.arrowPosition.split('-')[0];
98
+ switch (direction) {
99
+ case 'top':
100
+ return '';
101
+ case 'bottom':
102
+ return 'rotate-180';
103
+ case 'left':
104
+ return '-rotate-90';
105
+ case 'right':
106
+ return 'rotate-90';
107
+ default:
108
+ return '';
109
+ }
110
+ }
111
+ get arrowAlignmentClass() {
112
+ const offset = this.arrowOffsetPx();
113
+ if (offset !== null) {
114
+ return 'justify-start';
115
+ }
116
+ const alignment = this.arrowPosition.split('-')[1];
117
+ if (this.isArrowTop || this.isArrowBottom) {
118
+ switch (alignment) {
119
+ case 'start':
120
+ return 'justify-start';
121
+ case 'center':
122
+ return 'justify-center';
123
+ case 'end':
124
+ return 'justify-end';
125
+ default:
126
+ return '';
127
+ }
128
+ }
129
+ else {
130
+ switch (alignment) {
131
+ case 'start':
132
+ return 'items-start justify-start';
133
+ case 'center':
134
+ return 'items-center justify-center';
135
+ case 'end':
136
+ return 'items-end justify-end';
137
+ default:
138
+ return '';
139
+ }
140
+ }
141
+ }
142
+ get arrowPaddingStyle() {
143
+ const offset = this.arrowOffsetPx();
144
+ if (offset === null) {
145
+ return {};
146
+ }
147
+ if (this.isArrowTop || this.isArrowBottom) {
148
+ return { 'padding-left': `${offset}px`, 'padding-right': '0' };
149
+ }
150
+ return { 'padding-top': `${offset}px`, 'padding-bottom': '0' };
151
+ }
152
+ /** Emite o evento `closed`. Chamado pelo botão de fechar no template. */
153
+ onClose() {
154
+ this.closed.emit();
155
+ }
156
+ /** Emite o evento `next`. Chamado pelo botão "Próximo" no template. */
157
+ onNext() {
158
+ this.next.emit();
159
+ }
160
+ /** Emite o evento `previous`. Chamado pelo botão "Voltar" no template. */
161
+ onPrevious() {
162
+ this.previous.emit();
163
+ }
164
+ /** Emite o evento `understand`. Chamado pelo botão "Entendido" no template. */
165
+ onUnderstand() {
166
+ this.understand.emit();
167
+ }
168
+ /** Alterna o estado de `isDoNotShowAgainChecked`. */
169
+ toggleDoNotShowAgain() {
170
+ this.isDoNotShowAgainChecked.update((v) => !v);
171
+ }
172
+ getOppositeDirection(direction) {
173
+ switch (direction) {
174
+ case 'top':
175
+ return 'bottom';
176
+ case 'bottom':
177
+ return 'top';
178
+ case 'left':
179
+ return 'right';
180
+ case 'right':
181
+ return 'left';
182
+ default:
183
+ return direction;
184
+ }
185
+ }
186
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
187
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpotlightComponent, isStandalone: true, selector: "s-spotlight", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, currentStep: { classPropertyName: "currentStep", publicName: "currentStep", isSignal: true, isRequired: false, transformFunction: null }, totalSteps: { classPropertyName: "totalSteps", publicName: "totalSteps", isSignal: true, isRequired: false, transformFunction: null }, showDoNotShowAgain: { classPropertyName: "showDoNotShowAgain", publicName: "showDoNotShowAgain", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, arrowOffsetPx: { classPropertyName: "arrowOffsetPx", publicName: "arrowOffsetPx", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", next: "next", previous: "previous", understand: "understand" }, ngImport: i0, template: "<div\n [attr.role]=\"totalSteps() > 1 ? 'dialog' : 'tooltip'\"\n [attr.aria-modal]=\"totalSteps() > 1 ? 'true' : null\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"descId\"\n class=\"flex max-w-[342px]\"\n [ngClass]=\"isArrowLeft || isArrowRight ? 'flex-row' : 'flex-col'\"\n>\n @if (isArrowTop) {\n <ng-container *ngTemplateOutlet=\"arrowTopTemplate\"></ng-container>\n }\n\n @if (isArrowLeft) {\n <ng-container *ngTemplateOutlet=\"arrowLeftTemplate\"></ng-container>\n }\n\n <div\n class=\"relative flex w-full flex-col overflow-hidden rounded-[4px] bg-grayscale-0\"\n style=\"\n box-shadow:\n 0 3px 5px rgba(0, 0, 0, 0.2),\n 0 1px 18px rgba(0, 0, 0, 0.12),\n 0 6px 10px rgba(0, 0, 0, 0.14);\n \"\n >\n <!-- Regi\u00E3o aria-live para anuncia\u00E7\u00E3o de mudan\u00E7a de passo para leitores de tela -->\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n @if (totalSteps() > 1) {\n {{\n 'platform.angular_components.step_progress'\n | translate: { current: currentStep(), total: totalSteps() }\n }}\n }\n </span>\n <div class=\"flex h-[40px] w-full items-center justify-between p-[12px]\">\n <div class=\"flex min-w-0 flex-1 items-center gap-[8px]\">\n <h2\n [id]=\"titleId\"\n class=\"flex-1 overflow-hidden overflow-ellipsis whitespace-nowrap font-open-sans text-[14px] font-bold leading-[1.5] text-grayscale-90\"\n >\n @if (titleTemplate) {\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n } @else {\n {{ titleString }}\n }\n </h2>\n </div>\n <button\n (click)=\"onClose()\"\n class=\"flex h-[16px] w-[16px] flex-none items-center justify-center text-grayscale-90 transition-colors hover:text-grayscale-100\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n\n @if (content()) {\n <ng-container *ngTemplateOutlet=\"content()\"></ng-container>\n }\n\n <div class=\"flex w-full flex-col items-start gap-[20px] bg-grayscale-0 p-[12px]\">\n <div\n [id]=\"descId\"\n class=\"w-full whitespace-pre-wrap font-open-sans text-[14px] font-normal leading-[1.5] text-grayscale-90\"\n >\n @if (messageTemplate) {\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n } @else {\n {{ messageString }}\n }\n </div>\n\n <div class=\"flex w-full flex-wrap gap-3\">\n @if (totalSteps() > 1) {\n <p class=\"font-open-sans text-[14px] font-normal leading-[1.5] text-grayscale-90\">\n {{\n 'platform.angular_components.step_counter'\n | translate: { current: currentStep(), total: totalSteps() }\n }}\n </p>\n }\n\n @if (totalSteps() === 1 && showDoNotShowAgain()) {\n <s-checkbox\n [checked]=\"isDoNotShowAgainChecked()\"\n (checkedChange)=\"toggleDoNotShowAgain()\"\n [label]=\"'platform.angular_components.dont_show_again' | translate\"\n ></s-checkbox>\n }\n\n <div\n class=\"flex flex-wrap items-start justify-end gap-[8px]\"\n [ngClass]=\"totalSteps() > 1 ? 'w-full' : ''\"\n >\n @for (action of actions(); track action.label) {\n <s-button\n [label]=\"action.label\"\n (clicked)=\"action.handler()\"\n priority=\"default\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n }\n\n @if (totalSteps() > 1 && currentStep() > 1) {\n <s-button\n [label]=\"'platform.angular_components.back' | translate\"\n (clicked)=\"onPrevious()\"\n priority=\"default\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n }\n\n <s-button\n [label]=\"\n totalSteps() <= 1\n ? ('platform.angular_components.understood' | translate)\n : currentStep() < totalSteps()\n ? ('platform.angular_components.next' | translate)\n : ('platform.angular_components.complete' | translate)\n \"\n (clicked)=\"totalSteps() > 1 ? onNext() : onUnderstand()\"\n priority=\"secondary\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n </div>\n </div>\n </div>\n </div>\n\n @if (isArrowBottom) {\n <ng-container *ngTemplateOutlet=\"arrowBottomTemplate\"></ng-container>\n }\n\n @if (isArrowRight) {\n <ng-container *ngTemplateOutlet=\"arrowRightTemplate\"></ng-container>\n }\n</div>\n\n<!-- Arrow Templates -->\n<ng-template #arrowTopTemplate>\n <div\n class=\"relative z-10 flex h-[8px] w-full px-[12px] py-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowBottomTemplate>\n <div\n class=\"relative z-10 flex h-[8px] w-full px-[12px] py-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowLeftTemplate>\n <div\n class=\"relative z-10 flex w-[8px] flex-col items-center self-stretch px-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowRightTemplate>\n <div\n class=\"relative z-10 flex w-[8px] flex-col items-center self-stretch px-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i2.ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor", "menuAriaLabel"], outputs: ["clicked"] }, { kind: "component", type: CheckboxComponent, selector: "s-checkbox", inputs: ["disabled", "checked", "indeterminate", "label", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "checkedChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
188
+ }
189
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpotlightComponent, decorators: [{
190
+ type: Component,
191
+ args: [{ selector: 's-spotlight', standalone: true, imports: [CommonModule, ButtonModule, CheckboxComponent, TranslateModule], template: "<div\n [attr.role]=\"totalSteps() > 1 ? 'dialog' : 'tooltip'\"\n [attr.aria-modal]=\"totalSteps() > 1 ? 'true' : null\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-describedby]=\"descId\"\n class=\"flex max-w-[342px]\"\n [ngClass]=\"isArrowLeft || isArrowRight ? 'flex-row' : 'flex-col'\"\n>\n @if (isArrowTop) {\n <ng-container *ngTemplateOutlet=\"arrowTopTemplate\"></ng-container>\n }\n\n @if (isArrowLeft) {\n <ng-container *ngTemplateOutlet=\"arrowLeftTemplate\"></ng-container>\n }\n\n <div\n class=\"relative flex w-full flex-col overflow-hidden rounded-[4px] bg-grayscale-0\"\n style=\"\n box-shadow:\n 0 3px 5px rgba(0, 0, 0, 0.2),\n 0 1px 18px rgba(0, 0, 0, 0.12),\n 0 6px 10px rgba(0, 0, 0, 0.14);\n \"\n >\n <!-- Regi\u00E3o aria-live para anuncia\u00E7\u00E3o de mudan\u00E7a de passo para leitores de tela -->\n <span\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n @if (totalSteps() > 1) {\n {{\n 'platform.angular_components.step_progress'\n | translate: { current: currentStep(), total: totalSteps() }\n }}\n }\n </span>\n <div class=\"flex h-[40px] w-full items-center justify-between p-[12px]\">\n <div class=\"flex min-w-0 flex-1 items-center gap-[8px]\">\n <h2\n [id]=\"titleId\"\n class=\"flex-1 overflow-hidden overflow-ellipsis whitespace-nowrap font-open-sans text-[14px] font-bold leading-[1.5] text-grayscale-90\"\n >\n @if (titleTemplate) {\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n } @else {\n {{ titleString }}\n }\n </h2>\n </div>\n <button\n (click)=\"onClose()\"\n class=\"flex h-[16px] w-[16px] flex-none items-center justify-center text-grayscale-90 transition-colors hover:text-grayscale-100\"\n [attr.aria-label]=\"'platform.angular_components.close' | translate\"\n >\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n\n @if (content()) {\n <ng-container *ngTemplateOutlet=\"content()\"></ng-container>\n }\n\n <div class=\"flex w-full flex-col items-start gap-[20px] bg-grayscale-0 p-[12px]\">\n <div\n [id]=\"descId\"\n class=\"w-full whitespace-pre-wrap font-open-sans text-[14px] font-normal leading-[1.5] text-grayscale-90\"\n >\n @if (messageTemplate) {\n <ng-container *ngTemplateOutlet=\"messageTemplate\"></ng-container>\n } @else {\n {{ messageString }}\n }\n </div>\n\n <div class=\"flex w-full flex-wrap gap-3\">\n @if (totalSteps() > 1) {\n <p class=\"font-open-sans text-[14px] font-normal leading-[1.5] text-grayscale-90\">\n {{\n 'platform.angular_components.step_counter'\n | translate: { current: currentStep(), total: totalSteps() }\n }}\n </p>\n }\n\n @if (totalSteps() === 1 && showDoNotShowAgain()) {\n <s-checkbox\n [checked]=\"isDoNotShowAgainChecked()\"\n (checkedChange)=\"toggleDoNotShowAgain()\"\n [label]=\"'platform.angular_components.dont_show_again' | translate\"\n ></s-checkbox>\n }\n\n <div\n class=\"flex flex-wrap items-start justify-end gap-[8px]\"\n [ngClass]=\"totalSteps() > 1 ? 'w-full' : ''\"\n >\n @for (action of actions(); track action.label) {\n <s-button\n [label]=\"action.label\"\n (clicked)=\"action.handler()\"\n priority=\"default\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n }\n\n @if (totalSteps() > 1 && currentStep() > 1) {\n <s-button\n [label]=\"'platform.angular_components.back' | translate\"\n (clicked)=\"onPrevious()\"\n priority=\"default\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n }\n\n <s-button\n [label]=\"\n totalSteps() <= 1\n ? ('platform.angular_components.understood' | translate)\n : currentStep() < totalSteps()\n ? ('platform.angular_components.next' | translate)\n : ('platform.angular_components.complete' | translate)\n \"\n (clicked)=\"totalSteps() > 1 ? onNext() : onUnderstand()\"\n priority=\"secondary\"\n size=\"small\"\n class=\"flex-none\"\n ></s-button>\n </div>\n </div>\n </div>\n </div>\n\n @if (isArrowBottom) {\n <ng-container *ngTemplateOutlet=\"arrowBottomTemplate\"></ng-container>\n }\n\n @if (isArrowRight) {\n <ng-container *ngTemplateOutlet=\"arrowRightTemplate\"></ng-container>\n }\n</div>\n\n<!-- Arrow Templates -->\n<ng-template #arrowTopTemplate>\n <div\n class=\"relative z-10 flex h-[8px] w-full px-[12px] py-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowBottomTemplate>\n <div\n class=\"relative z-10 flex h-[8px] w-full px-[12px] py-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowLeftTemplate>\n <div\n class=\"relative z-10 flex w-[8px] flex-col items-center self-stretch px-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n<ng-template #arrowRightTemplate>\n <div\n class=\"relative z-10 flex w-[8px] flex-col items-center self-stretch px-0\"\n [ngClass]=\"arrowAlignmentClass\"\n [ngStyle]=\"arrowPaddingStyle\"\n >\n <svg\n width=\"16\"\n height=\"8\"\n viewBox=\"0 0 16 8\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"text-grayscale-0\"\n [ngClass]=\"arrowRotation\"\n >\n <path\n d=\"M0 8L8 0L16 8\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</ng-template>\n\n" }]
192
+ }] });
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL2xpYi9zcG90bGlnaHQvc3BvdGxpZ2h0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL2xpYi9zcG90bGlnaHQvc3BvdGxpZ2h0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7OztBQUtoRjs7Ozs7Ozs7R0FRRztBQU9ILE1BQU0sT0FBTyxrQkFBa0I7SUFDM0IsZ0ZBQWdGO0lBQ2hGLEtBQUssR0FBRyxLQUFLLENBQTRCLEVBQUUsQ0FBQyxDQUFDO0lBRTdDLDRGQUE0RjtJQUM1RixPQUFPLEdBQUcsS0FBSyxFQUE2QixDQUFDO0lBRTdDLG1GQUFtRjtJQUNuRixPQUFPLEdBQUcsS0FBSyxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUUvQywrRUFBK0U7SUFDL0UsUUFBUSxHQUFHLEtBQUssQ0FBb0IsZUFBZSxDQUFDLENBQUM7SUFFckQsc0VBQXNFO0lBQ3RFLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkIsdUZBQXVGO0lBQ3ZGLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFD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QUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBaUI7UUFDMUMsUUFBUSxTQUFTLEVBQUUsQ0FBQztZQUNoQixLQUFLLEtBQUs7Z0JBQ04sT0FBTyxRQUFRLENBQUM7WUFDcEIsS0FBSyxRQUFRO2dCQUNULE9BQU8sS0FBSyxDQUFDO1lBQ2pCLEtBQUssTUFBTTtnQkFDUCxPQUFPLE9BQU8sQ0FBQztZQUNuQixLQUFLLE9BQU87Z0JBQ1IsT0FBTyxNQUFNLENBQUM7WUFDbEI7Z0JBQ0ksT0FBTyxTQUFTLENBQUM7UUFDekIsQ0FBQztJQUNMLENBQUM7d0dBL01RLGtCQUFrQjs0RkFBbEIsa0JBQWtCLG0yQ0N6Qi9CLHk1UUE4T0EsMkNEdk5jLFlBQVksd1hBQUUsWUFBWSx3WEFBRSxpQkFBaUIsOExBQUUsZUFBZTs7NEZBRS9ELGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDSSxhQUFhLGNBRVgsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94JztcblxuaW1wb3J0IHsgU3BvdGxpZ2h0UG9zaXRpb24gfSBmcm9tICcuL3R5cGVzL3Nwb3RsaWdodC1wb3NpdGlvbic7XG5pbXBvcnQgeyBTcG90bGlnaHRTdGVwQWN0aW9uIH0gZnJvbSAnLi90eXBlcy9zcG90bGlnaHQtc3RlcCc7XG5cbi8qKlxuICogQ29tcG9uZW50ZSBkZSBwb3BvdmVyIGRvIFNwb3RsaWdodC5cbiAqXG4gKiBFeGliZSBvIGNhcmQgZGUgZGVzdGFxdWUgY29tIHTDrXR1bG8sIG1lbnNhZ2VtLCBzZXRhIGRpcmVjaW9uYWwsIGNvbnRhZG9yIGRlIHBhc3NvcyxcbiAqIGJvdMO1ZXMgZGUgbmF2ZWdhw6fDo28gZSwgZW0gbW9kbyBzaW1wbGVzIChwYXNzbyDDum5pY28pLCBvIGNoZWNrYm94IFwibsOjbyBtb3N0cmFyIG5vdmFtZW50ZVwiLlxuICpcbiAqIEVzdGUgY29tcG9uZW50ZSDDqSBpbnN0YW5jaWFkbyBwcm9ncmFtYXRpY2FtZW50ZSBwZWxvIGBTcG90bGlnaHRPdmVybGF5Q29tcG9uZW50YFxuICogdmlhIENESyBPdmVybGF5LiBOb3JtYWxtZW50ZSBuw6NvIMOpIHVzYWRvIGRpcmV0YW1lbnRlIG5vIHRlbXBsYXRlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Mtc3BvdGxpZ2h0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3BvdGxpZ2h0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgQ2hlY2tib3hDb21wb25lbnQsIFRyYW5zbGF0ZU1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIFNwb3RsaWdodENvbXBvbmVudCB7XG4gICAgLyoqIFTDrXR1bG8gZG8gcG9wb3Zlci4gQWNlaXRhIHN0cmluZyBvdSBgVGVtcGxhdGVSZWZgIHBhcmEgY29udGXDumRvIGRpbsOibWljby4gKi9cbiAgICB0aXRsZSA9IGlucHV0PHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT4+KCcnKTtcblxuICAgIC8qKiBNZW5zYWdlbSBwcmluY2lwYWwgZG8gcG9wb3Zlci4gQWNlaXRhIHN0cmluZyBvdSBgVGVtcGxhdGVSZWZgIHBhcmEgY29udGXDumRvIGRpbsOibWljby4gKi9cbiAgICBtZXNzYWdlID0gaW5wdXQ8c3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICAgIC8qKiBUZW1wbGF0ZSBvcGNpb25hbCBwYXJhIMOhcmVhIGRlIG3DrWRpYS9jb250ZcO6ZG8gY3VzdG9taXphZG8gYWNpbWEgZGEgbWVuc2FnZW0uICovXG4gICAgY29udGVudCA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4gfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBQb3Npw6fDo28gZG8gcG9wb3ZlciBlbSByZWxhw6fDo28gYW8gZWxlbWVudG8gYWx2by4gQGRlZmF1bHQgJ2JvdHRvbS1jZW50ZXInICovXG4gICAgcG9zaXRpb24gPSBpbnB1dDxTcG90bGlnaHRQb3NpdGlvbj4oJ2JvdHRvbS1jZW50ZXInKTtcblxuICAgIC8qKiBOw7ptZXJvIGRvIHBhc3NvIGF0dWFsICgxLWJhc2VkKSBleGliaWRvIG5vIGNvbnRhZG9yLiBAZGVmYXVsdCAxICovXG4gICAgY3VycmVudFN0ZXAgPSBpbnB1dCgxKTtcblxuICAgIC8qKiBUb3RhbCBkZSBwYXNzb3MgZG8gdG91ciwgdXNhZG8gbm8gY29udGFkb3IgZSBwYXJhIGNvbnRyb2xlIGRlIGJvdMO1ZXMuIEBkZWZhdWx0IDEgKi9cbiAgICB0b3RhbFN0ZXBzID0gaW5wdXQoMSk7XG5cbiAgICAvKipcbiAgICAgKiBFeGliZSBvIGNoZWNrYm94IFwibsOjbyBtb3N0cmFyIG5vdmFtZW50ZVwiIChhcGVuYXMgZW0gcGFzc28gw7puaWNvKS5cbiAgICAgKiBQYXNzZSBgZmFsc2VgIHBhcmEgc3VwcmltaXIgbyBjaGVja2JveCBxdWFuZG8gbsOjbyBmb3IgbmVjZXNzw6FyaW8gcGVyc2lzdGlyIGEgcHJlZmVyw6puY2lhLlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBzaG93RG9Ob3RTaG93QWdhaW4gPSBpbnB1dCh0cnVlKTtcblxuICAgIC8qKiBMaXN0YSBkZSBib3TDtWVzIGRlIGHDp8OjbyBhZGljaW9uYWlzIGV4aWJpZG9zIG5hIMOhcmVhIGRlIHJvZGFww6kuICovXG4gICAgYWN0aW9ucyA9IGlucHV0PFNwb3RsaWdodFN0ZXBBY3Rpb25bXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICogRGVzbG9jYW1lbnRvIGVtIHBpeGVscyBwYXJhIHBvc2ljaW9uYXIgYSBzZXRhIG1hbnVhbG1lbnRlIG5vIGVpeG8gcHJpbmNpcGFsLlxuICAgICAqIFF1YW5kbyBgbnVsbGAsIG8gYWxpbmhhbWVudG8gw6kgY29udHJvbGFkbyBwZWxhIGBwb3NpdGlvbmAuIEBkZWZhdWx0IG51bGxcbiAgICAgKi9cbiAgICBhcnJvd09mZnNldFB4ID0gaW5wdXQ8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIGRlIGZlY2hhciAoWCkuICovXG4gICAgY2xvc2VkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgZW0gXCJQcsOzeGltb1wiLiAqL1xuICAgIG5leHQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIGFvIGNsaWNhciBlbSBcIlZvbHRhclwiLiAqL1xuICAgIHByZXZpb3VzID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgZW0gXCJFbnRlbmRpZG9cIiAobW9kbyBzaW1wbGVzLCBwYXNzbyDDum5pY28pLiAqL1xuICAgIHVuZGVyc3RhbmQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIC8qKiBFc3RhZG8gYXR1YWwgZG8gY2hlY2tib3ggXCJuw6NvIG1vc3RyYXIgbm92YW1lbnRlXCIuICovXG4gICAgaXNEb05vdFNob3dBZ2FpbkNoZWNrZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VDb3VudCA9IDA7XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGluc3RhbmNlSWQgPSBgc3BvdGxpZ2h0LSR7KytTcG90bGlnaHRDb21wb25lbnQuaW5zdGFuY2VDb3VudH1gO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IHRpdGxlSWQgPSBgJHt0aGlzLmluc3RhbmNlSWR9LXRpdGxlYDtcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBkZXNjSWQgPSBgJHt0aGlzLmluc3RhbmNlSWR9LWRlc2NgO1xuXG4gICAgZ2V0IHRpdGxlVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xuICAgICAgICBjb25zdCB2ID0gdGhpcy50aXRsZSgpO1xuICAgICAgICByZXR1cm4gdiBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gdiA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IHRpdGxlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnRpdGxlKCk7XG4gICAgICAgIHJldHVybiB2IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgPyAnJyA6ICh2ID8/ICcnKTtcbiAgICB9XG5cbiAgICBnZXQgbWVzc2FnZVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMubWVzc2FnZSgpO1xuICAgICAgICByZXR1cm4gdiBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gdiA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IG1lc3NhZ2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdiA9IHRoaXMubWVzc2FnZSgpO1xuICAgICAgICByZXR1cm4gdiBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gJycgOiAodiA/PyAnJyk7XG4gICAgfVxuXG4gICAgZ2V0IGFycm93UG9zaXRpb24oKTogU3BvdGxpZ2h0UG9zaXRpb24ge1xuICAgICAgICBjb25zdCBbZGlyZWN0aW9uXSA9IHRoaXMucG9zaXRpb24oKS5zcGxpdCgnLScpIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gICAgICAgIGNvbnN0IFssIGFsaWdubWVudF0gPSB0aGlzLnBvc2l0aW9uKCkuc3BsaXQoJy0nKSBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICAgICAgICBjb25zdCBvcHBvc2l0ZURpcmVjdGlvbiA9IHRoaXMuZ2V0T3Bwb3NpdGVEaXJlY3Rpb24oZGlyZWN0aW9uKTtcblxuICAgICAgICByZXR1cm4gYCR7b3Bwb3NpdGVEaXJlY3Rpb259LSR7YWxpZ25tZW50fWAgYXMgU3BvdGxpZ2h0UG9zaXRpb247XG4gICAgfVxuXG4gICAgZ2V0IGlzQXJyb3dUb3AoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFycm93UG9zaXRpb24uc3RhcnRzV2l0aCgndG9wLScpO1xuICAgIH1cblxuICAgIGdldCBpc0Fycm93Qm90dG9tKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJvd1Bvc2l0aW9uLnN0YXJ0c1dpdGgoJ2JvdHRvbS0nKTtcbiAgICB9XG5cbiAgICBnZXQgaXNBcnJvd0xlZnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFycm93UG9zaXRpb24uc3RhcnRzV2l0aCgnbGVmdC0nKTtcbiAgICB9XG5cbiAgICBnZXQgaXNBcnJvd1JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJvd1Bvc2l0aW9uLnN0YXJ0c1dpdGgoJ3JpZ2h0LScpO1xuICAgIH1cblxuICAgIGdldCBhcnJvd1JvdGF0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuYXJyb3dQb3NpdGlvbi5zcGxpdCgnLScpWzBdO1xuXG4gICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyb3RhdGUtMTgwJztcbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnLXJvdGF0ZS05MCc7XG4gICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyb3RhdGUtOTAnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgYXJyb3dBbGlnbm1lbnRDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmFycm93T2Zmc2V0UHgoKTtcblxuICAgICAgICBpZiAob2Zmc2V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2p1c3RpZnktc3RhcnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxpZ25tZW50ID0gdGhpcy5hcnJvd1Bvc2l0aW9uLnNwbGl0KCctJylbMV07XG5cbiAgICAgICAgaWYgKHRoaXMuaXNBcnJvd1RvcCB8fCB0aGlzLmlzQXJyb3dCb3R0b20pIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWxpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2p1c3RpZnktc3RhcnQnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnanVzdGlmeS1jZW50ZXInO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnanVzdGlmeS1lbmQnO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWxpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2l0ZW1zLXN0YXJ0IGp1c3RpZnktc3RhcnQnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJztcbiAgICAgICAgICAgICAgICBjYXNlICdlbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2l0ZW1zLWVuZCBqdXN0aWZ5LWVuZCc7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGFycm93UGFkZGluZ1N0eWxlKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmFycm93T2Zmc2V0UHgoKTtcbiAgICAgICAgaWYgKG9mZnNldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNBcnJvd1RvcCB8fCB0aGlzLmlzQXJyb3dCb3R0b20pIHtcbiAgICAgICAgICAgIHJldHVybiB7ICdwYWRkaW5nLWxlZnQnOiBgJHtvZmZzZXR9cHhgLCAncGFkZGluZy1yaWdodCc6ICcwJyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgJ3BhZGRpbmctdG9wJzogYCR7b2Zmc2V0fXB4YCwgJ3BhZGRpbmctYm90dG9tJzogJzAnIH07XG4gICAgfVxuXG4gICAgLyoqIEVtaXRlIG8gZXZlbnRvIGBjbG9zZWRgLiBDaGFtYWRvIHBlbG8gYm90w6NvIGRlIGZlY2hhciBubyB0ZW1wbGF0ZS4gKi9cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqIEVtaXRlIG8gZXZlbnRvIGBuZXh0YC4gQ2hhbWFkbyBwZWxvIGJvdMOjbyBcIlByw7N4aW1vXCIgbm8gdGVtcGxhdGUuICovXG4gICAgb25OZXh0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5leHQuZW1pdCgpO1xuICAgIH1cblxuICAgIC8qKiBFbWl0ZSBvIGV2ZW50byBgcHJldmlvdXNgLiBDaGFtYWRvIHBlbG8gYm90w6NvIFwiVm9sdGFyXCIgbm8gdGVtcGxhdGUuICovXG4gICAgb25QcmV2aW91cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aW91cy5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqIEVtaXRlIG8gZXZlbnRvIGB1bmRlcnN0YW5kYC4gQ2hhbWFkbyBwZWxvIGJvdMOjbyBcIkVudGVuZGlkb1wiIG5vIHRlbXBsYXRlLiAqL1xuICAgIG9uVW5kZXJzdGFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51bmRlcnN0YW5kLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKiogQWx0ZXJuYSBvIGVzdGFkbyBkZSBgaXNEb05vdFNob3dBZ2FpbkNoZWNrZWRgLiAqL1xuICAgIHRvZ2dsZURvTm90U2hvd0FnYWluKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRG9Ob3RTaG93QWdhaW5DaGVja2VkLnVwZGF0ZSgodikgPT4gIXYpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3Bwb3NpdGVEaXJlY3Rpb24oZGlyZWN0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgIHJldHVybiAndG9wJztcbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiIsIjxkaXZcbiAgICBbYXR0ci5yb2xlXT1cInRvdGFsU3RlcHMoKSA+IDEgPyAnZGlhbG9nJyA6ICd0b29sdGlwJ1wiXG4gICAgW2F0dHIuYXJpYS1tb2RhbF09XCJ0b3RhbFN0ZXBzKCkgPiAxID8gJ3RydWUnIDogbnVsbFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInRpdGxlSWRcIlxuICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZGVzY0lkXCJcbiAgICBjbGFzcz1cImZsZXggbWF4LXctWzM0MnB4XVwiXG4gICAgW25nQ2xhc3NdPVwiaXNBcnJvd0xlZnQgfHwgaXNBcnJvd1JpZ2h0ID8gJ2ZsZXgtcm93JyA6ICdmbGV4LWNvbCdcIlxuPlxuICAgIEBpZiAoaXNBcnJvd1RvcCkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXJyb3dUb3BUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIH1cblxuICAgIEBpZiAoaXNBcnJvd0xlZnQpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFycm93TGVmdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuXG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggdy1mdWxsIGZsZXgtY29sIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVs0cHhdIGJnLWdyYXlzY2FsZS0wXCJcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgIGJveC1zaGFkb3c6XG4gICAgICAgICAgICAgICAgMCAzcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSxcbiAgICAgICAgICAgICAgICAwIDFweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksXG4gICAgICAgICAgICAgICAgMCA2cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMTQpO1xuICAgICAgICBcIlxuICAgID5cbiAgICAgICAgPCEtLSBSZWdpw6NvIGFyaWEtbGl2ZSBwYXJhIGFudW5jaWHDp8OjbyBkZSBtdWRhbsOnYSBkZSBwYXNzbyBwYXJhIGxlaXRvcmVzIGRlIHRlbGEgLS0+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInNyLW9ubHlcIlxuICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBpZiAodG90YWxTdGVwcygpID4gMSkge1xuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuc3RlcF9wcm9ncmVzcydcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IGN1cnJlbnQ6IGN1cnJlbnRTdGVwKCksIHRvdGFsOiB0b3RhbFN0ZXBzKCkgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1bNDBweF0gdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcC1bMTJweF1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1pbi13LTAgZmxleC0xIGl0ZW1zLWNlbnRlciBnYXAtWzhweF1cIj5cbiAgICAgICAgICAgICAgICA8aDJcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cInRpdGxlSWRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXgtMSBvdmVyZmxvdy1oaWRkZW4gb3ZlcmZsb3ctZWxsaXBzaXMgd2hpdGVzcGFjZS1ub3dyYXAgZm9udC1vcGVuLXNhbnMgdGV4dC1bMTRweF0gZm9udC1ib2xkIGxlYWRpbmctWzEuNV0gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmICh0aXRsZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGl0bGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRpdGxlU3RyaW5nIH19XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtWzE2cHhdIHctWzE2cHhdIGZsZXgtbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6dGV4dC1ncmF5c2NhbGUtMTAwXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuY2xvc2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKGNvbnRlbnQoKSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnQoKVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLXN0YXJ0IGdhcC1bMjBweF0gYmctZ3JheXNjYWxlLTAgcC1bMTJweF1cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbaWRdPVwiZGVzY0lkXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCB3aGl0ZXNwYWNlLXByZS13cmFwIGZvbnQtb3Blbi1zYW5zIHRleHQtWzE0cHhdIGZvbnQtbm9ybWFsIGxlYWRpbmctWzEuNV0gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAobWVzc2FnZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZXNzYWdlVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAge3sgbWVzc2FnZVN0cmluZyB9fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgQGlmICh0b3RhbFN0ZXBzKCkgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1vcGVuLXNhbnMgdGV4dC1bMTRweF0gZm9udC1ub3JtYWwgbGVhZGluZy1bMS41XSB0ZXh0LWdyYXlzY2FsZS05MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnN0ZXBfY291bnRlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgY3VycmVudDogY3VycmVudFN0ZXAoKSwgdG90YWw6IHRvdGFsU3RlcHMoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmICh0b3RhbFN0ZXBzKCkgPT09IDEgJiYgc2hvd0RvTm90U2hvd0FnYWluKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzRG9Ob3RTaG93QWdhaW5DaGVja2VkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlRG9Ob3RTaG93QWdhaW4oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kb250X3Nob3dfYWdhaW4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtc3RhcnQganVzdGlmeS1lbmQgZ2FwLVs4cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidG90YWxTdGVwcygpID4gMSA/ICd3LWZ1bGwnIDogJydcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoYWN0aW9uIG9mIGFjdGlvbnMoKTsgdHJhY2sgYWN0aW9uLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYWN0aW9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJhY3Rpb24uaGFuZGxlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eT1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcy1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKHRvdGFsU3RlcHMoKSA+IDEgJiYgY3VycmVudFN0ZXAoKSA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmJhY2snIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvblByZXZpb3VzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXgtbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RlcHMoKSA8PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMudW5kZXJzdG9vZCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudFN0ZXAoKSA8IHRvdGFsU3RlcHMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMubmV4dCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5jb21wbGV0ZScgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG90YWxTdGVwcygpID4gMSA/IG9uTmV4dCgpIDogb25VbmRlcnN0YW5kKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGlzQXJyb3dCb3R0b20pIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFycm93Qm90dG9tVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG5cbiAgICBAaWYgKGlzQXJyb3dSaWdodCkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXJyb3dSaWdodFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuPC9kaXY+XG5cbjwhLS0gQXJyb3cgVGVtcGxhdGVzIC0tPlxuPG5nLXRlbXBsYXRlICNhcnJvd1RvcFRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwIGZsZXggaC1bOHB4XSB3LWZ1bGwgcHgtWzEycHhdIHB5LTBcIlxuICAgICAgICBbbmdDbGFzc109XCJhcnJvd0FsaWdubWVudENsYXNzXCJcbiAgICAgICAgW25nU3R5bGVdPVwiYXJyb3dQYWRkaW5nU3R5bGVcIlxuICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICBoZWlnaHQ9XCI4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgOFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ncmF5c2NhbGUtMFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJhcnJvd1JvdGF0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTAgOEw4IDBMMTYgOFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXJyb3dCb3R0b21UZW1wbGF0ZT5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicmVsYXRpdmUgei0xMCBmbGV4IGgtWzhweF0gdy1mdWxsIHB4LVsxMnB4XSBweS0wXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiYXJyb3dBbGlnbm1lbnRDbGFzc1wiXG4gICAgICAgIFtuZ1N0eWxlXT1cImFycm93UGFkZGluZ1N0eWxlXCJcbiAgICA+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPVwiMTZcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiOFwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDhcIlxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtZ3JheXNjYWxlLTBcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiYXJyb3dSb3RhdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wIDhMOCAwTDE2IDhcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Fycm93TGVmdFRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwIGZsZXggdy1bOHB4XSBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgc2VsZi1zdHJldGNoIHB4LTBcIlxuICAgICAgICBbbmdDbGFzc109XCJhcnJvd0FsaWdubWVudENsYXNzXCJcbiAgICAgICAgW25nU3R5bGVdPVwiYXJyb3dQYWRkaW5nU3R5bGVcIlxuICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICBoZWlnaHQ9XCI4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgOFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ncmF5c2NhbGUtMFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJhcnJvd1JvdGF0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTAgOEw4IDBMMTYgOFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXJyb3dSaWdodFRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB6LTEwIGZsZXggdy1bOHB4XSBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgc2VsZi1zdHJldGNoIHB4LTBcIlxuICAgICAgICBbbmdDbGFzc109XCJhcnJvd0FsaWdubWVudENsYXNzXCJcbiAgICAgICAgW25nU3R5bGVdPVwiYXJyb3dQYWRkaW5nU3R5bGVcIlxuICAgID5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICBoZWlnaHQ9XCI4XCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgOFwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ncmF5c2NhbGUtMFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJhcnJvd1JvdGF0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTAgOEw4IDBMMTYgOFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXBvc2l0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Nwb3RsaWdodC9zcmMvbGliL3Nwb3RsaWdodC90eXBlcy9zcG90bGlnaHQtcG9zaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFNwb3RsaWdodFBvc2l0aW9uID1cbiAgfCAndG9wLXN0YXJ0J1xuICB8ICd0b3AtY2VudGVyJ1xuICB8ICd0b3AtZW5kJ1xuICB8ICdyaWdodC1zdGFydCdcbiAgfCAncmlnaHQtY2VudGVyJ1xuICB8ICdyaWdodC1lbmQnXG4gIHwgJ2JvdHRvbS1zdGFydCdcbiAgfCAnYm90dG9tLWNlbnRlcidcbiAgfCAnYm90dG9tLWVuZCdcbiAgfCAnbGVmdC1zdGFydCdcbiAgfCAnbGVmdC1jZW50ZXInXG4gIHwgJ2xlZnQtZW5kJztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3BvdGxpZ2h0L3NyYy9saWIvc3BvdGxpZ2h0L3R5cGVzL3Nwb3RsaWdodC1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTcG90bGlnaHRQb3NpdGlvbiB9IGZyb20gJy4vc3BvdGxpZ2h0LXBvc2l0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBTcG90bGlnaHRTdGVwQWN0aW9uIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGhhbmRsZXI6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BvdGxpZ2h0U3RlcCB7XG4gICAgc3RlcElkOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gICAgbWVzc2FnZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgICBwb3NpdGlvbj86IFNwb3RsaWdodFBvc2l0aW9uO1xuICAgIGNvbnRlbnQ/OiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbDtcbiAgICBhY3Rpb25zPzogU3BvdGxpZ2h0U3RlcEFjdGlvbltdO1xuICAgIHNob3dCYWNrZHJvcD86IGJvb2xlYW47XG4gICAgZGlzbWlzc2libGU/OiBib29sZWFuO1xuICAgIGJlZm9yZU5leHQ/OiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBiZWZvcmVQcmV2aW91cz86ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgdHlwZSBTcG90bGlnaHRDb25maWcgPSBPbWl0PFNwb3RsaWdodFN0ZXAsICdzdGVwSWQnIHwgJ2JlZm9yZU5leHQnIHwgJ2JlZm9yZVByZXZpb3VzJz4gJiB7XG4gICAgc2hvd0RvTm90U2hvd0FnYWluPzogYm9vbGVhbjtcbn07XG5cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BvdGxpZ2h0LXN0b3AtZXZlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3BvdGxpZ2h0L3NyYy9saWIvc3BvdGxpZ2h0L3R5cGVzL3Nwb3RsaWdodC1zdG9wLWV2ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBTcG90bGlnaHRTdG9wUmVhc29uID0gJ2NvbXBsZXRlZCcgfCAnaW50ZXJydXB0ZWQnIHwgJ2Rpc21pc3NlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BvdGxpZ2h0U3RvcEV2ZW50IHtcbiAgICByZWFzb246IFNwb3RsaWdodFN0b3BSZWFzb247XG4gICAgZG9Ob3RTaG93QWdhaW46IGJvb2xlYW47XG4gICAgc3RlcElkOiBzdHJpbmc7XG4gICAgc3RlcEluZGV4OiBudW1iZXI7XG4gICAgdG90YWxTdGVwczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwb3RsaWdodFN0ZXBDaGFuZ2VkRXZlbnQge1xuICAgIHN0ZXBJZDogc3RyaW5nO1xuICAgIHN0ZXBJbmRleDogbnVtYmVyO1xuICAgIHRvdGFsU3RlcHM6IG51bWJlcjtcbn1cblxuIl19
@@ -0,0 +1,4 @@
1
+ export { SpotlightStepDirective } from './lib/spotlight/spotlight-step.directive';
2
+ export { SpotlightTourService } from './lib/spotlight/spotlight-tour.service';
3
+ export { SpotlightComponent } from './lib/spotlight/spotlight.component';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBTcG90bGlnaHRTdGVwRGlyZWN0aXZlIH0gZnJvbSAnLi9saWIvc3BvdGxpZ2h0L3Nwb3RsaWdodC1zdGVwLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBTcG90bGlnaHRUb3VyU2VydmljZSB9IGZyb20gJy4vbGliL3Nwb3RsaWdodC9zcG90bGlnaHQtdG91ci5zZXJ2aWNlJztcbmV4cG9ydCB7IFNwb3RsaWdodENvbXBvbmVudCB9IGZyb20gJy4vbGliL3Nwb3RsaWdodC9zcG90bGlnaHQuY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgeyBTcG90bGlnaHRQb3NpdGlvbiB9IGZyb20gJy4vbGliL3Nwb3RsaWdodC90eXBlcy9zcG90bGlnaHQtcG9zaXRpb24nO1xuZXhwb3J0IHR5cGUgeyBTcG90bGlnaHRDb25maWcsIFNwb3RsaWdodFN0ZXAsIFNwb3RsaWdodFN0ZXBBY3Rpb24gfSBmcm9tICcuL2xpYi9zcG90bGlnaHQvdHlwZXMvc3BvdGxpZ2h0LXN0ZXAnO1xuZXhwb3J0IHR5cGUge1xuICAgIFNwb3RsaWdodFN0ZXBDaGFuZ2VkRXZlbnQsXG4gICAgU3BvdGxpZ2h0U3RvcEV2ZW50LFxuICAgIFNwb3RsaWdodFN0b3BSZWFzb24sXG59IGZyb20gJy4vbGliL3Nwb3RsaWdodC90eXBlcy9zcG90bGlnaHQtc3RvcC1ldmVudCc7XG5cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuaW9yc2lzdGVtYXMtYW5ndWxhci1jb21wb25lbnRzLXNwb3RsaWdodC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zcG90bGlnaHQvc3JjL3NlbmlvcnNpc3RlbWFzLWFuZ3VsYXItY29tcG9uZW50cy1zcG90bGlnaHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==