@qbs-origin/origin-form 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/action-step-handler.mjs +163 -0
  3. package/esm2022/lib/auth-client.service.mjs +69 -0
  4. package/esm2022/lib/enums/label.keys.mjs +721 -0
  5. package/esm2022/lib/form-css.helper.mjs +367 -0
  6. package/esm2022/lib/formly/baseFormlyControlComponent.mjs +52 -0
  7. package/esm2022/lib/formly/baseFormlyStepComponent.mjs +59 -0
  8. package/esm2022/lib/formly/custom-section-separator.component.mjs +32 -0
  9. package/esm2022/lib/formly/form-section-separator.component.mjs +36 -0
  10. package/esm2022/lib/formly/formly-action.mjs +56 -0
  11. package/esm2022/lib/formly/formly-checkbox/formly-checkbox.component.mjs +52 -0
  12. package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +261 -0
  13. package/esm2022/lib/formly/formly-download-documents/formly-download-documents.component.mjs +126 -0
  14. package/esm2022/lib/formly/formly-enrol-card/formly-enrol-card.component.mjs +120 -0
  15. package/esm2022/lib/formly/formly-field-stepper/formly-field-stepper.component.mjs +762 -0
  16. package/esm2022/lib/formly/formly-generate-documents/formly-generate-documents.component.mjs +57 -0
  17. package/esm2022/lib/formly/formly-identification.component.mjs +84 -0
  18. package/esm2022/lib/formly/formly-open-banking/formly-open-banking.component.mjs +590 -0
  19. package/esm2022/lib/formly/formly-paragraph/formly-paragraph.component.mjs +35 -0
  20. package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +49 -0
  21. package/esm2022/lib/formly/formly-row-fille.mjs +12 -0
  22. package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +284 -0
  23. package/esm2022/lib/formly/formly-sign/formly-sign.component.mjs +173 -0
  24. package/esm2022/lib/formly/formly-upload-documents/formly-upload-documents.component.mjs +198 -0
  25. package/esm2022/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.mjs +124 -0
  26. package/esm2022/lib/formly/formly-view-documents/formly-view-documents.component.mjs +245 -0
  27. package/esm2022/lib/formly/formly-view-offers/formly-view-offers.component.mjs +160 -0
  28. package/esm2022/lib/model-population.helper.mjs +265 -0
  29. package/esm2022/lib/models/application-type.model.mjs +12 -0
  30. package/esm2022/lib/models/application.model.mjs +30 -0
  31. package/esm2022/lib/models/auth/users.model.mjs +2 -0
  32. package/esm2022/lib/models/dictionary.model.mjs +20 -0
  33. package/esm2022/lib/models/flux.model.mjs +105 -0
  34. package/esm2022/lib/models/forms.model.mjs +572 -0
  35. package/esm2022/lib/models/label-info.model.mjs +2 -0
  36. package/esm2022/lib/models/label.model.mjs +2 -0
  37. package/esm2022/lib/models/language.model.mjs +3 -0
  38. package/esm2022/lib/models/list.model.mjs +2 -0
  39. package/esm2022/lib/models/partner.model.mjs +3 -0
  40. package/esm2022/lib/models/treeview.model.mjs +15 -0
  41. package/esm2022/lib/origin-form-auth.service.mjs +40 -0
  42. package/esm2022/lib/origin-form-config.model.mjs +2 -0
  43. package/esm2022/lib/origin-form-token.interceptor.mjs +35 -0
  44. package/esm2022/lib/origin-form.component.mjs +2391 -0
  45. package/esm2022/lib/origin-form.module.mjs +479 -0
  46. package/esm2022/lib/origin-form.service.mjs +14 -0
  47. package/esm2022/lib/others/check-list.database.mjs +55 -0
  48. package/esm2022/lib/others/config-service.mjs +42 -0
  49. package/esm2022/lib/others/dictionary-label-info.mjs +3 -0
  50. package/esm2022/lib/others/environment-type.mjs +21 -0
  51. package/esm2022/lib/others/external-link.directive.mjs +49 -0
  52. package/esm2022/lib/others/flux-helper.mjs +1397 -0
  53. package/esm2022/lib/others/picker.component.mjs +119 -0
  54. package/esm2022/lib/others/translation.pipe.mjs +21 -0
  55. package/esm2022/lib/others/translations-helper.mjs +258 -0
  56. package/esm2022/lib/others/utils.mjs +272 -0
  57. package/esm2022/lib/services/applicationData.service.mjs +145 -0
  58. package/esm2022/lib/services/auth-http.service.mjs +80 -0
  59. package/esm2022/lib/services/dialog.service.mjs +56 -0
  60. package/esm2022/lib/services/dictionary.service.mjs +198 -0
  61. package/esm2022/lib/services/forms.service.mjs +47 -0
  62. package/esm2022/lib/services/labels.service.mjs +29 -0
  63. package/esm2022/lib/services/language.service.mjs +24 -0
  64. package/esm2022/lib/services/open-banking.service.mjs +194 -0
  65. package/esm2022/lib/services/origin-form-signalr-handler.service.mjs +107 -0
  66. package/esm2022/lib/services/origin-form-signalr.service.mjs +105 -0
  67. package/esm2022/lib/services/otp.service.mjs +28 -0
  68. package/esm2022/lib/services/proxy.service.mjs +79 -0
  69. package/esm2022/lib/services/scroll-to-error.service.mjs +369 -0
  70. package/esm2022/lib/services/translation.service.mjs +27 -0
  71. package/esm2022/lib/shared-components/confirmation.component.mjs +34 -0
  72. package/esm2022/lib/shared-components/dictionaries-tree.component.mjs +301 -0
  73. package/esm2022/lib/shared-components/grid.component.mjs +241 -0
  74. package/esm2022/lib/shared-components/treeview/treeview.component.mjs +224 -0
  75. package/esm2022/lib/theme-css.mjs +2254 -0
  76. package/esm2022/lib/theme-injector.service.mjs +26 -0
  77. package/esm2022/public-api.mjs +4 -0
  78. package/esm2022/qbs-origin-origin-form.mjs +5 -0
  79. package/fesm2022/qbs-origin-origin-form.mjs +15215 -0
  80. package/fesm2022/qbs-origin-origin-form.mjs.map +1 -0
  81. package/index.d.ts +5 -0
  82. package/lib/action-step-handler.d.ts +49 -0
  83. package/lib/auth-client.service.d.ts +17 -0
  84. package/lib/enums/label.keys.d.ts +720 -0
  85. package/lib/form-css.helper.d.ts +28 -0
  86. package/lib/formly/baseFormlyControlComponent.d.ts +25 -0
  87. package/lib/formly/baseFormlyStepComponent.d.ts +29 -0
  88. package/lib/formly/custom-section-separator.component.d.ts +6 -0
  89. package/lib/formly/form-section-separator.component.d.ts +10 -0
  90. package/lib/formly/formly-action.d.ts +13 -0
  91. package/lib/formly/formly-checkbox/formly-checkbox.component.d.ts +15 -0
  92. package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +45 -0
  93. package/lib/formly/formly-download-documents/formly-download-documents.component.d.ts +22 -0
  94. package/lib/formly/formly-enrol-card/formly-enrol-card.component.d.ts +114 -0
  95. package/lib/formly/formly-field-stepper/formly-field-stepper.component.d.ts +79 -0
  96. package/lib/formly/formly-generate-documents/formly-generate-documents.component.d.ts +17 -0
  97. package/lib/formly/formly-identification.component.d.ts +19 -0
  98. package/lib/formly/formly-open-banking/formly-open-banking.component.d.ts +119 -0
  99. package/lib/formly/formly-paragraph/formly-paragraph.component.d.ts +10 -0
  100. package/lib/formly/formly-radio/formly-radio-component.d.ts +15 -0
  101. package/lib/formly/formly-row-fille.d.ts +6 -0
  102. package/lib/formly/formly-scan-id/formly-scan-id.component.d.ts +41 -0
  103. package/lib/formly/formly-sign/formly-sign.component.d.ts +36 -0
  104. package/lib/formly/formly-upload-documents/formly-upload-documents.component.d.ts +25 -0
  105. package/lib/formly/formly-validate-contact-info/formly-validate-contact-info.component.d.ts +79 -0
  106. package/lib/formly/formly-view-documents/formly-view-documents.component.d.ts +33 -0
  107. package/lib/formly/formly-view-offers/formly-view-offers.component.d.ts +23 -0
  108. package/lib/model-population.helper.d.ts +8 -0
  109. package/lib/models/application-type.model.d.ts +27 -0
  110. package/lib/models/application.model.d.ts +107 -0
  111. package/lib/models/auth/users.model.d.ts +20 -0
  112. package/lib/models/dictionary.model.d.ts +77 -0
  113. package/lib/models/flux.model.d.ts +101 -0
  114. package/lib/models/forms.model.d.ts +504 -0
  115. package/lib/models/label-info.model.d.ts +10 -0
  116. package/lib/models/label.model.d.ts +4 -0
  117. package/lib/models/language.model.d.ts +5 -0
  118. package/lib/models/list.model.d.ts +8 -0
  119. package/lib/models/partner.model.d.ts +12 -0
  120. package/lib/models/treeview.model.d.ts +17 -0
  121. package/lib/origin-form-auth.service.d.ts +15 -0
  122. package/lib/origin-form-config.model.d.ts +12 -0
  123. package/lib/origin-form-token.interceptor.d.ts +12 -0
  124. package/lib/origin-form.component.d.ts +231 -0
  125. package/lib/origin-form.module.d.ts +84 -0
  126. package/lib/origin-form.service.d.ts +6 -0
  127. package/lib/others/check-list.database.d.ts +16 -0
  128. package/lib/others/config-service.d.ts +22 -0
  129. package/lib/others/dictionary-label-info.d.ts +6 -0
  130. package/lib/others/environment-type.d.ts +8 -0
  131. package/lib/others/external-link.directive.d.ts +12 -0
  132. package/lib/others/flux-helper.d.ts +115 -0
  133. package/lib/others/picker.component.d.ts +36 -0
  134. package/lib/others/translation.pipe.d.ts +10 -0
  135. package/lib/others/translations-helper.d.ts +31 -0
  136. package/lib/others/utils.d.ts +37 -0
  137. package/lib/services/applicationData.service.d.ts +35 -0
  138. package/lib/services/auth-http.service.d.ts +21 -0
  139. package/lib/services/dialog.service.d.ts +20 -0
  140. package/lib/services/dictionary.service.d.ts +89 -0
  141. package/lib/services/forms.service.d.ts +17 -0
  142. package/lib/services/labels.service.d.ts +13 -0
  143. package/lib/services/language.service.d.ts +14 -0
  144. package/lib/services/open-banking.service.d.ts +137 -0
  145. package/lib/services/origin-form-signalr-handler.service.d.ts +29 -0
  146. package/lib/services/origin-form-signalr.service.d.ts +24 -0
  147. package/lib/services/otp.service.d.ts +22 -0
  148. package/lib/services/proxy.service.d.ts +29 -0
  149. package/lib/services/scroll-to-error.service.d.ts +54 -0
  150. package/lib/services/translation.service.d.ts +10 -0
  151. package/lib/shared-components/confirmation.component.d.ts +77 -0
  152. package/lib/shared-components/dictionaries-tree.component.d.ts +51 -0
  153. package/lib/shared-components/grid.component.d.ts +138 -0
  154. package/lib/shared-components/treeview/treeview.component.d.ts +121 -0
  155. package/lib/theme-css.d.ts +2 -0
  156. package/lib/theme-injector.service.d.ts +8 -0
  157. package/package.json +42 -0
  158. package/public-api.d.ts +3 -0
  159. package/schematics-compiled/collection.json +10 -0
  160. package/schematics-compiled/ng-add/index.d.ts +2 -0
  161. package/schematics-compiled/ng-add/index.js +67 -0
  162. package/schematics-compiled/ng-add/index.js.map +1 -0
  163. package/schematics-compiled/ng-add/schema.json +8 -0
  164. package/src/lib/assets/fonts/Figtree-Bold.ttf +0 -0
  165. package/src/lib/assets/fonts/Figtree-Light.ttf +0 -0
  166. package/src/lib/assets/fonts/Figtree-Regular.ttf +0 -0
  167. package/src/lib/assets/fonts/Sora-ExtraBold.ttf +0 -0
  168. package/src/lib/assets/fonts/Sora-Light.ttf +0 -0
  169. package/src/lib/assets/fonts/Sora-Regular.ttf +0 -0
  170. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff +0 -0
  171. package/src/lib/assets/fonts/ttrounds-bold-webfont.woff2 +0 -0
  172. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff +0 -0
  173. package/src/lib/assets/fonts/ttrounds-regular-webfont.woff2 +0 -0
  174. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff +0 -0
  175. package/src/lib/assets/fonts/ttrounds-thin-webfont.woff2 +0 -0
  176. package/src/lib/assets/images/flag/icon-flag-de.svg +10 -0
  177. package/src/lib/assets/images/flag/icon-flag-en.svg +1 -0
  178. package/src/lib/assets/images/flag/icon-flag-es.svg +11 -0
  179. package/src/lib/assets/images/flag/icon-flag-fr.svg +1 -0
  180. package/src/lib/assets/images/flag/icon-flag-ro.svg +11 -0
  181. package/src/lib/assets/images/flag/origin-form/new-id-card.png +0 -0
  182. package/src/lib/assets/images/flag/origin-form/old-id-card.png +0 -0
@@ -0,0 +1,1397 @@
1
+ import { FluxType, StepControlType, ManualInputControlType, SectionType, DimensionType, } from '../models/forms.model';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import { Injectable } from '@angular/core';
4
+ import { LabelKeys } from '../enums/label.keys';
5
+ import { TranslationsHelper } from './translations-helper';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "./translation.pipe";
8
+ export class FluxHelper {
9
+ constructor(translate) {
10
+ this.translate = translate;
11
+ }
12
+ /**
13
+ * Generate unique V1-compatible identifier
14
+ */
15
+ generateUniqueId(prefix) {
16
+ // Match FluxV1 pattern: prefix_UUID
17
+ const uuid = uuidv4();
18
+ return prefix ? uuid : uuid;
19
+ }
20
+ /**
21
+ * Create translations only for supported languages
22
+ */
23
+ createTranslationsIfSupported(supportedLanguages, values) {
24
+ let list = [];
25
+ values.forEach((v) => {
26
+ const langId = supportedLanguages.find((lang) => lang.iso === v.iso)?.id;
27
+ if (langId && langId > 0) {
28
+ list.push({
29
+ languageId: langId,
30
+ languageIso: v.iso,
31
+ value: v.value,
32
+ });
33
+ }
34
+ });
35
+ return list;
36
+ }
37
+ /**
38
+ * Create a manual input control
39
+ */
40
+ createManualInputControl(name, identifier, type, isMandatory = true, dimension = 50) {
41
+ return {
42
+ identifier,
43
+ type: StepControlType.ManualInput,
44
+ title: name,
45
+ canEdit: false,
46
+ canDepend: false,
47
+ isOnlyForConfig: false,
48
+ isPresentationControl: false,
49
+ dependentDictionary: {
50
+ isDictionaryDependent: false,
51
+ dictionaryControlIdentifier: '',
52
+ dependentValueIds: [],
53
+ },
54
+ isMandatory: false,
55
+ translations: [],
56
+ dimension,
57
+ dimensionType: DimensionType.Percentage,
58
+ autoDimension: false,
59
+ specificControlData: {
60
+ type,
61
+ isMandatory,
62
+ allowedCharacters: '',
63
+ maxCharacters: type === ManualInputControlType.Text ? 50 : undefined,
64
+ minValue: type === ManualInputControlType.Numeric ? 0 : undefined,
65
+ maxValue: type === ManualInputControlType.Numeric ? 9999999 : undefined,
66
+ allowOnlyFuture: false,
67
+ allowOnlyPast: false,
68
+ isSimpleValidation: false,
69
+ isApiValidation: false,
70
+ },
71
+ errorsTranslations: [],
72
+ };
73
+ }
74
+ /**
75
+ * Create a paragraph control
76
+ */
77
+ createParagraphControl(text, identifier, showValidations = false, isMandatory = false) {
78
+ return {
79
+ identifier,
80
+ type: StepControlType.Paragraph,
81
+ title: text,
82
+ canEdit: false,
83
+ canDepend: false,
84
+ isMandatory: false,
85
+ isPresentationControl: false,
86
+ dependentDictionary: {
87
+ isDictionaryDependent: false,
88
+ dictionaryControlIdentifier: '',
89
+ dependentValueIds: [],
90
+ },
91
+ translations: [],
92
+ isOnlyForConfig: false,
93
+ dimension: 100,
94
+ dimensionType: DimensionType.Percentage,
95
+ autoDimension: true,
96
+ specificControlData: {
97
+ descriptionTranslations: [],
98
+ showValidations,
99
+ isMandatory,
100
+ isMandatoryTranslations: [],
101
+ },
102
+ errorsTranslations: [],
103
+ };
104
+ }
105
+ /**
106
+ * Create a new row control
107
+ */
108
+ createNewRowControl() {
109
+ return {
110
+ identifier: this.generateUniqueId('newrow'),
111
+ type: StepControlType.NewRow,
112
+ title: 'New Row',
113
+ canEdit: false,
114
+ canDepend: false,
115
+ isOnlyForConfig: false,
116
+ isPresentationControl: false,
117
+ dependentDictionary: {
118
+ isDictionaryDependent: false,
119
+ dictionaryControlIdentifier: '',
120
+ dependentValueIds: [],
121
+ },
122
+ isMandatory: false,
123
+ translations: [],
124
+ dimension: 100,
125
+ dimensionType: DimensionType.Percentage,
126
+ autoDimension: true,
127
+ specificControlData: {},
128
+ errorsTranslations: [],
129
+ };
130
+ }
131
+ /**
132
+ * Create KYC step with all default sections
133
+ */
134
+ createKycStep(supportedLanguages) {
135
+ const stepName = this.translate.transform(LabelKeys.flux.identification);
136
+ const step = {
137
+ identifier: this.generateUniqueId(`${stepName} - KYC`),
138
+ name: stepName,
139
+ type: FluxType.Kyc,
140
+ sections: [],
141
+ isVisible: true,
142
+ config: {},
143
+ translations: TranslationsHelper.createKycTranslations(supportedLanguages),
144
+ panelOpenState: true,
145
+ buttons: [],
146
+ dependentDictionary: {
147
+ isDictionaryDependent: false,
148
+ dictionaryControlIdentifier: '',
149
+ dependentValueIds: [],
150
+ },
151
+ errorsTranslations: [],
152
+ hasNameAndDescription: true,
153
+ canDepend: true,
154
+ collapsed: false,
155
+ };
156
+ // Section 1: KYC Status
157
+ const statusSection = {
158
+ title: this.translate.transform(LabelKeys.flux.stepInfo.kycStatusTitle),
159
+ type: SectionType.Presentation,
160
+ controls: [
161
+ {
162
+ type: StepControlType.CheckBox,
163
+ identifier: 'IdentityValidationStatus',
164
+ title: this.translate.transform(LabelKeys.flux.stepInfo.validationStatus),
165
+ },
166
+ ],
167
+ identifier: this.generateUniqueId(this.translate.transform(LabelKeys.flux.stepInfo.kycStatusTitle)),
168
+ };
169
+ // Section 2: Personal Information
170
+ const personData = [
171
+ 'CNP',
172
+ 'IDSeries',
173
+ 'IDNumber',
174
+ 'FirstName',
175
+ 'LastName',
176
+ 'Nationality',
177
+ 'IDExpirationDate',
178
+ 'IDValidity',
179
+ 'Address',
180
+ 'PlaceOfBirth',
181
+ 'DateOfBirth',
182
+ ];
183
+ const personControls = personData.map((item) => {
184
+ return {
185
+ type: StepControlType.ManualInput,
186
+ identifier: uuidv4(),
187
+ title: item,
188
+ specificControlData: {
189
+ type: ManualInputControlType.Text,
190
+ },
191
+ };
192
+ });
193
+ const personalSection = {
194
+ title: this.translate.transform(LabelKeys.flux.stepInfo.kycPersonTitle),
195
+ type: SectionType.Presentation,
196
+ controls: personControls,
197
+ identifier: this.generateUniqueId(this.translate.transform(LabelKeys.flux.stepInfo.kycPersonTitle)),
198
+ };
199
+ // Section 3: Validation Data
200
+ const validationSection = {
201
+ identifier: this.generateUniqueId(this.translate.transform(LabelKeys.flux.stepInfo.kycValidationTitle)),
202
+ title: this.translate.transform(LabelKeys.flux.stepInfo.kycValidationTitle),
203
+ controls: [
204
+ {
205
+ canEdit: true,
206
+ canDepend: false,
207
+ isOnlyForConfig: false,
208
+ type: StepControlType.ManualInput,
209
+ identifier: 'ClientPhoneNumber',
210
+ title: 'ClientPhoneNumber',
211
+ specificControlData: {
212
+ type: ManualInputControlType.Phone,
213
+ },
214
+ },
215
+ {
216
+ canEdit: true,
217
+ canDepend: false,
218
+ isOnlyForConfig: false,
219
+ type: StepControlType.ManualInput,
220
+ identifier: 'IdSnapshot',
221
+ title: 'IdSnapshot',
222
+ specificControlData: {
223
+ type: ManualInputControlType.Text,
224
+ },
225
+ },
226
+ {
227
+ canEdit: true,
228
+ canDepend: false,
229
+ isOnlyForConfig: false,
230
+ type: StepControlType.ManualInput,
231
+ identifier: 'FaceSnapshot',
232
+ title: 'FaceSnapshot',
233
+ specificControlData: {
234
+ type: ManualInputControlType.Text,
235
+ },
236
+ },
237
+ ],
238
+ canDepend: true,
239
+ };
240
+ // Section 4: Address Information
241
+ const addressData = [
242
+ 'DistrictName',
243
+ 'CityName',
244
+ 'StreetName',
245
+ 'StreetNo',
246
+ 'FlatNo',
247
+ 'StairNo',
248
+ 'FloorNo',
249
+ 'ApartmentNo',
250
+ ];
251
+ const addressControls = addressData.map((item) => {
252
+ return {
253
+ type: StepControlType.ManualInput,
254
+ identifier: uuidv4(),
255
+ title: item,
256
+ specificControlData: {
257
+ type: ManualInputControlType.Text,
258
+ },
259
+ };
260
+ });
261
+ const addressSection = {
262
+ identifier: this.generateUniqueId(this.translate.transform(LabelKeys.flux.stepInfo.kycAddressTitle)),
263
+ title: this.translate.transform(LabelKeys.flux.stepInfo.kycAddressTitle),
264
+ type: SectionType.Presentation,
265
+ controls: addressControls,
266
+ canDepend: true,
267
+ };
268
+ step.sections = [
269
+ statusSection,
270
+ personalSection,
271
+ validationSection,
272
+ addressSection,
273
+ ];
274
+ return step;
275
+ }
276
+ /**
277
+ * Create Email Verification step
278
+ */
279
+ createCheckEmailStep(supportedLanguages) {
280
+ const step = {
281
+ identifier: this.generateUniqueId('step'),
282
+ name: this.translate.transform(LabelKeys.flux.verifyEmail),
283
+ type: FluxType.Email,
284
+ sections: [],
285
+ isVisible: true,
286
+ config: {
287
+ collected: false,
288
+ componentCollected: '',
289
+ },
290
+ translations: TranslationsHelper.createCheckEmailTranslations(supportedLanguages),
291
+ panelOpenState: true,
292
+ buttons: [],
293
+ dependentDictionary: {
294
+ isDictionaryDependent: false,
295
+ dictionaryControlIdentifier: '',
296
+ dependentValueIds: [],
297
+ },
298
+ errorsTranslations: [],
299
+ hasNameAndDescription: true,
300
+ canDepend: true,
301
+ collapsed: false,
302
+ };
303
+ // Add email verification section
304
+ const section = {
305
+ identifier: `Sistem - Email_${this.generateUniqueId('sec')}`,
306
+ title: 'Sistem - Email',
307
+ type: SectionType.Presentation,
308
+ controls: [
309
+ {
310
+ canEdit: true,
311
+ canDepend: false,
312
+ isOnlyForConfig: false,
313
+ type: StepControlType.ManualInput,
314
+ identifier: 'validated-email',
315
+ title: 'Email Valid',
316
+ specificControlData: {
317
+ type: ManualInputControlType.Email,
318
+ },
319
+ },
320
+ ],
321
+ canDepend: true,
322
+ };
323
+ step.sections = [section];
324
+ return step;
325
+ }
326
+ /**
327
+ * Create Phone Verification step
328
+ */
329
+ createCheckPhoneStep(supportedLanguages) {
330
+ const step = {
331
+ identifier: this.generateUniqueId('step'),
332
+ name: this.translate.transform(LabelKeys.flux.verifyPhone),
333
+ type: FluxType.Phone,
334
+ sections: [],
335
+ isVisible: true,
336
+ config: {
337
+ collected: false,
338
+ componentCollected: '',
339
+ },
340
+ translations: TranslationsHelper.createCheckPhoneTranslations(supportedLanguages),
341
+ panelOpenState: true,
342
+ buttons: [],
343
+ dependentDictionary: {
344
+ isDictionaryDependent: false,
345
+ dictionaryControlIdentifier: '',
346
+ dependentValueIds: [],
347
+ },
348
+ errorsTranslations: [],
349
+ hasNameAndDescription: true,
350
+ canDepend: true,
351
+ collapsed: false,
352
+ };
353
+ // Add phone verification section
354
+ const section = {
355
+ identifier: `Sistem - Tel_${this.generateUniqueId('sec')}`,
356
+ title: 'Sistem - Tel',
357
+ type: SectionType.Presentation,
358
+ controls: [
359
+ {
360
+ canEdit: true,
361
+ canDepend: false,
362
+ isOnlyForConfig: false,
363
+ type: StepControlType.ManualInput,
364
+ identifier: 'validated-phone',
365
+ title: 'Nr tel Valid',
366
+ specificControlData: {
367
+ type: ManualInputControlType.Phone,
368
+ },
369
+ },
370
+ ],
371
+ canDepend: true,
372
+ };
373
+ step.sections = [section];
374
+ return step;
375
+ }
376
+ /**
377
+ * Create ID Scan step
378
+ */
379
+ createScanStep(supportedLanguages) {
380
+ const step = {
381
+ identifier: this.generateUniqueId('step'),
382
+ name: this.translate.transform(LabelKeys.flux.idScan),
383
+ type: FluxType.IdScan,
384
+ sections: [],
385
+ isVisible: true,
386
+ config: {
387
+ showUploadFileButton: true,
388
+ showTakePictureButton: true,
389
+ fileMaxSize: 5000,
390
+ fileFormats: '*.jpg,*.png',
391
+ },
392
+ translations: TranslationsHelper.createIdScanTranslations(supportedLanguages),
393
+ panelOpenState: true,
394
+ buttons: [],
395
+ dependentDictionary: {
396
+ isDictionaryDependent: false,
397
+ dictionaryControlIdentifier: '',
398
+ dependentValueIds: [],
399
+ },
400
+ errorsTranslations: [
401
+ {
402
+ code: 'invalidStatus',
403
+ translations: this.createTranslationsIfSupported(supportedLanguages, [
404
+ { iso: 'en', value: 'Invalid status response' },
405
+ { iso: 'ro', value: 'Raspuns status invalid' },
406
+ ]),
407
+ },
408
+ {
409
+ code: 'invalidType',
410
+ translations: this.createTranslationsIfSupported(supportedLanguages, [
411
+ { iso: 'en', value: 'Invalid type. Allowed formats are {formats}' },
412
+ { iso: 'ro', value: 'Tip invalid. Formatul permis este {formats}' },
413
+ ]),
414
+ },
415
+ {
416
+ code: 'maxSize',
417
+ translations: this.createTranslationsIfSupported(supportedLanguages, [
418
+ {
419
+ iso: 'en',
420
+ value: 'The selected file is too big. Max allowed size is {size}',
421
+ },
422
+ {
423
+ iso: 'ro',
424
+ value: 'Fișierul selectat este prea mare. Dimensiunea maximă este {size}',
425
+ },
426
+ ]),
427
+ },
428
+ {
429
+ code: 'frontId',
430
+ translations: this.createTranslationsIfSupported(supportedLanguages, [
431
+ {
432
+ iso: 'en',
433
+ value: 'Please upload the front photo of your ID card.',
434
+ },
435
+ {
436
+ iso: 'ro',
437
+ value: 'Vă rugăm să urcați partea din față a documentului de identitate.',
438
+ },
439
+ ]),
440
+ },
441
+ {
442
+ code: 'backId',
443
+ translations: this.createTranslationsIfSupported(supportedLanguages, [
444
+ {
445
+ iso: 'en',
446
+ value: 'Please upload the back photo of your ID card.',
447
+ },
448
+ {
449
+ iso: 'ro',
450
+ value: 'Vă rugăm să urcați partea din spate a documentului de identitate.',
451
+ },
452
+ ]),
453
+ },
454
+ ],
455
+ hasNameAndDescription: true,
456
+ canDepend: true,
457
+ collapsed: false,
458
+ };
459
+ // Match V1 ID Scan sections exactly
460
+ // Status section
461
+ const statusSection = {
462
+ identifier: this.generateUniqueId('ID SCAN Status'),
463
+ title: 'ID SCAN Status',
464
+ type: SectionType.Presentation,
465
+ controls: [
466
+ {
467
+ type: StepControlType.CheckBox,
468
+ identifier: this.generateUniqueId('ID SCAN Validation Status'),
469
+ title: 'ID SCAN Validation Status',
470
+ },
471
+ ],
472
+ };
473
+ // Person data section
474
+ const personData = [
475
+ 'CNP',
476
+ 'IDSeries',
477
+ 'IDNumber',
478
+ 'FirstName',
479
+ 'LastName',
480
+ 'Nationality',
481
+ 'IDExpirationDate',
482
+ 'IDValidity',
483
+ 'Address',
484
+ 'PlaceOfBirth',
485
+ ];
486
+ const personControls = personData.map((item) => {
487
+ return {
488
+ type: StepControlType.ManualInput,
489
+ identifier: this.generateUniqueId(item),
490
+ title: item,
491
+ specificControlData: {
492
+ type: ManualInputControlType.Text,
493
+ },
494
+ };
495
+ });
496
+ const personSection = {
497
+ identifier: this.generateUniqueId('ID SCAN Persoana'),
498
+ title: 'ID SCAN Persoana',
499
+ type: SectionType.Presentation,
500
+ controls: personControls,
501
+ };
502
+ step.sections = [statusSection, personSection];
503
+ return step;
504
+ }
505
+ /**
506
+ * Create Sign step
507
+ */
508
+ createSignStep(supportedLanguages) {
509
+ const step = {
510
+ identifier: this.generateUniqueId('step'),
511
+ name: this.translate.transform(LabelKeys.flux.sign),
512
+ type: FluxType.Sign,
513
+ sections: [],
514
+ isVisible: true,
515
+ config: {
516
+ signatureType: 'Electronic',
517
+ showConfirm: true,
518
+ companySign: false,
519
+ firstNameCollected: '',
520
+ lastNameCollected: '',
521
+ documents: [],
522
+ docsToSign: [],
523
+ },
524
+ translations: TranslationsHelper.createSignTranslations(supportedLanguages),
525
+ panelOpenState: true,
526
+ buttons: [],
527
+ dependentDictionary: {
528
+ isDictionaryDependent: false,
529
+ dictionaryControlIdentifier: '',
530
+ dependentValueIds: [],
531
+ },
532
+ errorsTranslations: [],
533
+ hasNameAndDescription: true,
534
+ canDepend: true,
535
+ collapsed: false,
536
+ };
537
+ // Add sign section
538
+ const section = {
539
+ identifier: this.generateUniqueId('sec'),
540
+ title: 'Document Signing',
541
+ type: SectionType.Presentation,
542
+ controls: [
543
+ this.createParagraphControl('Please sign the following documents', 'sign-instruction', false, false),
544
+ {
545
+ identifier: this.generateUniqueId('comp'),
546
+ type: StepControlType.ViewDocuments,
547
+ title: 'Documents to Sign',
548
+ canEdit: false,
549
+ canDepend: false,
550
+ isOnlyForConfig: false,
551
+ dimension: 100,
552
+ dimensionType: DimensionType.Percentage,
553
+ autoDimension: true,
554
+ isPresentationControl: false,
555
+ specificControlData: {
556
+ documents: [],
557
+ },
558
+ errorsTranslations: [],
559
+ dependentDictionary: {
560
+ isDictionaryDependent: false,
561
+ dictionaryControlIdentifier: '',
562
+ dependentValueIds: [],
563
+ },
564
+ isMandatory: false,
565
+ translations: [],
566
+ },
567
+ ],
568
+ presentationControls: [],
569
+ isNavigationSection: false,
570
+ canDepend: false,
571
+ translations: [],
572
+ collapsed: false,
573
+ showSectionTitle: true,
574
+ showSectionSeparator: true,
575
+ };
576
+ step.sections = [section];
577
+ return step;
578
+ }
579
+ /**
580
+ * Create Generate Documents step
581
+ */
582
+ createGenerateDocumentsStep(supportedLanguages) {
583
+ const step = {
584
+ identifier: this.generateUniqueId('step'),
585
+ name: this.translate.transform(LabelKeys.flux.generateDocument),
586
+ type: FluxType.GenerateDocument,
587
+ sections: [],
588
+ isVisible: true,
589
+ config: {
590
+ generatedDocuments: [],
591
+ },
592
+ translations: TranslationsHelper.createGenerateDocumentsTranslations(supportedLanguages),
593
+ panelOpenState: true,
594
+ buttons: [],
595
+ dependentDictionary: {
596
+ isDictionaryDependent: false,
597
+ dictionaryControlIdentifier: '',
598
+ dependentValueIds: [],
599
+ },
600
+ errorsTranslations: [],
601
+ hasNameAndDescription: true,
602
+ canDepend: true,
603
+ collapsed: false,
604
+ };
605
+ // No default sections for generate documents
606
+ return step;
607
+ }
608
+ /**
609
+ * Create Pause step
610
+ */
611
+ createPauseStep(supportedLanguages) {
612
+ const stepName = this.translate.transform(LabelKeys.flux.pause);
613
+ const step = {
614
+ identifier: this.generateUniqueId(`${stepName} - Pause`),
615
+ name: stepName,
616
+ type: FluxType.Pause,
617
+ sections: [],
618
+ isVisible: true,
619
+ config: {},
620
+ translations: TranslationsHelper.createPauseTranslations(supportedLanguages),
621
+ panelOpenState: true,
622
+ buttons: [],
623
+ dependentDictionary: {
624
+ isDictionaryDependent: false,
625
+ dictionaryControlIdentifier: '',
626
+ dependentValueIds: [],
627
+ },
628
+ errorsTranslations: [],
629
+ hasNameAndDescription: true,
630
+ canDepend: true,
631
+ collapsed: false,
632
+ };
633
+ // Add pause message section
634
+ const section = {
635
+ identifier: this.generateUniqueId('sec'),
636
+ title: 'Flow Paused',
637
+ type: SectionType.Presentation,
638
+ controls: [
639
+ this.createParagraphControl('The workflow has been paused', 'pause-message', false, false),
640
+ ],
641
+ presentationControls: [],
642
+ isNavigationSection: false,
643
+ canDepend: false,
644
+ translations: [],
645
+ collapsed: false,
646
+ showSectionTitle: true,
647
+ showSectionSeparator: true,
648
+ };
649
+ step.sections = [section];
650
+ return step;
651
+ }
652
+ /**
653
+ * Create Action step
654
+ */
655
+ createActionStep(supportedLanguages) {
656
+ const step = {
657
+ identifier: this.generateUniqueId('step'),
658
+ name: this.translate.transform(LabelKeys.flux.action),
659
+ type: FluxType.Action,
660
+ sections: [],
661
+ isVisible: true,
662
+ config: {
663
+ apiMethod: '',
664
+ apiPartners: [],
665
+ },
666
+ translations: TranslationsHelper.createActionTranslations(supportedLanguages),
667
+ panelOpenState: true,
668
+ buttons: [],
669
+ dependentDictionary: {
670
+ isDictionaryDependent: false,
671
+ dictionaryControlIdentifier: '',
672
+ dependentValueIds: [],
673
+ },
674
+ errorsTranslations: [],
675
+ hasNameAndDescription: true,
676
+ canDepend: true,
677
+ collapsed: false,
678
+ };
679
+ // No default sections for action step
680
+ return step;
681
+ }
682
+ /**
683
+ * Create Status step with default section
684
+ */
685
+ createStatusStep(supportedLanguages) {
686
+ const step = {
687
+ identifier: this.generateUniqueId('step'),
688
+ name: this.translate.transform(LabelKeys.flux.status),
689
+ type: FluxType.Status,
690
+ sections: [],
691
+ isVisible: true,
692
+ config: {},
693
+ panelOpenState: true,
694
+ buttons: [],
695
+ translations: TranslationsHelper.createStatusTranslations(supportedLanguages),
696
+ dependentDictionary: {
697
+ isDictionaryDependent: false,
698
+ dictionaryControlIdentifier: '',
699
+ dependentValueIds: [],
700
+ },
701
+ errorsTranslations: [],
702
+ hasNameAndDescription: true,
703
+ canDepend: true,
704
+ collapsed: false,
705
+ };
706
+ // Add status selection section
707
+ const section = {
708
+ canDepend: true,
709
+ title: 'Status Sistem',
710
+ type: SectionType.Presentation,
711
+ controls: [
712
+ {
713
+ canEdit: true,
714
+ canDepend: false,
715
+ isOnlyForConfig: false,
716
+ type: StepControlType.NewRow,
717
+ identifier: 'select-status',
718
+ title: 'Flux',
719
+ specificControlData: {
720
+ type: ManualInputControlType.Text,
721
+ },
722
+ },
723
+ ],
724
+ identifier: `Status Sistem_${this.generateUniqueId('sec')}`,
725
+ };
726
+ step.sections = [section];
727
+ return step;
728
+ }
729
+ /**
730
+ * Create Upload Document step
731
+ */
732
+ createUploadDocumentStep(supportedLanguages) {
733
+ const step = {
734
+ identifier: this.generateUniqueId('step'),
735
+ name: this.translate.transform(LabelKeys.flux.uploadDocument),
736
+ type: FluxType.UploadDocument,
737
+ sections: [],
738
+ isVisible: true,
739
+ config: {},
740
+ panelOpenState: true,
741
+ buttons: [],
742
+ dependentDictionary: {
743
+ isDictionaryDependent: false,
744
+ dictionaryControlIdentifier: '',
745
+ dependentValueIds: [],
746
+ },
747
+ translations: [],
748
+ errorsTranslations: [],
749
+ hasNameAndDescription: true,
750
+ canDepend: true,
751
+ collapsed: false,
752
+ };
753
+ // Add upload section
754
+ const section = {
755
+ identifier: this.generateUniqueId('sec'),
756
+ title: 'Upload Documents',
757
+ type: SectionType.Collect,
758
+ controls: [
759
+ {
760
+ identifier: this.generateUniqueId('comp'),
761
+ type: StepControlType.UploadDocuments,
762
+ title: this.translate.transform(LabelKeys.flux.uploadDocument),
763
+ canEdit: false,
764
+ canDepend: false,
765
+ isOnlyForConfig: false,
766
+ isPresentationControl: false,
767
+ dimension: 100,
768
+ dimensionType: DimensionType.Percentage,
769
+ autoDimension: true,
770
+ specificControlData: {
771
+ documents: [],
772
+ fileMaxSize: 10000,
773
+ fileFormats: '*.pdf,*.jpg,*.png,*.doc,*.docx',
774
+ isMandatory: true,
775
+ },
776
+ errorsTranslations: [],
777
+ dependentDictionary: {
778
+ isDictionaryDependent: false,
779
+ dictionaryControlIdentifier: '',
780
+ dependentValueIds: [],
781
+ },
782
+ isMandatory: false,
783
+ translations: [],
784
+ },
785
+ ],
786
+ presentationControls: [],
787
+ isNavigationSection: false,
788
+ canDepend: false,
789
+ translations: [],
790
+ collapsed: false,
791
+ showSectionTitle: true,
792
+ showSectionSeparator: true,
793
+ };
794
+ step.sections = [section];
795
+ return step;
796
+ }
797
+ /**
798
+ * Create Download Document step
799
+ */
800
+ createDownloadDocumentStep(supportedLanguages) {
801
+ const step = {
802
+ identifier: this.generateUniqueId('step'),
803
+ name: this.translate.transform(LabelKeys.flux.downloadDocument),
804
+ type: FluxType.DownloadDocument,
805
+ sections: [],
806
+ isVisible: true,
807
+ config: {},
808
+ panelOpenState: true,
809
+ buttons: [],
810
+ dependentDictionary: {
811
+ isDictionaryDependent: false,
812
+ dictionaryControlIdentifier: '',
813
+ dependentValueIds: [],
814
+ },
815
+ translations: [],
816
+ errorsTranslations: [],
817
+ hasNameAndDescription: true,
818
+ canDepend: true,
819
+ collapsed: false,
820
+ };
821
+ // Add download section
822
+ const section = {
823
+ identifier: this.generateUniqueId('sec'),
824
+ title: 'Download Documents',
825
+ type: SectionType.Presentation,
826
+ controls: [
827
+ {
828
+ identifier: this.generateUniqueId('comp'),
829
+ type: StepControlType.DownloadDocuments,
830
+ title: this.translate.transform(LabelKeys.flux.downloadDocument),
831
+ canEdit: false,
832
+ canDepend: false,
833
+ isOnlyForConfig: false,
834
+ isPresentationControl: false,
835
+ dimension: 100,
836
+ dimensionType: DimensionType.Percentage,
837
+ autoDimension: true,
838
+ specificControlData: {
839
+ documents: [],
840
+ },
841
+ errorsTranslations: [],
842
+ dependentDictionary: {
843
+ isDictionaryDependent: false,
844
+ dictionaryControlIdentifier: '',
845
+ dependentValueIds: [],
846
+ },
847
+ isMandatory: false,
848
+ translations: [],
849
+ },
850
+ ],
851
+ presentationControls: [],
852
+ isNavigationSection: false,
853
+ canDepend: false,
854
+ translations: [],
855
+ collapsed: false,
856
+ showSectionTitle: true,
857
+ showSectionSeparator: true,
858
+ };
859
+ step.sections = [section];
860
+ return step;
861
+ }
862
+ /**
863
+ * Create View Document step
864
+ */
865
+ createViewDocumentStep(supportedLanguages) {
866
+ const step = {
867
+ identifier: this.generateUniqueId('step'),
868
+ name: this.translate.transform(LabelKeys.flux.viewDocument),
869
+ type: FluxType.ViewDocument,
870
+ sections: [],
871
+ isVisible: true,
872
+ config: {},
873
+ panelOpenState: true,
874
+ buttons: [],
875
+ dependentDictionary: {
876
+ isDictionaryDependent: false,
877
+ dictionaryControlIdentifier: '',
878
+ dependentValueIds: [],
879
+ },
880
+ translations: [],
881
+ errorsTranslations: [],
882
+ hasNameAndDescription: true,
883
+ canDepend: true,
884
+ collapsed: false,
885
+ };
886
+ // Add view section
887
+ const section = {
888
+ identifier: this.generateUniqueId('sec'),
889
+ title: 'View Documents',
890
+ type: SectionType.Presentation,
891
+ controls: [
892
+ {
893
+ identifier: this.generateUniqueId('comp'),
894
+ type: StepControlType.ViewDocuments,
895
+ title: this.translate.transform(LabelKeys.flux.viewDocument),
896
+ canEdit: false,
897
+ canDepend: false,
898
+ isOnlyForConfig: false,
899
+ isPresentationControl: false,
900
+ dimension: 100,
901
+ dimensionType: DimensionType.Percentage,
902
+ autoDimension: true,
903
+ specificControlData: {
904
+ documents: [],
905
+ },
906
+ errorsTranslations: [],
907
+ dependentDictionary: {
908
+ isDictionaryDependent: false,
909
+ dictionaryControlIdentifier: '',
910
+ dependentValueIds: [],
911
+ },
912
+ isMandatory: false,
913
+ translations: [],
914
+ },
915
+ ],
916
+ presentationControls: [],
917
+ isNavigationSection: false,
918
+ canDepend: false,
919
+ translations: [],
920
+ collapsed: false,
921
+ showSectionTitle: true,
922
+ showSectionSeparator: true,
923
+ };
924
+ step.sections = [section];
925
+ return step;
926
+ }
927
+ /**
928
+ * Create View Offer step
929
+ */
930
+ createViewOfferStep(supportedLanguages) {
931
+ const step = {
932
+ identifier: this.generateUniqueId('step'),
933
+ name: this.translate.transform(LabelKeys.flux.viewOffer),
934
+ type: FluxType.ViewOffer,
935
+ sections: [],
936
+ isVisible: true,
937
+ config: {},
938
+ panelOpenState: true,
939
+ buttons: [],
940
+ dependentDictionary: {
941
+ isDictionaryDependent: false,
942
+ dictionaryControlIdentifier: '',
943
+ dependentValueIds: [],
944
+ },
945
+ translations: TranslationsHelper.createViewOfferStepTranslations(supportedLanguages),
946
+ errorsTranslations: [],
947
+ hasNameAndDescription: true,
948
+ canDepend: true,
949
+ collapsed: false,
950
+ };
951
+ // No default sections for view offer
952
+ return step;
953
+ }
954
+ /**
955
+ * Create NETOPIA Payment step
956
+ */
957
+ createNetopiaStep(supportedLanguages) {
958
+ const stepName = this.translate.transform(LabelKeys.flux.netopia);
959
+ const step = {
960
+ identifier: this.generateUniqueId(`${stepName} - NETOPIA`),
961
+ name: stepName,
962
+ type: FluxType.NETOPIA,
963
+ sections: [],
964
+ isVisible: true,
965
+ config: {},
966
+ panelOpenState: true,
967
+ buttons: [],
968
+ dependentDictionary: {
969
+ isDictionaryDependent: false,
970
+ dictionaryControlIdentifier: '',
971
+ dependentValueIds: [],
972
+ },
973
+ translations: TranslationsHelper.createPaymentsTranslations(supportedLanguages),
974
+ errorsTranslations: [],
975
+ hasNameAndDescription: true,
976
+ canDepend: true,
977
+ collapsed: false,
978
+ };
979
+ const section = {
980
+ identifier: this.generateUniqueId('sec'),
981
+ title: 'Netopia Payment',
982
+ type: SectionType.Presentation,
983
+ controls: [],
984
+ presentationControls: [],
985
+ isNavigationSection: false,
986
+ canDepend: false,
987
+ translations: [],
988
+ collapsed: false,
989
+ showSectionTitle: true,
990
+ showSectionSeparator: true,
991
+ };
992
+ step.sections = [section];
993
+ // No default sections for payment steps
994
+ return step;
995
+ }
996
+ /**
997
+ * Create EUPLATESC Payment step
998
+ */
999
+ createEuplatescStep(supportedLanguages) {
1000
+ const stepName = this.translate.transform(LabelKeys.flux.euPlatesc);
1001
+ const step = {
1002
+ identifier: this.generateUniqueId(`${stepName} - EUPLATESC`),
1003
+ name: stepName,
1004
+ type: FluxType.EUPLATESC,
1005
+ sections: [],
1006
+ isVisible: true,
1007
+ config: {},
1008
+ translations: TranslationsHelper.createPaymentsTranslations(supportedLanguages),
1009
+ panelOpenState: true,
1010
+ buttons: [],
1011
+ dependentDictionary: {
1012
+ isDictionaryDependent: false,
1013
+ dictionaryControlIdentifier: '',
1014
+ dependentValueIds: [],
1015
+ },
1016
+ errorsTranslations: [],
1017
+ hasNameAndDescription: true,
1018
+ canDepend: true,
1019
+ collapsed: false,
1020
+ };
1021
+ const section = {
1022
+ identifier: this.generateUniqueId('sec'),
1023
+ title: 'EuPlatesc Payment',
1024
+ type: SectionType.Presentation,
1025
+ controls: [],
1026
+ presentationControls: [],
1027
+ isNavigationSection: false,
1028
+ canDepend: false,
1029
+ translations: [],
1030
+ collapsed: false,
1031
+ showSectionTitle: true,
1032
+ showSectionSeparator: true,
1033
+ };
1034
+ step.sections = [section];
1035
+ // No default sections for payment steps
1036
+ return step;
1037
+ }
1038
+ /**
1039
+ * Create Open Banking step with default sections and controls
1040
+ */
1041
+ createOpenBankingStep(supportedLanguages) {
1042
+ const stepName = this.translate.transform(LabelKeys.flux.openBanking);
1043
+ const step = {
1044
+ identifier: this.generateUniqueId('step'),
1045
+ name: stepName,
1046
+ type: FluxType.OpenBanking,
1047
+ sections: [],
1048
+ isVisible: true,
1049
+ config: {
1050
+ // Field mappings
1051
+ accountNumberCollected: '',
1052
+ accountHolderCollected: '',
1053
+ emailCollected: '',
1054
+ psuIntermediaryId: '',
1055
+ // Bank settings
1056
+ showAllBanks: true,
1057
+ extractBankFromIBAN: false,
1058
+ countryCode: 'RO',
1059
+ // Transaction settings
1060
+ transactionPeriodMonths: 3,
1061
+ periodOfValidity: 90,
1062
+ tcAcceptedByDefault: true,
1063
+ redirectUrl: '',
1064
+ // Messages - will be initialized with translations
1065
+ initialMessageTranslations: this.createTranslationsIfSupported(supportedLanguages, [
1066
+ {
1067
+ iso: 'en',
1068
+ value: 'To continue, we need to verify your bank account information. Click Next to proceed.',
1069
+ },
1070
+ {
1071
+ iso: 'ro',
1072
+ value: 'Pentru a continua, trebuie să verificăm informațiile contului dvs. bancar. Faceți clic pe Următorul pentru a continua.',
1073
+ },
1074
+ ]),
1075
+ waitingMessageTranslations: this.createTranslationsIfSupported(supportedLanguages, [
1076
+ {
1077
+ iso: 'en',
1078
+ value: 'Please wait while we retrieve your account information...',
1079
+ },
1080
+ {
1081
+ iso: 'ro',
1082
+ value: 'Vă rugăm să așteptați până când preluăm informațiile contului dvs...',
1083
+ },
1084
+ ]),
1085
+ consentErrorMessageTranslations: this.createTranslationsIfSupported(supportedLanguages, [
1086
+ {
1087
+ iso: 'en',
1088
+ value: 'You must provide consent to continue. Please try again.',
1089
+ },
1090
+ {
1091
+ iso: 'ro',
1092
+ value: 'Trebuie să oferiți consimțământul pentru a continua. Vă rugăm să încercați din nou.',
1093
+ },
1094
+ ]),
1095
+ completionMessageTranslations: this.createTranslationsIfSupported(supportedLanguages, [
1096
+ { iso: 'en', value: 'Account information successfully retrieved.' },
1097
+ {
1098
+ iso: 'ro',
1099
+ value: 'Informațiile contului au fost preluate cu succes.',
1100
+ },
1101
+ ]),
1102
+ retryButtonLabelTranslations: this.createTranslationsIfSupported(supportedLanguages, [
1103
+ { iso: 'en', value: 'Retry' },
1104
+ { iso: 'ro', value: 'Reîncearcă' },
1105
+ ]),
1106
+ },
1107
+ translations: TranslationsHelper.createOpenBankingTranslations(supportedLanguages),
1108
+ panelOpenState: true,
1109
+ buttons: [],
1110
+ dependentDictionary: {
1111
+ isDictionaryDependent: false,
1112
+ dictionaryControlIdentifier: '',
1113
+ dependentValueIds: [],
1114
+ },
1115
+ errorsTranslations: [],
1116
+ hasNameAndDescription: true,
1117
+ canDepend: true,
1118
+ collapsed: false,
1119
+ };
1120
+ // Section 1: Consent Status
1121
+ const statusSection = {
1122
+ title: 'Consent Status',
1123
+ type: SectionType.Presentation,
1124
+ controls: [
1125
+ {
1126
+ type: StepControlType.CheckBox,
1127
+ identifier: 'OpenBankingConsentStatus',
1128
+ title: 'Consent Validated',
1129
+ specificControlData: {},
1130
+ },
1131
+ ],
1132
+ identifier: this.generateUniqueId('Consent Status'),
1133
+ };
1134
+ // Section 2: Account Information
1135
+ const accountControls = [
1136
+ {
1137
+ type: StepControlType.ManualInput,
1138
+ identifier: 'OpenBankingEmail',
1139
+ title: 'Email',
1140
+ specificControlData: {
1141
+ type: ManualInputControlType.Email,
1142
+ },
1143
+ },
1144
+ {
1145
+ type: StepControlType.ManualInput,
1146
+ identifier: 'OpenBankingAccountNumber',
1147
+ title: 'Account Number',
1148
+ specificControlData: {
1149
+ type: ManualInputControlType.Text,
1150
+ },
1151
+ },
1152
+ {
1153
+ type: StepControlType.ManualInput,
1154
+ identifier: 'OpenBankingAccountHolder',
1155
+ title: 'Account Holder Name',
1156
+ specificControlData: {
1157
+ type: ManualInputControlType.Text,
1158
+ },
1159
+ },
1160
+ {
1161
+ type: StepControlType.ManualInput,
1162
+ identifier: 'OpenBankingBankCode',
1163
+ title: 'Bank Code',
1164
+ specificControlData: {
1165
+ type: ManualInputControlType.Text,
1166
+ },
1167
+ },
1168
+ {
1169
+ type: StepControlType.ManualInput,
1170
+ identifier: 'OpenBankingConsentId',
1171
+ title: 'Consent ID',
1172
+ specificControlData: {
1173
+ type: ManualInputControlType.Text,
1174
+ },
1175
+ },
1176
+ ];
1177
+ const accountSection = {
1178
+ title: 'Account Information',
1179
+ type: SectionType.Presentation,
1180
+ controls: accountControls,
1181
+ identifier: this.generateUniqueId('Account Information'),
1182
+ };
1183
+ // Section 3: Accounts Retrieved
1184
+ const accountsDataControls = [
1185
+ {
1186
+ type: StepControlType.ManualInput,
1187
+ identifier: 'OpenBankingAccountsCount',
1188
+ title: 'Number of Accounts',
1189
+ specificControlData: {
1190
+ type: ManualInputControlType.Numeric,
1191
+ },
1192
+ },
1193
+ {
1194
+ type: StepControlType.ManualInput,
1195
+ identifier: 'OpenBankingAccountsData',
1196
+ title: 'Accounts Data (JSON)',
1197
+ specificControlData: {
1198
+ type: ManualInputControlType.TextArea,
1199
+ },
1200
+ },
1201
+ {
1202
+ type: StepControlType.ManualInput,
1203
+ identifier: 'OpenBankingTotalBalance',
1204
+ title: 'Total Balance',
1205
+ specificControlData: {
1206
+ type: ManualInputControlType.Numeric,
1207
+ },
1208
+ },
1209
+ ];
1210
+ const accountsDataSection = {
1211
+ title: 'Retrieved Accounts',
1212
+ type: SectionType.Presentation,
1213
+ controls: accountsDataControls,
1214
+ identifier: this.generateUniqueId('Retrieved Accounts'),
1215
+ };
1216
+ // Section 4: Transactions Retrieved
1217
+ const transactionsControls = [
1218
+ {
1219
+ type: StepControlType.ManualInput,
1220
+ identifier: 'OpenBankingTransactionsCount',
1221
+ title: 'Number of Transactions',
1222
+ specificControlData: {
1223
+ type: ManualInputControlType.Numeric,
1224
+ },
1225
+ },
1226
+ {
1227
+ type: StepControlType.ManualInput,
1228
+ identifier: 'OpenBankingTransactionsData',
1229
+ title: 'Transactions Data (JSON)',
1230
+ specificControlData: {
1231
+ type: ManualInputControlType.TextArea,
1232
+ },
1233
+ },
1234
+ {
1235
+ type: StepControlType.ManualInput,
1236
+ identifier: 'OpenBankingTransactionsPeriod',
1237
+ title: 'Period (months)',
1238
+ specificControlData: {
1239
+ type: ManualInputControlType.Numeric,
1240
+ },
1241
+ },
1242
+ ];
1243
+ const transactionsSection = {
1244
+ title: 'Retrieved Transactions',
1245
+ type: SectionType.Presentation,
1246
+ controls: transactionsControls,
1247
+ identifier: this.generateUniqueId('Retrieved Transactions'),
1248
+ };
1249
+ // Add all sections to the step
1250
+ step.sections = [
1251
+ statusSection,
1252
+ accountSection,
1253
+ accountsDataSection,
1254
+ transactionsSection,
1255
+ ];
1256
+ return step;
1257
+ }
1258
+ /**
1259
+ * Create Custom step with navigation section
1260
+ */
1261
+ createCustomStep(supportedLanguages) {
1262
+ const step = {
1263
+ identifier: this.generateUniqueId('step'),
1264
+ name: this.translate.transform(LabelKeys.flux.customStep),
1265
+ type: FluxType.Custom,
1266
+ sections: [],
1267
+ isVisible: true,
1268
+ config: {},
1269
+ translations: TranslationsHelper.createCustomStepTranslations(supportedLanguages),
1270
+ panelOpenState: true,
1271
+ buttons: [],
1272
+ dependentDictionary: {
1273
+ isDictionaryDependent: false,
1274
+ dictionaryControlIdentifier: '',
1275
+ dependentValueIds: [],
1276
+ },
1277
+ errorsTranslations: [],
1278
+ hasNameAndDescription: true,
1279
+ canDepend: true,
1280
+ collapsed: false,
1281
+ };
1282
+ // Add navigation section
1283
+ const navigationSection = {
1284
+ canDepend: true,
1285
+ title: 'Secțiune de Navigare',
1286
+ type: SectionType.Presentation,
1287
+ controls: [
1288
+ {
1289
+ canEdit: true,
1290
+ canDepend: false,
1291
+ isOnlyForConfig: false,
1292
+ type: StepControlType.Buttons,
1293
+ },
1294
+ ],
1295
+ isNavigationSection: true,
1296
+ identifier: `Secțiune de Navigare_${this.generateUniqueId('sec')}`,
1297
+ };
1298
+ step.sections = [navigationSection];
1299
+ return step;
1300
+ }
1301
+ /**
1302
+ * Create Final step
1303
+ */
1304
+ createFinalStep(supportedLanguages) {
1305
+ const step = {
1306
+ identifier: this.generateUniqueId('step'),
1307
+ name: this.translate.transform(LabelKeys.flux.finalStep),
1308
+ type: FluxType.Final,
1309
+ sections: [],
1310
+ isVisible: true,
1311
+ config: {},
1312
+ translations: [],
1313
+ panelOpenState: true,
1314
+ buttons: [],
1315
+ dependentDictionary: {
1316
+ isDictionaryDependent: false,
1317
+ dictionaryControlIdentifier: '',
1318
+ dependentValueIds: [],
1319
+ },
1320
+ errorsTranslations: [],
1321
+ hasNameAndDescription: true,
1322
+ canDepend: true,
1323
+ collapsed: false,
1324
+ };
1325
+ // Final step is like custom but without navigation
1326
+ return step;
1327
+ }
1328
+ /**
1329
+ * Main factory method to create any step type
1330
+ */
1331
+ createFluxStep(type, supportedLanguages) {
1332
+ switch (type) {
1333
+ case FluxType.Kyc:
1334
+ return this.createKycStep(supportedLanguages);
1335
+ case FluxType.Email:
1336
+ return this.createCheckEmailStep(supportedLanguages);
1337
+ case FluxType.Phone:
1338
+ return this.createCheckPhoneStep(supportedLanguages);
1339
+ case FluxType.Sign:
1340
+ return this.createSignStep(supportedLanguages);
1341
+ case FluxType.Status:
1342
+ return this.createStatusStep(supportedLanguages);
1343
+ case FluxType.Custom:
1344
+ return this.createCustomStep(supportedLanguages);
1345
+ case FluxType.Pause:
1346
+ return this.createPauseStep(supportedLanguages);
1347
+ case FluxType.IdScan:
1348
+ return this.createScanStep(supportedLanguages);
1349
+ case FluxType.GenerateDocument:
1350
+ return this.createGenerateDocumentsStep(supportedLanguages);
1351
+ case FluxType.Action:
1352
+ return this.createActionStep(supportedLanguages);
1353
+ case FluxType.UploadDocument:
1354
+ return this.createUploadDocumentStep(supportedLanguages);
1355
+ case FluxType.DownloadDocument:
1356
+ return this.createDownloadDocumentStep(supportedLanguages);
1357
+ case FluxType.ViewDocument:
1358
+ return this.createViewDocumentStep(supportedLanguages);
1359
+ case FluxType.ViewOffer:
1360
+ return this.createViewOfferStep(supportedLanguages);
1361
+ case FluxType.Final:
1362
+ return this.createFinalStep(supportedLanguages);
1363
+ case FluxType.NETOPIA:
1364
+ return this.createNetopiaStep(supportedLanguages);
1365
+ case FluxType.EUPLATESC:
1366
+ return this.createEuplatescStep(supportedLanguages);
1367
+ case FluxType.OpenBanking:
1368
+ return this.createOpenBankingStep(supportedLanguages);
1369
+ default:
1370
+ console.error(`Unsupported FluxType: ${type}`);
1371
+ return null;
1372
+ }
1373
+ }
1374
+ /**
1375
+ * Get document name by ID from form model
1376
+ * Static method to match FluxHelper usage pattern in forms.model.ts
1377
+ * @param documentId - The document ID to search for
1378
+ * @param formModel - The form model containing documents array
1379
+ * @returns The document name or empty string if not found
1380
+ */
1381
+ static getDocumentNameById(documentId, formModel) {
1382
+ if (!formModel || !formModel.documents || !documentId) {
1383
+ return '';
1384
+ }
1385
+ const document = formModel.documents.find((d) => d.id === documentId);
1386
+ return document?.name || '';
1387
+ }
1388
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FluxHelper, deps: [{ token: i1.TranslatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
1389
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FluxHelper, providedIn: 'root' }); }
1390
+ }
1391
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FluxHelper, decorators: [{
1392
+ type: Injectable,
1393
+ args: [{
1394
+ providedIn: 'root',
1395
+ }]
1396
+ }], ctorParameters: () => [{ type: i1.TranslatePipe }] });
1397
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1eC1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL290aGVycy9mbHV4LWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixzQkFBc0IsRUFDdEIsV0FBVyxFQUVYLGFBQWEsR0FFZCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7QUFLM0QsTUFBTSxPQUFPLFVBQVU7SUFDckIsWUFBb0IsU0FBd0I7UUFBeEIsY0FBUyxHQUFULFNBQVMsQ0FBZTtJQUFHLENBQUM7SUFFaEQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLG9DQUFvQztRQUNwQyxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUN0QixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssNkJBQTZCLENBQ25DLGtCQUE4QixFQUM5QixNQUF3QztRQUV4QyxJQUFJLElBQUksR0FBZ0IsRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNuQixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FB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ZnJvbSAnLi4vbW9kZWxzL2xhbmd1YWdlLm1vZGVsJztcbmltcG9ydCB7IExhYmVsSW5mbyB9IGZyb20gJy4uL21vZGVscy9sYWJlbC1pbmZvLm1vZGVsJztcbmltcG9ydCB7XG4gIEZsdXhUeXBlLFxuICBTdGVwQ29udHJvbFR5cGUsXG4gIE1hbnVhbElucHV0Q29udHJvbFR5cGUsXG4gIFNlY3Rpb25UeXBlLFxuICBBcHBEb2N1bWVudCxcbiAgRGltZW5zaW9uVHlwZSxcbiAgRm9ybU1vZGVsLFxufSBmcm9tICcuLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi90cmFuc2xhdGlvbi5waXBlJztcbmltcG9ydCB7IExhYmVsS2V5cyB9IGZyb20gJy4uL2VudW1zL2xhYmVsLmtleXMnO1xuaW1wb3J0IHsgQ29udHJvbERhdGEsIFN0ZXBEYXRhLCBTZWN0aW9uRGF0YSB9IGZyb20gJy4uL21vZGVscy9mbHV4Lm1vZGVsJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uc0hlbHBlciB9IGZyb20gJy4vdHJhbnNsYXRpb25zLWhlbHBlcic7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBGbHV4SGVscGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVBpcGUpIHt9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHVuaXF1ZSBWMS1jb21wYXRpYmxlIGlkZW50aWZpZXJcbiAgICovXG4gIGdlbmVyYXRlVW5pcXVlSWQocHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIE1hdGNoIEZsdXhWMSBwYXR0ZXJuOiBwcmVmaXhfVVVJRFxuICAgIGNvbnN0IHV1aWQgPSB1dWlkdjQoKTtcbiAgICByZXR1cm4gcHJlZml4ID8gdXVpZCA6IHV1aWQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRyYW5zbGF0aW9ucyBvbmx5IGZvciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKFxuICAgIHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSxcbiAgICB2YWx1ZXM6IHsgaXNvOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdXG4gICk6IExhYmVsSW5mb1tdIHtcbiAgICBsZXQgbGlzdDogTGFiZWxJbmZvW10gPSBbXTtcbiAgICB2YWx1ZXMuZm9yRWFjaCgodikgPT4ge1xuICAgICAgY29uc3QgbGFuZ0lkID0gc3VwcG9ydGVkTGFuZ3VhZ2VzLmZpbmQoKGxhbmcpID0+IGxhbmcuaXNvID09PSB2Lmlzbyk/LmlkO1xuICAgICAgaWYgKGxhbmdJZCAmJiBsYW5nSWQgPiAwKSB7XG4gICAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgICAgbGFuZ3VhZ2VJZDogbGFuZ0lkLFxuICAgICAgICAgIGxhbmd1YWdlSXNvOiB2LmlzbyxcbiAgICAgICAgICB2YWx1ZTogdi52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWFudWFsIGlucHV0IGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlTWFudWFsSW5wdXRDb250cm9sKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZSxcbiAgICBpc01hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsXG4gICAgZGltZW5zaW9uOiBudW1iZXIgPSA1MFxuICApOiBDb250cm9sRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICB0aXRsZTogbmFtZSxcbiAgICAgIGNhbkVkaXQ6IGZhbHNlLFxuICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICBpc1ByZXNlbnRhdGlvbkNvbnRyb2w6IGZhbHNlLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgaXNNYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGRpbWVuc2lvbixcbiAgICAgIGRpbWVuc2lvblR5cGU6IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSxcbiAgICAgIGF1dG9EaW1lbnNpb246IGZhbHNlLFxuICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICB0eXBlLFxuICAgICAgICBpc01hbmRhdG9yeSxcbiAgICAgICAgYWxsb3dlZENoYXJhY3RlcnM6ICcnLFxuICAgICAgICBtYXhDaGFyYWN0ZXJzOiB0eXBlID09PSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHQgPyA1MCA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWluVmFsdWU6IHR5cGUgPT09IE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYyA/IDAgOiB1bmRlZmluZWQsXG4gICAgICAgIG1heFZhbHVlOiB0eXBlID09PSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLk51bWVyaWMgPyA5OTk5OTk5IDogdW5kZWZpbmVkLFxuICAgICAgICBhbGxvd09ubHlGdXR1cmU6IGZhbHNlLFxuICAgICAgICBhbGxvd09ubHlQYXN0OiBmYWxzZSxcbiAgICAgICAgaXNTaW1wbGVWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgICAgaXNBcGlWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcGFyYWdyYXBoIGNvbnRyb2xcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUGFyYWdyYXBoQ29udHJvbChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHNob3dWYWxpZGF0aW9uczogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGlzTWFuZGF0b3J5OiBib29sZWFuID0gZmFsc2VcbiAgKTogQ29udHJvbERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBpZGVudGlmaWVyLFxuICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLlBhcmFncmFwaCxcbiAgICAgIHRpdGxlOiB0ZXh0LFxuICAgICAgY2FuRWRpdDogZmFsc2UsXG4gICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgaXNNYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgaXNQcmVzZW50YXRpb25Db250cm9sOiBmYWxzZSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBpc09ubHlGb3JDb25maWc6IGZhbHNlLFxuICAgICAgZGltZW5zaW9uOiAxMDAsXG4gICAgICBkaW1lbnNpb25UeXBlOiBEaW1lbnNpb25UeXBlLlBlcmNlbnRhZ2UsXG4gICAgICBhdXRvRGltZW5zaW9uOiB0cnVlLFxuICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICBkZXNjcmlwdGlvblRyYW5zbGF0aW9uczogW10sXG4gICAgICAgIHNob3dWYWxpZGF0aW9ucyxcbiAgICAgICAgaXNNYW5kYXRvcnksXG4gICAgICAgIGlzTWFuZGF0b3J5VHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIH0sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHJvdyBjb250cm9sXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU5ld1Jvd0NvbnRyb2woKTogQ29udHJvbERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ25ld3JvdycpLFxuICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk5ld1JvdyxcbiAgICAgIHRpdGxlOiAnTmV3IFJvdycsXG4gICAgICBjYW5FZGl0OiBmYWxzZSxcbiAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICBpc09ubHlGb3JDb25maWc6IGZhbHNlLFxuICAgICAgaXNQcmVzZW50YXRpb25Db250cm9sOiBmYWxzZSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGlzTWFuZGF0b3J5OiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBkaW1lbnNpb246IDEwMCxcbiAgICAgIGRpbWVuc2lvblR5cGU6IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSxcbiAgICAgIGF1dG9EaW1lbnNpb246IHRydWUsXG4gICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7fSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgS1lDIHN0ZXAgd2l0aCBhbGwgZGVmYXVsdCBzZWN0aW9uc1xuICAgKi9cbiAgY3JlYXRlS3ljU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcE5hbWUgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXguaWRlbnRpZmljYXRpb24pO1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKGAke3N0ZXBOYW1lfSAtIEtZQ2ApLFxuICAgICAgbmFtZTogc3RlcE5hbWUsXG4gICAgICB0eXBlOiBGbHV4VHlwZS5LeWMsXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHt9LFxuICAgICAgdHJhbnNsYXRpb25zOlxuICAgICAgICBUcmFuc2xhdGlvbnNIZWxwZXIuY3JlYXRlS3ljVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIFNlY3Rpb24gMTogS1lDIFN0YXR1c1xuICAgIGNvbnN0IHN0YXR1c1NlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNTdGF0dXNUaXRsZSksXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLkNoZWNrQm94LFxuICAgICAgICAgIGlkZW50aWZpZXI6ICdJZGVudGl0eVZhbGlkYXRpb25TdGF0dXMnLFxuICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oXG4gICAgICAgICAgICBMYWJlbEtleXMuZmx1eC5zdGVwSW5mby52YWxpZGF0aW9uU3RhdHVzXG4gICAgICAgICAgKSxcbiAgICAgICAgfSBhcyBDb250cm9sRGF0YSxcbiAgICAgIF0sXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNTdGF0dXNUaXRsZSlcbiAgICAgICksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gMjogUGVyc29uYWwgSW5mb3JtYXRpb25cbiAgICBjb25zdCBwZXJzb25EYXRhID0gW1xuICAgICAgJ0NOUCcsXG4gICAgICAnSURTZXJpZXMnLFxuICAgICAgJ0lETnVtYmVyJyxcbiAgICAgICdGaXJzdE5hbWUnLFxuICAgICAgJ0xhc3ROYW1lJyxcbiAgICAgICdOYXRpb25hbGl0eScsXG4gICAgICAnSURFeHBpcmF0aW9uRGF0ZScsXG4gICAgICAnSURWYWxpZGl0eScsXG4gICAgICAnQWRkcmVzcycsXG4gICAgICAnUGxhY2VPZkJpcnRoJyxcbiAgICAgICdEYXRlT2ZCaXJ0aCcsXG4gICAgXTtcbiAgICBjb25zdCBwZXJzb25Db250cm9sczogQ29udHJvbERhdGFbXSA9IHBlcnNvbkRhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6IHV1aWR2NCgpLFxuICAgICAgICB0aXRsZTogaXRlbSxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgQ29udHJvbERhdGE7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwZXJzb25hbFNlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNQZXJzb25UaXRsZSksXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogcGVyc29uQ29udHJvbHMsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNQZXJzb25UaXRsZSlcbiAgICAgICksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gMzogVmFsaWRhdGlvbiBEYXRhXG4gICAgY29uc3QgdmFsaWRhdGlvblNlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXguc3RlcEluZm8ua3ljVmFsaWRhdGlvblRpdGxlKVxuICAgICAgKSxcbiAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oXG4gICAgICAgIExhYmVsS2V5cy5mbHV4LnN0ZXBJbmZvLmt5Y1ZhbGlkYXRpb25UaXRsZVxuICAgICAgKSxcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5FZGl0OiB0cnVlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgICAgaWRlbnRpZmllcjogJ0NsaWVudFBob25lTnVtYmVyJyxcbiAgICAgICAgICB0aXRsZTogJ0NsaWVudFBob25lTnVtYmVyJyxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlBob25lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5FZGl0OiB0cnVlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgICAgaWRlbnRpZmllcjogJ0lkU25hcHNob3QnLFxuICAgICAgICAgIHRpdGxlOiAnSWRTbmFwc2hvdCcsXG4gICAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5FZGl0OiB0cnVlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgICAgaWRlbnRpZmllcjogJ0ZhY2VTbmFwc2hvdCcsXG4gICAgICAgICAgdGl0bGU6ICdGYWNlU25hcHNob3QnLFxuICAgICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIENvbnRyb2xEYXRhLFxuICAgICAgXSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICB9IGFzIFNlY3Rpb25EYXRhO1xuXG4gICAgLy8gU2VjdGlvbiA0OiBBZGRyZXNzIEluZm9ybWF0aW9uXG4gICAgY29uc3QgYWRkcmVzc0RhdGEgPSBbXG4gICAgICAnRGlzdHJpY3ROYW1lJyxcbiAgICAgICdDaXR5TmFtZScsXG4gICAgICAnU3RyZWV0TmFtZScsXG4gICAgICAnU3RyZWV0Tm8nLFxuICAgICAgJ0ZsYXRObycsXG4gICAgICAnU3RhaXJObycsXG4gICAgICAnRmxvb3JObycsXG4gICAgICAnQXBhcnRtZW50Tm8nLFxuICAgIF07XG4gICAgY29uc3QgYWRkcmVzc0NvbnRyb2xzOiBDb250cm9sRGF0YVtdID0gYWRkcmVzc0RhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6IHV1aWR2NCgpLFxuICAgICAgICB0aXRsZTogaXRlbSxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgQ29udHJvbERhdGE7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhZGRyZXNzU2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoXG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNBZGRyZXNzVGl0bGUpXG4gICAgICApLFxuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGVwSW5mby5reWNBZGRyZXNzVGl0bGUpLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IGFkZHJlc3NDb250cm9scyxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICB9IGFzIFNlY3Rpb25EYXRhO1xuXG4gICAgc3RlcC5zZWN0aW9ucyA9IFtcbiAgICAgIHN0YXR1c1NlY3Rpb24sXG4gICAgICBwZXJzb25hbFNlY3Rpb24sXG4gICAgICB2YWxpZGF0aW9uU2VjdGlvbixcbiAgICAgIGFkZHJlc3NTZWN0aW9uLFxuICAgIF07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEVtYWlsIFZlcmlmaWNhdGlvbiBzdGVwXG4gICAqL1xuICBjcmVhdGVDaGVja0VtYWlsU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC52ZXJpZnlFbWFpbCksXG4gICAgICB0eXBlOiBGbHV4VHlwZS5FbWFpbCxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBjb2xsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICBjb21wb25lbnRDb2xsZWN0ZWQ6ICcnLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZUNoZWNrRW1haWxUcmFuc2xhdGlvbnMoc3VwcG9ydGVkTGFuZ3VhZ2VzKSxcbiAgICAgIHBhbmVsT3BlblN0YXRlOiB0cnVlLFxuICAgICAgYnV0dG9uczogW10sXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiB7XG4gICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcjogJycsXG4gICAgICAgIGRlcGVuZGVudFZhbHVlSWRzOiBbXSxcbiAgICAgIH0sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGVtYWlsIHZlcmlmaWNhdGlvbiBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiBgU2lzdGVtIC0gRW1haWxfJHt0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpfWAsXG4gICAgICB0aXRsZTogJ1Npc3RlbSAtIEVtYWlsJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5FZGl0OiB0cnVlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgICAgaWRlbnRpZmllcjogJ3ZhbGlkYXRlZC1lbWFpbCcsXG4gICAgICAgICAgdGl0bGU6ICdFbWFpbCBWYWxpZCcsXG4gICAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5FbWFpbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIENvbnRyb2xEYXRhLFxuICAgICAgXSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICB9IGFzIFNlY3Rpb25EYXRhO1xuXG4gICAgc3RlcC5zZWN0aW9ucyA9IFtzZWN0aW9uXTtcbiAgICByZXR1cm4gc3RlcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgUGhvbmUgVmVyaWZpY2F0aW9uIHN0ZXBcbiAgICovXG4gIGNyZWF0ZUNoZWNrUGhvbmVTdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LnZlcmlmeVBob25lKSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLlBob25lLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3RlZDogZmFsc2UsXG4gICAgICAgIGNvbXBvbmVudENvbGxlY3RlZDogJycsXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOlxuICAgICAgICBUcmFuc2xhdGlvbnNIZWxwZXIuY3JlYXRlQ2hlY2tQaG9uZVRyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgcGhvbmUgdmVyaWZpY2F0aW9uIHNlY3Rpb25cbiAgICBjb25zdCBzZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IGBTaXN0ZW0gLSBUZWxfJHt0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpfWAsXG4gICAgICB0aXRsZTogJ1Npc3RlbSAtIFRlbCcsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgY2FuRWRpdDogdHJ1ZSxcbiAgICAgICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICAgIGlkZW50aWZpZXI6ICd2YWxpZGF0ZWQtcGhvbmUnLFxuICAgICAgICAgIHRpdGxlOiAnTnIgdGVsIFZhbGlkJyxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlBob25lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICBdLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgIH0gYXMgU2VjdGlvbkRhdGE7XG5cbiAgICBzdGVwLnNlY3Rpb25zID0gW3NlY3Rpb25dO1xuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBJRCBTY2FuIHN0ZXBcbiAgICovXG4gIGNyZWF0ZVNjYW5TdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LmlkU2NhbiksXG4gICAgICB0eXBlOiBGbHV4VHlwZS5JZFNjYW4sXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgc2hvd1VwbG9hZEZpbGVCdXR0b246IHRydWUsXG4gICAgICAgIHNob3dUYWtlUGljdHVyZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgZmlsZU1heFNpemU6IDUwMDAsXG4gICAgICAgIGZpbGVGb3JtYXRzOiAnKi5qcGcsKi5wbmcnLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZUlkU2NhblRyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgY29kZTogJ2ludmFsaWRTdGF0dXMnLFxuICAgICAgICAgIHRyYW5zbGF0aW9uczogdGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNJZlN1cHBvcnRlZChzdXBwb3J0ZWRMYW5ndWFnZXMsIFtcbiAgICAgICAgICAgIHsgaXNvOiAnZW4nLCB2YWx1ZTogJ0ludmFsaWQgc3RhdHVzIHJlc3BvbnNlJyB9LFxuICAgICAgICAgICAgeyBpc286ICdybycsIHZhbHVlOiAnUmFzcHVucyBzdGF0dXMgaW52YWxpZCcgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvZGU6ICdpbnZhbGlkVHlwZScsXG4gICAgICAgICAgdHJhbnNsYXRpb25zOiB0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKHN1cHBvcnRlZExhbmd1YWdlcywgW1xuICAgICAgICAgICAgeyBpc286ICdlbicsIHZhbHVlOiAnSW52YWxpZCB0eXBlLiBBbGxvd2VkIGZvcm1hdHMgYXJlIHtmb3JtYXRzfScgfSxcbiAgICAgICAgICAgIHsgaXNvOiAncm8nLCB2YWx1ZTogJ1RpcCBpbnZhbGlkLiBGb3JtYXR1bCBwZXJtaXMgZXN0ZSB7Zm9ybWF0c30nIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2RlOiAnbWF4U2l6ZScsXG4gICAgICAgICAgdHJhbnNsYXRpb25zOiB0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKHN1cHBvcnRlZExhbmd1YWdlcywgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdlbicsXG4gICAgICAgICAgICAgIHZhbHVlOiAnVGhlIHNlbGVjdGVkIGZpbGUgaXMgdG9vIGJpZy4gTWF4IGFsbG93ZWQgc2l6ZSBpcyB7c2l6ZX0nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNvOiAncm8nLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAnRmnImWllcnVsIHNlbGVjdGF0IGVzdGUgcHJlYSBtYXJlLiBEaW1lbnNpdW5lYSBtYXhpbcSDIGVzdGUge3NpemV9JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2RlOiAnZnJvbnRJZCcsXG4gICAgICAgICAgdHJhbnNsYXRpb25zOiB0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKHN1cHBvcnRlZExhbmd1YWdlcywgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdlbicsXG4gICAgICAgICAgICAgIHZhbHVlOiAnUGxlYXNlIHVwbG9hZCB0aGUgZnJvbnQgcGhvdG8gb2YgeW91ciBJRCBjYXJkLicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdybycsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICdWxIMgcnVnxINtIHPEgyB1cmNhyJtpIHBhcnRlYSBkaW4gZmHIm8SDIGEgZG9jdW1lbnR1bHVpIGRlIGlkZW50aXRhdGUuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2RlOiAnYmFja0lkJyxcbiAgICAgICAgICB0cmFuc2xhdGlvbnM6IHRoaXMuY3JlYXRlVHJhbnNsYXRpb25zSWZTdXBwb3J0ZWQoc3VwcG9ydGVkTGFuZ3VhZ2VzLCBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzbzogJ2VuJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdQbGVhc2UgdXBsb2FkIHRoZSBiYWNrIHBob3RvIG9mIHlvdXIgSUQgY2FyZC4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNvOiAncm8nLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAnVsSDIHJ1Z8SDbSBzxIMgdXJjYcibaSBwYXJ0ZWEgZGluIHNwYXRlIGEgZG9jdW1lbnR1bHVpIGRlIGlkZW50aXRhdGUuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gTWF0Y2ggVjEgSUQgU2NhbiBzZWN0aW9ucyBleGFjdGx5XG4gICAgLy8gU3RhdHVzIHNlY3Rpb25cbiAgICBjb25zdCBzdGF0dXNTZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnSUQgU0NBTiBTdGF0dXMnKSxcbiAgICAgIHRpdGxlOiAnSUQgU0NBTiBTdGF0dXMnLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5DaGVja0JveCxcbiAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ0lEIFNDQU4gVmFsaWRhdGlvbiBTdGF0dXMnKSxcbiAgICAgICAgICB0aXRsZTogJ0lEIFNDQU4gVmFsaWRhdGlvbiBTdGF0dXMnLFxuICAgICAgICB9IGFzIENvbnRyb2xEYXRhLFxuICAgICAgXSxcbiAgICB9IGFzIFNlY3Rpb25EYXRhO1xuXG4gICAgLy8gUGVyc29uIGRhdGEgc2VjdGlvblxuICAgIGNvbnN0IHBlcnNvbkRhdGEgPSBbXG4gICAgICAnQ05QJyxcbiAgICAgICdJRFNlcmllcycsXG4gICAgICAnSUROdW1iZXInLFxuICAgICAgJ0ZpcnN0TmFtZScsXG4gICAgICAnTGFzdE5hbWUnLFxuICAgICAgJ05hdGlvbmFsaXR5JyxcbiAgICAgICdJREV4cGlyYXRpb25EYXRlJyxcbiAgICAgICdJRFZhbGlkaXR5JyxcbiAgICAgICdBZGRyZXNzJyxcbiAgICAgICdQbGFjZU9mQmlydGgnLFxuICAgIF07XG4gICAgY29uc3QgcGVyc29uQ29udHJvbHM6IENvbnRyb2xEYXRhW10gPSBwZXJzb25EYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoaXRlbSksXG4gICAgICAgIHRpdGxlOiBpdGVtLFxuICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0LFxuICAgICAgICB9LFxuICAgICAgfSBhcyBDb250cm9sRGF0YTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHBlcnNvblNlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdJRCBTQ0FOIFBlcnNvYW5hJyksXG4gICAgICB0aXRsZTogJ0lEIFNDQU4gUGVyc29hbmEnLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IHBlcnNvbkNvbnRyb2xzLFxuICAgIH0gYXMgU2VjdGlvbkRhdGE7XG5cbiAgICBzdGVwLnNlY3Rpb25zID0gW3N0YXR1c1NlY3Rpb24sIHBlcnNvblNlY3Rpb25dO1xuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBTaWduIHN0ZXBcbiAgICovXG4gIGNyZWF0ZVNpZ25TdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LnNpZ24pLFxuICAgICAgdHlwZTogRmx1eFR5cGUuU2lnbixcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBzaWduYXR1cmVUeXBlOiAnRWxlY3Ryb25pYycsXG4gICAgICAgIHNob3dDb25maXJtOiB0cnVlLFxuICAgICAgICBjb21wYW55U2lnbjogZmFsc2UsXG4gICAgICAgIGZpcnN0TmFtZUNvbGxlY3RlZDogJycsXG4gICAgICAgIGxhc3ROYW1lQ29sbGVjdGVkOiAnJyxcbiAgICAgICAgZG9jdW1lbnRzOiBbXSxcbiAgICAgICAgZG9jc1RvU2lnbjogW10sXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOlxuICAgICAgICBUcmFuc2xhdGlvbnNIZWxwZXIuY3JlYXRlU2lnblRyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2lnbiBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpLFxuICAgICAgdGl0bGU6ICdEb2N1bWVudCBTaWduaW5nJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHRoaXMuY3JlYXRlUGFyYWdyYXBoQ29udHJvbChcbiAgICAgICAgICAnUGxlYXNlIHNpZ24gdGhlIGZvbGxvd2luZyBkb2N1bWVudHMnLFxuICAgICAgICAgICdzaWduLWluc3RydWN0aW9uJyxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApLFxuICAgICAgICB7XG4gICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdjb21wJyksXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLlZpZXdEb2N1bWVudHMsXG4gICAgICAgICAgdGl0bGU6ICdEb2N1bWVudHMgdG8gU2lnbicsXG4gICAgICAgICAgY2FuRWRpdDogZmFsc2UsXG4gICAgICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgICAgICBpc09ubHlGb3JDb25maWc6IGZhbHNlLFxuICAgICAgICAgIGRpbWVuc2lvbjogMTAwLFxuICAgICAgICAgIGRpbWVuc2lvblR5cGU6IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSxcbiAgICAgICAgICBhdXRvRGltZW5zaW9uOiB0cnVlLFxuICAgICAgICAgIGlzUHJlc2VudGF0aW9uQ29udHJvbDogZmFsc2UsXG4gICAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgICAgZG9jdW1lbnRzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpc01hbmRhdG9yeTogZmFsc2UsXG4gICAgICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBwcmVzZW50YXRpb25Db250cm9sczogW10sXG4gICAgICBpc05hdmlnYXRpb25TZWN0aW9uOiBmYWxzZSxcbiAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICB0cmFuc2xhdGlvbnM6IFtdLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIHNob3dTZWN0aW9uVGl0bGU6IHRydWUsXG4gICAgICBzaG93U2VjdGlvblNlcGFyYXRvcjogdHJ1ZSxcbiAgICB9O1xuXG4gICAgc3RlcC5zZWN0aW9ucyA9IFtzZWN0aW9uXTtcbiAgICByZXR1cm4gc3RlcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgR2VuZXJhdGUgRG9jdW1lbnRzIHN0ZXBcbiAgICovXG4gIGNyZWF0ZUdlbmVyYXRlRG9jdW1lbnRzU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5nZW5lcmF0ZURvY3VtZW50KSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLkdlbmVyYXRlRG9jdW1lbnQsXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgZ2VuZXJhdGVkRG9jdW1lbnRzOiBbXSxcbiAgICAgIH0sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVHZW5lcmF0ZURvY3VtZW50c1RyYW5zbGF0aW9ucyhcbiAgICAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXNcbiAgICAgICAgKSxcbiAgICAgIHBhbmVsT3BlblN0YXRlOiB0cnVlLFxuICAgICAgYnV0dG9uczogW10sXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiB7XG4gICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcjogJycsXG4gICAgICAgIGRlcGVuZGVudFZhbHVlSWRzOiBbXSxcbiAgICAgIH0sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gTm8gZGVmYXVsdCBzZWN0aW9ucyBmb3IgZ2VuZXJhdGUgZG9jdW1lbnRzXG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFBhdXNlIHN0ZXBcbiAgICovXG4gIGNyZWF0ZVBhdXNlU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcE5hbWUgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXgucGF1c2UpO1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKGAke3N0ZXBOYW1lfSAtIFBhdXNlYCksXG4gICAgICBuYW1lOiBzdGVwTmFtZSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLlBhdXNlLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7fSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZVBhdXNlVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIEFkZCBwYXVzZSBtZXNzYWdlIHNlY3Rpb25cbiAgICBjb25zdCBzZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc2VjJyksXG4gICAgICB0aXRsZTogJ0Zsb3cgUGF1c2VkJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHRoaXMuY3JlYXRlUGFyYWdyYXBoQ29udHJvbChcbiAgICAgICAgICAnVGhlIHdvcmtmbG93IGhhcyBiZWVuIHBhdXNlZCcsXG4gICAgICAgICAgJ3BhdXNlLW1lc3NhZ2UnLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgcHJlc2VudGF0aW9uQ29udHJvbHM6IFtdLFxuICAgICAgaXNOYXZpZ2F0aW9uU2VjdGlvbjogZmFsc2UsXG4gICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICBzaG93U2VjdGlvblRpdGxlOiB0cnVlLFxuICAgICAgc2hvd1NlY3Rpb25TZXBhcmF0b3I6IHRydWUsXG4gICAgfTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEFjdGlvbiBzdGVwXG4gICAqL1xuICBjcmVhdGVBY3Rpb25TdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LmFjdGlvbiksXG4gICAgICB0eXBlOiBGbHV4VHlwZS5BY3Rpb24sXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgYXBpTWV0aG9kOiAnJyxcbiAgICAgICAgYXBpUGFydG5lcnM6IFtdLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZUFjdGlvblRyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBObyBkZWZhdWx0IHNlY3Rpb25zIGZvciBhY3Rpb24gc3RlcFxuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBTdGF0dXMgc3RlcCB3aXRoIGRlZmF1bHQgc2VjdGlvblxuICAgKi9cbiAgY3JlYXRlU3RhdHVzU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5zdGF0dXMpLFxuICAgICAgdHlwZTogRmx1eFR5cGUuU3RhdHVzLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7fSxcbiAgICAgIHBhbmVsT3BlblN0YXRlOiB0cnVlLFxuICAgICAgYnV0dG9uczogW10sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVTdGF0dXNUcmFuc2xhdGlvbnMoc3VwcG9ydGVkTGFuZ3VhZ2VzKSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc3RhdHVzIHNlbGVjdGlvbiBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICB0aXRsZTogJ1N0YXR1cyBTaXN0ZW0nLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGNhbkVkaXQ6IHRydWUsXG4gICAgICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgICAgICBpc09ubHlGb3JDb25maWc6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5OZXdSb3csXG4gICAgICAgICAgaWRlbnRpZmllcjogJ3NlbGVjdC1zdGF0dXMnLFxuICAgICAgICAgIHRpdGxlOiAnRmx1eCcsXG4gICAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICBdLFxuICAgICAgaWRlbnRpZmllcjogYFN0YXR1cyBTaXN0ZW1fJHt0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpfWAsXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFVwbG9hZCBEb2N1bWVudCBzdGVwXG4gICAqL1xuICBjcmVhdGVVcGxvYWREb2N1bWVudFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdzdGVwJyksXG4gICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXgudXBsb2FkRG9jdW1lbnQpLFxuICAgICAgdHlwZTogRmx1eFR5cGUuVXBsb2FkRG9jdW1lbnQsXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHt9LFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHVwbG9hZCBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpLFxuICAgICAgdGl0bGU6ICdVcGxvYWQgRG9jdW1lbnRzJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLkNvbGxlY3QsXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdjb21wJyksXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLlVwbG9hZERvY3VtZW50cyxcbiAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LnVwbG9hZERvY3VtZW50KSxcbiAgICAgICAgICBjYW5FZGl0OiBmYWxzZSxcbiAgICAgICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICAgICAgaXNQcmVzZW50YXRpb25Db250cm9sOiBmYWxzZSxcbiAgICAgICAgICBkaW1lbnNpb246IDEwMCxcbiAgICAgICAgICBkaW1lbnNpb25UeXBlOiBEaW1lbnNpb25UeXBlLlBlcmNlbnRhZ2UsXG4gICAgICAgICAgYXV0b0RpbWVuc2lvbjogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgICBkb2N1bWVudHM6IFtdLFxuICAgICAgICAgICAgZmlsZU1heFNpemU6IDEwMDAwLFxuICAgICAgICAgICAgZmlsZUZvcm1hdHM6ICcqLnBkZiwqLmpwZywqLnBuZywqLmRvYywqLmRvY3gnLFxuICAgICAgICAgICAgaXNNYW5kYXRvcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaXNNYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcHJlc2VudGF0aW9uQ29udHJvbHM6IFtdLFxuICAgICAgaXNOYXZpZ2F0aW9uU2VjdGlvbjogZmFsc2UsXG4gICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICBzaG93U2VjdGlvblRpdGxlOiB0cnVlLFxuICAgICAgc2hvd1NlY3Rpb25TZXBhcmF0b3I6IHRydWUsXG4gICAgfTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIERvd25sb2FkIERvY3VtZW50IHN0ZXBcbiAgICovXG4gIGNyZWF0ZURvd25sb2FkRG9jdW1lbnRTdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwOiBTdGVwRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc3RlcCcpLFxuICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LmRvd25sb2FkRG9jdW1lbnQpLFxuICAgICAgdHlwZTogRmx1eFR5cGUuRG93bmxvYWREb2N1bWVudCxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgZG93bmxvYWQgc2VjdGlvblxuICAgIGNvbnN0IHNlY3Rpb246IFNlY3Rpb25EYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdzZWMnKSxcbiAgICAgIHRpdGxlOiAnRG93bmxvYWQgRG9jdW1lbnRzJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ2NvbXAnKSxcbiAgICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuRG93bmxvYWREb2N1bWVudHMsXG4gICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5kb3dubG9hZERvY3VtZW50KSxcbiAgICAgICAgICBjYW5FZGl0OiBmYWxzZSxcbiAgICAgICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICAgICAgaXNQcmVzZW50YXRpb25Db250cm9sOiBmYWxzZSxcbiAgICAgICAgICBkaW1lbnNpb246IDEwMCxcbiAgICAgICAgICBkaW1lbnNpb25UeXBlOiBEaW1lbnNpb25UeXBlLlBlcmNlbnRhZ2UsXG4gICAgICAgICAgYXV0b0RpbWVuc2lvbjogdHJ1ZSxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgICBkb2N1bWVudHM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiB7XG4gICAgICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgICAgIGRlcGVuZGVudFZhbHVlSWRzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlzTWFuZGF0b3J5OiBmYWxzZSxcbiAgICAgICAgICB0cmFuc2xhdGlvbnM6IFtdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHByZXNlbnRhdGlvbkNvbnRyb2xzOiBbXSxcbiAgICAgIGlzTmF2aWdhdGlvblNlY3Rpb246IGZhbHNlLFxuICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgc2hvd1NlY3Rpb25UaXRsZTogdHJ1ZSxcbiAgICAgIHNob3dTZWN0aW9uU2VwYXJhdG9yOiB0cnVlLFxuICAgIH07XG5cbiAgICBzdGVwLnNlY3Rpb25zID0gW3NlY3Rpb25dO1xuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBWaWV3IERvY3VtZW50IHN0ZXBcbiAgICovXG4gIGNyZWF0ZVZpZXdEb2N1bWVudFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdzdGVwJyksXG4gICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXgudmlld0RvY3VtZW50KSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLlZpZXdEb2N1bWVudCxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgdmlldyBzZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpLFxuICAgICAgdGl0bGU6ICdWaWV3IERvY3VtZW50cycsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdjb21wJyksXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLlZpZXdEb2N1bWVudHMsXG4gICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC52aWV3RG9jdW1lbnQpLFxuICAgICAgICAgIGNhbkVkaXQ6IGZhbHNlLFxuICAgICAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICAgICAgaXNPbmx5Rm9yQ29uZmlnOiBmYWxzZSxcbiAgICAgICAgICBpc1ByZXNlbnRhdGlvbkNvbnRyb2w6IGZhbHNlLFxuICAgICAgICAgIGRpbWVuc2lvbjogMTAwLFxuICAgICAgICAgIGRpbWVuc2lvblR5cGU6IERpbWVuc2lvblR5cGUuUGVyY2VudGFnZSxcbiAgICAgICAgICBhdXRvRGltZW5zaW9uOiB0cnVlLFxuICAgICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICAgIGRvY3VtZW50czogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaXNNYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcHJlc2VudGF0aW9uQ29udHJvbHM6IFtdLFxuICAgICAgaXNOYXZpZ2F0aW9uU2VjdGlvbjogZmFsc2UsXG4gICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICBzaG93U2VjdGlvblRpdGxlOiB0cnVlLFxuICAgICAgc2hvd1NlY3Rpb25TZXBhcmF0b3I6IHRydWUsXG4gICAgfTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFZpZXcgT2ZmZXIgc3RlcFxuICAgKi9cbiAgY3JlYXRlVmlld09mZmVyU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC52aWV3T2ZmZXIpLFxuICAgICAgdHlwZTogRmx1eFR5cGUuVmlld09mZmVyLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7fSxcbiAgICAgIHBhbmVsT3BlblN0YXRlOiB0cnVlLFxuICAgICAgYnV0dG9uczogW10sXG4gICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiB7XG4gICAgICAgIGlzRGljdGlvbmFyeURlcGVuZGVudDogZmFsc2UsXG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcjogJycsXG4gICAgICAgIGRlcGVuZGVudFZhbHVlSWRzOiBbXSxcbiAgICAgIH0sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVWaWV3T2ZmZXJTdGVwVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBlcnJvcnNUcmFuc2xhdGlvbnM6IFtdLFxuICAgICAgaGFzTmFtZUFuZERlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgY2FuRGVwZW5kOiB0cnVlLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gTm8gZGVmYXVsdCBzZWN0aW9ucyBmb3IgdmlldyBvZmZlclxuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBORVRPUElBIFBheW1lbnQgc3RlcFxuICAgKi9cbiAgY3JlYXRlTmV0b3BpYVN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4Lm5ldG9waWEpO1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKGAke3N0ZXBOYW1lfSAtIE5FVE9QSUFgKSxcbiAgICAgIG5hbWU6IHN0ZXBOYW1lLFxuICAgICAgdHlwZTogRmx1eFR5cGUuTkVUT1BJQSxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgdHJhbnNsYXRpb25zOlxuICAgICAgICBUcmFuc2xhdGlvbnNIZWxwZXIuY3JlYXRlUGF5bWVudHNUcmFuc2xhdGlvbnMoc3VwcG9ydGVkTGFuZ3VhZ2VzKSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCBzZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc2VjJyksXG4gICAgICB0aXRsZTogJ05ldG9waWEgUGF5bWVudCcsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW10sXG4gICAgICBwcmVzZW50YXRpb25Db250cm9sczogW10sXG4gICAgICBpc05hdmlnYXRpb25TZWN0aW9uOiBmYWxzZSxcbiAgICAgIGNhbkRlcGVuZDogZmFsc2UsXG4gICAgICB0cmFuc2xhdGlvbnM6IFtdLFxuICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgIHNob3dTZWN0aW9uVGl0bGU6IHRydWUsXG4gICAgICBzaG93U2VjdGlvblNlcGFyYXRvcjogdHJ1ZSxcbiAgICB9O1xuICAgIHN0ZXAuc2VjdGlvbnMgPSBbc2VjdGlvbl07XG5cbiAgICAvLyBObyBkZWZhdWx0IHNlY3Rpb25zIGZvciBwYXltZW50IHN0ZXBzXG4gICAgcmV0dXJuIHN0ZXA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEVVUExBVEVTQyBQYXltZW50IHN0ZXBcbiAgICovXG4gIGNyZWF0ZUV1cGxhdGVzY1N0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKExhYmVsS2V5cy5mbHV4LmV1UGxhdGVzYyk7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoYCR7c3RlcE5hbWV9IC0gRVVQTEFURVNDYCksXG4gICAgICBuYW1lOiBzdGVwTmFtZSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLkVVUExBVEVTQyxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVQYXltZW50c1RyYW5zbGF0aW9ucyhzdXBwb3J0ZWRMYW5ndWFnZXMpLFxuICAgICAgcGFuZWxPcGVuU3RhdGU6IHRydWUsXG4gICAgICBidXR0b25zOiBbXSxcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IHtcbiAgICAgICAgaXNEaWN0aW9uYXJ5RGVwZW5kZW50OiBmYWxzZSxcbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyOiAnJyxcbiAgICAgICAgZGVwZW5kZW50VmFsdWVJZHM6IFtdLFxuICAgICAgfSxcbiAgICAgIGVycm9yc1RyYW5zbGF0aW9uczogW10sXG4gICAgICBoYXNOYW1lQW5kRGVzY3JpcHRpb246IHRydWUsXG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCBzZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnc2VjJyksXG4gICAgICB0aXRsZTogJ0V1UGxhdGVzYyBQYXltZW50JyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBbXSxcbiAgICAgIHByZXNlbnRhdGlvbkNvbnRyb2xzOiBbXSxcbiAgICAgIGlzTmF2aWdhdGlvblNlY3Rpb246IGZhbHNlLFxuICAgICAgY2FuRGVwZW5kOiBmYWxzZSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgc2hvd1NlY3Rpb25UaXRsZTogdHJ1ZSxcbiAgICAgIHNob3dTZWN0aW9uU2VwYXJhdG9yOiB0cnVlLFxuICAgIH07XG4gICAgc3RlcC5zZWN0aW9ucyA9IFtzZWN0aW9uXTtcblxuICAgIC8vIE5vIGRlZmF1bHQgc2VjdGlvbnMgZm9yIHBheW1lbnQgc3RlcHNcbiAgICByZXR1cm4gc3RlcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgT3BlbiBCYW5raW5nIHN0ZXAgd2l0aCBkZWZhdWx0IHNlY3Rpb25zIGFuZCBjb250cm9sc1xuICAgKi9cbiAgY3JlYXRlT3BlbkJhbmtpbmdTdGVwKHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXSk6IFN0ZXBEYXRhIHtcbiAgICBjb25zdCBzdGVwTmFtZSA9IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5vcGVuQmFua2luZyk7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHN0ZXBOYW1lLFxuICAgICAgdHlwZTogRmx1eFR5cGUuT3BlbkJhbmtpbmcsXG4gICAgICBzZWN0aW9uczogW10sXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLy8gRmllbGQgbWFwcGluZ3NcbiAgICAgICAgYWNjb3VudE51bWJlckNvbGxlY3RlZDogJycsXG4gICAgICAgIGFjY291bnRIb2xkZXJDb2xsZWN0ZWQ6ICcnLFxuICAgICAgICBlbWFpbENvbGxlY3RlZDogJycsXG4gICAgICAgIHBzdUludGVybWVkaWFyeUlkOiAnJyxcblxuICAgICAgICAvLyBCYW5rIHNldHRpbmdzXG4gICAgICAgIHNob3dBbGxCYW5rczogdHJ1ZSxcbiAgICAgICAgZXh0cmFjdEJhbmtGcm9tSUJBTjogZmFsc2UsXG4gICAgICAgIGNvdW50cnlDb2RlOiAnUk8nLFxuXG4gICAgICAgIC8vIFRyYW5zYWN0aW9uIHNldHRpbmdzXG4gICAgICAgIHRyYW5zYWN0aW9uUGVyaW9kTW9udGhzOiAzLFxuICAgICAgICBwZXJpb2RPZlZhbGlkaXR5OiA5MCxcbiAgICAgICAgdGNBY2NlcHRlZEJ5RGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgcmVkaXJlY3RVcmw6ICcnLFxuXG4gICAgICAgIC8vIE1lc3NhZ2VzIC0gd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIHRyYW5zbGF0aW9uc1xuICAgICAgICBpbml0aWFsTWVzc2FnZVRyYW5zbGF0aW9uczogdGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNJZlN1cHBvcnRlZChcbiAgICAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXMsXG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdlbicsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICdUbyBjb250aW51ZSwgd2UgbmVlZCB0byB2ZXJpZnkgeW91ciBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24uIENsaWNrIE5leHQgdG8gcHJvY2VlZC4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNvOiAncm8nLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAnUGVudHJ1IGEgY29udGludWEsIHRyZWJ1aWUgc8SDIHZlcmlmaWPEg20gaW5mb3JtYcibaWlsZSBjb250dWx1aSBkdnMuIGJhbmNhci4gRmFjZcibaSBjbGljIHBlIFVybcSDdG9ydWwgcGVudHJ1IGEgY29udGludWEuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgICApLFxuICAgICAgICB3YWl0aW5nTWVzc2FnZVRyYW5zbGF0aW9uczogdGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNJZlN1cHBvcnRlZChcbiAgICAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXMsXG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc286ICdlbicsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICdQbGVhc2Ugd2FpdCB3aGlsZSB3ZSByZXRyaWV2ZSB5b3VyIGFjY291bnQgaW5mb3JtYXRpb24uLi4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNvOiAncm8nLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAnVsSDIHJ1Z8SDbSBzxIMgYciZdGVwdGHIm2kgcMOibsSDIGPDom5kIHByZWx1xINtIGluZm9ybWHIm2lpbGUgY29udHVsdWkgZHZzLi4uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXVxuICAgICAgICApLFxuICAgICAgICBjb25zZW50RXJyb3JNZXNzYWdlVHJhbnNsYXRpb25zOiB0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uc0lmU3VwcG9ydGVkKFxuICAgICAgICAgIHN1cHBvcnRlZExhbmd1YWdlcyxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzbzogJ2VuJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdZb3UgbXVzdCBwcm92aWRlIGNvbnNlbnQgdG8gY29udGludWUuIFBsZWFzZSB0cnkgYWdhaW4uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzbzogJ3JvJyxcbiAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgJ1RyZWJ1aWUgc8SDIG9mZXJpyJtpIGNvbnNpbcibxINtw6JudHVsIHBlbnRydSBhIGNvbnRpbnVhLiBWxIMgcnVnxINtIHPEgyDDrm5jZXJjYcibaSBkaW4gbm91LicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgICAgKSxcbiAgICAgICAgY29tcGxldGlvbk1lc3NhZ2VUcmFuc2xhdGlvbnM6IHRoaXMuY3JlYXRlVHJhbnNsYXRpb25zSWZTdXBwb3J0ZWQoXG4gICAgICAgICAgc3VwcG9ydGVkTGFuZ3VhZ2VzLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgaXNvOiAnZW4nLCB2YWx1ZTogJ0FjY291bnQgaW5mb3JtYXRpb24gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC4nIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzbzogJ3JvJyxcbiAgICAgICAgICAgICAgdmFsdWU6ICdJbmZvcm1hyJtpaWxlIGNvbnR1bHVpIGF1IGZvc3QgcHJlbHVhdGUgY3Ugc3VjY2VzLicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgICAgKSxcbiAgICAgICAgcmV0cnlCdXR0b25MYWJlbFRyYW5zbGF0aW9uczogdGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNJZlN1cHBvcnRlZChcbiAgICAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXMsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBpc286ICdlbicsIHZhbHVlOiAnUmV0cnknIH0sXG4gICAgICAgICAgICB7IGlzbzogJ3JvJywgdmFsdWU6ICdSZcOubmNlYXJjxIMnIH0sXG4gICAgICAgICAgXVxuICAgICAgICApLFxuICAgICAgfSxcbiAgICAgIHRyYW5zbGF0aW9uczpcbiAgICAgICAgVHJhbnNsYXRpb25zSGVscGVyLmNyZWF0ZU9wZW5CYW5raW5nVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIFNlY3Rpb24gMTogQ29uc2VudCBTdGF0dXNcbiAgICBjb25zdCBzdGF0dXNTZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIHRpdGxlOiAnQ29uc2VudCBTdGF0dXMnLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5DaGVja0JveCxcbiAgICAgICAgICBpZGVudGlmaWVyOiAnT3BlbkJhbmtpbmdDb25zZW50U3RhdHVzJyxcbiAgICAgICAgICB0aXRsZTogJ0NvbnNlbnQgVmFsaWRhdGVkJyxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7fSxcbiAgICAgICAgfSBhcyBDb250cm9sRGF0YSxcbiAgICAgIF0sXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ0NvbnNlbnQgU3RhdHVzJyksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gMjogQWNjb3VudCBJbmZvcm1hdGlvblxuICAgIGNvbnN0IGFjY291bnRDb250cm9sczogQ29udHJvbERhdGFbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICBpZGVudGlmaWVyOiAnT3BlbkJhbmtpbmdFbWFpbCcsXG4gICAgICAgIHRpdGxlOiAnRW1haWwnLFxuICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5FbWFpbCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nQWNjb3VudE51bWJlcicsXG4gICAgICAgIHRpdGxlOiAnQWNjb3VudCBOdW1iZXInLFxuICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5UZXh0LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICBpZGVudGlmaWVyOiAnT3BlbkJhbmtpbmdBY2NvdW50SG9sZGVyJyxcbiAgICAgICAgdGl0bGU6ICdBY2NvdW50IEhvbGRlciBOYW1lJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nQmFua0NvZGUnLFxuICAgICAgICB0aXRsZTogJ0JhbmsgQ29kZScsXG4gICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6ICdPcGVuQmFua2luZ0NvbnNlbnRJZCcsXG4gICAgICAgIHRpdGxlOiAnQ29uc2VudCBJRCcsXG4gICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0gYXMgQ29udHJvbERhdGFbXTtcblxuICAgIGNvbnN0IGFjY291bnRTZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIHRpdGxlOiAnQWNjb3VudCBJbmZvcm1hdGlvbicsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogYWNjb3VudENvbnRyb2xzLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdBY2NvdW50IEluZm9ybWF0aW9uJyksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gMzogQWNjb3VudHMgUmV0cmlldmVkXG4gICAgY29uc3QgYWNjb3VudHNEYXRhQ29udHJvbHM6IENvbnRyb2xEYXRhW10gPSBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nQWNjb3VudHNDb3VudCcsXG4gICAgICAgIHRpdGxlOiAnTnVtYmVyIG9mIEFjY291bnRzJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nQWNjb3VudHNEYXRhJyxcbiAgICAgICAgdGl0bGU6ICdBY2NvdW50cyBEYXRhIChKU09OKScsXG4gICAgICAgIHNwZWNpZmljQ29udHJvbERhdGE6IHtcbiAgICAgICAgICB0eXBlOiBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHRBcmVhLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLk1hbnVhbElucHV0LFxuICAgICAgICBpZGVudGlmaWVyOiAnT3BlbkJhbmtpbmdUb3RhbEJhbGFuY2UnLFxuICAgICAgICB0aXRsZTogJ1RvdGFsIEJhbGFuY2UnLFxuICAgICAgICBzcGVjaWZpY0NvbnRyb2xEYXRhOiB7XG4gICAgICAgICAgdHlwZTogTWFudWFsSW5wdXRDb250cm9sVHlwZS5OdW1lcmljLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdIGFzIENvbnRyb2xEYXRhW107XG5cbiAgICBjb25zdCBhY2NvdW50c0RhdGFTZWN0aW9uOiBTZWN0aW9uRGF0YSA9IHtcbiAgICAgIHRpdGxlOiAnUmV0cmlldmVkIEFjY291bnRzJyxcbiAgICAgIHR5cGU6IFNlY3Rpb25UeXBlLlByZXNlbnRhdGlvbixcbiAgICAgIGNvbnRyb2xzOiBhY2NvdW50c0RhdGFDb250cm9scyxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuZ2VuZXJhdGVVbmlxdWVJZCgnUmV0cmlldmVkIEFjY291bnRzJyksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIFNlY3Rpb24gNDogVHJhbnNhY3Rpb25zIFJldHJpZXZlZFxuICAgIGNvbnN0IHRyYW5zYWN0aW9uc0NvbnRyb2xzOiBDb250cm9sRGF0YVtdID0gW1xuICAgICAge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6ICdPcGVuQmFua2luZ1RyYW5zYWN0aW9uc0NvdW50JyxcbiAgICAgICAgdGl0bGU6ICdOdW1iZXIgb2YgVHJhbnNhY3Rpb25zJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFN0ZXBDb250cm9sVHlwZS5NYW51YWxJbnB1dCxcbiAgICAgICAgaWRlbnRpZmllcjogJ09wZW5CYW5raW5nVHJhbnNhY3Rpb25zRGF0YScsXG4gICAgICAgIHRpdGxlOiAnVHJhbnNhY3Rpb25zIERhdGEgKEpTT04pJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuVGV4dEFyZWEsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQsXG4gICAgICAgIGlkZW50aWZpZXI6ICdPcGVuQmFua2luZ1RyYW5zYWN0aW9uc1BlcmlvZCcsXG4gICAgICAgIHRpdGxlOiAnUGVyaW9kIChtb250aHMpJyxcbiAgICAgICAgc3BlY2lmaWNDb250cm9sRGF0YToge1xuICAgICAgICAgIHR5cGU6IE1hbnVhbElucHV0Q29udHJvbFR5cGUuTnVtZXJpYyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSBhcyBDb250cm9sRGF0YVtdO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zU2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICB0aXRsZTogJ1JldHJpZXZlZCBUcmFuc2FjdGlvbnMnLFxuICAgICAgdHlwZTogU2VjdGlvblR5cGUuUHJlc2VudGF0aW9uLFxuICAgICAgY29udHJvbHM6IHRyYW5zYWN0aW9uc0NvbnRyb2xzLFxuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdSZXRyaWV2ZWQgVHJhbnNhY3Rpb25zJyksXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIC8vIEFkZCBhbGwgc2VjdGlvbnMgdG8gdGhlIHN0ZXBcbiAgICBzdGVwLnNlY3Rpb25zID0gW1xuICAgICAgc3RhdHVzU2VjdGlvbixcbiAgICAgIGFjY291bnRTZWN0aW9uLFxuICAgICAgYWNjb3VudHNEYXRhU2VjdGlvbixcbiAgICAgIHRyYW5zYWN0aW9uc1NlY3Rpb24sXG4gICAgXTtcblxuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBDdXN0b20gc3RlcCB3aXRoIG5hdmlnYXRpb24gc2VjdGlvblxuICAgKi9cbiAgY3JlYXRlQ3VzdG9tU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXM6IExhbmd1YWdlW10pOiBTdGVwRGF0YSB7XG4gICAgY29uc3Qgc3RlcDogU3RlcERhdGEgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3N0ZXAnKSxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShMYWJlbEtleXMuZmx1eC5jdXN0b21TdGVwKSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLkN1c3RvbSxcbiAgICAgIHNlY3Rpb25zOiBbXSxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZzoge30sXG4gICAgICB0cmFuc2xhdGlvbnM6XG4gICAgICAgIFRyYW5zbGF0aW9uc0hlbHBlci5jcmVhdGVDdXN0b21TdGVwVHJhbnNsYXRpb25zKHN1cHBvcnRlZExhbmd1YWdlcyksXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIEFkZCBuYXZpZ2F0aW9uIHNlY3Rpb25cbiAgICBjb25zdCBuYXZpZ2F0aW9uU2VjdGlvbjogU2VjdGlvbkRhdGEgPSB7XG4gICAgICBjYW5EZXBlbmQ6IHRydWUsXG4gICAgICB0aXRsZTogJ1NlY8ibaXVuZSBkZSBOYXZpZ2FyZScsXG4gICAgICB0eXBlOiBTZWN0aW9uVHlwZS5QcmVzZW50YXRpb24sXG4gICAgICBjb250cm9sczogW1xuICAgICAgICB7XG4gICAgICAgICAgY2FuRWRpdDogdHJ1ZSxcbiAgICAgICAgICBjYW5EZXBlbmQ6IGZhbHNlLFxuICAgICAgICAgIGlzT25seUZvckNvbmZpZzogZmFsc2UsXG4gICAgICAgICAgdHlwZTogU3RlcENvbnRyb2xUeXBlLkJ1dHRvbnMsXG4gICAgICAgIH0gYXMgQ29udHJvbERhdGEsXG4gICAgICBdLFxuICAgICAgaXNOYXZpZ2F0aW9uU2VjdGlvbjogdHJ1ZSxcbiAgICAgIGlkZW50aWZpZXI6IGBTZWPIm2l1bmUgZGUgTmF2aWdhcmVfJHt0aGlzLmdlbmVyYXRlVW5pcXVlSWQoJ3NlYycpfWAsXG4gICAgfSBhcyBTZWN0aW9uRGF0YTtcblxuICAgIHN0ZXAuc2VjdGlvbnMgPSBbbmF2aWdhdGlvblNlY3Rpb25dO1xuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBGaW5hbCBzdGVwXG4gICAqL1xuICBjcmVhdGVGaW5hbFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdKTogU3RlcERhdGEge1xuICAgIGNvbnN0IHN0ZXA6IFN0ZXBEYXRhID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5nZW5lcmF0ZVVuaXF1ZUlkKCdzdGVwJyksXG4gICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oTGFiZWxLZXlzLmZsdXguZmluYWxTdGVwKSxcbiAgICAgIHR5cGU6IEZsdXhUeXBlLkZpbmFsLFxuICAgICAgc2VjdGlvbnM6IFtdLFxuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgY29uZmlnOiB7fSxcbiAgICAgIHRyYW5zbGF0aW9uczogW10sXG4gICAgICBwYW5lbE9wZW5TdGF0ZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbnM6IFtdLFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeToge1xuICAgICAgICBpc0RpY3Rpb25hcnlEZXBlbmRlbnQ6IGZhbHNlLFxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXI6ICcnLFxuICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkczogW10sXG4gICAgICB9LFxuICAgICAgZXJyb3JzVHJhbnNsYXRpb25zOiBbXSxcbiAgICAgIGhhc05hbWVBbmREZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGNhbkRlcGVuZDogdHJ1ZSxcbiAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIEZpbmFsIHN0ZXAgaXMgbGlrZSBjdXN0b20gYnV0IHdpdGhvdXQgbmF2aWdhdGlvblxuICAgIHJldHVybiBzdGVwO1xuICB9XG5cbiAgLyoqXG4gICAqIE1haW4gZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFueSBzdGVwIHR5cGVcbiAgICovXG4gIGNyZWF0ZUZsdXhTdGVwKFxuICAgIHR5cGU6IEZsdXhUeXBlLFxuICAgIHN1cHBvcnRlZExhbmd1YWdlczogTGFuZ3VhZ2VbXVxuICApOiBTdGVwRGF0YSB8IG51bGwge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBGbHV4VHlwZS5LeWM6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUt5Y1N0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuRW1haWw6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNoZWNrRW1haWxTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLlBob25lOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGVja1Bob25lU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5TaWduOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTaWduU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5TdGF0dXM6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVN0YXR1c1N0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuQ3VzdG9tOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDdXN0b21TdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLlBhdXNlOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXVzZVN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuSWRTY2FuOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVTY2FuU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5HZW5lcmF0ZURvY3VtZW50OlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVHZW5lcmF0ZURvY3VtZW50c1N0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuQWN0aW9uOlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVBY3Rpb25TdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLlVwbG9hZERvY3VtZW50OlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVVcGxvYWREb2N1bWVudFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuRG93bmxvYWREb2N1bWVudDpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRG93bmxvYWREb2N1bWVudFN0ZXAoc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcbiAgICAgIGNhc2UgRmx1eFR5cGUuVmlld0RvY3VtZW50OlxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVWaWV3RG9jdW1lbnRTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLlZpZXdPZmZlcjpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmlld09mZmVyU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5GaW5hbDpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRmluYWxTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLk5FVE9QSUE6XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ldG9waWFTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBjYXNlIEZsdXhUeXBlLkVVUExBVEVTQzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRXVwbGF0ZXNjU3RlcChzdXBwb3J0ZWRMYW5ndWFnZXMpO1xuICAgICAgY2FzZSBGbHV4VHlwZS5PcGVuQmFua2luZzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlT3BlbkJhbmtpbmdTdGVwKHN1cHBvcnRlZExhbmd1YWdlcyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKGBVbnN1cHBvcnRlZCBGbHV4VHlwZTogJHt0eXBlfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRvY3VtZW50IG5hbWUgYnkgSUQgZnJvbSBmb3JtIG1vZGVsXG4gICAqIFN0YXRpYyBtZXRob2QgdG8gbWF0Y2ggRmx1eEhlbHBlciB1c2FnZSBwYXR0ZXJuIGluIGZvcm1zLm1vZGVsLnRzXG4gICAqIEBwYXJhbSBkb2N1bWVudElkIC0gVGhlIGRvY3VtZW50IElEIHRvIHNlYXJjaCBmb3JcbiAgICogQHBhcmFtIGZvcm1Nb2RlbCAtIFRoZSBmb3JtIG1vZGVsIGNvbnRhaW5pbmcgZG9jdW1lbnRzIGFycmF5XG4gICAqIEByZXR1cm5zIFRoZSBkb2N1bWVudCBuYW1lIG9yIGVtcHR5IHN0cmluZyBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXREb2N1bWVudE5hbWVCeUlkKGRvY3VtZW50SWQ6IHN0cmluZywgZm9ybU1vZGVsOiBGb3JtTW9kZWwpOiBzdHJpbmcge1xuICAgIGlmICghZm9ybU1vZGVsIHx8ICFmb3JtTW9kZWwuZG9jdW1lbnRzIHx8ICFkb2N1bWVudElkKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jdW1lbnQgPSBmb3JtTW9kZWwuZG9jdW1lbnRzLmZpbmQoXG4gICAgICAoZDogQXBwRG9jdW1lbnQpID0+IGQuaWQgPT09IGRvY3VtZW50SWRcbiAgICApO1xuICAgIHJldHVybiBkb2N1bWVudD8ubmFtZSB8fCAnJztcbiAgfVxufVxuIl19