@hmcts/ccd-case-ui-toolkit 5.0.32-angular11-upgrade → 5.0.33-angular11-upgrade

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 (148) hide show
  1. package/bundles/hmcts-ccd-case-ui-toolkit.umd.js +3365 -640
  2. package/bundles/hmcts-ccd-case-ui-toolkit.umd.js.map +1 -1
  3. package/bundles/hmcts-ccd-case-ui-toolkit.umd.min.js +1 -1
  4. package/bundles/hmcts-ccd-case-ui-toolkit.umd.min.js.map +1 -1
  5. package/esm2015/lib/app.config.js +1 -1
  6. package/esm2015/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.js +15 -11
  7. package/esm2015/lib/shared/components/case-editor/services/cases.service.js +28 -1
  8. package/esm2015/lib/shared/components/case-editor/services/page-validation.service.js +10 -2
  9. package/esm2015/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.js +9 -2
  10. package/esm2015/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.js +15 -10
  11. package/esm2015/lib/shared/components/palette/base-field/abstract-form-field.component.js +4 -2
  12. package/esm2015/lib/shared/components/palette/base-field/field-write.component.js +8 -14
  13. package/esm2015/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.js +71 -41
  14. package/esm2015/lib/shared/components/palette/case-flag/domain/case-flag.model.js +1 -1
  15. package/esm2015/lib/shared/components/palette/case-flag/read-case-flag-field.component.js +2 -3
  16. package/esm2015/lib/shared/components/palette/case-flag/write-case-flag-field.component.js +13 -9
  17. package/esm2015/lib/shared/components/palette/case-link/components/before-you-start/before-you-start.component.js +125 -0
  18. package/esm2015/lib/shared/components/palette/case-link/components/check-your-answers/check-your-answers.component.js +198 -0
  19. package/esm2015/lib/shared/components/palette/case-link/components/index.js +10 -0
  20. package/esm2015/lib/shared/components/palette/case-link/components/link-cases/link-cases.component.js +493 -0
  21. package/esm2015/lib/shared/components/palette/case-link/components/linked-cases-table/linked-cases-from-table.component.js +221 -0
  22. package/esm2015/lib/shared/components/palette/case-link/components/linked-cases-table/linked-cases-to-table.component.js +286 -0
  23. package/esm2015/lib/shared/components/palette/case-link/components/no-linked-cases/no-linked-cases.component.js +76 -0
  24. package/esm2015/lib/shared/components/palette/case-link/components/read-linked-cases.component.js +178 -0
  25. package/esm2015/lib/shared/components/palette/case-link/components/unlink-cases/unlink-cases.component.js +216 -0
  26. package/esm2015/lib/shared/components/palette/case-link/components/write-linked-cases.component.js +260 -0
  27. package/esm2015/lib/shared/components/palette/case-link/domain/index.js +3 -0
  28. package/esm2015/lib/shared/components/palette/case-link/domain/linked-cases-state.model.js +2 -0
  29. package/esm2015/lib/shared/components/palette/case-link/domain/linked-cases.model.js +19 -0
  30. package/esm2015/lib/shared/components/palette/case-link/enums/index.js +2 -0
  31. package/esm2015/lib/shared/components/palette/case-link/enums/write-linked-cases-field.enum.js +33 -0
  32. package/esm2015/lib/shared/components/palette/case-link/index.js +4 -1
  33. package/esm2015/lib/shared/components/palette/case-link/read-case-link-field.component.js +28 -8
  34. package/esm2015/lib/shared/components/palette/case-link/services/index.js +2 -0
  35. package/esm2015/lib/shared/components/palette/case-link/services/jurisdiction.service.js +22 -0
  36. package/esm2015/lib/shared/components/palette/case-link/services/linked-cases.service.js +136 -0
  37. package/esm2015/lib/shared/components/palette/case-link/utils/validators.utils.js +27 -0
  38. package/esm2015/lib/shared/components/palette/case-link/write-case-link-field.component.js +79 -65
  39. package/esm2015/lib/shared/components/palette/index.js +6 -2
  40. package/esm2015/lib/shared/components/palette/palette.module.js +70 -18
  41. package/esm2015/lib/shared/components/palette/palette.service.js +10 -4
  42. package/esm2015/lib/shared/components/search-result/search-result.component.js +1 -1
  43. package/esm2015/lib/shared/domain/definition/field-type-enum.model.js +1 -1
  44. package/esm2015/lib/shared/pipes/complex/ccd-read-fields-filter.pipe.js +5 -1
  45. package/esm2015/lib/shared/pipes/index.js +2 -1
  46. package/esm2015/lib/shared/pipes/link-cases-reason-code/ccd-link-cases-reason-code.pipe.js +23 -0
  47. package/esm2015/lib/shared/pipes/link-cases-reason-code/index.js +2 -0
  48. package/esm2015/lib/shared/pipes/pipes.module.js +9 -5
  49. package/esm2015/lib/shared/services/common-data-service/common-data-service.js +22 -0
  50. package/esm2015/lib/shared/services/fields/fields.purger.js +128 -112
  51. package/esm2015/lib/shared/services/fields/fields.utils.js +11 -2
  52. package/esm2015/lib/shared/services/form/form-value.service.js +9 -7
  53. package/esm2015/lib/shared/services/jurisdiction/jurisdiction.service.js +1 -1
  54. package/esm2015/lib/shared/services/search/search.service.js +8 -1
  55. package/fesm2015/hmcts-ccd-case-ui-toolkit.js +2842 -415
  56. package/fesm2015/hmcts-ccd-case-ui-toolkit.js.map +1 -1
  57. package/lib/app.config.d.ts +4 -0
  58. package/lib/app.config.d.ts.map +1 -1
  59. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts +2 -0
  60. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
  61. package/lib/shared/components/case-editor/services/cases.service.d.ts +7 -0
  62. package/lib/shared/components/case-editor/services/cases.service.d.ts.map +1 -1
  63. package/lib/shared/components/case-editor/services/page-validation.service.d.ts +1 -0
  64. package/lib/shared/components/case-editor/services/page-validation.service.d.ts.map +1 -1
  65. package/lib/shared/components/case-viewer/case-event-trigger/case-event-trigger.component.d.ts.map +1 -1
  66. package/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.d.ts +2 -2
  67. package/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.d.ts.map +1 -1
  68. package/lib/shared/components/palette/base-field/abstract-form-field.component.d.ts.map +1 -1
  69. package/lib/shared/components/palette/base-field/field-write.component.d.ts +2 -2
  70. package/lib/shared/components/palette/base-field/field-write.component.d.ts.map +1 -1
  71. package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts +11 -5
  72. package/lib/shared/components/palette/case-flag/components/manage-case-flags/manage-case-flags.component.d.ts.map +1 -1
  73. package/lib/shared/components/palette/case-flag/domain/case-flag.model.d.ts +2 -0
  74. package/lib/shared/components/palette/case-flag/domain/case-flag.model.d.ts.map +1 -1
  75. package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts +0 -1
  76. package/lib/shared/components/palette/case-flag/read-case-flag-field.component.d.ts.map +1 -1
  77. package/lib/shared/components/palette/case-flag/write-case-flag-field.component.d.ts.map +1 -1
  78. package/lib/shared/components/palette/case-link/components/before-you-start/before-you-start.component.d.ts +19 -0
  79. package/lib/shared/components/palette/case-link/components/before-you-start/before-you-start.component.d.ts.map +1 -0
  80. package/lib/shared/components/palette/case-link/components/check-your-answers/check-your-answers.component.d.ts +18 -0
  81. package/lib/shared/components/palette/case-link/components/check-your-answers/check-your-answers.component.d.ts.map +1 -0
  82. package/lib/shared/components/palette/case-link/components/index.d.ts +10 -0
  83. package/lib/shared/components/palette/case-link/components/index.d.ts.map +1 -0
  84. package/lib/shared/components/palette/case-link/components/link-cases/link-cases.component.d.ts +41 -0
  85. package/lib/shared/components/palette/case-link/components/link-cases/link-cases.component.d.ts.map +1 -0
  86. package/lib/shared/components/palette/case-link/components/linked-cases-table/linked-cases-from-table.component.d.ts +42 -0
  87. package/lib/shared/components/palette/case-link/components/linked-cases-table/linked-cases-from-table.component.d.ts.map +1 -0
  88. package/lib/shared/components/palette/case-link/components/linked-cases-table/linked-cases-to-table.component.d.ts +45 -0
  89. package/lib/shared/components/palette/case-link/components/linked-cases-table/linked-cases-to-table.component.d.ts.map +1 -0
  90. package/lib/shared/components/palette/case-link/components/no-linked-cases/no-linked-cases.component.d.ts +12 -0
  91. package/lib/shared/components/palette/case-link/components/no-linked-cases/no-linked-cases.component.d.ts.map +1 -0
  92. package/lib/shared/components/palette/case-link/components/read-linked-cases.component.d.ts +37 -0
  93. package/lib/shared/components/palette/case-link/components/read-linked-cases.component.d.ts.map +1 -0
  94. package/lib/shared/components/palette/case-link/components/unlink-cases/unlink-cases.component.d.ts +38 -0
  95. package/lib/shared/components/palette/case-link/components/unlink-cases/unlink-cases.component.d.ts.map +1 -0
  96. package/lib/shared/components/palette/case-link/components/write-linked-cases.component.d.ts +45 -0
  97. package/lib/shared/components/palette/case-link/components/write-linked-cases.component.d.ts.map +1 -0
  98. package/lib/shared/components/palette/case-link/domain/index.d.ts +3 -0
  99. package/lib/shared/components/palette/case-link/domain/index.d.ts.map +1 -0
  100. package/lib/shared/components/palette/case-link/domain/linked-cases-state.model.d.ts +12 -0
  101. package/lib/shared/components/palette/case-link/domain/linked-cases-state.model.d.ts.map +1 -0
  102. package/lib/shared/components/palette/case-link/domain/linked-cases.model.d.ts +65 -0
  103. package/lib/shared/components/palette/case-link/domain/linked-cases.model.d.ts.map +1 -0
  104. package/lib/shared/components/palette/case-link/enums/index.d.ts +2 -0
  105. package/lib/shared/components/palette/case-link/enums/index.d.ts.map +1 -0
  106. package/lib/shared/components/palette/case-link/enums/write-linked-cases-field.enum.d.ts +29 -0
  107. package/lib/shared/components/palette/case-link/enums/write-linked-cases-field.enum.d.ts.map +1 -0
  108. package/lib/shared/components/palette/case-link/index.d.ts +3 -0
  109. package/lib/shared/components/palette/case-link/index.d.ts.map +1 -1
  110. package/lib/shared/components/palette/case-link/read-case-link-field.component.d.ts +3 -0
  111. package/lib/shared/components/palette/case-link/read-case-link-field.component.d.ts.map +1 -1
  112. package/lib/shared/components/palette/case-link/services/index.d.ts +2 -0
  113. package/lib/shared/components/palette/case-link/services/index.d.ts.map +1 -0
  114. package/lib/shared/components/palette/case-link/services/jurisdiction.service.d.ts +12 -0
  115. package/lib/shared/components/palette/case-link/services/jurisdiction.service.d.ts.map +1 -0
  116. package/lib/shared/components/palette/case-link/services/linked-cases.service.d.ts +51 -0
  117. package/lib/shared/components/palette/case-link/services/linked-cases.service.d.ts.map +1 -0
  118. package/lib/shared/components/palette/case-link/utils/validators.utils.d.ts +10 -0
  119. package/lib/shared/components/palette/case-link/utils/validators.utils.d.ts.map +1 -0
  120. package/lib/shared/components/palette/case-link/write-case-link-field.component.d.ts +14 -3
  121. package/lib/shared/components/palette/case-link/write-case-link-field.component.d.ts.map +1 -1
  122. package/lib/shared/components/palette/index.d.ts +5 -1
  123. package/lib/shared/components/palette/index.d.ts.map +1 -1
  124. package/lib/shared/components/palette/palette.module.d.ts +54 -45
  125. package/lib/shared/components/palette/palette.module.d.ts.map +1 -1
  126. package/lib/shared/components/palette/palette.service.d.ts.map +1 -1
  127. package/lib/shared/domain/definition/field-type-enum.model.d.ts +1 -1
  128. package/lib/shared/domain/definition/field-type-enum.model.d.ts.map +1 -1
  129. package/lib/shared/pipes/complex/ccd-read-fields-filter.pipe.d.ts.map +1 -1
  130. package/lib/shared/pipes/index.d.ts +1 -0
  131. package/lib/shared/pipes/index.d.ts.map +1 -1
  132. package/lib/shared/pipes/link-cases-reason-code/ccd-link-cases-reason-code.pipe.d.ts +11 -0
  133. package/lib/shared/pipes/link-cases-reason-code/ccd-link-cases-reason-code.pipe.d.ts.map +1 -0
  134. package/lib/shared/pipes/link-cases-reason-code/index.d.ts +2 -0
  135. package/lib/shared/pipes/link-cases-reason-code/index.d.ts.map +1 -0
  136. package/lib/shared/pipes/pipes.module.d.ts +3 -2
  137. package/lib/shared/pipes/pipes.module.d.ts.map +1 -1
  138. package/lib/shared/services/common-data-service/common-data-service.d.ts +29 -0
  139. package/lib/shared/services/common-data-service/common-data-service.d.ts.map +1 -0
  140. package/lib/shared/services/fields/fields.purger.d.ts +19 -12
  141. package/lib/shared/services/fields/fields.purger.d.ts.map +1 -1
  142. package/lib/shared/services/fields/fields.utils.d.ts +1 -0
  143. package/lib/shared/services/fields/fields.utils.d.ts.map +1 -1
  144. package/lib/shared/services/form/form-value.service.d.ts.map +1 -1
  145. package/lib/shared/services/jurisdiction/jurisdiction.service.d.ts.map +1 -1
  146. package/lib/shared/services/search/search.service.d.ts +4 -0
  147. package/lib/shared/services/search/search.service.d.ts.map +1 -1
  148. package/package.json +1 -1
@@ -8,117 +8,6 @@ export class FieldsPurger {
8
8
  constructor(fieldsUtils) {
9
9
  this.fieldsUtils = fieldsUtils;
10
10
  }
11
- /**
12
- * Deletes a field value by setting the value of the corresponding {@link FormControl} to null (or an empty array
13
- * if the field type is `Collection`), except when the field type is `Complex` or `Document`. For `Complex` field
14
- * types, this recursive method is called until simple or "base" field types are reached. For `Document` field
15
- * types, its _sub-field_ `FormControl` values are set to null.
16
- *
17
- * @param formGroup The `FormGroup` instance containing the `FormControl` for the specified field
18
- * @param field The `CaseField` whose value is to be deleted in the backend
19
- * @param parentField Reference to the parent `CaseField`. Used for checking specifically where a Complex field and
20
- * its sub-fields have `retain_hidden_value` set to `true`, but the field's parent has it set to `false` or undefined
21
- */
22
- deleteFieldValue(formGroup, field, parentField) {
23
- const fieldType = field.field_type.type;
24
- const fieldControl = formGroup.get(field.id);
25
- if (fieldControl) {
26
- switch (fieldType) {
27
- case 'Complex':
28
- /**
29
- * If the field is a Complex type, loop over its sub-fields and call deleteFieldValue() for:
30
- *
31
- * * Any sub-fields where retain_hidden_value is false/undefined, if the parent field has
32
- * retain_hidden_value = true;
33
- * * ALL sub-fields if the parent field has retain_hidden_value = true BUT its _own_ parent has
34
- * retain_hidden_value = false/undefined (thus overriding anything else);
35
- * * ALL sub-fields if the parent field has retain_hidden_value = false/undefined;
36
- * * Any Complex sub-fields *regardless of their retain_hidden_value* (in order to inspect the sub-fields
37
- * of a Complex type within another Complex type)
38
- */
39
- if (field.field_type.complex_fields.length > 0) {
40
- for (const complexSubField of field.field_type.complex_fields) {
41
- if ((complexSubField.field_type.type === 'Complex' && complexSubField.field_type.complex_fields.length > 0) ||
42
- (complexSubField.field_type.type !== 'Complex' &&
43
- (field.retain_hidden_value
44
- ? !complexSubField.retain_hidden_value || (parentField && !parentField.retain_hidden_value)
45
- : true))) {
46
- // The fieldControl is cast to a FormGroup because a Complex field type uses this as its underlying
47
- // implementation
48
- this.deleteFieldValue(fieldControl, complexSubField, field);
49
- }
50
- }
51
- }
52
- break;
53
- case 'Collection':
54
- // If it is a collection of Complex types, loop through each one; else fall through to be handled as a
55
- // collection of simple types (in the same way as MultiSelectList), unless it's a collection of Document
56
- // types, which requires different handling
57
- const collectionFieldType = field.field_type.collection_field_type;
58
- if (collectionFieldType.type === 'Complex' && collectionFieldType.complex_fields.length > 0) {
59
- // Get the array of Complex field values
60
- const complexFieldValues = fieldControl.value;
61
- // For each Complex field value, get the ID of each sub-field within it and use as a key to find the
62
- // corresponding sub-CaseField (which contains the field type information)
63
- if (complexFieldValues) {
64
- complexFieldValues.forEach((fieldValue, index) => Object.keys(fieldValue.value).forEach(subFieldId => {
65
- // Find the sub-CaseField corresponding to the sub-field ID
66
- let subCaseField;
67
- for (const caseField of collectionFieldType.complex_fields) {
68
- if (caseField.id === subFieldId) {
69
- subCaseField = caseField;
70
- break;
71
- }
72
- }
73
- // Recursively delete the sub-field value, passing in the parent FormGroup
74
- const parentFormGroup = fieldControl.at(index).get('value');
75
- this.deleteFieldValue(parentFormGroup, subCaseField);
76
- }));
77
- }
78
- break;
79
- }
80
- else if (collectionFieldType.type === 'Document') {
81
- // Get the array of Document field values
82
- const documentFieldValues = fieldControl.value;
83
- // For each Document field value, set all its property values to null (this is not accepted by the
84
- // back-end but will be handled by sanitiseObject() in FormValueService before sending - see below for
85
- // the single Document case)
86
- if (documentFieldValues) {
87
- documentFieldValues.forEach((fieldValue, index) => Object.keys(fieldValue.value).forEach(subFieldId => {
88
- // Get the FormGroup containing the FormControl for the sub-field and set its value to null
89
- fieldControl.at(index).get(`value.${subFieldId}`).setValue(null);
90
- }));
91
- }
92
- break;
93
- }
94
- // Omitted "break" is intentional because a collection should be handled as per MultiSelectList if it is
95
- // not a collection of Complex types
96
- // tslint:disable-next-line: no-switch-case-fall-through
97
- case 'MultiSelectList':
98
- // Field control should be a FormArray, so map each of its values to null
99
- // NOTE: The FormArray cannot just be set to an empty array because Angular checks that all existing values
100
- // of a FormArray are present; setting the control's value to an empty array causes a runtime error
101
- fieldControl.setValue(fieldControl.value.map(() => null));
102
- break;
103
- case 'Document':
104
- // NOTE: The field control (a FormGroup in this case) cannot just be set to null because Angular checks that
105
- // all existing values of a FormGroup are present; setting the control's value to null causes a runtime error
106
- const documentFieldValue = fieldControl.value;
107
- for (const key in documentFieldValue) {
108
- if (fieldControl.get(key)) {
109
- // The back-end doesn't accept null as a valid value for any of the Document field type properties but
110
- // this is handled by sanitiseObject() in FormValueService, returning a null object for the entire
111
- // Document field, if any of its properties is null - which is accepted by the back-end
112
- fieldControl.get(key).setValue(null);
113
- }
114
- }
115
- break;
116
- // Note: the default case applies to DynamicList fields, too
117
- default:
118
- fieldControl.setValue(null);
119
- }
120
- }
121
- }
122
11
  clearHiddenFields(form, wizard, eventTrigger, currentPageId) {
123
12
  this.clearHiddenFieldForFieldShowCondition(currentPageId, form, wizard, eventTrigger);
124
13
  this.clearHiddenFieldForPageShowCondition(form, wizard, eventTrigger);
@@ -268,10 +157,137 @@ export class FieldsPurger {
268
157
  isReadonly(case_field) {
269
158
  return case_field.display_context.toUpperCase() === 'READONLY';
270
159
  }
160
+ /**
161
+ * Deletes a field value by setting the value of the corresponding {@link FormControl} to null (or an empty array
162
+ * if the field type is `Collection`), except when the field type is `Complex` or `Document`. For `Complex` field
163
+ * types, this recursive method is called until simple or "base" field types are reached. For `Document` field
164
+ * types, its _sub-field_ `FormControl` values are set to null.
165
+ *
166
+ * @param formGroup The `FormGroup` instance containing the `FormControl` for the specified field
167
+ * @param field The `CaseField` whose value is to be deleted in the backend
168
+ * @param parentField Reference to the parent `CaseField`. Used for checking specifically where a Complex field and
169
+ * its sub-fields have `retain_hidden_value` set to `true`, but the field's parent has it set to `false` or undefined
170
+ */
171
+ deleteFieldValue(formGroup, field, parentField) {
172
+ const fieldType = field.field_type.type;
173
+ const fieldControl = formGroup.get(field.id);
174
+ if (fieldControl) {
175
+ switch (fieldType) {
176
+ case 'Complex':
177
+ /**
178
+ * If the field is a Complex type, loop over its sub-fields and call deleteFieldValue() for:
179
+ *
180
+ * * Any sub-fields where retain_hidden_value is false/undefined, if the parent field has
181
+ * retain_hidden_value = true;
182
+ * * ALL sub-fields if the parent field has retain_hidden_value = true BUT its _own_ parent has
183
+ * retain_hidden_value = false/undefined (thus overriding anything else);
184
+ * * ALL sub-fields if the parent field has retain_hidden_value = false/undefined;
185
+ * * Any Complex sub-fields *regardless of their retain_hidden_value* (in order to inspect the sub-fields
186
+ * of a Complex type within another Complex type)
187
+ */
188
+ if (field.field_type.complex_fields.length > 0) {
189
+ for (const complexSubField of field.field_type.complex_fields) {
190
+ if ((complexSubField.field_type.type === 'Complex' && complexSubField.field_type.complex_fields.length > 0) ||
191
+ (complexSubField.field_type.type !== 'Complex' &&
192
+ (field.retain_hidden_value
193
+ ? !complexSubField.retain_hidden_value || (parentField && !parentField.retain_hidden_value)
194
+ : true))) {
195
+ // The fieldControl is cast to a FormGroup because a Complex field type uses this as its underlying
196
+ // implementation
197
+ this.deleteFieldValue(fieldControl, complexSubField, field);
198
+ }
199
+ }
200
+ }
201
+ break;
202
+ case 'Collection':
203
+ // If it is a collection of Complex types, loop through each one; else fall through to be handled as a
204
+ // collection of simple types (in the same way as MultiSelectList), unless it's a collection of Document
205
+ // types, which requires different handling
206
+ const collectionFieldType = field.field_type.collection_field_type;
207
+ if (collectionFieldType.type === 'Complex' && collectionFieldType.complex_fields.length > 0) {
208
+ // Get the array of Complex field values
209
+ const complexFieldValues = fieldControl.value;
210
+ // For each Complex field value, get the ID of each sub-field within it and use as a key to find the
211
+ // corresponding sub-CaseField (which contains the field type information)
212
+ if (complexFieldValues) {
213
+ complexFieldValues.forEach((fieldValue, index) => Object.keys(fieldValue.value).forEach(subFieldId => {
214
+ // Find the sub-CaseField corresponding to the sub-field ID
215
+ let subCaseField;
216
+ for (const caseField of collectionFieldType.complex_fields) {
217
+ if (caseField.id === subFieldId) {
218
+ subCaseField = caseField;
219
+ break;
220
+ }
221
+ }
222
+ // Recursively delete the sub-field value, passing in the parent FormGroup
223
+ const parentFormGroup = fieldControl.at(index).get('value');
224
+ this.deleteFieldValue(parentFormGroup, subCaseField);
225
+ }));
226
+ }
227
+ break;
228
+ }
229
+ else if (collectionFieldType.type === 'Document') {
230
+ // Get the array of Document field values
231
+ const documentFieldValues = fieldControl.value;
232
+ // For each Document field value, set all its property values to null (this is not accepted by the
233
+ // back-end but will be handled by sanitiseObject() in FormValueService before sending - see below for
234
+ // the single Document case)
235
+ if (documentFieldValues) {
236
+ documentFieldValues.forEach((fieldValue, index) => Object.keys(fieldValue.value).forEach(subFieldId => {
237
+ // Get the FormGroup containing the FormControl for the sub-field and set its value to null
238
+ fieldControl.at(index).get(`value.${subFieldId}`).setValue(null);
239
+ }));
240
+ }
241
+ break;
242
+ }
243
+ // Omitted "break" is intentional because a collection should be handled as per MultiSelectList if it is
244
+ // not a collection of Complex types
245
+ // tslint:disable-next-line: no-switch-case-fall-through
246
+ case 'MultiSelectList':
247
+ // Field control should be a FormArray, so map each of its values to null
248
+ // NOTE: The FormArray cannot just be set to an empty array because Angular checks that all existing values
249
+ // of a FormArray are present; setting the control's value to an empty array causes a runtime error
250
+ if (fieldControl.value) {
251
+ // Need to allow for field values that are objects, not just primitives
252
+ fieldControl.setValue(this.mapArrayValuesToNull(fieldControl.value));
253
+ }
254
+ break;
255
+ case 'Document':
256
+ // NOTE: The field control (a FormGroup in this case) cannot just be set to null because Angular checks that
257
+ // all existing values of a FormGroup are present; setting the control's value to null causes a runtime error
258
+ const documentFieldValue = fieldControl.value;
259
+ for (const key in documentFieldValue) {
260
+ if (fieldControl.get(key)) {
261
+ // The back-end doesn't accept null as a valid value for any of the Document field type properties but
262
+ // this is handled by sanitiseObject() in FormValueService, returning a null object for the entire
263
+ // Document field, if any of its properties is null - which is accepted by the back-end
264
+ fieldControl.get(key).setValue(null);
265
+ }
266
+ }
267
+ break;
268
+ // Note: the default case applies to DynamicList fields, too
269
+ default:
270
+ fieldControl.setValue(null);
271
+ }
272
+ }
273
+ }
274
+ /**
275
+ * Maps all values of an array to `null`, retaining keys for any values that are objects. For example,
276
+ * `[{ id: '0', value: 'Test' }, 'Test']` would become `[{ id: null, value: null }, null]`.
277
+ * @param array The array of values to map
278
+ * @returns A new array with the mapped values
279
+ */
280
+ mapArrayValuesToNull(array) {
281
+ return array.map(element => {
282
+ return typeof element === 'object'
283
+ ? Object.assign({}, ...Object.keys(element).map(k => ({ [k]: null })))
284
+ : null;
285
+ });
286
+ }
271
287
  }
272
288
  FieldsPurger.ɵfac = function FieldsPurger_Factory(t) { return new (t || FieldsPurger)(i0.ɵɵinject(i1.FieldsUtils)); };
273
289
  FieldsPurger.ɵprov = i0.ɵɵdefineInjectable({ token: FieldsPurger, factory: FieldsPurger.ɵfac });
274
290
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FieldsPurger, [{
275
291
  type: Injectable
276
292
  }], function () { return [{ type: i1.FieldsUtils }]; }, null); })();
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnB1cmdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvc2VydmljZXMvZmllbGRzL2ZpZWxkcy5wdXJnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU0zQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFJaEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFN0MsV0FBVztBQUVYLE1BQU0sT0FBTyxZQUFZO0lBRXZCLFlBQTZCLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUcsQ0FBQztJQUV6RDs7Ozs7Ozs7OztPQVVHO0lBQ0ssZ0JBQWdCLENBQUMsU0FBb0IsRUFBRSxLQUFnQixFQUFFLFdBQXVCO1FBQ3RGLE1BQU0sU0FBUyxHQUFrQixLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztRQUN2RCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU3QyxJQUFJLFlBQVksRUFBRTtZQUNoQixRQUFRLFNBQVMsRUFBRTtnQkFDakIsS0FBSyxTQUFTO29CQUNaOzs7Ozs7Ozs7O3VCQVVHO29CQUNILElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDOUMsS0FBSyxNQUFNLGVBQWUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRTs0QkFDN0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxlQUFlLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dDQUN2RyxD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UlUsWUFBWTtvREFBWixZQUFZLFdBQVosWUFBWTt1RkFBWixZQUFZO2NBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFdpemFyZFBhZ2VGaWVsZCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY2FzZS1lZGl0b3IvZG9tYWluL3dpemFyZC1wYWdlLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFdpemFyZFBhZ2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbi93aXphcmQtcGFnZS5tb2RlbCc7XG5pbXBvcnQgeyBXaXphcmQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbi93aXphcmQubW9kZWwnO1xuaW1wb3J0IHsgU2hvd0NvbmRpdGlvbiB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29uZGl0aW9uYWwtc2hvdy9kb21haW4vY29uZGl0aW9uYWwtc2hvdy5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlRXZlbnRUcmlnZ2VyIH0gZnJvbSAnLi4vLi4vZG9tYWluL2Nhc2Utdmlldy9jYXNlLWV2ZW50LXRyaWdnZXIubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZUZpZWxkIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vY2FzZS1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBGaWVsZFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vZmllbGQtdHlwZS1lbnVtLm1vZGVsJztcbmltcG9ydCB7IEZpZWxkc1V0aWxzIH0gZnJvbSAnLi9maWVsZHMudXRpbHMnO1xuXG4vLyBAZHluYW1pY1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpZWxkc1B1cmdlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBmaWVsZHNVdGlsczogRmllbGRzVXRpbHMpIHt9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBmaWVsZCB2YWx1ZSBieSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgRm9ybUNvbnRyb2x9IHRvIG51bGwgKG9yIGFuIGVtcHR5IGFycmF5XG4gICAqIGlmIHRoZSBmaWVsZCB0eXBlIGlzIGBDb2xsZWN0aW9uYCksIGV4Y2VwdCB3aGVuIHRoZSBmaWVsZCB0eXBlIGlzIGBDb21wbGV4YCBvciBgRG9jdW1lbnRgLiBGb3IgYENvbXBsZXhgIGZpZWxkXG4gICAqIHR5cGVzLCB0aGlzIHJlY3Vyc2l2ZSBtZXRob2QgaXMgY2FsbGVkIHVudGlsIHNpbXBsZSBvciBcImJhc2VcIiBmaWVsZCB0eXBlcyBhcmUgcmVhY2hlZC4gRm9yIGBEb2N1bWVudGAgZmllbGRcbiAgICogdHlwZXMsIGl0cyBfc3ViLWZpZWxkXyBgRm9ybUNvbnRyb2xgIHZhbHVlcyBhcmUgc2V0IHRvIG51bGwuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtR3JvdXAgVGhlIGBGb3JtR3JvdXBgIGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGBGb3JtQ29udHJvbGAgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGRcbiAgICogQHBhcmFtIGZpZWxkIFRoZSBgQ2FzZUZpZWxkYCB3aG9zZSB2YWx1ZSBpcyB0byBiZSBkZWxldGVkIGluIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSBwYXJlbnRGaWVsZCBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBgQ2FzZUZpZWxkYC4gVXNlZCBmb3IgY2hlY2tpbmcgc3BlY2lmaWNhbGx5IHdoZXJlIGEgQ29tcGxleCBmaWVsZCBhbmRcbiAgICogaXRzIHN1Yi1maWVsZHMgaGF2ZSBgcmV0YWluX2hpZGRlbl92YWx1ZWAgc2V0IHRvIGB0cnVlYCwgYnV0IHRoZSBmaWVsZCdzIHBhcmVudCBoYXMgaXQgc2V0IHRvIGBmYWxzZWAgb3IgdW5kZWZpbmVkXG4gICAqL1xuICAgcHVibGljIGRlbGV0ZUZpZWxkVmFsdWUoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGZpZWxkOiBDYXNlRmllbGQsIHBhcmVudEZpZWxkPzogQ2FzZUZpZWxkKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtID0gZmllbGQuZmllbGRfdHlwZS50eXBlO1xuICAgIGNvbnN0IGZpZWxkQ29udHJvbCA9IGZvcm1Hcm91cC5nZXQoZmllbGQuaWQpO1xuXG4gICAgaWYgKGZpZWxkQ29udHJvbCkge1xuICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ29tcGxleCc6XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogSWYgdGhlIGZpZWxkIGlzIGEgQ29tcGxleCB0eXBlLCBsb29wIG92ZXIgaXRzIHN1Yi1maWVsZHMgYW5kIGNhbGwgZGVsZXRlRmllbGRWYWx1ZSgpIGZvcjpcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqICogQW55IHN1Yi1maWVsZHMgd2hlcmUgcmV0YWluX2hpZGRlbl92YWx1ZSBpcyBmYWxzZS91bmRlZmluZWQsIGlmIHRoZSBwYXJlbnQgZmllbGQgaGFzXG4gICAgICAgICAgICogcmV0YWluX2hpZGRlbl92YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICogKiBBTEwgc3ViLWZpZWxkcyBpZiB0aGUgcGFyZW50IGZpZWxkIGhhcyByZXRhaW5faGlkZGVuX3ZhbHVlID0gdHJ1ZSBCVVQgaXRzIF9vd25fIHBhcmVudCBoYXNcbiAgICAgICAgICAgKiByZXRhaW5faGlkZGVuX3ZhbHVlID0gZmFsc2UvdW5kZWZpbmVkICh0aHVzIG92ZXJyaWRpbmcgYW55dGhpbmcgZWxzZSk7XG4gICAgICAgICAgICogKiBBTEwgc3ViLWZpZWxkcyBpZiB0aGUgcGFyZW50IGZpZWxkIGhhcyByZXRhaW5faGlkZGVuX3ZhbHVlID0gZmFsc2UvdW5kZWZpbmVkO1xuICAgICAgICAgICAqICogQW55IENvbXBsZXggc3ViLWZpZWxkcyAqcmVnYXJkbGVzcyBvZiB0aGVpciByZXRhaW5faGlkZGVuX3ZhbHVlKiAoaW4gb3JkZXIgdG8gaW5zcGVjdCB0aGUgc3ViLWZpZWxkc1xuICAgICAgICAgICAqIG9mIGEgQ29tcGxleCB0eXBlIHdpdGhpbiBhbm90aGVyIENvbXBsZXggdHlwZSlcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBpZiAoZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbXBsZXhTdWJGaWVsZCBvZiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICAgIGlmICgoY29tcGxleFN1YkZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmIGNvbXBsZXhTdWJGaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAoY29tcGxleFN1YkZpZWxkLmZpZWxkX3R5cGUudHlwZSAhPT0gJ0NvbXBsZXgnICYmXG4gICAgICAgICAgICAgICAgICAoZmllbGQucmV0YWluX2hpZGRlbl92YWx1ZVxuICAgICAgICAgICAgICAgICAgICA/ICFjb21wbGV4U3ViRmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSB8fCAocGFyZW50RmllbGQgJiYgIXBhcmVudEZpZWxkLnJldGFpbl9oaWRkZW5fdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIDogdHJ1ZSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGZpZWxkQ29udHJvbCBpcyBjYXN0IHRvIGEgRm9ybUdyb3VwIGJlY2F1c2UgYSBDb21wbGV4IGZpZWxkIHR5cGUgdXNlcyB0aGlzIGFzIGl0cyB1bmRlcmx5aW5nXG4gICAgICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUoZmllbGRDb250cm9sIGFzIEZvcm1Hcm91cCwgY29tcGxleFN1YkZpZWxkLCBmaWVsZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIC8vIElmIGl0IGlzIGEgY29sbGVjdGlvbiBvZiBDb21wbGV4IHR5cGVzLCBsb29wIHRocm91Z2ggZWFjaCBvbmU7IGVsc2UgZmFsbCB0aHJvdWdoIHRvIGJlIGhhbmRsZWQgYXMgYVxuICAgICAgICAgIC8vIGNvbGxlY3Rpb24gb2Ygc2ltcGxlIHR5cGVzIChpbiB0aGUgc2FtZSB3YXkgYXMgTXVsdGlTZWxlY3RMaXN0KSwgdW5sZXNzIGl0J3MgYSBjb2xsZWN0aW9uIG9mIERvY3VtZW50XG4gICAgICAgICAgLy8gdHlwZXMsIHdoaWNoIHJlcXVpcmVzIGRpZmZlcmVudCBoYW5kbGluZ1xuICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25GaWVsZFR5cGUgPSBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZTtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbkZpZWxkVHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgY29sbGVjdGlvbkZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGFycmF5IG9mIENvbXBsZXggZmllbGQgdmFsdWVzXG4gICAgICAgICAgICBjb25zdCBjb21wbGV4RmllbGRWYWx1ZXMgPSBmaWVsZENvbnRyb2wudmFsdWUgYXMgYW55W107XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIENvbXBsZXggZmllbGQgdmFsdWUsIGdldCB0aGUgSUQgb2YgZWFjaCBzdWItZmllbGQgd2l0aGluIGl0IGFuZCB1c2UgYXMgYSBrZXkgdG8gZmluZCB0aGVcbiAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgc3ViLUNhc2VGaWVsZCAod2hpY2ggY29udGFpbnMgdGhlIGZpZWxkIHR5cGUgaW5mb3JtYXRpb24pXG4gICAgICAgICAgICBpZiAoY29tcGxleEZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICAgIGNvbXBsZXhGaWVsZFZhbHVlcy5mb3JFYWNoKChmaWVsZFZhbHVlLCBpbmRleCkgPT4gT2JqZWN0LmtleXMoZmllbGRWYWx1ZS52YWx1ZSkuZm9yRWFjaChzdWJGaWVsZElkID0+IHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBzdWItQ2FzZUZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1Yi1maWVsZCBJRFxuICAgICAgICAgICAgICAgIGxldCBzdWJDYXNlRmllbGQ6IENhc2VGaWVsZDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhc2VGaWVsZCBvZiBjb2xsZWN0aW9uRmllbGRUeXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2FzZUZpZWxkLmlkID09PSBzdWJGaWVsZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YkNhc2VGaWVsZCA9IGNhc2VGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZGVsZXRlIHRoZSBzdWItZmllbGQgdmFsdWUsIHBhc3NpbmcgaW4gdGhlIHBhcmVudCBGb3JtR3JvdXBcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cCA9IChmaWVsZENvbnRyb2wgYXMgRm9ybUFycmF5KS5hdChpbmRleCkuZ2V0KCd2YWx1ZScpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUocGFyZW50Rm9ybUdyb3VwLCBzdWJDYXNlRmllbGQpO1xuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25GaWVsZFR5cGUudHlwZSA9PT0gJ0RvY3VtZW50Jykge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBhcnJheSBvZiBEb2N1bWVudCBmaWVsZCB2YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RmllbGRWYWx1ZXMgPSBmaWVsZENvbnRyb2wudmFsdWUgYXMgYW55W107XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIERvY3VtZW50IGZpZWxkIHZhbHVlLCBzZXQgYWxsIGl0cyBwcm9wZXJ0eSB2YWx1ZXMgdG8gbnVsbCAodGhpcyBpcyBub3QgYWNjZXB0ZWQgYnkgdGhlXG4gICAgICAgICAgICAvLyBiYWNrLWVuZCBidXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHNhbml0aXNlT2JqZWN0KCkgaW4gRm9ybVZhbHVlU2VydmljZSBiZWZvcmUgc2VuZGluZyAtIHNlZSBiZWxvdyBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBzaW5nbGUgRG9jdW1lbnQgY2FzZSlcbiAgICAgICAgICAgIGlmIChkb2N1bWVudEZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICAgIGRvY3VtZW50RmllbGRWYWx1ZXMuZm9yRWFjaCgoZmllbGRWYWx1ZSwgaW5kZXgpID0+IE9iamVjdC5rZXlzKGZpZWxkVmFsdWUudmFsdWUpLmZvckVhY2goc3ViRmllbGRJZCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBGb3JtR3JvdXAgY29udGFpbmluZyB0aGUgRm9ybUNvbnRyb2wgZm9yIHRoZSBzdWItZmllbGQgYW5kIHNldCBpdHMgdmFsdWUgdG8gbnVsbFxuICAgICAgICAgICAgICAgIChmaWVsZENvbnRyb2wgYXMgRm9ybUFycmF5KS5hdChpbmRleCkuZ2V0KGB2YWx1ZS4ke3N1YkZpZWxkSWR9YCkuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBPbWl0dGVkIFwiYnJlYWtcIiBpcyBpbnRlbnRpb25hbCBiZWNhdXNlIGEgY29sbGVjdGlvbiBzaG91bGQgYmUgaGFuZGxlZCBhcyBwZXIgTXVsdGlTZWxlY3RMaXN0IGlmIGl0IGlzXG4gICAgICAgICAgLy8gbm90IGEgY29sbGVjdGlvbiBvZiBDb21wbGV4IHR5cGVzXG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zd2l0Y2gtY2FzZS1mYWxsLXRocm91Z2hcbiAgICAgICAgY2FzZSAnTXVsdGlTZWxlY3RMaXN0JzpcbiAgICAgICAgICAvLyBGaWVsZCBjb250cm9sIHNob3VsZCBiZSBhIEZvcm1BcnJheSwgc28gbWFwIGVhY2ggb2YgaXRzIHZhbHVlcyB0byBudWxsXG4gICAgICAgICAgLy8gTk9URTogVGhlIEZvcm1BcnJheSBjYW5ub3QganVzdCBiZSBzZXQgdG8gYW4gZW1wdHkgYXJyYXkgYmVjYXVzZSBBbmd1bGFyIGNoZWNrcyB0aGF0IGFsbCBleGlzdGluZyB2YWx1ZXNcbiAgICAgICAgICAvLyBvZiBhIEZvcm1BcnJheSBhcmUgcHJlc2VudDsgc2V0dGluZyB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGFuIGVtcHR5IGFycmF5IGNhdXNlcyBhIHJ1bnRpbWUgZXJyb3JcbiAgICAgICAgICBmaWVsZENvbnRyb2wuc2V0VmFsdWUoZmllbGRDb250cm9sLnZhbHVlLm1hcCgoKSA9PiBudWxsKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RvY3VtZW50JzpcbiAgICAgICAgICAvLyBOT1RFOiBUaGUgZmllbGQgY29udHJvbCAoYSBGb3JtR3JvdXAgaW4gdGhpcyBjYXNlKSBjYW5ub3QganVzdCBiZSBzZXQgdG8gbnVsbCBiZWNhdXNlIEFuZ3VsYXIgY2hlY2tzIHRoYXRcbiAgICAgICAgICAvLyBhbGwgZXhpc3RpbmcgdmFsdWVzIG9mIGEgRm9ybUdyb3VwIGFyZSBwcmVzZW50OyBzZXR0aW5nIHRoZSBjb250cm9sJ3MgdmFsdWUgdG8gbnVsbCBjYXVzZXMgYSBydW50aW1lIGVycm9yXG4gICAgICAgICAgY29uc3QgZG9jdW1lbnRGaWVsZFZhbHVlID0gZmllbGRDb250cm9sLnZhbHVlO1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRvY3VtZW50RmllbGRWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKGZpZWxkQ29udHJvbC5nZXQoa2V5KSkge1xuICAgICAgICAgICAgICAvLyBUaGUgYmFjay1lbmQgZG9lc24ndCBhY2NlcHQgbnVsbCBhcyBhIHZhbGlkIHZhbHVlIGZvciBhbnkgb2YgdGhlIERvY3VtZW50IGZpZWxkIHR5cGUgcHJvcGVydGllcyBidXRcbiAgICAgICAgICAgICAgLy8gdGhpcyBpcyBoYW5kbGVkIGJ5IHNhbml0aXNlT2JqZWN0KCkgaW4gRm9ybVZhbHVlU2VydmljZSwgcmV0dXJuaW5nIGEgbnVsbCBvYmplY3QgZm9yIHRoZSBlbnRpcmVcbiAgICAgICAgICAgICAgLy8gRG9jdW1lbnQgZmllbGQsIGlmIGFueSBvZiBpdHMgcHJvcGVydGllcyBpcyBudWxsIC0gd2hpY2ggaXMgYWNjZXB0ZWQgYnkgdGhlIGJhY2stZW5kXG4gICAgICAgICAgICAgIGZpZWxkQ29udHJvbC5nZXQoa2V5KS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIE5vdGU6IHRoZSBkZWZhdWx0IGNhc2UgYXBwbGllcyB0byBEeW5hbWljTGlzdCBmaWVsZHMsIHRvb1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGZpZWxkQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXJIaWRkZW5GaWVsZHMoZm9ybTogRm9ybUdyb3VwLCB3aXphcmQ6IFdpemFyZCwgZXZlbnRUcmlnZ2VyOiBDYXNlRXZlbnRUcmlnZ2VyLCBjdXJyZW50UGFnZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFySGlkZGVuRmllbGRGb3JGaWVsZFNob3dDb25kaXRpb24oY3VycmVudFBhZ2VJZCwgZm9ybSwgd2l6YXJkLCBldmVudFRyaWdnZXIpO1xuICAgIHRoaXMuY2xlYXJIaWRkZW5GaWVsZEZvclBhZ2VTaG93Q29uZGl0aW9uKGZvcm0sIHdpemFyZCwgZXZlbnRUcmlnZ2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJIaWRkZW5GaWVsZEZvclBhZ2VTaG93Q29uZGl0aW9uKGZvcm06IEZvcm1Hcm91cCwgd2l6YXJkOiBXaXphcmQsIGV2ZW50VHJpZ2dlcjogQ2FzZUV2ZW50VHJpZ2dlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRFdmVudFN0YXRlID0gdGhpcy5maWVsZHNVdGlscy5nZXRDdXJyZW50RXZlbnRTdGF0ZShldmVudFRyaWdnZXIsIGZvcm0pO1xuICAgIHdpemFyZC5wYWdlcy5mb3JFYWNoKHdwID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc1Nob3dDb25kaXRpb25QYWdlKHdwLCBjdXJyZW50RXZlbnRTdGF0ZSkpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gbmV3IFNob3dDb25kaXRpb24od3Auc2hvd19jb25kaXRpb24pO1xuICAgICAgICBpZiAodGhpcy5pc0hpZGRlbihjb25kaXRpb24sIGN1cnJlbnRFdmVudFN0YXRlKSkge1xuICAgICAgICAgIHRoaXMucmVzZXRQYWdlKGZvcm0sIHdwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckhpZGRlbkZpZWxkRm9yRmllbGRTaG93Q29uZGl0aW9uKGN1cnJlbnRQYWdlSWQ6IHN0cmluZywgZm9ybTogRm9ybUdyb3VwLCB3aXphcmQ6IFdpemFyZCxcbiAgICBldmVudFRyaWdnZXI6IENhc2VFdmVudFRyaWdnZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtRmllbGRzID0gZm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRQYWdlOiBXaXphcmRQYWdlID0gd2l6YXJkLmdldFBhZ2UoY3VycmVudFBhZ2VJZCwgdGhpcy5maWVsZHNVdGlscy5idWlsZENhblNob3dQcmVkaWNhdGUoZXZlbnRUcmlnZ2VyLCBmb3JtKSk7XG4gICAgY3VycmVudFBhZ2Uud2l6YXJkX3BhZ2VfZmllbGRzLmZvckVhY2god3BmID0+IHtcbiAgICAgIGNvbnN0IGNhc2VfZmllbGQgPSB0aGlzLmZpbmRDYXNlRmllbGRCeVdpemFyZFBhZ2VGaWVsZElkKGN1cnJlbnRQYWdlLCB3cGYpO1xuICAgICAgaWYgKHRoaXMuaGFzU2hvd0NvbmRpdGlvbkZpZWxkKGNhc2VfZmllbGQsIGZvcm1GaWVsZHMpKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IG5ldyBTaG93Q29uZGl0aW9uKGNhc2VfZmllbGQuc2hvd19jb25kaXRpb24pO1xuICAgICAgICBpZiAodGhpcy5pc0hpZGRlbihjb25kaXRpb24sIGZvcm1GaWVsZHMuZGF0YSkgJiYgISh0aGlzLmlzUmVhZG9ubHkoY2FzZV9maWVsZCkpKSB7XG4gICAgICAgICAgdGhpcy5yZXNldEZpZWxkKGZvcm0sIGNhc2VfZmllbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJldGFpbkhpZGRlblZhbHVlQnlGaWVsZFR5cGUoY2FzZV9maWVsZCwgZm9ybSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJldGFpbkhpZGRlblZhbHVlQnlGaWVsZFR5cGUoZmllbGQ6IENhc2VGaWVsZCwgZm9ybTogYW55KTogdm9pZCB7XG4gICAgLy8gc28gZmFyIG9ubHkgYXBwbGllcyB0byB0aGUgbmV3IGZpZWxkIHR5cGUgT3JnYW5pc2F0aW9uUG9saWN5IHdoaWNoIG5lZWRzIHRvIHJldGFpbiB0aGUgZGVmYXVsdCBjYXNlIHJvbGUgdmFsdWVcbiAgICAvLyBmb3Igb3RoZXIgY2FzZSBmaWVsZHMgdGhlcmUgc2hvdWxkIGJlIG5vIHNpZGUgZWZmZWN0c1xuICAgIGlmIChmaWVsZCAmJiBmaWVsZC5maWVsZF90eXBlICYmIGZpZWxkLmZpZWxkX3R5cGUuaWQgPT09ICdPcmdhbmlzYXRpb25Qb2xpY3knKSB7XG4gICAgICAvLyA8YnViYmxlX3dyYXA+XG4gICAgICAvLyBEb2luZyBzb21lIG51bGwgY2hlY2tpbmcgdG8gc3RvcCBpdCBmcm9tIGZhbGxpbmcgb3Zlci5cbiAgICAgIGNvbnN0IGRhdGE6IEZvcm1Hcm91cCA9IGZvcm0uZ2V0KCdkYXRhJykgYXMgRm9ybUdyb3VwO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgY29uc3QgZmllbGRHcm91cDogRm9ybUdyb3VwID0gZGF0YS5jb250cm9sc1tmaWVsZC5pZF0gYXMgRm9ybUdyb3VwO1xuICAgICAgICBpZiAoZmllbGRHcm91cCkge1xuICAgICAgICAgIGNvbnN0IGNhc2VSb2xlRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sID0gZmllbGRHcm91cC5nZXQoJ09yZ1BvbGljeUNhc2VBc3NpZ25lZFJvbGUnKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgICAgICBpZiAoY2FzZVJvbGVGb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgY2FzZVJvbGVGb3JtQ29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIDwvYnViYmxlX3dyYXA+XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0hpZGRlbihjb25kaXRpb246IFNob3dDb25kaXRpb24sIGZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhY29uZGl0aW9uLm1hdGNoKGZvcm1GaWVsZHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQ2FzZUZpZWxkQnlXaXphcmRQYWdlRmllbGRJZChjdXJyZW50UGFnZTogV2l6YXJkUGFnZSwgd2l6YXJkUGFnZUZpZWxkOiBXaXphcmRQYWdlRmllbGQpOiBDYXNlRmllbGQge1xuICAgIHJldHVybiBjdXJyZW50UGFnZS5jYXNlX2ZpZWxkcy5maW5kKGNmID0+IGNmLmlkID09PSB3aXphcmRQYWdlRmllbGQuY2FzZV9maWVsZF9pZCk7XG4gIH1cblxuICBwcml2YXRlIGhhc1Nob3dDb25kaXRpb25QYWdlKHdpemFyZFBhZ2U6IFdpemFyZFBhZ2UsIGZvcm1GaWVsZHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aXphcmRQYWdlLnNob3dfY29uZGl0aW9uICYmIGZvcm1GaWVsZHNbdGhpcy5nZXRTaG93Q29uZGl0aW9uS2V5KHdpemFyZFBhZ2Uuc2hvd19jb25kaXRpb24pXTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzU2hvd0NvbmRpdGlvbkZpZWxkKGNhc2VfZmllbGQ6IENhc2VGaWVsZCwgZm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNhc2VfZmllbGQuc2hvd19jb25kaXRpb24gJiYgZm9ybUZpZWxkcy5kYXRhW3RoaXMuZ2V0U2hvd0NvbmRpdGlvbktleShjYXNlX2ZpZWxkLnNob3dfY29uZGl0aW9uKV07XG4gIH1cblxuICBwcml2YXRlIGdldFNob3dDb25kaXRpb25LZXkoc2hvd19jb25kaXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gTmVlZCB0byBhbGxvdyBmb3IgbmVnYXRlZCBjb25kaXRpb25zLCBpLmUuICE9LCBhcyB3ZWxsIGFzIHJlZ3VsYXIgb25lcyAoPSlcbiAgICAvLyBBbHNvIG5lZWQgdG8gYWxsb3cgZm9yIGNvbmRpdGlvbnMgc3BlY2lmaWVkIHVzaW5nIHRoZSBcIkNPTlRBSU5TXCIga2V5d29yZFxuICAgIHJldHVybiBzaG93X2NvbmRpdGlvbi5zcGxpdCgvIT18PXxDT05UQUlOUy8pWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZpZWxkKGZvcm06IEZvcm1Hcm91cCwgZmllbGQ6IENhc2VGaWVsZCk6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBoaWRkZW4gZmllbGQncyB2YWx1ZSBpcyB0byBiZSByZXRhaW5lZCwgZG8gbm90aGluZyAoZXhjZXB0IGlmIGl0IGlzIGEgQ29tcGxleCB0eXBlIG9yIGNvbGxlY3Rpb24gb2ZcbiAgICAgKiBDb21wbGV4IHR5cGVzKS4gVGhpcyBpcyBhIGNoYW5nZSB0byB0aGUgcHJldmlvdXMgYmVoYXZpb3VyICh3aGljaCB1c2VkIHRvIGNsZWFyIHRoZSBmaWVsZCB2YWx1ZSBidXQgcmVtb3ZlIGl0XG4gICAgICogZnJvbSBzdWJtaXNzaW9uIGFzIGFuIHVwZGF0ZSB0byB0aGUgYmFjay1lbmQpLiBUaGUgbmV3IGJlaGF2aW91ciBpcyB0byBsZWF2ZSB0aGUgZmllbGQgYXMgaXMsIHNvIGlmIHRoZSBmaWVsZFxuICAgICAqIGlzIGhpZGRlbiBidXQgdGhlbiB1bi1oaWRkZW4gYmVmb3JlIGZvcm0gc3VibWlzc2lvbiwgYW55IHByZXZpb3VzbHkgZW50ZXJlZCB2YWx1ZSBpcyByZXRhaW5lZC5cbiAgICAgKlxuICAgICAqIEZvciBDb21wbGV4IGZpZWxkIHR5cGVzLCBhbiBhZGRpdGlvbmFsIGNoZWNrIG9mIHN1Yi1maWVsZHMgaXMgcmVxdWlyZWQuIFRoZSBzYW1lIGFwcGxpZXMgdG8gYSBjb2xsZWN0aW9uIG9mXG4gICAgICogQ29tcGxleCB0eXBlcy5cbiAgICAgKi9cbiAgICBpZiAoZmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSkge1xuICAgICAgY29uc3QgZmllbGRUeXBlOiBGaWVsZFR5cGVFbnVtID0gZmllbGQuZmllbGRfdHlwZS50eXBlO1xuICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgQ29tcGxleCB0eXBlLCBsb29wIG92ZXIgaXRzIHN1Yi1maWVsZHMgYW5kIGNhbGwgZGVsZXRlRmllbGRWYWx1ZSgpIGZvciBhbnkgc3ViLWZpZWxkc1xuICAgICAgLy8gd2hlcmUgcmV0YWluX2hpZGRlbl92YWx1ZSBpcyBmYWxzZSwgT1IgZm9yIGFueSBDb21wbGV4IHN1Yi1maWVsZHMgKnJlZ2FyZGxlc3Mgb2YgdGhlaXIgcmV0YWluX2hpZGRlbl92YWx1ZSpcbiAgICAgIC8vIChpbiBvcmRlciB0byBpbnNwZWN0IHRoZSBzdWItZmllbGRzIG9mIGEgQ29tcGxleCB0eXBlIHdpdGhpbiBhbm90aGVyIENvbXBsZXggdHlwZSlcbiAgICAgIGlmIChmaWVsZFR5cGUgPT09ICdDb21wbGV4JyAmJiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBjb21wbGV4U3ViRmllbGQgb2YgZmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgIGlmICgoY29tcGxleFN1YkZpZWxkLmZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmIGNvbXBsZXhTdWJGaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICFjb21wbGV4U3ViRmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHBhcmVudCBGb3JtR3JvdXAgY29ycmVzcG9uZGluZyB0byB0aGUgQ29tcGxleCBmaWVsZDsgaWYgaXQgZXhpc3RzLCBjYWxsXG4gICAgICAgICAgICAvLyBkZWxldGVGaWVsZFZhbHVlKCkgdG8gZGVsZXRlIHRoZSBzdWItZmllbGRcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEZvcm1Hcm91cCA9IChmb3JtLmdldCgnZGF0YScpIGFzIEZvcm1Hcm91cCkuY29udHJvbHNbZmllbGQuaWRdIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRGb3JtR3JvdXApIHtcbiAgICAgICAgICAgICAgdGhpcy5kZWxldGVGaWVsZFZhbHVlKHBhcmVudEZvcm1Hcm91cCwgY29tcGxleFN1YkZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09PSAnQ29sbGVjdGlvbicgJiYgZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmXG4gICAgICAgICAgICAgICAgZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBJZiB0aGUgZmllbGQgaXMgYSBjb2xsZWN0aW9uIG9mIENvbXBsZXggdHlwZXMsIGxvb3AgdGhyb3VnaCBlYWNoIG9uZSBhbmQgY2FsbCBkZWxldGVGaWVsZFZhbHVlKCkgZm9yIGFueVxuICAgICAgICAvLyBzdWItZmllbGRzIHdoZXJlIHJldGFpbl9oaWRkZW5fdmFsdWUgaXMgZmFsc2UsIE9SIGZvciBhbnkgQ29tcGxleCBzdWItZmllbGRzICpyZWdhcmRsZXNzIG9mIHRoZWlyXG4gICAgICAgIC8vIHJldGFpbl9oaWRkZW5fdmFsdWUqIChpbiBvcmRlciB0byBpbnNwZWN0IHRoZSBzdWItZmllbGRzIG9mIGEgQ29tcGxleCB0eXBlIHdpdGhpbiBhbm90aGVyIENvbXBsZXggdHlwZSlcblxuICAgICAgICAvLyBHZXQgdGhlIGFycmF5IG9mIGZpZWxkIGNvbnRyb2xzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENvbXBsZXggZmllbGQgdmFsdWVzXG4gICAgICAgIGNvbnN0IGZpZWxkQ29udHJvbHMgPSAoZm9ybS5nZXQoJ2RhdGEnKSBhcyBGb3JtR3JvdXApLmNvbnRyb2xzW2ZpZWxkLmlkXSBhcyBGb3JtQXJyYXk7XG5cbiAgICAgICAgaWYgKGZpZWxkQ29udHJvbHMpIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIGFycmF5IG9mIENvbXBsZXggZmllbGQgdmFsdWVzXG4gICAgICAgICAgY29uc3QgY29tcGxleEZpZWxkVmFsdWVzID0gZmllbGRDb250cm9scy52YWx1ZSBhcyBhbnlbXTtcblxuICAgICAgICAgIC8vIEZvciBlYWNoIENvbXBsZXggZmllbGQgdmFsdWUsIGdldCB0aGUgSUQgb2YgZWFjaCBzdWItZmllbGQgd2l0aGluIGl0IGFuZCB1c2UgYXMgYSBrZXkgdG8gZmluZCB0aGVcbiAgICAgICAgICAvLyBjb3JyZXNwb25kaW5nIHN1Yi1DYXNlRmllbGQgKHdoaWNoIGNvbnRhaW5zIHRoZSBmaWVsZCB0eXBlIGluZm9ybWF0aW9uKVxuICAgICAgICAgIGlmIChjb21wbGV4RmllbGRWYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbXBsZXhGaWVsZFZhbHVlcy5mb3JFYWNoKChmaWVsZFZhbHVlLCBpbmRleCkgPT4gT2JqZWN0LmtleXMoZmllbGRWYWx1ZS52YWx1ZSkuZm9yRWFjaChzdWJGaWVsZElkID0+IHtcbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgc3ViLUNhc2VGaWVsZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdWItZmllbGQgSURcbiAgICAgICAgICAgICAgbGV0IHN1YkNhc2VGaWVsZDogQ2FzZUZpZWxkO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhc2VGaWVsZCBvZiBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChjYXNlRmllbGQuaWQgPT09IHN1YkZpZWxkSWQpIHtcbiAgICAgICAgICAgICAgICAgIHN1YkNhc2VGaWVsZCA9IGNhc2VGaWVsZDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgc3ViLWZpZWxkIHZhbHVlIGlmIHJldGFpbl9oaWRkZW5fdmFsdWUgaXMgZmFsc2UsIE9SIGlmIHRoZSBzdWItZmllbGQgdHlwZSBpc1xuICAgICAgICAgICAgICAvLyBDb21wbGV4IGFuZCByZWdhcmRsZXNzIG9mIHJldGFpbl9oaWRkZW5fdmFsdWUsIHBhc3NpbmcgaW4gdGhlIHBhcmVudCBGb3JtR3JvdXBcbiAgICAgICAgICAgICAgaWYgKHN1YkNhc2VGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgKChzdWJDYXNlRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgc3ViQ2FzZUZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICFzdWJDYXNlRmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cCA9IGZpZWxkQ29udHJvbHMuYXQoaW5kZXgpLmdldCgndmFsdWUnKSBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVGaWVsZFZhbHVlKHBhcmVudEZvcm1Hcm91cCwgc3ViQ2FzZUZpZWxkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWxldGUgdGhlIGZpZWxkIHZhbHVlXG4gICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUoZm9ybS5nZXQoJ2RhdGEnKSBhcyBGb3JtR3JvdXAsIGZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0UGFnZShmb3JtOiBGb3JtR3JvdXAsIHdpemFyZFBhZ2U6IFdpemFyZFBhZ2UpOiB2b2lkIHtcbiAgICB3aXphcmRQYWdlLndpemFyZF9wYWdlX2ZpZWxkcy5mb3JFYWNoKHdwZiA9PiB7XG4gICAgICBjb25zdCBjYXNlX2ZpZWxkID0gdGhpcy5maW5kQ2FzZUZpZWxkQnlXaXphcmRQYWdlRmllbGRJZCh3aXphcmRQYWdlLCB3cGYpO1xuICAgICAgdGhpcy5yZXNldEZpZWxkKGZvcm0sIGNhc2VfZmllbGQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeXBlKGVsZW06IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlbGVtKS5zbGljZSg4LCAtMSk7XG4gIH1cblxuICBwcml2YXRlIGlzT2JqZWN0KGVsZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFR5cGUoZWxlbSkgPT09ICdPYmplY3QnO1xuICB9XG5cbiAgLy8gVE9ETzogY2FsbCBpc1JlYWRPbmx5IG9uIENhc2VGaWVsZHMgb25jZSB3ZSBtYWtlIGl0IGF2YWlsYWJsZVxuICBwcml2YXRlIGlzUmVhZG9ubHkoY2FzZV9maWVsZDogQ2FzZUZpZWxkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNhc2VfZmllbGQuZGlzcGxheV9jb250ZXh0LnRvVXBwZXJDYXNlKCkgPT09ICdSRUFET05MWSc7XG4gIH1cbn1cbiJdfQ==
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLnB1cmdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NjZC1jYXNlLXVpLXRvb2xraXQvc3JjL2xpYi9zaGFyZWQvc2VydmljZXMvZmllbGRzL2ZpZWxkcy5wdXJnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU0zQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFJaEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFN0MsV0FBVztBQUVYLE1BQU0sT0FBTyxZQUFZO0lBRXZCLFlBQTZCLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUksQ0FBQztJQUVuRCxpQkFBaUIsQ0FBQyxJQUFlLEVBQUUsTUFBYyxFQUFFLFlBQThCLEVBQUUsYUFBcUI7UUFDN0csSUFBSSxDQUFDLHFDQUFxQyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFTyxvQ0FBb0MsQ0FBQyxJQUFlLEVBQUUsTUFBYyxFQUFFLFlBQThCO1FBQzFHLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDLEVBQUU7Z0JBQ3BELE1BQU0sU0FBUyxHQUFHLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FB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QUksQ0FBQyxDQUFDO2FBQy9CO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxvQkFBb0IsQ0FBQyxLQUFZO1FBQ3RDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QixPQUFPLE9BQU8sT0FBTyxLQUFLLFFBQVE7Z0JBQ2hDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzt3RUE1U1UsWUFBWTtvREFBWixZQUFZLFdBQVosWUFBWTt1RkFBWixZQUFZO2NBRHhCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFdpemFyZFBhZ2VGaWVsZCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY2FzZS1lZGl0b3IvZG9tYWluL3dpemFyZC1wYWdlLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFdpemFyZFBhZ2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbi93aXphcmQtcGFnZS5tb2RlbCc7XG5pbXBvcnQgeyBXaXphcmQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2Nhc2UtZWRpdG9yL2RvbWFpbi93aXphcmQubW9kZWwnO1xuaW1wb3J0IHsgU2hvd0NvbmRpdGlvbiB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29uZGl0aW9uYWwtc2hvdy9kb21haW4vY29uZGl0aW9uYWwtc2hvdy5tb2RlbCc7XG5pbXBvcnQgeyBDYXNlRXZlbnRUcmlnZ2VyIH0gZnJvbSAnLi4vLi4vZG9tYWluL2Nhc2Utdmlldy9jYXNlLWV2ZW50LXRyaWdnZXIubW9kZWwnO1xuaW1wb3J0IHsgQ2FzZUZpZWxkIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vY2FzZS1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBGaWVsZFR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vZG9tYWluL2RlZmluaXRpb24vZmllbGQtdHlwZS1lbnVtLm1vZGVsJztcbmltcG9ydCB7IEZpZWxkc1V0aWxzIH0gZnJvbSAnLi9maWVsZHMudXRpbHMnO1xuXG4vLyBAZHluYW1pY1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpZWxkc1B1cmdlciB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBmaWVsZHNVdGlsczogRmllbGRzVXRpbHMpIHsgfVxuXG4gIHB1YmxpYyBjbGVhckhpZGRlbkZpZWxkcyhmb3JtOiBGb3JtR3JvdXAsIHdpemFyZDogV2l6YXJkLCBldmVudFRyaWdnZXI6IENhc2VFdmVudFRyaWdnZXIsIGN1cnJlbnRQYWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJIaWRkZW5GaWVsZEZvckZpZWxkU2hvd0NvbmRpdGlvbihjdXJyZW50UGFnZUlkLCBmb3JtLCB3aXphcmQsIGV2ZW50VHJpZ2dlcik7XG4gICAgdGhpcy5jbGVhckhpZGRlbkZpZWxkRm9yUGFnZVNob3dDb25kaXRpb24oZm9ybSwgd2l6YXJkLCBldmVudFRyaWdnZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckhpZGRlbkZpZWxkRm9yUGFnZVNob3dDb25kaXRpb24oZm9ybTogRm9ybUdyb3VwLCB3aXphcmQ6IFdpemFyZCwgZXZlbnRUcmlnZ2VyOiBDYXNlRXZlbnRUcmlnZ2VyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudEV2ZW50U3RhdGUgPSB0aGlzLmZpZWxkc1V0aWxzLmdldEN1cnJlbnRFdmVudFN0YXRlKGV2ZW50VHJpZ2dlciwgZm9ybSk7XG4gICAgd2l6YXJkLnBhZ2VzLmZvckVhY2god3AgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzU2hvd0NvbmRpdGlvblBhZ2Uod3AsIGN1cnJlbnRFdmVudFN0YXRlKSkge1xuICAgICAgICBjb25zdCBjb25kaXRpb24gPSBuZXcgU2hvd0NvbmRpdGlvbih3cC5zaG93X2NvbmRpdGlvbik7XG4gICAgICAgIGlmICh0aGlzLmlzSGlkZGVuKGNvbmRpdGlvbiwgY3VycmVudEV2ZW50U3RhdGUpKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFBhZ2UoZm9ybSwgd3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySGlkZGVuRmllbGRGb3JGaWVsZFNob3dDb25kaXRpb24oY3VycmVudFBhZ2VJZDogc3RyaW5nLCBmb3JtOiBGb3JtR3JvdXAsIHdpemFyZDogV2l6YXJkLFxuICAgIGV2ZW50VHJpZ2dlcjogQ2FzZUV2ZW50VHJpZ2dlcik6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1GaWVsZHMgPSBmb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgY29uc3QgY3VycmVudFBhZ2U6IFdpemFyZFBhZ2UgPSB3aXphcmQuZ2V0UGFnZShjdXJyZW50UGFnZUlkLCB0aGlzLmZpZWxkc1V0aWxzLmJ1aWxkQ2FuU2hvd1ByZWRpY2F0ZShldmVudFRyaWdnZXIsIGZvcm0pKTtcbiAgICBjdXJyZW50UGFnZS53aXphcmRfcGFnZV9maWVsZHMuZm9yRWFjaCh3cGYgPT4ge1xuICAgICAgY29uc3QgY2FzZV9maWVsZCA9IHRoaXMuZmluZENhc2VGaWVsZEJ5V2l6YXJkUGFnZUZpZWxkSWQoY3VycmVudFBhZ2UsIHdwZik7XG4gICAgICBpZiAodGhpcy5oYXNTaG93Q29uZGl0aW9uRmllbGQoY2FzZV9maWVsZCwgZm9ybUZpZWxkcykpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gbmV3IFNob3dDb25kaXRpb24oY2FzZV9maWVsZC5zaG93X2NvbmRpdGlvbik7XG4gICAgICAgIGlmICh0aGlzLmlzSGlkZGVuKGNvbmRpdGlvbiwgZm9ybUZpZWxkcy5kYXRhKSAmJiAhKHRoaXMuaXNSZWFkb25seShjYXNlX2ZpZWxkKSkpIHtcbiAgICAgICAgICB0aGlzLnJlc2V0RmllbGQoZm9ybSwgY2FzZV9maWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucmV0YWluSGlkZGVuVmFsdWVCeUZpZWxkVHlwZShjYXNlX2ZpZWxkLCBmb3JtKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmV0YWluSGlkZGVuVmFsdWVCeUZpZWxkVHlwZShmaWVsZDogQ2FzZUZpZWxkLCBmb3JtOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBzbyBmYXIgb25seSBhcHBsaWVzIHRvIHRoZSBuZXcgZmllbGQgdHlwZSBPcmdhbmlzYXRpb25Qb2xpY3kgd2hpY2ggbmVlZHMgdG8gcmV0YWluIHRoZSBkZWZhdWx0IGNhc2Ugcm9sZSB2YWx1ZVxuICAgIC8vIGZvciBvdGhlciBjYXNlIGZpZWxkcyB0aGVyZSBzaG91bGQgYmUgbm8gc2lkZSBlZmZlY3RzXG4gICAgaWYgKGZpZWxkICYmIGZpZWxkLmZpZWxkX3R5cGUgJiYgZmllbGQuZmllbGRfdHlwZS5pZCA9PT0gJ09yZ2FuaXNhdGlvblBvbGljeScpIHtcbiAgICAgIC8vIDxidWJibGVfd3JhcD5cbiAgICAgIC8vIERvaW5nIHNvbWUgbnVsbCBjaGVja2luZyB0byBzdG9wIGl0IGZyb20gZmFsbGluZyBvdmVyLlxuICAgICAgY29uc3QgZGF0YTogRm9ybUdyb3VwID0gZm9ybS5nZXQoJ2RhdGEnKSBhcyBGb3JtR3JvdXA7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBjb25zdCBmaWVsZEdyb3VwOiBGb3JtR3JvdXAgPSBkYXRhLmNvbnRyb2xzW2ZpZWxkLmlkXSBhcyBGb3JtR3JvdXA7XG4gICAgICAgIGlmIChmaWVsZEdyb3VwKSB7XG4gICAgICAgICAgY29uc3QgY2FzZVJvbGVGb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBmaWVsZEdyb3VwLmdldCgnT3JnUG9saWN5Q2FzZUFzc2lnbmVkUm9sZScpIGFzIEZvcm1Db250cm9sO1xuICAgICAgICAgIGlmIChjYXNlUm9sZUZvcm1Db250cm9sKSB7XG4gICAgICAgICAgICBjYXNlUm9sZUZvcm1Db250cm9sLmVuYWJsZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gPC9idWJibGVfd3JhcD5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzSGlkZGVuKGNvbmRpdGlvbjogU2hvd0NvbmRpdGlvbiwgZm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFjb25kaXRpb24ubWF0Y2goZm9ybUZpZWxkcyk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRDYXNlRmllbGRCeVdpemFyZFBhZ2VGaWVsZElkKGN1cnJlbnRQYWdlOiBXaXphcmRQYWdlLCB3aXphcmRQYWdlRmllbGQ6IFdpemFyZFBhZ2VGaWVsZCk6IENhc2VGaWVsZCB7XG4gICAgcmV0dXJuIGN1cnJlbnRQYWdlLmNhc2VfZmllbGRzLmZpbmQoY2YgPT4gY2YuaWQgPT09IHdpemFyZFBhZ2VGaWVsZC5jYXNlX2ZpZWxkX2lkKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzU2hvd0NvbmRpdGlvblBhZ2Uod2l6YXJkUGFnZTogV2l6YXJkUGFnZSwgZm9ybUZpZWxkczogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHdpemFyZFBhZ2Uuc2hvd19jb25kaXRpb24gJiYgZm9ybUZpZWxkc1t0aGlzLmdldFNob3dDb25kaXRpb25LZXkod2l6YXJkUGFnZS5zaG93X2NvbmRpdGlvbildO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNTaG93Q29uZGl0aW9uRmllbGQoY2FzZV9maWVsZDogQ2FzZUZpZWxkLCBmb3JtRmllbGRzOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2FzZV9maWVsZC5zaG93X2NvbmRpdGlvbiAmJiBmb3JtRmllbGRzLmRhdGFbdGhpcy5nZXRTaG93Q29uZGl0aW9uS2V5KGNhc2VfZmllbGQuc2hvd19jb25kaXRpb24pXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2hvd0NvbmRpdGlvbktleShzaG93X2NvbmRpdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBOZWVkIHRvIGFsbG93IGZvciBuZWdhdGVkIGNvbmRpdGlvbnMsIGkuZS4gIT0sIGFzIHdlbGwgYXMgcmVndWxhciBvbmVzICg9KVxuICAgIC8vIEFsc28gbmVlZCB0byBhbGxvdyBmb3IgY29uZGl0aW9ucyBzcGVjaWZpZWQgdXNpbmcgdGhlIFwiQ09OVEFJTlNcIiBrZXl3b3JkXG4gICAgcmV0dXJuIHNob3dfY29uZGl0aW9uLnNwbGl0KC8hPXw9fENPTlRBSU5TLylbMF07XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RmllbGQoZm9ybTogRm9ybUdyb3VwLCBmaWVsZDogQ2FzZUZpZWxkKTogdm9pZCB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGhpZGRlbiBmaWVsZCdzIHZhbHVlIGlzIHRvIGJlIHJldGFpbmVkLCBkbyBub3RoaW5nIChleGNlcHQgaWYgaXQgaXMgYSBDb21wbGV4IHR5cGUgb3IgY29sbGVjdGlvbiBvZlxuICAgICAqIENvbXBsZXggdHlwZXMpLiBUaGlzIGlzIGEgY2hhbmdlIHRvIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIgKHdoaWNoIHVzZWQgdG8gY2xlYXIgdGhlIGZpZWxkIHZhbHVlIGJ1dCByZW1vdmUgaXRcbiAgICAgKiBmcm9tIHN1Ym1pc3Npb24gYXMgYW4gdXBkYXRlIHRvIHRoZSBiYWNrLWVuZCkuIFRoZSBuZXcgYmVoYXZpb3VyIGlzIHRvIGxlYXZlIHRoZSBmaWVsZCBhcyBpcywgc28gaWYgdGhlIGZpZWxkXG4gICAgICogaXMgaGlkZGVuIGJ1dCB0aGVuIHVuLWhpZGRlbiBiZWZvcmUgZm9ybSBzdWJtaXNzaW9uLCBhbnkgcHJldmlvdXNseSBlbnRlcmVkIHZhbHVlIGlzIHJldGFpbmVkLlxuICAgICAqXG4gICAgICogRm9yIENvbXBsZXggZmllbGQgdHlwZXMsIGFuIGFkZGl0aW9uYWwgY2hlY2sgb2Ygc3ViLWZpZWxkcyBpcyByZXF1aXJlZC4gVGhlIHNhbWUgYXBwbGllcyB0byBhIGNvbGxlY3Rpb24gb2ZcbiAgICAgKiBDb21wbGV4IHR5cGVzLlxuICAgICAqL1xuICAgIGlmIChmaWVsZC5yZXRhaW5faGlkZGVuX3ZhbHVlKSB7XG4gICAgICBjb25zdCBmaWVsZFR5cGU6IEZpZWxkVHlwZUVudW0gPSBmaWVsZC5maWVsZF90eXBlLnR5cGU7XG4gICAgICAvLyBJZiB0aGUgZmllbGQgaXMgYSBDb21wbGV4IHR5cGUsIGxvb3Agb3ZlciBpdHMgc3ViLWZpZWxkcyBhbmQgY2FsbCBkZWxldGVGaWVsZFZhbHVlKCkgZm9yIGFueSBzdWItZmllbGRzXG4gICAgICAvLyB3aGVyZSByZXRhaW5faGlkZGVuX3ZhbHVlIGlzIGZhbHNlLCBPUiBmb3IgYW55IENvbXBsZXggc3ViLWZpZWxkcyAqcmVnYXJkbGVzcyBvZiB0aGVpciByZXRhaW5faGlkZGVuX3ZhbHVlKlxuICAgICAgLy8gKGluIG9yZGVyIHRvIGluc3BlY3QgdGhlIHN1Yi1maWVsZHMgb2YgYSBDb21wbGV4IHR5cGUgd2l0aGluIGFub3RoZXIgQ29tcGxleCB0eXBlKVxuICAgICAgaWYgKGZpZWxkVHlwZSA9PT0gJ0NvbXBsZXgnICYmIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbXBsZXhTdWJGaWVsZCBvZiBmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgaWYgKChjb21wbGV4U3ViRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgY29tcGxleFN1YkZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICFjb21wbGV4U3ViRmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHBhcmVudCBGb3JtR3JvdXAgY29ycmVzcG9uZGluZyB0byB0aGUgQ29tcGxleCBmaWVsZDsgaWYgaXQgZXhpc3RzLCBjYWxsXG4gICAgICAgICAgICAvLyBkZWxldGVGaWVsZFZhbHVlKCkgdG8gZGVsZXRlIHRoZSBzdWItZmllbGRcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEZvcm1Hcm91cCA9IChmb3JtLmdldCgnZGF0YScpIGFzIEZvcm1Hcm91cCkuY29udHJvbHNbZmllbGQuaWRdIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRGb3JtR3JvdXApIHtcbiAgICAgICAgICAgICAgdGhpcy5kZWxldGVGaWVsZFZhbHVlKHBhcmVudEZvcm1Hcm91cCwgY29tcGxleFN1YkZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09PSAnQ29sbGVjdGlvbicgJiYgZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUudHlwZSA9PT0gJ0NvbXBsZXgnICYmXG4gICAgICAgIGZpZWxkLmZpZWxkX3R5cGUuY29sbGVjdGlvbl9maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgY29sbGVjdGlvbiBvZiBDb21wbGV4IHR5cGVzLCBsb29wIHRocm91Z2ggZWFjaCBvbmUgYW5kIGNhbGwgZGVsZXRlRmllbGRWYWx1ZSgpIGZvciBhbnlcbiAgICAgICAgLy8gc3ViLWZpZWxkcyB3aGVyZSByZXRhaW5faGlkZGVuX3ZhbHVlIGlzIGZhbHNlLCBPUiBmb3IgYW55IENvbXBsZXggc3ViLWZpZWxkcyAqcmVnYXJkbGVzcyBvZiB0aGVpclxuICAgICAgICAvLyByZXRhaW5faGlkZGVuX3ZhbHVlKiAoaW4gb3JkZXIgdG8gaW5zcGVjdCB0aGUgc3ViLWZpZWxkcyBvZiBhIENvbXBsZXggdHlwZSB3aXRoaW4gYW5vdGhlciBDb21wbGV4IHR5cGUpXG5cbiAgICAgICAgLy8gR2V0IHRoZSBhcnJheSBvZiBmaWVsZCBjb250cm9scyBjb3JyZXNwb25kaW5nIHRvIHRoZSBDb21wbGV4IGZpZWxkIHZhbHVlc1xuICAgICAgICBjb25zdCBmaWVsZENvbnRyb2xzID0gKGZvcm0uZ2V0KCdkYXRhJykgYXMgRm9ybUdyb3VwKS5jb250cm9sc1tmaWVsZC5pZF0gYXMgRm9ybUFycmF5O1xuXG4gICAgICAgIGlmIChmaWVsZENvbnRyb2xzKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSBhcnJheSBvZiBDb21wbGV4IGZpZWxkIHZhbHVlc1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXhGaWVsZFZhbHVlcyA9IGZpZWxkQ29udHJvbHMudmFsdWUgYXMgYW55W107XG5cbiAgICAgICAgICAvLyBGb3IgZWFjaCBDb21wbGV4IGZpZWxkIHZhbHVlLCBnZXQgdGhlIElEIG9mIGVhY2ggc3ViLWZpZWxkIHdpdGhpbiBpdCBhbmQgdXNlIGFzIGEga2V5IHRvIGZpbmQgdGhlXG4gICAgICAgICAgLy8gY29ycmVzcG9uZGluZyBzdWItQ2FzZUZpZWxkICh3aGljaCBjb250YWlucyB0aGUgZmllbGQgdHlwZSBpbmZvcm1hdGlvbilcbiAgICAgICAgICBpZiAoY29tcGxleEZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICBjb21wbGV4RmllbGRWYWx1ZXMuZm9yRWFjaCgoZmllbGRWYWx1ZSwgaW5kZXgpID0+IE9iamVjdC5rZXlzKGZpZWxkVmFsdWUudmFsdWUpLmZvckVhY2goc3ViRmllbGRJZCA9PiB7XG4gICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHN1Yi1DYXNlRmllbGQgY29ycmVzcG9uZGluZyB0byB0aGUgc3ViLWZpZWxkIElEXG4gICAgICAgICAgICAgIGxldCBzdWJDYXNlRmllbGQ6IENhc2VGaWVsZDtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjYXNlRmllbGQgb2YgZmllbGQuZmllbGRfdHlwZS5jb2xsZWN0aW9uX2ZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FzZUZpZWxkLmlkID09PSBzdWJGaWVsZElkKSB7XG4gICAgICAgICAgICAgICAgICBzdWJDYXNlRmllbGQgPSBjYXNlRmllbGQ7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBkZWxldGUgdGhlIHN1Yi1maWVsZCB2YWx1ZSBpZiByZXRhaW5faGlkZGVuX3ZhbHVlIGlzIGZhbHNlLCBPUiBpZiB0aGUgc3ViLWZpZWxkIHR5cGUgaXNcbiAgICAgICAgICAgICAgLy8gQ29tcGxleCBhbmQgcmVnYXJkbGVzcyBvZiByZXRhaW5faGlkZGVuX3ZhbHVlLCBwYXNzaW5nIGluIHRoZSBwYXJlbnQgRm9ybUdyb3VwXG4gICAgICAgICAgICAgIGlmIChzdWJDYXNlRmllbGQgJiZcbiAgICAgICAgICAgICAgICAoKHN1YkNhc2VGaWVsZC5maWVsZF90eXBlLnR5cGUgPT09ICdDb21wbGV4JyAmJiBzdWJDYXNlRmllbGQuZmllbGRfdHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgIXN1YkNhc2VGaWVsZC5yZXRhaW5faGlkZGVuX3ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwID0gZmllbGRDb250cm9scy5hdChpbmRleCkuZ2V0KCd2YWx1ZScpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUocGFyZW50Rm9ybUdyb3VwLCBzdWJDYXNlRmllbGQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlbGV0ZSB0aGUgZmllbGQgdmFsdWVcbiAgICAgIHRoaXMuZGVsZXRlRmllbGRWYWx1ZShmb3JtLmdldCgnZGF0YScpIGFzIEZvcm1Hcm91cCwgZmllbGQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRQYWdlKGZvcm06IEZvcm1Hcm91cCwgd2l6YXJkUGFnZTogV2l6YXJkUGFnZSk6IHZvaWQge1xuICAgIHdpemFyZFBhZ2Uud2l6YXJkX3BhZ2VfZmllbGRzLmZvckVhY2god3BmID0+IHtcbiAgICAgIGNvbnN0IGNhc2VfZmllbGQgPSB0aGlzLmZpbmRDYXNlRmllbGRCeVdpemFyZFBhZ2VGaWVsZElkKHdpemFyZFBhZ2UsIHdwZik7XG4gICAgICB0aGlzLnJlc2V0RmllbGQoZm9ybSwgY2FzZV9maWVsZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFR5cGUoZWxlbTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsZW0pLnNsaWNlKDgsIC0xKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPYmplY3QoZWxlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHlwZShlbGVtKSA9PT0gJ09iamVjdCc7XG4gIH1cblxuICAvLyBUT0RPOiBjYWxsIGlzUmVhZE9ubHkgb24gQ2FzZUZpZWxkcyBvbmNlIHdlIG1ha2UgaXQgYXZhaWxhYmxlXG4gIHByaXZhdGUgaXNSZWFkb25seShjYXNlX2ZpZWxkOiBDYXNlRmllbGQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2FzZV9maWVsZC5kaXNwbGF5X2NvbnRleHQudG9VcHBlckNhc2UoKSA9PT0gJ1JFQURPTkxZJ1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBmaWVsZCB2YWx1ZSBieSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB7QGxpbmsgRm9ybUNvbnRyb2x9IHRvIG51bGwgKG9yIGFuIGVtcHR5IGFycmF5XG4gICAqIGlmIHRoZSBmaWVsZCB0eXBlIGlzIGBDb2xsZWN0aW9uYCksIGV4Y2VwdCB3aGVuIHRoZSBmaWVsZCB0eXBlIGlzIGBDb21wbGV4YCBvciBgRG9jdW1lbnRgLiBGb3IgYENvbXBsZXhgIGZpZWxkXG4gICAqIHR5cGVzLCB0aGlzIHJlY3Vyc2l2ZSBtZXRob2QgaXMgY2FsbGVkIHVudGlsIHNpbXBsZSBvciBcImJhc2VcIiBmaWVsZCB0eXBlcyBhcmUgcmVhY2hlZC4gRm9yIGBEb2N1bWVudGAgZmllbGRcbiAgICogdHlwZXMsIGl0cyBfc3ViLWZpZWxkXyBgRm9ybUNvbnRyb2xgIHZhbHVlcyBhcmUgc2V0IHRvIG51bGwuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtR3JvdXAgVGhlIGBGb3JtR3JvdXBgIGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGBGb3JtQ29udHJvbGAgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGRcbiAgICogQHBhcmFtIGZpZWxkIFRoZSBgQ2FzZUZpZWxkYCB3aG9zZSB2YWx1ZSBpcyB0byBiZSBkZWxldGVkIGluIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSBwYXJlbnRGaWVsZCBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBgQ2FzZUZpZWxkYC4gVXNlZCBmb3IgY2hlY2tpbmcgc3BlY2lmaWNhbGx5IHdoZXJlIGEgQ29tcGxleCBmaWVsZCBhbmRcbiAgICogaXRzIHN1Yi1maWVsZHMgaGF2ZSBgcmV0YWluX2hpZGRlbl92YWx1ZWAgc2V0IHRvIGB0cnVlYCwgYnV0IHRoZSBmaWVsZCdzIHBhcmVudCBoYXMgaXQgc2V0IHRvIGBmYWxzZWAgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlRmllbGRWYWx1ZShmb3JtR3JvdXA6IEZvcm1Hcm91cCwgZmllbGQ6IENhc2VGaWVsZCwgcGFyZW50RmllbGQ/OiBDYXNlRmllbGQpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZFR5cGU6IEZpZWxkVHlwZUVudW0gPSBmaWVsZC5maWVsZF90eXBlLnR5cGU7XG4gICAgY29uc3QgZmllbGRDb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZC5pZCk7XG5cbiAgICBpZiAoZmllbGRDb250cm9sKSB7XG4gICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBJZiB0aGUgZmllbGQgaXMgYSBDb21wbGV4IHR5cGUsIGxvb3Agb3ZlciBpdHMgc3ViLWZpZWxkcyBhbmQgY2FsbCBkZWxldGVGaWVsZFZhbHVlKCkgZm9yOlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogKiBBbnkgc3ViLWZpZWxkcyB3aGVyZSByZXRhaW5faGlkZGVuX3ZhbHVlIGlzIGZhbHNlL3VuZGVmaW5lZCwgaWYgdGhlIHBhcmVudCBmaWVsZCBoYXNcbiAgICAgICAgICAgKiByZXRhaW5faGlkZGVuX3ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgKiAqIEFMTCBzdWItZmllbGRzIGlmIHRoZSBwYXJlbnQgZmllbGQgaGFzIHJldGFpbl9oaWRkZW5fdmFsdWUgPSB0cnVlIEJVVCBpdHMgX293bl8gcGFyZW50IGhhc1xuICAgICAgICAgICAqIHJldGFpbl9oaWRkZW5fdmFsdWUgPSBmYWxzZS91bmRlZmluZWQgKHRodXMgb3ZlcnJpZGluZyBhbnl0aGluZyBlbHNlKTtcbiAgICAgICAgICAgKiAqIEFMTCBzdWItZmllbGRzIGlmIHRoZSBwYXJlbnQgZmllbGQgaGFzIHJldGFpbl9oaWRkZW5fdmFsdWUgPSBmYWxzZS91bmRlZmluZWQ7XG4gICAgICAgICAgICogKiBBbnkgQ29tcGxleCBzdWItZmllbGRzICpyZWdhcmRsZXNzIG9mIHRoZWlyIHJldGFpbl9oaWRkZW5fdmFsdWUqIChpbiBvcmRlciB0byBpbnNwZWN0IHRoZSBzdWItZmllbGRzXG4gICAgICAgICAgICogb2YgYSBDb21wbGV4IHR5cGUgd2l0aGluIGFub3RoZXIgQ29tcGxleCB0eXBlKVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChmaWVsZC5maWVsZF90eXBlLmNvbXBsZXhfZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcGxleFN1YkZpZWxkIG9mIGZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMpIHtcbiAgICAgICAgICAgICAgaWYgKChjb21wbGV4U3ViRmllbGQuZmllbGRfdHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgY29tcGxleFN1YkZpZWxkLmZpZWxkX3R5cGUuY29tcGxleF9maWVsZHMubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAoY29tcGxleFN1YkZpZWxkLmZpZWxkX3R5cGUudHlwZSAhPT0gJ0NvbXBsZXgnICYmXG4gICAgICAgICAgICAgICAgICAoZmllbGQucmV0YWluX2hpZGRlbl92YWx1ZVxuICAgICAgICAgICAgICAgICAgICA/ICFjb21wbGV4U3ViRmllbGQucmV0YWluX2hpZGRlbl92YWx1ZSB8fCAocGFyZW50RmllbGQgJiYgIXBhcmVudEZpZWxkLnJldGFpbl9oaWRkZW5fdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIDogdHJ1ZSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGZpZWxkQ29udHJvbCBpcyBjYXN0IHRvIGEgRm9ybUdyb3VwIGJlY2F1c2UgYSBDb21wbGV4IGZpZWxkIHR5cGUgdXNlcyB0aGlzIGFzIGl0cyB1bmRlcmx5aW5nXG4gICAgICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUoZmllbGRDb250cm9sIGFzIEZvcm1Hcm91cCwgY29tcGxleFN1YkZpZWxkLCBmaWVsZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0NvbGxlY3Rpb24nOlxuICAgICAgICAgIC8vIElmIGl0IGlzIGEgY29sbGVjdGlvbiBvZiBDb21wbGV4IHR5cGVzLCBsb29wIHRocm91Z2ggZWFjaCBvbmU7IGVsc2UgZmFsbCB0aHJvdWdoIHRvIGJlIGhhbmRsZWQgYXMgYVxuICAgICAgICAgIC8vIGNvbGxlY3Rpb24gb2Ygc2ltcGxlIHR5cGVzIChpbiB0aGUgc2FtZSB3YXkgYXMgTXVsdGlTZWxlY3RMaXN0KSwgdW5sZXNzIGl0J3MgYSBjb2xsZWN0aW9uIG9mIERvY3VtZW50XG4gICAgICAgICAgLy8gdHlwZXMsIHdoaWNoIHJlcXVpcmVzIGRpZmZlcmVudCBoYW5kbGluZ1xuICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25GaWVsZFR5cGUgPSBmaWVsZC5maWVsZF90eXBlLmNvbGxlY3Rpb25fZmllbGRfdHlwZTtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbkZpZWxkVHlwZS50eXBlID09PSAnQ29tcGxleCcgJiYgY29sbGVjdGlvbkZpZWxkVHlwZS5jb21wbGV4X2ZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGFycmF5IG9mIENvbXBsZXggZmllbGQgdmFsdWVzXG4gICAgICAgICAgICBjb25zdCBjb21wbGV4RmllbGRWYWx1ZXMgPSBmaWVsZENvbnRyb2wudmFsdWUgYXMgYW55W107XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIENvbXBsZXggZmllbGQgdmFsdWUsIGdldCB0aGUgSUQgb2YgZWFjaCBzdWItZmllbGQgd2l0aGluIGl0IGFuZCB1c2UgYXMgYSBrZXkgdG8gZmluZCB0aGVcbiAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgc3ViLUNhc2VGaWVsZCAod2hpY2ggY29udGFpbnMgdGhlIGZpZWxkIHR5cGUgaW5mb3JtYXRpb24pXG4gICAgICAgICAgICBpZiAoY29tcGxleEZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICAgIGNvbXBsZXhGaWVsZFZhbHVlcy5mb3JFYWNoKChmaWVsZFZhbHVlLCBpbmRleCkgPT4gT2JqZWN0LmtleXMoZmllbGRWYWx1ZS52YWx1ZSkuZm9yRWFjaChzdWJGaWVsZElkID0+IHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBzdWItQ2FzZUZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1Yi1maWVsZCBJRFxuICAgICAgICAgICAgICAgIGxldCBzdWJDYXNlRmllbGQ6IENhc2VGaWVsZDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhc2VGaWVsZCBvZiBjb2xsZWN0aW9uRmllbGRUeXBlLmNvbXBsZXhfZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2FzZUZpZWxkLmlkID09PSBzdWJGaWVsZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YkNhc2VGaWVsZCA9IGNhc2VGaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZGVsZXRlIHRoZSBzdWItZmllbGQgdmFsdWUsIHBhc3NpbmcgaW4gdGhlIHBhcmVudCBGb3JtR3JvdXBcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cCA9IChmaWVsZENvbnRyb2wgYXMgRm9ybUFycmF5KS5hdChpbmRleCkuZ2V0KCd2YWx1ZScpIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZUZpZWxkVmFsdWUocGFyZW50Rm9ybUdyb3VwLCBzdWJDYXNlRmllbGQpO1xuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25GaWVsZFR5cGUudHlwZSA9PT0gJ0RvY3VtZW50Jykge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBhcnJheSBvZiBEb2N1bWVudCBmaWVsZCB2YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RmllbGRWYWx1ZXMgPSBmaWVsZENvbnRyb2wudmFsdWUgYXMgYW55W107XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIERvY3VtZW50IGZpZWxkIHZhbHVlLCBzZXQgYWxsIGl0cyBwcm9wZXJ0eSB2YWx1ZXMgdG8gbnVsbCAodGhpcyBpcyBub3QgYWNjZXB0ZWQgYnkgdGhlXG4gICAgICAgICAgICAvLyBiYWNrLWVuZCBidXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHNhbml0aXNlT2JqZWN0KCkgaW4gRm9ybVZhbHVlU2VydmljZSBiZWZvcmUgc2VuZGluZyAtIHNlZSBiZWxvdyBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBzaW5nbGUgRG9jdW1lbnQgY2FzZSlcbiAgICAgICAgICAgIGlmIChkb2N1bWVudEZpZWxkVmFsdWVzKSB7XG4gICAgICAgICAgICAgIGRvY3VtZW50RmllbGRWYWx1ZXMuZm9yRWFjaCgoZmllbGRWYWx1ZSwgaW5kZXgpID0+IE9iamVjdC5rZXlzKGZpZWxkVmFsdWUudmFsdWUpLmZvckVhY2goc3ViRmllbGRJZCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBGb3JtR3JvdXAgY29udGFpbmluZyB0aGUgRm9ybUNvbnRyb2wgZm9yIHRoZSBzdWItZmllbGQgYW5kIHNldCBpdHMgdmFsdWUgdG8gbnVsbFxuICAgICAgICAgICAgICAgIChmaWVsZENvbnRyb2wgYXMgRm9ybUFycmF5KS5hdChpbmRleCkuZ2V0KGB2YWx1ZS4ke3N1YkZpZWxkSWR9YCkuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgLy8gT21pdHRlZCBcImJyZWFrXCIgaXMgaW50ZW50aW9uYWwgYmVjYXVzZSBhIGNvbGxlY3Rpb24gc2hvdWxkIGJlIGhhbmRsZWQgYXMgcGVyIE11bHRpU2VsZWN0TGlzdCBpZiBpdCBpc1xuICAgICAgICAvLyBub3QgYSBjb2xsZWN0aW9uIG9mIENvbXBsZXggdHlwZXNcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zd2l0Y2gtY2FzZS1mYWxsLXRocm91Z2hcbiAgICAgICAgY2FzZSAnTXVsdGlTZWxlY3RMaXN0JzpcbiAgICAgICAgICAvLyBGaWVsZCBjb250cm9sIHNob3VsZCBiZSBhIEZvcm1BcnJheSwgc28gbWFwIGVhY2ggb2YgaXRzIHZhbHVlcyB0byBudWxsXG4gICAgICAgICAgLy8gTk9URTogVGhlIEZvcm1BcnJheSBjYW5ub3QganVzdCBiZSBzZXQgdG8gYW4gZW1wdHkgYXJyYXkgYmVjYXVzZSBBbmd1bGFyIGNoZWNrcyB0aGF0IGFsbCBleGlzdGluZyB2YWx1ZXNcbiAgICAgICAgICAvLyBvZiBhIEZvcm1BcnJheSBhcmUgcHJlc2VudDsgc2V0dGluZyB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGFuIGVtcHR5IGFycmF5IGNhdXNlcyBhIHJ1bnRpbWUgZXJyb3JcbiAgICAgICAgICBpZiAoZmllbGRDb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIGFsbG93IGZvciBmaWVsZCB2YWx1ZXMgdGhhdCBhcmUgb2JqZWN0cywgbm90IGp1c3QgcHJpbWl0aXZlc1xuICAgICAgICAgICAgZmllbGRDb250cm9sLnNldFZhbHVlKHRoaXMubWFwQXJyYXlWYWx1ZXNUb051bGwoZmllbGRDb250cm9sLnZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdEb2N1bWVudCc6XG4gICAgICAgICAgLy8gTk9URTogVGhlIGZpZWxkIGNvbnRyb2wgKGEgRm9ybUdyb3VwIGluIHRoaXMgY2FzZSkgY2Fubm90IGp1c3QgYmUgc2V0IHRvIG51bGwgYmVjYXVzZSBBbmd1bGFyIGNoZWNrcyB0aGF0XG4gICAgICAgICAgLy8gYWxsIGV4aXN0aW5nIHZhbHVlcyBvZiBhIEZvcm1Hcm91cCBhcmUgcHJlc2VudDsgc2V0dGluZyB0aGUgY29udHJvbCdzIHZhbHVlIHRvIG51bGwgY2F1c2VzIGEgcnVudGltZSBlcnJvclxuICAgICAgICAgIGNvbnN0IGRvY3VtZW50RmllbGRWYWx1ZSA9IGZpZWxkQ29udHJvbC52YWx1ZTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkb2N1bWVudEZpZWxkVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZENvbnRyb2wuZ2V0KGtleSkpIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGJhY2stZW5kIGRvZXNuJ3QgYWNjZXB0IG51bGwgYXMgYSB2YWxpZCB2YWx1ZSBmb3IgYW55IG9mIHRoZSBEb2N1bWVudCBmaWVsZCB0eXBlIHByb3BlcnRpZXMgYnV0XG4gICAgICAgICAgICAgIC8vIHRoaXMgaXMgaGFuZGxlZCBieSBzYW5pdGlzZU9iamVjdCgpIGluIEZvcm1WYWx1ZVNlcnZpY2UsIHJldHVybmluZyBhIG51bGwgb2JqZWN0IGZvciB0aGUgZW50aXJlXG4gICAgICAgICAgICAgIC8vIERvY3VtZW50IGZpZWxkLCBpZiBhbnkgb2YgaXRzIHByb3BlcnRpZXMgaXMgbnVsbCAtIHdoaWNoIGlzIGFjY2VwdGVkIGJ5IHRoZSBiYWNrLWVuZFxuICAgICAgICAgICAgICBmaWVsZENvbnRyb2wuZ2V0KGtleSkuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBOb3RlOiB0aGUgZGVmYXVsdCBjYXNlIGFwcGxpZXMgdG8gRHluYW1pY0xpc3QgZmllbGRzLCB0b29cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBmaWVsZENvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYWxsIHZhbHVlcyBvZiBhbiBhcnJheSB0byBgbnVsbGAsIHJldGFpbmluZyBrZXlzIGZvciBhbnkgdmFsdWVzIHRoYXQgYXJlIG9iamVjdHMuIEZvciBleGFtcGxlLFxuICAgKiBgW3sgaWQ6ICcwJywgdmFsdWU6ICdUZXN0JyB9LCAnVGVzdCddYCB3b3VsZCBiZWNvbWUgYFt7IGlkOiBudWxsLCB2YWx1ZTogbnVsbCB9LCBudWxsXWAuXG4gICAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgb2YgdmFsdWVzIHRvIG1hcFxuICAgKiBAcmV0dXJucyBBIG5ldyBhcnJheSB3aXRoIHRoZSBtYXBwZWQgdmFsdWVzXG4gICAqL1xuICBwdWJsaWMgbWFwQXJyYXlWYWx1ZXNUb051bGwoYXJyYXk6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiBhcnJheS5tYXAoZWxlbWVudCA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnXG4gICAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgLi4uT2JqZWN0LmtleXMoZWxlbWVudCkubWFwKGsgPT4gKHsgW2tdOiBudWxsIH0pKSlcbiAgICAgICAgOiBudWxsO1xuICAgIH0pO1xuICB9XG59XG4iXX0=