@muraai/mnl-form 0.0.1-alpha-32ca3fa → 0.0.1-alpha-11e96eb

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 (65) hide show
  1. package/README.md +5 -5
  2. package/fesm2022/muraai-mnl-form.mjs +152 -145
  3. package/fesm2022/muraai-mnl-form.mjs.map +1 -1
  4. package/lib/{formly-lib/formly-lib.component.d.ts → mnl-form/mnl-form.component.d.ts} +3 -3
  5. package/lib/types/upload-file.d.ts +1 -1
  6. package/lib/workflow-status/ workflow-status.module.d.ts +8 -8
  7. package/lib/workflow-status/workflow-status.component.d.ts +1 -1
  8. package/package.json +4 -5
  9. package/public-api.d.ts +2 -2
  10. package/esm2022/lib/confirmation-dialog/confirmation-dialog.component.mjs +0 -34
  11. package/esm2022/lib/formly-lib/formly-lib.component.mjs +0 -199
  12. package/esm2022/lib/formly-lib/formly-standalone.module.mjs +0 -155
  13. package/esm2022/lib/models/custom-form-field.model.mjs +0 -2
  14. package/esm2022/lib/models/workflow-status.model.mjs +0 -2
  15. package/esm2022/lib/services/graphql.service.mjs +0 -30
  16. package/esm2022/lib/services/scoring.service.mjs +0 -103
  17. package/esm2022/lib/types/action-button-renderer.component.mjs +0 -59
  18. package/esm2022/lib/types/autocomplete-type.component.mjs +0 -68
  19. package/esm2022/lib/types/button.type.mjs +0 -72
  20. package/esm2022/lib/types/comments.type.mjs +0 -102
  21. package/esm2022/lib/types/country-code-input.type.mjs +0 -181
  22. package/esm2022/lib/types/custom-date.type.mjs +0 -20
  23. package/esm2022/lib/types/custom-input.component.mjs +0 -62
  24. package/esm2022/lib/types/date-format.type.mjs +0 -196
  25. package/esm2022/lib/types/expansion-panel.types.mjs +0 -85
  26. package/esm2022/lib/types/formly-field-panel.type.mjs +0 -70
  27. package/esm2022/lib/types/grid-actionable.type.mjs +0 -197
  28. package/esm2022/lib/types/grid-formly-cell.component.mjs +0 -42
  29. package/esm2022/lib/types/grid.type.mjs +0 -125
  30. package/esm2022/lib/types/input.type.mjs +0 -43
  31. package/esm2022/lib/types/mu-helper-text.type.mjs +0 -331
  32. package/esm2022/lib/types/multi-select-autocomplete.mjs +0 -139
  33. package/esm2022/lib/types/multi-select-checkbox.component.mjs +0 -247
  34. package/esm2022/lib/types/radio.type.mjs +0 -71
  35. package/esm2022/lib/types/scrollable-tabs.types.mjs +0 -220
  36. package/esm2022/lib/types/select-api-auto-complete.component.mjs +0 -111
  37. package/esm2022/lib/types/select-autocomplete-redefined.component.mjs +0 -142
  38. package/esm2022/lib/types/select-autocomplete.type.mjs +0 -254
  39. package/esm2022/lib/types/stepper.type.mjs +0 -268
  40. package/esm2022/lib/types/table.types.mjs +0 -79
  41. package/esm2022/lib/types/tabs.types.mjs +0 -293
  42. package/esm2022/lib/types/tabular-form-dialog.component.mjs +0 -331
  43. package/esm2022/lib/types/tabular-form.type.mjs +0 -641
  44. package/esm2022/lib/types/upload-file.mjs +0 -524
  45. package/esm2022/lib/types/view-file-dialog.component.mjs +0 -90
  46. package/esm2022/lib/utils/formly.utils.mjs +0 -105
  47. package/esm2022/lib/validators/custom-email-validator.mjs +0 -18
  48. package/esm2022/lib/validators/ein-validators.mjs +0 -11
  49. package/esm2022/lib/validators/gst-validator.mjs +0 -11
  50. package/esm2022/lib/validators/normal-email-validator.mjs +0 -17
  51. package/esm2022/lib/validators/npi-validator.mjs +0 -11
  52. package/esm2022/lib/validators/pan-validator.mjs +0 -11
  53. package/esm2022/lib/validators/phone-number-validator.mjs +0 -22
  54. package/esm2022/lib/validators/select-validator.mjs +0 -7
  55. package/esm2022/lib/validators/tinSsn-validator.mjs +0 -12
  56. package/esm2022/lib/workflow-status/ workflow-status.module.mjs +0 -52
  57. package/esm2022/lib/workflow-status/workflow-status.component.mjs +0 -70
  58. package/esm2022/lib/wrappers/form-field-description-wrapper.component.mjs +0 -44
  59. package/esm2022/lib/wrappers/form-field-wrapper.component.mjs +0 -34
  60. package/esm2022/lib/wrappers/formly-wrapper-with-old-value.component.mjs +0 -140
  61. package/esm2022/lib/wrappers/prefix-suffix-wrapper.component.mjs +0 -95
  62. package/esm2022/lib/wrappers/prefix-sufix-extension.component.mjs +0 -9
  63. package/esm2022/muraai-mnl-form.mjs +0 -5
  64. package/esm2022/public-api.mjs +0 -12
  65. /package/lib/{formly-lib/formly-standalone.module.d.ts → mnl-form/mnl-form-standalone.module.d.ts} +0 -0
@@ -1,293 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, inject, ViewChild } from '@angular/core';
3
- import { ReactiveFormsModule } from '@angular/forms';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import { MatIconModule } from '@angular/material/icon';
6
- import { MatTabsModule } from '@angular/material/tabs';
7
- import { MatTooltipModule } from '@angular/material/tooltip';
8
- import { Router } from '@angular/router';
9
- import { FieldType } from '@ngx-formly/core';
10
- import { FormlyModule } from '@ngx-formly/core';
11
- import { TranslateModule } from '@ngx-translate/core';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@angular/material/tabs";
14
- import * as i2 from "@ngx-formly/core";
15
- import * as i3 from "@angular/material/button";
16
- import * as i4 from "@angular/common";
17
- import * as i5 from "@ngx-translate/core";
18
- import * as i6 from "@angular/material/icon";
19
- import * as i7 from "@angular/material/tooltip";
20
- export class FormlyFieldTabsComponent extends FieldType {
21
- constructor() {
22
- super(...arguments);
23
- this.router = inject(Router);
24
- this.showSubmitBtn = false;
25
- this.hideTab = false;
26
- }
27
- nextTab(tabGroup) {
28
- if (tabGroup && tabGroup.selectedIndex != null) {
29
- const currentIndex = tabGroup.selectedIndex;
30
- if (currentIndex < (tabGroup._tabs?.length || 0) - 1) {
31
- tabGroup.selectedIndex = currentIndex + 1;
32
- }
33
- }
34
- }
35
- previousTab(tabGroup) {
36
- if (tabGroup && tabGroup.selectedIndex != null) {
37
- const currentIndex = tabGroup.selectedIndex;
38
- if (currentIndex > 0) {
39
- tabGroup.selectedIndex = currentIndex - 1;
40
- }
41
- }
42
- }
43
- isFirstTab(tabGroup) {
44
- return tabGroup && tabGroup.selectedIndex === 0;
45
- }
46
- isLastTab(tabGroup) {
47
- return tabGroup && tabGroup.selectedIndex === (tabGroup._tabs?.length || 0) - 1;
48
- }
49
- ngOnInit() {
50
- this.user = JSON.parse(localStorage.getItem('loggedInUser') || '{}');
51
- if (this.field.props?.['showSubmitBtnForStatus']?.length) {
52
- this.showSubmitBtn = this.field.props?.['showSubmitBtnForStatus'].find((role) => this.options.formState?.status == role) && !this.options.formState?.isReadonly;
53
- }
54
- }
55
- isValid(field) {
56
- if (field.key) {
57
- if (field.props?.excludeValidation) {
58
- if (field.props?.minRowValidation) {
59
- return field.formControl.value[field.props?.minRowValidation].length > 0 ? true : false;
60
- }
61
- else {
62
- return true;
63
- }
64
- }
65
- if (field.props?.uploadValidations?.length) {
66
- return field.props?.uploadValidations.every((uplField) => {
67
- let valid = true;
68
- if (Array.isArray(field.model[uplField]) && field.model[uplField]?.length) {
69
- valid = field.model[uplField]?.every(f => f.fileName ? !!f.nodeId : true);
70
- }
71
- else {
72
- valid = field.model[uplField]?.fileName ? !!field.model[uplField]?.nodeId : true;
73
- }
74
- return valid ? field?.formControl?.valid : false;
75
- });
76
- }
77
- return field?.formControl?.valid || false;
78
- }
79
- else {
80
- if (field.props?.excludeValidation) {
81
- if (field.props?.minRowValidation) {
82
- return field.formControl.value[field.props?.minRowValidation].length > 0 ? true : false;
83
- }
84
- else {
85
- return true;
86
- }
87
- }
88
- }
89
- return field.fieldGroup
90
- ? field.fieldGroup.every((f) => this.isValid(f))
91
- : true;
92
- }
93
- onTabChange(event) {
94
- if (this.field && this.field.props?.['tabChange']) {
95
- this.field.props?.['tabChange'](event, this.field);
96
- }
97
- }
98
- goToPreviousForm(tabGroup) {
99
- if (this.field && this.field.props?.['formChange']) {
100
- this.field.props?.['formChange'](tabGroup, this.field);
101
- }
102
- }
103
- getTabHeightClass() {
104
- if (this.field.props?.['applyOldHeight']) {
105
- return '2xl:h-[61vh] xl:h-[60vh] md:h-[56vh]';
106
- }
107
- return '2xl:h-auto xl:h-auto md:h-auto';
108
- }
109
- getColorForTheTabChanged(tab) {
110
- let tabEditedColor = '#000000';
111
- if (!this.isValid(tab) && this.options.formState?.showValidationError) {
112
- tabEditedColor = '#ff0000';
113
- }
114
- if (this.options?.formState?.editedTabsStatus && this.options?.formState?.editedTabsStatus[tab?.key]) {
115
- tabEditedColor = '#ff0000';
116
- }
117
- return tabEditedColor;
118
- }
119
- isTabDataChanged(step) {
120
- let isTabChanged = false;
121
- if (this.options?.formState?.editedTabsStatus && this.options?.formState?.editedTabsStatus[step?.key]) {
122
- isTabChanged = true;
123
- }
124
- return isTabChanged;
125
- }
126
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyFieldTabsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
127
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormlyFieldTabsComponent, isStandalone: true, selector: "mu-formly-field-tabs", viewQueries: [{ propertyName: "tabGroup", first: true, predicate: ["tabGroup"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
128
- <mat-tab-group #tabGroup (selectedTabChange)="onTabChange($event)">
129
- @for(tab of field.fieldGroup; track tab; let i = $index; let last =
130
- $last){
131
- <mat-tab
132
- [disabled]="
133
- i !== 0 && !isValid(field.fieldGroup ? field.fieldGroup[i - 1] : {}) && tab?.props?.['disableTabs'] && this.showSubmitBtn
134
- "
135
- *ngIf="!tab?.props?.['hideTab']"
136
- >
137
- <ng-template mat-tab-label>
138
- <span [ngStyle]="{'color': (!isValid(field.fieldGroup ? field.fieldGroup[i] : {}) && options.formState?.showValidationError) ? 'red' : 'black'}"
139
- [ngStyle]="{'color': getColorForTheTabChanged(tab)}"
140
- >
141
- {{ tab?.props?.label || '' }}
142
- </span>
143
- <mat-icon matTooltip="{{'EDITED_TAB' | translate}}" *ngIf="isTabDataChanged(tab) && !(!isValid(field.fieldGroup ? field.fieldGroup[i] : {}) && options.formState?.showValidationError)" [ngStyle]="{'color': getColorForTheTabChanged(tab)}">edit</mat-icon>
144
- <mat-icon matTooltip="{{'MANDATORY_FIELDS_TOOLTIP' | translate}}" *ngIf="!isValid(field.fieldGroup ? field.fieldGroup[i] : {}) && options.formState?.showValidationError" class="error-step">error</mat-icon>
145
- </ng-template>
146
- <div class="relative overflow-y-auto overflow-x-hidden form-content">
147
- <formly-field [field]="tab"></formly-field>
148
- </div>
149
- @if(tab?.props?.['showNextPrevious']) {
150
- <div class="relative bottom-2 flex justify-end mr-2">
151
- @if(i===0 && field.props['showBtnForPreviousForm']) {
152
- <button
153
- mat-flat-button
154
- color="primary"
155
- type="button"
156
- (click)="goToPreviousForm(tabGroup)"
157
- class="flex mr-2 ml-2 mt-5"
158
- >
159
- {{ 'BUTTON.PREVIOUS' | translate }}
160
- </button>
161
- }
162
- @if (i !== 0) {
163
- <button
164
- mat-flat-button
165
- color="primary"
166
- [disabled]="isFirstTab(tabGroup)"
167
- type="button"
168
- (click)="previousTab(tabGroup)"
169
- class="flex mr-2 ml-2 mt-5"
170
- >
171
- {{ 'BUTTON.PREVIOUS' | translate }}
172
- </button>
173
- } @if (!last) {
174
- <button
175
- mat-flat-button
176
- color="primary"
177
- type="button"
178
- [disabled]="!isValid(tab) && showSubmitBtn"
179
- (click)="nextTab(tabGroup)"
180
- class="flex mt-5"
181
- >
182
- {{ 'BUTTON.NEXT' | translate }}
183
- </button>
184
- }
185
- @if(last && showSubmitBtn) {
186
- <button
187
- mat-flat-button
188
- color="primary"
189
- type="submit"
190
- [disabled]="!form.valid"
191
- class="flex mt-5 submit-btn"
192
- >
193
- {{ field.props['SUBMIT_BTN_NAME'] | translate }}
194
- </button>
195
- }
196
- </div>
197
- }
198
- </mat-tab>
199
- }
200
- </mat-tab-group>
201
- `, isInline: true, styles: [".error-step{color:#d32f2f!important}\n"], dependencies: [{ kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i1.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i1.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i1.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i2.FormlyField, selector: "formly-field", inputs: ["field"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
202
- }
203
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormlyFieldTabsComponent, decorators: [{
204
- type: Component,
205
- args: [{ selector: 'mu-formly-field-tabs', standalone: true, imports: [
206
- MatTabsModule,
207
- ReactiveFormsModule,
208
- FormlyModule,
209
- MatButtonModule,
210
- CommonModule,
211
- TranslateModule,
212
- MatIconModule,
213
- MatTooltipModule
214
- ], template: `
215
- <mat-tab-group #tabGroup (selectedTabChange)="onTabChange($event)">
216
- @for(tab of field.fieldGroup; track tab; let i = $index; let last =
217
- $last){
218
- <mat-tab
219
- [disabled]="
220
- i !== 0 && !isValid(field.fieldGroup ? field.fieldGroup[i - 1] : {}) && tab?.props?.['disableTabs'] && this.showSubmitBtn
221
- "
222
- *ngIf="!tab?.props?.['hideTab']"
223
- >
224
- <ng-template mat-tab-label>
225
- <span [ngStyle]="{'color': (!isValid(field.fieldGroup ? field.fieldGroup[i] : {}) && options.formState?.showValidationError) ? 'red' : 'black'}"
226
- [ngStyle]="{'color': getColorForTheTabChanged(tab)}"
227
- >
228
- {{ tab?.props?.label || '' }}
229
- </span>
230
- <mat-icon matTooltip="{{'EDITED_TAB' | translate}}" *ngIf="isTabDataChanged(tab) && !(!isValid(field.fieldGroup ? field.fieldGroup[i] : {}) && options.formState?.showValidationError)" [ngStyle]="{'color': getColorForTheTabChanged(tab)}">edit</mat-icon>
231
- <mat-icon matTooltip="{{'MANDATORY_FIELDS_TOOLTIP' | translate}}" *ngIf="!isValid(field.fieldGroup ? field.fieldGroup[i] : {}) && options.formState?.showValidationError" class="error-step">error</mat-icon>
232
- </ng-template>
233
- <div class="relative overflow-y-auto overflow-x-hidden form-content">
234
- <formly-field [field]="tab"></formly-field>
235
- </div>
236
- @if(tab?.props?.['showNextPrevious']) {
237
- <div class="relative bottom-2 flex justify-end mr-2">
238
- @if(i===0 && field.props['showBtnForPreviousForm']) {
239
- <button
240
- mat-flat-button
241
- color="primary"
242
- type="button"
243
- (click)="goToPreviousForm(tabGroup)"
244
- class="flex mr-2 ml-2 mt-5"
245
- >
246
- {{ 'BUTTON.PREVIOUS' | translate }}
247
- </button>
248
- }
249
- @if (i !== 0) {
250
- <button
251
- mat-flat-button
252
- color="primary"
253
- [disabled]="isFirstTab(tabGroup)"
254
- type="button"
255
- (click)="previousTab(tabGroup)"
256
- class="flex mr-2 ml-2 mt-5"
257
- >
258
- {{ 'BUTTON.PREVIOUS' | translate }}
259
- </button>
260
- } @if (!last) {
261
- <button
262
- mat-flat-button
263
- color="primary"
264
- type="button"
265
- [disabled]="!isValid(tab) && showSubmitBtn"
266
- (click)="nextTab(tabGroup)"
267
- class="flex mt-5"
268
- >
269
- {{ 'BUTTON.NEXT' | translate }}
270
- </button>
271
- }
272
- @if(last && showSubmitBtn) {
273
- <button
274
- mat-flat-button
275
- color="primary"
276
- type="submit"
277
- [disabled]="!form.valid"
278
- class="flex mt-5 submit-btn"
279
- >
280
- {{ field.props['SUBMIT_BTN_NAME'] | translate }}
281
- </button>
282
- }
283
- </div>
284
- }
285
- </mat-tab>
286
- }
287
- </mat-tab-group>
288
- `, styles: [".error-step{color:#d32f2f!important}\n"] }]
289
- }], propDecorators: { tabGroup: [{
290
- type: ViewChild,
291
- args: ['tabGroup']
292
- }] } });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tbGliL3NyYy9saWIvdHlwZXMvdGFicy50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFrQyxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBc0MsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7QUFnR3RELE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxTQUEwQjtJQTlGeEU7O1FBaUdFLFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFHeEIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsWUFBTyxHQUFZLEtBQUssQ0FBQztLQTZHMUI7SUEzR0MsT0FBTyxDQUFDLFFBQXFCO1FBQzNCLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxZQUFZLEdBQUcs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ckcsY0FBYyxHQUFHLFNBQVMsQ0FBQTtRQUM1QixDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVM7UUFDeEIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEcsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQzsrR0FuSFUsd0JBQXdCO21HQUF4Qix3QkFBd0IsNk1BakZ6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwRVQsK0dBbkZDLGFBQWEscXVCQUNiLG1CQUFtQiw4QkFDbkIsWUFBWSx3SEFDWixlQUFlLDJOQUNmLFlBQVksdU5BQ1osZUFBZSwyRkFDZixhQUFhLG1MQUNiLGdCQUFnQjs7NEZBbUZQLHdCQUF3QjtrQkE5RnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUDt3QkFDUCxhQUFhO3dCQUNiLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjtxQkFDakIsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwRVQ7OEJBWXNCLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUYWJDaGFuZ2VFdmVudCwgTWF0VGFiR3JvdXAsIE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGaWVsZFR5cGUsIEZpZWxkVHlwZUNvbmZpZywgRm9ybWx5RmllbGRDb25maWcgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEZvcm1seU1vZHVsZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ211LWZvcm1seS1maWVsZC10YWJzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdFRhYnNNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3JtbHlNb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPG1hdC10YWItZ3JvdXAgICN0YWJHcm91cCAoc2VsZWN0ZWRUYWJDaGFuZ2UpPVwib25UYWJDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgQGZvcih0YWIgb2YgZmllbGQuZmllbGRHcm91cDsgdHJhY2sgdGFiOyBsZXQgaSA9ICRpbmRleDsgbGV0IGxhc3QgPVxuICAgICAgJGxhc3Qpe1xuICAgICAgPG1hdC10YWJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgIGkgIT09IDAgJiYgIWlzVmFsaWQoZmllbGQuZmllbGRHcm91cCA/IGZpZWxkLmZpZWxkR3JvdXBbaSAtIDFdIDoge30pICYmIHRhYj8ucHJvcHM/LlsnZGlzYWJsZVRhYnMnXSAmJiB0aGlzLnNob3dTdWJtaXRCdG5cbiAgICAgICAgXCJcbiAgICAgICAgKm5nSWY9XCIhdGFiPy5wcm9wcz8uWydoaWRlVGFiJ11cIlxuICAgICAgPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cbiAgICAgICAgICA8c3BhbiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogKCFpc1ZhbGlkKGZpZWxkLmZpZWxkR3JvdXAgPyBmaWVsZC5maWVsZEdyb3VwW2ldIDoge30pICYmIG9wdGlvbnMuZm9ybVN0YXRlPy5zaG93VmFsaWRhdGlvbkVycm9yKSA/ICdyZWQnIDogJ2JsYWNrJ31cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IGdldENvbG9yRm9yVGhlVGFiQ2hhbmdlZCh0YWIpfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdGFiPy5wcm9wcz8ubGFiZWwgfHwgJycgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPG1hdC1pY29uIG1hdFRvb2x0aXA9XCJ7eydFRElURURfVEFCJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCJpc1RhYkRhdGFDaGFuZ2VkKHRhYikgJiYgISghaXNWYWxpZChmaWVsZC5maWVsZEdyb3VwID8gZmllbGQuZmllbGRHcm91cFtpXSA6IHt9KSAmJiBvcHRpb25zLmZvcm1TdGF0ZT8uc2hvd1ZhbGlkYXRpb25FcnJvcilcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogZ2V0Q29sb3JGb3JUaGVUYWJDaGFuZ2VkKHRhYil9XCI+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgPG1hdC1pY29uIG1hdFRvb2x0aXA9XCJ7eydNQU5EQVRPUllfRklFTERTX1RPT0xUSVAnIHwgdHJhbnNsYXRlfX1cIiAqbmdJZj1cIiFpc1ZhbGlkKGZpZWxkLmZpZWxkR3JvdXAgPyBmaWVsZC5maWVsZEdyb3VwW2ldIDoge30pICYmIG9wdGlvbnMuZm9ybVN0YXRlPy5zaG93VmFsaWRhdGlvbkVycm9yXCIgY2xhc3M9XCJlcnJvci1zdGVwXCI+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgb3ZlcmZsb3cteS1hdXRvIG92ZXJmbG93LXgtaGlkZGVuIGZvcm0tY29udGVudFwiPlxuICAgICAgICA8Zm9ybWx5LWZpZWxkIFtmaWVsZF09XCJ0YWJcIj48L2Zvcm1seS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmKHRhYj8ucHJvcHM/Llsnc2hvd05leHRQcmV2aW91cyddKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBib3R0b20tMiBmbGV4IGp1c3RpZnktZW5kIG1yLTJcIj5cbiAgICAgICAgICBAaWYoaT09PTAgJiYgZmllbGQucHJvcHNbJ3Nob3dCdG5Gb3JQcmV2aW91c0Zvcm0nXSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtZmxhdC1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXNGb3JtKHRhYkdyb3VwKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBtci0yIG1sLTIgbXQtNVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdCVVRUT04uUFJFVklPVVMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChpICE9PSAwKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRmlyc3RUYWIodGFiR3JvdXApXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInByZXZpb3VzVGFiKHRhYkdyb3VwKVwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggbXItMiBtbC0yIG10LTVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdCVVRUT04uUFJFVklPVVMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfSBAaWYgKCFsYXN0KSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzVmFsaWQodGFiKSAmJiBzaG93U3VibWl0QnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJuZXh0VGFiKHRhYkdyb3VwKVwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggbXQtNVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgIHt7ICdCVVRUT04uTkVYVCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmKGxhc3QgJiYgc2hvd1N1Ym1pdEJ0bikge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtZmxhdC1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZm9ybS52YWxpZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBtdC01IHN1Ym1pdC1idG5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBmaWVsZC5wcm9wc1snU1VCTUlUX0JUTl9OQU1FJ10gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8L21hdC10YWI+XG4gICAgICB9XG4gICAgPC9tYXQtdGFiLWdyb3VwPlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmVycm9yLXN0ZXAge1xuICAgICAgY29sb3I6ICNkMzJmMmYgIWltcG9ydGFudDtcbiAgICB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seUZpZWxkVGFic0NvbXBvbmVudCBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgc3VibWl0dGVkRGF0YSE6IGFueVtdO1xuXG4gIHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICB1c2VyOiBhbnk7XG4gIEBWaWV3Q2hpbGQoJ3RhYkdyb3VwJykgdGFiR3JvdXAhOiBNYXRUYWJHcm91cDtcbiAgc2hvd1N1Ym1pdEJ0biA9IGZhbHNlO1xuICBoaWRlVGFiOiBib29sZWFuID0gZmFsc2U7XG5cbiAgbmV4dFRhYih0YWJHcm91cDogTWF0VGFiR3JvdXApIHtcbiAgICBpZiAodGFiR3JvdXAgJiYgdGFiR3JvdXAuc2VsZWN0ZWRJbmRleCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0YWJHcm91cC5zZWxlY3RlZEluZGV4O1xuICAgICAgaWYgKGN1cnJlbnRJbmRleCA8ICh0YWJHcm91cC5fdGFicz8ubGVuZ3RoIHx8IDApIC0gMSkge1xuICAgICAgICB0YWJHcm91cC5zZWxlY3RlZEluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmV2aW91c1RhYih0YWJHcm91cDogTWF0VGFiR3JvdXApIHtcbiAgICBpZiAodGFiR3JvdXAgJiYgdGFiR3JvdXAuc2VsZWN0ZWRJbmRleCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0YWJHcm91cC5zZWxlY3RlZEluZGV4O1xuICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcbiAgICAgICAgdGFiR3JvdXAuc2VsZWN0ZWRJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNGaXJzdFRhYih0YWJHcm91cDogTWF0VGFiR3JvdXApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGFiR3JvdXAgJiYgdGFiR3JvdXAuc2VsZWN0ZWRJbmRleCA9PT0gMDtcbiAgfVxuXG4gIGlzTGFzdFRhYih0YWJHcm91cDogTWF0VGFiR3JvdXApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGFiR3JvdXAgJiYgdGFiR3JvdXAuc2VsZWN0ZWRJbmRleCA9PT0gKHRhYkdyb3VwLl90YWJzPy5sZW5ndGggfHwgMCkgLSAxO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51c2VyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbG9nZ2VkSW5Vc2VyJykgfHwgJ3t9Jyk7XG4gICAgaWYodGhpcy5maWVsZC5wcm9wcz8uWydzaG93U3VibWl0QnRuRm9yU3RhdHVzJ10/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5zaG93U3VibWl0QnRuID0gdGhpcy5maWVsZC5wcm9wcz8uWydzaG93U3VibWl0QnRuRm9yU3RhdHVzJ10uZmluZCgocm9sZTogYW55KSA9PiB0aGlzLm9wdGlvbnMuZm9ybVN0YXRlPy5zdGF0dXMgPT0gcm9sZSkgJiYgIXRoaXMub3B0aW9ucy5mb3JtU3RhdGU/LmlzUmVhZG9ubHk7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZChmaWVsZDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKGZpZWxkLmtleSkge1xuICAgICAgaWYoZmllbGQucHJvcHM/LmV4Y2x1ZGVWYWxpZGF0aW9uKSB7XG4gICAgICAgIGlmKGZpZWxkLnByb3BzPy5taW5Sb3dWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkLmZvcm1Db250cm9sLnZhbHVlW2ZpZWxkLnByb3BzPy5taW5Sb3dWYWxpZGF0aW9uXS5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoZmllbGQucHJvcHM/LnVwbG9hZFZhbGlkYXRpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLnByb3BzPy51cGxvYWRWYWxpZGF0aW9ucy5ldmVyeSgodXBsRmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShmaWVsZC5tb2RlbFt1cGxGaWVsZF0pICYmIGZpZWxkLm1vZGVsW3VwbEZpZWxkXT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YWxpZCA9IGZpZWxkLm1vZGVsW3VwbEZpZWxkXT8uZXZlcnkoZiA9PiBmLmZpbGVOYW1lID8gISFmLm5vZGVJZCA6IHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWxpZCA9IGZpZWxkLm1vZGVsW3VwbEZpZWxkXT8uZmlsZU5hbWUgPyAhIWZpZWxkLm1vZGVsW3VwbEZpZWxkXT8ubm9kZUlkIDogdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbGlkID8gZmllbGQ/LmZvcm1Db250cm9sPy52YWxpZCA6IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmaWVsZD8uZm9ybUNvbnRyb2w/LnZhbGlkIHx8IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihmaWVsZC5wcm9wcz8uZXhjbHVkZVZhbGlkYXRpb24pIHtcbiAgICAgICAgaWYoZmllbGQucHJvcHM/Lm1pblJvd1ZhbGlkYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gZmllbGQuZm9ybUNvbnRyb2wudmFsdWVbZmllbGQucHJvcHM/Lm1pblJvd1ZhbGlkYXRpb25dLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWVsZC5maWVsZEdyb3VwXG4gICAgICA/IGZpZWxkLmZpZWxkR3JvdXAuZXZlcnkoKGY6IGFueSkgPT4gdGhpcy5pc1ZhbGlkKGYpKVxuICAgICAgOiB0cnVlO1xuICB9XG5cbiAgb25UYWJDaGFuZ2UoZXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmllbGQgJiYgdGhpcy5maWVsZC5wcm9wcz8uWyd0YWJDaGFuZ2UnXSkge1xuICAgICAgdGhpcy5maWVsZC5wcm9wcz8uWyd0YWJDaGFuZ2UnXShldmVudCwgdGhpcy5maWVsZCk7XG4gICAgfVxuICB9XG5cbiAgZ29Ub1ByZXZpb3VzRm9ybSh0YWJHcm91cDogTWF0VGFiR3JvdXApIHtcbiAgICBpZiAodGhpcy5maWVsZCAmJiB0aGlzLmZpZWxkLnByb3BzPy5bJ2Zvcm1DaGFuZ2UnXSkge1xuICAgICAgdGhpcy5maWVsZC5wcm9wcz8uWydmb3JtQ2hhbmdlJ10odGFiR3JvdXAsIHRoaXMuZmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldFRhYkhlaWdodENsYXNzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmllbGQucHJvcHM/LlsnYXBwbHlPbGRIZWlnaHQnXSkge1xuICAgICAgcmV0dXJuICcyeGw6aC1bNjF2aF0geGw6aC1bNjB2aF0gbWQ6aC1bNTZ2aF0nO1xuICAgIH1cbiAgICByZXR1cm4gJzJ4bDpoLWF1dG8geGw6aC1hdXRvIG1kOmgtYXV0byc7XG4gIH1cblxuICBnZXRDb2xvckZvclRoZVRhYkNoYW5nZWQodGFiOiBhbnkpIHtcbiAgICBsZXQgdGFiRWRpdGVkQ29sb3IgPSAnIzAwMDAwMCc7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQodGFiKSAmJiB0aGlzLm9wdGlvbnMuZm9ybVN0YXRlPy5zaG93VmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICB0YWJFZGl0ZWRDb2xvciA9ICcjZmYwMDAwJztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZm9ybVN0YXRlPy5lZGl0ZWRUYWJzU3RhdHVzICYmIHRoaXMub3B0aW9ucz8uZm9ybVN0YXRlPy5lZGl0ZWRUYWJzU3RhdHVzW3RhYj8ua2V5XSkge1xuICAgICAgdGFiRWRpdGVkQ29sb3IgPSAnI2ZmMDAwMCdcbiAgICB9XG4gICAgcmV0dXJuIHRhYkVkaXRlZENvbG9yO1xuICB9XG5cbiAgaXNUYWJEYXRhQ2hhbmdlZChzdGVwOiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgaXNUYWJDaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZm9ybVN0YXRlPy5lZGl0ZWRUYWJzU3RhdHVzICYmIHRoaXMub3B0aW9ucz8uZm9ybVN0YXRlPy5lZGl0ZWRUYWJzU3RhdHVzW3N0ZXA/LmtleV0pIHtcbiAgICAgIGlzVGFiQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc1RhYkNoYW5nZWQ7XG4gIH1cbn1cbiJdfQ==