@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
@@ -134,25 +134,14 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
134
134
  _exports.enhanceDataModelPath = enhanceDataModelPath;
135
135
 
136
136
  var getTargetEntitySetPath = function (dataModelObjectPath) {
137
- var bRelative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
138
- var targetEntitySetPath = "";
139
-
140
- if (!bRelative) {
141
- targetEntitySetPath += "/".concat(dataModelObjectPath.startingEntitySet.name);
142
- }
143
-
137
+ var targetEntitySetPath = "/".concat(dataModelObjectPath.startingEntitySet.name);
144
138
  var currentEntitySet = dataModelObjectPath.startingEntitySet;
145
139
  var navigatedPaths = [];
146
140
  dataModelObjectPath.navigationProperties.forEach(function (navProp) {
147
141
  navigatedPaths.push(navProp.name);
148
142
 
149
143
  if (currentEntitySet && currentEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
150
- if (bRelative) {
151
- targetEntitySetPath += "".concat(navigatedPaths.join("/"));
152
- } else {
153
- targetEntitySetPath += "/$NavigationPropertyBinding/".concat(navigatedPaths.join("/"), "/$");
154
- }
155
-
144
+ targetEntitySetPath += "/$NavigationPropertyBinding/".concat(navigatedPaths.join("/"), "/$");
156
145
  currentEntitySet = currentEntitySet.navigationPropertyBinding[navigatedPaths.join("/")];
157
146
  navigatedPaths = [];
158
147
  }
@@ -162,24 +151,6 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
162
151
 
163
152
  _exports.getTargetEntitySetPath = getTargetEntitySetPath;
164
153
 
165
- var getTargetEntitySetNavigation = function (dataModelObjectPath) {
166
- var visitedNavigationProperties = [];
167
- var currentEntitySet = dataModelObjectPath.startingEntitySet;
168
- var navigatedPaths = [];
169
- dataModelObjectPath.navigationProperties.forEach(function (navProp) {
170
- navigatedPaths.push(navProp.name);
171
-
172
- if (currentEntitySet && currentEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
173
- visitedNavigationProperties.push(navProp);
174
- currentEntitySet = currentEntitySet.navigationPropertyBinding[navigatedPaths.join("/")];
175
- navigatedPaths = [];
176
- }
177
- });
178
- return visitedNavigationProperties;
179
- };
180
-
181
- _exports.getTargetEntitySetNavigation = getTargetEntitySetNavigation;
182
-
183
154
  var getTargetObjectPath = function (dataModelObjectPath) {
184
155
  var bRelative = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
185
156
  var path = "";
@@ -292,12 +263,12 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
292
263
 
293
264
  _exports.isPathDeletable = isPathDeletable;
294
265
 
295
- var isPathInsertable = function (dataModelObjectPath, propertyPath) {
266
+ var isPathInsertable = function (dataModelObjectPath, propertyPath, bTableCase) {
296
267
  return checkOnPath(dataModelObjectPath, function (annotationObject) {
297
268
  var _annotationObject$Ins;
298
269
 
299
270
  return annotationObject === null || annotationObject === void 0 ? void 0 : (_annotationObject$Ins = annotationObject.InsertRestrictions) === null || _annotationObject$Ins === void 0 ? void 0 : _annotationObject$Ins.Insertable;
300
- }, propertyPath);
271
+ }, propertyPath, bTableCase);
301
272
  };
302
273
 
303
274
  _exports.isPathInsertable = isPathInsertable;
@@ -328,7 +299,7 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
328
299
  _exports.checkFilterExpressionRestrictions = checkFilterExpressionRestrictions;
329
300
 
330
301
  var checkOnPath = function (dataModelObjectPath, checkFunction, propertyPath, bTableCase) {
331
- var _targetEntitySet, _targetEntitySet$anno, _restrictionDefinitio;
302
+ var _targetEntitySet, _targetEntitySet$anno;
332
303
 
333
304
  if (!dataModelObjectPath || !dataModelObjectPath.startingEntitySet) {
334
305
  return constant(true);
@@ -425,10 +396,10 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
425
396
  targetRestrictions = equal(annotationExpression(restrictionDefinition, getPathRelativeLocation(dataModelObjectPath.contextLocation, allVisitedNavigationProps).map(function (np) {
426
397
  return np.name;
427
398
  })), true);
428
- } //object page table case in path based scenario's fallback to exisiting approach
399
+ } // On table case we need to know if restrictions are only set on targetEntity
429
400
 
430
401
 
431
- if (bTableCase && !restrictions && (_restrictionDefinitio = restrictionDefinition) !== null && _restrictionDefinitio !== void 0 && _restrictionDefinitio.path) {
402
+ if (bTableCase && !restrictions && targetRestrictions) {
432
403
  var oResult = {
433
404
  "currentEntityRestriction": targetRestrictions
434
405
  };
@@ -441,4 +412,4 @@ sap.ui.define(["sap/fe/core/helpers/BindingExpression", "sap/fe/core/templating/
441
412
  _exports.checkOnPath = checkOnPath;
442
413
  return _exports;
443
414
  }, false);
444
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGFNb2RlbFBhdGhIZWxwZXIudHMiXSwibmFtZXMiOlsiZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24iLCJjb250ZXh0UGF0aCIsInZpc2l0ZWROYXZQcm9wcyIsImxlbmd0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwicmVtYWluaW5nTmF2UHJvcHMiLCJmb3JFYWNoIiwibmF2UHJvcCIsIm5hdkluZGV4IiwicHVzaCIsImNvbmNhdCIsInNsaWNlIiwiY3VycmVudElkeCIsImN1cnJlbnROYXYiLCJuZXh0TmF2UHJvcCIsInBhcnRuZXIiLCJuYW1lIiwic3BsaWNlIiwiZXh0cmFOYXZQcm9wIiwibWFwIiwidGFyZ2V0VHlwZSIsImZpbmQiLCJucCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInByb3BlcnR5UGF0aCIsInNQcm9wZXJ0eVBhdGgiLCJpc1BhdGhFeHByZXNzaW9uIiwiaXNBbm5vdGF0aW9uUGF0aEV4cHJlc3Npb24iLCJwYXRoIiwib1RhcmdldCIsIiR0YXJnZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXRPYmplY3QiLCJhUGF0aFNwbGl0Iiwic3BsaXQiLCJjdXJyZW50RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJyZWR1Y2UiLCJyZWR1Y2VkRW50aXR5VHlwZSIsInBhdGhQYXJ0IiwidW5kZWZpbmVkIiwicG90ZW50aWFsTmF2UHJvcCIsIm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJoYXNPd25Qcm9wZXJ0eSIsInN0YXJ0aW5nRW50aXR5U2V0IiwiY29udGV4dExvY2F0aW9uIiwiZ2V0VGFyZ2V0RW50aXR5U2V0UGF0aCIsImJSZWxhdGl2ZSIsInRhcmdldEVudGl0eVNldFBhdGgiLCJuYXZpZ2F0ZWRQYXRocyIsImpvaW4iLCJnZXRUYXJnZXRFbnRpdHlTZXROYXZpZ2F0aW9uIiwidmlzaXRlZE5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsIl90eXBlIiwiZW5kc1dpdGgiLCJ0ZXJtIiwiZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCIsImZvckJpbmRpbmdFeHByZXNzaW9uIiwibmF2UHJvcGVydGllcyIsImlzQ29sbGVjdGlvbiIsInR5cGUiLCJ2YWx1ZSIsInF1YWxpZmllciIsImlzUGF0aFVwZGF0YWJsZSIsImJUYWJsZUNhc2UiLCJjaGVja09uUGF0aCIsImFubm90YXRpb25PYmplY3QiLCJVcGRhdGVSZXN0cmljdGlvbnMiLCJVcGRhdGFibGUiLCJpc1BhdGhTZWFyY2hhYmxlIiwiU2VhcmNoUmVzdHJpY3Rpb25zIiwiU2VhcmNoYWJsZSIsImlzUGF0aERlbGV0YWJsZSIsIkRlbGV0ZVJlc3RyaWN0aW9ucyIsIkRlbGV0YWJsZSIsImlzUGF0aEluc2VydGFibGUiLCJJbnNlcnRSZXN0cmljdGlvbnMiLCJJbnNlcnRhYmxlIiwiY2hlY2tGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIiwiYWxsb3dlZEV4cHJlc3Npb24iLCJmaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyIsImN1cnJlbnRPYmplY3RSZXN0cmljdGlvbiIsInJlc3RyaWN0aW9uIiwiUHJvcGVydHkiLCJpbmRleE9mIiwiQWxsb3dlZEV4cHJlc3Npb25zIiwidG9TdHJpbmciLCJjaGVja0Z1bmN0aW9uIiwiY29uc3RhbnQiLCJwYXJlbnRFbnRpdHlTZXQiLCJ2aXNpdGVkTmF2aWdhdGlvblByb3BzTmFtZSIsImFsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHMiLCJyZXNldFZpc2l0ZWROYXZQcm9wcyIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsImNvbnRhaW5zVGFyZ2V0IiwiZnVsbE5hdmlnYXRpb25QYXRoIiwicmVzdHJpY3Rpb25zIiwiX3BhcmVudEVudGl0eVNldCIsImFubm90YXRpb25zIiwiQ2FwYWJpbGl0aWVzIiwiTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIlJlc3RyaWN0ZWRQcm9wZXJ0aWVzIiwicmVzdHJpY3RlZE5hdlByb3AiLCJOYXZpZ2F0aW9uUHJvcGVydHkiLCJyZXN0cmljdGlvbkRlZmluaXRpb24iLCJfYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcyIsImVxdWFsIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJ0YXJnZXRSZXN0cmljdGlvbnMiLCJvUmVzdWx0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQXNCTyxNQUFNQSx1QkFBdUIsR0FBRyxVQUN0Q0MsV0FEc0MsRUFHZjtBQUFBLFFBRHZCQyxlQUN1Qix1RUFEaUIsRUFDakI7O0FBQ3ZCLFFBQUksQ0FBQ0QsV0FBTCxFQUFrQjtBQUNqQixhQUFPQyxlQUFQO0FBQ0EsS0FGRCxNQUVPO0FBQ04sVUFBSUEsZUFBZSxDQUFDQyxNQUFoQixJQUEwQkYsV0FBVyxDQUFDRyxvQkFBWixDQUFpQ0QsTUFBL0QsRUFBdUU7QUFDdEUsWUFBSUUsaUJBQXVDLEdBQUcsRUFBOUM7QUFDQUosUUFBQUEsV0FBVyxDQUFDRyxvQkFBWixDQUFpQ0UsT0FBakMsQ0FBeUMsVUFBQ0MsT0FBRCxFQUFVQyxRQUFWLEVBQXVCO0FBQy9ELGNBQUlOLGVBQWUsQ0FBQ00sUUFBRCxDQUFmLEtBQThCRCxPQUFsQyxFQUEyQztBQUMxQ0YsWUFBQUEsaUJBQWlCLENBQUNJLElBQWxCLENBQXVCUCxlQUFlLENBQUNNLFFBQUQsQ0FBdEM7QUFDQTtBQUNELFNBSkQ7QUFLQUgsUUFBQUEsaUJBQWlCLEdBQUdBLGlCQUFpQixDQUFDSyxNQUFsQixDQUF5QlIsZUFBZSxDQUFDUyxLQUFoQixDQUFzQlYsV0FBVyxDQUFDRyxvQkFBWixDQUFpQ0QsTUFBdkQsQ0FBekIsQ0FBcEIsQ0FQc0UsQ0FRdEU7O0FBQ0EsWUFBSVMsVUFBVSxHQUFHLENBQWpCOztBQUNBLGVBQU9QLGlCQUFpQixDQUFDRixNQUFsQixHQUEyQixDQUEzQixJQUFnQ1Ms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LGFBQWEsQ0FBQzdELGdCQUFELGFBQUNBLGdCQUFELGdEQUFDQSxnQkFBZ0IsQ0FBRXdFLFdBQW5CLDBEQUFDLHNCQUErQkMsWUFBaEMsQ0FBckM7QUFDQTs7QUFDRCxRQUFJSyxxQkFBcUIsS0FBS25FLFNBQTlCLEVBQXlDO0FBQ3hDdUUsTUFBQUEsa0JBQWtCLEdBQUdGLEtBQUssQ0FDekJDLG9CQUFvQixDQUNuQkgscUJBRG1CLEVBRW5COUcsdUJBQXVCLENBQUN3QixtQkFBbUIsQ0FBQ3dCLGVBQXJCLEVBQXNDaUQseUJBQXRDLENBQXZCLENBQXdGOUUsR0FBeEYsQ0FBNEYsVUFBQUcsRUFBRTtBQUFBLGVBQUlBLEVBQUUsQ0FBQ04sSUFBUDtBQUFBLE9BQTlGLENBRm1CLENBREssRUFLekIsSUFMeUIsQ0FBMUI7QUFPQSxLQTNGcUIsQ0E0RnRCOzs7QUFDQSxRQUFJb0QsVUFBVSxJQUFJLENBQUNrQyxZQUFmLDZCQUErQlEscUJBQS9CLGtEQUErQixzQkFBdUJqRixJQUExRCxFQUFnRTtBQUMvRCxVQUFNc0YsT0FBWSxHQUFHO0FBQ3BCLG9DQUE0QkQ7QUFEUixPQUFyQjtBQUdBLGFBQU9DLE9BQVA7QUFDQTs7QUFDRCxXQUFPYixZQUFZLElBQUlZLGtCQUFoQixJQUFzQ3BCLFFBQVEsQ0FBQyxJQUFELENBQXJEO0FBQ0EsR0F6R00iLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eVNldCwgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uRXhwcmVzc2lvbiwgY29uc3RhbnQsIGVxdWFsLCBFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9nZW5lcmF0ZWQvQ2FwYWJpbGl0aWVzXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eU9yUGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHsgaXNBbm5vdGF0aW9uUGF0aEV4cHJlc3Npb24sIGlzUGF0aEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHtcblx0RmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uVHlwZVR5cGVzLFxuXHROYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvblxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdHlwZXMvZ2VuZXJhdGVkL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHtcblx0RW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzLFxuXHRFbnRpdHlUeXBlQW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9DYXBhYmlsaXRpZXNfRWRtXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0c3RhcnRpbmdFbnRpdHlTZXQ6IEVudGl0eVNldDtcblx0Y29udGV4dExvY2F0aW9uPzogRGF0YU1vZGVsT2JqZWN0UGF0aDtcblx0bmF2aWdhdGlvblByb3BlcnRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdO1xuXHR0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQ7XG5cdHRhcmdldEVudGl0eVR5cGU6IEVudGl0eVR5cGU7XG5cdHRhcmdldE9iamVjdDogYW55O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uID0gZnVuY3Rpb24oXG5cdGNvbnRleHRQYXRoPzogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0dmlzaXRlZE5hdlByb3BzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdXG4pOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSB7XG5cdGlmICghY29udGV4dFBhdGgpIHtcblx0XHRyZXR1cm4gdmlzaXRlZE5hdlByb3BzO1xuXHR9IGVsc2Uge1xuXHRcdGlmICh2aXNpdGVkTmF2UHJvcHMubGVuZ3RoID49IGNvbnRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0bGV0IHJlbWFpbmluZ05hdlByb3BzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdO1xuXHRcdFx0Y29udGV4dFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaCgobmF2UHJvcCwgbmF2SW5kZXgpID0+IHtcblx0XHRcdFx0aWYgKHZpc2l0ZWROYXZQcm9wc1tuYXZJbmRleF0gIT09IG5hdlByb3ApIHtcblx0XHRcdFx0XHRyZW1haW5pbmdOYXZQcm9wcy5wdXNoKHZpc2l0ZWROYXZQcm9wc1tuYXZJbmRleF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJlbWFpbmluZ05hdlByb3BzID0gcmVtYWluaW5nTmF2UHJvcHMuY29uY2F0KHZpc2l0ZWROYXZQcm9wcy5zbGljZShjb250ZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGgpKTtcblx0XHRcdC8vIENsZWFuIHVwIE5hdlByb3AgLT4gT3duZXJcblx0XHRcdGxldCBjdXJyZW50SWR4ID0gMDtcblx0XHRcdHdoaWxlIChyZW1haW5pbmdOYXZQcm9wcy5sZW5ndGggPiAxICYmIGN1cnJlbnRJZHggIT0gcmVtYWluaW5nTmF2UHJvcHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50TmF2ID0gcmVtYWluaW5nTmF2UHJvcHNbY3VycmVudElkeF07XG5cdFx0XHRcdGNvbnN0IG5leHROYXZQcm9wID0gcmVtYWluaW5nTmF2UHJvcHNbY3VycmVudElkeCArIDFdO1xuXHRcdFx0XHRpZiAoY3VycmVudE5hdi5wYXJ0bmVyID09PSBuZXh0TmF2UHJvcC5uYW1lKSB7XG5cdFx0XHRcdFx0cmVtYWluaW5nTmF2UHJvcHMuc3BsaWNlKDAsIDIpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGN1cnJlbnRJZHgrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlbWFpbmluZ05hdlByb3BzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgZXh0cmFOYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdO1xuXHRcdFx0dmlzaXRlZE5hdlByb3BzLmZvckVhY2goKG5hdlByb3AsIG5hdkluZGV4KSA9PiB7XG5cdFx0XHRcdGlmIChjb250ZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllc1tuYXZJbmRleF0gIT09IG5hdlByb3ApIHtcblx0XHRcdFx0XHRleHRyYU5hdlByb3AucHVzaCh2aXNpdGVkTmF2UHJvcHNbbmF2SW5kZXhdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRleHRyYU5hdlByb3AgPSBleHRyYU5hdlByb3AuY29uY2F0KGNvbnRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLnNsaWNlKHZpc2l0ZWROYXZQcm9wcy5sZW5ndGgpKTtcblx0XHRcdC8vIENsZWFuIHVwIE5hdlByb3AgLT4gT3duZXJcblx0XHRcdGxldCBjdXJyZW50SWR4ID0gMDtcblx0XHRcdHdoaWxlIChleHRyYU5hdlByb3AubGVuZ3RoID4gMSAmJiBjdXJyZW50SWR4ICE9IGV4dHJhTmF2UHJvcC5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnROYXYgPSBleHRyYU5hdlByb3BbY3VycmVudElkeF07XG5cdFx0XHRcdGNvbnN0IG5leHROYXZQcm9wID0gZXh0cmFOYXZQcm9wW2N1cnJlbnRJZHggKyAxXTtcblx0XHRcdFx0aWYgKGN1cnJlbnROYXYucGFydG5lciA9PT0gbmV4dE5hdlByb3AubmFtZSkge1xuXHRcdFx0XHRcdGV4dHJhTmF2UHJvcC5zcGxpY2UoMCwgMik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudElkeCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRleHRyYU5hdlByb3AgPSBleHRyYU5hdlByb3AubWFwKG5hdlByb3AgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbmF2UHJvcC50YXJnZXRUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmQobnAgPT4gbnAubmFtZSA9PT0gbmF2UHJvcC5wYXJ0bmVyKSBhcyBOYXZpZ2F0aW9uUHJvcGVydHk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBleHRyYU5hdlByb3A7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZW5oYW5jZURhdGFNb2RlbFBhdGggPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0cHJvcGVydHlQYXRoPzogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+XG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0bGV0IHNQcm9wZXJ0eVBhdGg6IHN0cmluZyA9IFwiXCI7XG5cdGlmICgoaXNQYXRoRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpIHx8IGlzQW5ub3RhdGlvblBhdGhFeHByZXNzaW9uKHByb3BlcnR5UGF0aCkpICYmIHByb3BlcnR5UGF0aC5wYXRoKSB7XG5cdFx0c1Byb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aC5wYXRoO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRzUHJvcGVydHlQYXRoID0gcHJvcGVydHlQYXRoIGFzIHN0cmluZztcblx0fVxuXHRsZXQgb1RhcmdldDtcblx0aWYgKGlzUGF0aEV4cHJlc3Npb24ocHJvcGVydHlQYXRoKSB8fCBpc0Fubm90YXRpb25QYXRoRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpKSB7XG5cdFx0b1RhcmdldCA9IHByb3BlcnR5UGF0aC4kdGFyZ2V0O1xuXHR9IGVsc2UgaWYgKGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZSkge1xuXHRcdG9UYXJnZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdH0gZWxzZSB7XG5cdFx0b1RhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHR9XG5cdGNvbnN0IGFQYXRoU3BsaXQgPSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IGN1cnJlbnRFbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldDtcblx0bGV0IGN1cnJlbnRFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMuY29uY2F0KCk7XG5cdC8vIFByb2Nlc3Mgb25seSBpZiB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cblx0YVBhdGhTcGxpdC5yZWR1Y2UoKHJlZHVjZWRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkLCBwYXRoUGFydDogc3RyaW5nKSA9PiB7XG5cdFx0aWYgKCFyZWR1Y2VkRW50aXR5VHlwZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgcG90ZW50aWFsTmF2UHJvcCA9IHJlZHVjZWRFbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmQobmF2UHJvcCA9PiBuYXZQcm9wLm5hbWUgPT09IHBhdGhQYXJ0KTtcblx0XHRpZiAocG90ZW50aWFsTmF2UHJvcCkge1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChwb3RlbnRpYWxOYXZQcm9wKTtcblx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID0gcG90ZW50aWFsTmF2UHJvcC50YXJnZXRUeXBlO1xuXHRcdFx0aWYgKGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KHBhdGhQYXJ0KSkge1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW3BhdGhQYXJ0XTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyZW50RW50aXR5VHlwZTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSwgZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlKTtcblxuXHRyZXR1cm4ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRjb250ZXh0TG9jYXRpb246IGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdHRhcmdldEVudGl0eVNldDogY3VycmVudEVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlUeXBlOiBjdXJyZW50RW50aXR5VHlwZSxcblx0XHR0YXJnZXRPYmplY3Q6IG9UYXJnZXRcblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRFbnRpdHlTZXRQYXRoID0gZnVuY3Rpb24oZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCwgYlJlbGF0aXZlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuXHRsZXQgdGFyZ2V0RW50aXR5U2V0UGF0aDogc3RyaW5nID0gXCJcIjtcblx0aWYgKCFiUmVsYXRpdmUpIHtcblx0XHR0YXJnZXRFbnRpdHlTZXRQYXRoICs9IGAvJHtkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWV9YDtcblx0fVxuXHRsZXQgY3VycmVudEVudGl0eVNldCA9IGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQ7XG5cdGxldCBuYXZpZ2F0ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKG5hdlByb3AgPT4ge1xuXHRcdG5hdmlnYXRlZFBhdGhzLnB1c2gobmF2UHJvcC5uYW1lKTtcblx0XHRpZiAoY3VycmVudEVudGl0eVNldCAmJiBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkobmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIikpKSB7XG5cdFx0XHRpZiAoYlJlbGF0aXZlKSB7XG5cdFx0XHRcdHRhcmdldEVudGl0eVNldFBhdGggKz0gYCR7bmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIil9YDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRhcmdldEVudGl0eVNldFBhdGggKz0gYC8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy8ke25hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpfS8kYDtcblx0XHRcdH1cblx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdbbmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIildO1xuXHRcdFx0bmF2aWdhdGVkUGF0aHMgPSBbXTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gdGFyZ2V0RW50aXR5U2V0UGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRFbnRpdHlTZXROYXZpZ2F0aW9uID0gZnVuY3Rpb24oZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdIHtcblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdO1xuXHRsZXQgY3VycmVudEVudGl0eVNldCA9IGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQ7XG5cdGxldCBuYXZpZ2F0ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKG5hdlByb3AgPT4ge1xuXHRcdG5hdmlnYXRlZFBhdGhzLnB1c2gobmF2UHJvcC5uYW1lKTtcblx0XHRpZiAoY3VycmVudEVudGl0eVNldCAmJiBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkobmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIikpKSB7XG5cdFx0XHR2aXNpdGVkTmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChuYXZQcm9wKTtcblx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdbbmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIildO1xuXHRcdFx0bmF2aWdhdGVkUGF0aHMgPSBbXTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gdmlzaXRlZE5hdmlnYXRpb25Qcm9wZXJ0aWVzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRhcmdldE9iamVjdFBhdGggPSBmdW5jdGlvbihkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLCBiUmVsYXRpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG5cdGxldCBwYXRoID0gXCJcIjtcblx0aWYgKCFkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0KSB7XG5cdFx0cmV0dXJuIFwiL1wiO1xuXHR9XG5cdGlmICghYlJlbGF0aXZlKSB7XG5cdFx0cGF0aCArPSBgLyR7ZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lfWA7XG5cdH1cblx0aWYgKGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuXHRcdGlmIChwYXRoLmxlbmd0aCA+IDApIHtcblx0XHRcdHBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHBhdGggKz0gZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5tYXAobmF2UHJvcCA9PiBuYXZQcm9wLm5hbWUpLmpvaW4oXCIvXCIpO1xuXHR9XG5cblx0aWYgKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QubmFtZSAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Ll90eXBlICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuX3R5cGUgIT09IFwiRW50aXR5VHlwZVwiICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgIT09IGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXRcblx0KSB7XG5cdFx0aWYgKCFwYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0cGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0cGF0aCArPSBgJHtkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5uYW1lfWA7XG5cdH0gZWxzZSBpZiAoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgJiYgZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuaGFzT3duUHJvcGVydHkoXCJ0ZXJtXCIpKSB7XG5cdFx0aWYgKHBhdGgubGVuZ3RoID4gMCAmJiAhcGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHBhdGggKz0gYEAke2RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnRlcm19YDtcblx0fVxuXHRyZXR1cm4gcGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoID0gZnVuY3Rpb24oXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGZvckJpbmRpbmdFeHByZXNzaW9uOiBib29sZWFuID0gZmFsc2Vcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IG5hdlByb3BlcnRpZXMgPSBnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbihkYXRhTW9kZWxPYmplY3RQYXRoLmNvbnRleHRMb2NhdGlvbiwgZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcyk7XG5cdGlmIChmb3JCaW5kaW5nRXhwcmVzc2lvbikge1xuXHRcdGlmIChuYXZQcm9wZXJ0aWVzLmZpbmQobnAgPT4gbnAuaXNDb2xsZWN0aW9uKSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0bGV0IHBhdGggPSBuYXZQcm9wZXJ0aWVzLm1hcChucCA9PiBucC5uYW1lKS5qb2luKFwiL1wiKTtcblx0aWYgKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ICYmXG5cdFx0KGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Lm5hbWUgfHxcblx0XHRcdChkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiICYmIGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnZhbHVlKSkgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5fdHlwZSAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ICE9PSBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0XG5cdCkge1xuXHRcdGlmIChwYXRoLmxlbmd0aCA+IDAgJiYgIXBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRwYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRwYXRoICs9XG5cdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiXG5cdFx0XHRcdD8gYCR7ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QudmFsdWV9YFxuXHRcdFx0XHQ6IGAke2RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Lm5hbWV9YDtcblx0fSBlbHNlIGlmIChkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCAmJiBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcInRlcm1cIikpIHtcblx0XHRpZiAocGF0aC5sZW5ndGggPiAwICYmICFwYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0cGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0cGF0aCArPSBgQCR7ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QudGVybX1gO1xuXHRcdGlmIChkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcInF1YWxpZmllclwiKSAmJiAhIWRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnF1YWxpZmllcikge1xuXHRcdFx0cGF0aCArPSBgIyR7ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QucXVhbGlmaWVyfWA7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCFkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0cmV0dXJuIHBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQYXRoVXBkYXRhYmxlID0gZnVuY3Rpb24oXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggfCB1bmRlZmluZWQsXG5cdHByb3BlcnR5UGF0aD86IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0YlRhYmxlQ2FzZT86IGJvb2xlYW5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY2hlY2tPblBhdGgoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHQoYW5ub3RhdGlvbk9iamVjdDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb24gfCBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdD8uVXBkYXRlUmVzdHJpY3Rpb25zPy5VcGRhdGFibGU7XG5cdFx0fSxcblx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0YlRhYmxlQ2FzZVxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUGF0aFNlYXJjaGFibGUgPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0cHJvcGVydHlQYXRoPzogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRiVGFibGVDYXNlPzogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjaGVja09uUGF0aChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdChhbm5vdGF0aW9uT2JqZWN0OiBOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvbiB8IEVudGl0eVNldEFubm90YXRpb25zX0NhcGFiaWxpdGllcykgPT4ge1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25PYmplY3Q/LlNlYXJjaFJlc3RyaWN0aW9ucz8uU2VhcmNoYWJsZTtcblx0XHR9LFxuXHRcdHByb3BlcnR5UGF0aCxcblx0XHRiVGFibGVDYXNlXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQYXRoRGVsZXRhYmxlID0gZnVuY3Rpb24oXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggfCB1bmRlZmluZWQsXG5cdHByb3BlcnR5UGF0aD86IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0YlRhYmxlQ2FzZT86IGJvb2xlYW5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY2hlY2tPblBhdGgoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHQoYW5ub3RhdGlvbk9iamVjdDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb24gfCBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdD8uRGVsZXRlUmVzdHJpY3Rpb25zPy5EZWxldGFibGU7XG5cdFx0fSxcblx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0YlRhYmxlQ2FzZVxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUGF0aEluc2VydGFibGUgPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0cHJvcGVydHlQYXRoPzogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNoZWNrT25QYXRoKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0KGFubm90YXRpb25PYmplY3Q6IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uIHwgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzIHwgRW50aXR5VHlwZUFubm90YXRpb25zX0NhcGFiaWxpdGllcykgPT4ge1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25PYmplY3Q/Lkluc2VydFJlc3RyaWN0aW9ucz8uSW5zZXJ0YWJsZTtcblx0XHR9LFxuXHRcdHByb3BlcnR5UGF0aFxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRhbGxvd2VkRXhwcmVzc2lvbjogKHN0cmluZyB8IHVuZGVmaW5lZClbXVxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjaGVja09uUGF0aChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdChhbm5vdGF0aW9uT2JqZWN0OiBOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvbiB8IEVudGl0eVNldEFubm90YXRpb25zX0NhcGFiaWxpdGllcyB8IEVudGl0eVR5cGVBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMpID0+IHtcblx0XHRcdGlmIChhbm5vdGF0aW9uT2JqZWN0ICYmIFwiRmlsdGVyUmVzdHJpY3Rpb25zXCIgaW4gYW5ub3RhdGlvbk9iamVjdCkge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zOiBGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25UeXBlVHlwZXNbXSA9XG5cdFx0XHRcdFx0KGFubm90YXRpb25PYmplY3Q/LkZpbHRlclJlc3RyaWN0aW9ucz8uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyBhcyBGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25UeXBlVHlwZXNbXSkgfHwgW107XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRPYmplY3RSZXN0cmljdGlvbiA9IGZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMuZmluZChyZXN0cmljdGlvbiA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIChyZXN0cmljdGlvbi5Qcm9wZXJ0eSBhcyBQcm9wZXJ0eVBhdGgpLiR0YXJnZXQgPT09IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGN1cnJlbnRPYmplY3RSZXN0cmljdGlvbikge1xuXHRcdFx0XHRcdHJldHVybiBhbGxvd2VkRXhwcmVzc2lvbi5pbmRleE9mKGN1cnJlbnRPYmplY3RSZXN0cmljdGlvbj8uQWxsb3dlZEV4cHJlc3Npb25zPy50b1N0cmluZygpKSAhPT0gLTE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrT25QYXRoID0gZnVuY3Rpb24oXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggfCB1bmRlZmluZWQsXG5cdGNoZWNrRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRwcm9wZXJ0eVBhdGg/OiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdGJUYWJsZUNhc2U/OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0aWYgKCFkYXRhTW9kZWxPYmplY3RQYXRoIHx8ICFkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0KSB7XG5cdFx0cmV0dXJuIGNvbnN0YW50KHRydWUpO1xuXHR9XG5cdGRhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChkYXRhTW9kZWxPYmplY3RQYXRoLCBwcm9wZXJ0eVBhdGgpO1xuXG5cdGxldCBjdXJyZW50RW50aXR5U2V0OiBFbnRpdHlTZXQgfCBudWxsID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldDtcblx0bGV0IHBhcmVudEVudGl0eVNldDogRW50aXR5U2V0IHwgbnVsbCA9IG51bGw7XG5cdGxldCB2aXNpdGVkTmF2aWdhdGlvblByb3BzTmFtZTogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wczogTmF2aWdhdGlvblByb3BlcnR5W10gPSBbXTtcblx0bGV0IHRhcmdldEVudGl0eVNldDogRW50aXR5U2V0IHwgbnVsbCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdGNvbnN0IHRhcmdldEVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCBudWxsID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHRsZXQgcmVzZXRWaXNpdGVkTmF2UHJvcHMgPSBmYWxzZTtcblxuXHRkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goKG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KSA9PiB7XG5cdFx0aWYgKHJlc2V0VmlzaXRlZE5hdlByb3BzKSB7XG5cdFx0XHR2aXNpdGVkTmF2aWdhdGlvblByb3BzTmFtZSA9IFtdO1xuXHRcdH1cblx0XHR2aXNpdGVkTmF2aWdhdGlvblByb3BzTmFtZS5wdXNoKG5hdmlnYXRpb25Qcm9wZXJ0eS5uYW1lKTtcblx0XHRhbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzLnB1c2gobmF2aWdhdGlvblByb3BlcnR5KTtcblx0XHRpZiAoIW5hdmlnYXRpb25Qcm9wZXJ0eS5jb250YWluc1RhcmdldCkge1xuXHRcdFx0Ly8gV2Ugc2hvdWxkIGhhdmUgYSBuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF0aCBzbyBmYXIgd2hpY2ggY2FuIGNvbnNpc3Qgb2YgKFtDb250YWlubWVudE5hdlByb3BdLykqW05hdlByb3BdXG5cdFx0XHRjb25zdCBmdWxsTmF2aWdhdGlvblBhdGggPSB2aXNpdGVkTmF2aWdhdGlvblByb3BzTmFtZS5qb2luKFwiL1wiKTtcblx0XHRcdGlmIChjdXJyZW50RW50aXR5U2V0ICYmIGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZy5oYXNPd25Qcm9wZXJ0eShmdWxsTmF2aWdhdGlvblBhdGgpKSB7XG5cdFx0XHRcdHBhcmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdbZnVsbE5hdmlnYXRpb25QYXRoXTtcblx0XHRcdFx0dGFyZ2V0RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldDtcblx0XHRcdFx0Ly8gSWYgd2UgcmVhY2hlZCBhIG5hdmlnYXRpb24gcHJvcGVydHkgd2l0aCBhIG5hdmlnYXRpb25wcm9wZXJ0eWJpbmRpbmcsIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHZpc2l0ZWQgcGF0aCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gKGlmIHRoZXJlIGlzIG9uZSlcblx0XHRcdFx0cmVzZXRWaXNpdGVkTmF2UHJvcHMgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gV2UgcmVhbGx5IHNob3VsZCBub3QgZW5kIHVwIGhlcmUgYnV0IGF0IGxlYXN0IGxldCdzIHRyeSB0byBhdm9pZCBpbmNvcnJlY3QgYmVoYXZpb3Jcblx0XHRcdFx0cGFyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldDtcblx0XHRcdFx0Y3VycmVudEVudGl0eVNldCA9IG51bGw7XG5cdFx0XHRcdHJlc2V0VmlzaXRlZE5hdlByb3BzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldDtcblx0XHRcdHRhcmdldEVudGl0eVNldCA9IG51bGw7XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbmF2aWdhdGVkIGRvd24gYWxsIHRoZSBuYXYgcHJvcCBhbmQgd2Ugc2hvdWxkIGhhdmVcblx0Ly8gVGhlIHRhcmdldCBlbnRpdHlzZXQgcG9pbnRpbmcgdG8gZWl0aGVyIG51bGwgKGluIGNhc2Ugb2YgY29udGFpbm1lbnQgbmF2cHJvcCBhIGxhc3QgcGFydCksIG9yIHRoZSBhY3R1YWwgdGFyZ2V0IChub24gY29udGFpbm1lbnQgYXMgdGFyZ2V0KVxuXHQvLyBUaGUgcGFyZW50IGVudGl0eVNldCBwb2ludGluZyB0byB0aGUgcHJldmlvdXMgZW50aXR5c2V0IHVzZWQgaW4gdGhlIHBhdGhcblx0Ly8gVmlzaXRlZE5hdmlnYXRpb25QYXRoIHNob3VsZCBjb250YWluIHRoZSBwYXRoIHVwIHRvIHRoaXMgcHJvcGVydHlcblxuXHQvLyBSZXN0cmljdGlvbnMgc2hvdWxkIHRoZW4gYmUgZXZhbHVhdGVkIGFzIFBhcmVudEVudGl0eVNldC5OYXZSZXN0cmljdGlvbnNbTmF2cHJvcGVydHlQYXRoXSB8fCBUYXJnZXRFbnRpdHlTZXQuUmVzdHJpY3Rpb25zXG5cdGNvbnN0IGZ1bGxOYXZpZ2F0aW9uUGF0aCA9IHZpc2l0ZWROYXZpZ2F0aW9uUHJvcHNOYW1lLmpvaW4oXCIvXCIpO1xuXHRsZXQgcmVzdHJpY3Rpb25zLCB2aXNpdGVkTmF2UHJvcHM7XG5cdGlmIChwYXJlbnRFbnRpdHlTZXQgIT09IG51bGwpIHtcblx0XHRjb25zdCBfcGFyZW50RW50aXR5U2V0OiBFbnRpdHlTZXQgPSBwYXJlbnRFbnRpdHlTZXQ7XG5cdFx0X3BhcmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcy5mb3JFYWNoKFxuXHRcdFx0KHJlc3RyaWN0ZWROYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvblR5cGVzKSA9PiB7XG5cdFx0XHRcdGlmIChyZXN0cmljdGVkTmF2UHJvcC5OYXZpZ2F0aW9uUHJvcGVydHk/LnR5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdHJpY3Rpb25EZWZpbml0aW9uID0gY2hlY2tGdW5jdGlvbihyZXN0cmljdGVkTmF2UHJvcCk7XG5cdFx0XHRcdFx0aWYgKGZ1bGxOYXZpZ2F0aW9uUGF0aCA9PT0gcmVzdHJpY3RlZE5hdlByb3AuTmF2aWdhdGlvblByb3BlcnR5LnZhbHVlICYmIHJlc3RyaWN0aW9uRGVmaW5pdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBfYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcyA9IGFsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHMuc2xpY2UoMCwgLTEpO1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldEVudGl0eVNldCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHR2aXNpdGVkTmF2UHJvcHMgPSBfYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcztcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmIChfYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0XHR2aXNpdGVkTmF2UHJvcHMgPSBhbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzLnNsaWNlKDApO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHZpc2l0ZWROYXZQcm9wcyA9IF9hbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXN0cmljdGlvbnMgPSBlcXVhbChcblx0XHRcdFx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdFx0XHRcdFx0cmVzdHJpY3Rpb25EZWZpbml0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKGRhdGFNb2RlbE9iamVjdFBhdGg/LmNvbnRleHRMb2NhdGlvbiwgdmlzaXRlZE5hdlByb3BzKS5tYXAobnAgPT4gbnAubmFtZSlcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHQpO1xuXHR9XG5cdGxldCB0YXJnZXRSZXN0cmljdGlvbnM7XG5cdGxldCByZXN0cmljdGlvbkRlZmluaXRpb24gPSBjaGVja0Z1bmN0aW9uKHRhcmdldEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcyk7XG5cdGlmICh0YXJnZXRFbnRpdHlTZXQgPT09IG51bGwgJiYgcmVzdHJpY3Rpb25EZWZpbml0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXN0cmljdGlvbkRlZmluaXRpb24gPSBjaGVja0Z1bmN0aW9uKHRhcmdldEVudGl0eVR5cGU/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXMpO1xuXHR9XG5cdGlmIChyZXN0cmljdGlvbkRlZmluaXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdHRhcmdldFJlc3RyaWN0aW9ucyA9IGVxdWFsKFxuXHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oXG5cdFx0XHRcdHJlc3RyaWN0aW9uRGVmaW5pdGlvbixcblx0XHRcdFx0Z2V0UGF0aFJlbGF0aXZlTG9jYXRpb24oZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24sIGFsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHMpLm1hcChucCA9PiBucC5uYW1lKVxuXHRcdFx0KSxcblx0XHRcdHRydWVcblx0XHQpO1xuXHR9XG5cdC8vb2JqZWN0IHBhZ2UgdGFibGUgY2FzZSBpbiBwYXRoIGJhc2VkIHNjZW5hcmlvJ3MgZmFsbGJhY2sgdG8gZXhpc2l0aW5nIGFwcHJvYWNoXG5cdGlmIChiVGFibGVDYXNlICYmICFyZXN0cmljdGlvbnMgJiYgcmVzdHJpY3Rpb25EZWZpbml0aW9uPy5wYXRoKSB7XG5cdFx0Y29uc3Qgb1Jlc3VsdDogYW55ID0ge1xuXHRcdFx0XCJjdXJyZW50RW50aXR5UmVzdHJpY3Rpb25cIjogdGFyZ2V0UmVzdHJpY3Rpb25zXG5cdFx0fTtcblx0XHRyZXR1cm4gb1Jlc3VsdDtcblx0fVxuXHRyZXR1cm4gcmVzdHJpY3Rpb25zIHx8IHRhcmdldFJlc3RyaWN0aW9ucyB8fCBjb25zdGFudCh0cnVlKTtcbn07XG4iXX0=
415
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGFNb2RlbFBhdGhIZWxwZXIudHMiXSwibmFtZXMiOlsiZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24iLCJjb250ZXh0UGF0aCIsInZpc2l0ZWROYXZQcm9wcyIsImxlbmd0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwicmVtYWluaW5nTmF2UHJvcHMiLCJmb3JFYWNoIiwibmF2UHJvcCIsIm5hdkluZGV4IiwicHVzaCIsImNvbmNhdCIsInNsaWNlIiwiY3VycmVudElkeCIsImN1cnJlbnROYXYiLCJuZXh0TmF2UHJvcCIsInBhcnRuZXIiLCJuYW1lIiwic3BsaWNlIiwiZXh0cmFOYXZQcm9wIiwibWFwIiwidGFyZ2V0VHlwZSIsImZpbmQiLCJucCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInByb3BlcnR5UGF0aCIsInNQcm9wZXJ0eVBhdGgiLCJpc1BhdGhFeHByZXNzaW9uIiwiaXNBbm5vdGF0aW9uUGF0aEV4cHJlc3Npb24iLCJwYXRoIiwib1RhcmdldCIsIiR0YXJnZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwicmVzb2x2ZVBhdGgiLCJ0YXJnZXRPYmplY3QiLCJhUGF0aFNwbGl0Iiwic3BsaXQiLCJjdXJyZW50RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJyZWR1Y2UiLCJyZWR1Y2VkRW50aXR5VHlwZSIsInBhdGhQYXJ0IiwidW5kZWZpbmVkIiwicG90ZW50aWFsTmF2UHJvcCIsIm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJoYXNPd25Qcm9wZXJ0eSIsInN0YXJ0aW5nRW50aXR5U2V0IiwiY29udGV4dExvY2F0aW9uIiwiZ2V0VGFyZ2V0RW50aXR5U2V0UGF0aCIsInRhcmdldEVudGl0eVNldFBhdGgiLCJuYXZpZ2F0ZWRQYXRocyIsImpvaW4iLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiYlJlbGF0aXZlIiwiX3R5cGUiLCJlbmRzV2l0aCIsInRlcm0iLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwiZm9yQmluZGluZ0V4cHJlc3Npb24iLCJuYXZQcm9wZXJ0aWVzIiwiaXNDb2xsZWN0aW9uIiwidHlwZSIsInZhbHVlIiwicXVhbGlmaWVyIiwiaXNQYXRoVXBkYXRhYmxlIiwiYlRhYmxlQ2FzZSIsImNoZWNrT25QYXRoIiwiYW5ub3RhdGlvbk9iamVjdCIsIlVwZGF0ZVJlc3RyaWN0aW9ucyIsIlVwZGF0YWJsZSIsImlzUGF0aFNlYXJjaGFibGUiLCJTZWFyY2hSZXN0cmljdGlvbnMiLCJTZWFyY2hhYmxlIiwiaXNQYXRoRGVsZXRhYmxlIiwiRGVsZXRlUmVzdHJpY3Rpb25zIiwiRGVsZXRhYmxlIiwiaXNQYXRoSW5zZXJ0YWJsZSIsIkluc2VydFJlc3RyaWN0aW9ucyIsIkluc2VydGFibGUiLCJjaGVja0ZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJhbGxvd2VkRXhwcmVzc2lvbiIsImZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJGaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zIiwiY3VycmVudE9iamVjdFJlc3RyaWN0aW9uIiwicmVzdHJpY3Rpb24iLCJQcm9wZXJ0eSIsImluZGV4T2YiLCJBbGxvd2VkRXhwcmVzc2lvbnMiLCJ0b1N0cmluZyIsImNoZWNrRnVuY3Rpb24iLCJjb25zdGFudCIsInBhcmVudEVudGl0eVNldCIsInZpc2l0ZWROYXZpZ2F0aW9uUHJvcHNOYW1lIiwiYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcyIsInJlc2V0VmlzaXRlZE5hdlByb3BzIiwibmF2aWdhdGlvblByb3BlcnR5IiwiY29udGFpbnNUYXJnZXQiLCJmdWxsTmF2aWdhdGlvblBhdGgiLCJyZXN0cmljdGlvbnMiLCJfcGFyZW50RW50aXR5U2V0IiwiYW5ub3RhdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJyZXN0cmljdGVkTmF2UHJvcCIsIk5hdmlnYXRpb25Qcm9wZXJ0eSIsInJlc3RyaWN0aW9uRGVmaW5pdGlvbiIsIl9hbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzIiwiZXF1YWwiLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsInRhcmdldFJlc3RyaWN0aW9ucyIsIm9SZXN1bHQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FBc0JPLE1BQU1BLHVCQUF1QixHQUFHLFVBQ3RDQyxXQURzQyxFQUdmO0FBQUEsUUFEdkJDLGVBQ3VCLHVFQURpQixFQUNqQjs7QUFDdkIsUUFBSSxDQUFDRCxXQUFMLEVBQWtCO0FBQ2pCLGFBQU9DLGVBQVA7QUFDQSxLQUZELE1BRU87QUFDTixVQUFJQSxlQUFlLENBQUNDLE1BQWhCLElBQTBCRixXQUFXLENBQUNHLG9CQUFaLENBQWlDRCxNQUEvRCxFQUF1RTtBQUN0RSxZQUFJRSxpQkFBdUMsR0FBRyxFQUE5QztBQUNBSixRQUFBQSxXQUFXLENBQUNHLG9CQUFaLENBQWlDRSxPQUFqQyxDQUF5QyxVQUFDQyxPQUFELEVBQVVDLFFBQVYsRUFBdUI7QUFDL0QsY0FBSU4sZUFBZSxDQUFDTSxRQUFELENBQWYsS0FBOEJELE9BQWxDLEVBQTJDO0FBQzFDRixZQUFBQSxpQkFBaUIsQ0FBQ0ksSUFBbEIsQ0FBdUJQLGVBQWUsQ0FBQ00sUUFBRCxDQUF0QztBQUNBO0FBQ0QsU0FKRDtBQUtBSCxRQUFBQSxpQkFBaUIsR0FBR0EsaUJBQWlCLENBQUNLLE1BQWxCLENBQXlCUixlQUFlLENBQUNTLEtBQWhCLENBQXNCVixXQUFXLENBQUNHLG9CQUFaLENBQWlDRCxNQUF2RCxDQUF6QixDQUFwQixDQVBzRSxDQVF0RTs7QUFDQSxZQUFJUyxVQUFVLEdBQUcsQ0FBakI7O0FBQ0EsZUFBT1AsaUJBQWlCLENBQUNGLE1BQWxCLEdBQTJCLENBQTNCLElBQWdDUyxVQUFVLElBQUlQLGlCQUFpQixDQUFDRixNQUFsQixHQUEyQixDQUFoRixFQUFtRjtBQUNsRixjQUFNVSxV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SUFBNEJzRSxxQkFBcUIsS0FBS2pFLFNBQTFELEVBQXFFO0FBQUE7O0FBQ3BFaUUsTUFBQUEscUJBQXFCLEdBQUdqQixhQUFhLENBQUMzRCxnQkFBRCxhQUFDQSxnQkFBRCxnREFBQ0EsZ0JBQWdCLENBQUVzRSxXQUFuQiwwREFBQyxzQkFBK0JDLFlBQWhDLENBQXJDO0FBQ0E7O0FBQ0QsUUFBSUsscUJBQXFCLEtBQUtqRSxTQUE5QixFQUF5QztBQUN4Q3FFLE1BQUFBLGtCQUFrQixHQUFHRixLQUFLLENBQ3pCQyxvQkFBb0IsQ0FDbkJILHFCQURtQixFQUVuQjVHLHVCQUF1QixDQUFDd0IsbUJBQW1CLENBQUN3QixlQUFyQixFQUFzQytDLHlCQUF0QyxDQUF2QixDQUF3RjVFLEdBQXhGLENBQTRGLFVBQUFHLEVBQUU7QUFBQSxlQUFJQSxFQUFFLENBQUNOLElBQVA7QUFBQSxPQUE5RixDQUZtQixDQURLLEVBS3pCLElBTHlCLENBQTFCO0FBT0EsS0EzRnFCLENBNEZ0Qjs7O0FBQ0EsUUFBSWtELFVBQVUsSUFBSSxDQUFDa0MsWUFBZixJQUErQlksa0JBQW5DLEVBQXVEO0FBQ3RELFVBQU1DLE9BQVksR0FBRztBQUNwQixvQ0FBNEJEO0FBRFIsT0FBckI7QUFHQSxhQUFPQyxPQUFQO0FBQ0E7O0FBQ0QsV0FBT2IsWUFBWSxJQUFJWSxrQkFBaEIsSUFBc0NwQixRQUFRLENBQUMsSUFBRCxDQUFyRDtBQUNBLEdBekdNIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlTZXQsIEVudGl0eVR5cGUsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkV4cHJlc3Npb24sIGNvbnN0YW50LCBlcXVhbCwgRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHsgUHJvcGVydHlPclBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHsgaXNBbm5vdGF0aW9uUGF0aEV4cHJlc3Npb24sIGlzUGF0aEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHtcblx0RmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uVHlwZVR5cGVzLFxuXHROYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvblxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdHlwZXMvZ2VuZXJhdGVkL0NhcGFiaWxpdGllc1wiO1xuaW1wb3J0IHtcblx0RW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzLFxuXHRFbnRpdHlUeXBlQW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9DYXBhYmlsaXRpZXNfRWRtXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0c3RhcnRpbmdFbnRpdHlTZXQ6IEVudGl0eVNldDtcblx0Y29udGV4dExvY2F0aW9uPzogRGF0YU1vZGVsT2JqZWN0UGF0aDtcblx0bmF2aWdhdGlvblByb3BlcnRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdO1xuXHR0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQ7XG5cdHRhcmdldEVudGl0eVR5cGU6IEVudGl0eVR5cGU7XG5cdHRhcmdldE9iamVjdDogYW55O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uID0gZnVuY3Rpb24oXG5cdGNvbnRleHRQYXRoPzogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0dmlzaXRlZE5hdlByb3BzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdXG4pOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSB7XG5cdGlmICghY29udGV4dFBhdGgpIHtcblx0XHRyZXR1cm4gdmlzaXRlZE5hdlByb3BzO1xuXHR9IGVsc2Uge1xuXHRcdGlmICh2aXNpdGVkTmF2UHJvcHMubGVuZ3RoID49IGNvbnRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0bGV0IHJlbWFpbmluZ05hdlByb3BzOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdO1xuXHRcdFx0Y29udGV4dFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaCgobmF2UHJvcCwgbmF2SW5kZXgpID0+IHtcblx0XHRcdFx0aWYgKHZpc2l0ZWROYXZQcm9wc1tuYXZJbmRleF0gIT09IG5hdlByb3ApIHtcblx0XHRcdFx0XHRyZW1haW5pbmdOYXZQcm9wcy5wdXNoKHZpc2l0ZWROYXZQcm9wc1tuYXZJbmRleF0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJlbWFpbmluZ05hdlByb3BzID0gcmVtYWluaW5nTmF2UHJvcHMuY29uY2F0KHZpc2l0ZWROYXZQcm9wcy5zbGljZShjb250ZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGgpKTtcblx0XHRcdC8vIENsZWFuIHVwIE5hdlByb3AgLT4gT3duZXJcblx0XHRcdGxldCBjdXJyZW50SWR4ID0gMDtcblx0XHRcdHdoaWxlIChyZW1haW5pbmdOYXZQcm9wcy5sZW5ndGggPiAxICYmIGN1cnJlbnRJZHggIT0gcmVtYWluaW5nTmF2UHJvcHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50TmF2ID0gcmVtYWluaW5nTmF2UHJvcHNbY3VycmVudElkeF07XG5cdFx0XHRcdGNvbnN0IG5leHROYXZQcm9wID0gcmVtYWluaW5nTmF2UHJvcHNbY3VycmVudElkeCArIDFdO1xuXHRcdFx0XHRpZiAoY3VycmVudE5hdi5wYXJ0bmVyID09PSBuZXh0TmF2UHJvcC5uYW1lKSB7XG5cdFx0XHRcdFx0cmVtYWluaW5nTmF2UHJvcHMuc3BsaWNlKDAsIDIpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGN1cnJlbnRJZHgrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlbWFpbmluZ05hdlByb3BzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgZXh0cmFOYXZQcm9wOiBOYXZpZ2F0aW9uUHJvcGVydHlbXSA9IFtdO1xuXHRcdFx0dmlzaXRlZE5hdlByb3BzLmZvckVhY2goKG5hdlByb3AsIG5hdkluZGV4KSA9PiB7XG5cdFx0XHRcdGlmIChjb250ZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllc1tuYXZJbmRleF0gIT09IG5hdlByb3ApIHtcblx0XHRcdFx0XHRleHRyYU5hdlByb3AucHVzaCh2aXNpdGVkTmF2UHJvcHNbbmF2SW5kZXhdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRleHRyYU5hdlByb3AgPSBleHRyYU5hdlByb3AuY29uY2F0KGNvbnRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLnNsaWNlKHZpc2l0ZWROYXZQcm9wcy5sZW5ndGgpKTtcblx0XHRcdC8vIENsZWFuIHVwIE5hdlByb3AgLT4gT3duZXJcblx0XHRcdGxldCBjdXJyZW50SWR4ID0gMDtcblx0XHRcdHdoaWxlIChleHRyYU5hdlByb3AubGVuZ3RoID4gMSAmJiBjdXJyZW50SWR4ICE9IGV4dHJhTmF2UHJvcC5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnROYXYgPSBleHRyYU5hdlByb3BbY3VycmVudElkeF07XG5cdFx0XHRcdGNvbnN0IG5leHROYXZQcm9wID0gZXh0cmFOYXZQcm9wW2N1cnJlbnRJZHggKyAxXTtcblx0XHRcdFx0aWYgKGN1cnJlbnROYXYucGFydG5lciA9PT0gbmV4dE5hdlByb3AubmFtZSkge1xuXHRcdFx0XHRcdGV4dHJhTmF2UHJvcC5zcGxpY2UoMCwgMik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudElkeCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRleHRyYU5hdlByb3AgPSBleHRyYU5hdlByb3AubWFwKG5hdlByb3AgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbmF2UHJvcC50YXJnZXRUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmQobnAgPT4gbnAubmFtZSA9PT0gbmF2UHJvcC5wYXJ0bmVyKSBhcyBOYXZpZ2F0aW9uUHJvcGVydHk7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBleHRyYU5hdlByb3A7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgY29uc3QgZW5oYW5jZURhdGFNb2RlbFBhdGggPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0cHJvcGVydHlQYXRoPzogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+XG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0bGV0IHNQcm9wZXJ0eVBhdGg6IHN0cmluZyA9IFwiXCI7XG5cdGlmICgoaXNQYXRoRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpIHx8IGlzQW5ub3RhdGlvblBhdGhFeHByZXNzaW9uKHByb3BlcnR5UGF0aCkpICYmIHByb3BlcnR5UGF0aC5wYXRoKSB7XG5cdFx0c1Byb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aC5wYXRoO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBwcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRzUHJvcGVydHlQYXRoID0gcHJvcGVydHlQYXRoIGFzIHN0cmluZztcblx0fVxuXHRsZXQgb1RhcmdldDtcblx0aWYgKGlzUGF0aEV4cHJlc3Npb24ocHJvcGVydHlQYXRoKSB8fCBpc0Fubm90YXRpb25QYXRoRXhwcmVzc2lvbihwcm9wZXJ0eVBhdGgpKSB7XG5cdFx0b1RhcmdldCA9IHByb3BlcnR5UGF0aC4kdGFyZ2V0O1xuXHR9IGVsc2UgaWYgKGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZSkge1xuXHRcdG9UYXJnZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdH0gZWxzZSB7XG5cdFx0b1RhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHR9XG5cdGNvbnN0IGFQYXRoU3BsaXQgPSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKTtcblx0bGV0IGN1cnJlbnRFbnRpdHlTZXQgPSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVNldDtcblx0bGV0IGN1cnJlbnRFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMuY29uY2F0KCk7XG5cdC8vIFByb2Nlc3Mgb25seSBpZiB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cblx0YVBhdGhTcGxpdC5yZWR1Y2UoKHJlZHVjZWRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkLCBwYXRoUGFydDogc3RyaW5nKSA9PiB7XG5cdFx0aWYgKCFyZWR1Y2VkRW50aXR5VHlwZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgcG90ZW50aWFsTmF2UHJvcCA9IHJlZHVjZWRFbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZpbmQobmF2UHJvcCA9PiBuYXZQcm9wLm5hbWUgPT09IHBhdGhQYXJ0KTtcblx0XHRpZiAocG90ZW50aWFsTmF2UHJvcCkge1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMucHVzaChwb3RlbnRpYWxOYXZQcm9wKTtcblx0XHRcdGN1cnJlbnRFbnRpdHlUeXBlID0gcG90ZW50aWFsTmF2UHJvcC50YXJnZXRUeXBlO1xuXHRcdFx0aWYgKGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KHBhdGhQYXJ0KSkge1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW3BhdGhQYXJ0XTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjdXJyZW50RW50aXR5VHlwZTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fSwgZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlKTtcblxuXHRyZXR1cm4ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRjb250ZXh0TG9jYXRpb246IGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uLFxuXHRcdHRhcmdldEVudGl0eVNldDogY3VycmVudEVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlUeXBlOiBjdXJyZW50RW50aXR5VHlwZSxcblx0XHR0YXJnZXRPYmplY3Q6IG9UYXJnZXRcblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRFbnRpdHlTZXRQYXRoID0gZnVuY3Rpb24oZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCk6IHN0cmluZyB7XG5cdGxldCB0YXJnZXRFbnRpdHlTZXRQYXRoOiBzdHJpbmcgPSBgLyR7ZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5uYW1lfWA7XG5cdGxldCBjdXJyZW50RW50aXR5U2V0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldDtcblx0bGV0IG5hdmlnYXRlZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2gobmF2UHJvcCA9PiB7XG5cdFx0bmF2aWdhdGVkUGF0aHMucHVzaChuYXZQcm9wLm5hbWUpO1xuXHRcdGlmIChjdXJyZW50RW50aXR5U2V0ICYmIGN1cnJlbnRFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZy5oYXNPd25Qcm9wZXJ0eShuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKSkpIHtcblx0XHRcdHRhcmdldEVudGl0eVNldFBhdGggKz0gYC8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZy8ke25hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpfS8kYDtcblx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdbbmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIildO1xuXHRcdFx0bmF2aWdhdGVkUGF0aHMgPSBbXTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gdGFyZ2V0RW50aXR5U2V0UGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUYXJnZXRPYmplY3RQYXRoID0gZnVuY3Rpb24oZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCwgYlJlbGF0aXZlOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuXHRsZXQgcGF0aCA9IFwiXCI7XG5cdGlmICghZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCkge1xuXHRcdHJldHVybiBcIi9cIjtcblx0fVxuXHRpZiAoIWJSZWxhdGl2ZSkge1xuXHRcdHBhdGggKz0gYC8ke2RhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZX1gO1xuXHR9XG5cdGlmIChkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRpZiAocGF0aC5sZW5ndGggPiAwKSB7XG5cdFx0XHRwYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRwYXRoICs9IGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubWFwKG5hdlByb3AgPT4gbmF2UHJvcC5uYW1lKS5qb2luKFwiL1wiKTtcblx0fVxuXG5cdGlmIChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Lm5hbWUgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5fdHlwZSAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Ll90eXBlICE9PSBcIkVudGl0eVR5cGVcIiAmJlxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ICE9PSBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0XG5cdCkge1xuXHRcdGlmICghcGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHBhdGggKz0gYCR7ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QubmFtZX1gO1xuXHR9IGVsc2UgaWYgKGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0ICYmIGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0Lmhhc093blByb3BlcnR5KFwidGVybVwiKSkge1xuXHRcdGlmIChwYXRoLmxlbmd0aCA+IDAgJiYgIXBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRwYXRoICs9IFwiL1wiO1xuXHRcdH1cblx0XHRwYXRoICs9IGBAJHtkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC50ZXJtfWA7XG5cdH1cblx0cmV0dXJuIHBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRmb3JCaW5kaW5nRXhwcmVzc2lvbjogYm9vbGVhbiA9IGZhbHNlXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBuYXZQcm9wZXJ0aWVzID0gZ2V0UGF0aFJlbGF0aXZlTG9jYXRpb24oZGF0YU1vZGVsT2JqZWN0UGF0aC5jb250ZXh0TG9jYXRpb24sIGRhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMpO1xuXHRpZiAoZm9yQmluZGluZ0V4cHJlc3Npb24pIHtcblx0XHRpZiAobmF2UHJvcGVydGllcy5maW5kKG5wID0+IG5wLmlzQ29sbGVjdGlvbikpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGxldCBwYXRoID0gbmF2UHJvcGVydGllcy5tYXAobnAgPT4gbnAubmFtZSkuam9pbihcIi9cIik7XG5cdGlmIChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCAmJlxuXHRcdChkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5uYW1lIHx8XG5cdFx0XHQoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIiAmJiBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC52YWx1ZSkpICYmXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuX3R5cGUgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCAhPT0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldFxuXHQpIHtcblx0XHRpZiAocGF0aC5sZW5ndGggPiAwICYmICFwYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0cGF0aCArPSBcIi9cIjtcblx0XHR9XG5cdFx0cGF0aCArPVxuXHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIlxuXHRcdFx0XHQ/IGAke2RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnZhbHVlfWBcblx0XHRcdFx0OiBgJHtkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5uYW1lfWA7XG5cdH0gZWxzZSBpZiAoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgJiYgZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuaGFzT3duUHJvcGVydHkoXCJ0ZXJtXCIpKSB7XG5cdFx0aWYgKHBhdGgubGVuZ3RoID4gMCAmJiAhcGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdHBhdGggKz0gXCIvXCI7XG5cdFx0fVxuXHRcdHBhdGggKz0gYEAke2RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnRlcm19YDtcblx0XHRpZiAoZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QuaGFzT3duUHJvcGVydHkoXCJxdWFsaWZpZXJcIikgJiYgISFkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdC5xdWFsaWZpZXIpIHtcblx0XHRcdHBhdGggKz0gYCMke2RhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0LnF1YWxpZmllcn1gO1xuXHRcdH1cblx0fSBlbHNlIGlmICghZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdHJldHVybiBwYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUGF0aFVwZGF0YWJsZSA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0eVBhdGg/OiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdGJUYWJsZUNhc2U/OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNoZWNrT25QYXRoKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0KGFubm90YXRpb25PYmplY3Q6IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uIHwgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdD8uVXBkYXRlUmVzdHJpY3Rpb25zPy5VcGRhdGFibGU7XG5cdFx0fSxcblx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0YlRhYmxlQ2FzZVxuXHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUGF0aFNlYXJjaGFibGUgPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0cHJvcGVydHlQYXRoPzogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRiVGFibGVDYXNlPzogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBjaGVja09uUGF0aChcblx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdChhbm5vdGF0aW9uT2JqZWN0OiBOYXZpZ2F0aW9uUHJvcGVydHlSZXN0cmljdGlvbiB8IEVudGl0eVNldEFubm90YXRpb25zX0NhcGFiaWxpdGllcykgPT4ge1xuXHRcdFx0cmV0dXJuIGFubm90YXRpb25PYmplY3Q/LlNlYXJjaFJlc3RyaWN0aW9ucz8uU2VhcmNoYWJsZTtcblx0XHR9LFxuXHRcdHByb3BlcnR5UGF0aCxcblx0XHRiVGFibGVDYXNlXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQYXRoRGVsZXRhYmxlID0gZnVuY3Rpb24oXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggfCB1bmRlZmluZWQsXG5cdHByb3BlcnR5UGF0aD86IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Pixcblx0YlRhYmxlQ2FzZT86IGJvb2xlYW5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY2hlY2tPblBhdGgoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHQoYW5ub3RhdGlvbk9iamVjdDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb24gfCBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMpID0+IHtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uT2JqZWN0Py5EZWxldGVSZXN0cmljdGlvbnM/LkRlbGV0YWJsZTtcblx0XHR9LFxuXHRcdHByb3BlcnR5UGF0aCxcblx0XHRiVGFibGVDYXNlXG5cdCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQYXRoSW5zZXJ0YWJsZSA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRwcm9wZXJ0eVBhdGg/OiBQcm9wZXJ0eU9yUGF0aDxQcm9wZXJ0eT4sXG5cdGJUYWJsZUNhc2U/OiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0cmV0dXJuIGNoZWNrT25QYXRoKFxuXHRcdGRhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0KGFubm90YXRpb25PYmplY3Q6IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uIHwgRW50aXR5U2V0QW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRyZXR1cm4gYW5ub3RhdGlvbk9iamVjdD8uSW5zZXJ0UmVzdHJpY3Rpb25zPy5JbnNlcnRhYmxlO1xuXHRcdH0sXG5cdFx0cHJvcGVydHlQYXRoLFxuXHRcdGJUYWJsZUNhc2Vcblx0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja0ZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMgPSBmdW5jdGlvbihcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0YWxsb3dlZEV4cHJlc3Npb246IChzdHJpbmcgfCB1bmRlZmluZWQpW11cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gY2hlY2tPblBhdGgoXG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHQoYW5ub3RhdGlvbk9iamVjdDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb24gfCBFbnRpdHlTZXRBbm5vdGF0aW9uc19DYXBhYmlsaXRpZXMgfCBFbnRpdHlUeXBlQW5ub3RhdGlvbnNfQ2FwYWJpbGl0aWVzKSA9PiB7XG5cdFx0XHRpZiAoYW5ub3RhdGlvbk9iamVjdCAmJiBcIkZpbHRlclJlc3RyaWN0aW9uc1wiIGluIGFubm90YXRpb25PYmplY3QpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uczogRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uVHlwZVR5cGVzW10gPVxuXHRcdFx0XHRcdChhbm5vdGF0aW9uT2JqZWN0Py5GaWx0ZXJSZXN0cmljdGlvbnM/LkZpbHRlckV4cHJlc3Npb25SZXN0cmljdGlvbnMgYXMgRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9uVHlwZVR5cGVzW10pIHx8IFtdO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50T2JqZWN0UmVzdHJpY3Rpb24gPSBmaWx0ZXJFeHByZXNzaW9uUmVzdHJpY3Rpb25zLmZpbmQocmVzdHJpY3Rpb24gPT4ge1xuXHRcdFx0XHRcdHJldHVybiAocmVzdHJpY3Rpb24uUHJvcGVydHkgYXMgUHJvcGVydHlQYXRoKS4kdGFyZ2V0ID09PSBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChjdXJyZW50T2JqZWN0UmVzdHJpY3Rpb24pIHtcblx0XHRcdFx0XHRyZXR1cm4gYWxsb3dlZEV4cHJlc3Npb24uaW5kZXhPZihjdXJyZW50T2JqZWN0UmVzdHJpY3Rpb24/LkFsbG93ZWRFeHByZXNzaW9ucz8udG9TdHJpbmcoKSkgIT09IC0xO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja09uUGF0aCA9IGZ1bmN0aW9uKFxuXHRkYXRhTW9kZWxPYmplY3RQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRjaGVja0Z1bmN0aW9uOiBGdW5jdGlvbixcblx0cHJvcGVydHlQYXRoPzogUHJvcGVydHlPclBhdGg8UHJvcGVydHk+LFxuXHRiVGFibGVDYXNlPzogYm9vbGVhblxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGlmICghZGF0YU1vZGVsT2JqZWN0UGF0aCB8fCAhZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldCkge1xuXHRcdHJldHVybiBjb25zdGFudCh0cnVlKTtcblx0fVxuXHRkYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoZGF0YU1vZGVsT2JqZWN0UGF0aCwgcHJvcGVydHlQYXRoKTtcblxuXHRsZXQgY3VycmVudEVudGl0eVNldDogRW50aXR5U2V0IHwgbnVsbCA9IGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQ7XG5cdGxldCBwYXJlbnRFbnRpdHlTZXQ6IEVudGl0eVNldCB8IG51bGwgPSBudWxsO1xuXHRsZXQgdmlzaXRlZE5hdmlnYXRpb25Qcm9wc05hbWU6IHN0cmluZ1tdID0gW107XG5cdGNvbnN0IGFsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdGxldCB0YXJnZXRFbnRpdHlTZXQ6IEVudGl0eVNldCB8IG51bGwgPSBjdXJyZW50RW50aXR5U2V0O1xuXHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgbnVsbCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0RW50aXR5VHlwZTtcblx0bGV0IHJlc2V0VmlzaXRlZE5hdlByb3BzID0gZmFsc2U7XG5cblx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKChuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSkgPT4ge1xuXHRcdGlmIChyZXNldFZpc2l0ZWROYXZQcm9wcykge1xuXHRcdFx0dmlzaXRlZE5hdmlnYXRpb25Qcm9wc05hbWUgPSBbXTtcblx0XHR9XG5cdFx0dmlzaXRlZE5hdmlnYXRpb25Qcm9wc05hbWUucHVzaChuYXZpZ2F0aW9uUHJvcGVydHkubmFtZSk7XG5cdFx0YWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcy5wdXNoKG5hdmlnYXRpb25Qcm9wZXJ0eSk7XG5cdFx0aWYgKCFuYXZpZ2F0aW9uUHJvcGVydHkuY29udGFpbnNUYXJnZXQpIHtcblx0XHRcdC8vIFdlIHNob3VsZCBoYXZlIGEgbmF2aWdhdGlvblByb3BlcnR5QmluZGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhdGggc28gZmFyIHdoaWNoIGNhbiBjb25zaXN0IG9mIChbQ29udGFpbm1lbnROYXZQcm9wXS8pKltOYXZQcm9wXVxuXHRcdFx0Y29uc3QgZnVsbE5hdmlnYXRpb25QYXRoID0gdmlzaXRlZE5hdmlnYXRpb25Qcm9wc05hbWUuam9pbihcIi9cIik7XG5cdFx0XHRpZiAoY3VycmVudEVudGl0eVNldCAmJiBjdXJyZW50RW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkoZnVsbE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHRwYXJlbnRFbnRpdHlTZXQgPSBjdXJyZW50RW50aXR5U2V0O1xuXHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gY3VycmVudEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nW2Z1bGxOYXZpZ2F0aW9uUGF0aF07XG5cdFx0XHRcdHRhcmdldEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdC8vIElmIHdlIHJlYWNoZWQgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IHdpdGggYSBuYXZpZ2F0aW9ucHJvcGVydHliaW5kaW5nLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSB2aXNpdGVkIHBhdGggb24gdGhlIG5leHQgaXRlcmF0aW9uIChpZiB0aGVyZSBpcyBvbmUpXG5cdFx0XHRcdHJlc2V0VmlzaXRlZE5hdlByb3BzID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFdlIHJlYWxseSBzaG91bGQgbm90IGVuZCB1cCBoZXJlIGJ1dCBhdCBsZWFzdCBsZXQncyB0cnkgdG8gYXZvaWQgaW5jb3JyZWN0IGJlaGF2aW9yXG5cdFx0XHRcdHBhcmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdGN1cnJlbnRFbnRpdHlTZXQgPSBudWxsO1xuXHRcdFx0XHRyZXNldFZpc2l0ZWROYXZQcm9wcyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmVudEVudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHR0YXJnZXRFbnRpdHlTZXQgPSBudWxsO1xuXHRcdH1cblx0fSk7XG5cblx0Ly8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5hdmlnYXRlZCBkb3duIGFsbCB0aGUgbmF2IHByb3AgYW5kIHdlIHNob3VsZCBoYXZlXG5cdC8vIFRoZSB0YXJnZXQgZW50aXR5c2V0IHBvaW50aW5nIHRvIGVpdGhlciBudWxsIChpbiBjYXNlIG9mIGNvbnRhaW5tZW50IG5hdnByb3AgYSBsYXN0IHBhcnQpLCBvciB0aGUgYWN0dWFsIHRhcmdldCAobm9uIGNvbnRhaW5tZW50IGFzIHRhcmdldClcblx0Ly8gVGhlIHBhcmVudCBlbnRpdHlTZXQgcG9pbnRpbmcgdG8gdGhlIHByZXZpb3VzIGVudGl0eXNldCB1c2VkIGluIHRoZSBwYXRoXG5cdC8vIFZpc2l0ZWROYXZpZ2F0aW9uUGF0aCBzaG91bGQgY29udGFpbiB0aGUgcGF0aCB1cCB0byB0aGlzIHByb3BlcnR5XG5cblx0Ly8gUmVzdHJpY3Rpb25zIHNob3VsZCB0aGVuIGJlIGV2YWx1YXRlZCBhcyBQYXJlbnRFbnRpdHlTZXQuTmF2UmVzdHJpY3Rpb25zW05hdnByb3BlcnR5UGF0aF0gfHwgVGFyZ2V0RW50aXR5U2V0LlJlc3RyaWN0aW9uc1xuXHRjb25zdCBmdWxsTmF2aWdhdGlvblBhdGggPSB2aXNpdGVkTmF2aWdhdGlvblByb3BzTmFtZS5qb2luKFwiL1wiKTtcblx0bGV0IHJlc3RyaWN0aW9ucywgdmlzaXRlZE5hdlByb3BzO1xuXHRpZiAocGFyZW50RW50aXR5U2V0ICE9PSBudWxsKSB7XG5cdFx0Y29uc3QgX3BhcmVudEVudGl0eVNldDogRW50aXR5U2V0ID0gcGFyZW50RW50aXR5U2V0O1xuXHRcdF9wYXJlbnRFbnRpdHlTZXQuYW5ub3RhdGlvbnM/LkNhcGFiaWxpdGllcz8uTmF2aWdhdGlvblJlc3RyaWN0aW9ucz8uUmVzdHJpY3RlZFByb3BlcnRpZXMuZm9yRWFjaChcblx0XHRcdChyZXN0cmljdGVkTmF2UHJvcDogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb25UeXBlcykgPT4ge1xuXHRcdFx0XHRpZiAocmVzdHJpY3RlZE5hdlByb3AuTmF2aWdhdGlvblByb3BlcnR5Py50eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3RyaWN0aW9uRGVmaW5pdGlvbiA9IGNoZWNrRnVuY3Rpb24ocmVzdHJpY3RlZE5hdlByb3ApO1xuXHRcdFx0XHRcdGlmIChmdWxsTmF2aWdhdGlvblBhdGggPT09IHJlc3RyaWN0ZWROYXZQcm9wLk5hdmlnYXRpb25Qcm9wZXJ0eS52YWx1ZSAmJiByZXN0cmljdGlvbkRlZmluaXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgX2FsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHMgPSBhbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzLnNsaWNlKDAsIC0xKTtcblx0XHRcdFx0XHRcdGlmICh0YXJnZXRFbnRpdHlTZXQgIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0dmlzaXRlZE5hdlByb3BzID0gX2FsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHM7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAoX2FsbFZpc2l0ZWROYXZpZ2F0aW9uUHJvcHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmlzaXRlZE5hdlByb3BzID0gYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcy5zbGljZSgwKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR2aXNpdGVkTmF2UHJvcHMgPSBfYWxsVmlzaXRlZE5hdmlnYXRpb25Qcm9wcztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmVzdHJpY3Rpb25zID0gZXF1YWwoXG5cdFx0XHRcdFx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRcdFx0XHRcdHJlc3RyaWN0aW9uRGVmaW5pdGlvbixcblx0XHRcdFx0XHRcdFx0XHRnZXRQYXRoUmVsYXRpdmVMb2NhdGlvbihkYXRhTW9kZWxPYmplY3RQYXRoPy5jb250ZXh0TG9jYXRpb24sIHZpc2l0ZWROYXZQcm9wcykubWFwKG5wID0+IG5wLm5hbWUpXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KTtcblx0fVxuXHRsZXQgdGFyZ2V0UmVzdHJpY3Rpb25zO1xuXHRsZXQgcmVzdHJpY3Rpb25EZWZpbml0aW9uID0gY2hlY2tGdW5jdGlvbih0YXJnZXRFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXMpO1xuXHRpZiAodGFyZ2V0RW50aXR5U2V0ID09PSBudWxsICYmIHJlc3RyaWN0aW9uRGVmaW5pdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmVzdHJpY3Rpb25EZWZpbml0aW9uID0gY2hlY2tGdW5jdGlvbih0YXJnZXRFbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzKTtcblx0fVxuXHRpZiAocmVzdHJpY3Rpb25EZWZpbml0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YXJnZXRSZXN0cmljdGlvbnMgPSBlcXVhbChcblx0XHRcdGFubm90YXRpb25FeHByZXNzaW9uKFxuXHRcdFx0XHRyZXN0cmljdGlvbkRlZmluaXRpb24sXG5cdFx0XHRcdGdldFBhdGhSZWxhdGl2ZUxvY2F0aW9uKGRhdGFNb2RlbE9iamVjdFBhdGguY29udGV4dExvY2F0aW9uLCBhbGxWaXNpdGVkTmF2aWdhdGlvblByb3BzKS5tYXAobnAgPT4gbnAubmFtZSlcblx0XHRcdCksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0fVxuXHQvLyBPbiB0YWJsZSBjYXNlIHdlIG5lZWQgdG8ga25vdyBpZiByZXN0cmljdGlvbnMgYXJlIG9ubHkgc2V0IG9uIHRhcmdldEVudGl0eVxuXHRpZiAoYlRhYmxlQ2FzZSAmJiAhcmVzdHJpY3Rpb25zICYmIHRhcmdldFJlc3RyaWN0aW9ucykge1xuXHRcdGNvbnN0IG9SZXN1bHQ6IGFueSA9IHtcblx0XHRcdFwiY3VycmVudEVudGl0eVJlc3RyaWN0aW9uXCI6IHRhcmdldFJlc3RyaWN0aW9uc1xuXHRcdH07XG5cdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdH1cblx0cmV0dXJuIHJlc3RyaWN0aW9ucyB8fCB0YXJnZXRSZXN0cmljdGlvbnMgfHwgY29uc3RhbnQodHJ1ZSk7XG59O1xuIl19
@@ -1,7 +1,7 @@
1
1
  import { EntitySet, EntityType, NavigationProperty, Property } from "@sap-ux/annotation-converter";
2
2
  import { annotationExpression, constant, equal, Expression } from "sap/fe/core/helpers/BindingExpression";
3
3
  import { NavigationPropertyRestrictionTypes } from "@sap-ux/vocabularies-types/dist/generated/Capabilities";
4
- import { PropertyOrPath } from "sap/fe/core/templating/UIFormatters";
4
+ import { PropertyOrPath } from "sap/fe/core/templating/DisplayModeFormatter";
5
5
  import { isAnnotationPathExpression, isPathExpression } from "sap/fe/core/templating/PropertyHelper";
6
6
  import {
7
7
  FilterExpressionRestrictionTypeTypes,
@@ -126,21 +126,14 @@ export const enhanceDataModelPath = function(
126
126
  };
127
127
  };
128
128
 
129
- export const getTargetEntitySetPath = function(dataModelObjectPath: DataModelObjectPath, bRelative: boolean = false): string {
130
- let targetEntitySetPath: string = "";
131
- if (!bRelative) {
132
- targetEntitySetPath += `/${dataModelObjectPath.startingEntitySet.name}`;
133
- }
129
+ export const getTargetEntitySetPath = function(dataModelObjectPath: DataModelObjectPath): string {
130
+ let targetEntitySetPath: string = `/${dataModelObjectPath.startingEntitySet.name}`;
134
131
  let currentEntitySet = dataModelObjectPath.startingEntitySet;
135
132
  let navigatedPaths: string[] = [];
136
133
  dataModelObjectPath.navigationProperties.forEach(navProp => {
137
134
  navigatedPaths.push(navProp.name);
138
135
  if (currentEntitySet && currentEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
139
- if (bRelative) {
140
- targetEntitySetPath += `${navigatedPaths.join("/")}`;
141
- } else {
142
- targetEntitySetPath += `/$NavigationPropertyBinding/${navigatedPaths.join("/")}/$`;
143
- }
136
+ targetEntitySetPath += `/$NavigationPropertyBinding/${navigatedPaths.join("/")}/$`;
144
137
  currentEntitySet = currentEntitySet.navigationPropertyBinding[navigatedPaths.join("/")];
145
138
  navigatedPaths = [];
146
139
  }
@@ -148,21 +141,6 @@ export const getTargetEntitySetPath = function(dataModelObjectPath: DataModelObj
148
141
  return targetEntitySetPath;
149
142
  };
150
143
 
151
- export const getTargetEntitySetNavigation = function(dataModelObjectPath: DataModelObjectPath): NavigationProperty[] {
152
- const visitedNavigationProperties: NavigationProperty[] = [];
153
- let currentEntitySet = dataModelObjectPath.startingEntitySet;
154
- let navigatedPaths: string[] = [];
155
- dataModelObjectPath.navigationProperties.forEach(navProp => {
156
- navigatedPaths.push(navProp.name);
157
- if (currentEntitySet && currentEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
158
- visitedNavigationProperties.push(navProp);
159
- currentEntitySet = currentEntitySet.navigationPropertyBinding[navigatedPaths.join("/")];
160
- navigatedPaths = [];
161
- }
162
- });
163
- return visitedNavigationProperties;
164
- };
165
-
166
144
  export const getTargetObjectPath = function(dataModelObjectPath: DataModelObjectPath, bRelative: boolean = false): string {
167
145
  let path = "";
168
146
  if (!dataModelObjectPath.startingEntitySet) {
@@ -244,7 +222,7 @@ export const isPathUpdatable = function(
244
222
  ): Expression<boolean> {
245
223
  return checkOnPath(
246
224
  dataModelObjectPath,
247
- (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities | EntityTypeAnnotations_Capabilities) => {
225
+ (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities) => {
248
226
  return annotationObject?.UpdateRestrictions?.Updatable;
249
227
  },
250
228
  propertyPath,
@@ -274,7 +252,7 @@ export const isPathDeletable = function(
274
252
  ): Expression<boolean> {
275
253
  return checkOnPath(
276
254
  dataModelObjectPath,
277
- (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities | EntityTypeAnnotations_Capabilities) => {
255
+ (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities) => {
278
256
  return annotationObject?.DeleteRestrictions?.Deletable;
279
257
  },
280
258
  propertyPath,
@@ -284,14 +262,16 @@ export const isPathDeletable = function(
284
262
 
285
263
  export const isPathInsertable = function(
286
264
  dataModelObjectPath: DataModelObjectPath | undefined,
287
- propertyPath?: PropertyOrPath<Property>
265
+ propertyPath?: PropertyOrPath<Property>,
266
+ bTableCase?: boolean
288
267
  ): Expression<boolean> {
289
268
  return checkOnPath(
290
269
  dataModelObjectPath,
291
- (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities | EntityTypeAnnotations_Capabilities) => {
270
+ (annotationObject: NavigationPropertyRestriction | EntitySetAnnotations_Capabilities) => {
292
271
  return annotationObject?.InsertRestrictions?.Insertable;
293
272
  },
294
- propertyPath
273
+ propertyPath,
274
+ bTableCase
295
275
  );
296
276
  };
297
277
 
@@ -417,8 +397,8 @@ export const checkOnPath = function(
417
397
  true
418
398
  );
419
399
  }
420
- //object page table case in path based scenario's fallback to exisiting approach
421
- if (bTableCase && !restrictions && restrictionDefinition?.path) {
400
+ // On table case we need to know if restrictions are only set on targetEntity
401
+ if (bTableCase && !restrictions && targetRestrictions) {
422
402
  const oResult: any = {
423
403
  "currentEntityRestriction": targetRestrictions
424
404
  };
@@ -0,0 +1,114 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/core/templating/PropertyHelper"], function (PropertyHelper) {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+ var isPathExpression = PropertyHelper.isPathExpression;
10
+
11
+ var EDM_TYPE_MAPPING = {
12
+ "Edm.Boolean": {
13
+ type: "sap.ui.model.odata.type.Boolean"
14
+ },
15
+ "Edm.Byte": {
16
+ type: "sap.ui.model.odata.type.Byte"
17
+ },
18
+ "Edm.Date": {
19
+ type: "sap.ui.model.odata.type.Date"
20
+ },
21
+ "Edm.DateTimeOffset": {
22
+ constraints: {
23
+ "$Precision": "precision"
24
+ },
25
+ type: "sap.ui.model.odata.type.DateTimeOffset"
26
+ },
27
+ "Edm.Decimal": {
28
+ constraints: {
29
+ "@Org.OData.Validation.V1.Minimum/$Decimal": "minimum",
30
+ "@Org.OData.Validation.V1.Minimum@Org.OData.Validation.V1.Exclusive": "minimumExclusive",
31
+ "@Org.OData.Validation.V1.Maximum/$Decimal": "maximum",
32
+ "@Org.OData.Validation.V1.Maximum@Org.OData.Validation.V1.Exclusive": "maximumExclusive",
33
+ "$Precision": "precision",
34
+ "$Scale": "scale"
35
+ },
36
+ type: "sap.ui.model.odata.type.Decimal"
37
+ },
38
+ "Edm.Double": {
39
+ type: "sap.ui.model.odata.type.Double"
40
+ },
41
+ "Edm.Guid": {
42
+ type: "sap.ui.model.odata.type.Guid"
43
+ },
44
+ "Edm.Int16": {
45
+ type: "sap.ui.model.odata.type.Int16"
46
+ },
47
+ "Edm.Int32": {
48
+ type: "sap.ui.model.odata.type.Int32"
49
+ },
50
+ "Edm.Int64": {
51
+ type: "sap.ui.model.odata.type.Int64"
52
+ },
53
+ "Edm.SByte": {
54
+ type: "sap.ui.model.odata.type.SByte"
55
+ },
56
+ "Edm.Single": {
57
+ type: "sap.ui.model.odata.type.Single"
58
+ },
59
+ "Edm.Stream": {
60
+ type: "sap.ui.model.odata.type.Stream"
61
+ },
62
+ "Edm.Binary": {
63
+ type: "sap.ui.model.odata.type.Stream"
64
+ },
65
+ "Edm.String": {
66
+ constraints: {
67
+ "@com.sap.vocabularies.Common.v1.IsDigitSequence": "isDigitSequence",
68
+ "$MaxLength": "maxLength",
69
+ "$Nullable": "nullable"
70
+ },
71
+ type: "sap.ui.model.odata.type.String"
72
+ },
73
+ "Edm.TimeOfDay": {
74
+ constraints: {
75
+ "$Precision": "precision"
76
+ },
77
+ type: "sap.ui.model.odata.type.TimeOfDay"
78
+ }
79
+ };
80
+ _exports.EDM_TYPE_MAPPING = EDM_TYPE_MAPPING;
81
+
82
+ var getDisplayMode = function (oPropertyPath, oDataModelObjectPath) {
83
+ var _oProperty$annotation, _oProperty$annotation2, _oTextAnnotation$anno, _oTextAnnotation$anno2, _oTextAnnotation$anno3, _oEntityType$annotati, _oEntityType$annotati2, _oEntityType$annotati3, _oEntityType$annotati4, _oEntityType$annotati5, _oEntityType$annotati6;
84
+
85
+ if (!oPropertyPath || typeof oPropertyPath === "string") {
86
+ return "Value";
87
+ }
88
+
89
+ var oProperty = isPathExpression(oPropertyPath) && oPropertyPath.$target || oPropertyPath;
90
+ var oEntityType = oDataModelObjectPath && oDataModelObjectPath.targetEntityType;
91
+ var oTextAnnotation = (_oProperty$annotation = oProperty.annotations) === null || _oProperty$annotation === void 0 ? void 0 : (_oProperty$annotation2 = _oProperty$annotation.Common) === null || _oProperty$annotation2 === void 0 ? void 0 : _oProperty$annotation2.Text;
92
+ var oTextArrangementAnnotation = typeof oTextAnnotation !== "string" && (oTextAnnotation === null || oTextAnnotation === void 0 ? void 0 : (_oTextAnnotation$anno = oTextAnnotation.annotations) === null || _oTextAnnotation$anno === void 0 ? void 0 : (_oTextAnnotation$anno2 = _oTextAnnotation$anno.UI) === null || _oTextAnnotation$anno2 === void 0 ? void 0 : (_oTextAnnotation$anno3 = _oTextAnnotation$anno2.TextArrangement) === null || _oTextAnnotation$anno3 === void 0 ? void 0 : _oTextAnnotation$anno3.toString()) || (oEntityType === null || oEntityType === void 0 ? void 0 : (_oEntityType$annotati = oEntityType.annotations) === null || _oEntityType$annotati === void 0 ? void 0 : (_oEntityType$annotati2 = _oEntityType$annotati.UI) === null || _oEntityType$annotati2 === void 0 ? void 0 : (_oEntityType$annotati3 = _oEntityType$annotati2.TextArrangement) === null || _oEntityType$annotati3 === void 0 ? void 0 : _oEntityType$annotati3.toString());
93
+ var sDisplayValue = oTextAnnotation ? "DescriptionValue" : "Value";
94
+
95
+ if (oTextAnnotation && oTextArrangementAnnotation || oEntityType !== null && oEntityType !== void 0 && (_oEntityType$annotati4 = oEntityType.annotations) !== null && _oEntityType$annotati4 !== void 0 && (_oEntityType$annotati5 = _oEntityType$annotati4.UI) !== null && _oEntityType$annotati5 !== void 0 && (_oEntityType$annotati6 = _oEntityType$annotati5.TextArrangement) !== null && _oEntityType$annotati6 !== void 0 && _oEntityType$annotati6.toString()) {
96
+ if (oTextArrangementAnnotation === "UI.TextArrangementType/TextOnly") {
97
+ sDisplayValue = "Description";
98
+ } else if (oTextArrangementAnnotation === "UI.TextArrangementType/TextLast") {
99
+ sDisplayValue = "ValueDescription";
100
+ } else if (oTextArrangementAnnotation === "UI.TextArrangementType/TextSeparate") {
101
+ sDisplayValue = "Value";
102
+ } else {
103
+ //Default should be TextFirst if there is a Text annotation and neither TextOnly nor TextLast are set
104
+ sDisplayValue = "DescriptionValue";
105
+ }
106
+ }
107
+
108
+ return sDisplayValue;
109
+ };
110
+
111
+ _exports.getDisplayMode = getDisplayMode;
112
+ return _exports;
113
+ }, false);
114
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRpc3BsYXlNb2RlRm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbIkVETV9UWVBFX01BUFBJTkciLCJ0eXBlIiwiY29uc3RyYWludHMiLCJnZXREaXNwbGF5TW9kZSIsIm9Qcm9wZXJ0eVBhdGgiLCJvRGF0YU1vZGVsT2JqZWN0UGF0aCIsIm9Qcm9wZXJ0eSIsImlzUGF0aEV4cHJlc3Npb24iLCIkdGFyZ2V0Iiwib0VudGl0eVR5cGUiLCJ0YXJnZXRFbnRpdHlUeXBlIiwib1RleHRBbm5vdGF0aW9uIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJUZXh0Iiwib1RleHRBcnJhbmdlbWVudEFubm90YXRpb24iLCJVSSIsIlRleHRBcnJhbmdlbWVudCIsInRvU3RyaW5nIiwic0Rpc3BsYXlWYWx1ZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7OztBQVdPLE1BQU1BLGdCQUFxQyxHQUFHO0FBQ3BELG1CQUFlO0FBQUVDLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBRHFDO0FBRXBELGdCQUFZO0FBQUVBLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBRndDO0FBR3BELGdCQUFZO0FBQUVBLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBSHdDO0FBSXBELDBCQUFzQjtBQUNyQkMsTUFBQUEsV0FBVyxFQUFFO0FBQ1osc0JBQWM7QUFERixPQURRO0FBSXJCRCxNQUFBQSxJQUFJLEVBQUU7QUFKZSxLQUo4QjtBQVVwRCxtQkFBZTtBQUNkQyxNQUFBQSxXQUFXLEVBQUU7QUFDWixxREFBNkMsU0FEakM7QUFFWiw4RUFBc0Usa0JBRjFEO0FBR1oscURBQTZDLFNBSGpDO0FBSVosOEVBQXNFLGtCQUoxRDtBQUtaLHNCQUFjLFdBTEY7QUFNWixrQkFBVTtBQU5FLE9BREM7QUFTZEQsTUFBQUEsSUFBSSxFQUFFO0FBVFEsS0FWcUM7QUFxQnBELGtCQUFjO0FBQUVBLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBckJzQztBQXNCcEQsZ0JBQVk7QUFBRUEsTUFBQUEsSUFBSSxFQUFFO0FBQVIsS0F0QndDO0FBdUJwRCxpQkFBYTtBQUFFQSxNQUFBQSxJQUFJLEVBQUU7QUFBUixLQXZCdUM7QUF3QnBELGlCQUFhO0FBQUVBLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBeEJ1QztBQXlCcEQsaUJBQWE7QUFBRUEsTUFBQUEsSUFBSSxFQUFFO0FBQVIsS0F6QnVDO0FBMEJwRCxpQkFBYTtBQUFFQSxNQUFBQSxJQUFJLEVBQUU7QUFBUixLQTFCdUM7QUEyQnBELGtCQUFjO0FBQUVBLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBM0JzQztBQTRCcEQsa0JBQWM7QUFBRUEsTUFBQUEsSUFBSSxFQUFFO0FBQVIsS0E1QnNDO0FBNkJwRCxrQkFBYztBQUFFQSxNQUFBQSxJQUFJLEVBQUU7QUFBUixLQTdCc0M7QUE4QnBELGtCQUFjO0FBQ2JDLE1BQUFBLFdBQVcsRUFBRTtBQUNaLDJEQUFtRCxpQkFEdkM7QUFFWixzQkFBYyxXQUZGO0FBR1oscUJBQWE7QUFIRCxPQURBO0FBTWJELE1BQUFBLElBQUksRUFBRTtBQU5PLEtBOUJzQztBQXNDcEQscUJBQWlCO0FBQ2hCQyxNQUFBQSxXQUFXLEVBQUU7QUFDWixzQkFBYztBQURGLE9BREc7QUFJaEJELE1BQUFBLElBQUksRUFBRTtBQUpVO0FBdENtQyxHQUE5Qzs7O0FBK0NBLE1BQU1FLGNBQWMsR0FBRyxVQUFTQyxhQUFULEVBQWtEQyxvQkFBbEQsRUFBMkc7QUFBQTs7QUFDeEksUUFBSSxDQUFDRCxhQUFELElBQWtCLE9BQU9BLGFBQVAsS0FBeUIsUUFBL0MsRUFBeUQ7QUFDeEQsYUFBTyxPQUFQO0FBQ0E7O0FBQ0QsUUFBTUUsU0FBUyxHQUFJQyxnQkFBZ0IsQ0FBQ0gsYUFBRCxDQUFoQixJQUFtQ0EsYUFBYSxDQUFDSSxPQUFsRCxJQUErREosYUFBakY7QUFDQSxRQUFNSyxXQUFXLEdBQUdKLG9CQUFvQixJQUFJQSxvQkFBb0IsQ0FBQ0ssZ0JBQWpFO0FBQ0EsUUFBTUMsZUFBZSw0QkFBR0wsU0FBUyxDQUFDTSxXQUFiLG9GQUFHLHNCQUF1QkMsTUFBMUIsMkRBQUcsdUJBQStCQyxJQUF2RDtBQUNBLFFBQU1DLDBCQUEwQixHQUM5QixPQUFPSixlQUFQLEtBQTJCLFFBQTNCLEtBQXVDQSxlQUF2QyxhQUF1Q0EsZUFBdkMsZ0RBQXVDQSxlQUFlLENBQUVDLFdBQXhELG9GQUF1QyxzQkFBOEJJLEVBQXJFLHFGQUF1Qyx1QkFBa0NDLGVBQXpFLDJEQUF1Qyx1QkFBbURDLFFBQW5ELEVBQXZDLENBQUQsS0FDQVQsV0FEQSxhQUNBQSxXQURBLGdEQUNBQSxXQUFXLENBQUVHLFdBRGIsb0ZBQ0Esc0JBQTBCSSxFQUQxQixxRkFDQSx1QkFBOEJDLGVBRDlCLDJEQUNBLHVCQUErQ0MsUUFBL0MsRUFEQSxDQUREO0FBSUEsUUFBSUMsYUFBYSxHQUFHUixlQUFlLEdBQUcsa0JBQUgsR0FBd0IsT0FBM0Q7O0FBQ0EsUUFBS0EsZUFBZSxJQUFJSSwwQkFBcEIsSUFBbUROLFdBQW5ELGFBQW1EQSxXQUFuRCx5Q0FBbURBLFdBQVcsQ0FBRUcsV0FBaEUsNkVBQW1ELHVCQUEwQkksRUFBN0UsNkVBQW1ELHVCQUE4QkMsZUFBakYsbURBQW1ELHVCQUErQ0MsUUFBL0MsRUFBdkQsRUFBa0g7QUFDakgsVUFBSUgsMEJBQTBCLEtBQUssaUNBQW5DLEVBQXNFO0FBQ3JFSSxRQUFBQSxhQUFhLEdBQUcsYUFBaEI7QUFDQSxPQUZELE1BRU8sSUFBSUosMEJBQTBCLEtBQUssaUNBQW5DLEVBQXNFO0FBQzVFSSxRQUFBQSxhQUFhLEdBQUcsa0JBQWhCO0FBQ0EsT0FGTSxNQUVBLElBQUlKLDBCQUEwQixLQUFLLHFDQUFuQyxFQUEwRTtBQUNoRkksUUFBQUEsYUFBYSxHQUFHLE9BQWhCO0FBQ0EsT0FGTSxNQUVBO0FBQ047QUFDQUEsUUFBQUEsYUFBYSxHQUFHLGtCQUFoQjtBQUNBO0FBQ0Q7O0FBQ0QsV0FBT0EsYUFBUDtBQUNBLEdBekJNIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlcGFyYXRpbmcgdGhlc2UgbWV0aG9kcyBmcm9tIHRoZSBVSUZvcm1hdHRlcnMgYXMgdGhleSBhcmUgdXNlZCBhbHNvIGluIHRoZSBjb252ZXJ0ZXIuXG4gKiBUaGVzZSBtZXRob2RzIG11c3QgTk9UIHVzZWQgYW55IGRlcGVuZGVuY3kgZnJvbSB0aGUgVUk1IHJ1bnRpbWUuXG4gKiBXaGVuIGNvbnN1bWVkIG91dHNpZGUgb2YgY29udmVydGVycywgeW91IHNob3VsZCBjYWxsIHRoZW0gdmlhIFVJRm9ybWF0dGVycy5cbiAqL1xuXG5pbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgaXNQYXRoRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdHlwZXMvRWRtXCI7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5T3JQYXRoPFA+ID0gc3RyaW5nIHwgUCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxQPjtcblxuZXhwb3J0IGNvbnN0IEVETV9UWVBFX01BUFBJTkc6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG5cdFwiRWRtLkJvb2xlYW5cIjogeyB0eXBlOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLkJvb2xlYW5cIiB9LFxuXHRcIkVkbS5CeXRlXCI6IHsgdHlwZTogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5CeXRlXCIgfSxcblx0XCJFZG0uRGF0ZVwiOiB7IHR5cGU6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRGF0ZVwiIH0sXG5cdFwiRWRtLkRhdGVUaW1lT2Zmc2V0XCI6IHtcblx0XHRjb25zdHJhaW50czoge1xuXHRcdFx0XCIkUHJlY2lzaW9uXCI6IFwicHJlY2lzaW9uXCJcblx0XHR9LFxuXHRcdHR5cGU6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRGF0ZVRpbWVPZmZzZXRcIlxuXHR9LFxuXHRcIkVkbS5EZWNpbWFsXCI6IHtcblx0XHRjb25zdHJhaW50czoge1xuXHRcdFx0XCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWluaW11bS8kRGVjaW1hbFwiOiBcIm1pbmltdW1cIixcblx0XHRcdFwiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1pbmltdW1AT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuRXhjbHVzaXZlXCI6IFwibWluaW11bUV4Y2x1c2l2ZVwiLFxuXHRcdFx0XCJAT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuTWF4aW11bS8kRGVjaW1hbFwiOiBcIm1heGltdW1cIixcblx0XHRcdFwiQE9yZy5PRGF0YS5WYWxpZGF0aW9uLlYxLk1heGltdW1AT3JnLk9EYXRhLlZhbGlkYXRpb24uVjEuRXhjbHVzaXZlXCI6IFwibWF4aW11bUV4Y2x1c2l2ZVwiLFxuXHRcdFx0XCIkUHJlY2lzaW9uXCI6IFwicHJlY2lzaW9uXCIsXG5cdFx0XHRcIiRTY2FsZVwiOiBcInNjYWxlXCJcblx0XHR9LFxuXHRcdHR5cGU6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRGVjaW1hbFwiXG5cdH0sXG5cdFwiRWRtLkRvdWJsZVwiOiB7IHR5cGU6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuRG91YmxlXCIgfSxcblx0XCJFZG0uR3VpZFwiOiB7IHR5cGU6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuR3VpZFwiIH0sXG5cdFwiRWRtLkludDE2XCI6IHsgdHlwZTogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnQxNlwiIH0sXG5cdFwiRWRtLkludDMyXCI6IHsgdHlwZTogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnQzMlwiIH0sXG5cdFwiRWRtLkludDY0XCI6IHsgdHlwZTogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5JbnQ2NFwiIH0sXG5cdFwiRWRtLlNCeXRlXCI6IHsgdHlwZTogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TQnl0ZVwiIH0sXG5cdFwiRWRtLlNpbmdsZVwiOiB7IHR5cGU6IFwic2FwLnVpLm1vZGVsLm9kYXRhLnR5cGUuU2luZ2xlXCIgfSxcblx0XCJFZG0uU3RyZWFtXCI6IHsgdHlwZTogXCJzYXAudWkubW9kZWwub2RhdGEudHlwZS5TdHJlYW1cIiB9LFxuXHRcIkVkbS5CaW5hcnlcIjogeyB0eXBlOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmVhbVwiIH0sXG5cdFwiRWRtLlN0cmluZ1wiOiB7XG5cdFx0Y29uc3RyYWludHM6IHtcblx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RpZ2l0U2VxdWVuY2VcIjogXCJpc0RpZ2l0U2VxdWVuY2VcIixcblx0XHRcdFwiJE1heExlbmd0aFwiOiBcIm1heExlbmd0aFwiLFxuXHRcdFx0XCIkTnVsbGFibGVcIjogXCJudWxsYWJsZVwiXG5cdFx0fSxcblx0XHR0eXBlOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlN0cmluZ1wiXG5cdH0sXG5cdFwiRWRtLlRpbWVPZkRheVwiOiB7XG5cdFx0Y29uc3RyYWludHM6IHtcblx0XHRcdFwiJFByZWNpc2lvblwiOiBcInByZWNpc2lvblwiXG5cdFx0fSxcblx0XHR0eXBlOiBcInNhcC51aS5tb2RlbC5vZGF0YS50eXBlLlRpbWVPZkRheVwiXG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIERpc3BsYXlNb2RlID0gXCJWYWx1ZVwiIHwgXCJEZXNjcmlwdGlvblwiIHwgXCJEZXNjcmlwdGlvblZhbHVlXCIgfCBcIlZhbHVlRGVzY3JpcHRpb25cIjtcbmV4cG9ydCBjb25zdCBnZXREaXNwbGF5TW9kZSA9IGZ1bmN0aW9uKG9Qcm9wZXJ0eVBhdGg6IFByb3BlcnR5T3JQYXRoPFByb3BlcnR5Piwgb0RhdGFNb2RlbE9iamVjdFBhdGg/OiBEYXRhTW9kZWxPYmplY3RQYXRoKTogRGlzcGxheU1vZGUge1xuXHRpZiAoIW9Qcm9wZXJ0eVBhdGggfHwgdHlwZW9mIG9Qcm9wZXJ0eVBhdGggPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gXCJWYWx1ZVwiO1xuXHR9XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IChpc1BhdGhFeHByZXNzaW9uKG9Qcm9wZXJ0eVBhdGgpICYmIG9Qcm9wZXJ0eVBhdGguJHRhcmdldCkgfHwgKG9Qcm9wZXJ0eVBhdGggYXMgUHJvcGVydHkpO1xuXHRjb25zdCBvRW50aXR5VHlwZSA9IG9EYXRhTW9kZWxPYmplY3RQYXRoICYmIG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGU7XG5cdGNvbnN0IG9UZXh0QW5ub3RhdGlvbiA9IG9Qcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0O1xuXHRjb25zdCBvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbiA9XG5cdFx0KHR5cGVvZiBvVGV4dEFubm90YXRpb24gIT09IFwic3RyaW5nXCIgJiYgb1RleHRBbm5vdGF0aW9uPy5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudD8udG9TdHJpbmcoKSkgfHxcblx0XHRvRW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQ/LnRvU3RyaW5nKCk7XG5cblx0bGV0IHNEaXNwbGF5VmFsdWUgPSBvVGV4dEFubm90YXRpb24gPyBcIkRlc2NyaXB0aW9uVmFsdWVcIiA6IFwiVmFsdWVcIjtcblx0aWYgKChvVGV4dEFubm90YXRpb24gJiYgb1RleHRBcnJhbmdlbWVudEFubm90YXRpb24pIHx8IG9FbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudD8udG9TdHJpbmcoKSkge1xuXHRcdGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbiA9PT0gXCJVSS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRPbmx5XCIpIHtcblx0XHRcdHNEaXNwbGF5VmFsdWUgPSBcIkRlc2NyaXB0aW9uXCI7XG5cdFx0fSBlbHNlIGlmIChvVGV4dEFycmFuZ2VtZW50QW5ub3RhdGlvbiA9PT0gXCJVSS5UZXh0QXJyYW5nZW1lbnRUeXBlL1RleHRMYXN0XCIpIHtcblx0XHRcdHNEaXNwbGF5VmFsdWUgPSBcIlZhbHVlRGVzY3JpcHRpb25cIjtcblx0XHR9IGVsc2UgaWYgKG9UZXh0QXJyYW5nZW1lbnRBbm5vdGF0aW9uID09PSBcIlVJLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dFNlcGFyYXRlXCIpIHtcblx0XHRcdHNEaXNwbGF5VmFsdWUgPSBcIlZhbHVlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vRGVmYXVsdCBzaG91bGQgYmUgVGV4dEZpcnN0IGlmIHRoZXJlIGlzIGEgVGV4dCBhbm5vdGF0aW9uIGFuZCBuZWl0aGVyIFRleHRPbmx5IG5vciBUZXh0TGFzdCBhcmUgc2V0XG5cdFx0XHRzRGlzcGxheVZhbHVlID0gXCJEZXNjcmlwdGlvblZhbHVlXCI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBzRGlzcGxheVZhbHVlIGFzIERpc3BsYXlNb2RlO1xufTtcbiJdfQ==
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Separating these methods from the UIFormatters as they are used also in the converter.
3
+ * These methods must NOT used any dependency from the UI5 runtime.
4
+ * When consumed outside of converters, you should call them via UIFormatters.
5
+ */
6
+
7
+ import { Property } from "@sap-ux/annotation-converter";
8
+ import { DataModelObjectPath } from "sap/fe/core/templating/DataModelPathHelper";
9
+ import { isPathExpression } from "sap/fe/core/templating/PropertyHelper";
10
+ import { PathAnnotationExpression } from "@sap-ux/vocabularies-types/types/Edm";
11
+
12
+ export type PropertyOrPath<P> = string | P | PathAnnotationExpression<P>;
13
+
14
+ export const EDM_TYPE_MAPPING: Record<string, any> = {
15
+ "Edm.Boolean": { type: "sap.ui.model.odata.type.Boolean" },
16
+ "Edm.Byte": { type: "sap.ui.model.odata.type.Byte" },
17
+ "Edm.Date": { type: "sap.ui.model.odata.type.Date" },
18
+ "Edm.DateTimeOffset": {
19
+ constraints: {
20
+ "$Precision": "precision"
21
+ },
22
+ type: "sap.ui.model.odata.type.DateTimeOffset"
23
+ },
24
+ "Edm.Decimal": {
25
+ constraints: {
26
+ "@Org.OData.Validation.V1.Minimum/$Decimal": "minimum",
27
+ "@Org.OData.Validation.V1.Minimum@Org.OData.Validation.V1.Exclusive": "minimumExclusive",
28
+ "@Org.OData.Validation.V1.Maximum/$Decimal": "maximum",
29
+ "@Org.OData.Validation.V1.Maximum@Org.OData.Validation.V1.Exclusive": "maximumExclusive",
30
+ "$Precision": "precision",
31
+ "$Scale": "scale"
32
+ },
33
+ type: "sap.ui.model.odata.type.Decimal"
34
+ },
35
+ "Edm.Double": { type: "sap.ui.model.odata.type.Double" },
36
+ "Edm.Guid": { type: "sap.ui.model.odata.type.Guid" },
37
+ "Edm.Int16": { type: "sap.ui.model.odata.type.Int16" },
38
+ "Edm.Int32": { type: "sap.ui.model.odata.type.Int32" },
39
+ "Edm.Int64": { type: "sap.ui.model.odata.type.Int64" },
40
+ "Edm.SByte": { type: "sap.ui.model.odata.type.SByte" },
41
+ "Edm.Single": { type: "sap.ui.model.odata.type.Single" },
42
+ "Edm.Stream": { type: "sap.ui.model.odata.type.Stream" },
43
+ "Edm.Binary": { type: "sap.ui.model.odata.type.Stream" },
44
+ "Edm.String": {
45
+ constraints: {
46
+ "@com.sap.vocabularies.Common.v1.IsDigitSequence": "isDigitSequence",
47
+ "$MaxLength": "maxLength",
48
+ "$Nullable": "nullable"
49
+ },
50
+ type: "sap.ui.model.odata.type.String"
51
+ },
52
+ "Edm.TimeOfDay": {
53
+ constraints: {
54
+ "$Precision": "precision"
55
+ },
56
+ type: "sap.ui.model.odata.type.TimeOfDay"
57
+ }
58
+ };
59
+
60
+ export type DisplayMode = "Value" | "Description" | "DescriptionValue" | "ValueDescription";
61
+ export const getDisplayMode = function(oPropertyPath: PropertyOrPath<Property>, oDataModelObjectPath?: DataModelObjectPath): DisplayMode {
62
+ if (!oPropertyPath || typeof oPropertyPath === "string") {
63
+ return "Value";
64
+ }
65
+ const oProperty = (isPathExpression(oPropertyPath) && oPropertyPath.$target) || (oPropertyPath as Property);
66
+ const oEntityType = oDataModelObjectPath && oDataModelObjectPath.targetEntityType;
67
+ const oTextAnnotation = oProperty.annotations?.Common?.Text;
68
+ const oTextArrangementAnnotation =
69
+ (typeof oTextAnnotation !== "string" && oTextAnnotation?.annotations?.UI?.TextArrangement?.toString()) ||
70
+ oEntityType?.annotations?.UI?.TextArrangement?.toString();
71
+
72
+ let sDisplayValue = oTextAnnotation ? "DescriptionValue" : "Value";
73
+ if ((oTextAnnotation && oTextArrangementAnnotation) || oEntityType?.annotations?.UI?.TextArrangement?.toString()) {
74
+ if (oTextArrangementAnnotation === "UI.TextArrangementType/TextOnly") {
75
+ sDisplayValue = "Description";
76
+ } else if (oTextArrangementAnnotation === "UI.TextArrangementType/TextLast") {
77
+ sDisplayValue = "ValueDescription";
78
+ } else if (oTextArrangementAnnotation === "UI.TextArrangementType/TextSeparate") {
79
+ sDisplayValue = "Value";
80
+ } else {
81
+ //Default should be TextFirst if there is a Text annotation and neither TextOnly nor TextLast are set
82
+ sDisplayValue = "DescriptionValue";
83
+ }
84
+ }
85
+ return sDisplayValue as DisplayMode;
86
+ };