@muraai/mnl-form 0.0.1-alpha-db495b1 → 0.0.1-alpha-6116399

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 (61) hide show
  1. package/fesm2022/muraai-mnl-form.mjs +150 -143
  2. package/fesm2022/muraai-mnl-form.mjs.map +1 -1
  3. package/lib/types/upload-file.d.ts +1 -1
  4. package/lib/workflow-status/ workflow-status.module.d.ts +8 -8
  5. package/lib/workflow-status/workflow-status.component.d.ts +1 -1
  6. package/package.json +4 -5
  7. package/esm2022/lib/confirmation-dialog/confirmation-dialog.component.mjs +0 -34
  8. package/esm2022/lib/mnl-form/mnl-form-standalone.module.mjs +0 -155
  9. package/esm2022/lib/mnl-form/mnl-form.component.mjs +0 -199
  10. package/esm2022/lib/models/custom-form-field.model.mjs +0 -2
  11. package/esm2022/lib/models/workflow-status.model.mjs +0 -2
  12. package/esm2022/lib/services/graphql.service.mjs +0 -30
  13. package/esm2022/lib/services/scoring.service.mjs +0 -103
  14. package/esm2022/lib/types/action-button-renderer.component.mjs +0 -59
  15. package/esm2022/lib/types/autocomplete-type.component.mjs +0 -68
  16. package/esm2022/lib/types/button.type.mjs +0 -72
  17. package/esm2022/lib/types/comments.type.mjs +0 -102
  18. package/esm2022/lib/types/country-code-input.type.mjs +0 -181
  19. package/esm2022/lib/types/custom-date.type.mjs +0 -20
  20. package/esm2022/lib/types/custom-input.component.mjs +0 -62
  21. package/esm2022/lib/types/date-format.type.mjs +0 -196
  22. package/esm2022/lib/types/expansion-panel.types.mjs +0 -85
  23. package/esm2022/lib/types/formly-field-panel.type.mjs +0 -70
  24. package/esm2022/lib/types/grid-actionable.type.mjs +0 -197
  25. package/esm2022/lib/types/grid-formly-cell.component.mjs +0 -42
  26. package/esm2022/lib/types/grid.type.mjs +0 -125
  27. package/esm2022/lib/types/input.type.mjs +0 -43
  28. package/esm2022/lib/types/mu-helper-text.type.mjs +0 -331
  29. package/esm2022/lib/types/multi-select-autocomplete.mjs +0 -139
  30. package/esm2022/lib/types/multi-select-checkbox.component.mjs +0 -247
  31. package/esm2022/lib/types/radio.type.mjs +0 -71
  32. package/esm2022/lib/types/scrollable-tabs.types.mjs +0 -220
  33. package/esm2022/lib/types/select-api-auto-complete.component.mjs +0 -111
  34. package/esm2022/lib/types/select-autocomplete-redefined.component.mjs +0 -142
  35. package/esm2022/lib/types/select-autocomplete.type.mjs +0 -254
  36. package/esm2022/lib/types/stepper.type.mjs +0 -268
  37. package/esm2022/lib/types/table.types.mjs +0 -79
  38. package/esm2022/lib/types/tabs.types.mjs +0 -293
  39. package/esm2022/lib/types/tabular-form-dialog.component.mjs +0 -331
  40. package/esm2022/lib/types/tabular-form.type.mjs +0 -641
  41. package/esm2022/lib/types/upload-file.mjs +0 -524
  42. package/esm2022/lib/types/view-file-dialog.component.mjs +0 -90
  43. package/esm2022/lib/utils/formly.utils.mjs +0 -105
  44. package/esm2022/lib/validators/custom-email-validator.mjs +0 -18
  45. package/esm2022/lib/validators/ein-validators.mjs +0 -11
  46. package/esm2022/lib/validators/gst-validator.mjs +0 -11
  47. package/esm2022/lib/validators/normal-email-validator.mjs +0 -17
  48. package/esm2022/lib/validators/npi-validator.mjs +0 -11
  49. package/esm2022/lib/validators/pan-validator.mjs +0 -11
  50. package/esm2022/lib/validators/phone-number-validator.mjs +0 -22
  51. package/esm2022/lib/validators/select-validator.mjs +0 -7
  52. package/esm2022/lib/validators/tinSsn-validator.mjs +0 -12
  53. package/esm2022/lib/workflow-status/ workflow-status.module.mjs +0 -52
  54. package/esm2022/lib/workflow-status/workflow-status.component.mjs +0 -70
  55. package/esm2022/lib/wrappers/form-field-description-wrapper.component.mjs +0 -44
  56. package/esm2022/lib/wrappers/form-field-wrapper.component.mjs +0 -34
  57. package/esm2022/lib/wrappers/formly-wrapper-with-old-value.component.mjs +0 -140
  58. package/esm2022/lib/wrappers/prefix-suffix-wrapper.component.mjs +0 -95
  59. package/esm2022/lib/wrappers/prefix-sufix-extension.component.mjs +0 -9
  60. package/esm2022/muraai-mnl-form.mjs +0 -5
  61. package/esm2022/public-api.mjs +0 -12
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZm9ybS9zcmMvbGliL3R5cGVzL3RhYnMudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQWEsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBa0MsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQXNDLE1BQU0sa0JBQWtCLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7O0FBZ0d0RCxNQUFNLE9BQU8sd0JBQXlCLFNBQVEsU0FBMEI7SUE5RnhFOztRQWlHRSxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBR3hCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLFlBQU8sR0FBWSxLQUFLLENBQUM7S0E2RzFCO0lBM0dDLE9BQU8sQ0FBQyxRQUFxQjtRQUMzQixJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9DLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDNUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckQsUUFBUSxDQUFDLGFBQWEsR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUFxQjtRQUMvQixJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQy9DLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDNUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLFFBQVEsQ0FBQyxhQUFhLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsUUFBcUI7UUFDOUIsT0FBTyxRQUFRLElBQUksUUFBUSxDQUFDLGFBQWEsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELFNBQVMsQ0FBQyxRQUFxQjtRQUM3QixPQUFPLFFBQVEsSUFBSSxRQUFRLENBQUMsYUFBYSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDckUsSUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUM7UUFDdkssQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsS0FBVTtRQUNoQixJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLElBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNsQyxJQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDakMsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7Z0JBQ3pGLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO29CQUM1RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7b0JBQ2pCLElBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQzt3QkFDekUsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1RSxDQUFDO3lCQUFNLENBQUM7d0JBQ04sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDbkYsQ0FBQztvQkFDRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDbkQsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUM7UUFDNUMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztnQkFDbEMsSUFBRyxLQUFLLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLENBQUM7b0JBQ2pDLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO2dCQUN6RixDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsVUFBVTtZQUNyQixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBd0I7UUFDbEMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFxQjtRQUNwQyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDekMsT0FBTyxzQ0FBc0MsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxnQ0FBZ0MsQ0FBQztJQUMxQyxDQUFDO0lBRUQsd0JBQXdCLENBQUMsR0FBUTtRQUMvQixJQUFJLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztZQUN0RSxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JHLGNBQWMsR0FBRyxTQUFTLENBQUE7UUFDNUIsQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFTO1FBQ3hCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RHLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDdEIsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7K0dBbkhVLHdCQUF3QjttR0FBeEIsd0JBQXdCLDZNQWpGekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEVULCtHQW5GQyxhQUFhLHF1QkFDYixtQkFBbUIsOEJBQ25CLFlBQVksd0hBQ1osZUFBZSwyTkFDZixZQUFZLHVOQUNaLGVBQWUsMkZBQ2YsYUFBYSxtTEFDYixnQkFBZ0I7OzRGQW1GUCx3QkFBd0I7a0JBOUZwQyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1A7d0JBQ1AsYUFBYTt3QkFDYixtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixnQkFBZ0I7cUJBQ2pCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEVUOzhCQVlzQixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0VGFiQ2hhbmdlRXZlbnQsIE1hdFRhYkdyb3VwLCBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRmllbGRUeXBlLCBGaWVsZFR5cGVDb25maWcsIEZvcm1seUZpZWxkQ29uZmlnIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBGb3JtbHlNb2R1bGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdS1mb3JtbHktZmllbGQtdGFicycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRUYWJzTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybWx5TW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxtYXQtdGFiLWdyb3VwICAjdGFiR3JvdXAgKHNlbGVjdGVkVGFiQ2hhbmdlKT1cIm9uVGFiQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIEBmb3IodGFiIG9mIGZpZWxkLmZpZWxkR3JvdXA7IHRyYWNrIHRhYjsgbGV0IGkgPSAkaW5kZXg7IGxldCBsYXN0ID1cbiAgICAgICRsYXN0KXtcbiAgICAgIDxtYXQtdGFiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICBpICE9PSAwICYmICFpc1ZhbGlkKGZpZWxkLmZpZWxkR3JvdXAgPyBmaWVsZC5maWVsZEdyb3VwW2kgLSAxXSA6IHt9KSAmJiB0YWI/LnByb3BzPy5bJ2Rpc2FibGVUYWJzJ10gJiYgdGhpcy5zaG93U3VibWl0QnRuXG4gICAgICAgIFwiXG4gICAgICAgICpuZ0lmPVwiIXRhYj8ucHJvcHM/LlsnaGlkZVRhYiddXCJcbiAgICAgID5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+XG4gICAgICAgICAgPHNwYW4gW25nU3R5bGVdPVwieydjb2xvcic6ICghaXNWYWxpZChmaWVsZC5maWVsZEdyb3VwID8gZmllbGQuZmllbGRHcm91cFtpXSA6IHt9KSAmJiBvcHRpb25zLmZvcm1TdGF0ZT8uc2hvd1ZhbGlkYXRpb25FcnJvcikgPyAncmVkJyA6ICdibGFjayd9XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY29sb3InOiBnZXRDb2xvckZvclRoZVRhYkNoYW5nZWQodGFiKX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHRhYj8ucHJvcHM/LmxhYmVsIHx8ICcnIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRUb29sdGlwPVwie3snRURJVEVEX1RBQicgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwiaXNUYWJEYXRhQ2hhbmdlZCh0YWIpICYmICEoIWlzVmFsaWQoZmllbGQuZmllbGRHcm91cCA/IGZpZWxkLmZpZWxkR3JvdXBbaV0gOiB7fSkgJiYgb3B0aW9ucy5mb3JtU3RhdGU/LnNob3dWYWxpZGF0aW9uRXJyb3IpXCIgW25nU3R5bGVdPVwieydjb2xvcic6IGdldENvbG9yRm9yVGhlVGFiQ2hhbmdlZCh0YWIpfVwiPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgIDxtYXQtaWNvbiBtYXRUb29sdGlwPVwie3snTUFOREFUT1JZX0ZJRUxEU19UT09MVElQJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCIhaXNWYWxpZChmaWVsZC5maWVsZEdyb3VwID8gZmllbGQuZmllbGRHcm91cFtpXSA6IHt9KSAmJiBvcHRpb25zLmZvcm1TdGF0ZT8uc2hvd1ZhbGlkYXRpb25FcnJvclwiIGNsYXNzPVwiZXJyb3Itc3RlcFwiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIG92ZXJmbG93LXktYXV0byBvdmVyZmxvdy14LWhpZGRlbiBmb3JtLWNvbnRlbnRcIj5cbiAgICAgICAgPGZvcm1seS1maWVsZCBbZmllbGRdPVwidGFiXCI+PC9mb3JtbHktZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZih0YWI/LnByb3BzPy5bJ3Nob3dOZXh0UHJldmlvdXMnXSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgYm90dG9tLTIgZmxleCBqdXN0aWZ5LWVuZCBtci0yXCI+XG4gICAgICAgICAgQGlmKGk9PT0wICYmIGZpZWxkLnByb3BzWydzaG93QnRuRm9yUHJldmlvdXNGb3JtJ10pIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub1ByZXZpb3VzRm9ybSh0YWJHcm91cClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggbXItMiBtbC0yIG10LTVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnQlVUVE9OLlBSRVZJT1VTJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1mbGF0LWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0ZpcnN0VGFiKHRhYkdyb3VwKVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJwcmV2aW91c1RhYih0YWJHcm91cClcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IG1yLTIgbWwtMiBtdC01XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnQlVUVE9OLlBSRVZJT1VTJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH0gQGlmICghbGFzdCkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1mbGF0LWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc1ZhbGlkKHRhYikgJiYgc2hvd1N1Ym1pdEJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwibmV4dFRhYih0YWJHcm91cClcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IG10LTVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgICB7eyAnQlVUVE9OLk5FWFQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZihsYXN0ICYmIHNob3dTdWJtaXRCdG4pIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWZvcm0udmFsaWRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggbXQtNSBzdWJtaXQtYnRuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgZmllbGQucHJvcHNbJ1NVQk1JVF9CVE5fTkFNRSddIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPC9tYXQtdGFiPlxuICAgICAgfVxuICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5lcnJvci1zdGVwIHtcbiAgICAgIGNvbG9yOiAjZDMyZjJmICFpbXBvcnRhbnQ7XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlGaWVsZFRhYnNDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFR5cGU8RmllbGRUeXBlQ29uZmlnPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHN1Ym1pdHRlZERhdGEhOiBhbnlbXTtcblxuICByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgdXNlcjogYW55O1xuICBAVmlld0NoaWxkKCd0YWJHcm91cCcpIHRhYkdyb3VwITogTWF0VGFiR3JvdXA7XG4gIHNob3dTdWJtaXRCdG4gPSBmYWxzZTtcbiAgaGlkZVRhYjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIG5leHRUYWIodGFiR3JvdXA6IE1hdFRhYkdyb3VwKSB7XG4gICAgaWYgKHRhYkdyb3VwICYmIHRhYkdyb3VwLnNlbGVjdGVkSW5kZXggIT0gbnVsbCkge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGFiR3JvdXAuc2VsZWN0ZWRJbmRleDtcbiAgICAgIGlmIChjdXJyZW50SW5kZXggPCAodGFiR3JvdXAuX3RhYnM/Lmxlbmd0aCB8fCAwKSAtIDEpIHtcbiAgICAgICAgdGFiR3JvdXAuc2VsZWN0ZWRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJldmlvdXNUYWIodGFiR3JvdXA6IE1hdFRhYkdyb3VwKSB7XG4gICAgaWYgKHRhYkdyb3VwICYmIHRhYkdyb3VwLnNlbGVjdGVkSW5kZXggIT0gbnVsbCkge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGFiR3JvdXAuc2VsZWN0ZWRJbmRleDtcbiAgICAgIGlmIChjdXJyZW50SW5kZXggPiAwKSB7XG4gICAgICAgIHRhYkdyb3VwLnNlbGVjdGVkSW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzRmlyc3RUYWIodGFiR3JvdXA6IE1hdFRhYkdyb3VwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRhYkdyb3VwICYmIHRhYkdyb3VwLnNlbGVjdGVkSW5kZXggPT09IDA7XG4gIH1cblxuICBpc0xhc3RUYWIodGFiR3JvdXA6IE1hdFRhYkdyb3VwKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRhYkdyb3VwICYmIHRhYkdyb3VwLnNlbGVjdGVkSW5kZXggPT09ICh0YWJHcm91cC5fdGFicz8ubGVuZ3RoIHx8IDApIC0gMTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xvZ2dlZEluVXNlcicpIHx8ICd7fScpO1xuICAgIGlmKHRoaXMuZmllbGQucHJvcHM/Llsnc2hvd1N1Ym1pdEJ0bkZvclN0YXR1cyddPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hvd1N1Ym1pdEJ0biA9IHRoaXMuZmllbGQucHJvcHM/Llsnc2hvd1N1Ym1pdEJ0bkZvclN0YXR1cyddLmZpbmQoKHJvbGU6IGFueSkgPT4gdGhpcy5vcHRpb25zLmZvcm1TdGF0ZT8uc3RhdHVzID09IHJvbGUpICYmICF0aGlzLm9wdGlvbnMuZm9ybVN0YXRlPy5pc1JlYWRvbmx5O1xuICAgIH1cbiAgfVxuXG4gIGlzVmFsaWQoZmllbGQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChmaWVsZC5rZXkpIHtcbiAgICAgIGlmKGZpZWxkLnByb3BzPy5leGNsdWRlVmFsaWRhdGlvbikge1xuICAgICAgICBpZihmaWVsZC5wcm9wcz8ubWluUm93VmFsaWRhdGlvbikge1xuICAgICAgICAgIHJldHVybiBmaWVsZC5mb3JtQ29udHJvbC52YWx1ZVtmaWVsZC5wcm9wcz8ubWluUm93VmFsaWRhdGlvbl0ubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKGZpZWxkLnByb3BzPy51cGxvYWRWYWxpZGF0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5wcm9wcz8udXBsb2FkVmFsaWRhdGlvbnMuZXZlcnkoKHVwbEZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZmllbGQubW9kZWxbdXBsRmllbGRdKSAmJiBmaWVsZC5tb2RlbFt1cGxGaWVsZF0/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdmFsaWQgPSBmaWVsZC5tb2RlbFt1cGxGaWVsZF0/LmV2ZXJ5KGYgPT4gZi5maWxlTmFtZSA/ICEhZi5ub2RlSWQgOiB0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsaWQgPSBmaWVsZC5tb2RlbFt1cGxGaWVsZF0/LmZpbGVOYW1lID8gISFmaWVsZC5tb2RlbFt1cGxGaWVsZF0/Lm5vZGVJZCA6IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWxpZCA/IGZpZWxkPy5mb3JtQ29udHJvbD8udmFsaWQgOiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmllbGQ/LmZvcm1Db250cm9sPy52YWxpZCB8fCBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZmllbGQucHJvcHM/LmV4Y2x1ZGVWYWxpZGF0aW9uKSB7XG4gICAgICAgIGlmKGZpZWxkLnByb3BzPy5taW5Sb3dWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkLmZvcm1Db250cm9sLnZhbHVlW2ZpZWxkLnByb3BzPy5taW5Sb3dWYWxpZGF0aW9uXS5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGQuZmllbGRHcm91cFxuICAgICAgPyBmaWVsZC5maWVsZEdyb3VwLmV2ZXJ5KChmOiBhbnkpID0+IHRoaXMuaXNWYWxpZChmKSlcbiAgICAgIDogdHJ1ZTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKGV2ZW50OiBNYXRUYWJDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpZWxkICYmIHRoaXMuZmllbGQucHJvcHM/LlsndGFiQ2hhbmdlJ10pIHtcbiAgICAgIHRoaXMuZmllbGQucHJvcHM/LlsndGFiQ2hhbmdlJ10oZXZlbnQsIHRoaXMuZmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdvVG9QcmV2aW91c0Zvcm0odGFiR3JvdXA6IE1hdFRhYkdyb3VwKSB7XG4gICAgaWYgKHRoaXMuZmllbGQgJiYgdGhpcy5maWVsZC5wcm9wcz8uWydmb3JtQ2hhbmdlJ10pIHtcbiAgICAgIHRoaXMuZmllbGQucHJvcHM/LlsnZm9ybUNoYW5nZSddKHRhYkdyb3VwLCB0aGlzLmZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXRUYWJIZWlnaHRDbGFzcygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpZWxkLnByb3BzPy5bJ2FwcGx5T2xkSGVpZ2h0J10pIHtcbiAgICAgIHJldHVybiAnMnhsOmgtWzYxdmhdIHhsOmgtWzYwdmhdIG1kOmgtWzU2dmhdJztcbiAgICB9XG4gICAgcmV0dXJuICcyeGw6aC1hdXRvIHhsOmgtYXV0byBtZDpoLWF1dG8nO1xuICB9XG5cbiAgZ2V0Q29sb3JGb3JUaGVUYWJDaGFuZ2VkKHRhYjogYW55KSB7XG4gICAgbGV0IHRhYkVkaXRlZENvbG9yID0gJyMwMDAwMDAnO1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKHRhYikgJiYgdGhpcy5vcHRpb25zLmZvcm1TdGF0ZT8uc2hvd1ZhbGlkYXRpb25FcnJvcikge1xuICAgICAgdGFiRWRpdGVkQ29sb3IgPSAnI2ZmMDAwMCc7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmZvcm1TdGF0ZT8uZWRpdGVkVGFic1N0YXR1cyAmJiB0aGlzLm9wdGlvbnM/LmZvcm1TdGF0ZT8uZWRpdGVkVGFic1N0YXR1c1t0YWI/LmtleV0pIHtcbiAgICAgIHRhYkVkaXRlZENvbG9yID0gJyNmZjAwMDAnXG4gICAgfVxuICAgIHJldHVybiB0YWJFZGl0ZWRDb2xvcjtcbiAgfVxuXG4gIGlzVGFiRGF0YUNoYW5nZWQoc3RlcDogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGlzVGFiQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmZvcm1TdGF0ZT8uZWRpdGVkVGFic1N0YXR1cyAmJiB0aGlzLm9wdGlvbnM/LmZvcm1TdGF0ZT8uZWRpdGVkVGFic1N0YXR1c1tzdGVwPy5rZXldKSB7XG4gICAgICBpc1RhYkNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNUYWJDaGFuZ2VkO1xuICB9XG59XG4iXX0=