@sapui5/sap.fe.core 1.95.0 → 1.98.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/package.json +5 -5
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +3 -3
  4. package/src/sap/fe/core/AppComponent.js +9 -44
  5. package/src/sap/fe/core/AppStateHandler.js +2 -2
  6. package/src/sap/fe/core/BaseController.js +1 -1
  7. package/src/sap/fe/core/BusyLocker.js +13 -1
  8. package/src/sap/fe/core/CommonUtils.js +129 -219
  9. package/src/sap/fe/core/ExtensionAPI.js +14 -6
  10. package/src/sap/fe/core/PageController.js +9 -35
  11. package/src/sap/fe/core/RouterProxy.js +79 -75
  12. package/src/sap/fe/core/Synchronization.js +1 -1
  13. package/src/sap/fe/core/TemplateComponent.js +16 -7
  14. package/src/sap/fe/core/TemplateModel.js +1 -1
  15. package/src/sap/fe/core/TransactionHelper.js +183 -65
  16. package/src/sap/fe/core/actions/draft.js +50 -23
  17. package/src/sap/fe/core/actions/messageHandling.js +86 -7
  18. package/src/sap/fe/core/actions/nonDraft.js +1 -1
  19. package/src/sap/fe/core/actions/operations.js +75 -33
  20. package/src/sap/fe/core/actions/sticky.js +1 -1
  21. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
  22. package/src/sap/fe/core/controllerextensions/EditFlow.js +276 -122
  23. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
  24. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +14 -6
  25. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +90 -46
  26. package/src/sap/fe/core/controllerextensions/InternalRouting.js +234 -232
  27. package/src/sap/fe/core/controllerextensions/KPIManagement.js +539 -209
  28. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +550 -213
  29. package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
  30. package/src/sap/fe/core/controllerextensions/MessageHandler.js +227 -103
  31. package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
  32. package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
  33. package/src/sap/fe/core/controllerextensions/Paginator.js +38 -12
  34. package/src/sap/fe/core/controllerextensions/Placeholder.js +16 -19
  35. package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
  36. package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
  37. package/src/sap/fe/core/controllerextensions/Share.js +20 -7
  38. package/src/sap/fe/core/controllerextensions/SideEffects.js +8 -9
  39. package/src/sap/fe/core/controllerextensions/SideEffects.ts +19 -17
  40. package/src/sap/fe/core/controllerextensions/ViewState.js +54 -9
  41. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +40 -34
  42. package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
  43. package/src/sap/fe/core/controls/CommandExecution.js +1 -1
  44. package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
  45. package/src/sap/fe/core/controls/CustomQuickViewPage.js +110 -109
  46. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
  47. package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
  48. package/src/sap/fe/core/controls/FilterBar.js +1 -1
  49. package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
  50. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
  51. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
  52. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
  53. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
  54. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
  55. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
  56. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  57. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
  58. package/src/sap/fe/core/converters/ConverterContext.js +13 -1
  59. package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
  60. package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
  61. package/src/sap/fe/core/converters/ManifestSettings.ts +7 -1
  62. package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
  63. package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
  64. package/src/sap/fe/core/converters/MetaModelConverter.js +920 -882
  65. package/src/sap/fe/core/converters/MetaModelConverter.ts +829 -853
  66. package/src/sap/fe/core/converters/annotations/DataField.js +54 -4
  67. package/src/sap/fe/core/converters/annotations/DataField.ts +53 -3
  68. package/src/sap/fe/core/converters/common/AnnotationConverter.js +83 -48
  69. package/src/sap/fe/core/converters/controls/Common/Action.js +15 -3
  70. package/src/sap/fe/core/converters/controls/Common/Action.ts +12 -3
  71. package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
  72. package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
  73. package/src/sap/fe/core/converters/controls/Common/Form.js +68 -21
  74. package/src/sap/fe/core/converters/controls/Common/Form.ts +60 -16
  75. package/src/sap/fe/core/converters/controls/Common/KPI.js +331 -248
  76. package/src/sap/fe/core/converters/controls/Common/KPI.ts +355 -287
  77. package/src/sap/fe/core/converters/controls/Common/Table.js +426 -332
  78. package/src/sap/fe/core/converters/controls/Common/Table.ts +516 -383
  79. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
  80. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
  81. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
  82. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
  83. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  84. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  85. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
  86. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
  87. package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
  88. package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
  89. package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
  90. package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
  91. package/src/sap/fe/core/converters/helpers/ID.js +9 -1
  92. package/src/sap/fe/core/converters/helpers/ID.ts +6 -2
  93. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -5
  94. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -4
  95. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
  96. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
  97. package/src/sap/fe/core/converters/templates/ListReportConverter.js +34 -4
  98. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -7
  99. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
  100. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
  101. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  102. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  103. package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
  104. package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
  105. package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
  106. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  107. package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
  108. package/src/sap/fe/core/fpm/Component.js +2 -2
  109. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  110. package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
  111. package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
  112. package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
  113. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
  114. package/src/sap/fe/core/helpers/EditState.js +1 -1
  115. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
  116. package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
  117. package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
  118. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
  119. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
  120. package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
  121. package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
  122. package/src/sap/fe/core/helpers/ModelHelper.js +64 -1
  123. package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
  124. package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
  125. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
  126. package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
  127. package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
  128. package/src/sap/fe/core/library.js +28 -2
  129. package/src/sap/fe/core/library.support.js +10 -4
  130. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  131. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  132. package/src/sap/fe/core/messagebundle.properties +67 -3
  133. package/src/sap/fe/core/messagebundle_ar.properties +40 -3
  134. package/src/sap/fe/core/messagebundle_bg.properties +40 -3
  135. package/src/sap/fe/core/messagebundle_ca.properties +41 -4
  136. package/src/sap/fe/core/messagebundle_cs.properties +41 -4
  137. package/src/sap/fe/core/messagebundle_cy.properties +40 -3
  138. package/src/sap/fe/core/messagebundle_da.properties +40 -3
  139. package/src/sap/fe/core/messagebundle_de.properties +40 -3
  140. package/src/sap/fe/core/messagebundle_el.properties +40 -3
  141. package/src/sap/fe/core/messagebundle_en.properties +37 -0
  142. package/src/sap/fe/core/messagebundle_en_GB.properties +37 -0
  143. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -0
  144. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +46 -2
  145. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -0
  146. package/src/sap/fe/core/messagebundle_es.properties +40 -3
  147. package/src/sap/fe/core/messagebundle_es_MX.properties +41 -4
  148. package/src/sap/fe/core/messagebundle_et.properties +40 -3
  149. package/src/sap/fe/core/messagebundle_fi.properties +40 -3
  150. package/src/sap/fe/core/messagebundle_fr.properties +41 -4
  151. package/src/sap/fe/core/messagebundle_fr_CA.properties +40 -3
  152. package/src/sap/fe/core/messagebundle_hi.properties +40 -3
  153. package/src/sap/fe/core/messagebundle_hr.properties +40 -3
  154. package/src/sap/fe/core/messagebundle_hu.properties +41 -4
  155. package/src/sap/fe/core/messagebundle_id.properties +42 -5
  156. package/src/sap/fe/core/messagebundle_it.properties +40 -3
  157. package/src/sap/fe/core/messagebundle_iw.properties +40 -3
  158. package/src/sap/fe/core/messagebundle_ja.properties +49 -12
  159. package/src/sap/fe/core/messagebundle_kk.properties +40 -3
  160. package/src/sap/fe/core/messagebundle_ko.properties +40 -3
  161. package/src/sap/fe/core/messagebundle_lt.properties +40 -3
  162. package/src/sap/fe/core/messagebundle_lv.properties +40 -3
  163. package/src/sap/fe/core/messagebundle_ms.properties +40 -3
  164. package/src/sap/fe/core/messagebundle_nl.properties +40 -3
  165. package/src/sap/fe/core/messagebundle_no.properties +40 -3
  166. package/src/sap/fe/core/messagebundle_pl.properties +40 -3
  167. package/src/sap/fe/core/messagebundle_pt.properties +42 -5
  168. package/src/sap/fe/core/messagebundle_pt_PT.properties +40 -3
  169. package/src/sap/fe/core/messagebundle_ro.properties +40 -3
  170. package/src/sap/fe/core/messagebundle_ru.properties +40 -3
  171. package/src/sap/fe/core/messagebundle_sh.properties +40 -3
  172. package/src/sap/fe/core/messagebundle_sk.properties +40 -3
  173. package/src/sap/fe/core/messagebundle_sl.properties +40 -3
  174. package/src/sap/fe/core/messagebundle_sv.properties +41 -4
  175. package/src/sap/fe/core/messagebundle_th.properties +40 -3
  176. package/src/sap/fe/core/messagebundle_tr.properties +40 -3
  177. package/src/sap/fe/core/messagebundle_uk.properties +40 -3
  178. package/src/sap/fe/core/messagebundle_vi.properties +40 -3
  179. package/src/sap/fe/core/messagebundle_zh_CN.properties +40 -3
  180. package/src/sap/fe/core/messagebundle_zh_TW.properties +40 -3
  181. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
  182. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
  183. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  184. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
  185. package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
  186. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
  187. package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -328
  188. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  189. package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
  190. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
  191. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
  192. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +14 -5
  193. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
  194. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  195. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  196. package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -37
  197. package/src/sap/fe/core/templating/DataModelPathHelper.ts +13 -33
  198. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  200. package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
  201. package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
  202. package/src/sap/fe/core/templating/FilterHelper.js +10 -7
  203. package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
  204. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  205. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  206. package/src/sap/fe/core/templating/UIFormatters.js +47 -107
  207. package/src/sap/fe/core/templating/UIFormatters.ts +76 -72
@@ -39,1035 +39,1026 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
39
39
  Chart: true,
40
40
  MicroChart: true,
41
41
  UShell: true,
42
- IntentBasedNavigation: true
42
+ IntentBasedNavigation: true,
43
+ Situations: false
43
44
  };
44
45
  _exports.DefaultEnvironmentCapabilities = DefaultEnvironmentCapabilities;
45
- var MetaModelConverter = {
46
- parsePropertyValue: function (annotationObject, propertyKey, currentTarget, annotationsLists, oCapabilities) {
47
- var _this = this;
48
46
 
49
- var value;
50
- var currentPropertyTarget = currentTarget + "/" + propertyKey;
47
+ function parsePropertyValue(annotationObject, propertyKey, currentTarget, annotationsLists, oCapabilities) {
48
+ var value;
49
+ var currentPropertyTarget = currentTarget + "/" + propertyKey;
50
+ var typeOfAnnotation = typeof annotationObject;
51
51
 
52
- if (annotationObject === null) {
53
- value = {
54
- type: "Null",
55
- Null: null
56
- };
57
- } else if (typeof annotationObject === "string") {
58
- value = {
59
- type: "String",
60
- String: annotationObject
61
- };
62
- } else if (typeof annotationObject === "boolean") {
63
- value = {
64
- type: "Bool",
65
- Bool: annotationObject
66
- };
67
- } else if (typeof annotationObject === "number") {
68
- value = {
69
- type: "Int",
70
- Int: annotationObject
71
- };
72
- } else if (Array.isArray(annotationObject)) {
73
- value = {
74
- type: "Collection",
75
- Collection: annotationObject.map(function (subAnnotationObject, subAnnotationObjectIndex) {
76
- return _this.parseAnnotationObject(subAnnotationObject, currentPropertyTarget + "/" + subAnnotationObjectIndex, annotationsLists, oCapabilities);
77
- })
78
- };
52
+ if (annotationObject === null) {
53
+ value = {
54
+ type: "Null",
55
+ Null: null
56
+ };
57
+ } else if (typeOfAnnotation === "string") {
58
+ value = {
59
+ type: "String",
60
+ String: annotationObject
61
+ };
62
+ } else if (typeOfAnnotation === "boolean") {
63
+ value = {
64
+ type: "Bool",
65
+ Bool: annotationObject
66
+ };
67
+ } else if (typeOfAnnotation === "number") {
68
+ value = {
69
+ type: "Int",
70
+ Int: annotationObject
71
+ };
72
+ } else if (Array.isArray(annotationObject)) {
73
+ value = {
74
+ type: "Collection",
75
+ Collection: annotationObject.map(function (subAnnotationObject, subAnnotationObjectIndex) {
76
+ return parseAnnotationObject(subAnnotationObject, currentPropertyTarget + "/" + subAnnotationObjectIndex, annotationsLists, oCapabilities);
77
+ })
78
+ };
79
79
 
80
- if (annotationObject.length > 0) {
81
- if (annotationObject[0].hasOwnProperty("$PropertyPath")) {
82
- value.Collection.type = "PropertyPath";
83
- } else if (annotationObject[0].hasOwnProperty("$Path")) {
84
- value.Collection.type = "Path";
85
- } else if (annotationObject[0].hasOwnProperty("$NavigationPropertyPath")) {
86
- value.Collection.type = "NavigationPropertyPath";
87
- } else if (annotationObject[0].hasOwnProperty("$AnnotationPath")) {
88
- value.Collection.type = "AnnotationPath";
89
- } else if (annotationObject[0].hasOwnProperty("$Type")) {
90
- value.Collection.type = "Record";
91
- } else if (annotationObject[0].hasOwnProperty("$If")) {
92
- value.Collection.type = "If";
93
- } else if (annotationObject[0].hasOwnProperty("$Or")) {
94
- value.Collection.type = "Or";
95
- } else if (annotationObject[0].hasOwnProperty("$And")) {
96
- value.Collection.type = "And";
97
- } else if (annotationObject[0].hasOwnProperty("$Eq")) {
98
- value.Collection.type = "Eq";
99
- } else if (annotationObject[0].hasOwnProperty("$Ne")) {
100
- value.Collection.type = "Ne";
101
- } else if (annotationObject[0].hasOwnProperty("$Not")) {
102
- value.Collection.type = "Not";
103
- } else if (annotationObject[0].hasOwnProperty("$Gt")) {
104
- value.Collection.type = "Gt";
105
- } else if (annotationObject[0].hasOwnProperty("$Ge")) {
106
- value.Collection.type = "Ge";
107
- } else if (annotationObject[0].hasOwnProperty("$Lt")) {
108
- value.Collection.type = "Lt";
109
- } else if (annotationObject[0].hasOwnProperty("$Le")) {
110
- value.Collection.type = "Le";
111
- } else if (annotationObject[0].hasOwnProperty("$Apply")) {
112
- value.Collection.type = "Apply";
113
- } else if (typeof annotationObject[0] === "object") {
114
- // $Type is optional...
115
- value.Collection.type = "Record";
116
- } else {
117
- value.Collection.type = "String";
118
- }
80
+ if (annotationObject.length > 0) {
81
+ if (annotationObject[0].hasOwnProperty("$PropertyPath")) {
82
+ value.Collection.type = "PropertyPath";
83
+ } else if (annotationObject[0].hasOwnProperty("$Path")) {
84
+ value.Collection.type = "Path";
85
+ } else if (annotationObject[0].hasOwnProperty("$NavigationPropertyPath")) {
86
+ value.Collection.type = "NavigationPropertyPath";
87
+ } else if (annotationObject[0].hasOwnProperty("$AnnotationPath")) {
88
+ value.Collection.type = "AnnotationPath";
89
+ } else if (annotationObject[0].hasOwnProperty("$Type")) {
90
+ value.Collection.type = "Record";
91
+ } else if (annotationObject[0].hasOwnProperty("$If")) {
92
+ value.Collection.type = "If";
93
+ } else if (annotationObject[0].hasOwnProperty("$Or")) {
94
+ value.Collection.type = "Or";
95
+ } else if (annotationObject[0].hasOwnProperty("$And")) {
96
+ value.Collection.type = "And";
97
+ } else if (annotationObject[0].hasOwnProperty("$Eq")) {
98
+ value.Collection.type = "Eq";
99
+ } else if (annotationObject[0].hasOwnProperty("$Ne")) {
100
+ value.Collection.type = "Ne";
101
+ } else if (annotationObject[0].hasOwnProperty("$Not")) {
102
+ value.Collection.type = "Not";
103
+ } else if (annotationObject[0].hasOwnProperty("$Gt")) {
104
+ value.Collection.type = "Gt";
105
+ } else if (annotationObject[0].hasOwnProperty("$Ge")) {
106
+ value.Collection.type = "Ge";
107
+ } else if (annotationObject[0].hasOwnProperty("$Lt")) {
108
+ value.Collection.type = "Lt";
109
+ } else if (annotationObject[0].hasOwnProperty("$Le")) {
110
+ value.Collection.type = "Le";
111
+ } else if (annotationObject[0].hasOwnProperty("$Apply")) {
112
+ value.Collection.type = "Apply";
113
+ } else if (typeof annotationObject[0] === "object") {
114
+ // $Type is optional...
115
+ value.Collection.type = "Record";
116
+ } else {
117
+ value.Collection.type = "String";
119
118
  }
120
- } else if (annotationObject.$Path !== undefined) {
121
- value = {
122
- type: "Path",
123
- Path: annotationObject.$Path
124
- };
125
- } else if (annotationObject.$Decimal !== undefined) {
126
- value = {
127
- type: "Decimal",
128
- Decimal: parseFloat(annotationObject.$Decimal)
129
- };
130
- } else if (annotationObject.$PropertyPath !== undefined) {
131
- value = {
132
- type: "PropertyPath",
133
- PropertyPath: annotationObject.$PropertyPath
134
- };
135
- } else if (annotationObject.$NavigationPropertyPath !== undefined) {
136
- value = {
137
- type: "NavigationPropertyPath",
138
- NavigationPropertyPath: annotationObject.$NavigationPropertyPath
139
- };
140
- } else if (annotationObject.$If !== undefined) {
141
- value = {
142
- type: "If",
143
- If: annotationObject.$If
144
- };
145
- } else if (annotationObject.$And !== undefined) {
146
- value = {
147
- type: "And",
148
- And: annotationObject.$And
149
- };
150
- } else if (annotationObject.$Or !== undefined) {
151
- value = {
152
- type: "Or",
153
- Or: annotationObject.$Or
154
- };
155
- } else if (annotationObject.$Not !== undefined) {
156
- value = {
157
- type: "Not",
158
- Not: annotationObject.$Not
159
- };
160
- } else if (annotationObject.$Eq !== undefined) {
161
- value = {
162
- type: "Eq",
163
- Eq: annotationObject.$Eq
164
- };
165
- } else if (annotationObject.$Ne !== undefined) {
166
- value = {
167
- type: "Ne",
168
- Ne: annotationObject.$Ne
169
- };
170
- } else if (annotationObject.$Gt !== undefined) {
171
- value = {
172
- type: "Gt",
173
- Gt: annotationObject.$Gt
174
- };
175
- } else if (annotationObject.$Ge !== undefined) {
176
- value = {
177
- type: "Ge",
178
- Ge: annotationObject.$Ge
179
- };
180
- } else if (annotationObject.$Lt !== undefined) {
181
- value = {
182
- type: "Lt",
183
- Lt: annotationObject.$Lt
184
- };
185
- } else if (annotationObject.$Le !== undefined) {
186
- value = {
187
- type: "Le",
188
- Le: annotationObject.$Le
189
- };
190
- } else if (annotationObject.$Apply !== undefined) {
191
- value = {
192
- type: "Apply",
193
- Apply: annotationObject.$Apply,
194
- Function: annotationObject.$Function
195
- };
196
- } else if (annotationObject.$AnnotationPath !== undefined) {
197
- value = {
198
- type: "AnnotationPath",
199
- AnnotationPath: annotationObject.$AnnotationPath
200
- };
201
- } else if (annotationObject.$EnumMember !== undefined) {
202
- value = {
203
- type: "EnumMember",
204
- EnumMember: this.mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
205
- };
206
- } else if (annotationObject.$Type) {
207
- value = {
208
- type: "Record",
209
- Record: this.parseAnnotationObject(annotationObject, currentTarget, annotationsLists, oCapabilities)
210
- };
211
- } else {
212
- value = {
213
- type: "Record",
214
- Record: this.parseAnnotationObject(annotationObject, currentTarget, annotationsLists, oCapabilities)
215
- };
119
+ }
120
+ } else if (annotationObject.$Path !== undefined) {
121
+ value = {
122
+ type: "Path",
123
+ Path: annotationObject.$Path
124
+ };
125
+ } else if (annotationObject.$Decimal !== undefined) {
126
+ value = {
127
+ type: "Decimal",
128
+ Decimal: parseFloat(annotationObject.$Decimal)
129
+ };
130
+ } else if (annotationObject.$PropertyPath !== undefined) {
131
+ value = {
132
+ type: "PropertyPath",
133
+ PropertyPath: annotationObject.$PropertyPath
134
+ };
135
+ } else if (annotationObject.$NavigationPropertyPath !== undefined) {
136
+ value = {
137
+ type: "NavigationPropertyPath",
138
+ NavigationPropertyPath: annotationObject.$NavigationPropertyPath
139
+ };
140
+ } else if (annotationObject.$If !== undefined) {
141
+ value = {
142
+ type: "If",
143
+ If: annotationObject.$If
144
+ };
145
+ } else if (annotationObject.$And !== undefined) {
146
+ value = {
147
+ type: "And",
148
+ And: annotationObject.$And
149
+ };
150
+ } else if (annotationObject.$Or !== undefined) {
151
+ value = {
152
+ type: "Or",
153
+ Or: annotationObject.$Or
154
+ };
155
+ } else if (annotationObject.$Not !== undefined) {
156
+ value = {
157
+ type: "Not",
158
+ Not: annotationObject.$Not
159
+ };
160
+ } else if (annotationObject.$Eq !== undefined) {
161
+ value = {
162
+ type: "Eq",
163
+ Eq: annotationObject.$Eq
164
+ };
165
+ } else if (annotationObject.$Ne !== undefined) {
166
+ value = {
167
+ type: "Ne",
168
+ Ne: annotationObject.$Ne
169
+ };
170
+ } else if (annotationObject.$Gt !== undefined) {
171
+ value = {
172
+ type: "Gt",
173
+ Gt: annotationObject.$Gt
174
+ };
175
+ } else if (annotationObject.$Ge !== undefined) {
176
+ value = {
177
+ type: "Ge",
178
+ Ge: annotationObject.$Ge
179
+ };
180
+ } else if (annotationObject.$Lt !== undefined) {
181
+ value = {
182
+ type: "Lt",
183
+ Lt: annotationObject.$Lt
184
+ };
185
+ } else if (annotationObject.$Le !== undefined) {
186
+ value = {
187
+ type: "Le",
188
+ Le: annotationObject.$Le
189
+ };
190
+ } else if (annotationObject.$Apply !== undefined) {
191
+ value = {
192
+ type: "Apply",
193
+ Apply: annotationObject.$Apply,
194
+ Function: annotationObject.$Function
195
+ };
196
+ } else if (annotationObject.$AnnotationPath !== undefined) {
197
+ value = {
198
+ type: "AnnotationPath",
199
+ AnnotationPath: annotationObject.$AnnotationPath
200
+ };
201
+ } else if (annotationObject.$EnumMember !== undefined) {
202
+ value = {
203
+ type: "EnumMember",
204
+ EnumMember: mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
205
+ };
206
+ } else if (annotationObject.$Type) {
207
+ value = {
208
+ type: "Record",
209
+ Record: parseAnnotationObject(annotationObject, currentTarget, annotationsLists, oCapabilities)
210
+ };
211
+ } else {
212
+ value = {
213
+ type: "Record",
214
+ Record: parseAnnotationObject(annotationObject, currentTarget, annotationsLists, oCapabilities)
215
+ };
216
+ }
217
+
218
+ return {
219
+ name: propertyKey,
220
+ value: value
221
+ };
222
+ }
223
+
224
+ function mapNameToAlias(annotationName) {
225
+ var _annotationName$split = annotationName.split("@"),
226
+ _annotationName$split2 = _slicedToArray(_annotationName$split, 2),
227
+ pathPart = _annotationName$split2[0],
228
+ annoPart = _annotationName$split2[1];
229
+
230
+ if (!annoPart) {
231
+ annoPart = pathPart;
232
+ pathPart = "";
233
+ } else {
234
+ pathPart += "@";
235
+ }
236
+
237
+ var lastDot = annoPart.lastIndexOf(".");
238
+ return pathPart + VOCABULARY_ALIAS[annoPart.substr(0, lastDot)] + "." + annoPart.substr(lastDot + 1);
239
+ }
240
+
241
+ function parseAnnotationObject(annotationObject, currentObjectTarget, annotationsLists, oCapabilities) {
242
+ var parsedAnnotationObject = {};
243
+ var typeOfObject = typeof annotationObject;
244
+
245
+ if (annotationObject === null) {
246
+ parsedAnnotationObject = {
247
+ type: "Null",
248
+ Null: null
249
+ };
250
+ } else if (typeOfObject === "string") {
251
+ parsedAnnotationObject = {
252
+ type: "String",
253
+ String: annotationObject
254
+ };
255
+ } else if (typeOfObject === "boolean") {
256
+ parsedAnnotationObject = {
257
+ type: "Bool",
258
+ Bool: annotationObject
259
+ };
260
+ } else if (typeOfObject === "number") {
261
+ parsedAnnotationObject = {
262
+ type: "Int",
263
+ Int: annotationObject
264
+ };
265
+ } else if (annotationObject.$AnnotationPath !== undefined) {
266
+ parsedAnnotationObject = {
267
+ type: "AnnotationPath",
268
+ AnnotationPath: annotationObject.$AnnotationPath
269
+ };
270
+ } else if (annotationObject.$Path !== undefined) {
271
+ parsedAnnotationObject = {
272
+ type: "Path",
273
+ Path: annotationObject.$Path
274
+ };
275
+ } else if (annotationObject.$Decimal !== undefined) {
276
+ parsedAnnotationObject = {
277
+ type: "Decimal",
278
+ Decimal: parseFloat(annotationObject.$Decimal)
279
+ };
280
+ } else if (annotationObject.$PropertyPath !== undefined) {
281
+ parsedAnnotationObject = {
282
+ type: "PropertyPath",
283
+ PropertyPath: annotationObject.$PropertyPath
284
+ };
285
+ } else if (annotationObject.$If !== undefined) {
286
+ parsedAnnotationObject = {
287
+ type: "If",
288
+ If: annotationObject.$If
289
+ };
290
+ } else if (annotationObject.$And !== undefined) {
291
+ parsedAnnotationObject = {
292
+ type: "And",
293
+ And: annotationObject.$And
294
+ };
295
+ } else if (annotationObject.$Or !== undefined) {
296
+ parsedAnnotationObject = {
297
+ type: "Or",
298
+ Or: annotationObject.$Or
299
+ };
300
+ } else if (annotationObject.$Not !== undefined) {
301
+ parsedAnnotationObject = {
302
+ type: "Not",
303
+ Not: annotationObject.$Not
304
+ };
305
+ } else if (annotationObject.$Eq !== undefined) {
306
+ parsedAnnotationObject = {
307
+ type: "Eq",
308
+ Eq: annotationObject.$Eq
309
+ };
310
+ } else if (annotationObject.$Ne !== undefined) {
311
+ parsedAnnotationObject = {
312
+ type: "Ne",
313
+ Ne: annotationObject.$Ne
314
+ };
315
+ } else if (annotationObject.$Gt !== undefined) {
316
+ parsedAnnotationObject = {
317
+ type: "Gt",
318
+ Gt: annotationObject.$Gt
319
+ };
320
+ } else if (annotationObject.$Ge !== undefined) {
321
+ parsedAnnotationObject = {
322
+ type: "Ge",
323
+ Ge: annotationObject.$Ge
324
+ };
325
+ } else if (annotationObject.$Lt !== undefined) {
326
+ parsedAnnotationObject = {
327
+ type: "Lt",
328
+ Lt: annotationObject.$Lt
329
+ };
330
+ } else if (annotationObject.$Le !== undefined) {
331
+ parsedAnnotationObject = {
332
+ type: "Le",
333
+ Le: annotationObject.$Le
334
+ };
335
+ } else if (annotationObject.$Apply !== undefined) {
336
+ parsedAnnotationObject = {
337
+ type: "Apply",
338
+ Apply: annotationObject.$Apply,
339
+ Function: annotationObject.$Function
340
+ };
341
+ } else if (annotationObject.$NavigationPropertyPath !== undefined) {
342
+ parsedAnnotationObject = {
343
+ type: "NavigationPropertyPath",
344
+ NavigationPropertyPath: annotationObject.$NavigationPropertyPath
345
+ };
346
+ } else if (annotationObject.$EnumMember !== undefined) {
347
+ parsedAnnotationObject = {
348
+ type: "EnumMember",
349
+ EnumMember: mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
350
+ };
351
+ } else if (Array.isArray(annotationObject)) {
352
+ var parsedAnnotationCollection = parsedAnnotationObject;
353
+ parsedAnnotationCollection.collection = annotationObject.map(function (subAnnotationObject, subAnnotationIndex) {
354
+ return parseAnnotationObject(subAnnotationObject, currentObjectTarget + "/" + subAnnotationIndex, annotationsLists, oCapabilities);
355
+ });
356
+
357
+ if (annotationObject.length > 0) {
358
+ if (annotationObject[0].hasOwnProperty("$PropertyPath")) {
359
+ parsedAnnotationCollection.collection.type = "PropertyPath";
360
+ } else if (annotationObject[0].hasOwnProperty("$Path")) {
361
+ parsedAnnotationCollection.collection.type = "Path";
362
+ } else if (annotationObject[0].hasOwnProperty("$NavigationPropertyPath")) {
363
+ parsedAnnotationCollection.collection.type = "NavigationPropertyPath";
364
+ } else if (annotationObject[0].hasOwnProperty("$AnnotationPath")) {
365
+ parsedAnnotationCollection.collection.type = "AnnotationPath";
366
+ } else if (annotationObject[0].hasOwnProperty("$Type")) {
367
+ parsedAnnotationCollection.collection.type = "Record";
368
+ } else if (annotationObject[0].hasOwnProperty("$If")) {
369
+ parsedAnnotationCollection.collection.type = "If";
370
+ } else if (annotationObject[0].hasOwnProperty("$And")) {
371
+ parsedAnnotationCollection.collection.type = "And";
372
+ } else if (annotationObject[0].hasOwnProperty("$Or")) {
373
+ parsedAnnotationCollection.collection.type = "Or";
374
+ } else if (annotationObject[0].hasOwnProperty("$Eq")) {
375
+ parsedAnnotationCollection.collection.type = "Eq";
376
+ } else if (annotationObject[0].hasOwnProperty("$Ne")) {
377
+ parsedAnnotationCollection.collection.type = "Ne";
378
+ } else if (annotationObject[0].hasOwnProperty("$Not")) {
379
+ parsedAnnotationCollection.collection.type = "Not";
380
+ } else if (annotationObject[0].hasOwnProperty("$Gt")) {
381
+ parsedAnnotationCollection.collection.type = "Gt";
382
+ } else if (annotationObject[0].hasOwnProperty("$Ge")) {
383
+ parsedAnnotationCollection.collection.type = "Ge";
384
+ } else if (annotationObject[0].hasOwnProperty("$Lt")) {
385
+ parsedAnnotationCollection.collection.type = "Lt";
386
+ } else if (annotationObject[0].hasOwnProperty("$Le")) {
387
+ parsedAnnotationCollection.collection.type = "Le";
388
+ } else if (annotationObject[0].hasOwnProperty("$Apply")) {
389
+ parsedAnnotationCollection.collection.type = "Apply";
390
+ } else if (typeof annotationObject[0] === "object") {
391
+ parsedAnnotationCollection.collection.type = "Record";
392
+ } else {
393
+ parsedAnnotationCollection.collection.type = "String";
394
+ }
395
+ }
396
+ } else {
397
+ if (annotationObject.$Type) {
398
+ var typeValue = annotationObject.$Type;
399
+ parsedAnnotationObject.type = typeValue; //`${typeAlias}.${typeTerm}`;
216
400
  }
217
401
 
218
- return {
219
- name: propertyKey,
220
- value: value
402
+ var propertyValues = [];
403
+ Object.keys(annotationObject).forEach(function (propertyKey) {
404
+ if (propertyKey !== "$Type" && propertyKey !== "$If" && propertyKey !== "$Apply" && propertyKey !== "$And" && propertyKey !== "$Or" && propertyKey !== "$Ne" && propertyKey !== "$Gt" && propertyKey !== "$Ge" && propertyKey !== "$Lt" && propertyKey !== "$Le" && propertyKey !== "$Not" && propertyKey !== "$Eq" && !propertyKey.startsWith("@")) {
405
+ propertyValues.push(parsePropertyValue(annotationObject[propertyKey], propertyKey, currentObjectTarget, annotationsLists, oCapabilities));
406
+ } else if (propertyKey.startsWith("@")) {
407
+ // Annotation of annotation
408
+ createAnnotationLists(_defineProperty({}, propertyKey, annotationObject[propertyKey]), currentObjectTarget, annotationsLists, oCapabilities);
409
+ }
410
+ });
411
+ parsedAnnotationObject.propertyValues = propertyValues;
412
+ }
413
+
414
+ return parsedAnnotationObject;
415
+ }
416
+
417
+ function getOrCreateAnnotationList(target, annotationsLists) {
418
+ if (!annotationsLists.hasOwnProperty(target)) {
419
+ annotationsLists[target] = {
420
+ target: target,
421
+ annotations: []
221
422
  };
222
- },
223
- mapNameToAlias: function (annotationName) {
224
- var _annotationName$split = annotationName.split("@"),
225
- _annotationName$split2 = _slicedToArray(_annotationName$split, 2),
226
- pathPart = _annotationName$split2[0],
227
- annoPart = _annotationName$split2[1];
228
-
229
- if (!annoPart) {
230
- annoPart = pathPart;
231
- pathPart = "";
423
+ }
424
+
425
+ return annotationsLists[target];
426
+ }
427
+
428
+ function removeChartAnnotations(annotationObject) {
429
+ return annotationObject.filter(function (oRecord) {
430
+ if (oRecord.Target && oRecord.Target.$AnnotationPath) {
431
+ return oRecord.Target.$AnnotationPath.indexOf("@com.sap.vocabularies.UI.v1.Chart") === -1;
232
432
  } else {
233
- pathPart += "@";
433
+ return true;
234
434
  }
435
+ });
436
+ }
437
+
438
+ function removeIBNAnnotations(annotationObject) {
439
+ return annotationObject.filter(function (oRecord) {
440
+ return oRecord.$Type !== "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation";
441
+ });
442
+ }
443
+
444
+ function handlePresentationVariant(annotationObject) {
445
+ return annotationObject.filter(function (oRecord) {
446
+ return oRecord.$AnnotationPath !== "@com.sap.vocabularies.UI.v1.Chart";
447
+ });
448
+ }
449
+
450
+ function createAnnotationLists(annotationObjects, annotationTarget, annotationLists, oCapabilities) {
451
+ if (Object.keys(annotationObjects).length === 0) {
452
+ return;
453
+ }
454
+
455
+ var outAnnotationObject = getOrCreateAnnotationList(annotationTarget, annotationLists);
235
456
 
236
- var lastDot = annoPart.lastIndexOf(".");
237
- return pathPart + VOCABULARY_ALIAS[annoPart.substr(0, lastDot)] + "." + annoPart.substr(lastDot + 1);
238
- },
239
- parseAnnotationObject: function (annotationObject, currentObjectTarget, annotationsLists, oCapabilities) {
240
- var _this2 = this;
457
+ if (!oCapabilities.MicroChart) {
458
+ delete annotationObjects["@com.sap.vocabularies.UI.v1.Chart"];
459
+ }
460
+
461
+ var _loop = function (_annotationKey) {
462
+ var annotationObject = annotationObjects[_annotationKey];
463
+
464
+ switch (_annotationKey) {
465
+ case "@com.sap.vocabularies.UI.v1.HeaderFacets":
466
+ if (!oCapabilities.MicroChart) {
467
+ annotationObject = removeChartAnnotations(annotationObject);
468
+ annotationObjects[_annotationKey] = annotationObject;
469
+ }
470
+
471
+ break;
472
+
473
+ case "@com.sap.vocabularies.UI.v1.Identification":
474
+ if (!oCapabilities.IntentBasedNavigation) {
475
+ annotationObject = removeIBNAnnotations(annotationObject);
476
+ annotationObjects[_annotationKey] = annotationObject;
477
+ }
241
478
 
242
- var parsedAnnotationObject = {};
479
+ break;
480
+
481
+ case "@com.sap.vocabularies.UI.v1.LineItem":
482
+ if (!oCapabilities.IntentBasedNavigation) {
483
+ annotationObject = removeIBNAnnotations(annotationObject);
484
+ annotationObjects[_annotationKey] = annotationObject;
485
+ }
486
+
487
+ if (!oCapabilities.MicroChart) {
488
+ annotationObject = removeChartAnnotations(annotationObject);
489
+ annotationObjects[_annotationKey] = annotationObject;
490
+ }
491
+
492
+ break;
493
+
494
+ case "@com.sap.vocabularies.UI.v1.FieldGroup":
495
+ if (!oCapabilities.IntentBasedNavigation) {
496
+ annotationObject.Data = removeIBNAnnotations(annotationObject.Data);
497
+ annotationObjects[_annotationKey] = annotationObject;
498
+ }
499
+
500
+ if (!oCapabilities.MicroChart) {
501
+ annotationObject.Data = removeChartAnnotations(annotationObject.Data);
502
+ annotationObjects[_annotationKey] = annotationObject;
503
+ }
504
+
505
+ break;
506
+
507
+ case "@com.sap.vocabularies.UI.v1.PresentationVariant":
508
+ if (!oCapabilities.Chart && annotationObject.Visualizations) {
509
+ annotationObject.Visualizations = handlePresentationVariant(annotationObject.Visualizations);
510
+ annotationObjects[_annotationKey] = annotationObject;
511
+ }
512
+
513
+ break;
514
+
515
+ default:
516
+ break;
517
+ }
518
+
519
+ var currentOutAnnotationObject = outAnnotationObject; // Check for annotation of annotation
520
+
521
+ var annotationOfAnnotationSplit = _annotationKey.split("@");
522
+
523
+ if (annotationOfAnnotationSplit.length > 2) {
524
+ currentOutAnnotationObject = getOrCreateAnnotationList(annotationTarget + "@" + annotationOfAnnotationSplit[1], annotationLists);
525
+ _annotationKey = annotationOfAnnotationSplit[2];
526
+ } else {
527
+ _annotationKey = annotationOfAnnotationSplit[1];
528
+ }
529
+
530
+ var annotationQualifierSplit = _annotationKey.split("#");
531
+
532
+ var qualifier = annotationQualifierSplit[1];
533
+ _annotationKey = annotationQualifierSplit[0];
534
+ var parsedAnnotationObject = {
535
+ term: "".concat(_annotationKey),
536
+ qualifier: qualifier
537
+ };
538
+ var currentAnnotationTarget = annotationTarget + "@" + parsedAnnotationObject.term;
539
+
540
+ if (qualifier) {
541
+ currentAnnotationTarget += "#" + qualifier;
542
+ }
543
+
544
+ var isCollection = false;
545
+ var typeofAnnotation = typeof annotationObject;
243
546
 
244
547
  if (annotationObject === null) {
245
- parsedAnnotationObject = {
246
- type: "Null",
247
- Null: null
548
+ parsedAnnotationObject.value = {
549
+ type: "Bool",
550
+ Bool: annotationObject
248
551
  };
249
- } else if (typeof annotationObject === "string") {
250
- parsedAnnotationObject = {
552
+ } else if (typeofAnnotation === "string") {
553
+ parsedAnnotationObject.value = {
251
554
  type: "String",
252
555
  String: annotationObject
253
556
  };
254
- } else if (typeof annotationObject === "boolean") {
255
- parsedAnnotationObject = {
557
+ } else if (typeofAnnotation === "boolean") {
558
+ parsedAnnotationObject.value = {
256
559
  type: "Bool",
257
560
  Bool: annotationObject
258
561
  };
259
- } else if (typeof annotationObject === "number") {
260
- parsedAnnotationObject = {
562
+ } else if (typeofAnnotation === "number") {
563
+ parsedAnnotationObject.value = {
261
564
  type: "Int",
262
565
  Int: annotationObject
263
566
  };
264
- } else if (annotationObject.$AnnotationPath !== undefined) {
265
- parsedAnnotationObject = {
266
- type: "AnnotationPath",
267
- AnnotationPath: annotationObject.$AnnotationPath
268
- };
269
- } else if (annotationObject.$Path !== undefined) {
270
- parsedAnnotationObject = {
271
- type: "Path",
272
- Path: annotationObject.$Path
273
- };
274
- } else if (annotationObject.$Decimal !== undefined) {
275
- parsedAnnotationObject = {
276
- type: "Decimal",
277
- Decimal: parseFloat(annotationObject.$Decimal)
278
- };
279
- } else if (annotationObject.$PropertyPath !== undefined) {
280
- parsedAnnotationObject = {
281
- type: "PropertyPath",
282
- PropertyPath: annotationObject.$PropertyPath
283
- };
284
567
  } else if (annotationObject.$If !== undefined) {
285
- parsedAnnotationObject = {
568
+ parsedAnnotationObject.value = {
286
569
  type: "If",
287
570
  If: annotationObject.$If
288
571
  };
289
572
  } else if (annotationObject.$And !== undefined) {
290
- parsedAnnotationObject = {
573
+ parsedAnnotationObject.value = {
291
574
  type: "And",
292
575
  And: annotationObject.$And
293
576
  };
294
577
  } else if (annotationObject.$Or !== undefined) {
295
- parsedAnnotationObject = {
578
+ parsedAnnotationObject.value = {
296
579
  type: "Or",
297
580
  Or: annotationObject.$Or
298
581
  };
299
582
  } else if (annotationObject.$Not !== undefined) {
300
- parsedAnnotationObject = {
583
+ parsedAnnotationObject.value = {
301
584
  type: "Not",
302
585
  Not: annotationObject.$Not
303
586
  };
304
587
  } else if (annotationObject.$Eq !== undefined) {
305
- parsedAnnotationObject = {
588
+ parsedAnnotationObject.value = {
306
589
  type: "Eq",
307
590
  Eq: annotationObject.$Eq
308
591
  };
309
592
  } else if (annotationObject.$Ne !== undefined) {
310
- parsedAnnotationObject = {
593
+ parsedAnnotationObject.value = {
311
594
  type: "Ne",
312
595
  Ne: annotationObject.$Ne
313
596
  };
314
597
  } else if (annotationObject.$Gt !== undefined) {
315
- parsedAnnotationObject = {
598
+ parsedAnnotationObject.value = {
316
599
  type: "Gt",
317
600
  Gt: annotationObject.$Gt
318
601
  };
319
602
  } else if (annotationObject.$Ge !== undefined) {
320
- parsedAnnotationObject = {
603
+ parsedAnnotationObject.value = {
321
604
  type: "Ge",
322
605
  Ge: annotationObject.$Ge
323
606
  };
324
607
  } else if (annotationObject.$Lt !== undefined) {
325
- parsedAnnotationObject = {
608
+ parsedAnnotationObject.value = {
326
609
  type: "Lt",
327
610
  Lt: annotationObject.$Lt
328
611
  };
329
612
  } else if (annotationObject.$Le !== undefined) {
330
- parsedAnnotationObject = {
613
+ parsedAnnotationObject.value = {
331
614
  type: "Le",
332
615
  Le: annotationObject.$Le
333
616
  };
334
617
  } else if (annotationObject.$Apply !== undefined) {
335
- parsedAnnotationObject = {
618
+ parsedAnnotationObject.value = {
336
619
  type: "Apply",
337
620
  Apply: annotationObject.$Apply,
338
621
  Function: annotationObject.$Function
339
622
  };
340
- } else if (annotationObject.$NavigationPropertyPath !== undefined) {
341
- parsedAnnotationObject = {
342
- type: "NavigationPropertyPath",
343
- NavigationPropertyPath: annotationObject.$NavigationPropertyPath
623
+ } else if (annotationObject.$Path !== undefined) {
624
+ parsedAnnotationObject.value = {
625
+ type: "Path",
626
+ Path: annotationObject.$Path
627
+ };
628
+ } else if (annotationObject.$AnnotationPath !== undefined) {
629
+ parsedAnnotationObject.value = {
630
+ type: "AnnotationPath",
631
+ AnnotationPath: annotationObject.$AnnotationPath
632
+ };
633
+ } else if (annotationObject.$Decimal !== undefined) {
634
+ parsedAnnotationObject.value = {
635
+ type: "Decimal",
636
+ Decimal: parseFloat(annotationObject.$Decimal)
344
637
  };
345
638
  } else if (annotationObject.$EnumMember !== undefined) {
346
- parsedAnnotationObject = {
639
+ parsedAnnotationObject.value = {
347
640
  type: "EnumMember",
348
- EnumMember: this.mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
641
+ EnumMember: mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
349
642
  };
350
643
  } else if (Array.isArray(annotationObject)) {
351
- var parsedAnnotationCollection = parsedAnnotationObject;
352
- parsedAnnotationCollection.collection = annotationObject.map(function (subAnnotationObject, subAnnotationIndex) {
353
- return _this2.parseAnnotationObject(subAnnotationObject, currentObjectTarget + "/" + subAnnotationIndex, annotationsLists, oCapabilities);
644
+ isCollection = true;
645
+ parsedAnnotationObject.collection = annotationObject.map(function (subAnnotationObject, subAnnotationIndex) {
646
+ return parseAnnotationObject(subAnnotationObject, currentAnnotationTarget + "/" + subAnnotationIndex, annotationLists, oCapabilities);
354
647
  });
355
648
 
356
649
  if (annotationObject.length > 0) {
357
650
  if (annotationObject[0].hasOwnProperty("$PropertyPath")) {
358
- parsedAnnotationCollection.collection.type = "PropertyPath";
651
+ parsedAnnotationObject.collection.type = "PropertyPath";
359
652
  } else if (annotationObject[0].hasOwnProperty("$Path")) {
360
- parsedAnnotationCollection.collection.type = "Path";
653
+ parsedAnnotationObject.collection.type = "Path";
361
654
  } else if (annotationObject[0].hasOwnProperty("$NavigationPropertyPath")) {
362
- parsedAnnotationCollection.collection.type = "NavigationPropertyPath";
655
+ parsedAnnotationObject.collection.type = "NavigationPropertyPath";
363
656
  } else if (annotationObject[0].hasOwnProperty("$AnnotationPath")) {
364
- parsedAnnotationCollection.collection.type = "AnnotationPath";
657
+ parsedAnnotationObject.collection.type = "AnnotationPath";
365
658
  } else if (annotationObject[0].hasOwnProperty("$Type")) {
366
- parsedAnnotationCollection.collection.type = "Record";
659
+ parsedAnnotationObject.collection.type = "Record";
367
660
  } else if (annotationObject[0].hasOwnProperty("$If")) {
368
- parsedAnnotationCollection.collection.type = "If";
369
- } else if (annotationObject[0].hasOwnProperty("$And")) {
370
- parsedAnnotationCollection.collection.type = "And";
661
+ parsedAnnotationObject.collection.type = "If";
371
662
  } else if (annotationObject[0].hasOwnProperty("$Or")) {
372
- parsedAnnotationCollection.collection.type = "Or";
663
+ parsedAnnotationObject.collection.type = "Or";
373
664
  } else if (annotationObject[0].hasOwnProperty("$Eq")) {
374
- parsedAnnotationCollection.collection.type = "Eq";
665
+ parsedAnnotationObject.collection.type = "Eq";
375
666
  } else if (annotationObject[0].hasOwnProperty("$Ne")) {
376
- parsedAnnotationCollection.collection.type = "Ne";
667
+ parsedAnnotationObject.collection.type = "Ne";
377
668
  } else if (annotationObject[0].hasOwnProperty("$Not")) {
378
- parsedAnnotationCollection.collection.type = "Not";
669
+ parsedAnnotationObject.collection.type = "Not";
379
670
  } else if (annotationObject[0].hasOwnProperty("$Gt")) {
380
- parsedAnnotationCollection.collection.type = "Gt";
671
+ parsedAnnotationObject.collection.type = "Gt";
381
672
  } else if (annotationObject[0].hasOwnProperty("$Ge")) {
382
- parsedAnnotationCollection.collection.type = "Ge";
673
+ parsedAnnotationObject.collection.type = "Ge";
383
674
  } else if (annotationObject[0].hasOwnProperty("$Lt")) {
384
- parsedAnnotationCollection.collection.type = "Lt";
675
+ parsedAnnotationObject.collection.type = "Lt";
385
676
  } else if (annotationObject[0].hasOwnProperty("$Le")) {
386
- parsedAnnotationCollection.collection.type = "Le";
677
+ parsedAnnotationObject.collection.type = "Le";
678
+ } else if (annotationObject[0].hasOwnProperty("$And")) {
679
+ parsedAnnotationObject.collection.type = "And";
387
680
  } else if (annotationObject[0].hasOwnProperty("$Apply")) {
388
- parsedAnnotationCollection.collection.type = "Apply";
681
+ parsedAnnotationObject.collection.type = "Apply";
389
682
  } else if (typeof annotationObject[0] === "object") {
390
- parsedAnnotationCollection.collection.type = "Record";
683
+ parsedAnnotationObject.collection.type = "Record";
391
684
  } else {
392
- parsedAnnotationCollection.collection.type = "String";
685
+ parsedAnnotationObject.collection.type = "String";
393
686
  }
394
687
  }
395
688
  } else {
689
+ var record = {
690
+ propertyValues: []
691
+ };
692
+
396
693
  if (annotationObject.$Type) {
397
694
  var typeValue = annotationObject.$Type;
398
- parsedAnnotationObject.type = typeValue; //`${typeAlias}.${typeTerm}`;
695
+ record.type = "".concat(typeValue);
399
696
  }
400
697
 
401
698
  var propertyValues = [];
402
- Object.keys(annotationObject).forEach(function (propertyKey) {
403
- if (propertyKey !== "$Type" && propertyKey !== "$If" && propertyKey !== "$Apply" && propertyKey !== "$And" && propertyKey !== "$Or" && propertyKey !== "$Ne" && propertyKey !== "$Gt" && propertyKey !== "$Ge" && propertyKey !== "$Lt" && propertyKey !== "$Le" && propertyKey !== "$Not" && propertyKey !== "$Eq" && !propertyKey.startsWith("@")) {
404
- propertyValues.push(_this2.parsePropertyValue(annotationObject[propertyKey], propertyKey, currentObjectTarget, annotationsLists, oCapabilities));
405
- } else if (propertyKey.startsWith("@")) {
406
- // Annotation of annotation
407
- _this2.createAnnotationLists(_defineProperty({}, propertyKey, annotationObject[propertyKey]), currentObjectTarget, annotationsLists, oCapabilities);
408
- }
409
- });
410
- parsedAnnotationObject.propertyValues = propertyValues;
411
- }
412
-
413
- return parsedAnnotationObject;
414
- },
415
- getOrCreateAnnotationList: function (target, annotationsLists) {
416
- var potentialTarget = annotationsLists.find(function (annotationList) {
417
- return annotationList.target === target;
418
- });
419
-
420
- if (!potentialTarget) {
421
- potentialTarget = {
422
- target: target,
423
- annotations: []
424
- };
425
- annotationsLists.push(potentialTarget);
426
- }
427
-
428
- return potentialTarget;
429
- },
430
- createAnnotationLists: function (annotationObjects, annotationTarget, annotationLists, oCapabilities) {
431
- var _this3 = this;
432
-
433
- var outAnnotationObject = this.getOrCreateAnnotationList(annotationTarget, annotationLists);
434
-
435
- if (!oCapabilities.MicroChart) {
436
- delete annotationObjects["@com.sap.vocabularies.UI.v1.Chart"];
437
- }
438
699
 
439
- function removeChartAnnotations(annotationObject) {
440
- return annotationObject.filter(function (oRecord) {
441
- if (oRecord.Target && oRecord.Target.$AnnotationPath) {
442
- return oRecord.Target.$AnnotationPath.indexOf("@com.sap.vocabularies.UI.v1.Chart") === -1;
443
- } else {
444
- return true;
700
+ for (var propertyKey in annotationObject) {
701
+ if (propertyKey !== "$Type" && !propertyKey.startsWith("@")) {
702
+ propertyValues.push(parsePropertyValue(annotationObject[propertyKey], propertyKey, currentAnnotationTarget, annotationLists, oCapabilities));
703
+ } else if (propertyKey.startsWith("@")) {
704
+ // Annotation of record
705
+ createAnnotationLists(_defineProperty({}, propertyKey, annotationObject[propertyKey]), currentAnnotationTarget, annotationLists, oCapabilities);
445
706
  }
446
- });
447
- }
448
-
449
- function removeIBNAnnotations(annotationObject) {
450
- return annotationObject.filter(function (oRecord) {
451
- return oRecord.$Type !== "com.sap.vocabularies.UI.v1.DataFieldForIntentBasedNavigation";
452
- });
453
- }
707
+ }
454
708
 
455
- function handlePresentationVariant(annotationObject) {
456
- return annotationObject.filter(function (oRecord) {
457
- return oRecord.$AnnotationPath !== "@com.sap.vocabularies.UI.v1.Chart";
458
- });
709
+ record.propertyValues = propertyValues;
710
+ parsedAnnotationObject.record = record;
459
711
  }
460
712
 
461
- Object.keys(annotationObjects).forEach(function (annotationKey) {
462
- var annotationObject = annotationObjects[annotationKey];
713
+ parsedAnnotationObject.isCollection = isCollection;
714
+ currentOutAnnotationObject.annotations.push(parsedAnnotationObject);
715
+ annotationKey = _annotationKey;
716
+ };
463
717
 
464
- switch (annotationKey) {
465
- case "@com.sap.vocabularies.UI.v1.HeaderFacets":
466
- if (!oCapabilities.MicroChart) {
467
- annotationObject = removeChartAnnotations(annotationObject);
468
- }
718
+ for (var annotationKey in annotationObjects) {
719
+ _loop(annotationKey);
720
+ }
721
+ }
469
722
 
470
- break;
723
+ function prepareProperty(propertyDefinition, entityTypeObject, propertyName) {
724
+ var propertyObject = {
725
+ _type: "Property",
726
+ name: propertyName,
727
+ fullyQualifiedName: "".concat(entityTypeObject.fullyQualifiedName, "/").concat(propertyName),
728
+ type: propertyDefinition.$Type,
729
+ maxLength: propertyDefinition.$MaxLength,
730
+ precision: propertyDefinition.$Precision,
731
+ scale: propertyDefinition.$Scale,
732
+ nullable: propertyDefinition.$Nullable
733
+ };
734
+ return propertyObject;
735
+ }
471
736
 
472
- case "@com.sap.vocabularies.UI.v1.Identification":
473
- if (!oCapabilities.IntentBasedNavigation) {
474
- annotationObject = removeIBNAnnotations(annotationObject);
475
- }
737
+ function prepareNavigationProperty(navPropertyDefinition, entityTypeObject, navPropertyName) {
738
+ var referentialConstraint = [];
476
739
 
477
- break;
740
+ if (navPropertyDefinition.$ReferentialConstraint) {
741
+ referentialConstraint = Object.keys(navPropertyDefinition.$ReferentialConstraint).map(function (sourcePropertyName) {
742
+ return {
743
+ sourceTypeName: entityTypeObject.name,
744
+ sourceProperty: sourcePropertyName,
745
+ targetTypeName: navPropertyDefinition.$Type,
746
+ targetProperty: navPropertyDefinition.$ReferentialConstraint[sourcePropertyName]
747
+ };
748
+ });
749
+ }
478
750
 
479
- case "@com.sap.vocabularies.UI.v1.LineItem":
480
- if (!oCapabilities.IntentBasedNavigation) {
481
- annotationObject = removeIBNAnnotations(annotationObject);
482
- }
751
+ var navigationProperty = {
752
+ _type: "NavigationProperty",
753
+ name: navPropertyName,
754
+ fullyQualifiedName: "".concat(entityTypeObject.fullyQualifiedName, "/").concat(navPropertyName),
755
+ partner: navPropertyDefinition.$Partner,
756
+ isCollection: navPropertyDefinition.$isCollection ? navPropertyDefinition.$isCollection : false,
757
+ containsTarget: navPropertyDefinition.$ContainsTarget,
758
+ targetTypeName: navPropertyDefinition.$Type,
759
+ referentialConstraint: referentialConstraint
760
+ };
761
+ return navigationProperty;
762
+ }
483
763
 
484
- if (!oCapabilities.MicroChart) {
485
- annotationObject = removeChartAnnotations(annotationObject);
486
- }
764
+ function prepareEntitySet(entitySetDefinition, entitySetName, entityContainerName) {
765
+ var entitySetObject = {
766
+ _type: "EntitySet",
767
+ name: entitySetName,
768
+ navigationPropertyBinding: {},
769
+ entityTypeName: entitySetDefinition.$Type,
770
+ fullyQualifiedName: "".concat(entityContainerName, "/").concat(entitySetName)
771
+ };
772
+ return entitySetObject;
773
+ }
487
774
 
488
- break;
775
+ function prepareSingleton(singletonDefinition, singletonName, entityContainerName) {
776
+ var singletonObject = {
777
+ _type: "Singleton",
778
+ name: singletonName,
779
+ navigationPropertyBinding: {},
780
+ typeName: singletonDefinition.$Type,
781
+ fullyQualifiedName: "".concat(entityContainerName, "/").concat(singletonName),
782
+ nullable: true
783
+ };
784
+ return singletonObject;
785
+ }
489
786
 
490
- case "@com.sap.vocabularies.UI.v1.FieldGroup":
491
- if (!oCapabilities.IntentBasedNavigation) {
492
- annotationObject.Data = removeIBNAnnotations(annotationObject.Data);
493
- }
787
+ function prepareTypeDefinition(typeDefinition, typeName, namespace) {
788
+ var typeObject = {
789
+ _type: "TypeDefinition",
790
+ name: typeName.replace(namespace + ".", ""),
791
+ fullyQualifiedName: typeName,
792
+ underlyingType: typeDefinition.$UnderlyingType
793
+ };
794
+ return typeObject;
795
+ }
494
796
 
495
- if (!oCapabilities.MicroChart) {
496
- annotationObject.Data = removeChartAnnotations(annotationObject.Data);
497
- }
797
+ function prepareComplexType(complexTypeDefinition, complexTypeName, namespace) {
798
+ var complexTypeObject = {
799
+ _type: "ComplexType",
800
+ name: complexTypeName.replace(namespace + ".", ""),
801
+ fullyQualifiedName: complexTypeName,
802
+ properties: [],
803
+ navigationProperties: []
804
+ };
805
+ var complexTypeProperties = Object.keys(complexTypeDefinition).filter(function (propertyNameOrNot) {
806
+ if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
807
+ return complexTypeDefinition[propertyNameOrNot].$kind === "Property";
808
+ }
809
+ }).sort(function (a, b) {
810
+ return a > b ? 1 : -1;
811
+ }).map(function (propertyName) {
812
+ return prepareProperty(complexTypeDefinition[propertyName], complexTypeObject, propertyName);
813
+ });
814
+ complexTypeObject.properties = complexTypeProperties;
815
+ var complexTypeNavigationProperties = Object.keys(complexTypeDefinition).filter(function (propertyNameOrNot) {
816
+ if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
817
+ return complexTypeDefinition[propertyNameOrNot].$kind === "NavigationProperty";
818
+ }
819
+ }).sort(function (a, b) {
820
+ return a > b ? 1 : -1;
821
+ }).map(function (navPropertyName) {
822
+ return prepareNavigationProperty(complexTypeDefinition[navPropertyName], complexTypeObject, navPropertyName);
823
+ });
824
+ complexTypeObject.navigationProperties = complexTypeNavigationProperties;
825
+ return complexTypeObject;
826
+ }
498
827
 
499
- break;
828
+ function prepareEntityKeys(entityTypeDefinition, oMetaModelData) {
829
+ if (!entityTypeDefinition.$Key && entityTypeDefinition.$BaseType) {
830
+ return prepareEntityKeys(oMetaModelData["".concat(entityTypeDefinition.$BaseType)], oMetaModelData);
831
+ }
500
832
 
501
- case "@com.sap.vocabularies.UI.v1.PresentationVariant":
502
- if (!oCapabilities.Chart && annotationObject.Visualizations) {
503
- annotationObject.Visualizations = handlePresentationVariant(annotationObject.Visualizations);
504
- }
833
+ return entityTypeDefinition.$Key || []; //handling of entity types without key as well as basetype
834
+ }
505
835
 
506
- break;
836
+ function prepareEntityType(entityTypeDefinition, entityTypeName, namespace, metaModelData) {
837
+ var entityKeys = prepareEntityKeys(entityTypeDefinition, metaModelData);
838
+ var entityTypeObject = {
839
+ _type: "EntityType",
840
+ name: entityTypeName.replace(namespace + ".", ""),
841
+ fullyQualifiedName: entityTypeName,
842
+ keys: [],
843
+ entityProperties: [],
844
+ navigationProperties: []
845
+ };
846
+ var entityProperties = Object.keys(entityTypeDefinition).filter(function (propertyNameOrNot) {
847
+ if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
848
+ return entityTypeDefinition[propertyNameOrNot].$kind === "Property";
849
+ }
850
+ }).map(function (propertyName) {
851
+ return prepareProperty(entityTypeDefinition[propertyName], entityTypeObject, propertyName);
852
+ });
853
+ var navigationProperties = Object.keys(entityTypeDefinition).filter(function (propertyNameOrNot) {
854
+ if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
855
+ return entityTypeDefinition[propertyNameOrNot].$kind === "NavigationProperty";
856
+ }
857
+ }).map(function (navPropertyName) {
858
+ return prepareNavigationProperty(entityTypeDefinition[navPropertyName], entityTypeObject, navPropertyName);
859
+ });
860
+ entityTypeObject.keys = entityKeys.map(function (entityKey) {
861
+ return entityProperties.find(function (property) {
862
+ return property.name === entityKey;
863
+ });
864
+ }).filter(function (property) {
865
+ return property !== undefined;
866
+ });
867
+ entityTypeObject.entityProperties = entityProperties;
868
+ entityTypeObject.navigationProperties = navigationProperties;
869
+ return entityTypeObject;
870
+ }
507
871
 
508
- default:
509
- break;
510
- }
872
+ function prepareAction(actionName, actionRawData, namespace, entityContainerName) {
873
+ var actionEntityType = "";
874
+ var actionFQN = "".concat(actionName);
875
+ var actionShortName = actionName.substr(namespace.length + 1);
511
876
 
512
- annotationObjects[annotationKey] = annotationObject;
513
- var currentOutAnnotationObject = outAnnotationObject; // Check for annotation of annotation
877
+ if (actionRawData.$IsBound) {
878
+ var bindingParameter = actionRawData.$Parameter[0];
879
+ actionEntityType = bindingParameter.$Type;
514
880
 
515
- var annotationOfAnnotationSplit = annotationKey.split("@");
881
+ if (bindingParameter.$isCollection === true) {
882
+ actionFQN = "".concat(actionName, "(Collection(").concat(actionEntityType, "))");
883
+ } else {
884
+ actionFQN = "".concat(actionName, "(").concat(actionEntityType, ")");
885
+ }
886
+ } else {
887
+ actionFQN = "".concat(entityContainerName, "/").concat(actionShortName);
888
+ }
516
889
 
517
- if (annotationOfAnnotationSplit.length > 2) {
518
- currentOutAnnotationObject = _this3.getOrCreateAnnotationList(annotationTarget + "@" + annotationOfAnnotationSplit[1], annotationLists);
519
- annotationKey = annotationOfAnnotationSplit[2];
520
- } else {
521
- annotationKey = annotationOfAnnotationSplit[1];
522
- }
890
+ var parameters = actionRawData.$Parameter || [];
891
+ return {
892
+ _type: "Action",
893
+ name: actionShortName,
894
+ fullyQualifiedName: actionFQN,
895
+ isBound: actionRawData.$IsBound,
896
+ isFunction: false,
897
+ sourceType: actionEntityType,
898
+ returnType: actionRawData.$ReturnType ? actionRawData.$ReturnType.$Type : "",
899
+ parameters: parameters.map(function (param) {
900
+ return {
901
+ _type: "ActionParameter",
902
+ isEntitySet: param.$Type === actionRawData.$EntitySetPath,
903
+ fullyQualifiedName: "".concat(actionFQN, "/").concat(param.$Name),
904
+ type: param.$Type // TODO missing properties ?
523
905
 
524
- var annotationQualifierSplit = annotationKey.split("#");
525
- var qualifier = annotationQualifierSplit[1];
526
- annotationKey = annotationQualifierSplit[0];
527
- var parsedAnnotationObject = {
528
- term: "".concat(annotationKey),
529
- qualifier: qualifier
530
906
  };
531
- var currentAnnotationTarget = annotationTarget + "@" + parsedAnnotationObject.term;
907
+ })
908
+ };
909
+ }
532
910
 
533
- if (qualifier) {
534
- currentAnnotationTarget += "#" + qualifier;
535
- }
911
+ function prepareEntityTypes(oMetaModel) {
912
+ var oCapabilities = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DefaultEnvironmentCapabilities;
913
+ var oMetaModelData = oMetaModel.getObject("/$");
914
+ var annotationLists = {};
915
+ var entityTypes = [];
916
+ var entitySets = [];
917
+ var singletons = [];
918
+ var complexTypes = [];
919
+ var typeDefinitions = [];
920
+ var entityContainerName = oMetaModelData.$EntityContainer;
921
+ var namespace = "";
922
+ var schemaKeys = Object.keys(oMetaModelData).filter(function (metamodelKey) {
923
+ return oMetaModelData[metamodelKey].$kind === "Schema";
924
+ });
536
925
 
537
- var isCollection = false;
538
-
539
- if (annotationObject === null) {
540
- parsedAnnotationObject.value = {
541
- type: "Bool",
542
- Bool: annotationObject
543
- };
544
- } else if (typeof annotationObject === "string") {
545
- parsedAnnotationObject.value = {
546
- type: "String",
547
- String: annotationObject
548
- };
549
- } else if (typeof annotationObject === "boolean") {
550
- parsedAnnotationObject.value = {
551
- type: "Bool",
552
- Bool: annotationObject
553
- };
554
- } else if (typeof annotationObject === "number") {
555
- parsedAnnotationObject.value = {
556
- type: "Int",
557
- Int: annotationObject
558
- };
559
- } else if (annotationObject.$If !== undefined) {
560
- parsedAnnotationObject.value = {
561
- type: "If",
562
- If: annotationObject.$If
563
- };
564
- } else if (annotationObject.$And !== undefined) {
565
- parsedAnnotationObject.value = {
566
- type: "And",
567
- And: annotationObject.$And
568
- };
569
- } else if (annotationObject.$Or !== undefined) {
570
- parsedAnnotationObject.value = {
571
- type: "Or",
572
- Or: annotationObject.$Or
573
- };
574
- } else if (annotationObject.$Not !== undefined) {
575
- parsedAnnotationObject.value = {
576
- type: "Not",
577
- Not: annotationObject.$Not
578
- };
579
- } else if (annotationObject.$Eq !== undefined) {
580
- parsedAnnotationObject.value = {
581
- type: "Eq",
582
- Eq: annotationObject.$Eq
583
- };
584
- } else if (annotationObject.$Ne !== undefined) {
585
- parsedAnnotationObject.value = {
586
- type: "Ne",
587
- Ne: annotationObject.$Ne
588
- };
589
- } else if (annotationObject.$Gt !== undefined) {
590
- parsedAnnotationObject.value = {
591
- type: "Gt",
592
- Gt: annotationObject.$Gt
593
- };
594
- } else if (annotationObject.$Ge !== undefined) {
595
- parsedAnnotationObject.value = {
596
- type: "Ge",
597
- Ge: annotationObject.$Ge
598
- };
599
- } else if (annotationObject.$Lt !== undefined) {
600
- parsedAnnotationObject.value = {
601
- type: "Lt",
602
- Lt: annotationObject.$Lt
603
- };
604
- } else if (annotationObject.$Le !== undefined) {
605
- parsedAnnotationObject.value = {
606
- type: "Le",
607
- Le: annotationObject.$Le
608
- };
609
- } else if (annotationObject.$Apply !== undefined) {
610
- parsedAnnotationObject.value = {
611
- type: "Apply",
612
- Apply: annotationObject.$Apply,
613
- Function: annotationObject.$Function
614
- };
615
- } else if (annotationObject.$Path !== undefined) {
616
- parsedAnnotationObject.value = {
617
- type: "Path",
618
- Path: annotationObject.$Path
619
- };
620
- } else if (annotationObject.$AnnotationPath !== undefined) {
621
- parsedAnnotationObject.value = {
622
- type: "AnnotationPath",
623
- AnnotationPath: annotationObject.$AnnotationPath
624
- };
625
- } else if (annotationObject.$Decimal !== undefined) {
626
- parsedAnnotationObject.value = {
627
- type: "Decimal",
628
- Decimal: parseFloat(annotationObject.$Decimal)
629
- };
630
- } else if (annotationObject.$EnumMember !== undefined) {
631
- parsedAnnotationObject.value = {
632
- type: "EnumMember",
633
- EnumMember: _this3.mapNameToAlias(annotationObject.$EnumMember.split("/")[0]) + "/" + annotationObject.$EnumMember.split("/")[1]
634
- };
635
- } else if (Array.isArray(annotationObject)) {
636
- isCollection = true;
637
- parsedAnnotationObject.collection = annotationObject.map(function (subAnnotationObject, subAnnotationIndex) {
638
- return _this3.parseAnnotationObject(subAnnotationObject, currentAnnotationTarget + "/" + subAnnotationIndex, annotationLists, oCapabilities);
639
- });
926
+ if (schemaKeys && schemaKeys.length > 0) {
927
+ namespace = schemaKeys[0].substr(0, schemaKeys[0].length - 1);
928
+ } else if (entityTypes && entityTypes.length) {
929
+ namespace = entityTypes[0].fullyQualifiedName.replace(entityTypes[0].name, "");
930
+ namespace = namespace.substr(0, namespace.length - 1);
931
+ }
640
932
 
641
- if (annotationObject.length > 0) {
642
- if (annotationObject[0].hasOwnProperty("$PropertyPath")) {
643
- parsedAnnotationObject.collection.type = "PropertyPath";
644
- } else if (annotationObject[0].hasOwnProperty("$Path")) {
645
- parsedAnnotationObject.collection.type = "Path";
646
- } else if (annotationObject[0].hasOwnProperty("$NavigationPropertyPath")) {
647
- parsedAnnotationObject.collection.type = "NavigationPropertyPath";
648
- } else if (annotationObject[0].hasOwnProperty("$AnnotationPath")) {
649
- parsedAnnotationObject.collection.type = "AnnotationPath";
650
- } else if (annotationObject[0].hasOwnProperty("$Type")) {
651
- parsedAnnotationObject.collection.type = "Record";
652
- } else if (annotationObject[0].hasOwnProperty("$If")) {
653
- parsedAnnotationObject.collection.type = "If";
654
- } else if (annotationObject[0].hasOwnProperty("$Or")) {
655
- parsedAnnotationObject.collection.type = "Or";
656
- } else if (annotationObject[0].hasOwnProperty("$Eq")) {
657
- parsedAnnotationObject.collection.type = "Eq";
658
- } else if (annotationObject[0].hasOwnProperty("$Ne")) {
659
- parsedAnnotationObject.collection.type = "Ne";
660
- } else if (annotationObject[0].hasOwnProperty("$Not")) {
661
- parsedAnnotationObject.collection.type = "Not";
662
- } else if (annotationObject[0].hasOwnProperty("$Gt")) {
663
- parsedAnnotationObject.collection.type = "Gt";
664
- } else if (annotationObject[0].hasOwnProperty("$Ge")) {
665
- parsedAnnotationObject.collection.type = "Ge";
666
- } else if (annotationObject[0].hasOwnProperty("$Lt")) {
667
- parsedAnnotationObject.collection.type = "Lt";
668
- } else if (annotationObject[0].hasOwnProperty("$Le")) {
669
- parsedAnnotationObject.collection.type = "Le";
670
- } else if (annotationObject[0].hasOwnProperty("$And")) {
671
- parsedAnnotationObject.collection.type = "And";
672
- } else if (annotationObject[0].hasOwnProperty("$Apply")) {
673
- parsedAnnotationObject.collection.type = "Apply";
674
- } else if (typeof annotationObject[0] === "object") {
675
- parsedAnnotationObject.collection.type = "Record";
676
- } else {
677
- parsedAnnotationObject.collection.type = "String";
933
+ Object.keys(oMetaModelData).forEach(function (sObjectName) {
934
+ if (sObjectName !== "$kind") {
935
+ switch (oMetaModelData[sObjectName].$kind) {
936
+ case "EntityType":
937
+ var entityType = prepareEntityType(oMetaModelData[sObjectName], sObjectName, namespace, oMetaModelData); // Check if there are filter facets defined for the entityType and if yes, check if all of them have an ID
938
+ // The ID is optional, but it is internally taken for grouping filter fields and if it's not present
939
+ // a fallback ID needs to be generated here.
940
+
941
+ if (oMetaModelData.$Annotations[entityType.fullyQualifiedName] && oMetaModelData.$Annotations[entityType.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.FilterFacets"]) {
942
+ oMetaModelData.$Annotations[entityType.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.FilterFacets"].forEach(function (filterFacetAnnotation) {
943
+ filterFacetAnnotation.ID = filterFacetAnnotation.ID || generate([{
944
+ Facet: filterFacetAnnotation
945
+ }]);
946
+ });
678
947
  }
679
- }
680
- } else {
681
- var record = {
682
- propertyValues: []
683
- };
684
948
 
685
- if (annotationObject.$Type) {
686
- var typeValue = annotationObject.$Type;
687
- record.type = "".concat(typeValue);
688
- }
949
+ entityType.entityProperties.forEach(function (entityProperty) {
950
+ if (!oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]) {
951
+ oMetaModelData.$Annotations[entityProperty.fullyQualifiedName] = {};
952
+ }
689
953
 
690
- var propertyValues = [];
691
- Object.keys(annotationObject).forEach(function (propertyKey) {
692
- if (propertyKey !== "$Type" && !propertyKey.startsWith("@")) {
693
- propertyValues.push(_this3.parsePropertyValue(annotationObject[propertyKey], propertyKey, currentAnnotationTarget, annotationLists, oCapabilities));
694
- } else if (propertyKey.startsWith("@")) {
695
- // Annotation of record
696
- _this3.createAnnotationLists(_defineProperty({}, propertyKey, annotationObject[propertyKey]), currentAnnotationTarget, annotationLists, oCapabilities);
697
- }
698
- });
699
- record.propertyValues = propertyValues;
700
- parsedAnnotationObject.record = record;
701
- }
954
+ if (!oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"]) {
955
+ oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"] = {
956
+ $Type: "com.sap.vocabularies.UI.v1.DataField",
957
+ Value: {
958
+ $Path: entityProperty.name
959
+ }
960
+ };
961
+ }
962
+ });
963
+ entityTypes.push(entityType);
964
+ break;
702
965
 
703
- parsedAnnotationObject.isCollection = isCollection;
704
- currentOutAnnotationObject.annotations.push(parsedAnnotationObject);
705
- });
706
- },
707
- parseProperty: function (oMetaModel, entityTypeObject, propertyName, annotationLists, oCapabilities) {
708
- var propertyAnnotation = oMetaModel.getObject("/".concat(entityTypeObject.fullyQualifiedName, "/").concat(propertyName, "@"));
709
- var propertyDefinition = oMetaModel.getObject("/".concat(entityTypeObject.fullyQualifiedName, "/").concat(propertyName));
710
- var propertyObject = {
711
- _type: "Property",
712
- name: propertyName,
713
- fullyQualifiedName: "".concat(entityTypeObject.fullyQualifiedName, "/").concat(propertyName),
714
- type: propertyDefinition.$Type,
715
- maxLength: propertyDefinition.$MaxLength,
716
- precision: propertyDefinition.$Precision,
717
- scale: propertyDefinition.$Scale,
718
- nullable: propertyDefinition.$Nullable
719
- };
720
- this.createAnnotationLists(propertyAnnotation, propertyObject.fullyQualifiedName, annotationLists, oCapabilities);
721
- return propertyObject;
722
- },
723
- parseNavigationProperty: function (oMetaModel, entityTypeObject, navPropertyName, annotationLists, oCapabilities) {
724
- var navPropertyAnnotation = oMetaModel.getObject("/".concat(entityTypeObject.fullyQualifiedName, "/").concat(navPropertyName, "@"));
725
- var navPropertyDefinition = oMetaModel.getObject("/".concat(entityTypeObject.fullyQualifiedName, "/").concat(navPropertyName));
726
- var referentialConstraint = [];
727
-
728
- if (navPropertyDefinition.$ReferentialConstraint) {
729
- referentialConstraint = Object.keys(navPropertyDefinition.$ReferentialConstraint).map(function (sourcePropertyName) {
730
- return {
731
- sourceTypeName: entityTypeObject.name,
732
- sourceProperty: sourcePropertyName,
733
- targetTypeName: navPropertyDefinition.$Type,
734
- targetProperty: navPropertyDefinition.$ReferentialConstraint[sourcePropertyName]
735
- };
736
- });
737
- }
966
+ case "ComplexType":
967
+ var complexType = prepareComplexType(oMetaModelData[sObjectName], sObjectName, namespace);
968
+ complexTypes.push(complexType);
969
+ break;
738
970
 
739
- var navigationProperty = {
740
- _type: "NavigationProperty",
741
- name: navPropertyName,
742
- fullyQualifiedName: "".concat(entityTypeObject.fullyQualifiedName, "/").concat(navPropertyName),
743
- partner: navPropertyDefinition.$Partner,
744
- isCollection: navPropertyDefinition.$isCollection ? navPropertyDefinition.$isCollection : false,
745
- containsTarget: navPropertyDefinition.$ContainsTarget,
746
- targetTypeName: navPropertyDefinition.$Type,
747
- referentialConstraint: referentialConstraint
748
- };
749
- this.createAnnotationLists(navPropertyAnnotation, navigationProperty.fullyQualifiedName, annotationLists, oCapabilities);
750
- return navigationProperty;
751
- },
752
- parseEntitySet: function (oMetaModel, entitySetName, annotationLists, entityContainerName, oCapabilities) {
753
- var entitySetDefinition = oMetaModel.getObject("/".concat(entitySetName));
754
- var entitySetAnnotation = oMetaModel.getObject("/".concat(entitySetName, "@"));
755
- var entitySetObject = {
756
- _type: "EntitySet",
757
- name: entitySetName,
758
- navigationPropertyBinding: {},
759
- entityTypeName: entitySetDefinition.$Type,
760
- fullyQualifiedName: "".concat(entityContainerName, "/").concat(entitySetName)
761
- };
762
- this.createAnnotationLists(entitySetAnnotation, entitySetObject.fullyQualifiedName, annotationLists, oCapabilities);
763
- return entitySetObject;
764
- },
765
- parseSingleton: function (oMetaModel, singletonName, annotationLists, entityContainerName, oCapabilities) {
766
- var singletonDefinition = oMetaModel.getObject("/".concat(singletonName));
767
- var singletonAnnotation = oMetaModel.getObject("/".concat(singletonName, "@"));
768
- var singletonObject = {
769
- _type: "Singleton",
770
- name: singletonName,
771
- navigationPropertyBinding: {},
772
- typeName: singletonDefinition.$Type,
773
- fullyQualifiedName: "".concat(entityContainerName, "/").concat(singletonName),
774
- nullable: true
775
- };
776
- this.createAnnotationLists(singletonAnnotation, singletonObject.fullyQualifiedName, annotationLists, oCapabilities);
777
- return singletonObject;
778
- },
779
- parseEntityType: function (oMetaModel, entityTypeName, annotationLists, namespace, oCapabilities) {
780
- var _this4 = this;
781
-
782
- var entityTypeAnnotation = oMetaModel.getObject("/".concat(entityTypeName, "@"));
783
- var entityTypeDefinition = oMetaModel.getObject("/".concat(entityTypeName));
784
- var entityKeys = getEntityKeys(entityTypeDefinition);
785
-
786
- function getEntityKeys(entityTypeDefinition) {
787
- if (!entityTypeDefinition.$Key && entityTypeDefinition.$BaseType) {
788
- return getEntityKeys(oMetaModel.getObject("/".concat(entityTypeDefinition.$BaseType)));
971
+ case "TypeDefinition":
972
+ var typeDefinition = prepareTypeDefinition(oMetaModelData[sObjectName], sObjectName, namespace);
973
+ typeDefinitions.push(typeDefinition);
974
+ break;
789
975
  }
790
-
791
- return entityTypeDefinition.$Key || []; //handling of entity types without key as well as basetype
792
976
  }
977
+ });
978
+ var oEntityContainer = oMetaModelData[entityContainerName];
979
+ Object.keys(oEntityContainer).forEach(function (sObjectName) {
980
+ if (sObjectName !== "$kind") {
981
+ switch (oEntityContainer[sObjectName].$kind) {
982
+ case "EntitySet":
983
+ var entitySet = prepareEntitySet(oEntityContainer[sObjectName], sObjectName, entityContainerName);
984
+ entitySets.push(entitySet);
985
+ break;
793
986
 
794
- var entityTypeObject = {
795
- _type: "EntityType",
796
- name: entityTypeName.replace(namespace + ".", ""),
797
- fullyQualifiedName: entityTypeName,
798
- keys: [],
799
- entityProperties: [],
800
- navigationProperties: []
801
- };
802
- this.createAnnotationLists(entityTypeAnnotation, entityTypeObject.fullyQualifiedName, annotationLists, oCapabilities);
803
- var entityProperties = Object.keys(entityTypeDefinition).filter(function (propertyNameOrNot) {
804
- if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
805
- return entityTypeDefinition[propertyNameOrNot].$kind === "Property";
806
- }
807
- }).map(function (propertyName) {
808
- return _this4.parseProperty(oMetaModel, entityTypeObject, propertyName, annotationLists, oCapabilities);
809
- });
810
- var navigationProperties = Object.keys(entityTypeDefinition).filter(function (propertyNameOrNot) {
811
- if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
812
- return entityTypeDefinition[propertyNameOrNot].$kind === "NavigationProperty";
813
- }
814
- }).map(function (navPropertyName) {
815
- return _this4.parseNavigationProperty(oMetaModel, entityTypeObject, navPropertyName, annotationLists, oCapabilities);
816
- });
817
- entityTypeObject.keys = entityKeys.map(function (entityKey) {
818
- return entityProperties.find(function (property) {
819
- return property.name === entityKey;
820
- });
821
- }).filter(function (property) {
822
- return property !== undefined;
823
- });
824
- entityTypeObject.entityProperties = entityProperties;
825
- entityTypeObject.navigationProperties = navigationProperties;
826
- return entityTypeObject;
827
- },
828
- parseComplexType: function (oMetaModel, complexTypeName, annotationLists, namespace, oCapabilities) {
829
- var _this5 = this;
830
-
831
- var complexTypeAnnotation = oMetaModel.getObject("/".concat(complexTypeName, "@"));
832
- var complexTypeDefinition = oMetaModel.getObject("/".concat(complexTypeName));
833
- var complexTypeObject = {
834
- _type: "ComplexType",
835
- name: complexTypeName.replace(namespace + ".", ""),
836
- fullyQualifiedName: complexTypeName,
837
- properties: [],
838
- navigationProperties: []
839
- };
840
- this.createAnnotationLists(complexTypeAnnotation, complexTypeObject.fullyQualifiedName, annotationLists, oCapabilities);
841
- var complexTypeProperties = Object.keys(complexTypeDefinition).filter(function (propertyNameOrNot) {
842
- if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
843
- return complexTypeDefinition[propertyNameOrNot].$kind === "Property";
844
- }
845
- }).map(function (propertyName) {
846
- return _this5.parseProperty(oMetaModel, complexTypeObject, propertyName, annotationLists, oCapabilities);
847
- });
848
- complexTypeObject.properties = complexTypeProperties;
849
- var complexTypeNavigationProperties = Object.keys(complexTypeDefinition).filter(function (propertyNameOrNot) {
850
- if (propertyNameOrNot != "$Key" && propertyNameOrNot != "$kind") {
851
- return complexTypeDefinition[propertyNameOrNot].$kind === "NavigationProperty";
852
- }
853
- }).map(function (navPropertyName) {
854
- return _this5.parseNavigationProperty(oMetaModel, complexTypeObject, navPropertyName, annotationLists, oCapabilities);
855
- });
856
- complexTypeObject.navigationProperties = complexTypeNavigationProperties;
857
- return complexTypeObject;
858
- },
859
- parseAction: function (actionName, actionRawData, namespace, entityContainerName) {
860
- var actionEntityType = "";
861
- var actionFQN = "".concat(actionName);
862
- var actionShortName = actionName.substr(namespace.length + 1);
863
-
864
- if (actionRawData.$IsBound) {
865
- var bindingParameter = actionRawData.$Parameter[0];
866
- actionEntityType = bindingParameter.$Type;
867
-
868
- if (bindingParameter.$isCollection === true) {
869
- actionFQN = "".concat(actionName, "(Collection(").concat(actionEntityType, "))");
870
- } else {
871
- actionFQN = "".concat(actionName, "(").concat(actionEntityType, ")");
987
+ case "Singleton":
988
+ var singleton = prepareSingleton(oEntityContainer[sObjectName], sObjectName, entityContainerName);
989
+ singletons.push(singleton);
990
+ break;
872
991
  }
873
- } else {
874
- actionFQN = "".concat(entityContainerName, "/").concat(actionShortName);
875
992
  }
993
+ });
994
+ var entityContainer = {};
876
995
 
877
- var parameters = actionRawData.$Parameter || [];
878
- return {
879
- _type: "Action",
880
- name: actionShortName,
881
- fullyQualifiedName: actionFQN,
882
- isBound: actionRawData.$IsBound,
883
- sourceType: actionEntityType,
884
- returnType: actionRawData.$ReturnType ? actionRawData.$ReturnType.$Type : "",
885
- parameters: parameters.map(function (param) {
886
- return {
887
- _type: "ActionParameter",
888
- isEntitySet: param.$Type === actionRawData.$EntitySetPath,
889
- fullyQualifiedName: "".concat(actionFQN, "/").concat(param.$Name),
890
- type: param.$Type // TODO missing properties ?
891
-
892
- };
893
- })
996
+ if (entityContainerName) {
997
+ entityContainer = {
998
+ name: entityContainerName.replace(namespace + ".", ""),
999
+ fullyQualifiedName: entityContainerName
894
1000
  };
895
- },
896
- parseEntityTypes: function (oMetaModel, oInCapabilities) {
897
- var _this6 = this;
898
-
899
- var oCapabilities;
900
-
901
- if (!oInCapabilities) {
902
- oCapabilities = DefaultEnvironmentCapabilities;
903
- } else {
904
- oCapabilities = oInCapabilities;
905
- }
906
-
907
- var oMetaModelData = oMetaModel.getObject("/$");
908
- var oEntitySets = oMetaModel.getObject("/");
909
- var annotationLists = [];
910
- var entityTypes = [];
911
- var entitySets = [];
912
- var singletons = [];
913
- var complexTypes = [];
914
- var entityContainerName = oMetaModelData.$EntityContainer;
915
- var namespace = "";
916
- var schemaKeys = Object.keys(oMetaModelData).filter(function (metamodelKey) {
917
- return oMetaModelData[metamodelKey].$kind === "Schema";
918
- });
919
-
920
- if (schemaKeys && schemaKeys.length > 0) {
921
- namespace = schemaKeys[0].substr(0, schemaKeys[0].length - 1);
922
- } else if (entityTypes && entityTypes.length) {
923
- namespace = entityTypes[0].fullyQualifiedName.replace(entityTypes[0].name, "");
924
- namespace = namespace.substr(0, namespace.length - 1);
925
- }
926
-
927
- Object.keys(oMetaModelData).filter(function (entityTypeName) {
928
- return entityTypeName !== "$kind" && oMetaModelData[entityTypeName].$kind === "EntityType";
929
- }).forEach(function (entityTypeName) {
930
- var entityType = _this6.parseEntityType(oMetaModel, entityTypeName, annotationLists, namespace, oCapabilities); // Check if there are filter facets defined for the entityType and if yes, check if all of them have an ID
931
- // The ID is optional, but it is internally taken for grouping filter fields and if it's not present
932
- // a fallback ID needs to be generated here.
933
-
1001
+ }
934
1002
 
935
- if (oMetaModelData.$Annotations[entityType.fullyQualifiedName] && oMetaModelData.$Annotations[entityType.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.FilterFacets"]) {
936
- oMetaModelData.$Annotations[entityType.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.FilterFacets"].forEach(function (filterFacetAnnotation) {
937
- filterFacetAnnotation.ID = filterFacetAnnotation.ID || generate([{
938
- Facet: filterFacetAnnotation
939
- }]);
1003
+ entitySets.forEach(function (entitySet) {
1004
+ var navPropertyBindings = oEntityContainer[entitySet.name].$NavigationPropertyBinding;
940
1005
 
941
- _this6.createAnnotationLists({
942
- "@com.sap.vocabularies.UI.v1.FilterFacets": oMetaModelData.$Annotations[entityType.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.FilterFacets"]
943
- }, entityType.fullyQualifiedName, annotationLists, oCapabilities);
1006
+ if (navPropertyBindings) {
1007
+ Object.keys(navPropertyBindings).forEach(function (navPropName) {
1008
+ var targetEntitySet = entitySets.find(function (entitySetName) {
1009
+ return entitySetName.name === navPropertyBindings[navPropName];
944
1010
  });
945
- }
946
1011
 
947
- entityType.entityProperties.forEach(function (entityProperty) {
948
- if (!oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]) {
949
- oMetaModelData.$Annotations[entityProperty.fullyQualifiedName] = {};
950
- }
951
-
952
- if (!oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"]) {
953
- oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"] = {
954
- $Type: "com.sap.vocabularies.UI.v1.DataField",
955
- Value: {
956
- $Path: entityProperty.name
957
- }
958
- };
959
-
960
- _this6.createAnnotationLists({
961
- "@com.sap.vocabularies.UI.v1.DataFieldDefault": oMetaModelData.$Annotations[entityProperty.fullyQualifiedName]["@com.sap.vocabularies.UI.v1.DataFieldDefault"]
962
- }, entityProperty.fullyQualifiedName, annotationLists, oCapabilities);
1012
+ if (targetEntitySet) {
1013
+ entitySet.navigationPropertyBinding[navPropName] = targetEntitySet;
963
1014
  }
964
1015
  });
965
- entityTypes.push(entityType);
966
- });
967
- Object.keys(oEntitySets).filter(function (entitySetName) {
968
- return entitySetName !== "$kind" && oEntitySets[entitySetName].$kind === "EntitySet";
969
- }).forEach(function (entitySetName) {
970
- var entitySet = _this6.parseEntitySet(oMetaModel, entitySetName, annotationLists, entityContainerName, oCapabilities);
971
-
972
- entitySets.push(entitySet);
973
- });
974
- Object.keys(oEntitySets).filter(function (singletonName) {
975
- return singletonName !== "$kind" && oEntitySets[singletonName].$kind === "Singleton";
976
- }).forEach(function (singletonName) {
977
- var singleton = _this6.parseSingleton(oMetaModel, singletonName, annotationLists, entityContainerName, oCapabilities);
978
-
979
- singletons.push(singleton);
980
- });
981
- Object.keys(oMetaModelData).filter(function (complexTypeName) {
982
- return complexTypeName !== "$kind" && oMetaModelData[complexTypeName].$kind === "ComplexType";
983
- }).forEach(function (complexTypeName) {
984
- var complexType = _this6.parseComplexType(oMetaModel, complexTypeName, annotationLists, namespace, oCapabilities);
985
-
986
- complexTypes.push(complexType);
987
- });
988
- var oEntityContainerName = Object.keys(oMetaModelData).find(function (entityContainerName) {
989
- return entityContainerName !== "$kind" && oMetaModelData[entityContainerName].$kind === "EntityContainer";
990
- });
991
- var entityContainer = {};
992
-
993
- if (oEntityContainerName) {
994
- entityContainer = {
995
- name: oEntityContainerName.replace(namespace + ".", ""),
996
- fullyQualifiedName: oEntityContainerName
997
- };
998
1016
  }
999
-
1000
- entitySets.forEach(function (entitySet) {
1001
- var navPropertyBindings = oMetaModelData[entityContainerName][entitySet.name].$NavigationPropertyBinding;
1002
-
1003
- if (navPropertyBindings) {
1004
- Object.keys(navPropertyBindings).forEach(function (navPropName) {
1005
- var targetEntitySet = entitySets.find(function (entitySetName) {
1006
- return entitySetName.name === navPropertyBindings[navPropName];
1007
- });
1008
-
1009
- if (targetEntitySet) {
1010
- entitySet.navigationPropertyBinding[navPropName] = targetEntitySet;
1011
- }
1012
- });
1013
- }
1017
+ });
1018
+ var actions = Object.keys(oMetaModelData).filter(function (key) {
1019
+ return Array.isArray(oMetaModelData[key]) && oMetaModelData[key].length > 0 && oMetaModelData[key][0].$kind === "Action";
1020
+ }).reduce(function (outActions, actionName) {
1021
+ var actions = oMetaModelData[actionName];
1022
+ actions.forEach(function (action) {
1023
+ outActions.push(prepareAction(actionName, action, namespace, entityContainerName));
1014
1024
  });
1015
- var actions = Object.keys(oMetaModelData).filter(function (key) {
1016
- return Array.isArray(oMetaModelData[key]) && oMetaModelData[key].length > 0 && oMetaModelData[key][0].$kind === "Action";
1017
- }).reduce(function (outActions, actionName) {
1018
- var actions = oMetaModelData[actionName];
1019
- actions.forEach(function (action) {
1020
- outActions.push(_this6.parseAction(actionName, action, namespace, entityContainerName));
1021
- });
1022
- return outActions;
1023
- }, []); // FIXME Crappy code to deal with annotations for functions
1025
+ return outActions;
1026
+ }, []);
1024
1027
 
1025
- var annotations = oMetaModelData.$Annotations;
1026
- var actionAnnotations = Object.keys(annotations).filter(function (target) {
1027
- return target.indexOf("(") !== -1;
1028
- });
1029
- actionAnnotations.forEach(function (target) {
1030
- _this6.createAnnotationLists(oMetaModelData.$Annotations[target], target, annotationLists, oCapabilities);
1031
- });
1032
- var actionsNameWithoutOverload = actions.map(function (action) {
1033
- return action.fullyQualifiedName.split("(")[0];
1034
- });
1035
- actionsNameWithoutOverload.forEach(function (actionName) {
1036
- if (annotations.hasOwnProperty(actionName)) {
1037
- _this6.createAnnotationLists(oMetaModelData.$Annotations[actionName], actionName, annotationLists, oCapabilities);
1038
- }
1039
- });
1040
- var entityContainerAnnotations = annotations[entityContainerName]; // Retrieve Entity Container annotations
1028
+ for (var target in oMetaModelData.$Annotations) {
1029
+ createAnnotationLists(oMetaModelData.$Annotations[target], target, annotationLists, oCapabilities);
1030
+ } // Sort by target length
1041
1031
 
1042
- if (entityContainerAnnotations) {
1043
- this.createAnnotationLists(entityContainerAnnotations, entityContainerName, annotationLists, oCapabilities);
1044
- } // Sort by target length
1045
1032
 
1033
+ var outAnnotationLists = Object.keys(annotationLists).sort(function (a, b) {
1034
+ return a.length >= b.length ? 1 : -1;
1035
+ }).map(function (sAnnotationName) {
1036
+ return annotationLists[sAnnotationName];
1037
+ });
1038
+ var references = [];
1039
+ return {
1040
+ identification: "metamodelResult",
1041
+ version: "4.0",
1042
+ schema: {
1043
+ entityContainer: entityContainer,
1044
+ entitySets: entitySets,
1045
+ entityTypes: entityTypes,
1046
+ complexTypes: complexTypes,
1047
+ typeDefinitions: typeDefinitions,
1048
+ singletons: singletons,
1049
+ associations: [],
1050
+ associationSets: [],
1051
+ actions: actions,
1052
+ namespace: namespace,
1053
+ annotations: {
1054
+ "metamodelResult": outAnnotationLists
1055
+ }
1056
+ },
1057
+ references: references
1058
+ };
1059
+ }
1046
1060
 
1047
- annotationLists = annotationLists.sort(function (a, b) {
1048
- return a.target.length >= b.target.length ? 1 : -1;
1049
- });
1050
- var references = [];
1051
- return {
1052
- identification: "metamodelResult",
1053
- version: "4.0",
1054
- schema: {
1055
- entityContainer: entityContainer,
1056
- entitySets: entitySets,
1057
- entityTypes: entityTypes,
1058
- complexTypes: complexTypes,
1059
- singletons: singletons,
1060
- associations: [],
1061
- actions: actions,
1062
- namespace: namespace,
1063
- annotations: {
1064
- "metamodelResult": annotationLists
1065
- }
1066
- },
1067
- references: references
1068
- };
1069
- }
1070
- };
1061
+ _exports.prepareEntityTypes = prepareEntityTypes;
1071
1062
  var mMetaModelMap = {};
1072
1063
  /**
1073
1064
  * Convert the ODataMetaModel into another format that allow for easy manipulation of the annotations.
@@ -1081,8 +1072,14 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
1081
1072
  var sMetaModelId = oMetaModel.id;
1082
1073
 
1083
1074
  if (!mMetaModelMap.hasOwnProperty(sMetaModelId)) {
1084
- var parsedOutput = MetaModelConverter.parseEntityTypes(oMetaModel, oCapabilities);
1085
- mMetaModelMap[sMetaModelId] = AnnotationConverter.convertTypes(parsedOutput);
1075
+ var parsedOutput = prepareEntityTypes(oMetaModel, oCapabilities);
1076
+
1077
+ if (oCapabilities && oCapabilities.Situations) {
1078
+ // Only Experimental Feature!
1079
+ mMetaModelMap[sMetaModelId] = addSyntheticAnnotations(AnnotationConverter.convertTypes(parsedOutput));
1080
+ } else {
1081
+ mMetaModelMap[sMetaModelId] = AnnotationConverter.convertTypes(parsedOutput);
1082
+ }
1086
1083
  }
1087
1084
 
1088
1085
  return mMetaModelMap[sMetaModelId];
@@ -1090,6 +1087,32 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
1090
1087
 
1091
1088
  _exports.convertTypes = convertTypes;
1092
1089
 
1090
+ function addSyntheticAnnotations(metaModel) {
1091
+ // [Situations POC] Determine mixed-in situations navigation property.
1092
+ // This will probably happen either
1093
+ // - by a fixed navigation property name ("SAP__Situation"), or
1094
+ // - by an entity type annotation that declares the navigation property to use (similar to com.sap.vocabularies.Common.v1.Messages)
1095
+ //
1096
+ // For now, we add an 'invented' annotation "com.sap.vocabularies.FioriElements.v1.Situations" consisting of a path to the situations navigation property
1097
+ metaModel.entityTypes.forEach(function (entityType) {
1098
+ var situationsNavProp = entityType.navigationProperties.find(function (navProp) {
1099
+ return navProp.name === "SAP__Situation" || navProp.name === "_SAP__Situation";
1100
+ });
1101
+
1102
+ if (situationsNavProp) {
1103
+ entityType.annotations.FE = {
1104
+ Situations: {
1105
+ term: "com.sap.vocabularies.FioriElements.v1.Situations",
1106
+ type: "Path",
1107
+ path: situationsNavProp.name,
1108
+ $target: situationsNavProp
1109
+ }
1110
+ };
1111
+ }
1112
+ });
1113
+ return metaModel;
1114
+ }
1115
+
1093
1116
  function deleteModelCacheData(oMetaModel) {
1094
1117
  delete mMetaModelMap[oMetaModel.id];
1095
1118
  }
@@ -1104,6 +1127,13 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
1104
1127
  var targetEntitySet = oConverterOutput.entitySets.find(function (entitySet) {
1105
1128
  return entitySet.name === aPathSplit[1];
1106
1129
  });
1130
+
1131
+ if (!targetEntitySet) {
1132
+ targetEntitySet = oConverterOutput.singletons.find(function (singleton) {
1133
+ return singleton.name === aPathSplit[1];
1134
+ });
1135
+ }
1136
+
1107
1137
  var relativePath = aPathSplit.slice(2).join("/");
1108
1138
  var localObjects = [targetEntitySet];
1109
1139
 
@@ -1135,7 +1165,7 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
1135
1165
  _step;
1136
1166
 
1137
1167
  try {
1138
- var _loop = function () {
1168
+ var _loop2 = function () {
1139
1169
  var sNavProp = _step.value;
1140
1170
  // Pushing all nav props to the visited objects. example: "Set", "_SalesOrder" for "Set/_SalesOrder"(in NavigationPropertyBinding)
1141
1171
  var targetNavProp = targetEntityType && targetEntityType.navigationProperties.find(function (navProp) {
@@ -1151,7 +1181,7 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
1151
1181
  };
1152
1182
 
1153
1183
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
1154
- var _ret = _loop();
1184
+ var _ret = _loop2();
1155
1185
 
1156
1186
  if (_ret === "break") break;
1157
1187
  }
@@ -1167,9 +1197,17 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
1167
1197
  // Pushing the target entitySet to visited objects
1168
1198
  localObjects.push(targetEntitySet);
1169
1199
  } // Re-calculating the relative path
1200
+ // As each navigation name is enclosed between '$NavigationPropertyBinding' and '$' (to be able to access the entityset easily in the metamodel)
1201
+ // we need to remove the closing '$' to be able to switch to the next navigation
1170
1202
 
1171
1203
 
1172
- relativePath = relativeSplit.slice(aNavProps.length || 1).join("/");
1204
+ relativeSplit = relativeSplit.slice(aNavProps.length || 1);
1205
+
1206
+ if (relativeSplit.length && relativeSplit[0] === "$") {
1207
+ relativeSplit.shift();
1208
+ }
1209
+
1210
+ relativePath = relativeSplit.join("/");
1173
1211
  }
1174
1212
 
1175
1213
  if (relativePath.startsWith("$Type")) {
@@ -1307,4 +1345,4 @@ sap.ui.define(["sap/fe/core/converters/common/AnnotationConverter", "../helpers/
1307
1345
  _exports.getInvolvedDataModelObjectFromPath = getInvolvedDataModelObjectFromPath;
1308
1346
  return _exports;
1309
1347
  }, false);
1310
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1ldGFNb2RlbENvbnZlcnRlci50cyJdLCJuYW1lcyI6WyJWT0NBQlVMQVJZX0FMSUFTIiwiRGVmYXVsdEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiQ2hhcnQiLCJNaWNyb0NoYXJ0IiwiVVNoZWxsIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiTWV0YU1vZGVsQ29udmVydGVyIiwicGFyc2VQcm9wZXJ0eVZhbHVlIiwiYW5ub3RhdGlvbk9iamVjdCIsInByb3BlcnR5S2V5IiwiY3VycmVudFRhcmdldCIsImFubm90YXRpb25zTGlzdHMiLCJvQ2FwYWJpbGl0aWVzIiwidmFsdWUiLCJjdXJyZW50UHJvcGVydHlUYXJnZXQiLCJ0eXBlIiwiTnVsbCIsIlN0cmluZyIsIkJvb2wiLCJJbnQiLCJBcnJheSIsImlzQXJyYXkiLCJDb2xsZWN0aW9uIiwibWFwIiwic3ViQW5ub3RhdGlvbk9iamVjdCIsInN1YkFubm90YXRpb25PYmplY3RJbmRleCIsInBhcnNlQW5ub3RhdGlvbk9iamVjdCIsImxlbmd0aCIsImhhc093blByb3BlcnR5IiwiJFBhdGgiLCJ1bmRlZmluZWQiLCJQYXRoIiwiJERlY2ltYWwiLCJEZWNpbWFsIiwicGFyc2VGbG9hdCIsIiRQcm9wZXJ0eVBhdGgiLCJQcm9wZXJ0eVBhdGgiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCIkSWYiLCJJZiIsIiRBbmQiLCJBbmQiLCIkT3IiLCJPciIsIiROb3QiLCJOb3QiLCIkRXEiLCJFcSIsIiROZSIsIk5lIiwiJEd0IiwiR3QiLCIkR2UiLCJHZSIsIiRMdCIsIkx0IiwiJExlIiwiTGUiLCIkQXBwbHkiLCJBcHBseSIsIkZ1bmN0aW9uIiwiJEZ1bmN0aW9uIiwiJEFubm90YXRpb25QYXRoIiwiQW5ub3RhdGlvblBhdGgiLCIkRW51bU1lbWJlciIsIkVudW1NZW1iZXIiLCJtYXBOYW1lVG9BbGlhcyIsInNwbGl0IiwiJFR5cGUiLCJSZWNvcmQiLCJuYW1lIiwiYW5ub3RhdGlvbk5hbWUiLCJwYXRoUGFydCIsImFubm9QYXJ0IiwibGFzdERvdCIsImxhc3RJbmRleE9mIiwic3Vic3RyIiwiY3VycmVudE9iamVjdFRhcmdldCIsInBhcnNlZEFubm90YXRpb25PYmplY3QiLCJwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbiIsImNvbGxlY3Rpb24iLCJzdWJBbm5vdGF0aW9uSW5kZXgiLCJ0eXBlVmFsdWUiLCJwcm9wZXJ0eVZhbHVlcyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwic3RhcnRzV2l0aCIsInB1c2giLCJjcmVhdGVBbm5vdGF0aW9uTGlzdHMiLCJnZXRPckNyZWF0ZUFubm90YXRpb25MaXN0IiwidGFyZ2V0IiwicG90ZW50aWFsVGFyZ2V0IiwiZmluZCIsImFubm90YXRpb25MaXN0IiwiYW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uT2JqZWN0cyIsImFubm90YXRpb25UYXJnZXQiLCJhbm5vdGF0aW9uTGlzdHMiLCJvdXRBbm5vdGF0aW9uT2JqZWN0IiwicmVtb3ZlQ2hhcnRBbm5vdGF0aW9ucyIsImZpbHRlciIsIm9SZWNvcmQiLCJUYXJnZXQiLCJpbmRleE9mIiwicmVtb3ZlSUJOQW5ub3RhdGlvbnMiLCJoYW5kbGVQcmVzZW50YXRpb25WYXJpYW50IiwiYW5ub3RhdGlvbktleSIsIkRhdGEiLCJWaXN1YWxpemF0aW9ucyIsImN1cnJlbnRPdXRBbm5vdGF0aW9uT2JqZWN0IiwiYW5ub3RhdGlvbk9mQW5ub3RhdGlvblNwbGl0IiwiYW5ub3RhdGlvblF1YWxpZmllclNwbGl0IiwicXVhbGlmaWVyIiwidGVybSIsImN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0IiwiaXNDb2xsZWN0aW9uIiwicmVjb3JkIiwicGFyc2VQcm9wZXJ0eSIsIm9NZXRhTW9kZWwiLCJlbnRpdHlUeXBlT2JqZWN0IiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlBbm5vdGF0aW9uIiwiZ2V0T2JqZWN0IiwiZnVsbHlRdWFsaWZpZWROYW1lIiwicHJvcGVydHlEZWZpbml0aW9uIiwicHJvcGVydHlPYmplY3QiLCJfdHlwZSIsIm1heExlbmd0aCIsIiRNYXhMZW5ndGgiLCJwcmVjaXNpb24iLCIkUHJlY2lzaW9uIiwic2NhbGUiLCIkU2NhbGUiLCJudWxsYWJsZSIsIiROdWxsYWJsZSIsInBhcnNlTmF2aWdhdGlvblByb3BlcnR5IiwibmF2UHJvcGVydHlOYW1lIiwibmF2UHJvcGVydHlBbm5vdGF0aW9uIiwibmF2UHJvcGVydHlEZWZpbml0aW9uIiwicmVmZXJlbnRpYWxDb25zdHJhaW50IiwiJFJlZmVyZW50aWFsQ29uc3RyYWludCIsInNvdXJjZVByb3BlcnR5TmFtZSIsInNvdXJjZVR5cGVOYW1lIiwic291cmNlUHJvcGVydHkiLCJ0YXJnZXRUeXBlTmFtZSIsInRhcmdldFByb3BlcnR5IiwibmF2aWdhdGlvblByb3BlcnR5IiwicGFydG5lciIsIiRQYXJ0bmVyIiwiJGlzQ29sbGVjdGlvbiIsImNvbnRhaW5zVGFyZ2V0IiwiJENvbnRhaW5zVGFyZ2V0IiwicGFyc2VFbnRpdHlTZXQiLCJlbnRpdHlTZXROYW1lIiwiZW50aXR5Q29udGFpbmVyTmFtZSIsImVudGl0eVNldERlZmluaXRpb24iLCJlbnRpdHlTZXRBbm5vdGF0aW9uIiwiZW50aXR5U2V0T2JqZWN0IiwibmF2aWdhdGlvblByb3BlcnR5QmluZGluZyIsImVudGl0eVR5cGVOYW1lIiwicGFyc2VTaW5nbGV0b24iLCJzaW5nbGV0b25OYW1lIiwic2luZ2xldG9uRGVmaW5pdGlvbiIsInNpbmdsZXRvbkFubm90YXRpb24iLCJzaW5nbGV0b25PYmplY3QiLCJ0eXBlTmFtZSIsInBhcnNlRW50aXR5VHlwZSIsIm5hbWVzcGFjZSIsImVudGl0eVR5cGVBbm5vdGF0aW9uIiwiZW50aXR5VHlwZURlZmluaXRpb24iLCJlbnRpdHlLZXlzIiwiZ2V0RW50aXR5S2V5cyIsIiRLZXkiLCIkQmFzZVR5cGUiLCJyZXBsYWNlIiwiZW50aXR5UHJvcGVydGllcyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwicHJvcGVydHlOYW1lT3JOb3QiLCIka2luZCIsImVudGl0eUtleSIsInByb3BlcnR5IiwicGFyc2VDb21wbGV4VHlwZSIsImNvbXBsZXhUeXBlTmFtZSIsImNvbXBsZXhUeXBlQW5ub3RhdGlvbiIsImNvbXBsZXhUeXBlRGVmaW5pdGlvbiIsImNvbXBsZXhUeXBlT2JqZWN0IiwicHJvcGVydGllcyIsImNvbXBsZXhUeXBlUHJvcGVydGllcyIsImNvbXBsZXhUeXBlTmF2aWdhdGlvblByb3BlcnRpZXMiLCJwYXJzZUFjdGlvbiIsImFjdGlvbk5hbWUiLCJhY3Rpb25SYXdEYXRhIiwiYWN0aW9uRW50aXR5VHlwZSIsImFjdGlvbkZRTiIsImFjdGlvblNob3J0TmFtZSIsIiRJc0JvdW5kIiwiYmluZGluZ1BhcmFtZXRlciIsIiRQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwiaXNCb3VuZCIsInNvdXJjZVR5cGUiLCJyZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCJwYXJhbSIsImlzRW50aXR5U2V0IiwiJEVudGl0eVNldFBhdGgiLCIkTmFtZSIsInBhcnNlRW50aXR5VHlwZXMiLCJvSW5DYXBhYmlsaXRpZXMiLCJvTWV0YU1vZGVsRGF0YSIsIm9FbnRpdHlTZXRzIiwiZW50aXR5VHlwZXMiLCJlbnRpdHlTZXRzIiwic2luZ2xldG9ucyIsImNvbXBsZXhUeXBlcyIsIiRFbnRpdHlDb250YWluZXIiLCJzY2hlbWFLZXlzIiwibWV0YW1vZGVsS2V5IiwiZW50aXR5VHlwZSIsIiRBbm5vdGF0aW9ucyIsImZpbHRlckZhY2V0QW5ub3RhdGlvbiIsIklEIiwiZ2VuZXJhdGUiLCJGYWNldCIsImVudGl0eVByb3BlcnR5IiwiVmFsdWUiLCJlbnRpdHlTZXQiLCJzaW5nbGV0b24iLCJjb21wbGV4VHlwZSIsIm9FbnRpdHlDb250YWluZXJOYW1lIiwiZW50aXR5Q29udGFpbmVyIiwibmF2UHJvcGVydHlCaW5kaW5ncyIsIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nIiwibmF2UHJvcE5hbWUiLCJ0YXJnZXRFbnRpdHlTZXQiLCJhY3Rpb25zIiwia2V5IiwicmVkdWNlIiwib3V0QWN0aW9ucyIsImFjdGlvbiIsImFjdGlvbkFubm90YXRpb25zIiwiYWN0aW9uc05hbWVXaXRob3V0T3ZlcmxvYWQiLCJlbnRpdHlDb250YWluZXJBbm5vdGF0aW9ucyIsInNvcnQiLCJhIiwiYiIsInJlZmVyZW5jZXMiLCJpZGVudGlmaWNhdGlvbiIsInZlcnNpb24iLCJzY2hlbWEiLCJhc3NvY2lhdGlvbnMiLCJtTWV0YU1vZGVsTWFwIiwiY29udmVydFR5cGVzIiwic01ldGFNb2RlbElkIiwiaWQiLCJwYXJzZWRPdXRwdXQiLCJBbm5vdGF0aW9uQ29udmVydGVyIiwiZGVsZXRlTW9kZWxDYWNoZURhdGEiLCJjb252ZXJ0TWV0YU1vZGVsQ29udGV4dCIsIm9NZXRhTW9kZWxDb250ZXh0IiwiYkluY2x1ZGVWaXNpdGVkT2JqZWN0cyIsIm9Db252ZXJ0ZXJPdXRwdXQiLCJnZXRNb2RlbCIsInNQYXRoIiwiZ2V0UGF0aCIsImFQYXRoU3BsaXQiLCJyZWxhdGl2ZVBhdGgiLCJzbGljZSIsImpvaW4iLCJsb2NhbE9iamVjdHMiLCJyZWxhdGl2ZVNwbGl0IiwiaWR4IiwiY3VycmVudEVudGl0eVNldCIsInNOYXZQcm9wVG9DaGVjayIsImFOYXZQcm9wcyIsInRhcmdldEVudGl0eVR5cGUiLCJzTmF2UHJvcCIsInRhcmdldE5hdlByb3AiLCJuYXZQcm9wIiwidGFyZ2V0VHlwZSIsIm9UYXJnZXQiLCJyZXNvbHZlUGF0aCIsInZpc2l0ZWRPYmplY3RzIiwiY29uY2F0IiwicGFyYW1ldGVyTmFtZSIsInRhcmdldFBhcmFtZXRlciIsInBhcmFtZXRlciIsImVuZHNXaXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwib0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQiLCJtZXRhTW9kZWxDb250ZXh0IiwidGFyZ2V0RW50aXR5U2V0TG9jYXRpb24iLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdEZyb21QYXRoIiwiZGF0YU1vZGVsT2JqZWN0cyIsInZpc2l0ZWRPYmplY3QiLCJyb290RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJpIiwiY3VycmVudE9iamVjdCIsIm5hdmlnYXRlZFBhdGhzIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJzdGFydGluZ0luZGV4IiwicmVxdWlyZWREYXRhTW9kZWxPYmplY3RzIiwib2JqZWN0Iiwib3V0RGF0YU1vZGVsUGF0aCIsInRhcmdldE9iamVjdCIsImNvbnRleHRMb2NhdGlvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkEsTUFBTUEsZ0JBQXFCLEdBQUc7QUFDN0IsaUNBQTZCLGNBREE7QUFFN0IseUJBQXFCLE1BRlE7QUFHN0IsNkJBQXlCLFVBSEk7QUFJN0Isc0NBQWtDLFFBSkw7QUFLN0Isa0NBQThCLElBTEQ7QUFNN0IsdUNBQW1DLFNBTk47QUFPN0IseUNBQXFDLFdBUFI7QUFRN0IsNENBQXdDLGNBUlg7QUFTN0IsNkNBQXlDO0FBVFosR0FBOUI7QUFtQk8sTUFBTUMsOEJBQThCLEdBQUc7QUFDN0NDLElBQUFBLEtBQUssRUFBRSxJQURzQztBQUU3Q0MsSUFBQUEsVUFBVSxFQUFFLElBRmlDO0FBRzdDQyxJQUFBQSxNQUFNLEVBQUUsSUFIcUM7QUFJN0NDLElBQUFBLHFCQUFxQixFQUFFO0FBSnNCLEdBQXZDOztBQXlCUCxNQUFNQyxrQkFBa0IsR0FBRztBQUMxQkMsSUFBQUEsa0JBRDBCLFlBRXpCQyxnQkFGeUIsRUFHekJDLFdBSHlCLEVBSXpCQyxhQUp5QixFQUt6QkMsZ0JBTHlCLEVBTXpCQyxhQU55QixFQU9uQjtBQUFBOztBQUNOLFVBQUlDLEtBQUo7QUFDQSxVQUFNQyxxQkFBNkIsR0FBR0osYUFBYSxHQUFHLEdBQWhCLEdBQXNCRCxXQUE1RDs7QUFDQSxVQUFJRCxnQkFBZ0IsS0FBSyxJQUF6QixFQUErQjtBQUM5QkssUUFBQUEsS0FBSyxHQUFHO0FBQUVFLFVBQUFBLElBQUksRUFBRSxNQUFSO0FBQWdCQyxVQUFBQSxJQUFJLEVBQUU7QUFBdEIs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LFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsS0FBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLE1BQW5DLENBQUosRUFBZ0Q7QUFDckRmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsS0FBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFoQixDQUFvQm9CLGNBQXBCLENBQW1DLEtBQW5DLENBQUosRUFBK0M7QUFDcERmLFlBQUFBLEtBQUssQ0FBQ1MsVUFBUCxDQUEwQlAsSUFBMUIsR0FBaUMsSUFBakM7QUFDQSxXQUZNLE1BRUEsSUFBSVAsZ0JBQWdCLENBQUMsQ0FBRCxDQUFo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dUIsQ0FBdkIsRUFBMEJrQyxhQUExQixDQUFqQztBQUNBVixRQUFBQSx1QkFBdUIsQ0FBQ1MsaUJBQXhCLEdBQTRDTCxhQUE1QztBQUNBSixRQUFBQSx1QkFBdUIsQ0FBQ25ILG9CQUF4QixHQUErQzhILHdCQUF3QixDQUNyRTFNLE1BRDZDLENBQ3RDLFVBQUMyTSxNQUFEO0FBQUEsaUJBQWlCQSxNQUFNLENBQUNqTCxLQUFQLEtBQWlCLG9CQUFsQztBQUFBLFNBRHNDLEVBRTdDNkosTUFGNkMsQ0FFdENRLHVCQUF1QixDQUFDbkgsb0JBRmMsQ0FBL0M7QUFHQTtBQUNEOztBQUNELFFBQU1nSSxnQkFBZ0IsR0FBRztBQUN4QkosTUFBQUEsaUJBQWlCLEVBQUVMLGFBREs7QUFFeEI3RCxNQUFBQSxlQUFlLEVBQUVzQyxnQkFGTztBQUd4QkcsTUFBQUEsZ0JBQWdCLEVBQUVxQixpQkFITTtBQUl4QlMsTUFBQUEsWUFBWSxFQUFFZixnQkFBZ0IsQ0FBQ3hNLE1BSlA7QUFLeEJzRixNQUFBQSxvQkFBb0IsRUFBcEJBLG9CQUx3QjtBQU14QmtJLE1BQUFBLGVBQWUsRUFBRWY7QUFOTyxLQUF6Qjs7QUFRQSxRQUFJLENBQUNhLGdCQUFnQixDQUFDRSxlQUF0QixFQUF1QztBQUN0Q0YsTUFBQUEsZ0JBQWdCLENBQUNFLGVBQWpCLEdBQW1DRixnQkFBbkM7QUFDQTs7QUFDRCxXQUFPQSxnQkFBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9uLCBBbm5vdGF0aW9uTGlzdCwgQW5ub3RhdGlvblJlY29yZCwgRXhwcmVzc2lvbiwgUGFyc2VyT3V0cHV0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG4vLyBUaGlzIGZpbGUgaXMgcmV0cmlldmVkIGZyb20gQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlciwgc2hhcmVkIGNvZGUgd2l0aCB0b29sIHN1aXRlXG5pbXBvcnQgeyBBbm5vdGF0aW9uQ29udmVydGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29tbW9uXCI7XG5pbXBvcnQgeyBPRGF0YU1ldGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7XG5cdENvbnZlcnRlck91dHB1dCxcblx0RW50aXR5U2V0IGFzIF9FbnRpdHlTZXQsXG5cdEVudGl0eVR5cGUgYXMgX0VudGl0eVR5cGUsXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eSBhcyBfTmF2aWdhdGlvblByb3BlcnR5XG59IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRFbnRpdHlUeXBlLFxuXHRFbnRpdHlTZXQsXG5cdFByb3BlcnR5LFxuXHRDb21wbGV4VHlwZSxcblx0UmVmZXJlbnRpYWxDb25zdHJhaW50LFxuXHRWNE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0QWN0aW9uLFxuXHRSZWZlcmVuY2UsXG5cdEVudGl0eUNvbnRhaW5lcixcblx0U2luZ2xldG9uXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L1BhcnNlclwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWxcIjtcbmltcG9ydCB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCIuLi9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5cbmNvbnN0IFZPQ0FCVUxBUllfQUxJQVM6IGFueSA9IHtcblx0XCJPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxXCI6IFwiQ2FwYWJpbGl0aWVzXCIsXG5cdFwiT3JnLk9EYXRhLkNvcmUuVjFcIjogXCJDb3JlXCIsXG5cdFwiT3JnLk9EYXRhLk1lYXN1cmVzLlYxXCI6IFwiTWVhc3VyZXNcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjFcIjogXCJDb21tb25cIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MVwiOiBcIlVJXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MVwiOiBcIlNlc3Npb25cIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjFcIjogXCJBbmFseXRpY3NcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjFcIjogXCJQZXJzb25hbERhdGFcIixcblx0XCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxXCI6IFwiQ29tbXVuaWNhdGlvblwiXG59O1xuXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudENhcGFiaWxpdGllcyA9IHtcblx0Q2hhcnQ6IGJvb2xlYW47XG5cdE1pY3JvQ2hhcnQ6IGJvb2xlYW47XG5cdFVTaGVsbDogYm9vbGVhbjtcblx0SW50ZW50QmFzZWROYXZpZ2F0aW9uOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRFbnZpcm9ubWVudENhcGFiaWxpdGllcyA9IHtcblx0Q2hhcnQ6IHRydWUsXG5cdE1pY3JvQ2hhcnQ6IHRydWUsXG5cdFVTaGVsbDogdHJ1ZSxcblx0SW50ZW50QmFzZWROYXZpZ2F0aW9uOiB0cnVlXG59O1xuXG50eXBlIE1ldGFNb2RlbEFjdGlvbiA9IHtcblx0JGtpbmQ6IFwiQWN0aW9uXCI7XG5cdCRJc0JvdW5kOiBib29sZWFuO1xuXHQkRW50aXR5U2V0UGF0aDogc3RyaW5nO1xuXHQkUGFyYW1ldGVyOiB7XG5cdFx0JFR5cGU6IHN0cmluZztcblx0XHQkTmFtZTogc3RyaW5nO1xuXHRcdCROdWxsYWJsZT86IGJvb2xlYW47XG5cdFx0JE1heExlbmd0aD86IG51bWJlcjtcblx0XHQkUHJlY2lzaW9uPzogbnVtYmVyO1xuXHRcdCRTY2FsZT86IG51bWJlcjtcblx0XHQkaXNDb2xsZWN0aW9uPzogYm9vbGVhbjtcblx0fVtdO1xuXHQkUmV0dXJuVHlwZToge1xuXHRcdCRUeXBlOiBzdHJpbmc7XG5cdH07XG59O1xuXG5jb25zdCBNZXRhTW9kZWxDb252ZXJ0ZXIgPSB7XG5cdHBhcnNlUHJvcGVydHlWYWx1ZShcblx0XHRhbm5vdGF0aW9uT2JqZWN0OiBhbnksXG5cdFx0cHJvcGVydHlLZXk6IHN0cmluZyxcblx0XHRjdXJyZW50VGFyZ2V0OiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvbnNMaXN0czogYW55W10sXG5cdFx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcblx0KTogYW55IHtcblx0XHRsZXQgdmFsdWU7XG5cdFx0Y29uc3QgY3VycmVudFByb3BlcnR5VGFyZ2V0OiBzdHJpbmcgPSBjdXJyZW50VGFyZ2V0ICsgXCIvXCIgKyBwcm9wZXJ0eUtleTtcblx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdCA9PT0gbnVsbCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiTnVsbFwiLCBOdWxsOiBudWxsIH07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiU3RyaW5nXCIsIFN0cmluZzogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJCb29sXCIsIEJvb2w6IGFubm90YXRpb25PYmplY3QgfTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0ID09PSBcIm51bWJlclwiKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJJbnRcIiwgSW50OiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFubm90YXRpb25PYmplY3QpKSB7XG5cdFx0XHR2YWx1ZSA9IHtcblx0XHRcdFx0dHlwZTogXCJDb2xsZWN0aW9uXCIsXG5cdFx0XHRcdENvbGxlY3Rpb246IGFubm90YXRpb25PYmplY3QubWFwKChzdWJBbm5vdGF0aW9uT2JqZWN0LCBzdWJBbm5vdGF0aW9uT2JqZWN0SW5kZXgpID0+XG5cdFx0XHRcdFx0dGhpcy5wYXJzZUFubm90YXRpb25PYmplY3QoXG5cdFx0XHRcdFx0XHRzdWJBbm5vdGF0aW9uT2JqZWN0LFxuXHRcdFx0XHRcdFx0Y3VycmVudFByb3BlcnR5VGFyZ2V0ICsgXCIvXCIgKyBzdWJBbm5vdGF0aW9uT2JqZWN0SW5kZXgsXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uc0xpc3RzLFxuXHRcdFx0XHRcdFx0b0NhcGFiaWxpdGllc1xuXHRcdFx0XHRcdClcblx0XHRcdFx0KVxuXHRcdFx0fTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJFBhdGhcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFubm90YXRpb25QYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBbm5vdGF0aW9uUGF0aFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSkge1xuXHRcdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRJZlwiKSkge1xuXHRcdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE9yXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJPclwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQW5kXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBbmRcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEVxXCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJFcVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5lXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROb3RcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5vdFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkR3RcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkd0XCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiR2VcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEx0XCIpKSB7XG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJMdFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTGVcIikpIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkxlXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQXBwbHlcIjtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdFswXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdC8vICRUeXBlIGlzIG9wdGlvbmFsLi4uXG5cdFx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJSZWNvcmRcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlN0cmluZ1wiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRQYXRoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0geyB0eXBlOiBcIlBhdGhcIiwgUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kUGF0aCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJEZWNpbWFsXCIsIERlY2ltYWw6IHBhcnNlRmxvYXQoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCkgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJQcm9wZXJ0eVBhdGhcIiwgUHJvcGVydHlQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRQcm9wZXJ0eVBhdGggfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7XG5cdFx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiLFxuXHRcdFx0XHROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kSWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiSWZcIiwgSWY6IGFubm90YXRpb25PYmplY3QuJElmIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRBbmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiQW5kXCIsIEFuZDogYW5ub3RhdGlvbk9iamVjdC4kQW5kIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRPciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJPclwiLCBPcjogYW5ub3RhdGlvbk9iamVjdC4kT3IgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5vdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJOb3RcIiwgTm90OiBhbm5vdGF0aW9uT2JqZWN0LiROb3QgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVxICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0geyB0eXBlOiBcIkVxXCIsIEVxOiBhbm5vdGF0aW9uT2JqZWN0LiRFcSB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTmUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiTmVcIiwgTmU6IGFubm90YXRpb25PYmplY3QuJE5lIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRHdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJHdFwiLCBHdDogYW5ub3RhdGlvbk9iamVjdC4kR3QgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEdlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0geyB0eXBlOiBcIkdlXCIsIEdlOiBhbm5vdGF0aW9uT2JqZWN0LiRHZSB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7IHR5cGU6IFwiTHRcIiwgTHQ6IGFubm90YXRpb25PYmplY3QuJEx0IH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJMZVwiLCBMZTogYW5ub3RhdGlvbk9iamVjdC4kTGUgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFwcGx5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHZhbHVlID0geyB0eXBlOiBcIkFwcGx5XCIsIEFwcGx5OiBhbm5vdGF0aW9uT2JqZWN0LiRBcHBseSwgRnVuY3Rpb246IGFubm90YXRpb25PYmplY3QuJEZ1bmN0aW9uIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRBbm5vdGF0aW9uUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YWx1ZSA9IHsgdHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLCBBbm5vdGF0aW9uUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dmFsdWUgPSB7XG5cdFx0XHRcdHR5cGU6IFwiRW51bU1lbWJlclwiLFxuXHRcdFx0XHRFbnVtTWVtYmVyOlxuXHRcdFx0XHRcdHRoaXMubWFwTmFtZVRvQWxpYXMoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlci5zcGxpdChcIi9cIilbMF0pICsgXCIvXCIgKyBhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVsxXVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFR5cGUpIHtcblx0XHRcdHZhbHVlID0ge1xuXHRcdFx0XHR0eXBlOiBcIlJlY29yZFwiLFxuXHRcdFx0XHRSZWNvcmQ6IHRoaXMucGFyc2VBbm5vdGF0aW9uT2JqZWN0KGFubm90YXRpb25PYmplY3QsIGN1cnJlbnRUYXJnZXQsIGFubm90YXRpb25zTGlzdHMsIG9DYXBhYmlsaXRpZXMpXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWx1ZSA9IHtcblx0XHRcdFx0dHlwZTogXCJSZWNvcmRcIixcblx0XHRcdFx0UmVjb3JkOiB0aGlzLnBhcnNlQW5ub3RhdGlvbk9iamVjdChhbm5vdGF0aW9uT2JqZWN0LCBjdXJyZW50VGFyZ2V0LCBhbm5vdGF0aW9uc0xpc3RzLCBvQ2FwYWJpbGl0aWVzKVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogcHJvcGVydHlLZXksXG5cdFx0XHR2YWx1ZVxuXHRcdH07XG5cdH0sXG5cdG1hcE5hbWVUb0FsaWFzKGFubm90YXRpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGxldCBbcGF0aFBhcnQsIGFubm9QYXJ0XSA9IGFubm90YXRpb25OYW1lLnNwbGl0KFwiQFwiKTtcblx0XHRpZiAoIWFubm9QYXJ0KSB7XG5cdFx0XHRhbm5vUGFydCA9IHBhdGhQYXJ0O1xuXHRcdFx0cGF0aFBhcnQgPSBcIlwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXRoUGFydCArPSBcIkBcIjtcblx0XHR9XG5cdFx0Y29uc3QgbGFzdERvdCA9IGFubm9QYXJ0Lmxhc3RJbmRleE9mKFwiLlwiKTtcblx0XHRyZXR1cm4gcGF0aFBhcnQgKyBWT0NBQlVMQVJZX0FMSUFTW2Fubm9QYXJ0LnN1YnN0cigwLCBsYXN0RG90KV0gKyBcIi5cIiArIGFubm9QYXJ0LnN1YnN0cihsYXN0RG90ICsgMSk7XG5cdH0sXG5cdHBhcnNlQW5ub3RhdGlvbk9iamVjdChcblx0XHRhbm5vdGF0aW9uT2JqZWN0OiBhbnksXG5cdFx0Y3VycmVudE9iamVjdFRhcmdldDogc3RyaW5nLFxuXHRcdGFubm90YXRpb25zTGlzdHM6IGFueVtdLFxuXHRcdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG5cdCk6IEV4cHJlc3Npb24gfCBBbm5vdGF0aW9uUmVjb3JkIHwgQW5ub3RhdGlvbiB7XG5cdFx0bGV0IHBhcnNlZEFubm90YXRpb25PYmplY3Q6IGFueSA9IHt9O1xuXHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0ID09PSBudWxsKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIk51bGxcIiwgTnVsbDogbnVsbCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiU3RyaW5nXCIsIFN0cmluZzogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkJvb2xcIiwgQm9vbDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwibnVtYmVyXCIpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiSW50XCIsIEludDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLCBBbm5vdGF0aW9uUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJQYXRoXCIsIFBhdGg6IGFubm90YXRpb25PYmplY3QuJFBhdGggfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJERlY2ltYWwgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJEZWNpbWFsXCIsIERlY2ltYWw6IHBhcnNlRmxvYXQoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCkgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIlByb3BlcnR5UGF0aFwiLCBQcm9wZXJ0eVBhdGg6IGFubm90YXRpb25PYmplY3QuJFByb3BlcnR5UGF0aCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kSWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJJZlwiLCBJZjogYW5ub3RhdGlvbk9iamVjdC4kSWYgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkFuZFwiLCBBbmQ6IGFubm90YXRpb25PYmplY3QuJEFuZCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kT3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJPclwiLCBPcjogYW5ub3RhdGlvbk9iamVjdC4kT3IgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5vdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIk5vdFwiLCBOb3Q6IGFubm90YXRpb25PYmplY3QuJE5vdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRXEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJFcVwiLCBFcTogYW5ub3RhdGlvbk9iamVjdC4kRXEgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiTmVcIiwgTmU6IGFubm90YXRpb25PYmplY3QuJE5lIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRHdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkd0XCIsIEd0OiBhbm5vdGF0aW9uT2JqZWN0LiRHdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kR2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJHZVwiLCBHZTogYW5ub3RhdGlvbk9iamVjdC4kR2UgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiTHRcIiwgTHQ6IGFubm90YXRpb25PYmplY3QuJEx0IH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkxlXCIsIExlOiBhbm5vdGF0aW9uT2JqZWN0LiRMZSB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQXBwbHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJBcHBseVwiLCBBcHBseTogYW5ub3RhdGlvbk9iamVjdC4kQXBwbHksIEZ1bmN0aW9uOiBhbm5vdGF0aW9uT2JqZWN0LiRGdW5jdGlvbiB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0ge1xuXHRcdFx0XHR0eXBlOiBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIixcblx0XHRcdFx0TmF2aWdhdGlvblByb3BlcnR5UGF0aDogYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHtcblx0XHRcdFx0dHlwZTogXCJFbnVtTWVtYmVyXCIsXG5cdFx0XHRcdEVudW1NZW1iZXI6XG5cdFx0XHRcdFx0dGhpcy5tYXBOYW1lVG9BbGlhcyhhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVswXSkgKyBcIi9cIiArIGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIuc3BsaXQoXCIvXCIpWzFdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhbm5vdGF0aW9uT2JqZWN0KSkge1xuXHRcdFx0Y29uc3QgcGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24gPSBwYXJzZWRBbm5vdGF0aW9uT2JqZWN0IGFzIGFueTtcblx0XHRcdHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gPSBhbm5vdGF0aW9uT2JqZWN0Lm1hcCgoc3ViQW5ub3RhdGlvbk9iamVjdCwgc3ViQW5ub3RhdGlvbkluZGV4KSA9PlxuXHRcdFx0XHR0aGlzLnBhcnNlQW5ub3RhdGlvbk9iamVjdChcblx0XHRcdFx0XHRzdWJBbm5vdGF0aW9uT2JqZWN0LFxuXHRcdFx0XHRcdGN1cnJlbnRPYmplY3RUYXJnZXQgKyBcIi9cIiArIHN1YkFubm90YXRpb25JbmRleCxcblx0XHRcdFx0XHRhbm5vdGF0aW9uc0xpc3RzLFxuXHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJFBhdGhcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFubm90YXRpb25QYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBbm5vdGF0aW9uUGF0aFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRJZlwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFuZFwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5kXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRPclwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiT3JcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEVxXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJFcVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5lXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROb3RcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5vdFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkR3RcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkd0XCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiR2VcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEx0XCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJMdFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTGVcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkxlXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQXBwbHlcIjtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdFswXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJTdHJpbmdcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdC4kVHlwZSkge1xuXHRcdFx0XHRjb25zdCB0eXBlVmFsdWUgPSBhbm5vdGF0aW9uT2JqZWN0LiRUeXBlO1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnR5cGUgPSB0eXBlVmFsdWU7IC8vYCR7dHlwZUFsaWFzfS4ke3R5cGVUZXJtfWA7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55ID0gW107XG5cdFx0XHRPYmplY3Qua2V5cyhhbm5vdGF0aW9uT2JqZWN0KS5mb3JFYWNoKHByb3BlcnR5S2V5ID0+IHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRUeXBlXCIgJiZcblx0XHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkSWZcIiAmJlxuXHRcdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRBcHBseVwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJEFuZFwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJE9yXCIgJiZcblx0XHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTmVcIiAmJlxuXHRcdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRHdFwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJEdlXCIgJiZcblx0XHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTHRcIiAmJlxuXHRcdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRMZVwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJE5vdFwiICYmXG5cdFx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJEVxXCIgJiZcblx0XHRcdFx0XHQhcHJvcGVydHlLZXkuc3RhcnRzV2l0aChcIkBcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXMucHVzaChcblx0XHRcdFx0XHRcdHRoaXMucGFyc2VQcm9wZXJ0eVZhbHVlKFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0W3Byb3BlcnR5S2V5XSxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlLZXksXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRPYmplY3RUYXJnZXQsXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25zTGlzdHMsXG5cdFx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5S2V5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG5cdFx0XHRcdFx0Ly8gQW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9uXG5cdFx0XHRcdFx0dGhpcy5jcmVhdGVBbm5vdGF0aW9uTGlzdHMoXG5cdFx0XHRcdFx0XHR7IFtwcm9wZXJ0eUtleV06IGFubm90YXRpb25PYmplY3RbcHJvcGVydHlLZXldIH0sXG5cdFx0XHRcdFx0XHRjdXJyZW50T2JqZWN0VGFyZ2V0LFxuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbnNMaXN0cyxcblx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QucHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblx0XHR9XG5cdFx0cmV0dXJuIHBhcnNlZEFubm90YXRpb25PYmplY3Q7XG5cdH0sXG5cdGdldE9yQ3JlYXRlQW5ub3RhdGlvbkxpc3QodGFyZ2V0OiBzdHJpbmcsIGFubm90YXRpb25zTGlzdHM6IEFubm90YXRpb25MaXN0W10pOiBBbm5vdGF0aW9uTGlzdCB7XG5cdFx0bGV0IHBvdGVudGlhbFRhcmdldCA9IGFubm90YXRpb25zTGlzdHMuZmluZChhbm5vdGF0aW9uTGlzdCA9PiBhbm5vdGF0aW9uTGlzdC50YXJnZXQgPT09IHRhcmdldCk7XG5cdFx0aWYgKCFwb3RlbnRpYWxUYXJnZXQpIHtcblx0XHRcdHBvdGVudGlhbFRhcmdldCA9IHtcblx0XHRcdFx0dGFyZ2V0OiB0YXJnZXQsXG5cdFx0XHRcdGFubm90YXRpb25zOiBbXVxuXHRcdFx0fTtcblx0XHRcdGFubm90YXRpb25zTGlzdHMucHVzaChwb3RlbnRpYWxUYXJnZXQpO1xuXHRcdH1cblx0XHRyZXR1cm4gcG90ZW50aWFsVGFyZ2V0O1xuXHR9LFxuXG5cdGNyZWF0ZUFubm90YXRpb25MaXN0cyhcblx0XHRhbm5vdGF0aW9uT2JqZWN0czogYW55LFxuXHRcdGFubm90YXRpb25UYXJnZXQ6IHN0cmluZyxcblx0XHRhbm5vdGF0aW9uTGlzdHM6IGFueVtdLFxuXHRcdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG5cdCkge1xuXHRcdGNvbnN0IG91dEFubm90YXRpb25PYmplY3QgPSB0aGlzLmdldE9yQ3JlYXRlQW5ub3RhdGlvbkxpc3QoYW5ub3RhdGlvblRhcmdldCwgYW5ub3RhdGlvbkxpc3RzKTtcblx0XHRpZiAoIW9DYXBhYmlsaXRpZXMuTWljcm9DaGFydCkge1xuXHRcdFx0ZGVsZXRlIGFubm90YXRpb25PYmplY3RzW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCJdO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdC5maWx0ZXIoKG9SZWNvcmQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAob1JlY29yZC5UYXJnZXQgJiYgb1JlY29yZC5UYXJnZXQuJEFubm90YXRpb25QYXRoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZWNvcmQuVGFyZ2V0LiRBbm5vdGF0aW9uUGF0aC5pbmRleE9mKFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCIpID09PSAtMTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcmVtb3ZlSUJOQW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdC5maWx0ZXIoKG9SZWNvcmQ6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gb1JlY29yZC4kVHlwZSAhPT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGhhbmRsZVByZXNlbnRhdGlvblZhcmlhbnQoYW5ub3RhdGlvbk9iamVjdDogYW55KSB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdC5maWx0ZXIoKG9SZWNvcmQ6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gb1JlY29yZC4kQW5ub3RhdGlvblBhdGggIT09IFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCI7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRPYmplY3Qua2V5cyhhbm5vdGF0aW9uT2JqZWN0cykuZm9yRWFjaChhbm5vdGF0aW9uS2V5ID0+IHtcblx0XHRcdGxldCBhbm5vdGF0aW9uT2JqZWN0ID0gYW5ub3RhdGlvbk9iamVjdHNbYW5ub3RhdGlvbktleV07XG5cdFx0XHRzd2l0Y2ggKGFubm90YXRpb25LZXkpIHtcblx0XHRcdFx0Y2FzZSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5IZWFkZXJGYWNldHNcIjpcblx0XHRcdFx0XHRpZiAoIW9DYXBhYmlsaXRpZXMuTWljcm9DaGFydCkge1xuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdCA9IHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLklkZW50aWZpY2F0aW9uXCI6XG5cdFx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLkludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdCA9IHJlbW92ZUlCTkFubm90YXRpb25zKGFubm90YXRpb25PYmplY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbVwiOlxuXHRcdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5JbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QgPSByZW1vdmVJQk5Bbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLk1pY3JvQ2hhcnQpIHtcblx0XHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QgPSByZW1vdmVDaGFydEFubm90YXRpb25zKGFubm90YXRpb25PYmplY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWVsZEdyb3VwXCI6XG5cdFx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLkludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdC5EYXRhID0gcmVtb3ZlSUJOQW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdC5EYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLk1pY3JvQ2hhcnQpIHtcblx0XHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QuRGF0YSA9IHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdC5EYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuUHJlc2VudGF0aW9uVmFyaWFudFwiOlxuXHRcdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5DaGFydCAmJiBhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zKSB7XG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zID0gaGFuZGxlUHJlc2VudGF0aW9uVmFyaWFudChhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRhbm5vdGF0aW9uT2JqZWN0c1thbm5vdGF0aW9uS2V5XSA9IGFubm90YXRpb25PYmplY3Q7XG5cdFx0XHRsZXQgY3VycmVudE91dEFubm90YXRpb25PYmplY3QgPSBvdXRBbm5vdGF0aW9uT2JqZWN0O1xuXG5cdFx0XHQvLyBDaGVjayBmb3IgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9uXG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXQgPSBhbm5vdGF0aW9uS2V5LnNwbGl0KFwiQFwiKTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXQubGVuZ3RoID4gMikge1xuXHRcdFx0XHRjdXJyZW50T3V0QW5ub3RhdGlvbk9iamVjdCA9IHRoaXMuZ2V0T3JDcmVhdGVBbm5vdGF0aW9uTGlzdChcblx0XHRcdFx0XHRhbm5vdGF0aW9uVGFyZ2V0ICsgXCJAXCIgKyBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMV0sXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkxpc3RzXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMl07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhbm5vdGF0aW9uS2V5ID0gYW5ub3RhdGlvbk9mQW5ub3RhdGlvblNwbGl0WzFdO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXQgPSBhbm5vdGF0aW9uS2V5LnNwbGl0KFwiI1wiKTtcblx0XHRcdGNvbnN0IHF1YWxpZmllciA9IGFubm90YXRpb25RdWFsaWZpZXJTcGxpdFsxXTtcblx0XHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXRbMF07XG5cblx0XHRcdGNvbnN0IHBhcnNlZEFubm90YXRpb25PYmplY3Q6IGFueSA9IHtcblx0XHRcdFx0dGVybTogYCR7YW5ub3RhdGlvbktleX1gLFxuXHRcdFx0XHRxdWFsaWZpZXI6IHF1YWxpZmllclxuXHRcdFx0fTtcblx0XHRcdGxldCBjdXJyZW50QW5ub3RhdGlvblRhcmdldCA9IGFubm90YXRpb25UYXJnZXQgKyBcIkBcIiArIHBhcnNlZEFubm90YXRpb25PYmplY3QudGVybTtcblx0XHRcdGlmIChxdWFsaWZpZXIpIHtcblx0XHRcdFx0Y3VycmVudEFubm90YXRpb25UYXJnZXQgKz0gXCIjXCIgKyBxdWFsaWZpZXI7XG5cdFx0XHR9XG5cdFx0XHRsZXQgaXNDb2xsZWN0aW9uID0gZmFsc2U7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdCA9PT0gbnVsbCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkJvb2xcIiwgQm9vbDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIlN0cmluZ1wiLCBTdHJpbmc6IGFubm90YXRpb25PYmplY3QgfTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGFubm90YXRpb25PYmplY3QgPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiQm9vbFwiLCBCb29sOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0ID09PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiSW50XCIsIEludDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRJZiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiSWZcIiwgSWY6IGFubm90YXRpb25PYmplY3QuJElmIH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiQW5kXCIsIEFuZDogYW5ub3RhdGlvbk9iamVjdC4kQW5kIH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJPclwiLCBPcjogYW5ub3RhdGlvbk9iamVjdC4kT3IgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTm90ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJOb3RcIiwgTm90OiBhbm5vdGF0aW9uT2JqZWN0LiROb3QgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRXEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkVxXCIsIEVxOiBhbm5vdGF0aW9uT2JqZWN0LiRFcSB9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiROZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiTmVcIiwgTmU6IGFubm90YXRpb25PYmplY3QuJE5lIH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEd0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJHdFwiLCBHdDogYW5ub3RhdGlvbk9iamVjdC4kR3QgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kR2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkdlXCIsIEdlOiBhbm5vdGF0aW9uT2JqZWN0LiRHZSB9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiTHRcIiwgTHQ6IGFubm90YXRpb25PYmplY3QuJEx0IH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJExlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJMZVwiLCBMZTogYW5ub3RhdGlvbk9iamVjdC4kTGUgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQXBwbHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkFwcGx5XCIsIEFwcGx5OiBhbm5vdGF0aW9uT2JqZWN0LiRBcHBseSwgRnVuY3Rpb246IGFubm90YXRpb25PYmplY3QuJEZ1bmN0aW9uIH07XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIlBhdGhcIiwgUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kUGF0aCB9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRBbm5vdGF0aW9uUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7XG5cdFx0XHRcdFx0dHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLFxuXHRcdFx0XHRcdEFubm90YXRpb25QYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRBbm5vdGF0aW9uUGF0aFxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiREZWNpbWFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJEZWNpbWFsXCIsIERlY2ltYWw6IHBhcnNlRmxvYXQoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCkgfTtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7XG5cdFx0XHRcdFx0dHlwZTogXCJFbnVtTWVtYmVyXCIsXG5cdFx0XHRcdFx0RW51bU1lbWJlcjpcblx0XHRcdFx0XHRcdHRoaXMubWFwTmFtZVRvQWxpYXMoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlci5zcGxpdChcIi9cIilbMF0pICsgXCIvXCIgKyBhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVsxXVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFubm90YXRpb25PYmplY3QpKSB7XG5cdFx0XHRcdGlzQ29sbGVjdGlvbiA9IHRydWU7XG5cdFx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiA9IGFubm90YXRpb25PYmplY3QubWFwKChzdWJBbm5vdGF0aW9uT2JqZWN0LCBzdWJBbm5vdGF0aW9uSW5kZXgpID0+XG5cdFx0XHRcdFx0dGhpcy5wYXJzZUFubm90YXRpb25PYmplY3QoXG5cdFx0XHRcdFx0XHRzdWJBbm5vdGF0aW9uT2JqZWN0LFxuXHRcdFx0XHRcdFx0Y3VycmVudEFubm90YXRpb25UYXJnZXQgKyBcIi9cIiArIHN1YkFubm90YXRpb25JbmRleCxcblx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRQcm9wZXJ0eVBhdGhcIikpIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlBhdGhcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiKSkge1xuXHRcdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQW5ub3RhdGlvblBhdGhcIikpIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBbm5vdGF0aW9uUGF0aFwiO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkT3JcIikpIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJPclwiO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRFcVwiKSkge1xuXHRcdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkVxXCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5lXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTmVcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTm90XCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTm90XCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEd0XCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiR3RcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkR2VcIikpIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJHZVwiO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRMdFwiKSkge1xuXHRcdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkx0XCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJExlXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTGVcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQW5kXCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5kXCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFwcGx5XCIpKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQXBwbHlcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0WzBdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJTdHJpbmdcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHJlY29yZDogQW5ub3RhdGlvblJlY29yZCA9IHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlczogW11cblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKGFubm90YXRpb25PYmplY3QuJFR5cGUpIHtcblx0XHRcdFx0XHRjb25zdCB0eXBlVmFsdWUgPSBhbm5vdGF0aW9uT2JqZWN0LiRUeXBlO1xuXHRcdFx0XHRcdHJlY29yZC50eXBlID0gYCR7dHlwZVZhbHVlfWA7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IGFueVtdID0gW107XG5cdFx0XHRcdE9iamVjdC5rZXlzKGFubm90YXRpb25PYmplY3QpLmZvckVhY2gocHJvcGVydHlLZXkgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eUtleSAhPT0gXCIkVHlwZVwiICYmICFwcm9wZXJ0eUtleS5zdGFydHNXaXRoKFwiQFwiKSkge1xuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXMucHVzaChcblx0XHRcdFx0XHRcdFx0dGhpcy5wYXJzZVByb3BlcnR5VmFsdWUoXG5cdFx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdFtwcm9wZXJ0eUtleV0sXG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlLZXksXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudEFubm90YXRpb25UYXJnZXQsXG5cdFx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbkxpc3RzLFxuXHRcdFx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5S2V5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG5cdFx0XHRcdFx0XHQvLyBBbm5vdGF0aW9uIG9mIHJlY29yZFxuXHRcdFx0XHRcdFx0dGhpcy5jcmVhdGVBbm5vdGF0aW9uTGlzdHMoXG5cdFx0XHRcdFx0XHRcdHsgW3Byb3BlcnR5S2V5XTogYW5ub3RhdGlvbk9iamVjdFtwcm9wZXJ0eUtleV0gfSxcblx0XHRcdFx0XHRcdFx0Y3VycmVudEFubm90YXRpb25UYXJnZXQsXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdFx0b0NhcGFiaWxpdGllc1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZWNvcmQucHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblx0XHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC5yZWNvcmQgPSByZWNvcmQ7XG5cdFx0XHR9XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmlzQ29sbGVjdGlvbiA9IGlzQ29sbGVjdGlvbjtcblx0XHRcdGN1cnJlbnRPdXRBbm5vdGF0aW9uT2JqZWN0LmFubm90YXRpb25zLnB1c2gocGFyc2VkQW5ub3RhdGlvbk9iamVjdCk7XG5cdFx0fSk7XG5cdH0sXG5cdHBhcnNlUHJvcGVydHkoXG5cdFx0b01ldGFNb2RlbDogYW55LFxuXHRcdGVudGl0eVR5cGVPYmplY3Q6IEVudGl0eVR5cGUgfCBDb21wbGV4VHlwZSxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRhbm5vdGF0aW9uTGlzdHM6IEFubm90YXRpb25MaXN0W10sXG5cdFx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcblx0KTogUHJvcGVydHkge1xuXHRcdGNvbnN0IHByb3BlcnR5QW5ub3RhdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtwcm9wZXJ0eU5hbWV9QGApO1xuXHRcdGNvbnN0IHByb3BlcnR5RGVmaW5pdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtwcm9wZXJ0eU5hbWV9YCk7XG5cblx0XHRjb25zdCBwcm9wZXJ0eU9iamVjdDogUHJvcGVydHkgPSB7XG5cdFx0XHRfdHlwZTogXCJQcm9wZXJ0eVwiLFxuXHRcdFx0bmFtZTogcHJvcGVydHlOYW1lLFxuXHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtwcm9wZXJ0eU5hbWV9YCxcblx0XHRcdHR5cGU6IHByb3BlcnR5RGVmaW5pdGlvbi4kVHlwZSxcblx0XHRcdG1heExlbmd0aDogcHJvcGVydHlEZWZpbml0aW9uLiRNYXhMZW5ndGgsXG5cdFx0XHRwcmVjaXNpb246IHByb3BlcnR5RGVmaW5pdGlvbi4kUHJlY2lzaW9uLFxuXHRcdFx0c2NhbGU6IHByb3BlcnR5RGVmaW5pdGlvbi4kU2NhbGUsXG5cdFx0XHRudWxsYWJsZTogcHJvcGVydHlEZWZpbml0aW9uLiROdWxsYWJsZVxuXHRcdH07XG5cblx0XHR0aGlzLmNyZWF0ZUFubm90YXRpb25MaXN0cyhwcm9wZXJ0eUFubm90YXRpb24sIHByb3BlcnR5T2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZSwgYW5ub3RhdGlvbkxpc3RzLCBvQ2FwYWJpbGl0aWVzKTtcblxuXHRcdHJldHVybiBwcm9wZXJ0eU9iamVjdDtcblx0fSxcblx0cGFyc2VOYXZpZ2F0aW9uUHJvcGVydHkoXG5cdFx0b01ldGFNb2RlbDogYW55LFxuXHRcdGVudGl0eVR5cGVPYmplY3Q6IEVudGl0eVR5cGUgfCBDb21wbGV4VHlwZSxcblx0XHRuYXZQcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRhbm5vdGF0aW9uTGlzdHM6IEFubm90YXRpb25MaXN0W10sXG5cdFx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcblx0KTogVjROYXZpZ2F0aW9uUHJvcGVydHkge1xuXHRcdGNvbnN0IG5hdlByb3BlcnR5QW5ub3RhdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtuYXZQcm9wZXJ0eU5hbWV9QGApO1xuXHRcdGNvbnN0IG5hdlByb3BlcnR5RGVmaW5pdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtuYXZQcm9wZXJ0eU5hbWV9YCk7XG5cblx0XHRsZXQgcmVmZXJlbnRpYWxDb25zdHJhaW50OiBSZWZlcmVudGlhbENvbnN0cmFpbnRbXSA9IFtdO1xuXHRcdGlmIChuYXZQcm9wZXJ0eURlZmluaXRpb24uJFJlZmVyZW50aWFsQ29uc3RyYWludCkge1xuXHRcdFx0cmVmZXJlbnRpYWxDb25zdHJhaW50ID0gT2JqZWN0LmtleXMobmF2UHJvcGVydHlEZWZpbml0aW9uLiRSZWZlcmVudGlhbENvbnN0cmFpbnQpLm1hcChzb3VyY2VQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdHNvdXJjZVR5cGVOYW1lOiBlbnRpdHlUeXBlT2JqZWN0Lm5hbWUsXG5cdFx0XHRcdFx0c291cmNlUHJvcGVydHk6IHNvdXJjZVByb3BlcnR5TmFtZSxcblx0XHRcdFx0XHR0YXJnZXRUeXBlTmFtZTogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRUeXBlLFxuXHRcdFx0XHRcdHRhcmdldFByb3BlcnR5OiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJFJlZmVyZW50aWFsQ29uc3RyYWludFtzb3VyY2VQcm9wZXJ0eU5hbWVdXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnR5OiBWNE5hdmlnYXRpb25Qcm9wZXJ0eSA9IHtcblx0XHRcdF90eXBlOiBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiLFxuXHRcdFx0bmFtZTogbmF2UHJvcGVydHlOYW1lLFxuXHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtlbnRpdHlUeXBlT2JqZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZX0vJHtuYXZQcm9wZXJ0eU5hbWV9YCxcblx0XHRcdHBhcnRuZXI6IG5hdlByb3BlcnR5RGVmaW5pdGlvbi4kUGFydG5lcixcblx0XHRcdGlzQ29sbGVjdGlvbjogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRpc0NvbGxlY3Rpb24gPyBuYXZQcm9wZXJ0eURlZmluaXRpb24uJGlzQ29sbGVjdGlvbiA6IGZhbHNlLFxuXHRcdFx0Y29udGFpbnNUYXJnZXQ6IG5hdlByb3BlcnR5RGVmaW5pdGlvbi4kQ29udGFpbnNUYXJnZXQsXG5cdFx0XHR0YXJnZXRUeXBlTmFtZTogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRUeXBlLFxuXHRcdFx0cmVmZXJlbnRpYWxDb25zdHJhaW50XG5cdFx0fTtcblxuXHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKG5hdlByb3BlcnR5QW5ub3RhdGlvbiwgbmF2aWdhdGlvblByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZSwgYW5ub3RhdGlvbkxpc3RzLCBvQ2FwYWJpbGl0aWVzKTtcblxuXHRcdHJldHVybiBuYXZpZ2F0aW9uUHJvcGVydHk7XG5cdH0sXG5cdHBhcnNlRW50aXR5U2V0KFxuXHRcdG9NZXRhTW9kZWw6IGFueSxcblx0XHRlbnRpdHlTZXROYW1lOiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvbkxpc3RzOiBBbm5vdGF0aW9uTGlzdFtdLFxuXHRcdGVudGl0eUNvbnRhaW5lck5hbWU6IHN0cmluZyxcblx0XHRvQ2FwYWJpbGl0aWVzOiBFbnZpcm9ubWVudENhcGFiaWxpdGllc1xuXHQpOiBFbnRpdHlTZXQge1xuXHRcdGNvbnN0IGVudGl0eVNldERlZmluaXRpb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7ZW50aXR5U2V0TmFtZX1gKTtcblx0XHRjb25zdCBlbnRpdHlTZXRBbm5vdGF0aW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke2VudGl0eVNldE5hbWV9QGApO1xuXHRcdGNvbnN0IGVudGl0eVNldE9iamVjdDogRW50aXR5U2V0ID0ge1xuXHRcdFx0X3R5cGU6IFwiRW50aXR5U2V0XCIsXG5cdFx0XHRuYW1lOiBlbnRpdHlTZXROYW1lLFxuXHRcdFx0bmF2aWdhdGlvblByb3BlcnR5QmluZGluZzoge30sXG5cdFx0XHRlbnRpdHlUeXBlTmFtZTogZW50aXR5U2V0RGVmaW5pdGlvbi4kVHlwZSxcblx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7ZW50aXR5Q29udGFpbmVyTmFtZX0vJHtlbnRpdHlTZXROYW1lfWBcblx0XHR9O1xuXHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKGVudGl0eVNldEFubm90YXRpb24sIGVudGl0eVNldE9iamVjdC5mdWxseVF1YWxpZmllZE5hbWUsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0cmV0dXJuIGVudGl0eVNldE9iamVjdDtcblx0fSxcblxuXHRwYXJzZVNpbmdsZXRvbihcblx0XHRvTWV0YU1vZGVsOiBhbnksXG5cdFx0c2luZ2xldG9uTmFtZTogc3RyaW5nLFxuXHRcdGFubm90YXRpb25MaXN0czogQW5ub3RhdGlvbkxpc3RbXSxcblx0XHRlbnRpdHlDb250YWluZXJOYW1lOiBzdHJpbmcsXG5cdFx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcblx0KTogU2luZ2xldG9uIHtcblx0XHRjb25zdCBzaW5nbGV0b25EZWZpbml0aW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3NpbmdsZXRvbk5hbWV9YCk7XG5cdFx0Y29uc3Qgc2luZ2xldG9uQW5ub3RhdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzaW5nbGV0b25OYW1lfUBgKTtcblx0XHRjb25zdCBzaW5nbGV0b25PYmplY3Q6IFNpbmdsZXRvbiA9IHtcblx0XHRcdF90eXBlOiBcIlNpbmdsZXRvblwiLFxuXHRcdFx0bmFtZTogc2luZ2xldG9uTmFtZSxcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmc6IHt9LFxuXHRcdFx0dHlwZU5hbWU6IHNpbmdsZXRvbkRlZmluaXRpb24uJFR5cGUsXG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGAke2VudGl0eUNvbnRhaW5lck5hbWV9LyR7c2luZ2xldG9uTmFtZX1gLFxuXHRcdFx0bnVsbGFibGU6IHRydWVcblx0XHR9O1xuXHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKHNpbmdsZXRvbkFubm90YXRpb24sIHNpbmdsZXRvbk9iamVjdC5mdWxseVF1YWxpZmllZE5hbWUsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0cmV0dXJuIHNpbmdsZXRvbk9iamVjdDtcblx0fSxcblxuXHRwYXJzZUVudGl0eVR5cGUoXG5cdFx0b01ldGFNb2RlbDogYW55LFxuXHRcdGVudGl0eVR5cGVOYW1lOiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvbkxpc3RzOiBBbm5vdGF0aW9uTGlzdFtdLFxuXHRcdG5hbWVzcGFjZTogc3RyaW5nLFxuXHRcdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG5cdCk6IEVudGl0eVR5cGUge1xuXHRcdGNvbnN0IGVudGl0eVR5cGVBbm5vdGF0aW9uID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke2VudGl0eVR5cGVOYW1lfUBgKTtcblx0XHRjb25zdCBlbnRpdHlUeXBlRGVmaW5pdGlvbiA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtlbnRpdHlUeXBlTmFtZX1gKTtcblxuXHRcdGNvbnN0IGVudGl0eUtleXM6IGFueSA9IGdldEVudGl0eUtleXMoZW50aXR5VHlwZURlZmluaXRpb24pO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0RW50aXR5S2V5cyhlbnRpdHlUeXBlRGVmaW5pdGlvbjogYW55KTogYW55IHtcblx0XHRcdGlmICghZW50aXR5VHlwZURlZmluaXRpb24uJEtleSAmJiBlbnRpdHlUeXBlRGVmaW5pdGlvbi4kQmFzZVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIGdldEVudGl0eUtleXMob01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke2VudGl0eVR5cGVEZWZpbml0aW9uLiRCYXNlVHlwZX1gKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZW50aXR5VHlwZURlZmluaXRpb24uJEtleSB8fCBbXTsgLy9oYW5kbGluZyBvZiBlbnRpdHkgdHlwZXMgd2l0aG91dCBrZXkgYXMgd2VsbCBhcyBiYXNldHlwZVxuXHRcdH1cblx0XHRjb25zdCBlbnRpdHlUeXBlT2JqZWN0OiBFbnRpdHlUeXBlID0ge1xuXHRcdFx0X3R5cGU6IFwiRW50aXR5VHlwZVwiLFxuXHRcdFx0bmFtZTogZW50aXR5VHlwZU5hbWUucmVwbGFjZShuYW1lc3BhY2UgKyBcIi5cIiwgXCJcIiksXG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGVudGl0eVR5cGVOYW1lLFxuXHRcdFx0a2V5czogW10sXG5cdFx0XHRlbnRpdHlQcm9wZXJ0aWVzOiBbXSxcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXVxuXHRcdH07XG5cblx0XHR0aGlzLmNyZWF0ZUFubm90YXRpb25MaXN0cyhlbnRpdHlUeXBlQW5ub3RhdGlvbiwgZW50aXR5VHlwZU9iamVjdC5mdWxseVF1YWxpZmllZE5hbWUsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0Y29uc3QgZW50aXR5UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGVudGl0eVR5cGVEZWZpbml0aW9uKVxuXHRcdFx0LmZpbHRlcihwcm9wZXJ0eU5hbWVPck5vdCA9PiB7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRLZXlcIiAmJiBwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRraW5kXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW50aXR5VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIlByb3BlcnR5XCI7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQubWFwKHByb3BlcnR5TmFtZSA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnBhcnNlUHJvcGVydHkob01ldGFNb2RlbCwgZW50aXR5VHlwZU9iamVjdCwgcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdFx0fSk7XG5cblx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGVudGl0eVR5cGVEZWZpbml0aW9uKVxuXHRcdFx0LmZpbHRlcihwcm9wZXJ0eU5hbWVPck5vdCA9PiB7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRLZXlcIiAmJiBwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRraW5kXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW50aXR5VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0Lm1hcChuYXZQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5wYXJzZU5hdmlnYXRpb25Qcm9wZXJ0eShvTWV0YU1vZGVsLCBlbnRpdHlUeXBlT2JqZWN0LCBuYXZQcm9wZXJ0eU5hbWUsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0XHR9KTtcblxuXHRcdGVudGl0eVR5cGVPYmplY3Qua2V5cyA9IGVudGl0eUtleXNcblx0XHRcdC5tYXAoKGVudGl0eUtleTogc3RyaW5nKSA9PiBlbnRpdHlQcm9wZXJ0aWVzLmZpbmQoKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gZW50aXR5S2V5KSlcblx0XHRcdC5maWx0ZXIoKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4gcHJvcGVydHkgIT09IHVuZGVmaW5lZCk7XG5cdFx0ZW50aXR5VHlwZU9iamVjdC5lbnRpdHlQcm9wZXJ0aWVzID0gZW50aXR5UHJvcGVydGllcztcblx0XHRlbnRpdHlUeXBlT2JqZWN0Lm5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gbmF2aWdhdGlvblByb3BlcnRpZXM7XG5cblx0XHRyZXR1cm4gZW50aXR5VHlwZU9iamVjdDtcblx0fSxcblx0cGFyc2VDb21wbGV4VHlwZShcblx0XHRvTWV0YU1vZGVsOiBhbnksXG5cdFx0Y29tcGxleFR5cGVOYW1lOiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvbkxpc3RzOiBBbm5vdGF0aW9uTGlzdFtdLFxuXHRcdG5hbWVzcGFjZTogc3RyaW5nLFxuXHRcdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG5cdCk6IENvbXBsZXhUeXBlIHtcblx0XHRjb25zdCBjb21wbGV4VHlwZUFubm90YXRpb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7Y29tcGxleFR5cGVOYW1lfUBgKTtcblx0XHRjb25zdCBjb21wbGV4VHlwZURlZmluaXRpb24gPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7Y29tcGxleFR5cGVOYW1lfWApO1xuXHRcdGNvbnN0IGNvbXBsZXhUeXBlT2JqZWN0OiBDb21wbGV4VHlwZSA9IHtcblx0XHRcdF90eXBlOiBcIkNvbXBsZXhUeXBlXCIsXG5cdFx0XHRuYW1lOiBjb21wbGV4VHlwZU5hbWUucmVwbGFjZShuYW1lc3BhY2UgKyBcIi5cIiwgXCJcIiksXG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGNvbXBsZXhUeXBlTmFtZSxcblx0XHRcdHByb3BlcnRpZXM6IFtdLFxuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdXG5cdFx0fTtcblxuXHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKGNvbXBsZXhUeXBlQW5ub3RhdGlvbiwgY29tcGxleFR5cGVPYmplY3QuZnVsbHlRdWFsaWZpZWROYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdGNvbnN0IGNvbXBsZXhUeXBlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGNvbXBsZXhUeXBlRGVmaW5pdGlvbilcblx0XHRcdC5maWx0ZXIocHJvcGVydHlOYW1lT3JOb3QgPT4ge1xuXHRcdFx0XHRpZiAocHJvcGVydHlOYW1lT3JOb3QgIT0gXCIkS2V5XCIgJiYgcHJvcGVydHlOYW1lT3JOb3QgIT0gXCIka2luZFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXhUeXBlRGVmaW5pdGlvbltwcm9wZXJ0eU5hbWVPck5vdF0uJGtpbmQgPT09IFwiUHJvcGVydHlcIjtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5tYXAocHJvcGVydHlOYW1lID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucGFyc2VQcm9wZXJ0eShvTWV0YU1vZGVsLCBjb21wbGV4VHlwZU9iamVjdCwgcHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdFx0fSk7XG5cblx0XHRjb21wbGV4VHlwZU9iamVjdC5wcm9wZXJ0aWVzID0gY29tcGxleFR5cGVQcm9wZXJ0aWVzO1xuXHRcdGNvbnN0IGNvbXBsZXhUeXBlTmF2aWdhdGlvblByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhjb21wbGV4VHlwZURlZmluaXRpb24pXG5cdFx0XHQuZmlsdGVyKHByb3BlcnR5TmFtZU9yTm90ID0+IHtcblx0XHRcdFx0aWYgKHByb3BlcnR5TmFtZU9yTm90ICE9IFwiJEtleVwiICYmIHByb3BlcnR5TmFtZU9yTm90ICE9IFwiJGtpbmRcIikge1xuXHRcdFx0XHRcdHJldHVybiBjb21wbGV4VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0Lm1hcChuYXZQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5wYXJzZU5hdmlnYXRpb25Qcm9wZXJ0eShvTWV0YU1vZGVsLCBjb21wbGV4VHlwZU9iamVjdCwgbmF2UHJvcGVydHlOYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdFx0fSk7XG5cdFx0Y29tcGxleFR5cGVPYmplY3QubmF2aWdhdGlvblByb3BlcnRpZXMgPSBjb21wbGV4VHlwZU5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xuXHRcdHJldHVybiBjb21wbGV4VHlwZU9iamVjdDtcblx0fSxcblx0cGFyc2VBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nLCBhY3Rpb25SYXdEYXRhOiBNZXRhTW9kZWxBY3Rpb24sIG5hbWVzcGFjZTogc3RyaW5nLCBlbnRpdHlDb250YWluZXJOYW1lOiBzdHJpbmcpOiBBY3Rpb24ge1xuXHRcdGxldCBhY3Rpb25FbnRpdHlUeXBlOiBzdHJpbmcgPSBcIlwiO1xuXHRcdGxldCBhY3Rpb25GUU4gPSBgJHthY3Rpb25OYW1lfWA7XG5cdFx0Y29uc3QgYWN0aW9uU2hvcnROYW1lID0gYWN0aW9uTmFtZS5zdWJzdHIobmFtZXNwYWNlLmxlbmd0aCArIDEpO1xuXHRcdGlmIChhY3Rpb25SYXdEYXRhLiRJc0JvdW5kKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyID0gYWN0aW9uUmF3RGF0YS4kUGFyYW1ldGVyWzBdO1xuXHRcdFx0YWN0aW9uRW50aXR5VHlwZSA9IGJpbmRpbmdQYXJhbWV0ZXIuJFR5cGU7XG5cdFx0XHRpZiAoYmluZGluZ1BhcmFtZXRlci4kaXNDb2xsZWN0aW9uID09PSB0cnVlKSB7XG5cdFx0XHRcdGFjdGlvbkZRTiA9IGAke2FjdGlvbk5hbWV9KENvbGxlY3Rpb24oJHthY3Rpb25FbnRpdHlUeXBlfSkpYDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFjdGlvbkZRTiA9IGAke2FjdGlvbk5hbWV9KCR7YWN0aW9uRW50aXR5VHlwZX0pYDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YWN0aW9uRlFOID0gYCR7ZW50aXR5Q29udGFpbmVyTmFtZX0vJHthY3Rpb25TaG9ydE5hbWV9YDtcblx0XHR9XG5cdFx0Y29uc3QgcGFyYW1ldGVycyA9IGFjdGlvblJhd0RhdGEuJFBhcmFtZXRlciB8fCBbXTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0X3R5cGU6IFwiQWN0aW9uXCIsXG5cdFx0XHRuYW1lOiBhY3Rpb25TaG9ydE5hbWUsXG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGFjdGlvbkZRTixcblx0XHRcdGlzQm91bmQ6IGFjdGlvblJhd0RhdGEuJElzQm91bmQsXG5cdFx0XHRzb3VyY2VUeXBlOiBhY3Rpb25FbnRpdHlUeXBlLFxuXHRcdFx0cmV0dXJuVHlwZTogYWN0aW9uUmF3RGF0YS4kUmV0dXJuVHlwZSA/IGFjdGlvblJhd0RhdGEuJFJldHVyblR5cGUuJFR5cGUgOiBcIlwiLFxuXHRcdFx0cGFyYW1ldGVyczogcGFyYW1ldGVycy5tYXAocGFyYW0gPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdF90eXBlOiBcIkFjdGlvblBhcmFtZXRlclwiLFxuXHRcdFx0XHRcdGlzRW50aXR5U2V0OiBwYXJhbS4kVHlwZSA9PT0gYWN0aW9uUmF3RGF0YS4kRW50aXR5U2V0UGF0aCxcblx0XHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGAke2FjdGlvbkZRTn0vJHtwYXJhbS4kTmFtZX1gLFxuXHRcdFx0XHRcdHR5cGU6IHBhcmFtLiRUeXBlXG5cdFx0XHRcdFx0Ly8gVE9ETyBtaXNzaW5nIHByb3BlcnRpZXMgP1xuXHRcdFx0XHR9O1xuXHRcdFx0fSlcblx0XHR9O1xuXHR9LFxuXHRwYXJzZUVudGl0eVR5cGVzKG9NZXRhTW9kZWw6IGFueSwgb0luQ2FwYWJpbGl0aWVzPzogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMpOiBQYXJzZXJPdXRwdXQge1xuXHRcdGxldCBvQ2FwYWJpbGl0aWVzOiBFbnZpcm9ubWVudENhcGFiaWxpdGllcztcblx0XHRpZiAoIW9JbkNhcGFiaWxpdGllcykge1xuXHRcdFx0b0NhcGFiaWxpdGllcyA9IERlZmF1bHRFbnZpcm9ubWVudENhcGFiaWxpdGllcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0NhcGFiaWxpdGllcyA9IG9JbkNhcGFiaWxpdGllcztcblx0XHR9XG5cdFx0Y29uc3Qgb01ldGFNb2RlbERhdGEgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi8kXCIpO1xuXHRcdGNvbnN0IG9FbnRpdHlTZXRzID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIpO1xuXHRcdGxldCBhbm5vdGF0aW9uTGlzdHM6IEFubm90YXRpb25MaXN0W10gPSBbXTtcblx0XHRjb25zdCBlbnRpdHlUeXBlczogRW50aXR5VHlwZVtdID0gW107XG5cdFx0Y29uc3QgZW50aXR5U2V0czogRW50aXR5U2V0W10gPSBbXTtcblx0XHRjb25zdCBzaW5nbGV0b25zOiBTaW5nbGV0b25bXSA9IFtdO1xuXHRcdGNvbnN0IGNvbXBsZXhUeXBlczogQ29tcGxleFR5cGVbXSA9IFtdO1xuXHRcdGNvbnN0IGVudGl0eUNvbnRhaW5lck5hbWUgPSBvTWV0YU1vZGVsRGF0YS4kRW50aXR5Q29udGFpbmVyO1xuXHRcdGxldCBuYW1lc3BhY2UgPSBcIlwiO1xuXHRcdGNvbnN0IHNjaGVtYUtleXMgPSBPYmplY3Qua2V5cyhvTWV0YU1vZGVsRGF0YSkuZmlsdGVyKG1ldGFtb2RlbEtleSA9PiBvTWV0YU1vZGVsRGF0YVttZXRhbW9kZWxLZXldLiRraW5kID09PSBcIlNjaGVtYVwiKTtcblx0XHRpZiAoc2NoZW1hS2V5cyAmJiBzY2hlbWFLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRcdG5hbWVzcGFjZSA9IHNjaGVtYUtleXNbMF0uc3Vic3RyKDAsIHNjaGVtYUtleXNbMF0ubGVuZ3RoIC0gMSk7XG5cdFx0fSBlbHNlIGlmIChlbnRpdHlUeXBlcyAmJiBlbnRpdHlUeXBlcy5sZW5ndGgpIHtcblx0XHRcdG5hbWVzcGFjZSA9IGVudGl0eVR5cGVzWzBdLmZ1bGx5UXVhbGlmaWVkTmFtZS5yZXBsYWNlKGVudGl0eVR5cGVzWzBdLm5hbWUsIFwiXCIpO1xuXHRcdFx0bmFtZXNwYWNlID0gbmFtZXNwYWNlLnN1YnN0cigwLCBuYW1lc3BhY2UubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXHRcdE9iamVjdC5rZXlzKG9NZXRhTW9kZWxEYXRhKVxuXHRcdFx0LmZpbHRlcihlbnRpdHlUeXBlTmFtZSA9PiB7XG5cdFx0XHRcdHJldHVybiBlbnRpdHlUeXBlTmFtZSAhPT0gXCIka2luZFwiICYmIG9NZXRhTW9kZWxEYXRhW2VudGl0eVR5cGVOYW1lXS4ka2luZCA9PT0gXCJFbnRpdHlUeXBlXCI7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goZW50aXR5VHlwZU5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gdGhpcy5wYXJzZUVudGl0eVR5cGUob01ldGFNb2RlbCwgZW50aXR5VHlwZU5hbWUsIGFubm90YXRpb25MaXN0cywgbmFtZXNwYWNlLCBvQ2FwYWJpbGl0aWVzKTtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgYXJlIGZpbHRlciBmYWNldHMgZGVmaW5lZCBmb3IgdGhlIGVudGl0eVR5cGUgYW5kIGlmIHllcywgY2hlY2sgaWYgYWxsIG9mIHRoZW0gaGF2ZSBhbiBJRFxuXHRcdFx0XHQvLyBUaGUgSUQgaXMgb3B0aW9uYWwsIGJ1dCBpdCBpcyBpbnRlcm5hbGx5IHRha2VuIGZvciBncm91cGluZyBmaWx0ZXIgZmllbGRzIGFuZCBpZiBpdCdzIG5vdCBwcmVzZW50XG5cdFx0XHRcdC8vIGEgZmFsbGJhY2sgSUQgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGhlcmUuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdICYmXG5cdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWx0ZXJGYWNldHNcIl1cblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWx0ZXJGYWNldHNcIl0uZm9yRWFjaChcblx0XHRcdFx0XHRcdChmaWx0ZXJGYWNldEFubm90YXRpb246IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRmaWx0ZXJGYWNldEFubm90YXRpb24uSUQgPSBmaWx0ZXJGYWNldEFubm90YXRpb24uSUQgfHwgZ2VuZXJhdGUoW3sgRmFjZXQ6IGZpbHRlckZhY2V0QW5ub3RhdGlvbiB9XSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpbHRlckZhY2V0c1wiOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpbHRlckZhY2V0c1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdFx0XHRvQ2FwYWJpbGl0aWVzXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaChlbnRpdHlQcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB7fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0XCJdKSB7XG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXVtcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0XCJdID0ge1xuXHRcdFx0XHRcdFx0XHQkVHlwZTogXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIixcblx0XHRcdFx0XHRcdFx0VmFsdWU6IHsgJFBhdGg6IGVudGl0eVByb3BlcnR5Lm5hbWUgfVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRGVmYXVsdFwiOlxuXHRcdFx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV1bXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZERlZmF1bHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRlbnRpdHlQcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdFx0b0NhcGFiaWxpdGllc1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRlbnRpdHlUeXBlcy5wdXNoKGVudGl0eVR5cGUpO1xuXHRcdFx0fSk7XG5cdFx0T2JqZWN0LmtleXMob0VudGl0eVNldHMpXG5cdFx0XHQuZmlsdGVyKGVudGl0eVNldE5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZW50aXR5U2V0TmFtZSAhPT0gXCIka2luZFwiICYmIG9FbnRpdHlTZXRzW2VudGl0eVNldE5hbWVdLiRraW5kID09PSBcIkVudGl0eVNldFwiO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKGVudGl0eVNldE5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXQgPSB0aGlzLnBhcnNlRW50aXR5U2V0KG9NZXRhTW9kZWwsIGVudGl0eVNldE5hbWUsIGFubm90YXRpb25MaXN0cywgZW50aXR5Q29udGFpbmVyTmFtZSwgb0NhcGFiaWxpdGllcyk7XG5cdFx0XHRcdGVudGl0eVNldHMucHVzaChlbnRpdHlTZXQpO1xuXHRcdFx0fSk7XG5cdFx0T2JqZWN0LmtleXMob0VudGl0eVNldHMpXG5cdFx0XHQuZmlsdGVyKHNpbmdsZXRvbk5hbWUgPT4ge1xuXHRcdFx0XHRyZXR1cm4gc2luZ2xldG9uTmFtZSAhPT0gXCIka2luZFwiICYmIG9FbnRpdHlTZXRzW3NpbmdsZXRvbk5hbWVdLiRraW5kID09PSBcIlNpbmdsZXRvblwiO1xuXHRcdFx0fSlcblx0XHRcdC5mb3JFYWNoKHNpbmdsZXRvbk5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBzaW5nbGV0b24gPSB0aGlzLnBhcnNlU2luZ2xldG9uKG9NZXRhTW9kZWwsIHNpbmdsZXRvbk5hbWUsIGFubm90YXRpb25MaXN0cywgZW50aXR5Q29udGFpbmVyTmFtZSwgb0NhcGFiaWxpdGllcyk7XG5cdFx0XHRcdHNpbmdsZXRvbnMucHVzaChzaW5nbGV0b24pO1xuXHRcdFx0fSk7XG5cdFx0T2JqZWN0LmtleXMob01ldGFNb2RlbERhdGEpXG5cdFx0XHQuZmlsdGVyKGNvbXBsZXhUeXBlTmFtZSA9PiB7XG5cdFx0XHRcdHJldHVybiBjb21wbGV4VHlwZU5hbWUgIT09IFwiJGtpbmRcIiAmJiBvTWV0YU1vZGVsRGF0YVtjb21wbGV4VHlwZU5hbWVdLiRraW5kID09PSBcIkNvbXBsZXhUeXBlXCI7XG5cdFx0XHR9KVxuXHRcdFx0LmZvckVhY2goY29tcGxleFR5cGVOYW1lID0+IHtcblx0XHRcdFx0Y29uc3QgY29tcGxleFR5cGUgPSB0aGlzLnBhcnNlQ29tcGxleFR5cGUob01ldGFNb2RlbCwgY29tcGxleFR5cGVOYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG5hbWVzcGFjZSwgb0NhcGFiaWxpdGllcyk7XG5cdFx0XHRcdGNvbXBsZXhUeXBlcy5wdXNoKGNvbXBsZXhUeXBlKTtcblx0XHRcdH0pO1xuXHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXJOYW1lID0gT2JqZWN0LmtleXMob01ldGFNb2RlbERhdGEpLmZpbmQoZW50aXR5Q29udGFpbmVyTmFtZSA9PiB7XG5cdFx0XHRyZXR1cm4gZW50aXR5Q29udGFpbmVyTmFtZSAhPT0gXCIka2luZFwiICYmIG9NZXRhTW9kZWxEYXRhW2VudGl0eUNvbnRhaW5lck5hbWVdLiRraW5kID09PSBcIkVudGl0eUNvbnRhaW5lclwiO1xuXHRcdH0pO1xuXHRcdGxldCBlbnRpdHlDb250YWluZXI6IEVudGl0eUNvbnRhaW5lciA9IHt9O1xuXHRcdGlmIChvRW50aXR5Q29udGFpbmVyTmFtZSkge1xuXHRcdFx0ZW50aXR5Q29udGFpbmVyID0ge1xuXHRcdFx0XHRuYW1lOiBvRW50aXR5Q29udGFpbmVyTmFtZS5yZXBsYWNlKG5hbWVzcGFjZSArIFwiLlwiLCBcIlwiKSxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBvRW50aXR5Q29udGFpbmVyTmFtZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0ZW50aXR5U2V0cy5mb3JFYWNoKGVudGl0eVNldCA9PiB7XG5cdFx0XHRjb25zdCBuYXZQcm9wZXJ0eUJpbmRpbmdzID0gb01ldGFNb2RlbERhdGFbZW50aXR5Q29udGFpbmVyTmFtZV1bZW50aXR5U2V0Lm5hbWVdLiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nO1xuXHRcdFx0aWYgKG5hdlByb3BlcnR5QmluZGluZ3MpIHtcblx0XHRcdFx0T2JqZWN0LmtleXMobmF2UHJvcGVydHlCaW5kaW5ncykuZm9yRWFjaChuYXZQcm9wTmFtZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5U2V0ID0gZW50aXR5U2V0cy5maW5kKGVudGl0eVNldE5hbWUgPT4gZW50aXR5U2V0TmFtZS5uYW1lID09PSBuYXZQcm9wZXJ0eUJpbmRpbmdzW25hdlByb3BOYW1lXSk7XG5cdFx0XHRcdFx0aWYgKHRhcmdldEVudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0ZW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdbbmF2UHJvcE5hbWVdID0gdGFyZ2V0RW50aXR5U2V0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRjb25zdCBhY3Rpb25zOiBBY3Rpb25bXSA9IE9iamVjdC5rZXlzKG9NZXRhTW9kZWxEYXRhKVxuXHRcdFx0LmZpbHRlcihrZXkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShvTWV0YU1vZGVsRGF0YVtrZXldKSAmJiBvTWV0YU1vZGVsRGF0YVtrZXldLmxlbmd0aCA+IDAgJiYgb01ldGFNb2RlbERhdGFba2V5XVswXS4ka2luZCA9PT0gXCJBY3Rpb25cIjtcblx0XHRcdH0pXG5cdFx0XHQucmVkdWNlKChvdXRBY3Rpb25zOiBBY3Rpb25bXSwgYWN0aW9uTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBhY3Rpb25zID0gb01ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV07XG5cdFx0XHRcdGFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBNZXRhTW9kZWxBY3Rpb24pID0+IHtcblx0XHRcdFx0XHRvdXRBY3Rpb25zLnB1c2godGhpcy5wYXJzZUFjdGlvbihhY3Rpb25OYW1lLCBhY3Rpb24sIG5hbWVzcGFjZSwgZW50aXR5Q29udGFpbmVyTmFtZSkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIG91dEFjdGlvbnM7XG5cdFx0XHR9LCBbXSk7XG5cdFx0Ly8gRklYTUUgQ3JhcHB5IGNvZGUgdG8gZGVhbCB3aXRoIGFubm90YXRpb25zIGZvciBmdW5jdGlvbnNcblx0XHRjb25zdCBhbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9ucztcblx0XHRjb25zdCBhY3Rpb25Bbm5vdGF0aW9ucyA9IE9iamVjdC5rZXlzKGFubm90YXRpb25zKS5maWx0ZXIodGFyZ2V0ID0+IHRhcmdldC5pbmRleE9mKFwiKFwiKSAhPT0gLTEpO1xuXHRcdGFjdGlvbkFubm90YXRpb25zLmZvckVhY2godGFyZ2V0ID0+IHtcblx0XHRcdHRoaXMuY3JlYXRlQW5ub3RhdGlvbkxpc3RzKG9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9uc1t0YXJnZXRdLCB0YXJnZXQsIGFubm90YXRpb25MaXN0cywgb0NhcGFiaWxpdGllcyk7XG5cdFx0fSk7XG5cdFx0Y29uc3QgYWN0aW9uc05hbWVXaXRob3V0T3ZlcmxvYWQgPSBhY3Rpb25zLm1hcChhY3Rpb24gPT4gYWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIihcIilbMF0pO1xuXHRcdGFjdGlvbnNOYW1lV2l0aG91dE92ZXJsb2FkLmZvckVhY2goYWN0aW9uTmFtZSA9PiB7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkoYWN0aW9uTmFtZSkpIHtcblx0XHRcdFx0dGhpcy5jcmVhdGVBbm5vdGF0aW9uTGlzdHMob01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2FjdGlvbk5hbWVdLCBhY3Rpb25OYW1lLCBhbm5vdGF0aW9uTGlzdHMsIG9DYXBhYmlsaXRpZXMpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGNvbnN0IGVudGl0eUNvbnRhaW5lckFubm90YXRpb25zID0gYW5ub3RhdGlvbnNbZW50aXR5Q29udGFpbmVyTmFtZV07XG5cblx0XHQvLyBSZXRyaWV2ZSBFbnRpdHkgQ29udGFpbmVyIGFubm90YXRpb25zXG5cdFx0aWYgKGVudGl0eUNvbnRhaW5lckFubm90YXRpb25zKSB7XG5cdFx0XHR0aGlzLmNyZWF0ZUFubm90YXRpb25MaXN0cyhlbnRpdHlDb250YWluZXJBbm5vdGF0aW9ucywgZW50aXR5Q29udGFpbmVyTmFtZSwgYW5ub3RhdGlvbkxpc3RzLCBvQ2FwYWJpbGl0aWVzKTtcblx0XHR9XG5cdFx0Ly8gU29ydCBieSB0YXJnZXQgbGVuZ3RoXG5cdFx0YW5ub3RhdGlvbkxpc3RzID0gYW5ub3RhdGlvbkxpc3RzLnNvcnQoKGEsIGIpID0+IChhLnRhcmdldC5sZW5ndGggPj0gYi50YXJnZXQubGVuZ3RoID8gMSA6IC0xKSk7XG5cdFx0Y29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlW10gPSBbXTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWRlbnRpZmljYXRpb246IFwibWV0YW1vZGVsUmVzdWx0XCIsXG5cdFx0XHR2ZXJzaW9uOiBcIjQuMFwiLFxuXHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdGVudGl0eUNvbnRhaW5lcixcblx0XHRcdFx0ZW50aXR5U2V0cyxcblx0XHRcdFx0ZW50aXR5VHlwZXMsXG5cdFx0XHRcdGNvbXBsZXhUeXBlcyxcblx0XHRcdFx0c2luZ2xldG9ucyxcblx0XHRcdFx0YXNzb2NpYXRpb25zOiBbXSxcblx0XHRcdFx0YWN0aW9ucyxcblx0XHRcdFx0bmFtZXNwYWNlLFxuXHRcdFx0XHRhbm5vdGF0aW9uczoge1xuXHRcdFx0XHRcdFwibWV0YW1vZGVsUmVzdWx0XCI6IGFubm90YXRpb25MaXN0c1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0cmVmZXJlbmNlczogcmVmZXJlbmNlc1xuXHRcdH07XG5cdH1cbn07XG5cbmNvbnN0IG1NZXRhTW9kZWxNYXA6IFJlY29yZDxzdHJpbmcsIFBhcnNlck91dHB1dD4gPSB7fTtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBPRGF0YU1ldGFNb2RlbCBpbnRvIGFub3RoZXIgZm9ybWF0IHRoYXQgYWxsb3cgZm9yIGVhc3kgbWFuaXB1bGF0aW9uIG9mIHRoZSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09EYXRhTWV0YU1vZGVsfSBvTWV0YU1vZGVsIFRoZSBjdXJyZW50IG9EYXRhTWV0YU1vZGVsXG4gKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHtDb252ZXJ0ZXJPdXRwdXR9IEFuIG9iamVjdCBjb250YWluaW5nIG9iamVjdCBsaWtlIGFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgb0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogQ29udmVydGVyT3V0cHV0IHtcblx0Y29uc3Qgc01ldGFNb2RlbElkID0gKG9NZXRhTW9kZWwgYXMgYW55KS5pZDtcblx0aWYgKCFtTWV0YU1vZGVsTWFwLmhhc093blByb3BlcnR5KHNNZXRhTW9kZWxJZCkpIHtcblx0XHRjb25zdCBwYXJzZWRPdXRwdXQgPSBNZXRhTW9kZWxDb252ZXJ0ZXIucGFyc2VFbnRpdHlUeXBlcyhvTWV0YU1vZGVsLCBvQ2FwYWJpbGl0aWVzKTtcblx0XHRtTWV0YU1vZGVsTWFwW3NNZXRhTW9kZWxJZF0gPSBBbm5vdGF0aW9uQ29udmVydGVyLmNvbnZlcnRUeXBlcyhwYXJzZWRPdXRwdXQpO1xuXHR9XG5cdHJldHVybiAobU1ldGFNb2RlbE1hcFtzTWV0YU1vZGVsSWRdIGFzIGFueSkgYXMgQ29udmVydGVyT3V0cHV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlTW9kZWxDYWNoZURhdGEob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpIHtcblx0ZGVsZXRlIG1NZXRhTW9kZWxNYXBbKG9NZXRhTW9kZWwgYXMgYW55KS5pZF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvTWV0YU1vZGVsQ29udGV4dDogQ29udGV4dCwgYkluY2x1ZGVWaXNpdGVkT2JqZWN0czogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcblx0Y29uc3Qgb0NvbnZlcnRlck91dHB1dCA9IGNvbnZlcnRUeXBlcygob01ldGFNb2RlbENvbnRleHQuZ2V0TW9kZWwoKSBhcyB1bmtub3duKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdGNvbnN0IHNQYXRoID0gb01ldGFNb2RlbENvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdGNvbnN0IGFQYXRoU3BsaXQgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdGxldCB0YXJnZXRFbnRpdHlTZXQ6IF9FbnRpdHlTZXQgPSBvQ29udmVydGVyT3V0cHV0LmVudGl0eVNldHMuZmluZChlbnRpdHlTZXQgPT4gZW50aXR5U2V0Lm5hbWUgPT09IGFQYXRoU3BsaXRbMV0pIGFzIF9FbnRpdHlTZXQ7XG5cdGxldCByZWxhdGl2ZVBhdGggPSBhUGF0aFNwbGl0LnNsaWNlKDIpLmpvaW4oXCIvXCIpO1xuXG5cdGNvbnN0IGxvY2FsT2JqZWN0czogYW55W10gPSBbdGFyZ2V0RW50aXR5U2V0XTtcblx0d2hpbGUgKHJlbGF0aXZlUGF0aCAmJiByZWxhdGl2ZVBhdGgubGVuZ3RoID4gMCAmJiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCIpKSB7XG5cdFx0bGV0IHJlbGF0aXZlU3BsaXQgPSByZWxhdGl2ZVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBpZHggPSAwO1xuXHRcdGxldCBjdXJyZW50RW50aXR5U2V0LCBzTmF2UHJvcFRvQ2hlY2s7XG5cblx0XHRyZWxhdGl2ZVNwbGl0ID0gcmVsYXRpdmVTcGxpdC5zbGljZSgxKTsgLy8gUmVtb3ZpbmcgXCIkTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiXG5cdFx0d2hpbGUgKCFjdXJyZW50RW50aXR5U2V0ICYmIHJlbGF0aXZlU3BsaXQubGVuZ3RoID4gaWR4ICYmIHJlbGF0aXZlU3BsaXRbaWR4XSAhPT0gXCIkTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiKSB7XG5cdFx0XHQvLyBGaW5kaW5nIHRoZSBjb3JyZWN0IGVudGl0eVNldCBmb3IgdGhlIG5hdmlnYWl0b24gcHJvcGVydHkgYmluZGluZyBleGFtcGxlOiBcIlNldC9fU2FsZXNPcmRlclwiXG5cdFx0XHRzTmF2UHJvcFRvQ2hlY2sgPSByZWxhdGl2ZVNwbGl0LnNsaWNlKDAsIGlkeCArIDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0Y3VycmVudEVudGl0eVNldCA9IHRhcmdldEVudGl0eVNldCAmJiB0YXJnZXRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tzTmF2UHJvcFRvQ2hlY2tdO1xuXHRcdFx0aWR4Kys7XG5cdFx0fVxuXHRcdGlmICghY3VycmVudEVudGl0eVNldCkge1xuXHRcdFx0Ly8gRmFsbCBiYWNrIHRvIFNpbmdsZSBuYXYgcHJvcCBpZiBlbnRpdHlTZXQgaXMgbm90IGZvdW5kLlxuXHRcdFx0c05hdlByb3BUb0NoZWNrID0gcmVsYXRpdmVTcGxpdFswXTtcblx0XHR9XG5cdFx0Y29uc3QgYU5hdlByb3BzID0gc05hdlByb3BUb0NoZWNrPy5zcGxpdChcIi9cIikgfHwgW107XG5cdFx0bGV0IHRhcmdldEVudGl0eVR5cGUgPSB0YXJnZXRFbnRpdHlTZXQgJiYgdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdFx0Zm9yIChjb25zdCBzTmF2UHJvcCBvZiBhTmF2UHJvcHMpIHtcblx0XHRcdC8vIFB1c2hpbmcgYWxsIG5hdiBwcm9wcyB0byB0aGUgdmlzaXRlZCBvYmplY3RzLiBleGFtcGxlOiBcIlNldFwiLCBcIl9TYWxlc09yZGVyXCIgZm9yIFwiU2V0L19TYWxlc09yZGVyXCIoaW4gTmF2aWdhdGlvblByb3BlcnR5QmluZGluZylcblx0XHRcdGNvbnN0IHRhcmdldE5hdlByb3AgPSB0YXJnZXRFbnRpdHlUeXBlICYmIHRhcmdldEVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZChuYXZQcm9wID0+IG5hdlByb3AubmFtZSA9PT0gc05hdlByb3ApO1xuXHRcdFx0aWYgKHRhcmdldE5hdlByb3ApIHtcblx0XHRcdFx0bG9jYWxPYmplY3RzLnB1c2godGFyZ2V0TmF2UHJvcCk7XG5cdFx0XHRcdHRhcmdldEVudGl0eVR5cGUgPSB0YXJnZXROYXZQcm9wLnRhcmdldFR5cGU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0dGFyZ2V0RW50aXR5U2V0ID1cblx0XHRcdCh0YXJnZXRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldCkgfHwgKHRhcmdldEVudGl0eVNldCAmJiB0YXJnZXRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tyZWxhdGl2ZVNwbGl0WzBdXSk7XG5cdFx0aWYgKHRhcmdldEVudGl0eVNldCkge1xuXHRcdFx0Ly8gUHVzaGluZyB0aGUgdGFyZ2V0IGVudGl0eVNldCB0byB2aXNpdGVkIG9iamVjdHNcblx0XHRcdGxvY2FsT2JqZWN0cy5wdXNoKHRhcmdldEVudGl0eVNldCk7XG5cdFx0fVxuXHRcdC8vIFJlLWNhbGN1bGF0aW5nIHRoZSByZWxhdGl2ZSBwYXRoXG5cdFx0cmVsYXRpdmVQYXRoID0gcmVsYXRpdmVTcGxpdC5zbGljZShhTmF2UHJvcHMubGVuZ3RoIHx8IDEpLmpvaW4oXCIvXCIpO1xuXHR9XG5cdGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIiRUeXBlXCIpKSB7XG5cdFx0Ly8gV2UncmUgYW55d2F5IGdvaW5nIHRvIGxvb2sgb24gdGhlIGVudGl0eVR5cGUuLi5cblx0XHRyZWxhdGl2ZVBhdGggPSBhUGF0aFNwbGl0LnNsaWNlKDMpLmpvaW4oXCIvXCIpO1xuXHR9XG5cdGlmICh0YXJnZXRFbnRpdHlTZXQgJiYgcmVsYXRpdmVQYXRoLmxlbmd0aCkge1xuXHRcdGNvbnN0IG9UYXJnZXQgPSB0YXJnZXRFbnRpdHlTZXQuZW50aXR5VHlwZS5yZXNvbHZlUGF0aChyZWxhdGl2ZVBhdGgsIGJJbmNsdWRlVmlzaXRlZE9iamVjdHMpO1xuXHRcdGlmIChvVGFyZ2V0KSB7XG5cdFx0XHRpZiAoYkluY2x1ZGVWaXNpdGVkT2JqZWN0cykge1xuXHRcdFx0XHRvVGFyZ2V0LnZpc2l0ZWRPYmplY3RzID0gbG9jYWxPYmplY3RzLmNvbmNhdChvVGFyZ2V0LnZpc2l0ZWRPYmplY3RzKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlICYmIHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLmFjdGlvbnMpIHtcblx0XHRcdC8vIGlmIHRhcmdldCBpcyBhbiBhY3Rpb24gb3IgYW4gYWN0aW9uIHBhcmFtZXRlclxuXHRcdFx0Y29uc3QgYWN0aW9ucyA9IHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlICYmIHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLmFjdGlvbnM7XG5cdFx0XHRjb25zdCByZWxhdGl2ZVNwbGl0ID0gcmVsYXRpdmVQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGlmIChhY3Rpb25zW3JlbGF0aXZlU3BsaXRbMF1dKSB7XG5cdFx0XHRcdGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNbcmVsYXRpdmVTcGxpdFswXV07XG5cdFx0XHRcdGlmIChyZWxhdGl2ZVNwbGl0WzFdICYmIGFjdGlvbi5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyYW1ldGVyTmFtZSA9IHJlbGF0aXZlU3BsaXRbMV07XG5cdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGFyYW1ldGVyID0gYWN0aW9uLnBhcmFtZXRlcnMuZmluZChwYXJhbWV0ZXIgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlci5mdWxseVF1YWxpZmllZE5hbWUuZW5kc1dpdGgoXCIvXCIgKyBwYXJhbWV0ZXJOYW1lKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0UGFyYW1ldGVyO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJlbGF0aXZlUGF0aC5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRyZXR1cm4gYWN0aW9uO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvVGFyZ2V0O1xuXHR9IGVsc2Uge1xuXHRcdGlmIChiSW5jbHVkZVZpc2l0ZWRPYmplY3RzKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXQ6IHRhcmdldEVudGl0eVNldCxcblx0XHRcdFx0dmlzaXRlZE9iamVjdHM6IGxvY2FsT2JqZWN0c1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhcmdldEVudGl0eVNldDtcblx0fVxufVxuXG50eXBlIENvbnZlcnRlck9iamVjdCA9IHtcblx0X3R5cGU6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFJlc29sdmVkVGFyZ2V0ID0ge1xuXHR0YXJnZXQ/OiBDb252ZXJ0ZXJPYmplY3Q7XG5cdHZpc2l0ZWRPYmplY3RzOiBDb252ZXJ0ZXJPYmplY3RbXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob01ldGFNb2RlbENvbnRleHQ6IENvbnRleHQsIG9FbnRpdHlTZXRNZXRhTW9kZWxDb250ZXh0PzogQ29udGV4dCk6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCBtZXRhTW9kZWxDb250ZXh0ID0gY29udmVydE1ldGFNb2RlbENvbnRleHQob01ldGFNb2RlbENvbnRleHQsIHRydWUpO1xuXHRsZXQgdGFyZ2V0RW50aXR5U2V0TG9jYXRpb247XG5cdGlmIChvRW50aXR5U2V0TWV0YU1vZGVsQ29udGV4dCAmJiBvRW50aXR5U2V0TWV0YU1vZGVsQ29udGV4dC5nZXRQYXRoKCkgIT09IFwiL1wiKSB7XG5cdFx0dGFyZ2V0RW50aXR5U2V0TG9jYXRpb24gPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQpO1xuXHR9XG5cdHJldHVybiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdEZyb21QYXRoKG1ldGFNb2RlbENvbnRleHQsIHRhcmdldEVudGl0eVNldExvY2F0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0RnJvbVBhdGgoXG5cdG1ldGFNb2RlbENvbnRleHQ6IFJlc29sdmVkVGFyZ2V0LFxuXHR0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbj86IERhdGFNb2RlbE9iamVjdFBhdGhcbik6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RzID0gbWV0YU1vZGVsQ29udGV4dC52aXNpdGVkT2JqZWN0cy5maWx0ZXIoXG5cdFx0KHZpc2l0ZWRPYmplY3Q6IGFueSkgPT4gdmlzaXRlZE9iamVjdCAmJiB2aXNpdGVkT2JqZWN0Lmhhc093blByb3BlcnR5KFwiX3R5cGVcIikgJiYgdmlzaXRlZE9iamVjdC5fdHlwZSAhPT0gXCJFbnRpdHlUeXBlXCJcblx0KTtcblx0aWYgKG1ldGFNb2RlbENvbnRleHQudGFyZ2V0ICYmIG1ldGFNb2RlbENvbnRleHQudGFyZ2V0Lmhhc093blByb3BlcnR5KFwiX3R5cGVcIikgJiYgbWV0YU1vZGVsQ29udGV4dC50YXJnZXQuX3R5cGUgIT09IFwiRW50aXR5VHlwZVwiKSB7XG5cdFx0ZGF0YU1vZGVsT2JqZWN0cy5wdXNoKG1ldGFNb2RlbENvbnRleHQudGFyZ2V0KTtcblx0fVxuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllczogX05hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdGNvbnN0IHJvb3RFbnRpdHlTZXQ6IF9FbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RzWzBdIGFzIF9FbnRpdHlTZXQ7XG5cdC8vIGN1cnJlbnRFbnRpdHlTZXQgY2FuIGJlIHVuZGVmaW5lZC5cblx0bGV0IGN1cnJlbnRFbnRpdHlTZXQ6IF9FbnRpdHlTZXQgfCB1bmRlZmluZWQgPSByb290RW50aXR5U2V0IGFzIF9FbnRpdHlTZXQ7XG5cdGxldCBjdXJyZW50RW50aXR5VHlwZTogX0VudGl0eVR5cGUgPSByb290RW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdGxldCBpID0gMTtcblx0bGV0IGN1cnJlbnRPYmplY3Q7XG5cdGxldCBuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHR3aGlsZSAoaSA8IGRhdGFNb2RlbE9iamVjdHMubGVuZ3RoKSB7XG5cdFx0Y3VycmVudE9iamVjdCA9IGRhdGFNb2RlbE9iamVjdHNbaSsrXTtcblx0XHRpZiAoY3VycmVudE9iamVjdC5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0bmF2aWdhdGVkUGF0aHMucHVzaChjdXJyZW50T2JqZWN0Lm5hbWUpO1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChjdXJyZW50T2JqZWN0IGFzIF9OYXZpZ2F0aW9uUHJvcGVydHkpO1xuXHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSAoY3VycmVudE9iamVjdCBhcyBfTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlO1xuXHRcdFx0aWYgKGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KG5hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpKSkge1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW2N1cnJlbnRPYmplY3QubmFtZV07XG5cdFx0XHRcdG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoY3VycmVudE9iamVjdC5fdHlwZSA9PT0gXCJFbnRpdHlTZXRcIikge1xuXHRcdFx0Y3VycmVudEVudGl0eVNldCA9IGN1cnJlbnRPYmplY3QgYXMgX0VudGl0eVNldDtcblx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID0gY3VycmVudEVudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRcdH1cblx0fVxuXG5cdGlmICh0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbiAmJiB0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbi5zdGFydGluZ0VudGl0eVNldCAhPT0gcm9vdEVudGl0eVNldCkge1xuXHRcdC8vIEluIGNhc2UgdGhlIGVudGl0eXNldCBpcyBub3Qgc3RhcnRpbmcgZnJvbSB0aGUgc2FtZSBsb2NhdGlvbiBpdCBtYXkgbWVhbiB0aGF0IHdlIGFyZSBkb2luZyB0b28gbXVjaCB3b3JrIGVhcmxpZXIgZm9yIHNvbWUgcmVhc29uXG5cdFx0Ly8gQXMgc3VjaCB3ZSBuZWVkIHRvIHJlZGVmaW5lIHRoZSBjb250ZXh0IHNvdXJjZSBmb3IgdGhlIHRhcmdldEVudGl0eVNldExvY2F0aW9uXG5cdFx0Y29uc3Qgc3RhcnRpbmdJbmRleCA9IGRhdGFNb2RlbE9iamVjdHMuaW5kZXhPZih0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbi5zdGFydGluZ0VudGl0eVNldCk7XG5cdFx0aWYgKHN0YXJ0aW5nSW5kZXggIT09IC0xKSB7XG5cdFx0XHQvLyBJZiBpdCdzIG5vdCBmb3VuZCBJIGRvbid0IGtub3cgd2hhdCB3ZSBjYW4gZG8gKHByb2JhYmx5IG5vdGhpbmcpXG5cdFx0XHRjb25zdCByZXF1aXJlZERhdGFNb2RlbE9iamVjdHMgPSBkYXRhTW9kZWxPYmplY3RzLnNsaWNlKDAsIHN0YXJ0aW5nSW5kZXgpO1xuXHRcdFx0dGFyZ2V0RW50aXR5U2V0TG9jYXRpb24uc3RhcnRpbmdFbnRpdHlTZXQgPSByb290RW50aXR5U2V0O1xuXHRcdFx0dGFyZ2V0RW50aXR5U2V0TG9jYXRpb24ubmF2aWdhdGlvblByb3BlcnRpZXMgPSByZXF1aXJlZERhdGFNb2RlbE9iamVjdHNcblx0XHRcdFx0LmZpbHRlcigob2JqZWN0OiBhbnkpID0+IG9iamVjdC5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIilcblx0XHRcdFx0LmNvbmNhdCh0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbi5uYXZpZ2F0aW9uUHJvcGVydGllcykgYXMgX05hdmlnYXRpb25Qcm9wZXJ0eVtdO1xuXHRcdH1cblx0fVxuXHRjb25zdCBvdXREYXRhTW9kZWxQYXRoID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiByb290RW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVNldDogY3VycmVudEVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlUeXBlOiBjdXJyZW50RW50aXR5VHlwZSxcblx0XHR0YXJnZXRPYmplY3Q6IG1ldGFNb2RlbENvbnRleHQudGFyZ2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLFxuXHRcdGNvbnRleHRMb2NhdGlvbjogdGFyZ2V0RW50aXR5U2V0TG9jYXRpb25cblx0fTtcblx0aWYgKCFvdXREYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbikge1xuXHRcdG91dERhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uID0gb3V0RGF0YU1vZGVsUGF0aDtcblx0fVxuXHRyZXR1cm4gb3V0RGF0YU1vZGVsUGF0aDtcbn1cbiJdfQ==
1348
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1ldGFNb2RlbENvbnZlcnRlci50cyJdLCJuYW1lcyI6WyJWT0NBQlVMQVJZX0FMSUFTIiwiRGVmYXVsdEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiQ2hhcnQiLCJNaWNyb0NoYXJ0IiwiVVNoZWxsIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiU2l0dWF0aW9ucyIsInBhcnNlUHJvcGVydHlWYWx1ZSIsImFubm90YXRpb25PYmplY3QiLCJwcm9wZXJ0eUtleSIsImN1cnJlbnRUYXJnZXQiLCJhbm5vdGF0aW9uc0xpc3RzIiwib0NhcGFiaWxpdGllcyIsInZhbHVlIiwiY3VycmVudFByb3BlcnR5VGFyZ2V0IiwidHlwZU9mQW5ub3RhdGlvbiIsInR5cGUiLCJOdWxsIiwiU3RyaW5nIiwiQm9vbCIsIkludCIsIkFycmF5IiwiaXNBcnJheSIsIkNvbGxlY3Rpb24iLCJtYXAiLCJzdWJBbm5vdGF0aW9uT2JqZWN0Iiwic3ViQW5ub3RhdGlvbk9iamVjdEluZGV4IiwicGFyc2VBbm5vdGF0aW9uT2JqZWN0IiwibGVuZ3RoIiwiaGFzT3duUHJvcGVydHkiLCIkUGF0aCIsInVuZGVmaW5lZCIsIlBhdGgiLCIkRGVjaW1hbCIsIkRlY2ltYWwiLCJwYXJzZUZsb2F0IiwiJFByb3BlcnR5UGF0aCIsIlByb3BlcnR5UGF0aCIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIiRJZiIsIklmIiwiJEFuZCIsIkFuZCIsIiRPciIsIk9yIiwiJE5vdCIsIk5vdCIsIiRFcSIsIkVxIiwiJE5lIiwiTmUiLCIkR3QiLCJHdCIsIiRHZSIsIkdlIiwiJEx0IiwiTHQiLCIkTGUiLCJMZSIsIiRBcHBseSIsIkFwcGx5IiwiRnVuY3Rpb24iLCIkRnVuY3Rpb24iLCIkQW5ub3RhdGlvblBhdGgiLCJBbm5vdGF0aW9uUGF0aCIsIiRFbnVtTWVtYmVyIiwiRW51bU1lbWJlciIsIm1hcE5hbWVUb0FsaWFzIiwic3BsaXQiLCIkVHlwZSIsIlJlY29yZCIsIm5hbWUiLCJhbm5vdGF0aW9uTmFtZSIsInBhdGhQYXJ0IiwiYW5ub1BhcnQiLCJsYXN0RG90IiwibGFzdEluZGV4T2YiLCJzdWJzdHIiLCJjdXJyZW50T2JqZWN0VGFyZ2V0IiwicGFyc2VkQW5ub3RhdGlvbk9iamVjdCIsInR5cGVPZk9iamVjdCIsInBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsInN1YkFubm90YXRpb25JbmRleCIsInR5cGVWYWx1ZSIsInByb3BlcnR5VmFsdWVzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJzdGFydHNXaXRoIiwicHVzaCIsImNyZWF0ZUFubm90YXRpb25MaXN0cyIsImdldE9yQ3JlYXRlQW5ub3RhdGlvbkxpc3QiLCJ0YXJnZXQiLCJhbm5vdGF0aW9ucyIsInJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMiLCJmaWx0ZXIiLCJvUmVjb3JkIiwiVGFyZ2V0IiwiaW5kZXhPZiIsInJlbW92ZUlCTkFubm90YXRpb25zIiwiaGFuZGxlUHJlc2VudGF0aW9uVmFyaWFudCIsImFubm90YXRpb25PYmplY3RzIiwiYW5ub3RhdGlvblRhcmdldCIsImFubm90YXRpb25MaXN0cyIsIm91dEFubm90YXRpb25PYmplY3QiLCJhbm5vdGF0aW9uS2V5IiwiRGF0YSIsIlZpc3VhbGl6YXRpb25zIiwiY3VycmVudE91dEFubm90YXRpb25PYmplY3QiLCJhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXQiLCJhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXQiLCJxdWFsaWZpZXIiLCJ0ZXJtIiwiY3VycmVudEFubm90YXRpb25UYXJnZXQiLCJpc0NvbGxlY3Rpb24iLCJ0eXBlb2ZBbm5vdGF0aW9uIiwicmVjb3JkIiwicHJlcGFyZVByb3BlcnR5IiwicHJvcGVydHlEZWZpbml0aW9uIiwiZW50aXR5VHlwZU9iamVjdCIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5T2JqZWN0IiwiX3R5cGUiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtYXhMZW5ndGgiLCIkTWF4TGVuZ3RoIiwicHJlY2lzaW9uIiwiJFByZWNpc2lvbiIsInNjYWxlIiwiJFNjYWxlIiwibnVsbGFibGUiLCIkTnVsbGFibGUiLCJwcmVwYXJlTmF2aWdhdGlvblByb3BlcnR5IiwibmF2UHJvcGVydHlEZWZpbml0aW9uIiwibmF2UHJvcGVydHlOYW1lIiwicmVmZXJlbnRpYWxDb25zdHJhaW50IiwiJFJlZmVyZW50aWFsQ29uc3RyYWludCIsInNvdXJjZVByb3BlcnR5TmFtZSIsInNvdXJjZVR5cGVOYW1lIiwic291cmNlUHJvcGVydHkiLCJ0YXJnZXRUeXBlTmFtZSIsInRhcmdldFByb3BlcnR5IiwibmF2aWdhdGlvblByb3BlcnR5IiwicGFydG5lciIsIiRQYXJ0bmVyIiwiJGlzQ29sbGVjdGlvbiIsImNvbnRhaW5zVGFyZ2V0IiwiJENvbnRhaW5zVGFyZ2V0IiwicHJlcGFyZUVudGl0eVNldCIsImVudGl0eVNldERlZmluaXRpb24iLCJlbnRpdHlTZXROYW1lIiwiZW50aXR5Q29udGFpbmVyTmFtZSIsImVudGl0eVNldE9iamVjdCIsIm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJlbnRpdHlUeXBlTmFtZSIsInByZXBhcmVTaW5nbGV0b24iLCJzaW5nbGV0b25EZWZpbml0aW9uIiwic2luZ2xldG9uTmFtZSIsInNpbmdsZXRvbk9iamVjdCIsInR5cGVOYW1lIiwicHJlcGFyZVR5cGVEZWZpbml0aW9uIiwidHlwZURlZmluaXRpb24iLCJuYW1lc3BhY2UiLCJ0eXBlT2JqZWN0IiwicmVwbGFjZSIsInVuZGVybHlpbmdUeXBlIiwiJFVuZGVybHlpbmdUeXBlIiwicHJlcGFyZUNvbXBsZXhUeXBlIiwiY29tcGxleFR5cGVEZWZpbml0aW9uIiwiY29tcGxleFR5cGVOYW1lIiwiY29tcGxleFR5cGVPYmplY3QiLCJwcm9wZXJ0aWVzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJjb21wbGV4VHlwZVByb3BlcnRpZXMiLCJwcm9wZXJ0eU5hbWVPck5vdCIsIiRraW5kIiwic29ydCIsImEiLCJiIiwiY29tcGxleFR5cGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsInByZXBhcmVFbnRpdHlLZXlzIiwiZW50aXR5VHlwZURlZmluaXRpb24iLCJvTWV0YU1vZGVsRGF0YSIsIiRLZXkiLCIkQmFzZVR5cGUiLCJwcmVwYXJlRW50aXR5VHlwZSIsIm1ldGFNb2RlbERhdGEiLCJlbnRpdHlLZXlzIiwiZW50aXR5UHJvcGVydGllcyIsImVudGl0eUtleSIsImZpbmQiLCJwcm9wZXJ0eSIsInByZXBhcmVBY3Rpb24iLCJhY3Rpb25OYW1lIiwiYWN0aW9uUmF3RGF0YSIsImFjdGlvbkVudGl0eVR5cGUiLCJhY3Rpb25GUU4iLCJhY3Rpb25TaG9ydE5hbWUiLCIkSXNCb3VuZCIsImJpbmRpbmdQYXJhbWV0ZXIiLCIkUGFyYW1ldGVyIiwicGFyYW1ldGVycyIsImlzQm91bmQiLCJpc0Z1bmN0aW9uIiwic291cmNlVHlwZSIsInJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsInBhcmFtIiwiaXNFbnRpdHlTZXQiLCIkRW50aXR5U2V0UGF0aCIsIiROYW1lIiwicHJlcGFyZUVudGl0eVR5cGVzIiwib01ldGFNb2RlbCIsImdldE9iamVjdCIsImVudGl0eVR5cGVzIiwiZW50aXR5U2V0cyIsInNpbmdsZXRvbnMiLCJjb21wbGV4VHlwZXMiLCJ0eXBlRGVmaW5pdGlvbnMiLCIkRW50aXR5Q29udGFpbmVyIiwic2NoZW1hS2V5cyIsIm1ldGFtb2RlbEtleSIsInNPYmplY3ROYW1lIiwiZW50aXR5VHlwZSIsIiRBbm5vdGF0aW9ucyIsImZpbHRlckZhY2V0QW5ub3RhdGlvbiIsIklEIiwiZ2VuZXJhdGUiLCJGYWNldCIsImVudGl0eVByb3BlcnR5IiwiVmFsdWUiLCJjb21wbGV4VHlwZSIsIm9FbnRpdHlDb250YWluZXIiLCJlbnRpdHlTZXQiLCJzaW5nbGV0b24iLCJlbnRpdHlDb250YWluZXIiLCJuYXZQcm9wZXJ0eUJpbmRpbmdzIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJuYXZQcm9wTmFtZSIsInRhcmdldEVudGl0eVNldCIsImFjdGlvbnMiLCJrZXkiLCJyZWR1Y2UiLCJvdXRBY3Rpb25zIiwiYWN0aW9uIiwib3V0QW5ub3RhdGlvbkxpc3RzIiwic0Fubm90YXRpb25OYW1lIiwicmVmZXJlbmNlcyIsImlkZW50aWZpY2F0aW9uIiwidmVyc2lvbiIsInNjaGVtYSIsImFzc29jaWF0aW9ucyIsImFzc29jaWF0aW9uU2V0cyIsIm1NZXRhTW9kZWxNYXAiLCJjb252ZXJ0VHlwZXMiLCJzTWV0YU1vZGVsSWQiLCJpZCIsInBhcnNlZE91dHB1dCIsImFkZFN5bnRoZXRpY0Fubm90YXRpb25zIiwiQW5ub3RhdGlvbkNvbnZlcnRlciIsIm1ldGFNb2RlbCIsInNpdHVhdGlvbnNOYXZQcm9wIiwibmF2UHJvcCIsIkZFIiwicGF0aCIsIiR0YXJnZXQiLCJkZWxldGVNb2RlbENhY2hlRGF0YSIsImNvbnZlcnRNZXRhTW9kZWxDb250ZXh0Iiwib01ldGFNb2RlbENvbnRleHQiLCJiSW5jbHVkZVZpc2l0ZWRPYmplY3RzIiwib0NvbnZlcnRlck91dHB1dCIsImdldE1vZGVsIiwic1BhdGgiLCJnZXRQYXRoIiwiYVBhdGhTcGxpdCIsInJlbGF0aXZlUGF0aCIsInNsaWNlIiwiam9pbiIsImxvY2FsT2JqZWN0cyIsInJlbGF0aXZlU3BsaXQiLCJpZHgiLCJjdXJyZW50RW50aXR5U2V0Iiwic05hdlByb3BUb0NoZWNrIiwiYU5hdlByb3BzIiwidGFyZ2V0RW50aXR5VHlwZSIsInNOYXZQcm9wIiwidGFyZ2V0TmF2UHJvcCIsInRhcmdldFR5cGUiLCJzaGlmdCIsIm9UYXJnZXQiLCJyZXNvbHZlUGF0aCIsInZpc2l0ZWRPYmplY3RzIiwiY29uY2F0IiwicGFyYW1ldGVyTmFtZSIsInRhcmdldFBhcmFtZXRlciIsInBhcmFtZXRlciIsImVuZHNXaXRoIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwib0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQiLCJtZXRhTW9kZWxDb250ZXh0IiwidGFyZ2V0RW50aXR5U2V0TG9jYXRpb24iLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdEZyb21QYXRoIiwiZGF0YU1vZGVsT2JqZWN0cyIsInZpc2l0ZWRPYmplY3QiLCJyb290RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJpIiwiY3VycmVudE9iamVjdCIsIm5hdmlnYXRlZFBhdGhzIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJzdGFydGluZ0luZGV4IiwicmVxdWlyZWREYXRhTW9kZWxPYmplY3RzIiwib2JqZWN0Iiwib3V0RGF0YU1vZGVsUGF0aCIsInRhcmdldE9iamVjdCIsImNvbnRleHRMb2NhdGlvbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkEsTUFBTUEsZ0JBQXFCLEdBQUc7QUFDN0IsaUNBQTZCLGNBREE7QUFFN0IseUJBQXFCLE1BRlE7QUFHN0IsNkJBQXlCLFVBSEk7QUFJN0Isc0NBQWtDLFFBSkw7QUFLN0Isa0NBQThCLElBTEQ7QUFNN0IsdUNBQW1DLFNBTk47QUFPN0IseUNBQXFDLFdBUFI7QUFRN0IsNENBQXdDLGNBUlg7QUFTN0IsNkNBQXlDO0FBVFosR0FBOUI7QUFvQk8sTUFBTUMsOEJBQThCLEdBQUc7QUFDN0NDLElBQUFBLEtBQUssRUFBRSxJQURzQztBQUU3Q0MsSUFBQUEsVUFBVSxFQUFFLElBRmlDO0FBRzdDQyxJQUFBQSxNQUFNLEVBQUUsSUFIcUM7QUFJN0NDLElBQUFBLHFCQUFxQixFQUFFLElBSnNCO0FBSzdDQyxJQUFBQSxVQUFVLEVBQUU7QUFMaUMsR0FBdkM7OztBQTBCUCxXQUFTQyxrQkFBVCxDQUNDQyxnQkFERCxFQUVDQyxXQUZELEVBR0NDLGFBSEQsRUFJQ0MsZ0JBSkQsRUFLQ0MsYUFMRCxFQU1PO0FBQ04sUUFBSUMsS0FBSjtBQUNBLFFBQU1DLHFCQUE2QixHQUFHSixhQUFhLEdBQUcsR0FBaEIsR0FBc0JELFdBQTVEO0FBQ0EsUUFBTU0sZ0JBQWdCLEdBQUcsT0FBT1AsZ0JBQWhDOztBQUNBLFFBQUlBLGdCQUFn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QTtBQUNBLFVBQU1NLGFBQWEsR0FBR1IsZ0JBQWdCLENBQUM1TSxPQUFqQixDQUF5QjBNLHVCQUF1QixDQUFDUyxpQkFBakQsQ0FBdEI7O0FBQ0EsVUFBSUMsYUFBYSxLQUFLLENBQUMsQ0FBdkIsRUFBMEI7QUFDekI7QUFDQSxZQUFNQyx3QkFBd0IsR0FBR1QsZ0JBQWdCLENBQUMxQixLQUFqQixDQUF1QixDQUF2QixFQUEwQmtDLGFBQTFCLENBQWpDO0FBQ0FWLFFBQUFBLHVCQUF1QixDQUFDUyxpQkFBeEIsR0FBNENMLGFBQTVDO0FBQ0FKLFFBQUFBLHVCQUF1QixDQUFDaEksb0JBQXhCLEdBQStDMkksd0JBQXdCLENBQ3JFeE4sTUFENkMsQ0FDdEMsVUFBQ3lOLE1BQUQ7QUFBQSxpQkFBaUJBLE1BQU0sQ0FBQzlMLEtBQVAsS0FBaUIsb0JBQWxDO0FBQUEsU0FEc0MsRUFFN0MwSyxNQUY2QyxDQUV0Q1EsdUJBQXVCLENBQUNoSSxvQkFGYyxDQUEvQztBQUdBO0FBQ0Q7O0FBQ0QsUUFBTTZJLGdCQUFnQixHQUFHO0FBQ3hCSixNQUFBQSxpQkFBaUIsRUFBRUwsYUFESztBQUV4QmpFLE1BQUFBLGVBQWUsRUFBRTBDLGdCQUZPO0FBR3hCRyxNQUFBQSxnQkFBZ0IsRUFBRXFCLGlCQUhNO0FBSXhCUyxNQUFBQSxZQUFZLEVBQUVmLGdCQUFnQixDQUFDL00sTUFKUDtBQUt4QmdGLE1BQUFBLG9CQUFvQixFQUFwQkEsb0JBTHdCO0FBTXhCK0ksTUFBQUEsZUFBZSxFQUFFZjtBQU5PLEtBQXpCOztBQVFBLFFBQUksQ0FBQ2EsZ0JBQWdCLENBQUNFLGVBQXRCLEVBQXVDO0FBQ3RDRixNQUFBQSxnQkFBZ0IsQ0FBQ0UsZUFBakIsR0FBbUNGLGdCQUFuQztBQUNBOztBQUNELFdBQU9BLGdCQUFQO0FBQ0EiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb24sIEFubm90YXRpb25MaXN0LCBBbm5vdGF0aW9uUmVjb3JkLCBFeHByZXNzaW9uLCBQYXJzZXJPdXRwdXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbi8vIFRoaXMgZmlsZSBpcyByZXRyaWV2ZWQgZnJvbSBAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyLCBzaGFyZWQgY29kZSB3aXRoIHRvb2wgc3VpdGVcbmltcG9ydCB7IEFubm90YXRpb25Db252ZXJ0ZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb21tb25cIjtcbmltcG9ydCB7IE9EYXRhTWV0YU1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuaW1wb3J0IHtcblx0Q29udmVydGVyT3V0cHV0LFxuXHRFbnRpdHlTZXQgYXMgX0VudGl0eVNldCxcblx0RW50aXR5VHlwZSBhcyBfRW50aXR5VHlwZSxcblx0U2luZ2xldG9uIGFzIF9TaW5nbGV0b24sXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eSBhcyBfTmF2aWdhdGlvblByb3BlcnR5XG59IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRFbnRpdHlUeXBlLFxuXHRFbnRpdHlTZXQsXG5cdFByb3BlcnR5LFxuXHRDb21wbGV4VHlwZSxcblx0UmVmZXJlbnRpYWxDb25zdHJhaW50LFxuXHRWNE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0QWN0aW9uLFxuXHRSZWZlcmVuY2UsXG5cdEVudGl0eUNvbnRhaW5lcixcblx0U2luZ2xldG9uLFxuXHRUeXBlRGVmaW5pdGlvblxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9QYXJzZXJcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsXCI7XG5pbXBvcnQgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGUgfSBmcm9tIFwiLi4vaGVscGVycy9TdGFibGVJZEhlbHBlclwiO1xuXG5jb25zdCBWT0NBQlVMQVJZX0FMSUFTOiBhbnkgPSB7XG5cdFwiT3JnLk9EYXRhLkNhcGFiaWxpdGllcy5WMVwiOiBcIkNhcGFiaWxpdGllc1wiLFxuXHRcIk9yZy5PRGF0YS5Db3JlLlYxXCI6IFwiQ29yZVwiLFxuXHRcIk9yZy5PRGF0YS5NZWFzdXJlcy5WMVwiOiBcIk1lYXN1cmVzXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxXCI6IFwiQ29tbW9uXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjFcIjogXCJVSVwiLFxuXHRcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjFcIjogXCJTZXNzaW9uXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxXCI6IFwiQW5hbHl0aWNzXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxXCI6IFwiUGVyc29uYWxEYXRhXCIsXG5cdFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MVwiOiBcIkNvbW11bmljYXRpb25cIlxufTtcblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgPSB7XG5cdENoYXJ0OiBib29sZWFuO1xuXHRNaWNyb0NoYXJ0OiBib29sZWFuO1xuXHRVU2hlbGw6IGJvb2xlYW47XG5cdEludGVudEJhc2VkTmF2aWdhdGlvbjogYm9vbGVhbjtcblx0U2l0dWF0aW9uczogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgPSB7XG5cdENoYXJ0OiB0cnVlLFxuXHRNaWNyb0NoYXJ0OiB0cnVlLFxuXHRVU2hlbGw6IHRydWUsXG5cdEludGVudEJhc2VkTmF2aWdhdGlvbjogdHJ1ZSxcblx0U2l0dWF0aW9uczogZmFsc2Vcbn07XG5cbnR5cGUgTWV0YU1vZGVsQWN0aW9uID0ge1xuXHQka2luZDogXCJBY3Rpb25cIjtcblx0JElzQm91bmQ6IGJvb2xlYW47XG5cdCRFbnRpdHlTZXRQYXRoOiBzdHJpbmc7XG5cdCRQYXJhbWV0ZXI6IHtcblx0XHQkVHlwZTogc3RyaW5nO1xuXHRcdCROYW1lOiBzdHJpbmc7XG5cdFx0JE51bGxhYmxlPzogYm9vbGVhbjtcblx0XHQkTWF4TGVuZ3RoPzogbnVtYmVyO1xuXHRcdCRQcmVjaXNpb24/OiBudW1iZXI7XG5cdFx0JFNjYWxlPzogbnVtYmVyO1xuXHRcdCRpc0NvbGxlY3Rpb24/OiBib29sZWFuO1xuXHR9W107XG5cdCRSZXR1cm5UeXBlOiB7XG5cdFx0JFR5cGU6IHN0cmluZztcblx0fTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlUHJvcGVydHlWYWx1ZShcblx0YW5ub3RhdGlvbk9iamVjdDogYW55LFxuXHRwcm9wZXJ0eUtleTogc3RyaW5nLFxuXHRjdXJyZW50VGFyZ2V0OiBzdHJpbmcsXG5cdGFubm90YXRpb25zTGlzdHM6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0Pixcblx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcbik6IGFueSB7XG5cdGxldCB2YWx1ZTtcblx0Y29uc3QgY3VycmVudFByb3BlcnR5VGFyZ2V0OiBzdHJpbmcgPSBjdXJyZW50VGFyZ2V0ICsgXCIvXCIgKyBwcm9wZXJ0eUtleTtcblx0Y29uc3QgdHlwZU9mQW5ub3RhdGlvbiA9IHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0O1xuXHRpZiAoYW5ub3RhdGlvbk9iamVjdCA9PT0gbnVsbCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIk51bGxcIiwgTnVsbDogbnVsbCB9O1xuXHR9IGVsc2UgaWYgKHR5cGVPZkFubm90YXRpb24gPT09IFwic3RyaW5nXCIpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJTdHJpbmdcIiwgU3RyaW5nOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdH0gZWxzZSBpZiAodHlwZU9mQW5ub3RhdGlvbiA9PT0gXCJib29sZWFuXCIpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJCb29sXCIsIEJvb2w6IGFubm90YXRpb25PYmplY3QgfTtcblx0fSBlbHNlIGlmICh0eXBlT2ZBbm5vdGF0aW9uID09PSBcIm51bWJlclwiKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiSW50XCIsIEludDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYW5ub3RhdGlvbk9iamVjdCkpIHtcblx0XHR2YWx1ZSA9IHtcblx0XHRcdHR5cGU6IFwiQ29sbGVjdGlvblwiLFxuXHRcdFx0Q29sbGVjdGlvbjogYW5ub3RhdGlvbk9iamVjdC5tYXAoKHN1YkFubm90YXRpb25PYmplY3QsIHN1YkFubm90YXRpb25PYmplY3RJbmRleCkgPT5cblx0XHRcdFx0cGFyc2VBbm5vdGF0aW9uT2JqZWN0KFxuXHRcdFx0XHRcdHN1YkFubm90YXRpb25PYmplY3QsXG5cdFx0XHRcdFx0Y3VycmVudFByb3BlcnR5VGFyZ2V0ICsgXCIvXCIgKyBzdWJBbm5vdGF0aW9uT2JqZWN0SW5kZXgsXG5cdFx0XHRcdFx0YW5ub3RhdGlvbnNMaXN0cyxcblx0XHRcdFx0XHRvQ2FwYWJpbGl0aWVzXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHR9O1xuXHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJFByb3BlcnR5UGF0aFwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlByb3BlcnR5UGF0aFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJFBhdGhcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQYXRoXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBbm5vdGF0aW9uUGF0aFwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkFubm90YXRpb25QYXRoXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlJlY29yZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJElmXCIpKSB7XG5cdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRPclwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk9yXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQW5kXCIpKSB7XG5cdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5kXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkRXFcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJFcVwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5lXCIpKSB7XG5cdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTmVcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROb3RcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJOb3RcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHdFwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkd0XCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkR2VcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJHZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEx0XCIpKSB7XG5cdFx0XHRcdCh2YWx1ZS5Db2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTHRcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRMZVwiKSkge1xuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkxlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkQXBwbHlcIikpIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBcHBseVwiO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgYW5ub3RhdGlvbk9iamVjdFswXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHQvLyAkVHlwZSBpcyBvcHRpb25hbC4uLlxuXHRcdFx0XHQodmFsdWUuQ29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlJlY29yZFwiO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0KHZhbHVlLkNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJTdHJpbmdcIjtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiUGF0aFwiLCBQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRQYXRoIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRGVjaW1hbCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiRGVjaW1hbFwiLCBEZWNpbWFsOiBwYXJzZUZsb2F0KGFubm90YXRpb25PYmplY3QuJERlY2ltYWwpIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJQcm9wZXJ0eVBhdGhcIiwgUHJvcGVydHlQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRQcm9wZXJ0eVBhdGggfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YWx1ZSA9IHtcblx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiLFxuXHRcdFx0TmF2aWdhdGlvblByb3BlcnR5UGF0aDogYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kSWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIklmXCIsIElmOiBhbm5vdGF0aW9uT2JqZWN0LiRJZiB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiQW5kXCIsIEFuZDogYW5ub3RhdGlvbk9iamVjdC4kQW5kIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kT3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIk9yXCIsIE9yOiBhbm5vdGF0aW9uT2JqZWN0LiRPciB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5vdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiTm90XCIsIE5vdDogYW5ub3RhdGlvbk9iamVjdC4kTm90IH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRXEgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIkVxXCIsIEVxOiBhbm5vdGF0aW9uT2JqZWN0LiRFcSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5lICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJOZVwiLCBOZTogYW5ub3RhdGlvbk9iamVjdC4kTmUgfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRHdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiR3RcIiwgR3Q6IGFubm90YXRpb25PYmplY3QuJEd0IH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kR2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIkdlXCIsIEdlOiBhbm5vdGF0aW9uT2JqZWN0LiRHZSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YWx1ZSA9IHsgdHlwZTogXCJMdFwiLCBMdDogYW5ub3RhdGlvbk9iamVjdC4kTHQgfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0dmFsdWUgPSB7IHR5cGU6IFwiTGVcIiwgTGU6IGFubm90YXRpb25PYmplY3QuJExlIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQXBwbHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIkFwcGx5XCIsIEFwcGx5OiBhbm5vdGF0aW9uT2JqZWN0LiRBcHBseSwgRnVuY3Rpb246IGFubm90YXRpb25PYmplY3QuJEZ1bmN0aW9uIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0geyB0eXBlOiBcIkFubm90YXRpb25QYXRoXCIsIEFubm90YXRpb25QYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRBbm5vdGF0aW9uUGF0aCB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdHZhbHVlID0ge1xuXHRcdFx0dHlwZTogXCJFbnVtTWVtYmVyXCIsXG5cdFx0XHRFbnVtTWVtYmVyOiBtYXBOYW1lVG9BbGlhcyhhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVswXSkgKyBcIi9cIiArIGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIuc3BsaXQoXCIvXCIpWzFdXG5cdFx0fTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRUeXBlKSB7XG5cdFx0dmFsdWUgPSB7XG5cdFx0XHR0eXBlOiBcIlJlY29yZFwiLFxuXHRcdFx0UmVjb3JkOiBwYXJzZUFubm90YXRpb25PYmplY3QoYW5ub3RhdGlvbk9iamVjdCwgY3VycmVudFRhcmdldCwgYW5ub3RhdGlvbnNMaXN0cywgb0NhcGFiaWxpdGllcylcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHZhbHVlID0ge1xuXHRcdFx0dHlwZTogXCJSZWNvcmRcIixcblx0XHRcdFJlY29yZDogcGFyc2VBbm5vdGF0aW9uT2JqZWN0KGFubm90YXRpb25PYmplY3QsIGN1cnJlbnRUYXJnZXQsIGFubm90YXRpb25zTGlzdHMsIG9DYXBhYmlsaXRpZXMpXG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bmFtZTogcHJvcGVydHlLZXksXG5cdFx0dmFsdWVcblx0fTtcbn1cbmZ1bmN0aW9uIG1hcE5hbWVUb0FsaWFzKGFubm90YXRpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRsZXQgW3BhdGhQYXJ0LCBhbm5vUGFydF0gPSBhbm5vdGF0aW9uTmFtZS5zcGxpdChcIkBcIik7XG5cdGlmICghYW5ub1BhcnQpIHtcblx0XHRhbm5vUGFydCA9IHBhdGhQYXJ0O1xuXHRcdHBhdGhQYXJ0ID0gXCJcIjtcblx0fSBlbHNlIHtcblx0XHRwYXRoUGFydCArPSBcIkBcIjtcblx0fVxuXHRjb25zdCBsYXN0RG90ID0gYW5ub1BhcnQubGFzdEluZGV4T2YoXCIuXCIpO1xuXHRyZXR1cm4gcGF0aFBhcnQgKyBWT0NBQlVMQVJZX0FMSUFTW2Fubm9QYXJ0LnN1YnN0cigwLCBsYXN0RG90KV0gKyBcIi5cIiArIGFubm9QYXJ0LnN1YnN0cihsYXN0RG90ICsgMSk7XG59XG5mdW5jdGlvbiBwYXJzZUFubm90YXRpb25PYmplY3QoXG5cdGFubm90YXRpb25PYmplY3Q6IGFueSxcblx0Y3VycmVudE9iamVjdFRhcmdldDogc3RyaW5nLFxuXHRhbm5vdGF0aW9uc0xpc3RzOiBSZWNvcmQ8c3RyaW5nLCBBbm5vdGF0aW9uTGlzdD4sXG5cdG9DYXBhYmlsaXRpZXM6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzXG4pOiBFeHByZXNzaW9uIHwgQW5ub3RhdGlvblJlY29yZCB8IEFubm90YXRpb24ge1xuXHRsZXQgcGFyc2VkQW5ub3RhdGlvbk9iamVjdDogYW55ID0ge307XG5cdGNvbnN0IHR5cGVPZk9iamVjdCA9IHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0O1xuXHRpZiAoYW5ub3RhdGlvbk9iamVjdCA9PT0gbnVsbCkge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiTnVsbFwiLCBOdWxsOiBudWxsIH07XG5cdH0gZWxzZSBpZiAodHlwZU9mT2JqZWN0ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJTdHJpbmdcIiwgU3RyaW5nOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdH0gZWxzZSBpZiAodHlwZU9mT2JqZWN0ID09PSBcImJvb2xlYW5cIikge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiQm9vbFwiLCBCb29sOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdH0gZWxzZSBpZiAodHlwZU9mT2JqZWN0ID09PSBcIm51bWJlclwiKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJJbnRcIiwgSW50OiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiQW5ub3RhdGlvblBhdGhcIiwgQW5ub3RhdGlvblBhdGg6IGFubm90YXRpb25PYmplY3QuJEFubm90YXRpb25QYXRoIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJQYXRoXCIsIFBhdGg6IGFubm90YXRpb25PYmplY3QuJFBhdGggfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiREZWNpbWFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkRlY2ltYWxcIiwgRGVjaW1hbDogcGFyc2VGbG9hdChhbm5vdGF0aW9uT2JqZWN0LiREZWNpbWFsKSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJFByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJQcm9wZXJ0eVBhdGhcIiwgUHJvcGVydHlQYXRoOiBhbm5vdGF0aW9uT2JqZWN0LiRQcm9wZXJ0eVBhdGggfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRJZiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHsgdHlwZTogXCJJZlwiLCBJZjogYW5ub3RhdGlvbk9iamVjdC4kSWYgfTtcblx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRBbmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiQW5kXCIsIEFuZDogYW5ub3RhdGlvbk9iamVjdC4kQW5kIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kT3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QgPSB7IHR5cGU6IFwiT3JcIiwgT3I6IGFubm90YXRpb25PYmplY3QuJE9yIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTm90ICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIk5vdFwiLCBOb3Q6IGFubm90YXRpb25PYmplY3QuJE5vdCB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEVxICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkVxXCIsIEVxOiBhbm5vdGF0aW9uT2JqZWN0LiRFcSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5lICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIk5lXCIsIE5lOiBhbm5vdGF0aW9uT2JqZWN0LiROZSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEd0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkd0XCIsIEd0OiBhbm5vdGF0aW9uT2JqZWN0LiRHdCB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEdlICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkdlXCIsIEdlOiBhbm5vdGF0aW9uT2JqZWN0LiRHZSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkx0XCIsIEx0OiBhbm5vdGF0aW9uT2JqZWN0LiRMdCB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJExlICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkxlXCIsIExlOiBhbm5vdGF0aW9uT2JqZWN0LiRMZSB9O1xuXHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFwcGx5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0ID0geyB0eXBlOiBcIkFwcGx5XCIsIEFwcGx5OiBhbm5vdGF0aW9uT2JqZWN0LiRBcHBseSwgRnVuY3Rpb246IGFubm90YXRpb25PYmplY3QuJEZ1bmN0aW9uIH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHtcblx0XHRcdHR5cGU6IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiLFxuXHRcdFx0TmF2aWdhdGlvblByb3BlcnR5UGF0aDogYW5ub3RhdGlvbk9iamVjdC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdH07XG5cdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdCA9IHtcblx0XHRcdHR5cGU6IFwiRW51bU1lbWJlclwiLFxuXHRcdFx0RW51bU1lbWJlcjogbWFwTmFtZVRvQWxpYXMoYW5ub3RhdGlvbk9iamVjdC4kRW51bU1lbWJlci5zcGxpdChcIi9cIilbMF0pICsgXCIvXCIgKyBhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVsxXVxuXHRcdH07XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhbm5vdGF0aW9uT2JqZWN0KSkge1xuXHRcdGNvbnN0IHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uID0gcGFyc2VkQW5ub3RhdGlvbk9iamVjdCBhcyBhbnk7XG5cdFx0cGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiA9IGFubm90YXRpb25PYmplY3QubWFwKChzdWJBbm5vdGF0aW9uT2JqZWN0LCBzdWJBbm5vdGF0aW9uSW5kZXgpID0+XG5cdFx0XHRwYXJzZUFubm90YXRpb25PYmplY3Qoc3ViQW5ub3RhdGlvbk9iamVjdCwgY3VycmVudE9iamVjdFRhcmdldCArIFwiL1wiICsgc3ViQW5ub3RhdGlvbkluZGV4LCBhbm5vdGF0aW9uc0xpc3RzLCBvQ2FwYWJpbGl0aWVzKVxuXHRcdCk7XG5cdFx0aWYgKGFubm90YXRpb25PYmplY3QubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUHJvcGVydHlQYXRoXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlBhdGhcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFubm90YXRpb25QYXRoXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5ub3RhdGlvblBhdGhcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkSWZcIikpIHtcblx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJJZlwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFuZFwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkFuZFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE9yXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiT3JcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRFcVwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkVxXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJOZVwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5vdFwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5vdFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEd0XCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiR3RcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkdlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTHRcIikpIHtcblx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25Db2xsZWN0aW9uLmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJMdFwiO1xuXHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJExlXCIpKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTGVcIjtcblx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkFwcGx5XCI7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0WzBdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uQ29sbGVjdGlvbi5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiUmVjb3JkXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbkNvbGxlY3Rpb24uY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlN0cmluZ1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdC4kVHlwZSkge1xuXHRcdFx0Y29uc3QgdHlwZVZhbHVlID0gYW5ub3RhdGlvbk9iamVjdC4kVHlwZTtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudHlwZSA9IHR5cGVWYWx1ZTsgLy9gJHt0eXBlQWxpYXN9LiR7dHlwZVRlcm19YDtcblx0XHR9XG5cdFx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IGFueSA9IFtdO1xuXHRcdE9iamVjdC5rZXlzKGFubm90YXRpb25PYmplY3QpLmZvckVhY2gocHJvcGVydHlLZXkgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkVHlwZVwiICYmXG5cdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRJZlwiICYmXG5cdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRBcHBseVwiICYmXG5cdFx0XHRcdHByb3BlcnR5S2V5ICE9PSBcIiRBbmRcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkT3JcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTmVcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkR3RcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkR2VcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTHRcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTGVcIiAmJlxuXHRcdFx0XHRwcm9wZXJ0eUtleSAhPT0gXCIkTm90XCIgJiZcblx0XHRcdFx0cHJvcGVydHlLZXkgIT09IFwiJEVxXCIgJiZcblx0XHRcdFx0IXByb3BlcnR5S2V5LnN0YXJ0c1dpdGgoXCJAXCIpXG5cdFx0XHQpIHtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMucHVzaChcblx0XHRcdFx0XHRwYXJzZVByb3BlcnR5VmFsdWUoYW5ub3RhdGlvbk9iamVjdFtwcm9wZXJ0eUtleV0sIHByb3BlcnR5S2V5LCBjdXJyZW50T2JqZWN0VGFyZ2V0LCBhbm5vdGF0aW9uc0xpc3RzLCBvQ2FwYWJpbGl0aWVzKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eUtleS5zdGFydHNXaXRoKFwiQFwiKSkge1xuXHRcdFx0XHQvLyBBbm5vdGF0aW9uIG9mIGFubm90YXRpb25cblx0XHRcdFx0Y3JlYXRlQW5ub3RhdGlvbkxpc3RzKFxuXHRcdFx0XHRcdHsgW3Byb3BlcnR5S2V5XTogYW5ub3RhdGlvbk9iamVjdFtwcm9wZXJ0eUtleV0gfSxcblx0XHRcdFx0XHRjdXJyZW50T2JqZWN0VGFyZ2V0LFxuXHRcdFx0XHRcdGFubm90YXRpb25zTGlzdHMsXG5cdFx0XHRcdFx0b0NhcGFiaWxpdGllc1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QucHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblx0fVxuXHRyZXR1cm4gcGFyc2VkQW5ub3RhdGlvbk9iamVjdDtcbn1cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlQW5ub3RhdGlvbkxpc3QodGFyZ2V0OiBzdHJpbmcsIGFubm90YXRpb25zTGlzdHM6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25MaXN0Pik6IEFubm90YXRpb25MaXN0IHtcblx0aWYgKCFhbm5vdGF0aW9uc0xpc3RzLmhhc093blByb3BlcnR5KHRhcmdldCkpIHtcblx0XHRhbm5vdGF0aW9uc0xpc3RzW3RhcmdldF0gPSB7XG5cdFx0XHR0YXJnZXQ6IHRhcmdldCxcblx0XHRcdGFubm90YXRpb25zOiBbXVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIGFubm90YXRpb25zTGlzdHNbdGFyZ2V0XTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hhcnRBbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0OiBhbnkpIHtcblx0cmV0dXJuIGFubm90YXRpb25PYmplY3QuZmlsdGVyKChvUmVjb3JkOiBhbnkpID0+IHtcblx0XHRpZiAob1JlY29yZC5UYXJnZXQgJiYgb1JlY29yZC5UYXJnZXQuJEFubm90YXRpb25QYXRoKSB7XG5cdFx0XHRyZXR1cm4gb1JlY29yZC5UYXJnZXQuJEFubm90YXRpb25QYXRoLmluZGV4T2YoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnRcIikgPT09IC0xO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVJQk5Bbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0OiBhbnkpIHtcblx0cmV0dXJuIGFubm90YXRpb25PYmplY3QuZmlsdGVyKChvUmVjb3JkOiBhbnkpID0+IHtcblx0XHRyZXR1cm4gb1JlY29yZC4kVHlwZSAhPT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVByZXNlbnRhdGlvblZhcmlhbnQoYW5ub3RhdGlvbk9iamVjdDogYW55KSB7XG5cdHJldHVybiBhbm5vdGF0aW9uT2JqZWN0LmZpbHRlcigob1JlY29yZDogYW55KSA9PiB7XG5cdFx0cmV0dXJuIG9SZWNvcmQuJEFubm90YXRpb25QYXRoICE9PSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydFwiO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQW5ub3RhdGlvbkxpc3RzKFxuXHRhbm5vdGF0aW9uT2JqZWN0czogYW55LFxuXHRhbm5vdGF0aW9uVGFyZ2V0OiBzdHJpbmcsXG5cdGFubm90YXRpb25MaXN0czogUmVjb3JkPHN0cmluZywgQW5ub3RhdGlvbkxpc3Q+LFxuXHRvQ2FwYWJpbGl0aWVzOiBFbnZpcm9ubWVudENhcGFiaWxpdGllc1xuKSB7XG5cdGlmIChPYmplY3Qua2V5cyhhbm5vdGF0aW9uT2JqZWN0cykubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IG91dEFubm90YXRpb25PYmplY3QgPSBnZXRPckNyZWF0ZUFubm90YXRpb25MaXN0KGFubm90YXRpb25UYXJnZXQsIGFubm90YXRpb25MaXN0cyk7XG5cdGlmICghb0NhcGFiaWxpdGllcy5NaWNyb0NoYXJ0KSB7XG5cdFx0ZGVsZXRlIGFubm90YXRpb25PYmplY3RzW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0XCJdO1xuXHR9XG5cblx0Zm9yIChsZXQgYW5ub3RhdGlvbktleSBpbiBhbm5vdGF0aW9uT2JqZWN0cykge1xuXHRcdGxldCBhbm5vdGF0aW9uT2JqZWN0ID0gYW5ub3RhdGlvbk9iamVjdHNbYW5ub3RhdGlvbktleV07XG5cdFx0c3dpdGNoIChhbm5vdGF0aW9uS2V5KSB7XG5cdFx0XHRjYXNlIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkhlYWRlckZhY2V0c1wiOlxuXHRcdFx0XHRpZiAoIW9DYXBhYmlsaXRpZXMuTWljcm9DaGFydCkge1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QgPSByZW1vdmVDaGFydEFubm90YXRpb25zKGFubm90YXRpb25PYmplY3QpO1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3RzW2Fubm90YXRpb25LZXldID0gYW5ub3RhdGlvbk9iamVjdDtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSWRlbnRpZmljYXRpb25cIjpcblx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLkludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QgPSByZW1vdmVJQk5Bbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0KTtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0c1thbm5vdGF0aW9uS2V5XSA9IGFubm90YXRpb25PYmplY3Q7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtXCI6XG5cdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5JbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0ID0gcmVtb3ZlSUJOQW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdCk7XG5cdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdHNbYW5ub3RhdGlvbktleV0gPSBhbm5vdGF0aW9uT2JqZWN0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5NaWNyb0NoYXJ0KSB7XG5cdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdCA9IHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdCk7XG5cdFx0XHRcdFx0YW5ub3RhdGlvbk9iamVjdHNbYW5ub3RhdGlvbktleV0gPSBhbm5vdGF0aW9uT2JqZWN0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5GaWVsZEdyb3VwXCI6XG5cdFx0XHRcdGlmICghb0NhcGFiaWxpdGllcy5JbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0LkRhdGEgPSByZW1vdmVJQk5Bbm5vdGF0aW9ucyhhbm5vdGF0aW9uT2JqZWN0LkRhdGEpO1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3RzW2Fubm90YXRpb25LZXldID0gYW5ub3RhdGlvbk9iamVjdDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIW9DYXBhYmlsaXRpZXMuTWljcm9DaGFydCkge1xuXHRcdFx0XHRcdGFubm90YXRpb25PYmplY3QuRGF0YSA9IHJlbW92ZUNoYXJ0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbk9iamVjdC5EYXRhKTtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0c1thbm5vdGF0aW9uS2V5XSA9IGFubm90YXRpb25PYmplY3Q7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLlByZXNlbnRhdGlvblZhcmlhbnRcIjpcblx0XHRcdFx0aWYgKCFvQ2FwYWJpbGl0aWVzLkNoYXJ0ICYmIGFubm90YXRpb25PYmplY3QuVmlzdWFsaXphdGlvbnMpIHtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zID0gaGFuZGxlUHJlc2VudGF0aW9uVmFyaWFudChhbm5vdGF0aW9uT2JqZWN0LlZpc3VhbGl6YXRpb25zKTtcblx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0c1thbm5vdGF0aW9uS2V5XSA9IGFubm90YXRpb25PYmplY3Q7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRsZXQgY3VycmVudE91dEFubm90YXRpb25PYmplY3QgPSBvdXRBbm5vdGF0aW9uT2JqZWN0O1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGFubm90YXRpb24gb2YgYW5ub3RhdGlvblxuXHRcdGNvbnN0IGFubm90YXRpb25PZkFubm90YXRpb25TcGxpdCA9IGFubm90YXRpb25LZXkuc3BsaXQoXCJAXCIpO1xuXHRcdGlmIChhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXQubGVuZ3RoID4gMikge1xuXHRcdFx0Y3VycmVudE91dEFubm90YXRpb25PYmplY3QgPSBnZXRPckNyZWF0ZUFubm90YXRpb25MaXN0KFxuXHRcdFx0XHRhbm5vdGF0aW9uVGFyZ2V0ICsgXCJAXCIgKyBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMV0sXG5cdFx0XHRcdGFubm90YXRpb25MaXN0c1xuXHRcdFx0KTtcblx0XHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMl07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uT2ZBbm5vdGF0aW9uU3BsaXRbMV07XG5cdFx0fVxuXG5cdFx0Y29uc3QgYW5ub3RhdGlvblF1YWxpZmllclNwbGl0ID0gYW5ub3RhdGlvbktleS5zcGxpdChcIiNcIik7XG5cdFx0Y29uc3QgcXVhbGlmaWVyID0gYW5ub3RhdGlvblF1YWxpZmllclNwbGl0WzFdO1xuXHRcdGFubm90YXRpb25LZXkgPSBhbm5vdGF0aW9uUXVhbGlmaWVyU3BsaXRbMF07XG5cblx0XHRjb25zdCBwYXJzZWRBbm5vdGF0aW9uT2JqZWN0OiBhbnkgPSB7XG5cdFx0XHR0ZXJtOiBgJHthbm5vdGF0aW9uS2V5fWAsXG5cdFx0XHRxdWFsaWZpZXI6IHF1YWxpZmllclxuXHRcdH07XG5cdFx0bGV0IGN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0ID0gYW5ub3RhdGlvblRhcmdldCArIFwiQFwiICsgcGFyc2VkQW5ub3RhdGlvbk9iamVjdC50ZXJtO1xuXHRcdGlmIChxdWFsaWZpZXIpIHtcblx0XHRcdGN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0ICs9IFwiI1wiICsgcXVhbGlmaWVyO1xuXHRcdH1cblx0XHRsZXQgaXNDb2xsZWN0aW9uID0gZmFsc2U7XG5cdFx0Y29uc3QgdHlwZW9mQW5ub3RhdGlvbiA9IHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0O1xuXHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0ID09PSBudWxsKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkJvb2xcIiwgQm9vbDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mQW5ub3RhdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJTdHJpbmdcIiwgU3RyaW5nOiBhbm5vdGF0aW9uT2JqZWN0IH07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2ZBbm5vdGF0aW9uID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJCb29sXCIsIEJvb2w6IGFubm90YXRpb25PYmplY3QgfTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZkFubm90YXRpb24gPT09IFwibnVtYmVyXCIpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiSW50XCIsIEludDogYW5ub3RhdGlvbk9iamVjdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kSWYgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJJZlwiLCBJZjogYW5ub3RhdGlvbk9iamVjdC4kSWYgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkFuZFwiLCBBbmQ6IGFubm90YXRpb25PYmplY3QuJEFuZCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kT3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJPclwiLCBPcjogYW5ub3RhdGlvbk9iamVjdC4kT3IgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5vdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIk5vdFwiLCBOb3Q6IGFubm90YXRpb25PYmplY3QuJE5vdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kRXEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJFcVwiLCBFcTogYW5ub3RhdGlvbk9iamVjdC4kRXEgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJE5lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiTmVcIiwgTmU6IGFubm90YXRpb25PYmplY3QuJE5lIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRHdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkd0XCIsIEd0OiBhbm5vdGF0aW9uT2JqZWN0LiRHdCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kR2UgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJHZVwiLCBHZTogYW5ub3RhdGlvbk9iamVjdC4kR2UgfTtcblx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3QuJEx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiTHRcIiwgTHQ6IGFubm90YXRpb25PYmplY3QuJEx0IH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRMZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIkxlXCIsIExlOiBhbm5vdGF0aW9uT2JqZWN0LiRMZSB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQXBwbHkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHsgdHlwZTogXCJBcHBseVwiLCBBcHBseTogYW5ub3RhdGlvbk9iamVjdC4kQXBwbHksIEZ1bmN0aW9uOiBhbm5vdGF0aW9uT2JqZWN0LiRGdW5jdGlvbiB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LnZhbHVlID0geyB0eXBlOiBcIlBhdGhcIiwgUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kUGF0aCB9O1xuXHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGFyc2VkQW5ub3RhdGlvbk9iamVjdC52YWx1ZSA9IHtcblx0XHRcdFx0dHlwZTogXCJBbm5vdGF0aW9uUGF0aFwiLFxuXHRcdFx0XHRBbm5vdGF0aW9uUGF0aDogYW5ub3RhdGlvbk9iamVjdC4kQW5ub3RhdGlvblBhdGhcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiREZWNpbWFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7IHR5cGU6IFwiRGVjaW1hbFwiLCBEZWNpbWFsOiBwYXJzZUZsb2F0KGFubm90YXRpb25PYmplY3QuJERlY2ltYWwpIH07XG5cdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QudmFsdWUgPSB7XG5cdFx0XHRcdHR5cGU6IFwiRW51bU1lbWJlclwiLFxuXHRcdFx0XHRFbnVtTWVtYmVyOiBtYXBOYW1lVG9BbGlhcyhhbm5vdGF0aW9uT2JqZWN0LiRFbnVtTWVtYmVyLnNwbGl0KFwiL1wiKVswXSkgKyBcIi9cIiArIGFubm90YXRpb25PYmplY3QuJEVudW1NZW1iZXIuc3BsaXQoXCIvXCIpWzFdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhbm5vdGF0aW9uT2JqZWN0KSkge1xuXHRcdFx0aXNDb2xsZWN0aW9uID0gdHJ1ZTtcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiA9IGFubm90YXRpb25PYmplY3QubWFwKChzdWJBbm5vdGF0aW9uT2JqZWN0LCBzdWJBbm5vdGF0aW9uSW5kZXgpID0+XG5cdFx0XHRcdHBhcnNlQW5ub3RhdGlvbk9iamVjdChcblx0XHRcdFx0XHRzdWJBbm5vdGF0aW9uT2JqZWN0LFxuXHRcdFx0XHRcdGN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0ICsgXCIvXCIgKyBzdWJBbm5vdGF0aW9uSW5kZXgsXG5cdFx0XHRcdFx0YW5ub3RhdGlvbkxpc3RzLFxuXHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0KVxuXHRcdFx0KTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0aWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlByb3BlcnR5UGF0aFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkUGF0aFwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJQYXRoXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEFubm90YXRpb25QYXRoXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkFubm90YXRpb25QYXRoXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlJlY29yZFwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkSWZcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiSWZcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE9yXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIk9yXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRFcVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJFcVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTmVcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTmVcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJE5vdFwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJOb3RcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJEd0XCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkd0XCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRHZVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJHZVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGFubm90YXRpb25PYmplY3RbMF0uaGFzT3duUHJvcGVydHkoXCIkTHRcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiTHRcIjtcblx0XHRcdFx0fSBlbHNlIGlmIChhbm5vdGF0aW9uT2JqZWN0WzBdLmhhc093blByb3BlcnR5KFwiJExlXCIpKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIkxlXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBbmRcIikpIHtcblx0XHRcdFx0XHQocGFyc2VkQW5ub3RhdGlvbk9iamVjdC5jb2xsZWN0aW9uIGFzIGFueSkudHlwZSA9IFwiQW5kXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYW5ub3RhdGlvbk9iamVjdFswXS5oYXNPd25Qcm9wZXJ0eShcIiRBcHBseVwiKSkge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJBcHBseVwiO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBhbm5vdGF0aW9uT2JqZWN0WzBdID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0KHBhcnNlZEFubm90YXRpb25PYmplY3QuY29sbGVjdGlvbiBhcyBhbnkpLnR5cGUgPSBcIlJlY29yZFwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdChwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmNvbGxlY3Rpb24gYXMgYW55KS50eXBlID0gXCJTdHJpbmdcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCByZWNvcmQ6IEFubm90YXRpb25SZWNvcmQgPSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzOiBbXVxuXHRcdFx0fTtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0LiRUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IHR5cGVWYWx1ZSA9IGFubm90YXRpb25PYmplY3QuJFR5cGU7XG5cdFx0XHRcdHJlY29yZC50eXBlID0gYCR7dHlwZVZhbHVlfWA7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlczogYW55W10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlLZXkgaW4gYW5ub3RhdGlvbk9iamVjdCkge1xuXHRcdFx0XHRpZiAocHJvcGVydHlLZXkgIT09IFwiJFR5cGVcIiAmJiAhcHJvcGVydHlLZXkuc3RhcnRzV2l0aChcIkBcIikpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlcy5wdXNoKFxuXHRcdFx0XHRcdFx0cGFyc2VQcm9wZXJ0eVZhbHVlKFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uT2JqZWN0W3Byb3BlcnR5S2V5XSxcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlLZXksXG5cdFx0XHRcdFx0XHRcdGN1cnJlbnRBbm5vdGF0aW9uVGFyZ2V0LFxuXHRcdFx0XHRcdFx0XHRhbm5vdGF0aW9uTGlzdHMsXG5cdFx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5S2V5LnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG5cdFx0XHRcdFx0Ly8gQW5ub3RhdGlvbiBvZiByZWNvcmRcblx0XHRcdFx0XHRjcmVhdGVBbm5vdGF0aW9uTGlzdHMoXG5cdFx0XHRcdFx0XHR7IFtwcm9wZXJ0eUtleV06IGFubm90YXRpb25PYmplY3RbcHJvcGVydHlLZXldIH0sXG5cdFx0XHRcdFx0XHRjdXJyZW50QW5ub3RhdGlvblRhcmdldCxcblx0XHRcdFx0XHRcdGFubm90YXRpb25MaXN0cyxcblx0XHRcdFx0XHRcdG9DYXBhYmlsaXRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZWNvcmQucHJvcGVydHlWYWx1ZXMgPSBwcm9wZXJ0eVZhbHVlcztcblx0XHRcdHBhcnNlZEFubm90YXRpb25PYmplY3QucmVjb3JkID0gcmVjb3JkO1xuXHRcdH1cblx0XHRwYXJzZWRBbm5vdGF0aW9uT2JqZWN0LmlzQ29sbGVjdGlvbiA9IGlzQ29sbGVjdGlvbjtcblx0XHRjdXJyZW50T3V0QW5ub3RhdGlvbk9iamVjdC5hbm5vdGF0aW9ucy5wdXNoKHBhcnNlZEFubm90YXRpb25PYmplY3QpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVQcm9wZXJ0eShwcm9wZXJ0eURlZmluaXRpb246IGFueSwgZW50aXR5VHlwZU9iamVjdDogRW50aXR5VHlwZSB8IENvbXBsZXhUeXBlLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IFByb3BlcnR5IHtcblx0Y29uc3QgcHJvcGVydHlPYmplY3Q6IFByb3BlcnR5ID0ge1xuXHRcdF90eXBlOiBcIlByb3BlcnR5XCIsXG5cdFx0bmFtZTogcHJvcGVydHlOYW1lLFxuXHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7ZW50aXR5VHlwZU9iamVjdC5mdWxseVF1YWxpZmllZE5hbWV9LyR7cHJvcGVydHlOYW1lfWAsXG5cdFx0dHlwZTogcHJvcGVydHlEZWZpbml0aW9uLiRUeXBlLFxuXHRcdG1heExlbmd0aDogcHJvcGVydHlEZWZpbml0aW9uLiRNYXhMZW5ndGgsXG5cdFx0cHJlY2lzaW9uOiBwcm9wZXJ0eURlZmluaXRpb24uJFByZWNpc2lvbixcblx0XHRzY2FsZTogcHJvcGVydHlEZWZpbml0aW9uLiRTY2FsZSxcblx0XHRudWxsYWJsZTogcHJvcGVydHlEZWZpbml0aW9uLiROdWxsYWJsZVxuXHR9O1xuXHRyZXR1cm4gcHJvcGVydHlPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVOYXZpZ2F0aW9uUHJvcGVydHkoXG5cdG5hdlByb3BlcnR5RGVmaW5pdGlvbjogYW55LFxuXHRlbnRpdHlUeXBlT2JqZWN0OiBFbnRpdHlUeXBlIHwgQ29tcGxleFR5cGUsXG5cdG5hdlByb3BlcnR5TmFtZTogc3RyaW5nXG4pOiBWNE5hdmlnYXRpb25Qcm9wZXJ0eSB7XG5cdGxldCByZWZlcmVudGlhbENvbnN0cmFpbnQ6IFJlZmVyZW50aWFsQ29uc3RyYWludFtdID0gW107XG5cdGlmIChuYXZQcm9wZXJ0eURlZmluaXRpb24uJFJlZmVyZW50aWFsQ29uc3RyYWludCkge1xuXHRcdHJlZmVyZW50aWFsQ29uc3RyYWludCA9IE9iamVjdC5rZXlzKG5hdlByb3BlcnR5RGVmaW5pdGlvbi4kUmVmZXJlbnRpYWxDb25zdHJhaW50KS5tYXAoc291cmNlUHJvcGVydHlOYW1lID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNvdXJjZVR5cGVOYW1lOiBlbnRpdHlUeXBlT2JqZWN0Lm5hbWUsXG5cdFx0XHRcdHNvdXJjZVByb3BlcnR5OiBzb3VyY2VQcm9wZXJ0eU5hbWUsXG5cdFx0XHRcdHRhcmdldFR5cGVOYW1lOiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJFR5cGUsXG5cdFx0XHRcdHRhcmdldFByb3BlcnR5OiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJFJlZmVyZW50aWFsQ29uc3RyYWludFtzb3VyY2VQcm9wZXJ0eU5hbWVdXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eTogVjROYXZpZ2F0aW9uUHJvcGVydHkgPSB7XG5cdFx0X3R5cGU6IFwiTmF2aWdhdGlvblByb3BlcnR5XCIsXG5cdFx0bmFtZTogbmF2UHJvcGVydHlOYW1lLFxuXHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7ZW50aXR5VHlwZU9iamVjdC5mdWxseVF1YWxpZmllZE5hbWV9LyR7bmF2UHJvcGVydHlOYW1lfWAsXG5cdFx0cGFydG5lcjogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRQYXJ0bmVyLFxuXHRcdGlzQ29sbGVjdGlvbjogbmF2UHJvcGVydHlEZWZpbml0aW9uLiRpc0NvbGxlY3Rpb24gPyBuYXZQcm9wZXJ0eURlZmluaXRpb24uJGlzQ29sbGVjdGlvbiA6IGZhbHNlLFxuXHRcdGNvbnRhaW5zVGFyZ2V0OiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJENvbnRhaW5zVGFyZ2V0LFxuXHRcdHRhcmdldFR5cGVOYW1lOiBuYXZQcm9wZXJ0eURlZmluaXRpb24uJFR5cGUsXG5cdFx0cmVmZXJlbnRpYWxDb25zdHJhaW50XG5cdH07XG5cblx0cmV0dXJuIG5hdmlnYXRpb25Qcm9wZXJ0eTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUVudGl0eVNldChlbnRpdHlTZXREZWZpbml0aW9uOiBhbnksIGVudGl0eVNldE5hbWU6IHN0cmluZywgZW50aXR5Q29udGFpbmVyTmFtZTogc3RyaW5nKTogRW50aXR5U2V0IHtcblx0Y29uc3QgZW50aXR5U2V0T2JqZWN0OiBFbnRpdHlTZXQgPSB7XG5cdFx0X3R5cGU6IFwiRW50aXR5U2V0XCIsXG5cdFx0bmFtZTogZW50aXR5U2V0TmFtZSxcblx0XHRuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nOiB7fSxcblx0XHRlbnRpdHlUeXBlTmFtZTogZW50aXR5U2V0RGVmaW5pdGlvbi4kVHlwZSxcblx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGAke2VudGl0eUNvbnRhaW5lck5hbWV9LyR7ZW50aXR5U2V0TmFtZX1gXG5cdH07XG5cdHJldHVybiBlbnRpdHlTZXRPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVTaW5nbGV0b24oc2luZ2xldG9uRGVmaW5pdGlvbjogYW55LCBzaW5nbGV0b25OYW1lOiBzdHJpbmcsIGVudGl0eUNvbnRhaW5lck5hbWU6IHN0cmluZyk6IFNpbmdsZXRvbiB7XG5cdGNvbnN0IHNpbmdsZXRvbk9iamVjdDogU2luZ2xldG9uID0ge1xuXHRcdF90eXBlOiBcIlNpbmdsZXRvblwiLFxuXHRcdG5hbWU6IHNpbmdsZXRvbk5hbWUsXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5QmluZGluZzoge30sXG5cdFx0dHlwZU5hbWU6IHNpbmdsZXRvbkRlZmluaXRpb24uJFR5cGUsXG5cdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtlbnRpdHlDb250YWluZXJOYW1lfS8ke3NpbmdsZXRvbk5hbWV9YCxcblx0XHRudWxsYWJsZTogdHJ1ZVxuXHR9O1xuXHRyZXR1cm4gc2luZ2xldG9uT2JqZWN0O1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVHlwZURlZmluaXRpb24odHlwZURlZmluaXRpb246IGFueSwgdHlwZU5hbWU6IHN0cmluZywgbmFtZXNwYWNlOiBzdHJpbmcpOiBUeXBlRGVmaW5pdGlvbiB7XG5cdGNvbnN0IHR5cGVPYmplY3Q6IFR5cGVEZWZpbml0aW9uID0ge1xuXHRcdF90eXBlOiBcIlR5cGVEZWZpbml0aW9uXCIsXG5cdFx0bmFtZTogdHlwZU5hbWUucmVwbGFjZShuYW1lc3BhY2UgKyBcIi5cIiwgXCJcIiksXG5cdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiB0eXBlTmFtZSxcblx0XHR1bmRlcmx5aW5nVHlwZTogdHlwZURlZmluaXRpb24uJFVuZGVybHlpbmdUeXBlXG5cdH07XG5cdHJldHVybiB0eXBlT2JqZWN0O1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlQ29tcGxleFR5cGUoY29tcGxleFR5cGVEZWZpbml0aW9uOiBhbnksIGNvbXBsZXhUeXBlTmFtZTogc3RyaW5nLCBuYW1lc3BhY2U6IHN0cmluZyk6IENvbXBsZXhUeXBlIHtcblx0Y29uc3QgY29tcGxleFR5cGVPYmplY3Q6IENvbXBsZXhUeXBlID0ge1xuXHRcdF90eXBlOiBcIkNvbXBsZXhUeXBlXCIsXG5cdFx0bmFtZTogY29tcGxleFR5cGVOYW1lLnJlcGxhY2UobmFtZXNwYWNlICsgXCIuXCIsIFwiXCIpLFxuXHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogY29tcGxleFR5cGVOYW1lLFxuXHRcdHByb3BlcnRpZXM6IFtdLFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXVxuXHR9O1xuXG5cdGNvbnN0IGNvbXBsZXhUeXBlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGNvbXBsZXhUeXBlRGVmaW5pdGlvbilcblx0XHQuZmlsdGVyKHByb3BlcnR5TmFtZU9yTm90ID0+IHtcblx0XHRcdGlmIChwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRLZXlcIiAmJiBwcm9wZXJ0eU5hbWVPck5vdCAhPSBcIiRraW5kXCIpIHtcblx0XHRcdFx0cmV0dXJuIGNvbXBsZXhUeXBlRGVmaW5pdGlvbltwcm9wZXJ0eU5hbWVPck5vdF0uJGtpbmQgPT09IFwiUHJvcGVydHlcIjtcblx0XHRcdH1cblx0XHR9KVxuXHRcdC5zb3J0KChhLCBiKSA9PiAoYSA+IGIgPyAxIDogLTEpKVxuXHRcdC5tYXAocHJvcGVydHlOYW1lID0+IHtcblx0XHRcdHJldHVybiBwcmVwYXJlUHJvcGVydHkoY29tcGxleFR5cGVEZWZpbml0aW9uW3Byb3BlcnR5TmFtZV0sIGNvbXBsZXhUeXBlT2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXHRcdH0pO1xuXG5cdGNvbXBsZXhUeXBlT2JqZWN0LnByb3BlcnRpZXMgPSBjb21wbGV4VHlwZVByb3BlcnRpZXM7XG5cdGNvbnN0IGNvbXBsZXhUeXBlTmF2aWdhdGlvblByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhjb21wbGV4VHlwZURlZmluaXRpb24pXG5cdFx0LmZpbHRlcihwcm9wZXJ0eU5hbWVPck5vdCA9PiB7XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lT3JOb3QgIT0gXCIkS2V5XCIgJiYgcHJvcGVydHlOYW1lT3JOb3QgIT0gXCIka2luZFwiKSB7XG5cdFx0XHRcdHJldHVybiBjb21wbGV4VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiO1xuXHRcdFx0fVxuXHRcdH0pXG5cdFx0LnNvcnQoKGEsIGIpID0+IChhID4gYiA/IDEgOiAtMSkpXG5cdFx0Lm1hcChuYXZQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0cmV0dXJuIHByZXBhcmVOYXZpZ2F0aW9uUHJvcGVydHkoY29tcGxleFR5cGVEZWZpbml0aW9uW25hdlByb3BlcnR5TmFtZV0sIGNvbXBsZXhUeXBlT2JqZWN0LCBuYXZQcm9wZXJ0eU5hbWUpO1xuXHRcdH0pO1xuXHRjb21wbGV4VHlwZU9iamVjdC5uYXZpZ2F0aW9uUHJvcGVydGllcyA9IGNvbXBsZXhUeXBlTmF2aWdhdGlvblByb3BlcnRpZXM7XG5cdHJldHVybiBjb21wbGV4VHlwZU9iamVjdDtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUVudGl0eUtleXMoZW50aXR5VHlwZURlZmluaXRpb246IGFueSwgb01ldGFNb2RlbERhdGE6IGFueSk6IGFueSB7XG5cdGlmICghZW50aXR5VHlwZURlZmluaXRpb24uJEtleSAmJiBlbnRpdHlUeXBlRGVmaW5pdGlvbi4kQmFzZVR5cGUpIHtcblx0XHRyZXR1cm4gcHJlcGFyZUVudGl0eUtleXMob01ldGFNb2RlbERhdGFbYCR7ZW50aXR5VHlwZURlZmluaXRpb24uJEJhc2VUeXBlfWBdLCBvTWV0YU1vZGVsRGF0YSk7XG5cdH1cblx0cmV0dXJuIGVudGl0eVR5cGVEZWZpbml0aW9uLiRLZXkgfHwgW107IC8vaGFuZGxpbmcgb2YgZW50aXR5IHR5cGVzIHdpdGhvdXQga2V5IGFzIHdlbGwgYXMgYmFzZXR5cGVcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUVudGl0eVR5cGUoZW50aXR5VHlwZURlZmluaXRpb246IGFueSwgZW50aXR5VHlwZU5hbWU6IHN0cmluZywgbmFtZXNwYWNlOiBzdHJpbmcsIG1ldGFNb2RlbERhdGE6IGFueSk6IEVudGl0eVR5cGUge1xuXHRjb25zdCBlbnRpdHlLZXlzOiBhbnkgPSBwcmVwYXJlRW50aXR5S2V5cyhlbnRpdHlUeXBlRGVmaW5pdGlvbiwgbWV0YU1vZGVsRGF0YSk7XG5cblx0Y29uc3QgZW50aXR5VHlwZU9iamVjdDogRW50aXR5VHlwZSA9IHtcblx0XHRfdHlwZTogXCJFbnRpdHlUeXBlXCIsXG5cdFx0bmFtZTogZW50aXR5VHlwZU5hbWUucmVwbGFjZShuYW1lc3BhY2UgKyBcIi5cIiwgXCJcIiksXG5cdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBlbnRpdHlUeXBlTmFtZSxcblx0XHRrZXlzOiBbXSxcblx0XHRlbnRpdHlQcm9wZXJ0aWVzOiBbXSxcblx0XHRuYXZpZ2F0aW9uUHJvcGVydGllczogW11cblx0fTtcblxuXHRjb25zdCBlbnRpdHlQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMoZW50aXR5VHlwZURlZmluaXRpb24pXG5cdFx0LmZpbHRlcihwcm9wZXJ0eU5hbWVPck5vdCA9PiB7XG5cdFx0XHRpZiAocHJvcGVydHlOYW1lT3JOb3QgIT0gXCIkS2V5XCIgJiYgcHJvcGVydHlOYW1lT3JOb3QgIT0gXCIka2luZFwiKSB7XG5cdFx0XHRcdHJldHVybiBlbnRpdHlUeXBlRGVmaW5pdGlvbltwcm9wZXJ0eU5hbWVPck5vdF0uJGtpbmQgPT09IFwiUHJvcGVydHlcIjtcblx0XHRcdH1cblx0XHR9KVxuXHRcdC5tYXAocHJvcGVydHlOYW1lID0+IHtcblx0XHRcdHJldHVybiBwcmVwYXJlUHJvcGVydHkoZW50aXR5VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lXSwgZW50aXR5VHlwZU9iamVjdCwgcHJvcGVydHlOYW1lKTtcblx0XHR9KTtcblxuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGVudGl0eVR5cGVEZWZpbml0aW9uKVxuXHRcdC5maWx0ZXIocHJvcGVydHlOYW1lT3JOb3QgPT4ge1xuXHRcdFx0aWYgKHByb3BlcnR5TmFtZU9yTm90ICE9IFwiJEtleVwiICYmIHByb3BlcnR5TmFtZU9yTm90ICE9IFwiJGtpbmRcIikge1xuXHRcdFx0XHRyZXR1cm4gZW50aXR5VHlwZURlZmluaXRpb25bcHJvcGVydHlOYW1lT3JOb3RdLiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiO1xuXHRcdFx0fVxuXHRcdH0pXG5cdFx0Lm1hcChuYXZQcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0cmV0dXJuIHByZXBhcmVOYXZpZ2F0aW9uUHJvcGVydHkoZW50aXR5VHlwZURlZmluaXRpb25bbmF2UHJvcGVydHlOYW1lXSwgZW50aXR5VHlwZU9iamVjdCwgbmF2UHJvcGVydHlOYW1lKTtcblx0XHR9KTtcblxuXHRlbnRpdHlUeXBlT2JqZWN0LmtleXMgPSBlbnRpdHlLZXlzXG5cdFx0Lm1hcCgoZW50aXR5S2V5OiBzdHJpbmcpID0+IGVudGl0eVByb3BlcnRpZXMuZmluZCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lID09PSBlbnRpdHlLZXkpKVxuXHRcdC5maWx0ZXIoKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4gcHJvcGVydHkgIT09IHVuZGVmaW5lZCk7XG5cdGVudGl0eVR5cGVPYmplY3QuZW50aXR5UHJvcGVydGllcyA9IGVudGl0eVByb3BlcnRpZXM7XG5cdGVudGl0eVR5cGVPYmplY3QubmF2aWdhdGlvblByb3BlcnRpZXMgPSBuYXZpZ2F0aW9uUHJvcGVydGllcztcblxuXHRyZXR1cm4gZW50aXR5VHlwZU9iamVjdDtcbn1cbmZ1bmN0aW9uIHByZXBhcmVBY3Rpb24oYWN0aW9uTmFtZTogc3RyaW5nLCBhY3Rpb25SYXdEYXRhOiBNZXRhTW9kZWxBY3Rpb24sIG5hbWVzcGFjZTogc3RyaW5nLCBlbnRpdHlDb250YWluZXJOYW1lOiBzdHJpbmcpOiBBY3Rpb24ge1xuXHRsZXQgYWN0aW9uRW50aXR5VHlwZTogc3RyaW5nID0gXCJcIjtcblx0bGV0IGFjdGlvbkZRTiA9IGAke2FjdGlvbk5hbWV9YDtcblx0Y29uc3QgYWN0aW9uU2hvcnROYW1lID0gYWN0aW9uTmFtZS5zdWJzdHIobmFtZXNwYWNlLmxlbmd0aCArIDEpO1xuXHRpZiAoYWN0aW9uUmF3RGF0YS4kSXNCb3VuZCkge1xuXHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXIgPSBhY3Rpb25SYXdEYXRhLiRQYXJhbWV0ZXJbMF07XG5cdFx0YWN0aW9uRW50aXR5VHlwZSA9IGJpbmRpbmdQYXJhbWV0ZXIuJFR5cGU7XG5cdFx0aWYgKGJpbmRpbmdQYXJhbWV0ZXIuJGlzQ29sbGVjdGlvbiA9PT0gdHJ1ZSkge1xuXHRcdFx0YWN0aW9uRlFOID0gYCR7YWN0aW9uTmFtZX0oQ29sbGVjdGlvbigke2FjdGlvbkVudGl0eVR5cGV9KSlgO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhY3Rpb25GUU4gPSBgJHthY3Rpb25OYW1lfSgke2FjdGlvbkVudGl0eVR5cGV9KWA7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGFjdGlvbkZRTiA9IGAke2VudGl0eUNvbnRhaW5lck5hbWV9LyR7YWN0aW9uU2hvcnROYW1lfWA7XG5cdH1cblx0Y29uc3QgcGFyYW1ldGVycyA9IGFjdGlvblJhd0RhdGEuJFBhcmFtZXRlciB8fCBbXTtcblx0cmV0dXJuIHtcblx0XHRfdHlwZTogXCJBY3Rpb25cIixcblx0XHRuYW1lOiBhY3Rpb25TaG9ydE5hbWUsXG5cdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBhY3Rpb25GUU4sXG5cdFx0aXNCb3VuZDogYWN0aW9uUmF3RGF0YS4kSXNCb3VuZCxcblx0XHRpc0Z1bmN0aW9uOiBmYWxzZSxcblx0XHRzb3VyY2VUeXBlOiBhY3Rpb25FbnRpdHlUeXBlLFxuXHRcdHJldHVyblR5cGU6IGFjdGlvblJhd0RhdGEuJFJldHVyblR5cGUgPyBhY3Rpb25SYXdEYXRhLiRSZXR1cm5UeXBlLiRUeXBlIDogXCJcIixcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzLm1hcChwYXJhbSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRfdHlwZTogXCJBY3Rpb25QYXJhbWV0ZXJcIixcblx0XHRcdFx0aXNFbnRpdHlTZXQ6IHBhcmFtLiRUeXBlID09PSBhY3Rpb25SYXdEYXRhLiRFbnRpdHlTZXRQYXRoLFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGAke2FjdGlvbkZRTn0vJHtwYXJhbS4kTmFtZX1gLFxuXHRcdFx0XHR0eXBlOiBwYXJhbS4kVHlwZVxuXHRcdFx0XHQvLyBUT0RPIG1pc3NpbmcgcHJvcGVydGllcyA/XG5cdFx0XHR9O1xuXHRcdH0pXG5cdH07XG59XG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUVudGl0eVR5cGVzKFxuXHRvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0b0NhcGFiaWxpdGllczogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgPSBEZWZhdWx0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXNcbik6IFBhcnNlck91dHB1dCB7XG5cdGNvbnN0IG9NZXRhTW9kZWxEYXRhID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvJFwiKTtcblx0Y29uc3QgYW5ub3RhdGlvbkxpc3RzOiBSZWNvcmQ8c3RyaW5nLCBBbm5vdGF0aW9uTGlzdD4gPSB7fTtcblx0Y29uc3QgZW50aXR5VHlwZXM6IEVudGl0eVR5cGVbXSA9IFtdO1xuXHRjb25zdCBlbnRpdHlTZXRzOiBFbnRpdHlTZXRbXSA9IFtdO1xuXHRjb25zdCBzaW5nbGV0b25zOiBTaW5nbGV0b25bXSA9IFtdO1xuXHRjb25zdCBjb21wbGV4VHlwZXM6IENvbXBsZXhUeXBlW10gPSBbXTtcblx0Y29uc3QgdHlwZURlZmluaXRpb25zOiBUeXBlRGVmaW5pdGlvbltdID0gW107XG5cdGNvbnN0IGVudGl0eUNvbnRhaW5lck5hbWUgPSBvTWV0YU1vZGVsRGF0YS4kRW50aXR5Q29udGFpbmVyO1xuXHRsZXQgbmFtZXNwYWNlID0gXCJcIjtcblx0Y29uc3Qgc2NoZW1hS2V5cyA9IE9iamVjdC5rZXlzKG9NZXRhTW9kZWxEYXRhKS5maWx0ZXIobWV0YW1vZGVsS2V5ID0+IG9NZXRhTW9kZWxEYXRhW21ldGFtb2RlbEtleV0uJGtpbmQgPT09IFwiU2NoZW1hXCIpO1xuXHRpZiAoc2NoZW1hS2V5cyAmJiBzY2hlbWFLZXlzLmxlbmd0aCA+IDApIHtcblx0XHRuYW1lc3BhY2UgPSBzY2hlbWFLZXlzWzBdLnN1YnN0cigwLCBzY2hlbWFLZXlzWzBdLmxlbmd0aCAtIDEpO1xuXHR9IGVsc2UgaWYgKGVudGl0eVR5cGVzICYmIGVudGl0eVR5cGVzLmxlbmd0aCkge1xuXHRcdG5hbWVzcGFjZSA9IGVudGl0eVR5cGVzWzBdLmZ1bGx5UXVhbGlmaWVkTmFtZS5yZXBsYWNlKGVudGl0eVR5cGVzWzBdLm5hbWUsIFwiXCIpO1xuXHRcdG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5zdWJzdHIoMCwgbmFtZXNwYWNlLmxlbmd0aCAtIDEpO1xuXHR9XG5cdE9iamVjdC5rZXlzKG9NZXRhTW9kZWxEYXRhKS5mb3JFYWNoKHNPYmplY3ROYW1lID0+IHtcblx0XHRpZiAoc09iamVjdE5hbWUgIT09IFwiJGtpbmRcIikge1xuXHRcdFx0c3dpdGNoIChvTWV0YU1vZGVsRGF0YVtzT2JqZWN0TmFtZV0uJGtpbmQpIHtcblx0XHRcdFx0Y2FzZSBcIkVudGl0eVR5cGVcIjpcblx0XHRcdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gcHJlcGFyZUVudGl0eVR5cGUob01ldGFNb2RlbERhdGFbc09iamVjdE5hbWVdLCBzT2JqZWN0TmFtZSwgbmFtZXNwYWNlLCBvTWV0YU1vZGVsRGF0YSk7XG5cdFx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgYXJlIGZpbHRlciBmYWNldHMgZGVmaW5lZCBmb3IgdGhlIGVudGl0eVR5cGUgYW5kIGlmIHllcywgY2hlY2sgaWYgYWxsIG9mIHRoZW0gaGF2ZSBhbiBJRFxuXHRcdFx0XHRcdC8vIFRoZSBJRCBpcyBvcHRpb25hbCwgYnV0IGl0IGlzIGludGVybmFsbHkgdGFrZW4gZm9yIGdyb3VwaW5nIGZpbHRlciBmaWVsZHMgYW5kIGlmIGl0J3Mgbm90IHByZXNlbnRcblx0XHRcdFx0XHQvLyBhIGZhbGxiYWNrIElEIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBoZXJlLlxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9uc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gJiZcblx0XHRcdFx0XHRcdG9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9uc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV1bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRmlsdGVyRmFjZXRzXCJdXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkZpbHRlckZhY2V0c1wiXS5mb3JFYWNoKFxuXHRcdFx0XHRcdFx0XHQoZmlsdGVyRmFjZXRBbm5vdGF0aW9uOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXJGYWNldEFubm90YXRpb24uSUQgPSBmaWx0ZXJGYWNldEFubm90YXRpb24uSUQgfHwgZ2VuZXJhdGUoW3sgRmFjZXQ6IGZpbHRlckZhY2V0QW5ub3RhdGlvbiB9XSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5mb3JFYWNoKGVudGl0eVByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdGlmICghb01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW2VudGl0eVByb3BlcnR5LmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB7fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0IW9NZXRhTW9kZWxEYXRhLiRBbm5vdGF0aW9uc1tlbnRpdHlQcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWVdW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZERlZmF1bHRcIl1cblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnNbZW50aXR5UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lXVtcblx0XHRcdFx0XHRcdFx0XHRcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGREZWZhdWx0XCJcblx0XHRcdFx0XHRcdFx0XSA9IHtcblx0XHRcdFx0XHRcdFx0XHQkVHlwZTogXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIixcblx0XHRcdFx0XHRcdFx0XHRWYWx1ZTogeyAkUGF0aDogZW50aXR5UHJvcGVydHkubmFtZSB9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0ZW50aXR5VHlwZXMucHVzaChlbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkNvbXBsZXhUeXBlXCI6XG5cdFx0XHRcdFx0Y29uc3QgY29tcGxleFR5cGUgPSBwcmVwYXJlQ29tcGxleFR5cGUob01ldGFNb2RlbERhdGFbc09iamVjdE5hbWVdLCBzT2JqZWN0TmFtZSwgbmFtZXNwYWNlKTtcblx0XHRcdFx0XHRjb21wbGV4VHlwZXMucHVzaChjb21wbGV4VHlwZSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJUeXBlRGVmaW5pdGlvblwiOlxuXHRcdFx0XHRcdGNvbnN0IHR5cGVEZWZpbml0aW9uID0gcHJlcGFyZVR5cGVEZWZpbml0aW9uKG9NZXRhTW9kZWxEYXRhW3NPYmplY3ROYW1lXSwgc09iamVjdE5hbWUsIG5hbWVzcGFjZSk7XG5cdFx0XHRcdFx0dHlwZURlZmluaXRpb25zLnB1c2godHlwZURlZmluaXRpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0Y29uc3Qgb0VudGl0eUNvbnRhaW5lciA9IG9NZXRhTW9kZWxEYXRhW2VudGl0eUNvbnRhaW5lck5hbWVdO1xuXHRPYmplY3Qua2V5cyhvRW50aXR5Q29udGFpbmVyKS5mb3JFYWNoKHNPYmplY3ROYW1lID0+IHtcblx0XHRpZiAoc09iamVjdE5hbWUgIT09IFwiJGtpbmRcIikge1xuXHRcdFx0c3dpdGNoIChvRW50aXR5Q29udGFpbmVyW3NPYmplY3ROYW1lXS4ka2luZCkge1xuXHRcdFx0XHRjYXNlIFwiRW50aXR5U2V0XCI6XG5cdFx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gcHJlcGFyZUVudGl0eVNldChvRW50aXR5Q29udGFpbmVyW3NPYmplY3ROYW1lXSwgc09iamVjdE5hbWUsIGVudGl0eUNvbnRhaW5lck5hbWUpO1xuXHRcdFx0XHRcdGVudGl0eVNldHMucHVzaChlbnRpdHlTZXQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiU2luZ2xldG9uXCI6XG5cdFx0XHRcdFx0Y29uc3Qgc2luZ2xldG9uID0gcHJlcGFyZVNpbmdsZXRvbihvRW50aXR5Q29udGFpbmVyW3NPYmplY3ROYW1lXSwgc09iamVjdE5hbWUsIGVudGl0eUNvbnRhaW5lck5hbWUpO1xuXHRcdFx0XHRcdHNpbmdsZXRvbnMucHVzaChzaW5nbGV0b24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0bGV0IGVudGl0eUNvbnRhaW5lcjogRW50aXR5Q29udGFpbmVyID0ge307XG5cdGlmIChlbnRpdHlDb250YWluZXJOYW1lKSB7XG5cdFx0ZW50aXR5Q29udGFpbmVyID0ge1xuXHRcdFx0bmFtZTogZW50aXR5Q29udGFpbmVyTmFtZS5yZXBsYWNlKG5hbWVzcGFjZSArIFwiLlwiLCBcIlwiKSxcblx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogZW50aXR5Q29udGFpbmVyTmFtZVxuXHRcdH07XG5cdH1cblx0ZW50aXR5U2V0cy5mb3JFYWNoKGVudGl0eVNldCA9PiB7XG5cdFx0Y29uc3QgbmF2UHJvcGVydHlCaW5kaW5ncyA9IG9FbnRpdHlDb250YWluZXJbZW50aXR5U2V0Lm5hbWVdLiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nO1xuXHRcdGlmIChuYXZQcm9wZXJ0eUJpbmRpbmdzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhuYXZQcm9wZXJ0eUJpbmRpbmdzKS5mb3JFYWNoKG5hdlByb3BOYW1lID0+IHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5U2V0ID0gZW50aXR5U2V0cy5maW5kKGVudGl0eVNldE5hbWUgPT4gZW50aXR5U2V0TmFtZS5uYW1lID09PSBuYXZQcm9wZXJ0eUJpbmRpbmdzW25hdlByb3BOYW1lXSk7XG5cdFx0XHRcdGlmICh0YXJnZXRFbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRlbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZQcm9wTmFtZV0gPSB0YXJnZXRFbnRpdHlTZXQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3QgYWN0aW9uczogQWN0aW9uW10gPSBPYmplY3Qua2V5cyhvTWV0YU1vZGVsRGF0YSlcblx0XHQuZmlsdGVyKGtleSA9PiB7XG5cdFx0XHRyZXR1cm4gQXJyYXkuaXNBcnJheShvTWV0YU1vZGVsRGF0YVtrZXldKSAmJiBvTWV0YU1vZGVsRGF0YVtrZXldLmxlbmd0aCA+IDAgJiYgb01ldGFNb2RlbERhdGFba2V5XVswXS4ka2luZCA9PT0gXCJBY3Rpb25cIjtcblx0XHR9KVxuXHRcdC5yZWR1Y2UoKG91dEFjdGlvbnM6IEFjdGlvbltdLCBhY3Rpb25OYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBhY3Rpb25zID0gb01ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV07XG5cdFx0XHRhY3Rpb25zLmZvckVhY2goKGFjdGlvbjogTWV0YU1vZGVsQWN0aW9uKSA9PiB7XG5cdFx0XHRcdG91dEFjdGlvbnMucHVzaChwcmVwYXJlQWN0aW9uKGFjdGlvbk5hbWUsIGFjdGlvbiwgbmFtZXNwYWNlLCBlbnRpdHlDb250YWluZXJOYW1lKSk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBvdXRBY3Rpb25zO1xuXHRcdH0sIFtdKTtcblxuXHRmb3IgKGNvbnN0IHRhcmdldCBpbiBvTWV0YU1vZGVsRGF0YS4kQW5ub3RhdGlvbnMpIHtcblx0XHRjcmVhdGVBbm5vdGF0aW9uTGlzdHMob01ldGFNb2RlbERhdGEuJEFubm90YXRpb25zW3RhcmdldF0sIHRhcmdldCwgYW5ub3RhdGlvbkxpc3RzLCBvQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8vIFNvcnQgYnkgdGFyZ2V0IGxlbmd0aFxuXHRjb25zdCBvdXRBbm5vdGF0aW9uTGlzdHMgPSBPYmplY3Qua2V5cyhhbm5vdGF0aW9uTGlzdHMpXG5cdFx0LnNvcnQoKGEsIGIpID0+IChhLmxlbmd0aCA+PSBiLmxlbmd0aCA/IDEgOiAtMSkpXG5cdFx0Lm1hcChzQW5ub3RhdGlvbk5hbWUgPT4gYW5ub3RhdGlvbkxpc3RzW3NBbm5vdGF0aW9uTmFtZV0pO1xuXHRjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VbXSA9IFtdO1xuXHRyZXR1cm4ge1xuXHRcdGlkZW50aWZpY2F0aW9uOiBcIm1ldGFtb2RlbFJlc3VsdFwiLFxuXHRcdHZlcnNpb246IFwiNC4wXCIsXG5cdFx0c2NoZW1hOiB7XG5cdFx0XHRlbnRpdHlDb250YWluZXIsXG5cdFx0XHRlbnRpdHlTZXRzLFxuXHRcdFx0ZW50aXR5VHlwZXMsXG5cdFx0XHRjb21wbGV4VHlwZXMsXG5cdFx0XHR0eXBlRGVmaW5pdGlvbnMsXG5cdFx0XHRzaW5nbGV0b25zLFxuXHRcdFx0YXNzb2NpYXRpb25zOiBbXSxcblx0XHRcdGFzc29jaWF0aW9uU2V0czogW10sXG5cdFx0XHRhY3Rpb25zLFxuXHRcdFx0bmFtZXNwYWNlLFxuXHRcdFx0YW5ub3RhdGlvbnM6IHtcblx0XHRcdFx0XCJtZXRhbW9kZWxSZXN1bHRcIjogb3V0QW5ub3RhdGlvbkxpc3RzXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyZWZlcmVuY2VzOiByZWZlcmVuY2VzXG5cdH07XG59XG5cbmNvbnN0IG1NZXRhTW9kZWxNYXA6IFJlY29yZDxzdHJpbmcsIFBhcnNlck91dHB1dD4gPSB7fTtcblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBPRGF0YU1ldGFNb2RlbCBpbnRvIGFub3RoZXIgZm9ybWF0IHRoYXQgYWxsb3cgZm9yIGVhc3kgbWFuaXB1bGF0aW9uIG9mIHRoZSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09EYXRhTWV0YU1vZGVsfSBvTWV0YU1vZGVsIFRoZSBjdXJyZW50IG9EYXRhTWV0YU1vZGVsXG4gKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHtDb252ZXJ0ZXJPdXRwdXR9IEFuIG9iamVjdCBjb250YWluaW5nIG9iamVjdCBsaWtlIGFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgb0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogQ29udmVydGVyT3V0cHV0IHtcblx0Y29uc3Qgc01ldGFNb2RlbElkID0gKG9NZXRhTW9kZWwgYXMgYW55KS5pZDtcblx0aWYgKCFtTWV0YU1vZGVsTWFwLmhhc093blByb3BlcnR5KHNNZXRhTW9kZWxJZCkpIHtcblx0XHRjb25zdCBwYXJzZWRPdXRwdXQgPSBwcmVwYXJlRW50aXR5VHlwZXMob01ldGFNb2RlbCwgb0NhcGFiaWxpdGllcyk7XG5cdFx0aWYgKG9DYXBhYmlsaXRpZXMgJiYgb0NhcGFiaWxpdGllcy5TaXR1YXRpb25zKSB7XG5cdFx0XHQvLyBPbmx5IEV4cGVyaW1lbnRhbCBGZWF0dXJlIVxuXHRcdFx0bU1ldGFNb2RlbE1hcFtzTWV0YU1vZGVsSWRdID0gYWRkU3ludGhldGljQW5ub3RhdGlvbnMoQW5ub3RhdGlvbkNvbnZlcnRlci5jb252ZXJ0VHlwZXMocGFyc2VkT3V0cHV0KSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1NZXRhTW9kZWxNYXBbc01ldGFNb2RlbElkXSA9IEFubm90YXRpb25Db252ZXJ0ZXIuY29udmVydFR5cGVzKHBhcnNlZE91dHB1dCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiAobU1ldGFNb2RlbE1hcFtzTWV0YU1vZGVsSWRdIGFzIGFueSkgYXMgQ29udmVydGVyT3V0cHV0O1xufVxuXG5mdW5jdGlvbiBhZGRTeW50aGV0aWNBbm5vdGF0aW9ucyhtZXRhTW9kZWw6IFBhcnNlck91dHB1dCkge1xuXHQvLyBbU2l0dWF0aW9ucyBQT0NdIERldGVybWluZSBtaXhlZC1pbiBzaXR1YXRpb25zIG5hdmlnYXRpb24gcHJvcGVydHkuXG5cdC8vIFRoaXMgd2lsbCBwcm9iYWJseSBoYXBwZW4gZWl0aGVyXG5cdC8vICAtIGJ5IGEgZml4ZWQgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIChcIlNBUF9fU2l0dWF0aW9uXCIpLCBvclxuXHQvLyAgLSBieSBhbiBlbnRpdHkgdHlwZSBhbm5vdGF0aW9uIHRoYXQgZGVjbGFyZXMgdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgdG8gdXNlIChzaW1pbGFyIHRvIGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcylcblx0Ly9cblx0Ly8gRm9yIG5vdywgd2UgYWRkIGFuICdpbnZlbnRlZCcgYW5ub3RhdGlvbiBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkZpb3JpRWxlbWVudHMudjEuU2l0dWF0aW9uc1wiIGNvbnNpc3Rpbmcgb2YgYSBwYXRoIHRvIHRoZSBzaXR1YXRpb25zIG5hdmlnYXRpb24gcHJvcGVydHlcblx0KChtZXRhTW9kZWwgYXMgYW55KSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVR5cGVzLmZvckVhY2goZW50aXR5VHlwZSA9PiB7XG5cdFx0Y29uc3Qgc2l0dWF0aW9uc05hdlByb3AgPSBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmQoXG5cdFx0XHRuYXZQcm9wID0+IG5hdlByb3AubmFtZSA9PT0gXCJTQVBfX1NpdHVhdGlvblwiIHx8IG5hdlByb3AubmFtZSA9PT0gXCJfU0FQX19TaXR1YXRpb25cIlxuXHRcdCk7XG5cblx0XHRpZiAoc2l0dWF0aW9uc05hdlByb3ApIHtcblx0XHRcdChlbnRpdHlUeXBlLmFubm90YXRpb25zIGFzIGFueSkuRkUgPSB7XG5cdFx0XHRcdFNpdHVhdGlvbnM6IHtcblx0XHRcdFx0XHR0ZXJtOiBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkZpb3JpRWxlbWVudHMudjEuU2l0dWF0aW9uc1wiLFxuXHRcdFx0XHRcdHR5cGU6IFwiUGF0aFwiLFxuXHRcdFx0XHRcdHBhdGg6IHNpdHVhdGlvbnNOYXZQcm9wLm5hbWUsXG5cdFx0XHRcdFx0JHRhcmdldDogc2l0dWF0aW9uc05hdlByb3Bcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbWV0YU1vZGVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlTW9kZWxDYWNoZURhdGEob01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwpIHtcblx0ZGVsZXRlIG1NZXRhTW9kZWxNYXBbKG9NZXRhTW9kZWwgYXMgYW55KS5pZF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TWV0YU1vZGVsQ29udGV4dChvTWV0YU1vZGVsQ29udGV4dDogQ29udGV4dDxPRGF0YU1ldGFNb2RlbD4sIGJJbmNsdWRlVmlzaXRlZE9iamVjdHM6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XG5cdGNvbnN0IG9Db252ZXJ0ZXJPdXRwdXQgPSBjb252ZXJ0VHlwZXMob01ldGFNb2RlbENvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdGNvbnN0IHNQYXRoID0gb01ldGFNb2RlbENvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdGNvbnN0IGFQYXRoU3BsaXQgPSBzUGF0aC5zcGxpdChcIi9cIik7XG5cdGxldCB0YXJnZXRFbnRpdHlTZXQ6IF9FbnRpdHlTZXQgfCBfU2luZ2xldG9uID0gb0NvbnZlcnRlck91dHB1dC5lbnRpdHlTZXRzLmZpbmQoXG5cdFx0ZW50aXR5U2V0ID0+IGVudGl0eVNldC5uYW1lID09PSBhUGF0aFNwbGl0WzFdXG5cdCkgYXMgX0VudGl0eVNldDtcblx0aWYgKCF0YXJnZXRFbnRpdHlTZXQpIHtcblx0XHR0YXJnZXRFbnRpdHlTZXQgPSBvQ29udmVydGVyT3V0cHV0LnNpbmdsZXRvbnMuZmluZChzaW5nbGV0b24gPT4gc2luZ2xldG9uLm5hbWUgPT09IGFQYXRoU3BsaXRbMV0pIGFzIF9TaW5nbGV0b247XG5cdH1cblx0bGV0IHJlbGF0aXZlUGF0aCA9IGFQYXRoU3BsaXQuc2xpY2UoMikuam9pbihcIi9cIik7XG5cblx0Y29uc3QgbG9jYWxPYmplY3RzOiBhbnlbXSA9IFt0YXJnZXRFbnRpdHlTZXRdO1xuXHR3aGlsZSAocmVsYXRpdmVQYXRoICYmIHJlbGF0aXZlUGF0aC5sZW5ndGggPiAwICYmIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIikpIHtcblx0XHRsZXQgcmVsYXRpdmVTcGxpdCA9IHJlbGF0aXZlUGF0aC5zcGxpdChcIi9cIik7XG5cdFx0bGV0IGlkeCA9IDA7XG5cdFx0bGV0IGN1cnJlbnRFbnRpdHlTZXQsIHNOYXZQcm9wVG9DaGVjaztcblxuXHRcdHJlbGF0aXZlU3BsaXQgPSByZWxhdGl2ZVNwbGl0LnNsaWNlKDEpOyAvLyBSZW1vdmluZyBcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCJcblx0XHR3aGlsZSAoIWN1cnJlbnRFbnRpdHlTZXQgJiYgcmVsYXRpdmVTcGxpdC5sZW5ndGggPiBpZHggJiYgcmVsYXRpdmVTcGxpdFtpZHhdICE9PSBcIiROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nXCIpIHtcblx0XHRcdC8vIEZpbmRpbmcgdGhlIGNvcnJlY3QgZW50aXR5U2V0IGZvciB0aGUgbmF2aWdhaXRvbiBwcm9wZXJ0eSBiaW5kaW5nIGV4YW1wbGU6IFwiU2V0L19TYWxlc09yZGVyXCJcblx0XHRcdHNOYXZQcm9wVG9DaGVjayA9IHJlbGF0aXZlU3BsaXQuc2xpY2UoMCwgaWR4ICsgMSkuam9pbihcIi9cIik7XG5cdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gdGFyZ2V0RW50aXR5U2V0ICYmIHRhcmdldEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW3NOYXZQcm9wVG9DaGVja107XG5cdFx0XHRpZHgrKztcblx0XHR9XG5cdFx0aWYgKCFjdXJyZW50RW50aXR5U2V0KSB7XG5cdFx0XHQvLyBGYWxsIGJhY2sgdG8gU2luZ2xlIG5hdiBwcm9wIGlmIGVudGl0eVNldCBpcyBub3QgZm91bmQuXG5cdFx0XHRzTmF2UHJvcFRvQ2hlY2sgPSByZWxhdGl2ZVNwbGl0WzBdO1xuXHRcdH1cblx0XHRjb25zdCBhTmF2UHJvcHMgPSBzTmF2UHJvcFRvQ2hlY2s/LnNwbGl0KFwiL1wiKSB8fCBbXTtcblx0XHRsZXQgdGFyZ2V0RW50aXR5VHlwZSA9IHRhcmdldEVudGl0eVNldCAmJiB0YXJnZXRFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHRmb3IgKGNvbnN0IHNOYXZQcm9wIG9mIGFOYXZQcm9wcykge1xuXHRcdFx0Ly8gUHVzaGluZyBhbGwgbmF2IHByb3BzIHRvIHRoZSB2aXNpdGVkIG9iamVjdHMuIGV4YW1wbGU6IFwiU2V0XCIsIFwiX1NhbGVzT3JkZXJcIiBmb3IgXCJTZXQvX1NhbGVzT3JkZXJcIihpbiBOYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nKVxuXHRcdFx0Y29uc3QgdGFyZ2V0TmF2UHJvcCA9IHRhcmdldEVudGl0eVR5cGUgJiYgdGFyZ2V0RW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5maW5kKG5hdlByb3AgPT4gbmF2UHJvcC5uYW1lID09PSBzTmF2UHJvcCk7XG5cdFx0XHRpZiAodGFyZ2V0TmF2UHJvcCkge1xuXHRcdFx0XHRsb2NhbE9iamVjdHMucHVzaCh0YXJnZXROYXZQcm9wKTtcblx0XHRcdFx0dGFyZ2V0RW50aXR5VHlwZSA9IHRhcmdldE5hdlByb3AudGFyZ2V0VHlwZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0YXJnZXRFbnRpdHlTZXQgPVxuXHRcdFx0KHRhcmdldEVudGl0eVNldCAmJiBjdXJyZW50RW50aXR5U2V0KSB8fCAodGFyZ2V0RW50aXR5U2V0ICYmIHRhcmdldEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW3JlbGF0aXZlU3BsaXRbMF1dKTtcblx0XHRpZiAodGFyZ2V0RW50aXR5U2V0KSB7XG5cdFx0XHQvLyBQdXNoaW5nIHRoZSB0YXJnZXQgZW50aXR5U2V0IHRvIHZpc2l0ZWQgb2JqZWN0c1xuXHRcdFx0bG9jYWxPYmplY3RzLnB1c2godGFyZ2V0RW50aXR5U2V0KTtcblx0XHR9XG5cdFx0Ly8gUmUtY2FsY3VsYXRpbmcgdGhlIHJlbGF0aXZlIHBhdGhcblx0XHQvLyBBcyBlYWNoIG5hdmlnYXRpb24gbmFtZSBpcyBlbmNsb3NlZCBiZXR3ZWVuICckTmF2aWdhdGlvblByb3BlcnR5QmluZGluZycgYW5kICckJyAodG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIGVudGl0eXNldCBlYXNpbHkgaW4gdGhlIG1ldGFtb2RlbClcblx0XHQvLyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgY2xvc2luZyAnJCcgdG8gYmUgYWJsZSB0byBzd2l0Y2ggdG8gdGhlIG5leHQgbmF2aWdhdGlvblxuXHRcdHJlbGF0aXZlU3BsaXQgPSByZWxhdGl2ZVNwbGl0LnNsaWNlKGFOYXZQcm9wcy5sZW5ndGggfHwgMSk7XG5cdFx0aWYgKHJlbGF0aXZlU3BsaXQubGVuZ3RoICYmIHJlbGF0aXZlU3BsaXRbMF0gPT09IFwiJFwiKSB7XG5cdFx0XHRyZWxhdGl2ZVNwbGl0LnNoaWZ0KCk7XG5cdFx0fVxuXHRcdHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlU3BsaXQuam9pbihcIi9cIik7XG5cdH1cblx0aWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiJFR5cGVcIikpIHtcblx0XHQvLyBXZSdyZSBhbnl3YXkgZ29pbmcgdG8gbG9vayBvbiB0aGUgZW50aXR5VHlwZS4uLlxuXHRcdHJlbGF0aXZlUGF0aCA9IGFQYXRoU3BsaXQuc2xpY2UoMykuam9pbihcIi9cIik7XG5cdH1cblx0aWYgKHRhcmdldEVudGl0eVNldCAmJiByZWxhdGl2ZVBhdGgubGVuZ3RoKSB7XG5cdFx0Y29uc3Qgb1RhcmdldCA9IHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLnJlc29sdmVQYXRoKHJlbGF0aXZlUGF0aCwgYkluY2x1ZGVWaXNpdGVkT2JqZWN0cyk7XG5cdFx0aWYgKG9UYXJnZXQpIHtcblx0XHRcdGlmIChiSW5jbHVkZVZpc2l0ZWRPYmplY3RzKSB7XG5cdFx0XHRcdG9UYXJnZXQudmlzaXRlZE9iamVjdHMgPSBsb2NhbE9iamVjdHMuY29uY2F0KG9UYXJnZXQudmlzaXRlZE9iamVjdHMpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUgJiYgdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUuYWN0aW9ucykge1xuXHRcdFx0Ly8gaWYgdGFyZ2V0IGlzIGFuIGFjdGlvbiBvciBhbiBhY3Rpb24gcGFyYW1ldGVyXG5cdFx0XHRjb25zdCBhY3Rpb25zID0gdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUgJiYgdGFyZ2V0RW50aXR5U2V0LmVudGl0eVR5cGUuYWN0aW9ucztcblx0XHRcdGNvbnN0IHJlbGF0aXZlU3BsaXQgPSByZWxhdGl2ZVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0aWYgKGFjdGlvbnNbcmVsYXRpdmVTcGxpdFswXV0pIHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uID0gYWN0aW9uc1tyZWxhdGl2ZVNwbGl0WzBdXTtcblx0XHRcdFx0aWYgKHJlbGF0aXZlU3BsaXRbMV0gJiYgYWN0aW9uLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJhbWV0ZXJOYW1lID0gcmVsYXRpdmVTcGxpdFsxXTtcblx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXJhbWV0ZXIgPSBhY3Rpb24ucGFyYW1ldGVycy5maW5kKHBhcmFtZXRlciA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVyLmZ1bGx5UXVhbGlmaWVkTmFtZS5lbmRzV2l0aChcIi9cIiArIHBhcmFtZXRlck5hbWUpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiB0YXJnZXRQYXJhbWV0ZXI7XG5cdFx0XHRcdH0gZWxzZSBpZiAocmVsYXRpdmVQYXRoLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdHJldHVybiBhY3Rpb247XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9UYXJnZXQ7XG5cdH0gZWxzZSB7XG5cdFx0aWYgKGJJbmNsdWRlVmlzaXRlZE9iamVjdHMpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldDogdGFyZ2V0RW50aXR5U2V0LFxuXHRcdFx0XHR2aXNpdGVkT2JqZWN0czogbG9jYWxPYmplY3RzXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0RW50aXR5U2V0O1xuXHR9XG59XG5cbnR5cGUgQ29udmVydGVyT2JqZWN0ID0ge1xuXHRfdHlwZTogc3RyaW5nO1xuXHRuYW1lOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRUYXJnZXQgPSB7XG5cdHRhcmdldD86IENvbnZlcnRlck9iamVjdDtcblx0dmlzaXRlZE9iamVjdHM6IENvbnZlcnRlck9iamVjdFtdO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhcblx0b01ldGFNb2RlbENvbnRleHQ6IENvbnRleHQ8T0RhdGFNZXRhTW9kZWw+LFxuXHRvRW50aXR5U2V0TWV0YU1vZGVsQ29udGV4dD86IENvbnRleHQ8T0RhdGFNZXRhTW9kZWw+XG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgbWV0YU1vZGVsQ29udGV4dCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9NZXRhTW9kZWxDb250ZXh0LCB0cnVlKTtcblx0bGV0IHRhcmdldEVudGl0eVNldExvY2F0aW9uO1xuXHRpZiAob0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQgJiYgb0VudGl0eVNldE1ldGFNb2RlbENvbnRleHQuZ2V0UGF0aCgpICE9PSBcIi9cIikge1xuXHRcdHRhcmdldEVudGl0eVNldExvY2F0aW9uID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG9FbnRpdHlTZXRNZXRhTW9kZWxDb250ZXh0KTtcblx0fVxuXHRyZXR1cm4gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RGcm9tUGF0aChtZXRhTW9kZWxDb250ZXh0LCB0YXJnZXRFbnRpdHlTZXRMb2NhdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdEZyb21QYXRoKFxuXHRtZXRhTW9kZWxDb250ZXh0OiBSZXNvbHZlZFRhcmdldCxcblx0dGFyZ2V0RW50aXR5U2V0TG9jYXRpb24/OiBEYXRhTW9kZWxPYmplY3RQYXRoXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0cyA9IG1ldGFNb2RlbENvbnRleHQudmlzaXRlZE9iamVjdHMuZmlsdGVyKFxuXHRcdCh2aXNpdGVkT2JqZWN0OiBhbnkpID0+IHZpc2l0ZWRPYmplY3QgJiYgdmlzaXRlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIl90eXBlXCIpICYmIHZpc2l0ZWRPYmplY3QuX3R5cGUgIT09IFwiRW50aXR5VHlwZVwiXG5cdCk7XG5cdGlmIChtZXRhTW9kZWxDb250ZXh0LnRhcmdldCAmJiBtZXRhTW9kZWxDb250ZXh0LnRhcmdldC5oYXNPd25Qcm9wZXJ0eShcIl90eXBlXCIpICYmIG1ldGFNb2RlbENvbnRleHQudGFyZ2V0Ll90eXBlICE9PSBcIkVudGl0eVR5cGVcIikge1xuXHRcdGRhdGFNb2RlbE9iamVjdHMucHVzaChtZXRhTW9kZWxDb250ZXh0LnRhcmdldCk7XG5cdH1cblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXM6IF9OYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdO1xuXHRjb25zdCByb290RW50aXR5U2V0OiBfRW50aXR5U2V0ID0gZGF0YU1vZGVsT2JqZWN0c1swXSBhcyBfRW50aXR5U2V0O1xuXHQvLyBjdXJyZW50RW50aXR5U2V0IGNhbiBiZSB1bmRlZmluZWQuXG5cdGxldCBjdXJyZW50RW50aXR5U2V0OiBfRW50aXR5U2V0IHwgdW5kZWZpbmVkID0gcm9vdEVudGl0eVNldCBhcyBfRW50aXR5U2V0O1xuXHRsZXQgY3VycmVudEVudGl0eVR5cGU6IF9FbnRpdHlUeXBlID0gcm9vdEVudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRsZXQgaSA9IDE7XG5cdGxldCBjdXJyZW50T2JqZWN0O1xuXHRsZXQgbmF2aWdhdGVkUGF0aHMgPSBbXTtcblx0d2hpbGUgKGkgPCBkYXRhTW9kZWxPYmplY3RzLmxlbmd0aCkge1xuXHRcdGN1cnJlbnRPYmplY3QgPSBkYXRhTW9kZWxPYmplY3RzW2krK107XG5cdFx0aWYgKGN1cnJlbnRPYmplY3QuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdG5hdmlnYXRlZFBhdGhzLnB1c2goY3VycmVudE9iamVjdC5uYW1lKTtcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2goY3VycmVudE9iamVjdCBhcyBfTmF2aWdhdGlvblByb3BlcnR5KTtcblx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID0gKGN1cnJlbnRPYmplY3QgYXMgX05hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZTtcblx0XHRcdGlmIChjdXJyZW50RW50aXR5U2V0ICYmIGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZy5oYXNPd25Qcm9wZXJ0eShuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKSkpIHtcblx0XHRcdFx0Y3VycmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tjdXJyZW50T2JqZWN0Lm5hbWVdO1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3VycmVudEVudGl0eVNldCA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGN1cnJlbnRPYmplY3QuX3R5cGUgPT09IFwiRW50aXR5U2V0XCIpIHtcblx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBjdXJyZW50T2JqZWN0IGFzIF9FbnRpdHlTZXQ7XG5cdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IGN1cnJlbnRFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHR9XG5cdH1cblxuXHRpZiAodGFyZ2V0RW50aXR5U2V0TG9jYXRpb24gJiYgdGFyZ2V0RW50aXR5U2V0TG9jYXRpb24uc3RhcnRpbmdFbnRpdHlTZXQgIT09IHJvb3RFbnRpdHlTZXQpIHtcblx0XHQvLyBJbiBjYXNlIHRoZSBlbnRpdHlzZXQgaXMgbm90IHN0YXJ0aW5nIGZyb20gdGhlIHNhbWUgbG9jYXRpb24gaXQgbWF5IG1lYW4gdGhhdCB3ZSBhcmUgZG9pbmcgdG9vIG11Y2ggd29yayBlYXJsaWVyIGZvciBzb21lIHJlYXNvblxuXHRcdC8vIEFzIHN1Y2ggd2UgbmVlZCB0byByZWRlZmluZSB0aGUgY29udGV4dCBzb3VyY2UgZm9yIHRoZSB0YXJnZXRFbnRpdHlTZXRMb2NhdGlvblxuXHRcdGNvbnN0IHN0YXJ0aW5nSW5kZXggPSBkYXRhTW9kZWxPYmplY3RzLmluZGV4T2YodGFyZ2V0RW50aXR5U2V0TG9jYXRpb24uc3RhcnRpbmdFbnRpdHlTZXQpO1xuXHRcdGlmIChzdGFydGluZ0luZGV4ICE9PSAtMSkge1xuXHRcdFx0Ly8gSWYgaXQncyBub3QgZm91bmQgSSBkb24ndCBrbm93IHdoYXQgd2UgY2FuIGRvIChwcm9iYWJseSBub3RoaW5nKVxuXHRcdFx0Y29uc3QgcmVxdWlyZWREYXRhTW9kZWxPYmplY3RzID0gZGF0YU1vZGVsT2JqZWN0cy5zbGljZSgwLCBzdGFydGluZ0luZGV4KTtcblx0XHRcdHRhcmdldEVudGl0eVNldExvY2F0aW9uLnN0YXJ0aW5nRW50aXR5U2V0ID0gcm9vdEVudGl0eVNldDtcblx0XHRcdHRhcmdldEVudGl0eVNldExvY2F0aW9uLm5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gcmVxdWlyZWREYXRhTW9kZWxPYmplY3RzXG5cdFx0XHRcdC5maWx0ZXIoKG9iamVjdDogYW55KSA9PiBvYmplY3QuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpXG5cdFx0XHRcdC5jb25jYXQodGFyZ2V0RW50aXR5U2V0TG9jYXRpb24ubmF2aWdhdGlvblByb3BlcnRpZXMpIGFzIF9OYXZpZ2F0aW9uUHJvcGVydHlbXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0RGF0YU1vZGVsUGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogcm9vdEVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlTZXQ6IGN1cnJlbnRFbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogY3VycmVudEVudGl0eVR5cGUsXG5cdFx0dGFyZ2V0T2JqZWN0OiBtZXRhTW9kZWxDb250ZXh0LnRhcmdldCxcblx0XHRuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRjb250ZXh0TG9jYXRpb246IHRhcmdldEVudGl0eVNldExvY2F0aW9uXG5cdH07XG5cdGlmICghb3V0RGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24pIHtcblx0XHRvdXREYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbiA9IG91dERhdGFNb2RlbFBhdGg7XG5cdH1cblx0cmV0dXJuIG91dERhdGFNb2RlbFBhdGg7XG59XG4iXX0=