@openmrs/ngx-formentry 19.0.1-pre.489 → 19.0.1-pre.497

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 (208) hide show
  1. package/components/input/label.component.d.ts +1 -1
  2. package/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.d.ts +1 -1
  3. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.d.ts +1 -1
  4. package/components/number-input/number-input.component.d.ts +1 -1
  5. package/components/select/select.component.d.ts +1 -1
  6. package/fesm2022/openmrs-ngx-formentry.mjs +412 -380
  7. package/fesm2022/openmrs-ngx-formentry.mjs.map +1 -1
  8. package/form-entry/form-entry.module.d.ts +2 -2
  9. package/form-entry/form-factory/form.factory.d.ts +2 -2
  10. package/form-entry/helpers/js-expression-helper.d.ts +2 -2
  11. package/form-entry/services/form-schema-compiler.service.d.ts +2 -0
  12. package/form-entry/value-adapters/obs.adapter.d.ts +0 -1
  13. package/form-entry/value-adapters/person-attribute.adapter.d.ts +3 -3
  14. package/lib/index.d.ts +1 -1
  15. package/package.json +10 -12
  16. package/esm2022/abstract-controls-extension/afe-control-type.mjs +0 -8
  17. package/esm2022/abstract-controls-extension/afe-form-array.mjs +0 -89
  18. package/esm2022/abstract-controls-extension/afe-form-control.mjs +0 -91
  19. package/esm2022/abstract-controls-extension/afe-form-group.mjs +0 -66
  20. package/esm2022/abstract-controls-extension/control-extensions.mjs +0 -5
  21. package/esm2022/abstract-controls-extension/index.mjs +0 -5
  22. package/esm2022/abstract-controls-extension/value-change.listener.mjs +0 -2
  23. package/esm2022/change-tracking/control-relation.mjs +0 -44
  24. package/esm2022/change-tracking/control-relations.mjs +0 -32
  25. package/esm2022/components/afe-ng-select.component.mjs +0 -101
  26. package/esm2022/components/appointments-overview/appointments-overview.component.mjs +0 -116
  27. package/esm2022/components/check-box/checkbox.component.mjs +0 -110
  28. package/esm2022/components/check-box/checkbox.module.mjs +0 -19
  29. package/esm2022/components/custom-component-wrapper/custom-component-wrapper..module.mjs +0 -22
  30. package/esm2022/components/custom-component-wrapper/custom-component-wrapper.component.mjs +0 -21
  31. package/esm2022/components/custom-control-wrapper/custom-control-wrapper..module.mjs +0 -23
  32. package/esm2022/components/custom-control-wrapper/custom-control-wrapper.component.mjs +0 -68
  33. package/esm2022/components/date-time-picker/date-picker/date-picker.component.mjs +0 -188
  34. package/esm2022/components/date-time-picker/date-time-picker.component.mjs +0 -115
  35. package/esm2022/components/date-time-picker/date-time-picker.module.mjs +0 -48
  36. package/esm2022/components/date-time-picker/index.mjs +0 -9
  37. package/esm2022/components/date-time-picker/picker-modal/modal.component.mjs +0 -25
  38. package/esm2022/components/date-time-picker/pipes/moment.pipe.mjs +0 -17
  39. package/esm2022/components/date-time-picker/time-picker/time-picker.component.mjs +0 -121
  40. package/esm2022/components/file-upload/file-upload.component.mjs +0 -109
  41. package/esm2022/components/file-upload/file-upload.module.mjs +0 -37
  42. package/esm2022/components/file-upload/secure.pipe.mjs +0 -101
  43. package/esm2022/components/input/input.directive.mjs +0 -78
  44. package/esm2022/components/input/input.module.mjs +0 -23
  45. package/esm2022/components/input/label.component.mjs +0 -263
  46. package/esm2022/components/input/text-area.directive.mjs +0 -58
  47. package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.component.mjs +0 -87
  48. package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.module.mjs +0 -40
  49. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.mjs +0 -114
  50. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.mjs +0 -7
  51. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.mjs +0 -347
  52. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.mjs +0 -16
  53. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.mjs +0 -39
  54. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-body.component.mjs +0 -142
  55. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.mjs +0 -439
  56. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.mjs +0 -373
  57. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.mjs +0 -367
  58. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar.component.mjs +0 -342
  59. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.mjs +0 -259
  60. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.mjs +0 -392
  61. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.mjs +0 -614
  62. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.mjs +0 -65
  63. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  64. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.mjs +0 -21
  65. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.mjs +0 -522
  66. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.class.mjs +0 -166
  67. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.module.mjs +0 -97
  68. package/esm2022/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.mjs +0 -28
  69. package/esm2022/components/ngx-pick-datetime/lib/date-time/timer-box.component.mjs +0 -90
  70. package/esm2022/components/ngx-pick-datetime/lib/date-time/timer.component.mjs +0 -292
  71. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-config.class.mjs +0 -56
  72. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-container.component.mjs +0 -243
  73. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.mjs +0 -119
  74. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.module.mjs +0 -26
  75. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.service.mjs +0 -233
  76. package/esm2022/components/ngx-pick-datetime/lib/utils/index.mjs +0 -5
  77. package/esm2022/components/ngx-pick-datetime/lib/utils/object.utils.mjs +0 -26
  78. package/esm2022/components/ngx-remote-select/ngx-remote-select.component.mjs +0 -151
  79. package/esm2022/components/ngx-remote-select/ngx-remote-select.module.mjs +0 -22
  80. package/esm2022/components/ngx-tabset/components/ngx-tab-set.component.mjs +0 -74
  81. package/esm2022/components/ngx-tabset/components/tab.component.mjs +0 -33
  82. package/esm2022/components/ngx-tabset/directives/hover-class.directive.mjs +0 -30
  83. package/esm2022/components/ngx-tabset/modules/ngx-tabset.module.mjs +0 -38
  84. package/esm2022/components/number-input/number-input.component.mjs +0 -254
  85. package/esm2022/components/number-input/number-input.module.mjs +0 -21
  86. package/esm2022/components/number-input/number.directive.mjs +0 -22
  87. package/esm2022/components/radio-button/radio.component.mjs +0 -98
  88. package/esm2022/components/radio-button/radio.module.mjs +0 -19
  89. package/esm2022/components/select/optgroup.directive.mjs +0 -19
  90. package/esm2022/components/select/option.directive.mjs +0 -19
  91. package/esm2022/components/select/select.component.mjs +0 -182
  92. package/esm2022/components/select/select.module.mjs +0 -23
  93. package/esm2022/components/workspace-launcher/workspace-launcher.component.mjs +0 -26
  94. package/esm2022/components/workspace-launcher/workspace-launcher.module.mjs +0 -19
  95. package/esm2022/form-entry/control-alerts/alert-helpers.mjs +0 -40
  96. package/esm2022/form-entry/control-alerts/can-generate-alert.mjs +0 -2
  97. package/esm2022/form-entry/control-calculators/can-calculate.mjs +0 -2
  98. package/esm2022/form-entry/control-hiders-disablers/can-disable.mjs +0 -2
  99. package/esm2022/form-entry/control-hiders-disablers/can-hide.mjs +0 -2
  100. package/esm2022/form-entry/control-hiders-disablers/disabler-helper.mjs +0 -32
  101. package/esm2022/form-entry/control-hiders-disablers/hider-helpers.mjs +0 -41
  102. package/esm2022/form-entry/data-sources/data-sources.mjs +0 -30
  103. package/esm2022/form-entry/data-sources/dummy-data-source.mjs +0 -104
  104. package/esm2022/form-entry/directives/collapse-animations.mjs +0 -11
  105. package/esm2022/form-entry/directives/collapse.directive.mjs +0 -172
  106. package/esm2022/form-entry/directives/historical-value.directive.mjs +0 -68
  107. package/esm2022/form-entry/error-renderer/error-renderer.component.mjs +0 -53
  108. package/esm2022/form-entry/expression-runner/expression-runner.mjs +0 -170
  109. package/esm2022/form-entry/form-entry.module.mjs +0 -194
  110. package/esm2022/form-entry/form-factory/control-relations.factory.mjs +0 -238
  111. package/esm2022/form-entry/form-factory/form-control.service.mjs +0 -118
  112. package/esm2022/form-entry/form-factory/form-node.mjs +0 -99
  113. package/esm2022/form-entry/form-factory/form.factory.mjs +0 -144
  114. package/esm2022/form-entry/form-factory/form.mjs +0 -190
  115. package/esm2022/form-entry/form-factory/hiders-disablers.factory.mjs +0 -68
  116. package/esm2022/form-entry/form-factory/index.mjs +0 -7
  117. package/esm2022/form-entry/form-factory/question.factory.mjs +0 -1123
  118. package/esm2022/form-entry/form-factory/show-messages.factory.mjs +0 -31
  119. package/esm2022/form-entry/form-factory/validation.factory.mjs +0 -182
  120. package/esm2022/form-entry/form-renderer/form-renderer.component.mjs +0 -277
  121. package/esm2022/form-entry/helpers/historical-expression-helper-service.mjs +0 -42
  122. package/esm2022/form-entry/helpers/historical-field-helper-service.mjs +0 -39
  123. package/esm2022/form-entry/helpers/js-expression-helper.mjs +0 -314
  124. package/esm2022/form-entry/helpers/risk-dataset-table.mjs +0 -247
  125. package/esm2022/form-entry/pipes/time-ago.pipe.mjs +0 -110
  126. package/esm2022/form-entry/question-models/checkbox.model.mjs +0 -11
  127. package/esm2022/form-entry/question-models/conditional-validation.model.mjs +0 -9
  128. package/esm2022/form-entry/question-models/custom-control-question.model.mjs +0 -10
  129. package/esm2022/form-entry/question-models/date-question.mjs +0 -12
  130. package/esm2022/form-entry/question-models/date-validation.model.mjs +0 -10
  131. package/esm2022/form-entry/question-models/decimal-validation.model.mjs +0 -19
  132. package/esm2022/form-entry/question-models/diagnosis-question.mjs +0 -12
  133. package/esm2022/form-entry/question-models/disallow-decimals-validation.model.mjs +0 -18
  134. package/esm2022/form-entry/question-models/file-upload-question.mjs +0 -13
  135. package/esm2022/form-entry/question-models/group-question.mjs +0 -12
  136. package/esm2022/form-entry/question-models/index.mjs +0 -24
  137. package/esm2022/form-entry/question-models/interfaces/base-options.mjs +0 -2
  138. package/esm2022/form-entry/question-models/interfaces/checkbox-options.mjs +0 -2
  139. package/esm2022/form-entry/question-models/interfaces/data-source.mjs +0 -2
  140. package/esm2022/form-entry/question-models/interfaces/date-question-options.mjs +0 -2
  141. package/esm2022/form-entry/question-models/interfaces/diagnosis-question-options.mjs +0 -2
  142. package/esm2022/form-entry/question-models/interfaces/file-upload-question-options.mjs +0 -2
  143. package/esm2022/form-entry/question-models/interfaces/group-question-options.mjs +0 -2
  144. package/esm2022/form-entry/question-models/interfaces/multi-select-options.mjs +0 -2
  145. package/esm2022/form-entry/question-models/interfaces/nested-questions.mjs +0 -7
  146. package/esm2022/form-entry/question-models/interfaces/radio-button-options.mjs +0 -2
  147. package/esm2022/form-entry/question-models/interfaces/remote-select-question-options.mjs +0 -2
  148. package/esm2022/form-entry/question-models/interfaces/repeating-question-options.mjs +0 -2
  149. package/esm2022/form-entry/question-models/interfaces/select-option.mjs +0 -2
  150. package/esm2022/form-entry/question-models/interfaces/select-question-options.mjs +0 -2
  151. package/esm2022/form-entry/question-models/interfaces/test-order-question-options.mjs +0 -2
  152. package/esm2022/form-entry/question-models/interfaces/text-area-question-options.mjs +0 -2
  153. package/esm2022/form-entry/question-models/interfaces/text-question-options.mjs +0 -2
  154. package/esm2022/form-entry/question-models/interfaces/ui-select-question-options.mjs +0 -2
  155. package/esm2022/form-entry/question-models/interfaces/workspace-launcher-options.mjs +0 -2
  156. package/esm2022/form-entry/question-models/js-expression-validation.model.mjs +0 -8
  157. package/esm2022/form-entry/question-models/max-length-validation.model.mjs +0 -9
  158. package/esm2022/form-entry/question-models/max-validation.model.mjs +0 -9
  159. package/esm2022/form-entry/question-models/min-length-validation.model.mjs +0 -9
  160. package/esm2022/form-entry/question-models/min-validation.model.mjs +0 -9
  161. package/esm2022/form-entry/question-models/models.mjs +0 -13
  162. package/esm2022/form-entry/question-models/multi-select-question.mjs +0 -11
  163. package/esm2022/form-entry/question-models/pair.model.mjs +0 -7
  164. package/esm2022/form-entry/question-models/question-base.mjs +0 -26
  165. package/esm2022/form-entry/question-models/radio-button.model.mjs +0 -12
  166. package/esm2022/form-entry/question-models/remote-select-question.mjs +0 -12
  167. package/esm2022/form-entry/question-models/rendering-type.mjs +0 -9
  168. package/esm2022/form-entry/question-models/repeating-question.mjs +0 -11
  169. package/esm2022/form-entry/question-models/select-option.mjs +0 -7
  170. package/esm2022/form-entry/question-models/select-question.mjs +0 -12
  171. package/esm2022/form-entry/question-models/test-order-question.mjs +0 -15
  172. package/esm2022/form-entry/question-models/text-area-input-question.mjs +0 -13
  173. package/esm2022/form-entry/question-models/text-input-question.mjs +0 -10
  174. package/esm2022/form-entry/question-models/ui-select-question.mjs +0 -11
  175. package/esm2022/form-entry/question-models/validation.model.mjs +0 -7
  176. package/esm2022/form-entry/question-models/workspace-launcher.model.mjs +0 -15
  177. package/esm2022/form-entry/services/debug-mode.service.mjs +0 -24
  178. package/esm2022/form-entry/services/form-errors.service.mjs +0 -21
  179. package/esm2022/form-entry/services/form-schema-compiler.service.mjs +0 -248
  180. package/esm2022/form-entry/services/historical-encounter-data.service.mjs +0 -172
  181. package/esm2022/form-entry/validators/conditional-answered.validator.mjs +0 -46
  182. package/esm2022/form-entry/validators/conditional-required.validator.mjs +0 -40
  183. package/esm2022/form-entry/validators/date.validator.mjs +0 -18
  184. package/esm2022/form-entry/validators/disallow-decimals.validator.mjs +0 -15
  185. package/esm2022/form-entry/validators/future-date-restriction.validator.mjs +0 -21
  186. package/esm2022/form-entry/validators/js-expression.validator.mjs +0 -26
  187. package/esm2022/form-entry/validators/max-date.validator.mjs +0 -23
  188. package/esm2022/form-entry/validators/max-length.validator.mjs +0 -17
  189. package/esm2022/form-entry/validators/max.validator.mjs +0 -21
  190. package/esm2022/form-entry/validators/min-date.validator.mjs +0 -23
  191. package/esm2022/form-entry/validators/min-length.validator.mjs +0 -17
  192. package/esm2022/form-entry/validators/min.validator.mjs +0 -21
  193. package/esm2022/form-entry/validators/required.validator.mjs +0 -11
  194. package/esm2022/form-entry/validators/validations.mjs +0 -5
  195. package/esm2022/form-entry/value-adapters/diagnosis.adapter.mjs +0 -241
  196. package/esm2022/form-entry/value-adapters/encounter.adapter.mjs +0 -190
  197. package/esm2022/form-entry/value-adapters/obs-adapter-helper.mjs +0 -559
  198. package/esm2022/form-entry/value-adapters/obs.adapter.mjs +0 -542
  199. package/esm2022/form-entry/value-adapters/order.adapter.mjs +0 -186
  200. package/esm2022/form-entry/value-adapters/patient-identifier.adapter.mjs +0 -77
  201. package/esm2022/form-entry/value-adapters/person-attribute.adapter.mjs +0 -88
  202. package/esm2022/form-entry/value-adapters/value.adapter.mjs +0 -2
  203. package/esm2022/lib/index.mjs +0 -59
  204. package/esm2022/openmrs-ngx-formentry.mjs +0 -5
  205. package/esm2022/public_api.mjs +0 -2
  206. package/esm2022/shared.module.mjs +0 -21
  207. /package/components/custom-component-wrapper/{custom-component-wrapper..module.d.ts → custom-component-wrapper.module.d.ts} +0 -0
  208. /package/components/custom-control-wrapper/{custom-control-wrapper..module.d.ts → custom-control-wrapper.module.d.ts} +0 -0
@@ -1,1123 +0,0 @@
1
- import _ from 'lodash';
2
- import moment from 'moment';
3
- import { TextInputQuestion } from '../question-models/text-input-question';
4
- import { TextAreaInputQuestion } from '../question-models/text-area-input-question';
5
- import { SelectQuestion } from '../question-models/select-question';
6
- import { UiSelectQuestion } from '../question-models/ui-select-question';
7
- import { DateQuestion } from '../question-models/date-question';
8
- import { MultiSelectQuestion } from '../question-models/multi-select-question';
9
- import { QuestionGroup } from '../question-models/group-question';
10
- import { RepeatingQuestion } from '../question-models/repeating-question';
11
- import { FileUploadQuestion } from '../question-models/file-upload-question';
12
- import { TestOrderQuestion } from '../question-models/test-order-question';
13
- import { AfeControlType } from '../../abstract-controls-extension/afe-control-type';
14
- import { ValidationModel } from '../question-models/validation.model';
15
- import { DateValidationModel } from '../question-models/date-validation.model';
16
- import { MaxValidationModel } from '../question-models/max-validation.model';
17
- import { MinValidationModel } from '../question-models/min-validation.model';
18
- import { JsExpressionValidationModel } from '../question-models/js-expression-validation.model';
19
- import { ConditionalValidationModel } from '../question-models/conditional-validation.model';
20
- import { DummyDataSource } from '../data-sources/dummy-data-source';
21
- import { HistoricalHelperService } from '../helpers/historical-expression-helper-service';
22
- import { CheckBoxQuestion } from '../question-models/models';
23
- import { RadioButtonQuestion } from '../question-models/models';
24
- import { Injectable } from '@angular/core';
25
- import { DiagnosisQuestion } from '../question-models/diagnosis-question';
26
- import { MaxLengthValidationModel } from '../question-models/max-length-validation.model';
27
- import { MinLengthValidationModel } from '../question-models/min-length-validation.model';
28
- import { WorkspaceLauncherQuestion } from '../question-models';
29
- import { DecimalValidationModel } from '../question-models/decimal-validation.model';
30
- import { DisallowDecimalsValidationModel } from '../question-models/disallow-decimals-validation.model';
31
- import { RemoteSelectQuestion } from '../question-models/remote-select-question';
32
- import * as i0 from "@angular/core";
33
- export class QuestionFactory {
34
- constructor() {
35
- this.dataSources = {};
36
- this.historicalHelperService = new HistoricalHelperService();
37
- this.quetionIndex = 0;
38
- this.checkedForEsmFramework = false;
39
- }
40
- createQuestionModel(formSchema, form) {
41
- if (form) {
42
- const dataSources = form.dataSourcesContainer.dataSources;
43
- this.dataSources = dataSources;
44
- }
45
- return this.toFormQuestionModel(formSchema);
46
- }
47
- toSelectQuestion(schemaQuestion) {
48
- const question = new SelectQuestion({ options: [], type: '', key: '' });
49
- question.questionIndex = this.quetionIndex;
50
- question.label = schemaQuestion.label;
51
- question.prefix = schemaQuestion.prefix;
52
- question.key = schemaQuestion.id;
53
- question.componentConfigs = schemaQuestion.componentConfigs || [];
54
- question.options = schemaQuestion.questionOptions.answers.map((obj) => ({
55
- label: obj.label,
56
- value: obj.concept
57
- }));
58
- question.options.splice(0, 0, {
59
- label: '',
60
- value: ''
61
- });
62
- question.renderingType = schemaQuestion.questionOptions.rendering;
63
- question.validators = this.addValidators(schemaQuestion);
64
- question.extras = schemaQuestion;
65
- const mappings = {
66
- label: 'label',
67
- required: 'required',
68
- id: 'key'
69
- };
70
- this.copyProperties(mappings, schemaQuestion, question);
71
- this.addDisableOrHideProperty(schemaQuestion, question);
72
- this.addAlertProperty(schemaQuestion, question);
73
- this.addHistoricalExpressions(schemaQuestion, question);
74
- this.addCalculatorProperty(schemaQuestion, question);
75
- return question;
76
- }
77
- toNumericQuestion(schemaQuestion) {
78
- const question = new TextInputQuestion({
79
- placeholder: '',
80
- type: '',
81
- key: ''
82
- });
83
- question.questionIndex = this.quetionIndex;
84
- question.label = schemaQuestion.label;
85
- question.prefix = schemaQuestion.prefix;
86
- question.key = schemaQuestion.id;
87
- question.renderingType = 'number';
88
- question.placeholder = schemaQuestion.questionOptions.placeholder;
89
- question.validators = this.addValidators(schemaQuestion);
90
- question.extras = schemaQuestion;
91
- question.placeholder = schemaQuestion.questionOptions.placeholder || '';
92
- question.componentConfigs = schemaQuestion.componentConfigs || [];
93
- const mappings = {
94
- label: 'label',
95
- required: 'required',
96
- id: 'key'
97
- };
98
- this.copyProperties(mappings, schemaQuestion, question);
99
- this.addDisableOrHideProperty(schemaQuestion, question);
100
- this.addAlertProperty(schemaQuestion, question);
101
- this.addHistoricalExpressions(schemaQuestion, question);
102
- this.addCalculatorProperty(schemaQuestion, question);
103
- return question;
104
- }
105
- toNumberQuestion(schemaQuestion) {
106
- const question = new TextInputQuestion({
107
- placeholder: '',
108
- type: '',
109
- key: ''
110
- });
111
- question.questionIndex = this.quetionIndex;
112
- question.label = schemaQuestion.label;
113
- question.prefix = schemaQuestion.prefix;
114
- question.key = schemaQuestion.id;
115
- question.renderingType = 'number';
116
- question.placeholder = schemaQuestion.questionOptions.placeholder || '';
117
- question.extras = schemaQuestion;
118
- question.componentConfigs = schemaQuestion.componentConfigs || [];
119
- const mappings = {
120
- label: 'label',
121
- required: 'required',
122
- id: 'key'
123
- };
124
- this.copyProperties(mappings, schemaQuestion, question);
125
- question.validators = this.addValidators(schemaQuestion);
126
- this.addDisableOrHideProperty(schemaQuestion, question);
127
- this.addAlertProperty(schemaQuestion, question);
128
- this.addHistoricalExpressions(schemaQuestion, question);
129
- this.addCalculatorProperty(schemaQuestion, question);
130
- return question;
131
- }
132
- toDateQuestion(schemaQuestion) {
133
- if (schemaQuestion.type === 'encounterDatetime') {
134
- return this.toEncounterDatetimeQuestion(schemaQuestion);
135
- }
136
- const question = new DateQuestion({ type: '', key: '' });
137
- question.questionIndex = this.quetionIndex;
138
- question.renderingType = 'date';
139
- question.validators = this.addValidators(schemaQuestion);
140
- question.extras = schemaQuestion;
141
- question.showTime = schemaQuestion.questionOptions.showTime;
142
- question.componentConfigs = schemaQuestion.componentConfigs || [];
143
- question.showWeeksAdder = schemaQuestion.questionOptions.weeksList
144
- ? true
145
- : false;
146
- const mappings = {
147
- label: 'label',
148
- required: 'required',
149
- id: 'key'
150
- };
151
- question.datePickerFormat = schemaQuestion.datePickerFormat ?? 'calendar';
152
- this.copyProperties(mappings, schemaQuestion, question);
153
- this.addDisableOrHideProperty(schemaQuestion, question);
154
- this.addAlertProperty(schemaQuestion, question);
155
- this.addHistoricalExpressions(schemaQuestion, question);
156
- this.addCalculatorProperty(schemaQuestion, question);
157
- return question;
158
- }
159
- toEncounterDatetimeQuestion(schemaQuestion) {
160
- const question = new DateQuestion({ type: '', key: '' });
161
- question.questionIndex = this.quetionIndex;
162
- question.label = schemaQuestion.label;
163
- question.prefix = schemaQuestion.prefix;
164
- question.renderingType = 'date';
165
- question.key = schemaQuestion.id;
166
- question.validators = this.addValidators(schemaQuestion);
167
- question.extras = schemaQuestion;
168
- question.showWeeksAdder = schemaQuestion.questionOptions.weeksList
169
- ? true
170
- : false;
171
- const mappings = {
172
- label: 'label',
173
- required: 'required',
174
- id: 'key'
175
- };
176
- question.showTime = true;
177
- question.componentConfigs = schemaQuestion.componentConfigs || [];
178
- question.datePickerFormat = schemaQuestion.datePickerFormat ?? 'calendar';
179
- this.copyProperties(mappings, schemaQuestion, question);
180
- this.addDisableOrHideProperty(schemaQuestion, question);
181
- this.addAlertProperty(schemaQuestion, question);
182
- this.addHistoricalExpressions(schemaQuestion, question);
183
- this.addCalculatorProperty(schemaQuestion, question);
184
- return question;
185
- }
186
- toCheckBoxQuestion(schemaQuestion) {
187
- const question = new CheckBoxQuestion({ options: [], type: '', key: '' });
188
- question.questionIndex = this.quetionIndex;
189
- question.label = schemaQuestion.label;
190
- question.prefix = schemaQuestion.prefix;
191
- question.key = schemaQuestion.id;
192
- question.extras = schemaQuestion;
193
- question.orientation = schemaQuestion.questionOptions.orientation;
194
- question.options = schemaQuestion.questionOptions.answers.map((obj) => {
195
- return {
196
- label: obj.label,
197
- value: obj.concept,
198
- disableWhenExpression: obj.disableWhenExpression
199
- };
200
- });
201
- question.options.splice(0, 0);
202
- question.renderingType = schemaQuestion.questionOptions.rendering;
203
- const mappings = {
204
- label: 'label',
205
- required: 'required',
206
- id: 'key'
207
- };
208
- question.componentConfigs = schemaQuestion.componentConfigs || [];
209
- this.copyProperties(mappings, schemaQuestion, question);
210
- this.addDisableOrHideProperty(schemaQuestion, question);
211
- this.addAlertProperty(schemaQuestion, question);
212
- this.addHistoricalExpressions(schemaQuestion, question);
213
- this.addCalculatorProperty(schemaQuestion, question);
214
- return question;
215
- }
216
- toRadioButtonQuestion(schemaQuestion) {
217
- const question = new RadioButtonQuestion({
218
- options: [],
219
- type: '',
220
- key: ''
221
- });
222
- question.questionIndex = this.quetionIndex;
223
- question.label = schemaQuestion.label;
224
- question.key = schemaQuestion.id;
225
- question.prefix = schemaQuestion.prefix;
226
- question.extras = schemaQuestion;
227
- question.readOnly = schemaQuestion.questionOptions.readOnly;
228
- question.allowUnselect = schemaQuestion.questionOptions.allowUnselect;
229
- question.orientation = schemaQuestion.questionOptions.orientation;
230
- question.options = schemaQuestion.questionOptions.answers.map((obj) => {
231
- return {
232
- label: obj.label,
233
- value: obj.concept
234
- };
235
- });
236
- question.options.splice(0, 0);
237
- question.renderingType = schemaQuestion.questionOptions.rendering;
238
- const mappings = {
239
- label: 'label',
240
- required: 'required',
241
- id: 'key'
242
- };
243
- question.componentConfigs = schemaQuestion.componentConfigs || [];
244
- this.copyProperties(mappings, schemaQuestion, question);
245
- this.addDisableOrHideProperty(schemaQuestion, question);
246
- this.addAlertProperty(schemaQuestion, question);
247
- this.addHistoricalExpressions(schemaQuestion, question);
248
- this.addCalculatorProperty(schemaQuestion, question);
249
- return question;
250
- }
251
- toMultiCheckboxQuestion(schemaQuestion) {
252
- const question = new MultiSelectQuestion({
253
- renderType: '',
254
- options: [],
255
- type: '',
256
- key: ''
257
- });
258
- question.questionIndex = this.quetionIndex;
259
- question.label = schemaQuestion.label;
260
- question.prefix = schemaQuestion.prefix;
261
- question.key = schemaQuestion.id;
262
- question.options = schemaQuestion.questionOptions.answers.map((obj) => ({
263
- label: obj.label,
264
- value: obj.concept
265
- }));
266
- question.validators = this.addValidators(schemaQuestion);
267
- question.dataSource = new DummyDataSource();
268
- question.extras = schemaQuestion;
269
- const mappings = {
270
- label: 'label',
271
- required: 'required',
272
- id: 'key'
273
- };
274
- question.componentConfigs = schemaQuestion.componentConfigs || [];
275
- this.copyProperties(mappings, schemaQuestion, question);
276
- this.addDisableOrHideProperty(schemaQuestion, question);
277
- this.addAlertProperty(schemaQuestion, question);
278
- this.addHistoricalExpressions(schemaQuestion, question);
279
- this.addCalculatorProperty(schemaQuestion, question);
280
- return question;
281
- }
282
- toTextAreaQuestion(schemaQuestion) {
283
- const question = new TextAreaInputQuestion({
284
- isExpanded: false,
285
- rows: 18,
286
- placeholder: '',
287
- type: '',
288
- key: ''
289
- });
290
- question.questionIndex = this.quetionIndex;
291
- question.label = schemaQuestion.label;
292
- question.prefix = schemaQuestion.prefix;
293
- question.key = schemaQuestion.id;
294
- question.placeholder = schemaQuestion.questionOptions.placeholder;
295
- question.isExpanded = schemaQuestion.isExpanded;
296
- question.rows = schemaQuestion.questionOptions.rows;
297
- question.validators = this.addValidators(schemaQuestion);
298
- question.extras = schemaQuestion;
299
- question.placeholder = schemaQuestion.questionOptions.placeholder || '';
300
- const mappings = {
301
- label: 'label',
302
- required: 'required',
303
- id: 'key'
304
- };
305
- question.componentConfigs = schemaQuestion.componentConfigs || [];
306
- this.copyProperties(mappings, schemaQuestion, question);
307
- this.addDisableOrHideProperty(schemaQuestion, question);
308
- this.addAlertProperty(schemaQuestion, question);
309
- this.addHistoricalExpressions(schemaQuestion, question);
310
- this.addCalculatorProperty(schemaQuestion, question);
311
- return question;
312
- }
313
- toTextQuestion(schemaQuestion) {
314
- const question = new TextInputQuestion({
315
- placeholder: '',
316
- type: '',
317
- key: ''
318
- });
319
- question.questionIndex = this.quetionIndex;
320
- question.label = schemaQuestion.label;
321
- question.prefix = schemaQuestion.prefix;
322
- question.key = schemaQuestion.id;
323
- question.renderingType = 'text';
324
- question.placeholder = schemaQuestion.questionOptions.placeholder;
325
- question.validators = this.addValidators(schemaQuestion);
326
- question.extras = schemaQuestion;
327
- question.placeholder = schemaQuestion.questionOptions.placeholder || '';
328
- const mappings = {
329
- label: 'label',
330
- required: 'required',
331
- id: 'key'
332
- };
333
- question.componentConfigs = schemaQuestion.componentConfigs || [];
334
- this.copyProperties(mappings, schemaQuestion, question);
335
- this.addDisableOrHideProperty(schemaQuestion, question);
336
- this.addAlertProperty(schemaQuestion, question);
337
- this.addHistoricalExpressions(schemaQuestion, question);
338
- this.addCalculatorProperty(schemaQuestion, question);
339
- return question;
340
- }
341
- toFileUploadQuestion(schemaQuestion) {
342
- const question = new FileUploadQuestion({ type: '', key: '' });
343
- question.questionIndex = this.quetionIndex;
344
- question.label = schemaQuestion.label;
345
- question.prefix = schemaQuestion.prefix;
346
- question.key = schemaQuestion.id;
347
- question.renderingType = 'file';
348
- question.dataSource = 'file';
349
- question.validators = this.addValidators(schemaQuestion);
350
- question.extras = schemaQuestion;
351
- const mappings = {
352
- label: 'label',
353
- required: 'required',
354
- id: 'key'
355
- };
356
- question.componentConfigs = schemaQuestion.componentConfigs || [];
357
- this.copyProperties(mappings, schemaQuestion, question);
358
- this.addDisableOrHideProperty(schemaQuestion, question);
359
- this.addAlertProperty(schemaQuestion, question);
360
- this.addHistoricalExpressions(schemaQuestion, question);
361
- this.addCalculatorProperty(schemaQuestion, question);
362
- return question;
363
- }
364
- toDrugQuestion(schemaQuestion) {
365
- const question = new SelectQuestion({ options: [], type: '', key: '' });
366
- question.questionIndex = this.quetionIndex;
367
- question.label = schemaQuestion.label;
368
- question.prefix = schemaQuestion.prefix;
369
- question.key = schemaQuestion.id;
370
- question.renderingType = 'remote-select';
371
- question.validators = this.addValidators(schemaQuestion);
372
- question.extras = schemaQuestion;
373
- question.dataSource = 'drug';
374
- const mappings = {
375
- label: 'label',
376
- required: 'required',
377
- id: 'key'
378
- };
379
- question.componentConfigs = schemaQuestion.componentConfigs || [];
380
- this.copyProperties(mappings, schemaQuestion, question);
381
- this.addDisableOrHideProperty(schemaQuestion, question);
382
- this.addAlertProperty(schemaQuestion, question);
383
- this.addHistoricalExpressions(schemaQuestion, question);
384
- this.addCalculatorProperty(schemaQuestion, question);
385
- return question;
386
- }
387
- toProblemQuestion(schemaQuestion) {
388
- const question = new SelectQuestion({ options: [], type: '', key: '' });
389
- question.questionIndex = this.quetionIndex;
390
- question.label = schemaQuestion.label;
391
- question.prefix = schemaQuestion.prefix;
392
- question.key = schemaQuestion.id;
393
- question.renderingType = 'remote-select';
394
- question.validators = this.addValidators(schemaQuestion);
395
- question.extras = schemaQuestion;
396
- question.dataSource = 'problem';
397
- const mappings = {
398
- label: 'label',
399
- required: 'required',
400
- id: 'key'
401
- };
402
- question.componentConfigs = schemaQuestion.componentConfigs || [];
403
- this.copyProperties(mappings, schemaQuestion, question);
404
- this.addDisableOrHideProperty(schemaQuestion, question);
405
- this.addAlertProperty(schemaQuestion, question);
406
- this.addHistoricalExpressions(schemaQuestion, question);
407
- this.addCalculatorProperty(schemaQuestion, question);
408
- return question;
409
- }
410
- toConceptAnswerSelect(schemaQuestion) {
411
- const question = new SelectQuestion({ options: [], type: '', key: '' });
412
- question.questionIndex = this.quetionIndex;
413
- question.label = schemaQuestion.label;
414
- question.prefix = schemaQuestion.prefix;
415
- question.key = schemaQuestion.id;
416
- question.renderingType = 'remote-select';
417
- question.validators = this.addValidators(schemaQuestion);
418
- question.extras = schemaQuestion;
419
- question.dataSource =
420
- schemaQuestion.questionOptions.dataSource || 'conceptAnswers';
421
- question.dataSourceOptions = {
422
- concept: schemaQuestion.questionOptions.concept
423
- };
424
- const mappings = {
425
- label: 'label',
426
- required: 'required',
427
- id: 'key'
428
- };
429
- question.componentConfigs = schemaQuestion.componentConfigs || [];
430
- this.copyProperties(mappings, schemaQuestion, question);
431
- this.addDisableOrHideProperty(schemaQuestion, question);
432
- this.addAlertProperty(schemaQuestion, question);
433
- this.addHistoricalExpressions(schemaQuestion, question);
434
- this.addCalculatorProperty(schemaQuestion, question);
435
- return question;
436
- }
437
- toRepeatingQuestion(schemaQuestion) {
438
- const question = new RepeatingQuestion({
439
- questions: [],
440
- type: '',
441
- key: ''
442
- });
443
- question.questionIndex = this.quetionIndex;
444
- question.label = schemaQuestion.label;
445
- question.prefix = schemaQuestion.prefix;
446
- question.questions = this.getChildrenQuestionModels(schemaQuestion.questions);
447
- question.key = schemaQuestion.id;
448
- question.validators = this.addValidators(schemaQuestion);
449
- question.extras = schemaQuestion;
450
- if (schemaQuestion.type === 'testOrder') {
451
- const testOrder = this.toTestOrderQuestion(schemaQuestion);
452
- const orders = [];
453
- orders.push(testOrder);
454
- question.questions = orders;
455
- }
456
- else if (schemaQuestion.type === 'diagnosis') {
457
- const diagnosisQuestion = this.toDiagnosisQuestion(schemaQuestion);
458
- question.questions = [diagnosisQuestion];
459
- }
460
- const mappings = {
461
- label: 'label',
462
- required: 'required',
463
- id: 'key'
464
- };
465
- question.componentConfigs = schemaQuestion.componentConfigs || [];
466
- this.copyProperties(mappings, schemaQuestion, question);
467
- this.addDisableOrHideProperty(schemaQuestion, question);
468
- this.addAlertProperty(schemaQuestion, question);
469
- this.addHistoricalExpressions(schemaQuestion, question);
470
- this.addCalculatorProperty(schemaQuestion, question);
471
- return question;
472
- }
473
- toGroupQuestion(schemaQuestion) {
474
- const question = new QuestionGroup({ questions: [], type: '', key: '' });
475
- question.questionIndex = this.quetionIndex;
476
- question.label = schemaQuestion.label;
477
- question.prefix = schemaQuestion.prefix;
478
- question.questions = this.getChildrenQuestionModels(schemaQuestion.questions);
479
- question.key = schemaQuestion.id;
480
- question.validators = this.addValidators(schemaQuestion);
481
- question.extras = schemaQuestion;
482
- const mappings = {
483
- label: 'label',
484
- required: 'required',
485
- id: 'key'
486
- };
487
- question.componentConfigs = schemaQuestion.componentConfigs || [];
488
- this.copyProperties(mappings, schemaQuestion, question);
489
- this.addDisableOrHideProperty(schemaQuestion, question);
490
- this.addAlertProperty(schemaQuestion, question);
491
- this.addHistoricalExpressions(schemaQuestion, question);
492
- this.addCalculatorProperty(schemaQuestion, question);
493
- return question;
494
- }
495
- toPageQuestion(schemaQuestion) {
496
- const question = new QuestionGroup({ questions: [], type: '', key: '' });
497
- question.label = schemaQuestion.label;
498
- question.prefix = schemaQuestion.prefix;
499
- question.key = schemaQuestion.label;
500
- question.renderingType = 'page';
501
- question.controlType = AfeControlType.None;
502
- question.questions = [];
503
- schemaQuestion.sections.forEach((element) => {
504
- question.questions.push(this.toSectionQuestion(element));
505
- });
506
- question.componentConfigs = schemaQuestion.componentConfigs || [];
507
- return question;
508
- }
509
- toFormQuestionModel(schemaQuestion) {
510
- const question = new QuestionGroup({ questions: [], type: '', key: '' });
511
- question.label = schemaQuestion.label;
512
- question.key = schemaQuestion.label;
513
- question.prefix = schemaQuestion.prefix;
514
- question.renderingType = 'form';
515
- question.controlType = AfeControlType.AfeFormGroup;
516
- question.extras = schemaQuestion;
517
- question.questions = [];
518
- schemaQuestion.pages.forEach((element) => {
519
- question.questions.push(this.toPageQuestion(element));
520
- });
521
- question.componentConfigs = schemaQuestion.componentConfigs || [];
522
- return question;
523
- }
524
- toSectionQuestion(schemaQuestion) {
525
- const question = new QuestionGroup({ questions: [], type: '', key: '' });
526
- question.label = schemaQuestion.label;
527
- question.prefix = schemaQuestion.prefix;
528
- question.key = schemaQuestion.label;
529
- question.renderingType = 'section';
530
- question.controlType = AfeControlType.None;
531
- question.isExpanded = schemaQuestion.isExpanded === 'true' ? true : false;
532
- question.questions = this.getSchemaQuestions(schemaQuestion.questions);
533
- question.componentConfigs = schemaQuestion.componentConfigs || [];
534
- return question;
535
- }
536
- toPersonAttributeQuestion(schemaQuestion) {
537
- const question = new UiSelectQuestion({
538
- options: [],
539
- type: '',
540
- key: '',
541
- searchFunction: function () { },
542
- resolveFunction: function () { }
543
- });
544
- question.questionIndex = this.quetionIndex;
545
- question.label = schemaQuestion.label;
546
- question.prefix = schemaQuestion.prefix;
547
- question.key = schemaQuestion.id;
548
- question.renderingType = 'remote-select';
549
- question.validators = this.addValidators(schemaQuestion);
550
- question.extras = schemaQuestion;
551
- question.dataSource = 'personAttribute';
552
- const mappings = {
553
- label: 'label',
554
- required: 'required',
555
- id: 'key'
556
- };
557
- question.componentConfigs = schemaQuestion.componentConfigs || [];
558
- this.copyProperties(mappings, schemaQuestion, question);
559
- this.addHistoricalExpressions(schemaQuestion, question);
560
- this.addDisableOrHideProperty(schemaQuestion, question);
561
- this.addAlertProperty(schemaQuestion, question);
562
- this.addHistoricalExpressions(schemaQuestion, question);
563
- this.addCalculatorProperty(schemaQuestion, question);
564
- return question;
565
- }
566
- toEncounterProviderQuestion(schemaQuestion) {
567
- const question = new UiSelectQuestion({
568
- options: [],
569
- type: '',
570
- key: '',
571
- searchFunction: function () { },
572
- resolveFunction: function () { }
573
- });
574
- question.questionIndex = this.quetionIndex;
575
- question.label = schemaQuestion.label;
576
- question.prefix = schemaQuestion.prefix;
577
- question.key = schemaQuestion.id;
578
- question.renderingType = 'remote-select';
579
- question.validators = this.addValidators(schemaQuestion);
580
- question.extras = schemaQuestion;
581
- question.dataSource = 'provider';
582
- const mappings = {
583
- label: 'label',
584
- required: 'required',
585
- id: 'key'
586
- };
587
- question.componentConfigs = schemaQuestion.componentConfigs || [];
588
- this.copyProperties(mappings, schemaQuestion, question);
589
- this.addDisableOrHideProperty(schemaQuestion, question);
590
- this.addAlertProperty(schemaQuestion, question);
591
- this.addHistoricalExpressions(schemaQuestion, question);
592
- this.addCalculatorProperty(schemaQuestion, question);
593
- return question;
594
- }
595
- toFieldSetQuestion(schemaQuestion) {
596
- const question = this.toGroupQuestion(schemaQuestion);
597
- question.renderingType = 'field-set';
598
- question.componentConfigs = schemaQuestion.componentConfigs || [];
599
- return question;
600
- }
601
- toEncounterLocationQuestion(schemaQuestion) {
602
- const question = new UiSelectQuestion({
603
- options: [],
604
- type: '',
605
- key: '',
606
- searchFunction: function () { },
607
- resolveFunction: function () { }
608
- });
609
- question.questionIndex = this.quetionIndex;
610
- question.label = schemaQuestion.label;
611
- question.prefix = schemaQuestion.prefix;
612
- question.key = schemaQuestion.id;
613
- question.renderingType = schemaQuestion.type;
614
- question.renderingType = 'remote-select';
615
- question.validators = this.addValidators(schemaQuestion);
616
- question.extras = schemaQuestion;
617
- question.dataSource = 'location';
618
- const mappings = {
619
- label: 'label',
620
- required: 'required',
621
- id: 'key'
622
- };
623
- question.componentConfigs = schemaQuestion.componentConfigs || [];
624
- this.copyProperties(mappings, schemaQuestion, question);
625
- this.addDisableOrHideProperty(schemaQuestion, question);
626
- this.addAlertProperty(schemaQuestion, question);
627
- this.addHistoricalExpressions(schemaQuestion, question);
628
- this.addCalculatorProperty(schemaQuestion, question);
629
- return question;
630
- }
631
- toTestOrderQuestion(schemaQuestion) {
632
- const question = new TestOrderQuestion({
633
- type: '',
634
- key: '',
635
- orderType: '',
636
- selectableOrders: [],
637
- orderSettingUuid: '',
638
- label: '',
639
- rendering: ''
640
- });
641
- question.questionIndex = this.quetionIndex;
642
- question.label = schemaQuestion.label;
643
- question.prefix = schemaQuestion.prefix;
644
- question.key = schemaQuestion.id;
645
- question.validators = this.addValidators(schemaQuestion);
646
- question.extras = schemaQuestion;
647
- question.options = schemaQuestion.questionOptions.selectableOrders.map(function (obj) {
648
- return {
649
- label: obj.label,
650
- value: obj.concept
651
- };
652
- });
653
- const mappings = {
654
- label: 'label',
655
- required: 'required',
656
- id: 'key'
657
- };
658
- question.componentConfigs = schemaQuestion.componentConfigs || [];
659
- this.copyProperties(mappings, schemaQuestion, question);
660
- return question;
661
- }
662
- toDiagnosisQuestion(schemaQuestion) {
663
- const question = new DiagnosisQuestion({
664
- type: '',
665
- key: schemaQuestion.id,
666
- label: schemaQuestion.label,
667
- rendering: '',
668
- rank: schemaQuestion.questionOptions.rank
669
- });
670
- question.questionIndex = this.quetionIndex;
671
- question.prefix = schemaQuestion.prefix;
672
- question.renderingType = 'remote-select';
673
- question.validators = this.addValidators(schemaQuestion);
674
- question.extras = schemaQuestion;
675
- question.dataSource =
676
- schemaQuestion.questionOptions.dataSource || 'diagnoses';
677
- const mappings = {
678
- label: 'label',
679
- required: 'required',
680
- id: 'key'
681
- };
682
- question.componentConfigs = schemaQuestion.componentConfigs || [];
683
- this.copyProperties(mappings, schemaQuestion, question);
684
- this.addDisableOrHideProperty(schemaQuestion, question);
685
- this.addAlertProperty(schemaQuestion, question);
686
- this.addHistoricalExpressions(schemaQuestion, question);
687
- this.addCalculatorProperty(schemaQuestion, question);
688
- return question;
689
- }
690
- toRemoteSelectQuestion(schemaQuestion) {
691
- const dataSource = this.getDataSourceConfig(schemaQuestion);
692
- const question = new RemoteSelectQuestion({
693
- dataSource: dataSource.name,
694
- dataSourceOptions: dataSource.options,
695
- type: '',
696
- key: ''
697
- });
698
- question.questionIndex = this.quetionIndex;
699
- question.label = schemaQuestion.label;
700
- question.prefix = schemaQuestion.prefix;
701
- question.key = schemaQuestion.id;
702
- question.renderingType = 'remote-select';
703
- question.validators = this.addValidators(schemaQuestion);
704
- question.extras = schemaQuestion;
705
- const mappings = {
706
- label: 'label',
707
- required: 'required',
708
- id: 'key'
709
- };
710
- question.componentConfigs = schemaQuestion.componentConfigs || [];
711
- this.copyProperties(mappings, schemaQuestion, question);
712
- this.addDisableOrHideProperty(schemaQuestion, question);
713
- this.addAlertProperty(schemaQuestion, question);
714
- this.addHistoricalExpressions(schemaQuestion, question);
715
- this.addCalculatorProperty(schemaQuestion, question);
716
- return question;
717
- }
718
- getDataSourceConfig(schemaQuestion) {
719
- const dataSourceName = schemaQuestion.questionOptions?.dataSource;
720
- const dataSourceOptions = schemaQuestion.questionOptions?.dataSourceOptions;
721
- // See https://github.com/openmrs/openmrs-contrib-json-schemas/blob/main/form.schema.json
722
- const openmrs3DataSource = schemaQuestion.questionOptions?.datasource;
723
- return {
724
- name: dataSourceName ?? openmrs3DataSource?.name ?? '',
725
- options: dataSourceOptions ?? openmrs3DataSource?.config ?? {}
726
- };
727
- }
728
- toDecimalQuestion(schemaQuestion) {
729
- const question = new TextInputQuestion({
730
- placeholder: '',
731
- type: '',
732
- key: ''
733
- });
734
- question.renderingType = 'decimal';
735
- question.label = schemaQuestion.label;
736
- question.key = schemaQuestion.id;
737
- question.placeholder = schemaQuestion.questionOptions.placeholder || '';
738
- question.extras = schemaQuestion;
739
- const mappings = {
740
- label: 'label',
741
- required: 'required',
742
- id: 'key'
743
- };
744
- this.copyProperties(mappings, schemaQuestion, question);
745
- question.validators = this.addValidators(schemaQuestion);
746
- this.addDisableOrHideProperty(schemaQuestion, question);
747
- this.addAlertProperty(schemaQuestion, question);
748
- this.addHistoricalExpressions(schemaQuestion, question);
749
- this.addCalculatorProperty(schemaQuestion, question);
750
- return question;
751
- }
752
- toWorkspaceLauncher(schemaQuestion) {
753
- if (!this.checkedForEsmFramework) {
754
- this.checkedForEsmFramework = true;
755
- if (!window['_openmrs_esm_framework']) {
756
- console.error("@openmrs/esm-framework is not accessible. The 'workspace-launcher' question type can only be used in the context of the O3 patient chart, where the workspace is.");
757
- }
758
- else if (typeof window['_openmrs_esm_framework'].launchWorkspace !== 'function') {
759
- console.error('@openmrs/esm-framework is accessible, but the `launchWorkspace` function is missing. It is likely that the version of @openmrs/esm-framework that is being used is not compatible with this version of ngx-formentry.');
760
- }
761
- }
762
- const question = new WorkspaceLauncherQuestion({
763
- type: '',
764
- key: schemaQuestion.id,
765
- label: schemaQuestion.label,
766
- buttonLabel: schemaQuestion.questionOptions.buttonLabel,
767
- buttonType: schemaQuestion.questionOptions.buttonType,
768
- workspaceName: schemaQuestion.questionOptions.workspaceName,
769
- additionalProps: schemaQuestion.questionOptions?.additionalProps ?? {}
770
- });
771
- question.questionIndex = this.quetionIndex;
772
- question.extras = schemaQuestion;
773
- question.extras.questionOptions.buttonType = question.buttonType;
774
- question.extras.questionOptions.workspaceName = question.workspaceName;
775
- const mappings = {
776
- label: 'label',
777
- required: 'required',
778
- id: 'key'
779
- };
780
- this.copyProperties(mappings, schemaQuestion, question);
781
- this.addDisableOrHideProperty(schemaQuestion, question);
782
- this.addAlertProperty(schemaQuestion, question);
783
- this.addHistoricalExpressions(schemaQuestion, question);
784
- this.addCalculatorProperty(schemaQuestion, question);
785
- return question;
786
- }
787
- getSchemaQuestions(schema) {
788
- const listQuestions = new Array();
789
- this.getQuestions(schema, listQuestions);
790
- return listQuestions;
791
- }
792
- getQuestions(schema, foundArray) {
793
- if (!Array.isArray(foundArray)) {
794
- foundArray = [];
795
- }
796
- if (Array.isArray(schema)) {
797
- for (const property in schema) {
798
- if (schema.hasOwnProperty(property)) {
799
- this.getQuestions(schema[property], foundArray);
800
- }
801
- }
802
- }
803
- if (schema && !Array.isArray(schema) && typeof schema === 'object') {
804
- if (schema.questionOptions) {
805
- if (schema.questionOptions.rendering === 'group' ||
806
- schema.questionOptions.rendering === 'repeating') {
807
- // schema.questions = this.getGroupMembers(schema.questions);
808
- foundArray.push(this.toModel(schema, schema.questionOptions.rendering));
809
- }
810
- else if (schema.questionOptions.rendering === 'field-set') {
811
- }
812
- else {
813
- foundArray.push(this.toModel(schema, schema.questionOptions.rendering));
814
- }
815
- }
816
- else {
817
- for (const o in schema) {
818
- if (schema.hasOwnProperty(o)) {
819
- this.getQuestions(schema[o], foundArray);
820
- }
821
- }
822
- }
823
- }
824
- }
825
- getChildrenQuestionModels(schema) {
826
- const children = [];
827
- this.getQuestions(schema, children);
828
- return children;
829
- }
830
- toModel(schema, renderType) {
831
- this.quetionIndex++;
832
- if (renderType === 'ui-select-extended') {
833
- renderType = schema.type;
834
- }
835
- if (!schema.id) {
836
- schema['id'] = this.generateId(10);
837
- }
838
- if (schema.questionOptions &&
839
- (schema.questionOptions.showDate === true ||
840
- schema.questionOptions.showDate === 'true')) {
841
- schema = this.convertOldVersionComplexObsQuestionToNewVersion(schema);
842
- renderType = 'field-set';
843
- }
844
- switch (renderType) {
845
- case 'diagnosis':
846
- return this.toDiagnosisQuestion(schema);
847
- case 'select':
848
- return this.toSelectQuestion(schema);
849
- case 'single-select':
850
- return this.toSelectQuestion(schema);
851
- case 'multi-select':
852
- return this.toSelectQuestion(schema);
853
- case 'numeric':
854
- return this.toNumericQuestion(schema);
855
- case 'number':
856
- return this.toNumberQuestion(schema);
857
- case 'decimal':
858
- return this.toDecimalQuestion(schema);
859
- case 'encounterDatetime':
860
- return this.toEncounterDatetimeQuestion(schema);
861
- case 'date':
862
- return this.toDateQuestion(schema);
863
- case 'multiCheckbox':
864
- return this.toMultiCheckboxQuestion(schema);
865
- case 'drug':
866
- return this.toDrugQuestion(schema);
867
- case 'problem':
868
- return this.toProblemQuestion(schema);
869
- case 'group':
870
- return this.toGroupQuestion(schema);
871
- case 'field-set':
872
- return this.toFieldSetQuestion(schema);
873
- case 'repeating':
874
- return this.toRepeatingQuestion(schema);
875
- case 'personAttribute':
876
- return this.toPersonAttributeQuestion(schema);
877
- case 'text':
878
- return this.toTextQuestion(schema);
879
- case 'textarea':
880
- return this.toTextAreaQuestion(schema);
881
- case 'select-concept-answers':
882
- return this.toConceptAnswerSelect(schema);
883
- case 'encounterLocation':
884
- return this.toEncounterLocationQuestion(schema);
885
- case 'encounterDatetime':
886
- return this.toEncounterDatetimeQuestion(schema);
887
- case 'encounterProvider':
888
- return this.toEncounterProviderQuestion(schema);
889
- case 'radio':
890
- return this.toRadioButtonQuestion(schema);
891
- case 'checkbox':
892
- return this.toCheckBoxQuestion(schema);
893
- case 'encounterProvider':
894
- return this.toEncounterProviderQuestion(schema);
895
- case 'file':
896
- return this.toFileUploadQuestion(schema);
897
- case 'workspace-launcher':
898
- return this.toWorkspaceLauncher(schema);
899
- case 'remote-select':
900
- return this.toRemoteSelectQuestion(schema);
901
- default:
902
- console.warn('New Schema Question Type found.........' + renderType);
903
- return this.toTextQuestion(schema);
904
- }
905
- }
906
- convertOldVersionComplexObsQuestionToNewVersion(schemaQuestion) {
907
- const converted = {};
908
- converted.type = 'complex-obs';
909
- converted.label = schemaQuestion.label;
910
- converted.prefix = schemaQuestion.prefix;
911
- converted.id = 'complex_' + schemaQuestion.id;
912
- converted.questionOptions = {};
913
- converted.questionOptions.concept = schemaQuestion.questionOptions.concept;
914
- converted.questionOptions.rendering = 'field-set';
915
- converted.questions = [];
916
- converted.validators = [];
917
- const mainField = JSON.parse(JSON.stringify(schemaQuestion));
918
- mainField.type = 'complex-obs-child';
919
- delete mainField.questionOptions.showDate;
920
- delete mainField.questionOptions.shownDateOptions;
921
- mainField.questionOptions.obsField = 'value';
922
- const dateField = {};
923
- dateField.type = 'complex-obs-child';
924
- dateField.label = 'Date of ' + mainField.label;
925
- dateField.id = 'date_' + mainField.id;
926
- dateField.questionOptions = {};
927
- dateField.questionOptions.concept = schemaQuestion.questionOptions.concept;
928
- dateField.questionOptions.rendering = 'date';
929
- dateField.questionOptions.obsField = 'obsDatetime';
930
- const dateOptions = Object.assign({}, schemaQuestion.questionOptions.shownDateOptions);
931
- dateField.validators = dateOptions.validators;
932
- dateField.hide = dateOptions.hide;
933
- converted.questions.push(mainField);
934
- converted.questions.push(dateField);
935
- return converted;
936
- }
937
- copyProperties(mappings, source, destination) {
938
- for (const property in source) {
939
- if (mappings.hasOwnProperty(property) &&
940
- destination.hasOwnProperty(mappings[property])) {
941
- destination[mappings[property]] = source[property];
942
- }
943
- }
944
- }
945
- addValidators(schemaQuestion) {
946
- const validators = [];
947
- if (schemaQuestion.validators) {
948
- // TODO - add more validator types
949
- _.forEach(schemaQuestion.validators, (validator) => {
950
- switch (validator.type) {
951
- case 'date':
952
- validators.push(new DateValidationModel(validator));
953
- break;
954
- case 'js_expression':
955
- validators.push(new JsExpressionValidationModel(validator));
956
- break;
957
- case 'conditionalAnswered':
958
- validators.push(new ConditionalValidationModel(validator));
959
- break;
960
- case 'decimal':
961
- validators.push(new DecimalValidationModel(validator));
962
- break;
963
- default:
964
- validators.push(new ValidationModel(validator));
965
- break;
966
- }
967
- });
968
- }
969
- const questionOptions = schemaQuestion.questionOptions;
970
- const renderingType = questionOptions ? questionOptions.rendering : '';
971
- switch (renderingType) {
972
- case 'decimal':
973
- case 'number':
974
- if (questionOptions.max && questionOptions.min) {
975
- validators.push(new MaxValidationModel({
976
- type: 'max',
977
- max: questionOptions.max
978
- }));
979
- validators.push(new MinValidationModel({
980
- type: 'min',
981
- min: questionOptions.min
982
- }));
983
- }
984
- if (questionOptions.maxLength) {
985
- validators.push(new MaxLengthValidationModel({
986
- type: 'maxlength',
987
- maxlength: questionOptions.maxLength
988
- }));
989
- }
990
- if (questionOptions.minLength) {
991
- validators.push(new MinLengthValidationModel({
992
- type: 'minlength',
993
- minlength: questionOptions.minLength
994
- }));
995
- }
996
- if (questionOptions.disallowDecimals) {
997
- validators.push(new DisallowDecimalsValidationModel({
998
- type: 'disallowDecimals',
999
- disallowDecimals: questionOptions.disallowDecimals
1000
- }));
1001
- }
1002
- break;
1003
- default:
1004
- break;
1005
- }
1006
- // add conditional required validators
1007
- if (typeof schemaQuestion.required === 'object') {
1008
- const required = schemaQuestion.required;
1009
- if (required.type === 'conditionalRequired') {
1010
- validators.push(new ConditionalValidationModel({
1011
- referenceQuestionId: required.referenceQuestionId,
1012
- referenceQuestionAnswers: required.referenceQuestionAnswers,
1013
- type: required.type,
1014
- message: required.message
1015
- }));
1016
- }
1017
- }
1018
- return validators;
1019
- }
1020
- addHistoricalExpressions(schemaQuestion, question) {
1021
- if (schemaQuestion.historicalExpression &&
1022
- schemaQuestion.historicalExpression.length > 0) {
1023
- question.setHistoricalValue(true);
1024
- if (schemaQuestion.showHistoricalEncounterDate !== undefined) {
1025
- question.showHistoricalEncounterDate(schemaQuestion.showHistoricalEncounterDate === 'true');
1026
- }
1027
- else {
1028
- question.showHistoricalEncounterDate();
1029
- }
1030
- const origValue = this.historicalHelperService.evaluate(schemaQuestion.historicalExpression, this.dataSources, undefined);
1031
- question.historicalDataValue = origValue;
1032
- // console.info('historical value', origValue);
1033
- // console.info('historical data question :::', question);
1034
- // console.info('schema data question :::', schemaQuestion);
1035
- if (schemaQuestion.historicalPrepopulateCondition && origValue) {
1036
- const toPopulate = this.historicalHelperService.evaluatePrecondition(schemaQuestion.historicalPrepopulateCondition, this.dataSources, origValue);
1037
- if (toPopulate) {
1038
- question.defaultValue = origValue.value;
1039
- }
1040
- return; // don't try to evaluate the other option
1041
- }
1042
- if (schemaQuestion.historicalPrepopulate && origValue) {
1043
- // sample schema options for this branch
1044
- // "historicalPrepopulate":true,
1045
- // "allowedHistoricalValueAgeInDays": 40000,
1046
- const valDate = moment(origValue.valueDate);
1047
- const differenceInDays = moment().diff(valDate, 'days');
1048
- if (Number.isInteger(schemaQuestion.allowedHistoricalValueAgeInDays)) {
1049
- if (differenceInDays <= schemaQuestion.allowedHistoricalValueAgeInDays) {
1050
- question.defaultValue = origValue.value;
1051
- }
1052
- }
1053
- else {
1054
- question.defaultValue = origValue.value;
1055
- }
1056
- }
1057
- }
1058
- }
1059
- addCalculatorProperty(schemaQuestion, question) {
1060
- if (schemaQuestion.questionOptions &&
1061
- typeof schemaQuestion.questionOptions.calculate === 'object') {
1062
- question.calculateExpression =
1063
- schemaQuestion.questionOptions.calculate.calculateExpression;
1064
- }
1065
- }
1066
- addAlertProperty(schemaQuestion, question) {
1067
- if (schemaQuestion.alert) {
1068
- question.alert = schemaQuestion.alert;
1069
- }
1070
- // if (typeof schemaQuestion.message === 'object') {
1071
- // if (schemaQuestion.message.alertWhenExpression) {
1072
- // question.message = schemaQuestion.message.alertWhenExpression;
1073
- // }
1074
- // }
1075
- }
1076
- addDisableOrHideProperty(schemaQuestion, question) {
1077
- if (!!schemaQuestion.disable) {
1078
- question.disable = schemaQuestion.disable;
1079
- }
1080
- if (typeof schemaQuestion.disable === 'object') {
1081
- question.disable = schemaQuestion.disable.disableWhenExpression;
1082
- }
1083
- if (schemaQuestion.disable) {
1084
- //if resetValueOnDisable doesn't exist on the config or no value is provided the default value will be passed (true)
1085
- question.resetValueOnDisable =
1086
- !schemaQuestion.hasOwnProperty('resetValueOnDisable') ||
1087
- this.isEmpty(schemaQuestion.resetValueOnDisable)
1088
- ? true
1089
- : schemaQuestion.resetValueOnDisable;
1090
- }
1091
- if (!!schemaQuestion.hide) {
1092
- question.hide = schemaQuestion.hide;
1093
- }
1094
- if (typeof schemaQuestion.hide === 'object') {
1095
- if (schemaQuestion.hide.hideWhenExpression) {
1096
- question.hide = schemaQuestion.hide.hideWhenExpression;
1097
- }
1098
- }
1099
- }
1100
- generateId(x) {
1101
- let s = '_';
1102
- while (s.length < x && x > 0) {
1103
- const r = Math.random();
1104
- s +=
1105
- r < 0.1
1106
- ? Math.floor(r * 100)
1107
- : String.fromCharCode(Math.floor(r * 26) + (r > 0.5 ? 97 : 65));
1108
- }
1109
- return '_' + s;
1110
- }
1111
- isEmpty(value) {
1112
- if (value === '' || value === null || value === undefined) {
1113
- return true;
1114
- }
1115
- return false;
1116
- }
1117
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuestionFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1118
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuestionFactory }); }
1119
- }
1120
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuestionFactory, decorators: [{
1121
- type: Injectable
1122
- }], ctorParameters: () => [] });
1123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb24uZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtZW50cnkvc3JjL2Zvcm0tZW50cnkvZm9ybS1mYWN0b3J5L3F1ZXN0aW9uLmZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUUxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5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SUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzsrR0F2c0NVLGVBQWU7bUhBQWYsZUFBZTs7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IFRleHRJbnB1dFF1ZXN0aW9uIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL3RleHQtaW5wdXQtcXVlc3Rpb24nO1xuaW1wb3J0IHsgVGV4dEFyZWFJbnB1dFF1ZXN0aW9uIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL3RleHQtYXJlYS1pbnB1dC1xdWVzdGlvbic7XG5pbXBvcnQgeyBTZWxlY3RRdWVzdGlvbiB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy9zZWxlY3QtcXVlc3Rpb24nO1xuaW1wb3J0IHsgVWlTZWxlY3RRdWVzdGlvbiB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy91aS1zZWxlY3QtcXVlc3Rpb24nO1xuaW1wb3J0IHsgRGF0ZVF1ZXN0aW9uIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL2RhdGUtcXVlc3Rpb24nO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RRdWVzdGlvbiB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy9tdWx0aS1zZWxlY3QtcXVlc3Rpb24nO1xuaW1wb3J0IHsgUXVlc3Rpb25Hcm91cCB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy9ncm91cC1xdWVzdGlvbic7XG5pbXBvcnQgeyBSZXBlYXRpbmdRdWVzdGlvbiB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy9yZXBlYXRpbmctcXVlc3Rpb24nO1xuaW1wb3J0IHsgUXVlc3Rpb25CYXNlIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL3F1ZXN0aW9uLWJhc2UnO1xuaW1wb3J0IHsgRmlsZVVwbG9hZFF1ZXN0aW9uIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL2ZpbGUtdXBsb2FkLXF1ZXN0aW9uJztcbmltcG9ydCB7IFRlc3RPcmRlclF1ZXN0aW9uIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL3Rlc3Qtb3JkZXItcXVlc3Rpb24nO1xuaW1wb3J0IHsgQWZlQ29udHJvbFR5cGUgfSBmcm9tICcuLi8uLi9hYnN0cmFjdC1jb250cm9scy1leHRlbnNpb24vYWZlLWNvbnRyb2wtdHlwZSc7XG5cbmltcG9ydCB7IFZhbGlkYXRpb25Nb2RlbCB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy92YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7IERhdGVWYWxpZGF0aW9uTW9kZWwgfSBmcm9tICcuLi9xdWVzdGlvbi1tb2RlbHMvZGF0ZS12YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7IE1heFZhbGlkYXRpb25Nb2RlbCB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy9tYXgtdmFsaWRhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBNaW5WYWxpZGF0aW9uTW9kZWwgfSBmcm9tICcuLi9xdWVzdGlvbi1tb2RlbHMvbWluLXZhbGlkYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgSnNFeHByZXNzaW9uVmFsaWRhdGlvbk1vZGVsIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL2pzLWV4cHJlc3Npb24tdmFsaWRhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBDb25kaXRpb25hbFZhbGlkYXRpb25Nb2RlbCB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy9jb25kaXRpb25hbC12YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7IER1bW15RGF0YVNvdXJjZSB9IGZyb20gJy4uL2RhdGEtc291cmNlcy9kdW1teS1kYXRhLXNvdXJjZSc7XG5pbXBvcnQgeyBIaXN0b3JpY2FsSGVscGVyU2VydmljZSB9IGZyb20gJy4uL2hlbHBlcnMvaGlzdG9yaWNhbC1leHByZXNzaW9uLWhlbHBlci1zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm0gfSBmcm9tICcuL2Zvcm0nO1xuaW1wb3J0IHsgQ2hlY2tCb3hRdWVzdGlvbiB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy9tb2RlbHMnO1xuaW1wb3J0IHsgUmFkaW9CdXR0b25RdWVzdGlvbiB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy9tb2RlbHMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3VzdG9tQ29udHJvbFF1ZXN0aW9uIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL2N1c3RvbS1jb250cm9sLXF1ZXN0aW9uLm1vZGVsJztcbmltcG9ydCB7IERpYWdub3Npc1F1ZXN0aW9uIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL2RpYWdub3Npcy1xdWVzdGlvbic7XG5pbXBvcnQgeyBNYXhMZW5ndGhWYWxpZGF0aW9uTW9kZWwgfSBmcm9tICcuLi9xdWVzdGlvbi1tb2RlbHMvbWF4LWxlbmd0aC12YWxpZGF0aW9uLm1vZGVsJztcbmltcG9ydCB7IE1pbkxlbmd0aFZhbGlkYXRpb25Nb2RlbCB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscy9taW4tbGVuZ3RoLXZhbGlkYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgV29ya3NwYWNlTGF1bmNoZXJRdWVzdGlvbiB9IGZyb20gJy4uL3F1ZXN0aW9uLW1vZGVscyc7XG5pbXBvcnQgeyBEZWNpbWFsVmFsaWRhdGlvbk1vZGVsIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL2RlY2ltYWwtdmFsaWRhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBEaXNhbGxvd0RlY2ltYWxzVmFsaWRhdGlvbk1vZGVsIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL2Rpc2FsbG93LWRlY2ltYWxzLXZhbGlkYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgUmVtb3RlU2VsZWN0UXVlc3Rpb24gfSBmcm9tICcuLi9xdWVzdGlvbi1tb2RlbHMvcmVtb3RlLXNlbGVjdC1xdWVzdGlvbic7XG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GYWN0b3J5IHtcbiAgZGF0YVNvdXJjZXM6IGFueSA9IHt9O1xuICBoaXN0b3JpY2FsSGVscGVyU2VydmljZTogSGlzdG9yaWNhbEhlbHBlclNlcnZpY2UgPSBuZXcgSGlzdG9yaWNhbEhlbHBlclNlcnZpY2UoKTtcbiAgcXVldGlvbkluZGV4ID0gMDtcbiAgY2hlY2tlZEZvckVzbUZyYW1ld29yayA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgY3JlYXRlUXVlc3Rpb25Nb2RlbChmb3JtU2NoZW1hOiBhbnksIGZvcm0/OiBGb3JtKTogUXVlc3Rpb25CYXNlIHtcbiAgICBpZiAoZm9ybSkge1xuICAgICAgY29uc3QgZGF0YVNvdXJjZXMgPSBmb3JtLmRhdGFTb3VyY2VzQ29udGFpbmVyLmRhdGFTb3VyY2VzO1xuICAgICAgdGhpcy5kYXRhU291cmNlcyA9IGRhdGFTb3VyY2VzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b0Zvcm1RdWVzdGlvbk1vZGVsKGZvcm1TY2hlbWEpO1xuICB9XG5cbiAgdG9TZWxlY3RRdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogU2VsZWN0UXVlc3Rpb24ge1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFNlbGVjdFF1ZXN0aW9uKHsgb3B0aW9uczogW10sIHR5cGU6ICcnLCBrZXk6ICcnIH0pO1xuICAgIHF1ZXN0aW9uLnF1ZXN0aW9uSW5kZXggPSB0aGlzLnF1ZXRpb25JbmRleDtcbiAgICBxdWVzdGlvbi5sYWJlbCA9IHNjaGVtYVF1ZXN0aW9uLmxhYmVsO1xuICAgIHF1ZXN0aW9uLnByZWZpeCA9IHNjaGVtYVF1ZXN0aW9uLnByZWZpeDtcbiAgICBxdWVzdGlvbi5rZXkgPSBzY2hlbWFRdWVzdGlvbi5pZDtcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICBxdWVzdGlvbi5vcHRpb25zID0gc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLmFuc3dlcnMubWFwKChvYmopID0+ICh7XG4gICAgICBsYWJlbDogb2JqLmxhYmVsLFxuICAgICAgdmFsdWU6IG9iai5jb25jZXB0XG4gICAgfSkpO1xuXG4gICAgcXVlc3Rpb24ub3B0aW9ucy5zcGxpY2UoMCwgMCwge1xuICAgICAgbGFiZWw6ICcnLFxuICAgICAgdmFsdWU6ICcnXG4gICAgfSk7XG5cbiAgICBxdWVzdGlvbi5yZW5kZXJpbmdUeXBlID0gc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLnJlbmRlcmluZztcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5leHRyYXMgPSBzY2hlbWFRdWVzdGlvbjtcblxuICAgIGNvbnN0IG1hcHBpbmdzID0ge1xuICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICAgIGlkOiAna2V5J1xuICAgIH07XG5cbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvTnVtZXJpY1F1ZXN0aW9uKHNjaGVtYVF1ZXN0aW9uOiBhbnkpOiBUZXh0SW5wdXRRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgVGV4dElucHV0UXVlc3Rpb24oe1xuICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgdHlwZTogJycsXG4gICAgICBrZXk6ICcnXG4gICAgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLmxhYmVsID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIHF1ZXN0aW9uLmtleSA9IHNjaGVtYVF1ZXN0aW9uLmlkO1xuICAgIHF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUgPSAnbnVtYmVyJztcbiAgICBxdWVzdGlvbi5wbGFjZWhvbGRlciA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5leHRyYXMgPSBzY2hlbWFRdWVzdGlvbjtcbiAgICBxdWVzdGlvbi5wbGFjZWhvbGRlciA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5wbGFjZWhvbGRlciB8fCAnJztcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICBjb25zdCBtYXBwaW5nczogYW55ID0ge1xuICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICAgIGlkOiAna2V5J1xuICAgIH07XG5cbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvTnVtYmVyUXVlc3Rpb24oc2NoZW1hUXVlc3Rpb246IGFueSk6IFRleHRJbnB1dFF1ZXN0aW9uIHtcbiAgICBjb25zdCBxdWVzdGlvbiA9IG5ldyBUZXh0SW5wdXRRdWVzdGlvbih7XG4gICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgICB0eXBlOiAnJyxcbiAgICAgIGtleTogJydcbiAgICB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9ICdudW1iZXInO1xuICAgIHF1ZXN0aW9uLnBsYWNlaG9sZGVyID0gc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLnBsYWNlaG9sZGVyIHx8ICcnO1xuICAgIHF1ZXN0aW9uLmV4dHJhcyA9IHNjaGVtYVF1ZXN0aW9uO1xuICAgIHF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgPSBzY2hlbWFRdWVzdGlvbi5jb21wb25lbnRDb25maWdzIHx8IFtdO1xuXG4gICAgY29uc3QgbWFwcGluZ3M6IGFueSA9IHtcbiAgICAgIGxhYmVsOiAnbGFiZWwnLFxuICAgICAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gICAgICBpZDogJ2tleSdcbiAgICB9O1xuXG4gICAgdGhpcy5jb3B5UHJvcGVydGllcyhtYXBwaW5ncywgc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZERpc2FibGVPckhpZGVQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQWxlcnRQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkSGlzdG9yaWNhbEV4cHJlc3Npb25zKHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRDYWxjdWxhdG9yUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cblxuICB0b0RhdGVRdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogRGF0ZVF1ZXN0aW9uIHtcbiAgICBpZiAoc2NoZW1hUXVlc3Rpb24udHlwZSA9PT0gJ2VuY291bnRlckRhdGV0aW1lJykge1xuICAgICAgcmV0dXJuIHRoaXMudG9FbmNvdW50ZXJEYXRldGltZVF1ZXN0aW9uKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgRGF0ZVF1ZXN0aW9uKHsgdHlwZTogJycsIGtleTogJycgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUgPSAnZGF0ZSc7XG4gICAgcXVlc3Rpb24udmFsaWRhdG9ycyA9IHRoaXMuYWRkVmFsaWRhdG9ycyhzY2hlbWFRdWVzdGlvbik7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG4gICAgcXVlc3Rpb24uc2hvd1RpbWUgPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMuc2hvd1RpbWUgYXMgYm9vbGVhbjtcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICBxdWVzdGlvbi5zaG93V2Vla3NBZGRlciA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy53ZWVrc0xpc3RcbiAgICAgID8gdHJ1ZVxuICAgICAgOiBmYWxzZTtcblxuICAgIGNvbnN0IG1hcHBpbmdzOiBhbnkgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgICAgaWQ6ICdrZXknXG4gICAgfTtcbiAgICBxdWVzdGlvbi5kYXRlUGlja2VyRm9ybWF0ID0gc2NoZW1hUXVlc3Rpb24uZGF0ZVBpY2tlckZvcm1hdCA/PyAnY2FsZW5kYXInO1xuXG4gICAgdGhpcy5jb3B5UHJvcGVydGllcyhtYXBwaW5ncywgc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZERpc2FibGVPckhpZGVQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQWxlcnRQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkSGlzdG9yaWNhbEV4cHJlc3Npb25zKHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRDYWxjdWxhdG9yUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cblxuICB0b0VuY291bnRlckRhdGV0aW1lUXVlc3Rpb24oc2NoZW1hUXVlc3Rpb246IGFueSk6IERhdGVRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgRGF0ZVF1ZXN0aW9uKHsgdHlwZTogJycsIGtleTogJycgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLmxhYmVsID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIHF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUgPSAnZGF0ZSc7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24udmFsaWRhdG9ycyA9IHRoaXMuYWRkVmFsaWRhdG9ycyhzY2hlbWFRdWVzdGlvbik7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG4gICAgcXVlc3Rpb24uc2hvd1dlZWtzQWRkZXIgPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMud2Vla3NMaXN0XG4gICAgICA/IHRydWVcbiAgICAgIDogZmFsc2U7XG5cbiAgICBjb25zdCBtYXBwaW5nczogYW55ID0ge1xuICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICAgIGlkOiAna2V5J1xuICAgIH07XG4gICAgcXVlc3Rpb24uc2hvd1RpbWUgPSB0cnVlO1xuICAgIHF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgPSBzY2hlbWFRdWVzdGlvbi5jb21wb25lbnRDb25maWdzIHx8IFtdO1xuICAgIHF1ZXN0aW9uLmRhdGVQaWNrZXJGb3JtYXQgPSBzY2hlbWFRdWVzdGlvbi5kYXRlUGlja2VyRm9ybWF0ID8/ICdjYWxlbmRhcic7XG5cbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvQ2hlY2tCb3hRdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogQ2hlY2tCb3hRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgQ2hlY2tCb3hRdWVzdGlvbih7IG9wdGlvbnM6IFtdLCB0eXBlOiAnJywga2V5OiAnJyB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG4gICAgcXVlc3Rpb24ub3JpZW50YXRpb24gPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMub3JpZW50YXRpb247XG4gICAgcXVlc3Rpb24ub3B0aW9ucyA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5hbnN3ZXJzLm1hcCgob2JqKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogb2JqLmxhYmVsLFxuICAgICAgICB2YWx1ZTogb2JqLmNvbmNlcHQsXG4gICAgICAgIGRpc2FibGVXaGVuRXhwcmVzc2lvbjogb2JqLmRpc2FibGVXaGVuRXhwcmVzc2lvblxuICAgICAgfTtcbiAgICB9KTtcbiAgICBxdWVzdGlvbi5vcHRpb25zLnNwbGljZSgwLCAwKTtcblxuICAgIHF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUgPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMucmVuZGVyaW5nO1xuICAgIGNvbnN0IG1hcHBpbmdzID0ge1xuICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICAgIGlkOiAna2V5J1xuICAgIH07XG4gICAgcXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyA9IHNjaGVtYVF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgfHwgW107XG4gICAgdGhpcy5jb3B5UHJvcGVydGllcyhtYXBwaW5ncywgc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZERpc2FibGVPckhpZGVQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQWxlcnRQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkSGlzdG9yaWNhbEV4cHJlc3Npb25zKHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRDYWxjdWxhdG9yUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cblxuICB0b1JhZGlvQnV0dG9uUXVlc3Rpb24oc2NoZW1hUXVlc3Rpb246IGFueSk6IFJhZGlvQnV0dG9uUXVlc3Rpb24ge1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFJhZGlvQnV0dG9uUXVlc3Rpb24oe1xuICAgICAgb3B0aW9uczogW10sXG4gICAgICB0eXBlOiAnJyxcbiAgICAgIGtleTogJydcbiAgICB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5rZXkgPSBzY2hlbWFRdWVzdGlvbi5pZDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG4gICAgcXVlc3Rpb24ucmVhZE9ubHkgPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMucmVhZE9ubHk7XG4gICAgcXVlc3Rpb24uYWxsb3dVbnNlbGVjdCA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5hbGxvd1Vuc2VsZWN0O1xuICAgIHF1ZXN0aW9uLm9yaWVudGF0aW9uID0gc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLm9yaWVudGF0aW9uO1xuICAgIHF1ZXN0aW9uLm9wdGlvbnMgPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMuYW5zd2Vycy5tYXAoKG9iaikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IG9iai5sYWJlbCxcbiAgICAgICAgdmFsdWU6IG9iai5jb25jZXB0XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHF1ZXN0aW9uLm9wdGlvbnMuc3BsaWNlKDAsIDApO1xuXG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmc7XG4gICAgY29uc3QgbWFwcGluZ3MgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgICAgaWQ6ICdrZXknXG4gICAgfTtcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvTXVsdGlDaGVja2JveFF1ZXN0aW9uKHNjaGVtYVF1ZXN0aW9uOiBhbnkpOiBNdWx0aVNlbGVjdFF1ZXN0aW9uIHtcbiAgICBjb25zdCBxdWVzdGlvbiA9IG5ldyBNdWx0aVNlbGVjdFF1ZXN0aW9uKHtcbiAgICAgIHJlbmRlclR5cGU6ICcnLFxuICAgICAgb3B0aW9uczogW10sXG4gICAgICB0eXBlOiAnJyxcbiAgICAgIGtleTogJydcbiAgICB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24ub3B0aW9ucyA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5hbnN3ZXJzLm1hcCgob2JqKSA9PiAoe1xuICAgICAgbGFiZWw6IG9iai5sYWJlbCxcbiAgICAgIHZhbHVlOiBvYmouY29uY2VwdFxuICAgIH0pKTtcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5kYXRhU291cmNlID0gbmV3IER1bW15RGF0YVNvdXJjZSgpO1xuICAgIHF1ZXN0aW9uLmV4dHJhcyA9IHNjaGVtYVF1ZXN0aW9uO1xuXG4gICAgY29uc3QgbWFwcGluZ3M6IGFueSA9IHtcbiAgICAgIGxhYmVsOiAnbGFiZWwnLFxuICAgICAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gICAgICBpZDogJ2tleSdcbiAgICB9O1xuICAgIHF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgPSBzY2hlbWFRdWVzdGlvbi5jb21wb25lbnRDb25maWdzIHx8IFtdO1xuICAgIHRoaXMuY29weVByb3BlcnRpZXMobWFwcGluZ3MsIHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGREaXNhYmxlT3JIaWRlUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEFsZXJ0UHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEhpc3RvcmljYWxFeHByZXNzaW9ucyhzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQ2FsY3VsYXRvclByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG5cbiAgdG9UZXh0QXJlYVF1ZXN0aW9uKHNjaGVtYVF1ZXN0aW9uOiBhbnkpOiBUZXh0QXJlYUlucHV0UXVlc3Rpb24ge1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFRleHRBcmVhSW5wdXRRdWVzdGlvbih7XG4gICAgICBpc0V4cGFuZGVkOiBmYWxzZSxcbiAgICAgIHJvd3M6IDE4LFxuICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgdHlwZTogJycsXG4gICAgICBrZXk6ICcnXG4gICAgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLmxhYmVsID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIHF1ZXN0aW9uLmtleSA9IHNjaGVtYVF1ZXN0aW9uLmlkO1xuICAgIHF1ZXN0aW9uLnBsYWNlaG9sZGVyID0gc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIHF1ZXN0aW9uLmlzRXhwYW5kZWQgPSBzY2hlbWFRdWVzdGlvbi5pc0V4cGFuZGVkO1xuICAgIHF1ZXN0aW9uLnJvd3MgPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMucm93cztcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5leHRyYXMgPSBzY2hlbWFRdWVzdGlvbjtcbiAgICBxdWVzdGlvbi5wbGFjZWhvbGRlciA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5wbGFjZWhvbGRlciB8fCAnJztcblxuICAgIGNvbnN0IG1hcHBpbmdzOiBhbnkgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgICAgaWQ6ICdrZXknXG4gICAgfTtcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvVGV4dFF1ZXN0aW9uKHNjaGVtYVF1ZXN0aW9uOiBhbnkpOiBUZXh0SW5wdXRRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgVGV4dElucHV0UXVlc3Rpb24oe1xuICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgdHlwZTogJycsXG4gICAgICBrZXk6ICcnXG4gICAgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLmxhYmVsID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIHF1ZXN0aW9uLmtleSA9IHNjaGVtYVF1ZXN0aW9uLmlkO1xuICAgIHF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUgPSAndGV4dCc7XG4gICAgcXVlc3Rpb24ucGxhY2Vob2xkZXIgPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMucGxhY2Vob2xkZXI7XG4gICAgcXVlc3Rpb24udmFsaWRhdG9ycyA9IHRoaXMuYWRkVmFsaWRhdG9ycyhzY2hlbWFRdWVzdGlvbik7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG4gICAgcXVlc3Rpb24ucGxhY2Vob2xkZXIgPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMucGxhY2Vob2xkZXIgfHwgJyc7XG4gICAgY29uc3QgbWFwcGluZ3M6IGFueSA9IHtcbiAgICAgIGxhYmVsOiAnbGFiZWwnLFxuICAgICAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gICAgICBpZDogJ2tleSdcbiAgICB9O1xuICAgIHF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgPSBzY2hlbWFRdWVzdGlvbi5jb21wb25lbnRDb25maWdzIHx8IFtdO1xuICAgIHRoaXMuY29weVByb3BlcnRpZXMobWFwcGluZ3MsIHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGREaXNhYmxlT3JIaWRlUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEFsZXJ0UHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEhpc3RvcmljYWxFeHByZXNzaW9ucyhzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQ2FsY3VsYXRvclByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG5cbiAgdG9GaWxlVXBsb2FkUXVlc3Rpb24oc2NoZW1hUXVlc3Rpb246IGFueSk6IEZpbGVVcGxvYWRRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgRmlsZVVwbG9hZFF1ZXN0aW9uKHsgdHlwZTogJycsIGtleTogJycgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLmxhYmVsID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIHF1ZXN0aW9uLmtleSA9IHNjaGVtYVF1ZXN0aW9uLmlkO1xuICAgIHF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUgPSAnZmlsZSc7XG4gICAgcXVlc3Rpb24uZGF0YVNvdXJjZSA9ICdmaWxlJztcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5leHRyYXMgPSBzY2hlbWFRdWVzdGlvbjtcblxuICAgIGNvbnN0IG1hcHBpbmdzOiBhbnkgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgICAgaWQ6ICdrZXknXG4gICAgfTtcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvRHJ1Z1F1ZXN0aW9uKHNjaGVtYVF1ZXN0aW9uOiBhbnkpOiBTZWxlY3RRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgU2VsZWN0UXVlc3Rpb24oeyBvcHRpb25zOiBbXSwgdHlwZTogJycsIGtleTogJycgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLmxhYmVsID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIHF1ZXN0aW9uLmtleSA9IHNjaGVtYVF1ZXN0aW9uLmlkO1xuICAgIHF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUgPSAncmVtb3RlLXNlbGVjdCc7XG4gICAgcXVlc3Rpb24udmFsaWRhdG9ycyA9IHRoaXMuYWRkVmFsaWRhdG9ycyhzY2hlbWFRdWVzdGlvbik7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG4gICAgcXVlc3Rpb24uZGF0YVNvdXJjZSA9ICdkcnVnJztcbiAgICBjb25zdCBtYXBwaW5nczogYW55ID0ge1xuICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICAgIGlkOiAna2V5J1xuICAgIH07XG4gICAgcXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyA9IHNjaGVtYVF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgfHwgW107XG4gICAgdGhpcy5jb3B5UHJvcGVydGllcyhtYXBwaW5ncywgc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZERpc2FibGVPckhpZGVQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQWxlcnRQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkSGlzdG9yaWNhbEV4cHJlc3Npb25zKHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRDYWxjdWxhdG9yUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cblxuICB0b1Byb2JsZW1RdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogU2VsZWN0UXVlc3Rpb24ge1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFNlbGVjdFF1ZXN0aW9uKHsgb3B0aW9uczogW10sIHR5cGU6ICcnLCBrZXk6ICcnIH0pO1xuICAgIHF1ZXN0aW9uLnF1ZXN0aW9uSW5kZXggPSB0aGlzLnF1ZXRpb25JbmRleDtcbiAgICBxdWVzdGlvbi5sYWJlbCA9IHNjaGVtYVF1ZXN0aW9uLmxhYmVsO1xuICAgIHF1ZXN0aW9uLnByZWZpeCA9IHNjaGVtYVF1ZXN0aW9uLnByZWZpeDtcbiAgICBxdWVzdGlvbi5rZXkgPSBzY2hlbWFRdWVzdGlvbi5pZDtcbiAgICBxdWVzdGlvbi5yZW5kZXJpbmdUeXBlID0gJ3JlbW90ZS1zZWxlY3QnO1xuICAgIHF1ZXN0aW9uLnZhbGlkYXRvcnMgPSB0aGlzLmFkZFZhbGlkYXRvcnMoc2NoZW1hUXVlc3Rpb24pO1xuICAgIHF1ZXN0aW9uLmV4dHJhcyA9IHNjaGVtYVF1ZXN0aW9uO1xuICAgIHF1ZXN0aW9uLmRhdGFTb3VyY2UgPSAncHJvYmxlbSc7XG4gICAgY29uc3QgbWFwcGluZ3M6IGFueSA9IHtcbiAgICAgIGxhYmVsOiAnbGFiZWwnLFxuICAgICAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gICAgICBpZDogJ2tleSdcbiAgICB9O1xuICAgIHF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgPSBzY2hlbWFRdWVzdGlvbi5jb21wb25lbnRDb25maWdzIHx8IFtdO1xuICAgIHRoaXMuY29weVByb3BlcnRpZXMobWFwcGluZ3MsIHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGREaXNhYmxlT3JIaWRlUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEFsZXJ0UHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEhpc3RvcmljYWxFeHByZXNzaW9ucyhzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQ2FsY3VsYXRvclByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG5cbiAgdG9Db25jZXB0QW5zd2VyU2VsZWN0KHNjaGVtYVF1ZXN0aW9uOiBhbnkpOiBTZWxlY3RRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgU2VsZWN0UXVlc3Rpb24oeyBvcHRpb25zOiBbXSwgdHlwZTogJycsIGtleTogJycgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLmxhYmVsID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIHF1ZXN0aW9uLmtleSA9IHNjaGVtYVF1ZXN0aW9uLmlkO1xuICAgIHF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUgPSAncmVtb3RlLXNlbGVjdCc7XG4gICAgcXVlc3Rpb24udmFsaWRhdG9ycyA9IHRoaXMuYWRkVmFsaWRhdG9ycyhzY2hlbWFRdWVzdGlvbik7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG4gICAgcXVlc3Rpb24uZGF0YVNvdXJjZSA9XG4gICAgICBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMuZGF0YVNvdXJjZSB8fCAnY29uY2VwdEFuc3dlcnMnO1xuICAgIHF1ZXN0aW9uLmRhdGFTb3VyY2VPcHRpb25zID0ge1xuICAgICAgY29uY2VwdDogc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLmNvbmNlcHRcbiAgICB9O1xuICAgIGNvbnN0IG1hcHBpbmdzOiBhbnkgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgICAgaWQ6ICdrZXknXG4gICAgfTtcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvUmVwZWF0aW5nUXVlc3Rpb24oc2NoZW1hUXVlc3Rpb246IGFueSk6IFJlcGVhdGluZ1F1ZXN0aW9uIHtcbiAgICBjb25zdCBxdWVzdGlvbiA9IG5ldyBSZXBlYXRpbmdRdWVzdGlvbih7XG4gICAgICBxdWVzdGlvbnM6IFtdLFxuICAgICAgdHlwZTogJycsXG4gICAgICBrZXk6ICcnXG4gICAgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLmxhYmVsID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIHF1ZXN0aW9uLnF1ZXN0aW9ucyA9IHRoaXMuZ2V0Q2hpbGRyZW5RdWVzdGlvbk1vZGVscyhcbiAgICAgIHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uc1xuICAgICk7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24udmFsaWRhdG9ycyA9IHRoaXMuYWRkVmFsaWRhdG9ycyhzY2hlbWFRdWVzdGlvbik7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG5cbiAgICBpZiAoc2NoZW1hUXVlc3Rpb24udHlwZSA9PT0gJ3Rlc3RPcmRlcicpIHtcbiAgICAgIGNvbnN0IHRlc3RPcmRlciA9IHRoaXMudG9UZXN0T3JkZXJRdWVzdGlvbihzY2hlbWFRdWVzdGlvbik7XG4gICAgICBjb25zdCBvcmRlcnMgPSBbXTtcbiAgICAgIG9yZGVycy5wdXNoKHRlc3RPcmRlcik7XG4gICAgICBxdWVzdGlvbi5xdWVzdGlvbnMgPSBvcmRlcnM7XG4gICAgfSBlbHNlIGlmIChzY2hlbWFRdWVzdGlvbi50eXBlID09PSAnZGlhZ25vc2lzJykge1xuICAgICAgY29uc3QgZGlhZ25vc2lzUXVlc3Rpb24gPSB0aGlzLnRvRGlhZ25vc2lzUXVlc3Rpb24oc2NoZW1hUXVlc3Rpb24pO1xuICAgICAgcXVlc3Rpb24ucXVlc3Rpb25zID0gW2RpYWdub3Npc1F1ZXN0aW9uXTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXBwaW5nczogYW55ID0ge1xuICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICAgIGlkOiAna2V5J1xuICAgIH07XG4gICAgcXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyA9IHNjaGVtYVF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgfHwgW107XG4gICAgdGhpcy5jb3B5UHJvcGVydGllcyhtYXBwaW5ncywgc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZERpc2FibGVPckhpZGVQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQWxlcnRQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkSGlzdG9yaWNhbEV4cHJlc3Npb25zKHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRDYWxjdWxhdG9yUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cblxuICB0b0dyb3VwUXVlc3Rpb24oc2NoZW1hUXVlc3Rpb246IGFueSk6IFF1ZXN0aW9uR3JvdXAge1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uR3JvdXAoeyBxdWVzdGlvbnM6IFtdLCB0eXBlOiAnJywga2V5OiAnJyB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25zID0gdGhpcy5nZXRDaGlsZHJlblF1ZXN0aW9uTW9kZWxzKFxuICAgICAgc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25zXG4gICAgKTtcbiAgICBxdWVzdGlvbi5rZXkgPSBzY2hlbWFRdWVzdGlvbi5pZDtcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5leHRyYXMgPSBzY2hlbWFRdWVzdGlvbjtcblxuICAgIGNvbnN0IG1hcHBpbmdzOiBhbnkgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgICAgaWQ6ICdrZXknXG4gICAgfTtcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvUGFnZVF1ZXN0aW9uKHNjaGVtYVF1ZXN0aW9uOiBhbnkpOiBRdWVzdGlvbkdyb3VwIHtcbiAgICBjb25zdCBxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbkdyb3VwKHsgcXVlc3Rpb25zOiBbXSwgdHlwZTogJycsIGtleTogJycgfSk7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9ICdwYWdlJztcbiAgICBxdWVzdGlvbi5jb250cm9sVHlwZSA9IEFmZUNvbnRyb2xUeXBlLk5vbmU7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25zID0gW107XG4gICAgc2NoZW1hUXVlc3Rpb24uc2VjdGlvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgcXVlc3Rpb24ucXVlc3Rpb25zLnB1c2godGhpcy50b1NlY3Rpb25RdWVzdGlvbihlbGVtZW50KSk7XG4gICAgfSk7XG4gICAgcXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyA9IHNjaGVtYVF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgfHwgW107XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG5cbiAgdG9Gb3JtUXVlc3Rpb25Nb2RlbChzY2hlbWFRdWVzdGlvbjogYW55KTogUXVlc3Rpb25Hcm91cCB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb25Hcm91cCh7IHF1ZXN0aW9uczogW10sIHR5cGU6ICcnLCBrZXk6ICcnIH0pO1xuICAgIHF1ZXN0aW9uLmxhYmVsID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24ubGFiZWw7XG4gICAgcXVlc3Rpb24ucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIHF1ZXN0aW9uLnJlbmRlcmluZ1R5cGUgPSAnZm9ybSc7XG4gICAgcXVlc3Rpb24uY29udHJvbFR5cGUgPSBBZmVDb250cm9sVHlwZS5BZmVGb3JtR3JvdXA7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25zID0gW107XG4gICAgc2NoZW1hUXVlc3Rpb24ucGFnZXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgcXVlc3Rpb24ucXVlc3Rpb25zLnB1c2godGhpcy50b1BhZ2VRdWVzdGlvbihlbGVtZW50KSk7XG4gICAgfSk7XG4gICAgcXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyA9IHNjaGVtYVF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgfHwgW107XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG5cbiAgdG9TZWN0aW9uUXVlc3Rpb24oc2NoZW1hUXVlc3Rpb246IGFueSk6IFF1ZXN0aW9uR3JvdXAge1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uR3JvdXAoeyBxdWVzdGlvbnM6IFtdLCB0eXBlOiAnJywga2V5OiAnJyB9KTtcbiAgICBxdWVzdGlvbi5sYWJlbCA9IHNjaGVtYVF1ZXN0aW9uLmxhYmVsO1xuICAgIHF1ZXN0aW9uLnByZWZpeCA9IHNjaGVtYVF1ZXN0aW9uLnByZWZpeDtcbiAgICBxdWVzdGlvbi5rZXkgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5yZW5kZXJpbmdUeXBlID0gJ3NlY3Rpb24nO1xuICAgIHF1ZXN0aW9uLmNvbnRyb2xUeXBlID0gQWZlQ29udHJvbFR5cGUuTm9uZTtcbiAgICBxdWVzdGlvbi5pc0V4cGFuZGVkID0gc2NoZW1hUXVlc3Rpb24uaXNFeHBhbmRlZCA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHF1ZXN0aW9uLnF1ZXN0aW9ucyA9IHRoaXMuZ2V0U2NoZW1hUXVlc3Rpb25zKHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9ucyk7XG4gICAgcXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyA9IHNjaGVtYVF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgfHwgW107XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG5cbiAgdG9QZXJzb25BdHRyaWJ1dGVRdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogVWlTZWxlY3RRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgVWlTZWxlY3RRdWVzdGlvbih7XG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIHR5cGU6ICcnLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHNlYXJjaEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgIHJlc29sdmVGdW5jdGlvbjogZnVuY3Rpb24gKCkge31cbiAgICB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9ICdyZW1vdGUtc2VsZWN0JztcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5leHRyYXMgPSBzY2hlbWFRdWVzdGlvbjtcbiAgICBxdWVzdGlvbi5kYXRhU291cmNlID0gJ3BlcnNvbkF0dHJpYnV0ZSc7XG5cbiAgICBjb25zdCBtYXBwaW5nczogYW55ID0ge1xuICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICAgIGlkOiAna2V5J1xuICAgIH07XG4gICAgcXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyA9IHNjaGVtYVF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgfHwgW107XG4gICAgdGhpcy5jb3B5UHJvcGVydGllcyhtYXBwaW5ncywgc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEhpc3RvcmljYWxFeHByZXNzaW9ucyhzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvRW5jb3VudGVyUHJvdmlkZXJRdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogVWlTZWxlY3RRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgVWlTZWxlY3RRdWVzdGlvbih7XG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIHR5cGU6ICcnLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHNlYXJjaEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgIHJlc29sdmVGdW5jdGlvbjogZnVuY3Rpb24gKCkge31cbiAgICB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9ICdyZW1vdGUtc2VsZWN0JztcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5leHRyYXMgPSBzY2hlbWFRdWVzdGlvbjtcbiAgICBxdWVzdGlvbi5kYXRhU291cmNlID0gJ3Byb3ZpZGVyJztcblxuICAgIGNvbnN0IG1hcHBpbmdzOiBhbnkgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgICAgaWQ6ICdrZXknXG4gICAgfTtcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvRmllbGRTZXRRdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogUXVlc3Rpb25Hcm91cCB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSB0aGlzLnRvR3JvdXBRdWVzdGlvbihzY2hlbWFRdWVzdGlvbik7XG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9ICdmaWVsZC1zZXQnO1xuICAgIHF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgPSBzY2hlbWFRdWVzdGlvbi5jb21wb25lbnRDb25maWdzIHx8IFtdO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvRW5jb3VudGVyTG9jYXRpb25RdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogVWlTZWxlY3RRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgVWlTZWxlY3RRdWVzdGlvbih7XG4gICAgICBvcHRpb25zOiBbXSxcbiAgICAgIHR5cGU6ICcnLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHNlYXJjaEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgIHJlc29sdmVGdW5jdGlvbjogZnVuY3Rpb24gKCkge31cbiAgICB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9IHNjaGVtYVF1ZXN0aW9uLnR5cGU7XG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9ICdyZW1vdGUtc2VsZWN0JztcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5leHRyYXMgPSBzY2hlbWFRdWVzdGlvbjtcbiAgICBxdWVzdGlvbi5kYXRhU291cmNlID0gJ2xvY2F0aW9uJztcblxuICAgIGNvbnN0IG1hcHBpbmdzOiBhbnkgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgICAgaWQ6ICdrZXknXG4gICAgfTtcbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuXG4gIHRvVGVzdE9yZGVyUXVlc3Rpb24oc2NoZW1hUXVlc3Rpb246IGFueSk6IFRlc3RPcmRlclF1ZXN0aW9uIHtcbiAgICBjb25zdCBxdWVzdGlvbiA9IG5ldyBUZXN0T3JkZXJRdWVzdGlvbih7XG4gICAgICB0eXBlOiAnJyxcbiAgICAgIGtleTogJycsXG4gICAgICBvcmRlclR5cGU6ICcnLFxuICAgICAgc2VsZWN0YWJsZU9yZGVyczogW10sXG4gICAgICBvcmRlclNldHRpbmdVdWlkOiAnJyxcbiAgICAgIGxhYmVsOiAnJyxcbiAgICAgIHJlbmRlcmluZzogJydcbiAgICB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24udmFsaWRhdG9ycyA9IHRoaXMuYWRkVmFsaWRhdG9ycyhzY2hlbWFRdWVzdGlvbik7XG4gICAgcXVlc3Rpb24uZXh0cmFzID0gc2NoZW1hUXVlc3Rpb247XG4gICAgcXVlc3Rpb24ub3B0aW9ucyA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5zZWxlY3RhYmxlT3JkZXJzLm1hcChcbiAgICAgIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDogb2JqLmxhYmVsLFxuICAgICAgICAgIHZhbHVlOiBvYmouY29uY2VwdFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBtYXBwaW5nczogYW55ID0ge1xuICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICAgIGlkOiAna2V5J1xuICAgIH07XG4gICAgcXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyA9IHNjaGVtYVF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgfHwgW107XG4gICAgdGhpcy5jb3B5UHJvcGVydGllcyhtYXBwaW5ncywgc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cblxuICB0b0RpYWdub3Npc1F1ZXN0aW9uKHNjaGVtYVF1ZXN0aW9uOiBhbnkpOiBEaWFnbm9zaXNRdWVzdGlvbiB7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBuZXcgRGlhZ25vc2lzUXVlc3Rpb24oe1xuICAgICAgdHlwZTogJycsXG4gICAgICBrZXk6IHNjaGVtYVF1ZXN0aW9uLmlkLFxuICAgICAgbGFiZWw6IHNjaGVtYVF1ZXN0aW9uLmxhYmVsLFxuICAgICAgcmVuZGVyaW5nOiAnJyxcbiAgICAgIHJhbms6IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5yYW5rXG4gICAgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLnByZWZpeCA9IHNjaGVtYVF1ZXN0aW9uLnByZWZpeDtcbiAgICBxdWVzdGlvbi5yZW5kZXJpbmdUeXBlID0gJ3JlbW90ZS1zZWxlY3QnO1xuICAgIHF1ZXN0aW9uLnZhbGlkYXRvcnMgPSB0aGlzLmFkZFZhbGlkYXRvcnMoc2NoZW1hUXVlc3Rpb24pO1xuICAgIHF1ZXN0aW9uLmV4dHJhcyA9IHNjaGVtYVF1ZXN0aW9uO1xuICAgIHF1ZXN0aW9uLmRhdGFTb3VyY2UgPVxuICAgICAgc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLmRhdGFTb3VyY2UgfHwgJ2RpYWdub3Nlcyc7XG4gICAgY29uc3QgbWFwcGluZ3M6IGFueSA9IHtcbiAgICAgIGxhYmVsOiAnbGFiZWwnLFxuICAgICAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gICAgICBpZDogJ2tleSdcbiAgICB9O1xuICAgIHF1ZXN0aW9uLmNvbXBvbmVudENvbmZpZ3MgPSBzY2hlbWFRdWVzdGlvbi5jb21wb25lbnRDb25maWdzIHx8IFtdO1xuICAgIHRoaXMuY29weVByb3BlcnRpZXMobWFwcGluZ3MsIHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGREaXNhYmxlT3JIaWRlUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEFsZXJ0UHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEhpc3RvcmljYWxFeHByZXNzaW9ucyhzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQ2FsY3VsYXRvclByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG5cbiAgdG9SZW1vdGVTZWxlY3RRdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogUmVtb3RlU2VsZWN0UXVlc3Rpb24ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSB0aGlzLmdldERhdGFTb3VyY2VDb25maWcoc2NoZW1hUXVlc3Rpb24pO1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFJlbW90ZVNlbGVjdFF1ZXN0aW9uKHtcbiAgICAgIGRhdGFTb3VyY2U6IGRhdGFTb3VyY2UubmFtZSxcbiAgICAgIGRhdGFTb3VyY2VPcHRpb25zOiBkYXRhU291cmNlLm9wdGlvbnMsXG4gICAgICB0eXBlOiAnJyxcbiAgICAgIGtleTogJydcbiAgICB9KTtcbiAgICBxdWVzdGlvbi5xdWVzdGlvbkluZGV4ID0gdGhpcy5xdWV0aW9uSW5kZXg7XG4gICAgcXVlc3Rpb24ubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBxdWVzdGlvbi5wcmVmaXggPSBzY2hlbWFRdWVzdGlvbi5wcmVmaXg7XG4gICAgcXVlc3Rpb24ua2V5ID0gc2NoZW1hUXVlc3Rpb24uaWQ7XG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9ICdyZW1vdGUtc2VsZWN0JztcbiAgICBxdWVzdGlvbi52YWxpZGF0b3JzID0gdGhpcy5hZGRWYWxpZGF0b3JzKHNjaGVtYVF1ZXN0aW9uKTtcbiAgICBxdWVzdGlvbi5leHRyYXMgPSBzY2hlbWFRdWVzdGlvbjtcblxuICAgIGNvbnN0IG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgbGFiZWw6ICdsYWJlbCcsXG4gICAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICAgIGlkOiAna2V5J1xuICAgIH07XG5cbiAgICBxdWVzdGlvbi5jb21wb25lbnRDb25maWdzID0gc2NoZW1hUXVlc3Rpb24uY29tcG9uZW50Q29uZmlncyB8fCBbXTtcbiAgICB0aGlzLmNvcHlQcm9wZXJ0aWVzKG1hcHBpbmdzLCBzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkRGlzYWJsZU9ySGlkZVByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRBbGVydFByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGRIaXN0b3JpY2FsRXhwcmVzc2lvbnMoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZENhbGN1bGF0b3JQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuXG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhU291cmNlQ29uZmlnKFxuICAgIHNjaGVtYVF1ZXN0aW9uOiBhbnlcbiAgKTogeyBuYW1lOiBzdHJpbmc7IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VOYW1lID0gc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zPy5kYXRhU291cmNlO1xuICAgIGNvbnN0IGRhdGFTb3VyY2VPcHRpb25zID0gc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zPy5kYXRhU291cmNlT3B0aW9ucztcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29wZW5tcnMvb3Blbm1ycy1jb250cmliLWpzb24tc2NoZW1hcy9ibG9iL21haW4vZm9ybS5zY2hlbWEuanNvblxuICAgIGNvbnN0IG9wZW5tcnMzRGF0YVNvdXJjZSA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucz8uZGF0YXNvdXJjZTtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBkYXRhU291cmNlTmFtZSA/PyBvcGVubXJzM0RhdGFTb3VyY2U/Lm5hbWUgPz8gJycsXG4gICAgICBvcHRpb25zOiBkYXRhU291cmNlT3B0aW9ucyA/PyBvcGVubXJzM0RhdGFTb3VyY2U/LmNvbmZpZyA/PyB7fVxuICAgIH07XG4gIH1cblxuICB0b0RlY2ltYWxRdWVzdGlvbihzY2hlbWFRdWVzdGlvbjogYW55KTogVGV4dElucHV0UXVlc3Rpb24ge1xuICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFRleHRJbnB1dFF1ZXN0aW9uKHtcbiAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgIHR5cGU6ICcnLFxuICAgICAga2V5OiAnJ1xuICAgIH0pO1xuXG4gICAgcXVlc3Rpb24ucmVuZGVyaW5nVHlwZSA9ICdkZWNpbWFsJztcbiAgICBxdWVzdGlvbi5sYWJlbCA9IHNjaGVtYVF1ZXN0aW9uLmxhYmVsO1xuICAgIHF1ZXN0aW9uLmtleSA9IHNjaGVtYVF1ZXN0aW9uLmlkO1xuICAgIHF1ZXN0aW9uLnBsYWNlaG9sZGVyID0gc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLnBsYWNlaG9sZGVyIHx8ICcnO1xuICAgIHF1ZXN0aW9uLmV4dHJhcyA9IHNjaGVtYVF1ZXN0aW9uO1xuXG4gICAgY29uc3QgbWFwcGluZ3MgPSB7XG4gICAgICBsYWJlbDogJ2xhYmVsJyxcbiAgICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgICAgaWQ6ICdrZXknXG4gICAgfTtcblxuICAgIHRoaXMuY29weVByb3BlcnRpZXMobWFwcGluZ3MsIHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgcXVlc3Rpb24udmFsaWRhdG9ycyA9IHRoaXMuYWRkVmFsaWRhdG9ycyhzY2hlbWFRdWVzdGlvbik7XG4gICAgdGhpcy5hZGREaXNhYmxlT3JIaWRlUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEFsZXJ0UHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEhpc3RvcmljYWxFeHByZXNzaW9ucyhzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQ2FsY3VsYXRvclByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG5cbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cblxuICB0b1dvcmtzcGFjZUxhdW5jaGVyKHNjaGVtYVF1ZXN0aW9uOiBhbnkpOiBXb3Jrc3BhY2VMYXVuY2hlclF1ZXN0aW9uIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tlZEZvckVzbUZyYW1ld29yaykge1xuICAgICAgdGhpcy5jaGVja2VkRm9yRXNtRnJhbWV3b3JrID0gdHJ1ZTtcbiAgICAgIGlmICghd2luZG93Wydfb3Blbm1yc19lc21fZnJhbWV3b3JrJ10pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkBvcGVubXJzL2VzbS1mcmFtZXdvcmsgaXMgbm90IGFjY2Vzc2libGUuIFRoZSAnd29ya3NwYWNlLWxhdW5jaGVyJyBxdWVzdGlvbiB0eXBlIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIE8zIHBhdGllbnQgY2hhcnQsIHdoZXJlIHRoZSB3b3Jrc3BhY2UgaXMuXCJcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiB3aW5kb3dbJ19vcGVubXJzX2VzbV9mcmFtZXdvcmsnXS5sYXVuY2hXb3Jrc3BhY2UgIT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICdAb3Blbm1ycy9lc20tZnJhbWV3b3JrIGlzIGFjY2Vzc2libGUsIGJ1dCB0aGUgYGxhdW5jaFdvcmtzcGFjZWAgZnVuY3Rpb24gaXMgbWlzc2luZy4gSXQgaXMgbGlrZWx5IHRoYXQgdGhlIHZlcnNpb24gb2YgQG9wZW5tcnMvZXNtLWZyYW1ld29yayB0aGF0IGlzIGJlaW5nIHVzZWQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHZlcnNpb24gb2Ygbmd4LWZvcm1lbnRyeS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHF1ZXN0aW9uID0gbmV3IFdvcmtzcGFjZUxhdW5jaGVyUXVlc3Rpb24oe1xuICAgICAgdHlwZTogJycsXG4gICAgICBrZXk6IHNjaGVtYVF1ZXN0aW9uLmlkLFxuICAgICAgbGFiZWw6IHNjaGVtYVF1ZXN0aW9uLmxhYmVsLFxuICAgICAgYnV0dG9uTGFiZWw6IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5idXR0b25MYWJlbCxcbiAgICAgIGJ1dHRvblR5cGU6IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucy5idXR0b25UeXBlLFxuICAgICAgd29ya3NwYWNlTmFtZTogc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLndvcmtzcGFjZU5hbWUsXG4gICAgICBhZGRpdGlvbmFsUHJvcHM6IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucz8uYWRkaXRpb25hbFByb3BzID8/IHt9XG4gICAgfSk7XG4gICAgcXVlc3Rpb24ucXVlc3Rpb25JbmRleCA9IHRoaXMucXVldGlvbkluZGV4O1xuICAgIHF1ZXN0aW9uLmV4dHJhcyA9IHNjaGVtYVF1ZXN0aW9uO1xuICAgIHF1ZXN0aW9uLmV4dHJhcy5xdWVzdGlvbk9wdGlvbnMuYnV0dG9uVHlwZSA9IHF1ZXN0aW9uLmJ1dHRvblR5cGU7XG4gICAgcXVlc3Rpb24uZXh0cmFzLnF1ZXN0aW9uT3B0aW9ucy53b3Jrc3BhY2VOYW1lID0gcXVlc3Rpb24ud29ya3NwYWNlTmFtZTtcbiAgICBjb25zdCBtYXBwaW5ncyA9IHtcbiAgICAgIGxhYmVsOiAnbGFiZWwnLFxuICAgICAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gICAgICBpZDogJ2tleSdcbiAgICB9O1xuICAgIHRoaXMuY29weVByb3BlcnRpZXMobWFwcGluZ3MsIHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgdGhpcy5hZGREaXNhYmxlT3JIaWRlUHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEFsZXJ0UHJvcGVydHkoc2NoZW1hUXVlc3Rpb24sIHF1ZXN0aW9uKTtcbiAgICB0aGlzLmFkZEhpc3RvcmljYWxFeHByZXNzaW9ucyhzY2hlbWFRdWVzdGlvbiwgcXVlc3Rpb24pO1xuICAgIHRoaXMuYWRkQ2FsY3VsYXRvclByb3BlcnR5KHNjaGVtYVF1ZXN0aW9uLCBxdWVzdGlvbik7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG5cbiAgZ2V0U2NoZW1hUXVlc3Rpb25zKHNjaGVtYTogYW55KTogYW55IHtcbiAgICBjb25zdCBsaXN0UXVlc3Rpb25zID0gbmV3IEFycmF5KCk7XG4gICAgdGhpcy5nZXRRdWVzdGlvbnMoc2NoZW1hLCBsaXN0UXVlc3Rpb25zKTtcbiAgICByZXR1cm4gbGlzdFF1ZXN0aW9ucztcbiAgfVxuXG4gIGdldFF1ZXN0aW9ucyhzY2hlbWE6IGFueSwgZm91bmRBcnJheTogYW55KTogYW55IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZm91bmRBcnJheSkpIHtcbiAgICAgIGZvdW5kQXJyYXkgPSBbXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBzY2hlbWEpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICB0aGlzLmdldFF1ZXN0aW9ucyhzY2hlbWFbcHJvcGVydHldLCBmb3VuZEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzY2hlbWEgJiYgIUFycmF5LmlzQXJyYXkoc2NoZW1hKSAmJiB0eXBlb2Ygc2NoZW1hID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHNjaGVtYS5xdWVzdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNjaGVtYS5xdWVzdGlvbk9wdGlvbnMucmVuZGVyaW5nID09PSAnZ3JvdXAnIHx8XG4gICAgICAgICAgc2NoZW1hLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmcgPT09ICdyZXBlYXRpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHNjaGVtYS5xdWVzdGlvbnMgPSB0aGlzLmdldEdyb3VwTWVtYmVycyhzY2hlbWEucXVlc3Rpb25zKTtcbiAgICAgICAgICBmb3VuZEFycmF5LnB1c2goXG4gICAgICAgICAgICB0aGlzLnRvTW9kZWwoc2NoZW1hLCBzY2hlbWEucXVlc3Rpb25PcHRpb25zLnJlbmRlcmluZylcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS5xdWVzdGlvbk9wdGlvbnMucmVuZGVyaW5nID09PSAnZmllbGQtc2V0Jykge1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvdW5kQXJyYXkucHVzaChcbiAgICAgICAgICAgIHRoaXMudG9Nb2RlbChzY2hlbWEsIHNjaGVtYS5xdWVzdGlvbk9wdGlvbnMucmVuZGVyaW5nKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgbyBpbiBzY2hlbWEpIHtcbiAgICAgICAgICBpZiAoc2NoZW1hLmhhc093blByb3BlcnR5KG8pKSB7XG4gICAgICAgICAgICB0aGlzLmdldFF1ZXN0aW9ucyhzY2hlbWFbb10sIGZvdW5kQXJyYXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldENoaWxkcmVuUXVlc3Rpb25Nb2RlbHMoc2NoZW1hOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gW107XG4gICAgdGhpcy5nZXRRdWVzdGlvbnMoc2NoZW1hLCBjaGlsZHJlbik7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdG9Nb2RlbChzY2hlbWE6IGFueSwgcmVuZGVyVHlwZTogc3RyaW5nKTogYW55IHtcbiAgICB0aGlzLnF1ZXRpb25JbmRleCsrO1xuICAgIGlmIChyZW5kZXJUeXBlID09PSAndWktc2VsZWN0LWV4dGVuZGVkJykge1xuICAgICAgcmVuZGVyVHlwZSA9IHNjaGVtYS50eXBlO1xuICAgIH1cbiAgICBpZiAoIXNjaGVtYS5pZCkge1xuICAgICAgc2NoZW1hWydpZCddID0gdGhpcy5nZW5lcmF0ZUlkKDEwKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzY2hlbWEucXVlc3Rpb25PcHRpb25zICYmXG4gICAgICAoc2NoZW1hLnF1ZXN0aW9uT3B0aW9ucy5zaG93RGF0ZSA9PT0gdHJ1ZSB8fFxuICAgICAgICBzY2hlbWEucXVlc3Rpb25PcHRpb25zLnNob3dEYXRlID09PSAndHJ1ZScpXG4gICAgKSB7XG4gICAgICBzY2hlbWEgPSB0aGlzLmNvbnZlcnRPbGRWZXJzaW9uQ29tcGxleE9ic1F1ZXN0aW9uVG9OZXdWZXJzaW9uKHNjaGVtYSk7XG4gICAgICByZW5kZXJUeXBlID0gJ2ZpZWxkLXNldCc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlICdkaWFnbm9zaXMnOlxuICAgICAgICByZXR1cm4gdGhpcy50b0RpYWdub3Npc1F1ZXN0aW9uKHNjaGVtYSk7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4gdGhpcy50b1NlbGVjdFF1ZXN0aW9uKHNjaGVtYSk7XG4gICAgICBjYXNlICdzaW5nbGUtc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9TZWxlY3RRdWVzdGlvbihzY2hlbWEpO1xuICAgICAgY2FzZSAnbXVsdGktc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9TZWxlY3RRdWVzdGlvbihzY2hlbWEpO1xuICAgICAgY2FzZSAnbnVtZXJpYyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRvTnVtZXJpY1F1ZXN0aW9uKHNjaGVtYSk7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gdGhpcy50b051bWJlclF1ZXN0aW9uKHNjaGVtYSk7XG4gICAgICBjYXNlICdkZWNpbWFsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9EZWNpbWFsUXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGNhc2UgJ2VuY291bnRlckRhdGV0aW1lJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9FbmNvdW50ZXJEYXRldGltZVF1ZXN0aW9uKHNjaGVtYSk7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9EYXRlUXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGNhc2UgJ211bHRpQ2hlY2tib3gnOlxuICAgICAgICByZXR1cm4gdGhpcy50b011bHRpQ2hlY2tib3hRdWVzdGlvbihzY2hlbWEpO1xuICAgICAgY2FzZSAnZHJ1Zyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRvRHJ1Z1F1ZXN0aW9uKHNjaGVtYSk7XG4gICAgICBjYXNlICdwcm9ibGVtJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Qcm9ibGVtUXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGNhc2UgJ2dyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Hcm91cFF1ZXN0aW9uKHNjaGVtYSk7XG4gICAgICBjYXNlICdmaWVsZC1zZXQnOlxuICAgICAgICByZXR1cm4gdGhpcy50b0ZpZWxkU2V0UXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGNhc2UgJ3JlcGVhdGluZyc6XG4gICAgICAgIHJldHVybiB0aGlzLnRvUmVwZWF0aW5nUXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGNhc2UgJ3BlcnNvbkF0dHJpYnV0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnRvUGVyc29uQXR0cmlidXRlUXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICByZXR1cm4gdGhpcy50b1RleHRRdWVzdGlvbihzY2hlbWEpO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICByZXR1cm4gdGhpcy50b1RleHRBcmVhUXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGNhc2UgJ3NlbGVjdC1jb25jZXB0LWFuc3dlcnMnOlxuICAgICAgICByZXR1cm4gdGhpcy50b0NvbmNlcHRBbnN3ZXJTZWxlY3Qoc2NoZW1hKTtcbiAgICAgIGNhc2UgJ2VuY291bnRlckxvY2F0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9FbmNvdW50ZXJMb2NhdGlvblF1ZXN0aW9uKHNjaGVtYSk7XG4gICAgICBjYXNlICdlbmNvdW50ZXJEYXRldGltZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnRvRW5jb3VudGVyRGF0ZXRpbWVRdWVzdGlvbihzY2hlbWEpO1xuICAgICAgY2FzZSAnZW5jb3VudGVyUHJvdmlkZXInOlxuICAgICAgICByZXR1cm4gdGhpcy50b0VuY291bnRlclByb3ZpZGVyUXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9SYWRpb0J1dHRvblF1ZXN0aW9uKHNjaGVtYSk7XG4gICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgIHJldHVybiB0aGlzLnRvQ2hlY2tCb3hRdWVzdGlvbihzY2hlbWEpO1xuICAgICAgY2FzZSAnZW5jb3VudGVyUHJvdmlkZXInOlxuICAgICAgICByZXR1cm4gdGhpcy50b0VuY291bnRlclByb3ZpZGVyUXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICByZXR1cm4gdGhpcy50b0ZpbGVVcGxvYWRRdWVzdGlvbihzY2hlbWEpO1xuICAgICAgY2FzZSAnd29ya3NwYWNlLWxhdW5jaGVyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Xb3Jrc3BhY2VMYXVuY2hlcihzY2hlbWEpO1xuICAgICAgY2FzZSAncmVtb3RlLXNlbGVjdCc6XG4gICAgICAgIHJldHVybiB0aGlzLnRvUmVtb3RlU2VsZWN0UXVlc3Rpb24oc2NoZW1hKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUud2FybignTmV3IFNjaGVtYSBRdWVzdGlvbiBUeXBlIGZvdW5kLi4uLi4uLi4uJyArIHJlbmRlclR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcy50b1RleHRRdWVzdGlvbihzY2hlbWEpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnZlcnRPbGRWZXJzaW9uQ29tcGxleE9ic1F1ZXN0aW9uVG9OZXdWZXJzaW9uKHNjaGVtYVF1ZXN0aW9uOiBhbnkpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWQ6IGFueSA9IHt9O1xuICAgIGNvbnZlcnRlZC50eXBlID0gJ2NvbXBsZXgtb2JzJztcbiAgICBjb252ZXJ0ZWQubGFiZWwgPSBzY2hlbWFRdWVzdGlvbi5sYWJlbDtcbiAgICBjb252ZXJ0ZWQucHJlZml4ID0gc2NoZW1hUXVlc3Rpb24ucHJlZml4O1xuICAgIGNvbnZlcnRlZC5pZCA9ICdjb21wbGV4XycgKyBzY2hlbWFRdWVzdGlvbi5pZDtcbiAgICBjb252ZXJ0ZWQucXVlc3Rpb25PcHRpb25zID0ge307XG4gICAgY29udmVydGVkLnF1ZXN0aW9uT3B0aW9ucy5jb25jZXB0ID0gc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLmNvbmNlcHQ7XG4gICAgY29udmVydGVkLnF1ZXN0aW9uT3B0aW9ucy5yZW5kZXJpbmcgPSAnZmllbGQtc2V0JztcbiAgICBjb252ZXJ0ZWQucXVlc3Rpb25zID0gW107XG4gICAgY29udmVydGVkLnZhbGlkYXRvcnMgPSBbXTtcblxuICAgIGNvbnN0IG1haW5GaWVsZDogYW55ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzY2hlbWFRdWVzdGlvbikpO1xuICAgIG1haW5GaWVsZC50eXBlID0gJ2NvbXBsZXgtb2JzLWNoaWxkJztcbiAgICBkZWxldGUgbWFpbkZpZWxkLnF1ZXN0aW9uT3B0aW9ucy5zaG93RGF0ZTtcbiAgICBkZWxldGUgbWFpbkZpZWxkLnF1ZXN0aW9uT3B0aW9ucy5zaG93bkRhdGVPcHRpb25zO1xuICAgIG1haW5GaWVsZC5xdWVzdGlvbk9wdGlvbnMub2JzRmllbGQgPSAndmFsdWUnO1xuXG4gICAgY29uc3QgZGF0ZUZpZWxkOiBhbnkgPSB7fTtcbiAgICBkYXRlRmllbGQudHlwZSA9ICdjb21wbGV4LW9icy1jaGlsZCc7XG4gICAgZGF0ZUZpZWxkLmxhYmVsID0gJ0RhdGUgb2YgJyArIG1haW5GaWVsZC5sYWJlbDtcbiAgICBkYXRlRmllbGQuaWQgPSAnZGF0ZV8nICsgbWFpbkZpZWxkLmlkO1xuICAgIGRhdGVGaWVsZC5xdWVzdGlvbk9wdGlvbnMgPSB7fTtcbiAgICBkYXRlRmllbGQucXVlc3Rpb25PcHRpb25zLmNvbmNlcHQgPSBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMuY29uY2VwdDtcbiAgICBkYXRlRmllbGQucXVlc3Rpb25PcHRpb25zLnJlbmRlcmluZyA9ICdkYXRlJztcbiAgICBkYXRlRmllbGQucXVlc3Rpb25PcHRpb25zLm9ic0ZpZWxkID0gJ29ic0RhdGV0aW1lJztcbiAgICBjb25zdCBkYXRlT3B0aW9uczogYW55ID0gKE9iamVjdCBhcyBhbnkpLmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLnNob3duRGF0ZU9wdGlvbnNcbiAgICApO1xuICAgIGRhdGVGaWVsZC52YWxpZGF0b3JzID0gZGF0ZU9wdGlvbnMudmFsaWRhdG9ycztcbiAgICBkYXRlRmllbGQuaGlkZSA9IGRhdGVPcHRpb25zLmhpZGU7XG5cbiAgICBjb252ZXJ0ZWQucXVlc3Rpb25zLnB1c2gobWFpbkZpZWxkKTtcbiAgICBjb252ZXJ0ZWQucXVlc3Rpb25zLnB1c2goZGF0ZUZpZWxkKTtcblxuICAgIHJldHVybiBjb252ZXJ0ZWQ7XG4gIH1cblxuICBjb3B5UHJvcGVydGllcyhtYXBwaW5nczogYW55LCBzb3VyY2U6IGFueSwgZGVzdGluYXRpb246IFF1ZXN0aW9uQmFzZSkge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIG1hcHBpbmdzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSAmJlxuICAgICAgICBkZXN0aW5hdGlvbi5oYXNPd25Qcm9wZXJ0eShtYXBwaW5nc1twcm9wZXJ0eV0pXG4gICAgICApIHtcbiAgICAgICAgZGVzdGluYXRpb25bbWFwcGluZ3NbcHJvcGVydHldXSA9IHNvdXJjZVtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkVmFsaWRhdG9ycyhzY2hlbWFRdWVzdGlvbjogYW55KTogQXJyYXk8VmFsaWRhdGlvbk1vZGVsPiB7XG4gICAgY29uc3QgdmFsaWRhdG9yczogQXJyYXk8VmFsaWRhdGlvbk1vZGVsPiA9IFtdO1xuXG4gICAgaWYgKHNjaGVtYVF1ZXN0aW9uLnZhbGlkYXRvcnMpIHtcbiAgICAgIC8vIFRPRE8gLSBhZGQgbW9yZSB2YWxpZGF0b3IgdHlwZXNcbiAgICAgIF8uZm9yRWFjaChzY2hlbWFRdWVzdGlvbi52YWxpZGF0b3JzLCAodmFsaWRhdG9yOiBhbnkpID0+IHtcbiAgICAgICAgc3dpdGNoICh2YWxpZGF0b3IudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKG5ldyBEYXRlVmFsaWRhdGlvbk1vZGVsKHZhbGlkYXRvcikpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnanNfZXhwcmVzc2lvbic6XG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2gobmV3IEpzRXhwcmVzc2lvblZhbGlkYXRpb25Nb2RlbCh2YWxpZGF0b3IpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2NvbmRpdGlvbmFsQW5zd2VyZWQnOlxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKG5ldyBDb25kaXRpb25hbFZhbGlkYXRpb25Nb2RlbCh2YWxpZGF0b3IpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2RlY2ltYWwnOlxuICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKG5ldyBEZWNpbWFsVmFsaWRhdGlvbk1vZGVsKHZhbGlkYXRvcikpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChuZXcgVmFsaWRhdGlvbk1vZGVsKHZhbGlkYXRvcikpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXN0aW9uT3B0aW9ucyA9IHNjaGVtYVF1ZXN0aW9uLnF1ZXN0aW9uT3B0aW9ucztcbiAgICBjb25zdCByZW5kZXJpbmdUeXBlID0gcXVlc3Rpb25PcHRpb25zID8gcXVlc3Rpb25PcHRpb25zLnJlbmRlcmluZyA6ICcnO1xuICAgIHN3aXRjaCAocmVuZGVyaW5nVHlwZSkge1xuICAgICAgY2FzZSAnZGVjaW1hbCc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAocXVlc3Rpb25PcHRpb25zLm1heCAmJiBxdWVzdGlvbk9wdGlvbnMubWluKSB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFxuICAgICAgICAgICAgbmV3IE1heFZhbGlkYXRpb25Nb2RlbCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdtYXgnLFxuICAgICAgICAgICAgICBtYXg6IHF1ZXN0aW9uT3B0aW9ucy5tYXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goXG4gICAgICAgICAgICBuZXcgTWluVmFsaWRhdGlvbk1vZGVsKHtcbiAgICAgICAgICAgICAgdHlwZTogJ21pbicsXG4gICAgICAgICAgICAgIG1pbjogcXVlc3Rpb25PcHRpb25zLm1pblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChxdWVzdGlvbk9wdGlvbnMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFxuICAgICAgICAgICAgbmV3IE1heExlbmd0aFZhbGlkYXRpb25Nb2RlbCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdtYXhsZW5ndGgnLFxuICAgICAgICAgICAgICBtYXhsZW5ndGg6IHF1ZXN0aW9uT3B0aW9ucy5tYXhMZW5ndGhcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlc3Rpb25PcHRpb25zLm1pbkxlbmd0aCkge1xuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChcbiAgICAgICAgICAgIG5ldyBNaW5MZW5ndGhWYWxpZGF0aW9uTW9kZWwoe1xuICAgICAgICAgICAgICB0eXBlOiAnbWlubGVuZ3RoJyxcbiAgICAgICAgICAgICAgbWlubGVuZ3RoOiBxdWVzdGlvbk9wdGlvbnMubWluTGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXN0aW9uT3B0aW9ucy5kaXNhbGxvd0RlY2ltYWxzKSB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFxuICAgICAgICAgICAgbmV3IERpc2FsbG93RGVjaW1hbHNWYWxpZGF0aW9uTW9kZWwoe1xuICAgICAgICAgICAgICB0eXBlOiAnZGlzYWxsb3dEZWNpbWFscycsXG4gICAgICAgICAgICAgIGRpc2FsbG93RGVjaW1hbHM6IHF1ZXN0aW9uT3B0aW9ucy5kaXNhbGxvd0RlY2ltYWxzXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIGFkZCBjb25kaXRpb25hbCByZXF1aXJlZCB2YWxpZGF0b3JzXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFRdWVzdGlvbi5yZXF1aXJlZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHJlcXVpcmVkOiBhbnkgPSBzY2hlbWFRdWVzdGlvbi5yZXF1aXJlZDtcblxuICAgICAgaWYgKHJlcXVpcmVkLnR5cGUgPT09ICdjb25kaXRpb25hbFJlcXVpcmVkJykge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goXG4gICAgICAgICAgbmV3IENvbmRpdGlvbmFsVmFsaWRhdGlvbk1vZGVsKHtcbiAgICAgICAgICAgIHJlZmVyZW5jZVF1ZXN0aW9uSWQ6IHJlcXVpcmVkLnJlZmVyZW5jZVF1ZXN0aW9uSWQsXG4gICAgICAgICAgICByZWZlcmVuY2VRdWVzdGlvbkFuc3dlcnM6IHJlcXVpcmVkLnJlZmVyZW5jZVF1ZXN0aW9uQW5zd2VycyxcbiAgICAgICAgICAgIHR5cGU6IHJlcXVpcmVkLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiByZXF1aXJlZC5tZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuXG4gIGFkZEhpc3RvcmljYWxFeHByZXNzaW9ucyhzY2hlbWFRdWVzdGlvbjogYW55LCBxdWVzdGlvbjogUXVlc3Rpb25CYXNlKTogYW55IHtcbiAgICBpZiAoXG4gICAgICBzY2hlbWFRdWVzdGlvbi5oaXN0b3JpY2FsRXhwcmVzc2lvbiAmJlxuICAgICAgc2NoZW1hUXVlc3Rpb24uaGlzdG9yaWNhbEV4cHJlc3Npb24ubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgcXVlc3Rpb24uc2V0SGlzdG9yaWNhbFZhbHVlKHRydWUpO1xuICAgICAgaWYgKHNjaGVtYVF1ZXN0aW9uLnNob3dIaXN0b3JpY2FsRW5jb3VudGVyRGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXN0aW9uLnNob3dIaXN0b3JpY2FsRW5jb3VudGVyRGF0ZShcbiAgICAgICAgICBzY2hlbWFRdWVzdGlvbi5zaG93SGlzdG9yaWNhbEVuY291bnRlckRhdGUgPT09ICd0cnVlJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlc3Rpb24uc2hvd0hpc3RvcmljYWxFbmNvdW50ZXJEYXRlKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBvcmlnVmFsdWUgPSB0aGlzLmhpc3RvcmljYWxIZWxwZXJTZXJ2aWNlLmV2YWx1YXRlKFxuICAgICAgICBzY2hlbWFRdWVzdGlvbi5oaXN0b3JpY2FsRXhwcmVzc2lvbixcbiAgICAgICAgdGhpcy5kYXRhU291cmNlcyxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgcXVlc3Rpb24uaGlzdG9yaWNhbERhdGFWYWx1ZSA9IG9yaWdWYWx1ZTtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbygnaGlzdG9yaWNhbCB2YWx1ZScsIG9yaWdWYWx1ZSk7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ2hpc3RvcmljYWwgZGF0YSBxdWVzdGlvbiA6OjonLCBxdWVzdGlvbik7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ3NjaGVtYSBkYXRhIHF1ZXN0aW9uIDo6OicsIHNjaGVtYVF1ZXN0aW9uKTtcblxuICAgICAgaWYgKHNjaGVtYVF1ZXN0aW9uLmhpc3RvcmljYWxQcmVwb3B1bGF0ZUNvbmRpdGlvbiAmJiBvcmlnVmFsdWUpIHtcbiAgICAgICAgY29uc3QgdG9Qb3B1bGF0ZSA9IHRoaXMuaGlzdG9yaWNhbEhlbHBlclNlcnZpY2UuZXZhbHVhdGVQcmVjb25kaXRpb24oXG4gICAgICAgICAgc2NoZW1hUXVlc3Rpb24uaGlzdG9yaWNhbFByZXBvcHVsYXRlQ29uZGl0aW9uLFxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZXMsXG4gICAgICAgICAgb3JpZ1ZhbHVlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRvUG9wdWxhdGUpIHtcbiAgICAgICAgICBxdWVzdGlvbi5kZWZhdWx0VmFsdWUgPSBvcmlnVmFsdWUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuOyAvLyBkb24ndCB0cnkgdG8gZXZhbHVhdGUgdGhlIG90aGVyIG9wdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hUXVlc3Rpb24uaGlzdG9yaWNhbFByZXBvcHVsYXRlICYmIG9yaWdWYWx1ZSkge1xuICAgICAgICAvLyBzYW1wbGUgc2NoZW1hIG9wdGlvbnMgZm9yIHRoaXMgYnJhbmNoXG4gICAgICAgIC8vIFwiaGlzdG9yaWNhbFByZXBvcHVsYXRlXCI6dHJ1ZSxcbiAgICAgICAgLy8gXCJhbGxvd2VkSGlzdG9yaWNhbFZhbHVlQWdlSW5EYXlzXCI6IDQwMDAwLFxuICAgICAgICBjb25zdCB2YWxEYXRlID0gbW9tZW50KG9yaWdWYWx1ZS52YWx1ZURhdGUpO1xuICAgICAgICBjb25zdCBkaWZmZXJlbmNlSW5EYXlzID0gbW9tZW50KCkuZGlmZih2YWxEYXRlLCAnZGF5cycpO1xuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihzY2hlbWFRdWVzdGlvbi5hbGxvd2VkSGlzdG9yaWNhbFZhbHVlQWdlSW5EYXlzKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRpZmZlcmVuY2VJbkRheXMgPD0gc2NoZW1hUXVlc3Rpb24uYWxsb3dlZEhpc3RvcmljYWxWYWx1ZUFnZUluRGF5c1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcXVlc3Rpb24uZGVmYXVsdFZhbHVlID0gb3JpZ1ZhbHVlLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBxdWVzdGlvbi5kZWZhdWx0VmFsdWUgPSBvcmlnVmFsdWUudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRDYWxjdWxhdG9yUHJvcGVydHkoc2NoZW1hUXVlc3Rpb246IGFueSwgcXVlc3Rpb246IFF1ZXN0aW9uQmFzZSk6IGFueSB7XG4gICAgaWYgKFxuICAgICAgc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zICYmXG4gICAgICB0eXBlb2Ygc2NoZW1hUXVlc3Rpb24ucXVlc3Rpb25PcHRpb25zLmNhbGN1bGF0ZSA9PT0gJ29iamVjdCdcbiAgICApIHtcbiAgICAgIHF1ZXN0aW9uLmNhbGN1bGF0ZUV4cHJlc3Npb24gPVxuICAgICAgICBzY2hlbWFRdWVzdGlvbi5xdWVzdGlvbk9wdGlvbnMuY2FsY3VsYXRlLmNhbGN1bGF0ZUV4cHJlc3Npb247XG4gICAgfVxuICB9XG5cbiAgYWRkQWxlcnRQcm9wZXJ0eShzY2hlbWFRdWVzdGlvbjogYW55LCBxdWVzdGlvbjogUXVlc3Rpb25CYXNlKTogYW55IHtcbiAgICBpZiAoc2NoZW1hUXVlc3Rpb24uYWxlcnQpIHtcbiAgICAgIHF1ZXN0aW9uLmFsZXJ0ID0gc2NoZW1hUXVlc3Rpb24uYWxlcnQ7XG4gICAgfVxuICAgIC8vIGlmICh0eXBlb2Ygc2NoZW1hUXVlc3Rpb24ubWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyAgIGlmIChzY2hlbWFRdWVzdGlvbi5tZXNzYWdlLmFsZXJ0V2hlbkV4cHJlc3Npb24pIHtcbiAgICAvLyAgICAgcXVlc3Rpb24ubWVzc2FnZSA9IHNjaGVtYVF1ZXN0aW9uLm1lc3NhZ2UuYWxlcnRXaGVuRXhwcmVzc2lvbjtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gIH1cblxuICBhZGREaXNhYmxlT3JIaWRlUHJvcGVydHkoc2NoZW1hUXVlc3Rpb246IGFueSwgcXVlc3Rpb246IFF1ZXN0aW9uQmFzZSk6IGFueSB7XG4gICAgaWYgKCEhc2NoZW1hUXVlc3Rpb24uZGlzYWJsZSkge1xuICAgICAgcXVlc3Rpb24uZGlzYWJsZSA9IHNjaGVtYVF1ZXN0aW9uLmRpc2FibGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFRdWVzdGlvbi5kaXNhYmxlID09PSAnb2JqZWN0Jykge1xuICAgICAgcXVlc3Rpb24uZGlzYWJsZSA9IHNjaGVtYVF1ZXN0aW9uLmRpc2FibGUuZGlzYWJsZVdoZW5FeHByZXNzaW9uO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWFRdWVzdGlvbi5kaXNhYmxlKSB7XG4gICAgICAvL2lmIHJlc2V0VmFsdWVPbkRpc2FibGUgZG9lc24ndCBleGlzdCBvbiB0aGUgY29uZmlnIG9yIG5vIHZhbHVlIGlzIHByb3ZpZGVkIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcGFzc2VkICh0cnVlKVxuICAgICAgcXVlc3Rpb24ucmVzZXRWYWx1ZU9uRGlzYWJsZSA9XG4gICAgICAgICFzY2hlbWFRdWVzdGlvbi5oYXNPd25Qcm9wZXJ0eSgncmVzZXRWYWx1ZU9uRGlzYWJsZScpIHx8XG4gICAgICAgIHRoaXMuaXNFbXB0eShzY2hlbWFRdWVzdGlvbi5yZXNldFZhbHVlT25EaXNhYmxlKVxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogc2NoZW1hUXVlc3Rpb24ucmVzZXRWYWx1ZU9uRGlzYWJsZTtcbiAgICB9XG5cbiAgICBpZiAoISFzY2hlbWFRdWVzdGlvbi5oaWRlKSB7XG4gICAgICBxdWVzdGlvbi5oaWRlID0gc2NoZW1hUXVlc3Rpb24uaGlkZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWFRdWVzdGlvbi5oaWRlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHNjaGVtYVF1ZXN0aW9uLmhpZGUuaGlkZVdoZW5FeHByZXNzaW9uKSB7XG4gICAgICAgIHF1ZXN0aW9uLmhpZGUgPSBzY2hlbWFRdWVzdGlvbi5oaWRlLmhpZGVXaGVuRXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSWQoeCkge1xuICAgIGxldCBzID0gJ18nO1xuICAgIHdoaWxlIChzLmxlbmd0aCA8IHggJiYgeCA+IDApIHtcbiAgICAgIGNvbnN0IHIgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgcyArPVxuICAgICAgICByIDwgMC4xXG4gICAgICAgICAgPyBNYXRoLmZsb29yKHIgKiAxMDApXG4gICAgICAgICAgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKE1hdGguZmxvb3IociAqIDI2KSArIChyID4gMC41ID8gOTcgOiA2NSkpO1xuICAgIH1cbiAgICByZXR1cm4gJ18nICsgcztcbiAgfVxuXG4gIGlzRW1wdHkodmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==