@sapui5/sap.fe.core 1.141.2 → 1.142.1

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 +1 -1
  2. package/src/sap/fe/core/.library +4 -1
  3. package/src/sap/fe/core/ActionRuntime.js +48 -23
  4. package/src/sap/fe/core/ActionRuntime.ts +61 -35
  5. package/src/sap/fe/core/AppComponent.js +76 -6
  6. package/src/sap/fe/core/AppComponent.ts +94 -8
  7. package/src/sap/fe/core/AppStateHandler.js +9 -8
  8. package/src/sap/fe/core/AppStateHandler.ts +13 -9
  9. package/src/sap/fe/core/BaseController.js +8 -5
  10. package/src/sap/fe/core/BaseController.ts +6 -1
  11. package/src/sap/fe/core/CommonUtils.js +4 -123
  12. package/src/sap/fe/core/CommonUtils.ts +3 -172
  13. package/src/sap/fe/core/ExtensionAPI.js +3 -10
  14. package/src/sap/fe/core/ExtensionAPI.ts +2 -14
  15. package/src/sap/fe/core/PageController.js +64 -43
  16. package/src/sap/fe/core/PageController.ts +62 -47
  17. package/src/sap/fe/core/TemplateComponent.js +20 -1
  18. package/src/sap/fe/core/TemplateComponent.ts +24 -2
  19. package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
  20. package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
  21. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
  22. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
  23. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
  24. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
  25. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
  26. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
  27. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
  28. package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
  29. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
  30. package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
  31. package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
  32. package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
  33. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
  34. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
  35. package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
  36. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
  37. package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
  38. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
  39. package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
  40. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
  41. package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
  42. package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
  43. package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
  44. package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
  45. package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
  46. package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
  47. package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
  48. package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
  49. package/src/sap/fe/core/controllerextensions/Share.js +5 -5
  50. package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
  51. package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
  52. package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
  53. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
  54. package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
  55. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
  56. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
  57. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
  58. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
  59. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
  60. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
  61. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
  62. package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
  63. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
  64. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
  65. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
  66. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
  67. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
  68. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
  69. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
  70. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
  71. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
  72. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
  73. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
  74. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
  75. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
  76. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
  77. package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
  78. package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
  79. package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
  80. package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
  81. package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
  82. package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
  83. package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
  84. package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
  85. package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
  86. package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
  87. package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
  88. package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
  89. package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
  90. package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
  91. package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
  92. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
  93. package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
  94. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
  95. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
  96. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
  98. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
  100. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
  101. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
  102. package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
  103. package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
  104. package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
  105. package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
  106. package/src/sap/fe/core/converters/helpers/ID.js +3 -1
  107. package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
  108. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
  110. package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
  112. package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
  113. package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
  114. package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
  115. package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
  118. package/src/sap/fe/core/fpm/Component.js +8 -1
  119. package/src/sap/fe/core/fpm/Component.ts +8 -0
  120. package/src/sap/fe/core/fpm/manifest.json +1 -1
  121. package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
  122. package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
  123. package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
  124. package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
  125. package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
  126. package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
  127. package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
  128. package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
  129. package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
  130. package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
  131. package/src/sap/fe/core/helpers/WebSocket.js +6 -7
  132. package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
  133. package/src/sap/fe/core/library.js +30 -3
  134. package/src/sap/fe/core/library.ts +28 -1
  135. package/src/sap/fe/core/messagebundle.properties +8 -1
  136. package/src/sap/fe/core/messagebundle_ar.properties +7 -0
  137. package/src/sap/fe/core/messagebundle_bg.properties +10 -3
  138. package/src/sap/fe/core/messagebundle_ca.properties +7 -0
  139. package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
  140. package/src/sap/fe/core/messagebundle_cs.properties +7 -0
  141. package/src/sap/fe/core/messagebundle_cy.properties +8 -1
  142. package/src/sap/fe/core/messagebundle_da.properties +7 -0
  143. package/src/sap/fe/core/messagebundle_de.properties +7 -0
  144. package/src/sap/fe/core/messagebundle_el.properties +7 -0
  145. package/src/sap/fe/core/messagebundle_en.properties +8 -1
  146. package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
  147. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
  148. package/src/sap/fe/core/messagebundle_es.properties +8 -1
  149. package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
  150. package/src/sap/fe/core/messagebundle_et.properties +7 -0
  151. package/src/sap/fe/core/messagebundle_fi.properties +7 -0
  152. package/src/sap/fe/core/messagebundle_fr.properties +16 -9
  153. package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
  154. package/src/sap/fe/core/messagebundle_hi.properties +8 -1
  155. package/src/sap/fe/core/messagebundle_hr.properties +7 -0
  156. package/src/sap/fe/core/messagebundle_hu.properties +7 -0
  157. package/src/sap/fe/core/messagebundle_id.properties +7 -0
  158. package/src/sap/fe/core/messagebundle_it.properties +7 -0
  159. package/src/sap/fe/core/messagebundle_iw.properties +7 -0
  160. package/src/sap/fe/core/messagebundle_ja.properties +8 -1
  161. package/src/sap/fe/core/messagebundle_kk.properties +7 -0
  162. package/src/sap/fe/core/messagebundle_ko.properties +7 -0
  163. package/src/sap/fe/core/messagebundle_lt.properties +7 -0
  164. package/src/sap/fe/core/messagebundle_lv.properties +7 -0
  165. package/src/sap/fe/core/messagebundle_mk.properties +7 -0
  166. package/src/sap/fe/core/messagebundle_ms.properties +7 -0
  167. package/src/sap/fe/core/messagebundle_nl.properties +7 -0
  168. package/src/sap/fe/core/messagebundle_no.properties +7 -0
  169. package/src/sap/fe/core/messagebundle_pl.properties +7 -0
  170. package/src/sap/fe/core/messagebundle_pt.properties +7 -0
  171. package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
  172. package/src/sap/fe/core/messagebundle_ro.properties +7 -0
  173. package/src/sap/fe/core/messagebundle_ru.properties +7 -0
  174. package/src/sap/fe/core/messagebundle_sh.properties +7 -0
  175. package/src/sap/fe/core/messagebundle_sk.properties +7 -0
  176. package/src/sap/fe/core/messagebundle_sl.properties +7 -0
  177. package/src/sap/fe/core/messagebundle_sr.properties +7 -0
  178. package/src/sap/fe/core/messagebundle_sv.properties +7 -0
  179. package/src/sap/fe/core/messagebundle_th.properties +7 -0
  180. package/src/sap/fe/core/messagebundle_tr.properties +7 -0
  181. package/src/sap/fe/core/messagebundle_uk.properties +7 -0
  182. package/src/sap/fe/core/messagebundle_vi.properties +7 -0
  183. package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
  184. package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
  185. package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
  186. package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
  187. package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
  188. package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
  189. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
  190. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
  191. package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
  192. package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
  193. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
  194. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
  195. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
  196. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
  197. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
  198. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
  199. package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
  200. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
  201. package/src/sap/fe/core/templating/UIFormatters.js +17 -2
  202. package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
  203. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
  204. package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
  205. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
  206. package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
  207. package/ui5.yaml +2 -0
@@ -1200,6 +1200,7 @@ class TransactionHelper {
1200
1200
  * @param mParameters.groupId
1201
1201
  * @param mParameters.defaultValuesExtensionFunction
1202
1202
  * @param mParameters.ignoreETag If specified, the action is called without ETag handling
1203
+ * @param mParameters.disableStrictHandling Disables or enables strict handling for this specific action, overriding app-level setting when app-level setting is undefined
1203
1204
  * @param appComponent The appComponent
1204
1205
  * @param messageHandler The message handler extension
1205
1206
  * @returns Promise resolves with an array of response objects (TODO: to be changed)
@@ -1225,6 +1226,7 @@ class TransactionHelper {
1225
1226
  groupId?: string;
1226
1227
  defaultValuesExtensionFunction?: string;
1227
1228
  ignoreETag?: boolean;
1229
+ disableStrictHandling?: boolean;
1228
1230
  },
1229
1231
  appComponent: AppComponent,
1230
1232
  messageHandler: MessageHandler
@@ -1252,6 +1254,16 @@ class TransactionHelper {
1252
1254
  if (!oModel) {
1253
1255
  throw new Error("Pass a context for a bound action or pass the model for an unbound action");
1254
1256
  }
1257
+ const messageHandlingKey = messageHandler.registerToHoldMessages();
1258
+ // Read disableStrictHandling from manifest
1259
+ const manifestSettings = appComponent.getManifestEntry("sap.fe");
1260
+ const disableStrictHandling = manifestSettings?.app?.disableStrictHandling;
1261
+
1262
+ //Action-level setting takes precedence over app-level setting
1263
+ const finalDisableStrictHandling =
1264
+ mParameters.disableStrictHandling !== undefined
1265
+ ? mParameters.disableStrictHandling // Action-level setting takes precedence (if defined)
1266
+ : disableStrictHandling; // Fall back to app-level setting
1255
1267
  try {
1256
1268
  const control = (mParameters.controlId ? mParameters.view.byId(mParameters.controlId) : mParameters.view) as
1257
1269
  | Control
@@ -1274,6 +1286,7 @@ class TransactionHelper {
1274
1286
  oDataProperties: {
1275
1287
  ghostContextBindingProtection: true,
1276
1288
  enhance$select: true,
1289
+ disableStrictHandling: finalDisableStrictHandling,
1277
1290
  groupId: mParameters.groupId,
1278
1291
  ignoreETag: mParameters.ignoreETag
1279
1292
  },
@@ -1320,21 +1333,17 @@ class TransactionHelper {
1320
1333
  }
1321
1334
  },
1322
1335
  oDataProperties: {
1323
- ignoreETag: mParameters.ignoreETag
1336
+ ignoreETag: mParameters.ignoreETag,
1337
+ disableStrictHandling: finalDisableStrictHandling
1324
1338
  },
1325
1339
  messageHandler: messageHandler,
1326
1340
  view: mParameters.view as FEView
1327
1341
  }).execute();
1328
1342
  }
1329
-
1330
- if (messageHandler) {
1331
- this._handleActionResponse(mParameters, sActionName);
1332
- }
1343
+ await this._handleActionResponse(messageHandler, mParameters, sActionName, messageHandlingKey);
1333
1344
  return oResult;
1334
1345
  } catch (err: unknown) {
1335
- if (messageHandler) {
1336
- this._handleActionResponse(mParameters, sActionName);
1337
- }
1346
+ await this._handleActionResponse(messageHandler, mParameters, sActionName, messageHandlingKey);
1338
1347
  throw err;
1339
1348
  }
1340
1349
  }
@@ -1384,17 +1393,37 @@ class TransactionHelper {
1384
1393
  }
1385
1394
  }
1386
1395
 
1387
- _handleActionResponse(
1388
- mParameters: {
1396
+ async _handleActionResponse(
1397
+ messageHandler: MessageHandler,
1398
+ parameters: {
1399
+ contexts?: ODataV4Context | ODataV4Context[] | null;
1400
+ control?: Control;
1401
+ controlId?: string;
1402
+ view?: View;
1389
1403
  label?: string;
1390
1404
  internalModelContext?: InternalModelContext | null;
1391
1405
  },
1392
- sActionName: string
1393
- ): void {
1406
+ sActionName: string,
1407
+ messageHandlingKey: string
1408
+ ): Promise<unknown> {
1409
+ const actionName = parameters.label ? parameters.label : sActionName;
1410
+
1394
1411
  const aTransientMessages = messageHandling.getMessages(true, true);
1395
- if (aTransientMessages.length > 0 && mParameters && mParameters.internalModelContext) {
1396
- mParameters.internalModelContext.setProperty("sActionName", mParameters.label ? mParameters.label : sActionName);
1412
+ if (aTransientMessages.length > 0 && parameters.internalModelContext) {
1413
+ parameters.internalModelContext.setProperty("sActionName", actionName);
1397
1414
  }
1415
+ let control;
1416
+ if (parameters.controlId && parameters.view) {
1417
+ control = parameters.view.byId(parameters.controlId);
1418
+ } else {
1419
+ control = parameters.view;
1420
+ }
1421
+ return messageHandler.showMessages({
1422
+ sActionName: actionName,
1423
+ control: control as unknown as Control,
1424
+ unHoldKey: messageHandlingKey,
1425
+ aSelectedContexts: parameters.contexts
1426
+ });
1398
1427
  }
1399
1428
 
1400
1429
  /**
@@ -1640,6 +1669,8 @@ class TransactionHelper {
1640
1669
  transientListBinding.destroy();
1641
1670
  createDialog.closeDialog();
1642
1671
  resultPromiseKeeper.reject(error as string | Error);
1672
+ } else {
1673
+ createDialog.displayErrorMessages(Messaging.getMessageModel().getData());
1643
1674
  }
1644
1675
  } finally {
1645
1676
  createDialog.setBusy(false);
@@ -687,13 +687,46 @@ sap.ui.define(["sap/base/Log", "sap/base/util/isEmptyObject", "sap/fe/core/Commo
687
687
  // occur, but needs quite specific modelling (button visibility on item level bound against service property in an FCL app)
688
688
  // and acting (looking at button on third column while discarding on 2nd column). Currently, model seems not to be prepared
689
689
  // for that case, thus due to the minimal impact (only intermediate visual state), accepting this for the time being.
690
- return !oAppComponent._isFclEnabled() && !oContext.getProperty("IsActiveEntity") && ModelHelper.isDraftRoot(getInvolvedDataModelObjects(oContext.getModel().getMetaModel().getMetaContext(oContext.getPath()))?.targetEntitySet) && oContext.getProperty("HasActiveEntity") ? oContext.getModel().delete(oContext) : oContext.delete();
690
+ const isInlineEditGroup = oContext.getUpdateGroupId() === CommonUtils.INLINEEDIT_UPDATEGROUPID;
691
+ const metaModel = oContext.getModel().getMetaModel();
692
+ const targetEntitySet = getInvolvedDataModelObjects(metaModel.getMetaContext(oContext.getPath()))?.targetEntitySet;
693
+ const useModelDelete = !oAppComponent._isFclEnabled() && !oContext.getProperty("IsActiveEntity") && ModelHelper.isDraftRoot(targetEntitySet) && oContext.getProperty("HasActiveEntity");
694
+ if (useModelDelete) {
695
+ return oContext.getModel().delete(oContext);
696
+ }
697
+ if (isInlineEditGroup) {
698
+ return oContext.delete("$auto");
699
+ }
700
+ return oContext.delete();
691
701
  }
692
702
  } else {
693
703
  //Use Discard Post Action if it is a draft entity and discard action exists
694
704
  await executeDraftDiscardAction(oContext, messageHandler, oAppComponent, bEnableStrictHandling);
695
705
  }
696
706
  }
707
+
708
+ /**
709
+ * Terminates the draft session on the server side.
710
+ * @param context The context to be terminated
711
+ */
712
+ function terminateDraftSession(context) {
713
+ const model = context?.getModel();
714
+
715
+ // Only clean up ABAP sessions for draft programming model
716
+ if (model?.getHttpHeaders(true)?.["SAP-ContextId"]) {
717
+ try {
718
+ // Access the private oRequestor property with proper typing, this has been aligned with the model colleagues
719
+ // they might need to offer a dedicated restricted method for sap.fe in the future, but until then we can use
720
+ // it like this.
721
+ model.oRequestor.sendRequest("HEAD", "", {
722
+ "sap-terminate": "session"
723
+ });
724
+ } catch (error) {
725
+ // Log error but don't block the operation
726
+ Log.info("Failed to terminate ABAP session during draft cleanup", error);
727
+ }
728
+ }
729
+ }
697
730
  const draft = {
698
731
  createDraftFromActiveDocument: createDraftFromActiveDocument,
699
732
  activateDocument: activateDocument,
@@ -710,8 +743,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/isEmptyObject", "sap/fe/core/Commo
710
743
  executeDraftDiscardAction: executeDraftDiscardAction,
711
744
  NavigationType: draftDataLossPopup.NavigationType,
712
745
  getActionName: getActionName,
713
- showEditConfirmationMessageBox: showEditConfirmationMessageBox
746
+ showEditConfirmationMessageBox: showEditConfirmationMessageBox,
747
+ terminateDraftSession: terminateDraftSession
714
748
  };
715
749
  return draft;
716
750
  }, false);
717
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0Q29udmVydGVkQWN0aW9uIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsIm9wZXJhdGlvbk5hbWUiLCJtZXRhTW9kZWwiLCJhY3Rpb25QYXRoIiwiYm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnZlcnRUeXBlcyIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwiY29udmVydGVkQWN0aW9uIiwiT3BlcmF0aW9uIiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJjb250ZXh0cyIsImxhYmVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJiaW5kaW5nUGFyYW1ldGVycyIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIiQkdXBkYXRlR3JvdXBJZCIsInNraXBNZXNzYWdlcyIsIm9EYXRhUHJvcGVydGllcyIsImRpc2FibGVTaWRlRWZmZWN0cyIsImlnbm9yZUVUYWciLCJpc0VtcHR5T2JqZWN0IiwicmVwbGFjZVdpdGhSVkMiLCJnZXRCaW5kaW5nIiwiaXNBIiwiZGVmZXJyZWRTdWJtaXQiLCJzZXREZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsIlByZXNlcnZlQ2hhbmdlcyIsInJlc3VsdCIsImV4ZWN1dGUiLCJzdGF0dXMiLCJtb2RpZmllZEVycm9yIiwiRXJyb3IiLCJyZWFzb24iLCJtZXNzYWdlIiwidmFsdWUiLCJyZXR1cm5lZENvbnRleHQiLCJleGVjdXRlRHJhZnRWYWxpZGF0aW9uIiwiYXBwQ29tcG9uZW50IiwiTW9kZWxIZWxwZXIiLCJnZXRNZXNzYWdlc1BhdGgiLCJkcmFmdCIsImlzS2VlcEFsaXZlIiwicmVxdWVzdE9iamVjdCIsImV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInJlcXVlc3RNZXNzYWdlcyIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImVycm9yIiwiTG9nIiwidW5kZWZpbmVkIiwiZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbiIsIm9BcHBDb21wb25lbnQiLCJzR3JvdXBJZCIsIm9QcmVwYXJlUHJvbWlzZSIsInJlc291cmNlTW9kZWwiLCJpc1N0YW5kYXJkU2F2ZSIsImJIYXNQcmVwYXJlQWN0aW9uIiwiYklnbm9yZUV0YWciLCJnZXRQcm9wZXJ0eSIsImUiLCJwcmVwYXJlT3BlcmF0aW9uIiwiZGVzdHJveSIsImNsZWFyIiwiYWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJvQmluZGluZ1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwiYVRhcmdldFBhdGhzIiwicGF0aEV4cHJlc3Npb25zIiwibGVuZ3RoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwib0Vycm9yIiwiZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlIiwiZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0IiwibWV0YUNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsImNvbnZlcnRlZENvbnRleHQiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJtZXNzYWdlcyIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIk1lc3NhZ2VzIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJwYXRoIiwiYk1lc3NhZ2VzIiwic01lc3NhZ2VzUGF0aCIsIm9PcGVyYXRpb24iLCIkc2VsZWN0Iiwic2V0UGFyYW1ldGVyIiwiZ2V0R3JvdXBJZCIsImludm9rZSIsInRoZW4iLCJjYXRjaCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImFyZ3VtZW50cyIsImRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwiYkVuYWJsZVN0cmljdEhhbmRsaW5nIiwiZGlzYWJsZVN0cmljdEhhbmRsaW5nIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0Iiwicm9vdENvbnRleHRJbmZvIiwiY3JlYXRlS2VlcEFsaXZlQ29udGV4dCIsInN0YXJ0c1dpdGgiLCJtb2RlbCIsImFkZGl0aW9uYWxQYXRoIiwicmVwbGFjZSIsInNlZ21lbnRzIiwic3Vic3RyaW5nIiwic3BsaXQiLCJ1bnNoaWZ0Iiwib2xkUGF0aHMiLCJuZXdQYXRocyIsImN1cnJlbnRQYXRoIiwicGF0aHMiLCJyb290U2libGluZ1BhdGhQcm9taXNlIiwic2hpZnQiLCJjYW5vbmljYWxQYXRoUHJvbWlzZXMiLCJtYXAiLCJzZWdtZW50IiwiZW5kc1dpdGgiLCJzaWJsaW5nQ29udGV4dCIsIiQkZ3JvdXBJZCIsImdldEJvdW5kQ29udGV4dCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjYW5vbmljYWxQYXRocyIsImFsbCIsInNvbWUiLCJyb290U2libGluZ1BhdGgiLCJwdXNoIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXJhbWV0ZXJzIiwibWVzc2FnZVBhdGgiLCJ0YXJnZXRDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm1QYXJhbWV0ZXJzIiwidHJhbnNhY3Rpb25EZXRhaWxzIiwibVBhcmFtIiwiYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3ciLCJyZXNwb25zZSIsImRyYWZ0RGF0YUNvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsInNJbmZvIiwiSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24iLCJJblByb2Nlc3NCeVVzZXIiLCJzRW50aXR5U2V0IiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJzTG9ja2VkQnlVc2VyTXNnIiwiTWVzc2FnZUJveCIsIkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiIsIkNyZWF0ZWRCeVVzZXIiLCJzVW5zYXZlZENoYW5nZXNNc2ciLCJzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3giLCJvRHJhZnRDb250ZXh0Iiwib1Jlc3BvbnNlIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJzaWJsaW5nSW5mbyIsIl9pc0ZjbEVuYWJsZWQiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImV4aXN0aW5nRHJhZnRSZXVzZWQiLCJjYW5jZWxlZCIsInNFZGl0QWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsInRyaWdnZXJBY3Rpb25zIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJhY3RpdmF0ZURvY3VtZW50IiwiYkV4ZWN1dGUiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0Iiwic0JhdGNoR3JvdXAiLCJpZ25vcmVFdGFnIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJzdWJtaXRCYXRjaCIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsImxvY2FsSTE4blJlZiIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsInJlamVjdCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJ0ZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImRlbGV0ZURyYWZ0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaXNJbmFjdGl2ZSIsInJlc2V0Q2hhbmdlcyIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5U2V0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJkcmFmdERhdGFMb3NzUG9wdXAiLCJzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uVHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiZHJhZnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb24gYXMgRWRtQWN0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBpc0VtcHR5T2JqZWN0IGZyb20gXCJzYXAvYmFzZS91dGlsL2lzRW1wdHlPYmplY3RcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgZHJhZnREYXRhTG9zc1BvcHVwIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdERhdGFMb3NzUG9wdXBcIjtcbmltcG9ydCBtZXNzYWdlSGFuZGxpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL21lc3NhZ2VIYW5kbGVyL21lc3NhZ2VIYW5kbGluZ1wiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0RXJyb3JUeXBlIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwiLi4vLi4vQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwiLi4vLi4vaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4uL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgT3BlcmF0aW9uIGZyb20gXCIuL29wZXJhdGlvbnMvT3BlcmF0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIFNpYmxpbmdJbmZvcm1hdGlvbiA9IHtcblx0dGFyZ2V0Q29udGV4dDogQ29udGV4dDtcblx0cGF0aE1hcHBpbmc6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdO1xufTtcblxuZXhwb3J0IHR5cGUgUm9vdENvbnRleHRJbmZvID0ge1xuXHRyb290U2libGluZ1BhdGhQcm9taXNlOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQmluZENvbnRleHRQYXJhbWV0ZXJzID0ge1xuXHQvKipcblx0ICogVGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMiBTeXN0ZW0gUXVlcnkgT3B0aW9uICRleHBhbmRcIiBvciBhbiBvYmplY3Qgd2hpY2ggZGV0ZXJtaW5lcyB0aGF0IHZhbHVlLiBUaGUgb2JqZWN0XG5cdCAqIGlzIGEgbWFwIGZyb20gZXhwYW5kIHBhdGggdG8gZXhwYW5kIG9wdGlvbnMsIHdoZXJlIHRoZSBvcHRpb25zIGFyZSBhZ2FpbiBtYXBzIG9mIHN5c3RlbSBxdWVyeSBvcHRpb25zLFxuXHQgKiB0eXBpY2FsbHkgd2l0aCBzdHJpbmcgdmFsdWVzLiAkY291bnQgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgYSBgYm9vbGVhbmAgdmFsdWUsICRleHBhbmQgY2FuIHJlY3Vyc2l2ZWx5XG5cdCAqIGJlIGdpdmVuIGFzIGEgbWFwLCAkbGV2ZWxzIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYG51bWJlcmAgdmFsdWUsIGFuZCAkc2VsZWN0IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGFuXG5cdCAqIGFycmF5IChidXQgd2l0aG91dCBuYXZpZ2F0aW9uIHBhdGhzKS4gQW4gZW1wdHkgbWFwIGNhbiBhbHNvIGJlIGdpdmVuIGFzIGBudWxsYCBvciBgdHJ1ZWAuIFNlZSBhbHNvIHtAbGluayBodHRwczovL3VpNS5zYXAuY29tLyMvdG9waWMvMWFiNGY2MmRlNmFiNDY3MDk2YTJhOThiMzYzYTEzNzMgUGFyYW1ldGVyc30uXG5cdCAqL1xuXHQkZXhwYW5kPzogc3RyaW5nIHwgb2JqZWN0O1xuXHQvKipcblx0ICogQSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvciBhbiBhcnJheSBvZiBpdGVtcyB3aGljaCBkZXRlcm1pbmUgdGhlIHZhbHVlIGZvciB0aGUgXCI1LjEuMyBTeXN0ZW0gUXVlcnkgT3B0aW9uXG5cdCAqICRzZWxlY3RcIi4gU2luY2UgMS43NS4wLCB3aGVuIHVzaW5nIHRoZSBcImF1dG9FeHBhbmRTZWxlY3RcIiBtb2RlbCBwYXJhbWV0ZXIgKHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9KSxcblx0ICogcGF0aHMgd2l0aCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgY2FuIGJlIGluY2x1ZGVkIGFuZCB3aWxsIGNvbnRyaWJ1dGUgdG8gdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkZXhwYW5kXCIuXG5cdCAqL1xuXHQkc2VsZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogV2hldGhlciBhIGJpbmRpbmcgcmVsYXRpdmUgdG8gYW4ge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSB1c2VzIHRoZSBjYW5vbmljYWwgcGF0aCBjb21wdXRlZFxuXHQgKiBmcm9tIGl0cyBjb250ZXh0J3MgcGF0aCBmb3IgZGF0YSBzZXJ2aWNlIHJlcXVlc3RzOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkY2Fub25pY2FsUGF0aD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKipyZWFkKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgZ3JvdXAgSUQgaXMgdXNlZCwgc2VlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbCNjb25zdHJ1Y3Rvcn0uXG5cdCAqIFZhbGlkIHZhbHVlcyBhcmUgYHVuZGVmaW5lZGAsICckYXV0bycsICckYXV0by4qJywgJyRkaXJlY3QnIG9yIGFwcGxpY2F0aW9uIGdyb3VwIElEcyBhcyBzcGVjaWZpZWQgaW5cblx0ICoge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsfS5cblx0ICovXG5cdCQkZ3JvdXBJZD86IHN0cmluZztcblx0LyoqXG5cdCAqIEZvciBvcGVyYXRpb24gYmluZGluZ3Mgb25seTogV2hldGhlciAkZXhwYW5kIGFuZCAkc2VsZWN0IGZyb20gdGhlIHBhcmVudCBiaW5kaW5nIGFyZSB1c2VkIGluIHRoZSByZXF1ZXN0XG5cdCAqIHNlbnQgb24ge0BsaW5rICNleGVjdXRlfS4gSWYgc2V0IHRvIGB0cnVlYCwgdGhlIGJpbmRpbmcgbXVzdCBub3Qgc2V0IHRoZSAkZXhwYW5kIGl0c2VsZiwgdGhlIG9wZXJhdGlvblxuXHQgKiBtdXN0IGJlIGJvdW5kLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBhbmQgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIGVudGl0eSBzZXQuXG5cdCAqL1xuXHQkJGluaGVyaXRFeHBhbmRTZWxlY3Q/OiBib29sZWFuO1xuXHQvKipcblx0ICogV2hldGhlciB0aGUgYmluZGluZyBhbHdheXMgdXNlcyBhbiBvd24gc2VydmljZSByZXF1ZXN0IHRvIHJlYWQgaXRzIGRhdGE7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0JCRvd25SZXF1ZXN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgaW1wbGljaXQgbG9hZGluZyBvZiBzaWRlIGVmZmVjdHMgdmlhIFBBVENIIHJlcXVlc3RzIGlzIHN3aXRjaGVkIG9mZjsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzXG5cdCAqIGFsbG93ZWQuIFRoaXMgc2V0cyB0aGUgcHJlZmVyZW5jZSBcInJldHVybj1taW5pbWFsXCIgYW5kIHJlcXVpcmVzIHRoZSBzZXJ2aWNlIHRvIHJldHVybiBhbiBFVGFnIGhlYWRlclxuXHQgKiBmb3IgXCIyMDQgTm8gQ29udGVudFwiIHJlc3BvbnNlcy4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgYmluZGluZyBpcyB1c2VkLlxuXHQgKi9cblx0JCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgKip1cGRhdGUqKiByZXF1ZXN0cyB0cmlnZ2VyZWQgYnkgdGhpcyBiaW5kaW5nOyBpZiBub3Qgc3BlY2lmaWVkLCBlaXRoZXIgdGhlXG5cdCAqIHBhcmVudCBiaW5kaW5nJ3MgdXBkYXRlIGdyb3VwIElEIChpZiB0aGUgYmluZGluZyBpcyByZWxhdGl2ZSkgb3IgdGhlIG1vZGVsJ3MgdXBkYXRlIGdyb3VwIElEIGlzIHVzZWQsXG5cdCAqIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LiBGb3IgdmFsaWQgdmFsdWVzLCBzZWUgcGFyYW1ldGVyIFwiJCRncm91cElkXCIuXG5cdCAqL1xuXHQkJHVwZGF0ZUdyb3VwSWQ/OiBzdHJpbmc7XG59O1xuXG4vKiBDb25zdGFudHMgZm9yIGRyYWZ0IG9wZXJhdGlvbnMgKi9cbmNvbnN0IGRyYWZ0T3BlcmF0aW9ucyA9IHtcblx0RURJVDogXCJFZGl0QWN0aW9uXCIsXG5cdEFDVElWQVRJT046IFwiQWN0aXZhdGlvbkFjdGlvblwiLFxuXHRESVNDQVJEOiBcIkRpc2NhcmRBY3Rpb25cIixcblx0UFJFUEFSRTogXCJQcmVwYXJhdGlvbkFjdGlvblwiXG59O1xuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIHRoZSBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuICogQG5hbWVzcGFjZVxuICogQHNpbmNlIDEuNTQuMFxuICovXG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgYWN0aW9uIG5hbWUgZm9yIGEgZHJhZnQgb3BlcmF0aW9uLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRBY3Rpb25OYW1lKG9Db250ZXh0OiBDb250ZXh0LCBzT3BlcmF0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn1gKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBvcGVyYXRpb24gY29udGV4dCBiaW5kaW5nIGZvciB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgb3BlcmF0aW9uLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gKGFjdGlvbiBvciBmdW5jdGlvbiBpbXBvcnQpXG4gKiBAcGFyYW0gb09wdGlvbnMgT3B0aW9ucyB0byBjcmVhdGUgdGhlIG9wZXJhdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgY29udGV4dCBiaW5kaW5nIG9mIHRoZSBib3VuZCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0OiBDb250ZXh0LCBzT3BlcmF0aW9uOiBzdHJpbmcsIG9PcHRpb25zPzogQmluZENvbnRleHRQYXJhbWV0ZXJzKTogT0RhdGFDb250ZXh0QmluZGluZyB7XG5cdGNvbnN0IHNPcGVyYXRpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgc09wZXJhdGlvbik7XG5cblx0cmV0dXJuIG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoYCR7c09wZXJhdGlvbk5hbWV9KC4uLilgLCBvQ29udGV4dCwgb09wdGlvbnMpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbnZlcnRlZCBhY3Rpb24gZm9yIGEgZ2l2ZW4gY29udGV4dCBhbmQgb3BlcmF0aW9uLlxuICogQHBhcmFtIGNvbnRleHQgIFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBvcGVyYXRpb24gVGhlIG9wZXJhdGlvbiBuYW1lXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGFjdGlvblxuICovXG5mdW5jdGlvbiBnZXRDb252ZXJ0ZWRBY3Rpb24oY29udGV4dDogQ29udGV4dCwgb3BlcmF0aW9uOiBzdHJpbmcpOiBFZG1BY3Rpb24gfCB1bmRlZmluZWQge1xuXHRjb25zdCBvcGVyYXRpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShjb250ZXh0LCBvcGVyYXRpb24pO1xuXHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0YWN0aW9uUGF0aCA9IGAke21ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSl9LyR7b3BlcmF0aW9uTmFtZX1gLFxuXHRcdGJvdW5kQWN0aW9uID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGFjdGlvblBhdGgpITtcblx0cmV0dXJuIGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpLnJlc29sdmVQYXRoPEVkbUFjdGlvbiB8IHVuZGVmaW5lZD4oYm91bmRBY3Rpb24uZ2V0UGF0aCgpKS50YXJnZXQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgcmV0dXJuIHR5cGUgZm9yIGEgZHJhZnQgb3BlcmF0aW9uLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIHJldHVybiB0eXBlIG9mIHRoZSBkcmFmdCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0UmV0dXJuVHlwZShvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKTogdW5rbm93biB7XG5cdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRzRW50aXR5U2V0UGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblxuXHRyZXR1cm4gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c0VudGl0eVNldFBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3QvJHtzT3BlcmF0aW9ufS8kUmV0dXJuVHlwZWApO1xufVxuLyoqXG4gKiBDaGVjayBpZiBvcHRpb25hbCBkcmFmdCBwcmVwYXJlIGFjdGlvbiBleGlzdHMuXG4gKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMgVHJ1ZSBpZiBhIGEgcHJlcGFyZSBhY3Rpb24gZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0cmV0dXJuICEhZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGRyYWZ0IGZyb20gYW4gYWN0aXZlIGRvY3VtZW50LlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGJQcmVzZXJ2ZUNoYW5nZXMgSWYgdHJ1ZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgcHJlc2VydmVkIGFuZCBhbiBlcnJvciBpcyBzZW50IGZyb20gdGhlIGJhY2tlbmQsIG90aGVyd2lzZSBmYWxzZSAtIGV4aXN0aW5nIGNoYW5nZXMgZnJvbSBhbm90aGVyIHVzZXIgdGhhdCBhcmUgbm90IGxvY2tlZCBhcmUgb3ZlcndyaXR0ZW48L2xpPlxuICogQHBhcmFtIG9WaWV3IElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlclxuICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyICBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb3ZlcndyaXRlQ2hhbmdlXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0YlByZXNlcnZlQ2hhbmdlczogYm9vbGVhbixcblx0b1ZpZXc6IFZpZXcsXG5cdGdyb3VwSWQ6IHN0cmluZyxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvdmVyd3JpdGVDaGFuZ2U/OiBib29sZWFuXG4pOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0Ly8gSWYgdGhlIGNvbnRleHQgaXMgbm90IGxvYWRlZCAoaS5lLiBvQ29udGV4dC5nZXRPYmplY3QoKSA9PSB1bmRlZmluZWQpLCB3ZSBhc3N1bWUgaXQgY29ycmVzcG9uZHMgdG8gYW4gYWN0aXZlIGNvbnRleHRcblx0Ly8gVGhpcyBzaXR1YXRpb24gaGFwcGVucyB3aGVuIG9wZW5pbmcgYW4gT1AgZGlyZWN0bHkgaW4gZWRpdCBtb2RlIChJbnRlcm5hbFJvdXRpbmcuX2JpbmRQYWdlRm9yRWRpdClcblx0Y29uc3QgY29udmVydGVkQWN0aW9uID0gZ2V0Q29udmVydGVkQWN0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCk7XG5cdGlmIChjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHRjb25zdCBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyksIG9Db250ZXh0LmdldE1vZGVsKCksIGNvbnZlcnRlZEFjdGlvbiwge1xuXHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0Y29udGV4dHM6IFtvQ29udGV4dF0sXG5cdFx0XHRsYWJlbDogZ2V0UmVzb3VyY2VNb2RlbChvVmlldykuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIiksXG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUsICQkdXBkYXRlR3JvdXBJZDogXCIkYXV0b1wiIH0sXG5cdFx0XHRza2lwTWVzc2FnZXM6IHRydWUsXG5cdFx0XHRvRGF0YVByb3BlcnRpZXM6IHtcblx0XHRcdFx0ZGlzYWJsZVNpZGVFZmZlY3RzOiB0cnVlLFxuXHRcdFx0XHRpZ25vcmVFVGFnOiBpc0VtcHR5T2JqZWN0KG9Db250ZXh0LmdldE9iamVjdCgpKSwgLy8gSWYgdGhlIGNvbnRleHQgaGFzIG5vdCBiZWVuIGxvYWRlZCB5ZXQsIHdlIGNhbiBpZ25vcmUgdGhlIEVUYWcgKGFzIG5vIHByZXZpb3VzIEVUYWcgaXMgYXZhaWxhYmxlKVxuXHRcdFx0XHRncm91cElkOiBncm91cElkLFxuXHRcdFx0XHRyZXBsYWNlV2l0aFJWQzogb0NvbnRleHQuZ2V0QmluZGluZygpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpLFxuXHRcdFx0XHRkZWZlcnJlZFN1Ym1pdDogb3ZlcndyaXRlQ2hhbmdlICE9PSB0cnVlIC8vXHRJZiB0aGUgY29udGV4dCBpcyBjb21pbmcgZnJvbSBhIGxpc3QgYmluZGluZyB3ZSBwYXNzIHRoZSBmbGFnIHRydWUgdG8gcmVwbGFjZSB0aGUgY29udGV4dCBieSB0aGUgYWN0aXZlIG9uZVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9wZXJhdGlvbi5zZXREZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyh7IFByZXNlcnZlQ2hhbmdlczogYlByZXNlcnZlQ2hhbmdlcyB9KTtcblx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBvcGVyYXRpb24uZXhlY3V0ZSgpO1xuXHRcdGlmIChyZXN1bHRbMF0uc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdGNvbnN0IG1vZGlmaWVkRXJyb3IgPSBuZXcgRXJyb3IocmVzdWx0WzBdLnJlYXNvbi5tZXNzYWdlKSBhcyBFcnJvciAmIHsgc3RhdHVzPzogbnVtYmVyIH07XG5cdFx0XHQvLyB3ZSBuZWVkIHRvIHBlcnNpc3QgdGhlIHN0YXR1cyBpbiB0aGUgZXJyb3IgdG8gYmUgYWJsZSB0byBzaG93IHRoZSBsb2NrZWQgYnkgYW5vdGhlciB1c2VyIGRpYWxvZ1xuXHRcdFx0bW9kaWZpZWRFcnJvci5zdGF0dXMgPSByZXN1bHRbMF0ucmVhc29uLnN0YXR1cztcblx0XHRcdHRocm93IG1vZGlmaWVkRXJyb3I7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiByZXN1bHRbMF0udmFsdWUucmV0dXJuZWRDb250ZXh0O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZWRpdCBhY3Rpb24gbm90IGZvdW5kXCIpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGRyYWZ0LiBUaGUgUHJlcGFyZUFjdGlvbiBpcyB0cmlnZ2VyZWQgaWYgdGhlIG1lc3NhZ2VzIGFyZSBhbm5vdGF0ZWQgYW5kIGVudGl0eVNldCBnZXRzIGEgUHJlcGFyYXRpb25BY3Rpb24gYW5ub3RhdGVkLlxuICogSWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkcyBhbmQgb3BlcmF0aW9uIGRvZXNuJ3QgZ2V0IGEgcmV0dXJuIHR5cGUgKFJBUCBzeXN0ZW0pIHRoZSBtZXNzYWdlcyBhcmUgcmVxdWVzdGVkLlxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIFByZXBhcmVBY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gaWdub3JlRVRhZyBJZiBzZXQgdG8gdHJ1ZSwgRVRhZ3MgYXJlIGlnbm9yZWQgd2hlbiBleGVjdXRpbmcgdGhlIGFjdGlvblxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zXG4gKiAgLSB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uIGlmIHRoZSBhY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkXG4gKiAgLSB2b2lkIGlmIHRoZSBhY3Rpb24gaGFzIGZhaWxlZFxuICogIC0gdW5kZWZpbmVkIGlmIHRoZSBhY3Rpb24gaGFzIG5vdCBiZWVuIHRyaWdnZXJlZCBzaW5jZSB0aGUgcHJlcmVxdWlzaXRlcyBhcmUgbm90IG1ldFxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRWYWxpZGF0aW9uKFxuXHRjb250ZXh0OiBDb250ZXh0LFxuXHRhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0aWdub3JlRVRhZzogYm9vbGVhblxuKTogUHJvbWlzZTxPRGF0YUNvbnRleHRCaW5kaW5nIHwgdm9pZCB8IHVuZGVmaW5lZD4ge1xuXHRpZiAoTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgY29udGV4dC5nZXRQYXRoKCkpICYmIGRyYWZ0Lmhhc1ByZXBhcmVBY3Rpb24oY29udGV4dCkpIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKCFpZ25vcmVFVGFnICYmICFjb250ZXh0LmlzS2VlcEFsaXZlKCkpIHtcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgZW50aXR5IHJlbGF0ZWQgdG8gdGhlIGNvbnRleHQgdG8gcG9zdCB0aGUgYWN0aW9uIHdpdGggdGhlIElmLU1hdGNoIGhlYWRlclxuXHRcdFx0XHQvLyBTb21lIHRyaWdnZXJzIChlbnRlciBvbiB0YWJsZSkgY2FuIGdlbmVyYXRlIGEgcHJvbWlzZSBpbiB0aGUgY2FjaGUgc28gaWYgd2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIGVudGl0eVxuXHRcdFx0XHQvLyB0aGUgUE9TVCB3aWxsIGJlIHNlbnQgd2l0aG91dCBJZi1NYXRjaCBhbmQgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvciBvbiBiYWNrZW5kIHNpZGUuXG5cdFx0XHRcdGF3YWl0IChjb250ZXh0LmdldEJpbmRpbmcoKSBhcyBPRGF0YUNvbnRleHRCaW5kaW5nKS5yZXF1ZXN0T2JqZWN0KFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb3BlcmF0aW9uID0gZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24oY29udGV4dCwgY29udGV4dC5nZXRVcGRhdGVHcm91cElkKCksIHRydWUsIGlnbm9yZUVUYWcpO1xuXHRcdFx0aWYgKCFnZXRSZXR1cm5UeXBlKGNvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSkge1xuXHRcdFx0XHRyZXF1ZXN0TWVzc2FnZXMoY29udGV4dCwgYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGF3YWl0IG9wZXJhdGlvbjtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZXNzYWdlc1wiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQWN0aXZhdGVzIGEgZHJhZnQgZG9jdW1lbnQuIFRoZSBkcmFmdCB3aWxsIHJlcGxhY2UgdGhlIHNpYmxpbmcgZW50aXR5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhlIGJhY2sgZW5kLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG4gKiBAcGFyYW0gW3NHcm91cElkXSBUaGUgb3B0aW9uYWwgYmF0Y2ggZ3JvdXAgaW4gd2hpY2ggdGhlIG9wZXJhdGlvbiBpcyB0byBiZSBleGVjdXRlZFxuICogQHBhcmFtIFtvUHJlcGFyZVByb21pc2VdIFRoZSBwcm9taXNlIG9mIHRoZSBwcmVwYXJlIGFjdGlvblxuICogQHBhcmFtIFtyZXNvdXJjZU1vZGVsXSBUaGUgcmVzb3VyY2UgbW9kZWwgdG8gbG9hZCB0ZXh0IHJlc291cmNlc1xuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRzR3JvdXBJZD86IHN0cmluZyxcblx0b1ByZXBhcmVQcm9taXNlPzogUHJvbWlzZTx2b2lkIHwgT0RhdGFDb250ZXh0QmluZGluZz4sXG5cdHJlc291cmNlTW9kZWw/OiBSZXNvdXJjZU1vZGVsLFxuXHRpc1N0YW5kYXJkU2F2ZT86IGJvb2xlYW4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8Q29udGV4dD4ge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGRyYWZ0Lmhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXHQvLyBBY2NvcmRpbmcgdG8gdGhlIGRyYWZ0IHNwZWMgaWYgdGhlIHNlcnZpY2UgY29udGFpbnMgYSBwcmVwYXJlIGFjdGlvbiBhbmQgd2UgdHJpZ2dlciBib3RoIHByZXBhcmUgYW5kXG5cdC8vIGFjdGl2YXRlIGluIG9uZSAkYmF0Y2ggdGhlIGFjdGl2YXRlIGFjdGlvbiBpcyBjYWxsZWQgd2l0aCBpRi1NYXRjaD0qXG5cdGNvbnN0IGJJZ25vcmVFdGFnID0gYkhhc1ByZXBhcmVBY3Rpb247XG5cdGxldCBvcGVyYXRpb246IE9wZXJhdGlvbiB8IHVuZGVmaW5lZDtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3QgY29udmVydGVkQWN0aW9uID0gZ2V0Q29udmVydGVkQWN0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTik7XG5cdFx0Y29uc3QgbGFiZWwgPSBpc1N0YW5kYXJkU2F2ZSA/IHJlc291cmNlTW9kZWw/LmdldFRleHQoXCJUX09QX09CSkVDVF9QQUdFX1NBVkVcIikgOiByZXNvdXJjZU1vZGVsPy5nZXRUZXh0KFwiQ19PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpO1xuXHRcdGlmIChjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24ob0FwcENvbXBvbmVudCwgb0NvbnRleHQuZ2V0TW9kZWwoKSwgY29udmVydGVkQWN0aW9uLCB7XG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXI6IG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0XHRcdGNvbnRleHRzOiBbb0NvbnRleHRdLFxuXHRcdFx0XHRcdGxhYmVsOiBsYWJlbCxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSxcblx0XHRcdFx0XHRza2lwTWVzc2FnZXM6IHRydWUsXG5cdFx0XHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0XHRkaXNhYmxlU2lkZUVmZmVjdHM6IHRydWUsXG5cdFx0XHRcdFx0XHRncm91cElkOiBzR3JvdXBJZCxcblx0XHRcdFx0XHRcdGlnbm9yZUVUYWc6IGJJZ25vcmVFdGFnLFxuXHRcdFx0XHRcdFx0cmVwbGFjZVdpdGhSVkM6IG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbi5leGVjdXRlKCk7XG5cdFx0XHRcdGlmIChyZXN1bHRbMF0uc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IocmVzdWx0WzBdLnJlYXNvbik7XG5cdFx0XHRcdH0gZWxzZSBpZiAocmVzdWx0WzBdLnZhbHVlLnJldHVybmVkQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZXN1bHRbMF0udmFsdWUucmV0dXJuZWRDb250ZXh0O1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRpZiAoYkhhc1ByZXBhcmVBY3Rpb24pIHtcblx0XHRcdFx0XHQvLyBkZXN0cm95IHRoZSBvcGVyYXRpb24gYmluZGluZ3MgdG8gYXZvaWQgYWRkaXRpb25hbCBtZXNzYWdlIHJlcXVlc3RzIHNlbnQgYnkgdGhlIG1vZGVsXG5cdFx0XHRcdFx0Y29uc3QgcHJlcGFyZU9wZXJhdGlvbiA9IGF3YWl0IG9QcmVwYXJlUHJvbWlzZTtcblx0XHRcdFx0XHRwcmVwYXJlT3BlcmF0aW9uPy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0b3BlcmF0aW9uPy5jbGVhcigpO1xuXG5cdFx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSxcblx0XHRcdFx0XHRcdG9TaWRlRWZmZWN0c1NlcnZpY2UgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLFxuXHRcdFx0XHRcdFx0b0JpbmRpbmdQYXJhbWV0ZXJzID0gb1NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKGFjdGlvbk5hbWUsIG9Db250ZXh0KSxcblx0XHRcdFx0XHRcdGFUYXJnZXRQYXRocyA9IG9CaW5kaW5nUGFyYW1ldGVycyAmJiBvQmluZGluZ1BhcmFtZXRlcnMucGF0aEV4cHJlc3Npb25zO1xuXHRcdFx0XHRcdGlmIChhVGFyZ2V0UGF0aHMgJiYgYVRhcmdldFBhdGhzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRQYXRocywgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCByZXF1ZXN0TWVzc2FnZXMob0NvbnRleHQsIG9TaWRlRWZmZWN0c1NlcnZpY2UsIHRydWUpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRocm93IGU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBub3QgZm91bmRcIik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc3VwcG9ydGVkIG1lc3NhZ2UgcHJvcGVydHkgcGF0aCBvbiB0aGUgUHJlcGFyZUFjdGlvbiBmb3IgYSBjb250ZXh0LlxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBQYXRoIHRvIHRoZSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VQYXRoRm9yUHJlcGFyZShjb250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Ly8gSWYgdGhlcmUgaXMgbm8gcmV0dXJuIHBhcmFtZXRlciwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcXVlc3QgTWVzc2FnZXMuXG5cdC8vIFJBUCBkcmFmdCBwcmVwYXJlIGhhcyBubyByZXR1cm4gcGFyYW1ldGVyXG5cdHJldHVybiBnZXRSZXR1cm5UeXBlKGNvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKSA/IGdldE1lc3NhZ2VQYXRoRm9yQ29udGV4dChjb250ZXh0KSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzdXBwb3J0ZWQgbWVzc2FnZSBwcm9wZXJ0eSBwYXRoIGZvciBhIGNvbnRleHQuXG4gKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBtZXRhQ29udGV4dCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdGNvbnN0IGNvbnZlcnRlZENvbnRleHQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXHRjb25zdCBtZXNzYWdlcyA9IGNvbnZlcnRlZENvbnRleHQudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5Db21tb24/Lk1lc3NhZ2VzO1xuXHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24obWVzc2FnZXMpID8gbWVzc2FnZXMucGF0aCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFeGVjdXRlIGEgcHJlcGFyYXRpb24gYWN0aW9uLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGdyb3VwSWQgVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gYk1lc3NhZ2VzIElmIHNldCB0byB0cnVlLCB0aGUgUFJFUEFSRSBhY3Rpb24gcmV0cmlldmVzIFNBUF9NZXNzYWdlc1xuICogQHBhcmFtIGlnbm9yZUVUYWcgSWYgc2V0IHRvIHRydWUsIEVUYWcgaW5mb3JtYXRpb24gaXMgaWdub3JlZCB3aGVuIHRoZSBhY3Rpb24gaXMgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0Z3JvdXBJZD86IHN0cmluZyxcblx0Yk1lc3NhZ2VzPzogYm9vbGVhbixcblx0aWdub3JlRVRhZz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZCB8IE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IGJNZXNzYWdlcyA/IGdldE1lc3NhZ2VQYXRoRm9yUHJlcGFyZShvQ29udGV4dCkgOiB1bmRlZmluZWQ7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUsIHNNZXNzYWdlc1BhdGggPyB7ICRzZWxlY3Q6IHNNZXNzYWdlc1BhdGggfSA6IHVuZGVmaW5lZCk7XG5cblx0XHQvLyBUT0RPOiBzaWRlIGVmZmVjdHMgcXVhbGlmaWVyIHNoYWxsIGJlIGV2ZW4gZGVwcmVjYXRlZCB0byBiZSBjaGVja2VkXG5cdFx0b09wZXJhdGlvbi5zZXRQYXJhbWV0ZXIoXCJTaWRlRWZmZWN0c1F1YWxpZmllclwiLCBcIlwiKTtcblxuXHRcdGNvbnN0IHNHcm91cElkID0gZ3JvdXBJZCB8fCBvT3BlcmF0aW9uLmdldEdyb3VwSWQoKTtcblx0XHRyZXR1cm4gb09wZXJhdGlvblxuXHRcdFx0Lmludm9rZShzR3JvdXBJZCwgaWdub3JlRVRhZylcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25cIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiBvT3BlcmF0aW9uO1xuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHByZXBhcmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogUmVxdWVzdHMgdGhlIG1lc3NhZ2VzIGlmIGFubm90YXRlZCBmb3IgYSBnaXZlbiBjb250ZXh0LlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBtZXNzYWdlcyBzaGFsbCBiZSByZXF1ZXN0ZWRcbiAqIEBwYXJhbSBvU2lkZUVmZmVjdHNTZXJ2aWNlIFNlcnZpY2UgZm9yIHRoZSBTaWRlRWZmZWN0cyBvbiBTQVAgRmlvcmkgZWxlbWVudHNcbiAqIEBwYXJhbSByZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMgSWYgc2V0IHRvIHRydWUsIHRyYW5zaXRpb24gbWVzc2FnZXMgYXJlIHJlbW92ZWQgaWYgc3RhdGUgbWVzc2FnZXMgZXhpc3RcbiAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSBtZXNzYWdlcyB3ZXJlIHJlcXVlc3RlZFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TWVzc2FnZXMoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvU2lkZUVmZmVjdHNTZXJ2aWNlOiBTaWRlRWZmZWN0c1NlcnZpY2UsXG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyA9IGZhbHNlXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBvQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRpZiAoc01lc3NhZ2VzUGF0aCkge1xuXHRcdGF3YWl0IG9TaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtzTWVzc2FnZXNQYXRoXSwgb0NvbnRleHQpO1xuXHRcdGlmIChyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMpIHtcblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KCk7XG5cdFx0XHRpZiAoZGF0YVtzTWVzc2FnZXNQYXRoXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdC8vaWYgc3RhdGUgbWVzc2FnZXMgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBQUkVQQVJBVElPTiBhY3Rpb24sIHRoZW4gcHJldmlvdXMgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcmUgcmVtb3ZlZFxuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuO1xufVxuLyoqXG4gKiBFeGVjdXRlcyBkaXNjYXJkIG9mIGEgZHJhZnQgZnVuY3Rpb24gdXNpbmcgSFRUUCBQb3N0LlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IEFwcCBDb21wb25lbnRcbiAqIEBwYXJhbSBiRW5hYmxlU3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0YkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGdldENvbnZlcnRlZEFjdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpO1xuXHRcdGlmIChjb252ZXJ0ZWRBY3Rpb24pIHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ldyBPcGVyYXRpb24ob0FwcENvbXBvbmVudCwgb0NvbnRleHQuZ2V0TW9kZWwoKSwgY29udmVydGVkQWN0aW9uLCB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0bGFiZWw6IGdldFJlc291cmNlTW9kZWwob0FwcENvbXBvbmVudCk/LmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiKSB8fCBcIlwiLFxuXHRcdFx0XHRjb250ZXh0czogW29Db250ZXh0XSxcblx0XHRcdFx0c2tpcE1lc3NhZ2VzOiB0cnVlLFxuXHRcdFx0XHRvRGF0YVByb3BlcnRpZXM6IHtcblx0XHRcdFx0XHRkaXNhYmxlU2lkZUVmZmVjdHM6IHRydWUsXG5cdFx0XHRcdFx0ZGlzYWJsZVN0cmljdEhhbmRsaW5nOiAhYkVuYWJsZVN0cmljdEhhbmRsaW5nLFxuXHRcdFx0XHRcdGlnbm9yZUVUYWc6IGlzRW1wdHlPYmplY3Qob0NvbnRleHQuZ2V0T2JqZWN0KCkpLCAvLyBJZiB0aGUgY29udGV4dCBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCwgd2UgY2FuIGlnbm9yZSB0aGUgRVRhZyAoYXMgbm8gcHJldmlvdXMgRVRhZyBpcyBhdmFpbGFibGUpXG5cdFx0XHRcdFx0Z3JvdXBJZDogXCJkaXJlY3RcIixcblx0XHRcdFx0XHRyZXBsYWNlV2l0aFJWQzogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdGRlZmVycmVkU3VibWl0OiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9KS5leGVjdXRlKCk7XG5cdFx0XHRpZiAocmVzdWx0WzBdLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihyZXN1bHRbMF0ucmVhc29uKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGRpc2NhcmQgYWN0aW9uIG5vdCBmb3VuZFwiKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGRpc2NhcmQgYWN0aW9uIGNhbm5vdCBiZSBleGVjdXRlZCBvbiBhbiBhY3RpdmUgZG9jdW1lbnRcIik7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzXG4gKiBiZXR3ZWVuIHRoZSBvYmplY3QgcGFnZSBhbmQgdGhlIHN1Ym9iamVjdCBwYWdlLlxuICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdCBwYWdlXG4gKiBAcGFyYW0gcm9vdENvbnRleHRJbmZvIFRoZSBjb250ZXh0IGluZm8gb2Ygcm9vdCBvZiB0aGUgZHJhZnRcbiAqIEBwYXJhbSBncm91cElkXG4gKiBAcGFyYW0gYmluZGluZ1BhcmFtZXRlcnMgT3B0aW9uYWwgYmluZGluZyBwYXJhbWV0ZXJzIHdoZW4gY3JlYXRpbmcgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSBjcmVhdGVLZWVwQWxpdmVDb250ZXh0IElmIHNldCB0byB0cnVlLCB0aGUgY29udGV4dCB3aWxsIGJlIGNyZWF0ZWQgYXMgYSBrZWVwLWFsaXZlIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdHJvb3RDb250ZXh0SW5mbz86IFJvb3RDb250ZXh0SW5mbyxcblx0Z3JvdXBJZD86IHN0cmluZyxcblx0YmluZGluZ1BhcmFtZXRlcnM/OiBvYmplY3QsXG5cdGNyZWF0ZUtlZXBBbGl2ZUNvbnRleHQgPSBmYWxzZVxuKTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0aWYgKCFyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkuc3RhcnRzV2l0aChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHR9XG5cblx0aWYgKFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlICYmXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlXG5cdCkge1xuXHRcdC8vIFdlIGFscmVhZHkga25vdyB0aGUgc2libGluZyBmb3IgcmlnaHRtb3N0Q3VycmVudENvbnRleHQgZG9lc24ndCBleGlzdFxuXHRcdC8vIC0tPiBObyBuZWVkIHRvIGNoZWNrIGNhbm9uaWNhbCBwYXRocyBldGMuLi5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0dHJ5IHtcblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAxLiBGaW5kIGFsbCBzZWdtZW50cyBiZXR3ZWVuIHRoZSByb290IG9iamVjdCBhbmQgdGhlIHN1Yi1vYmplY3Rcblx0XHQvLyBFeGFtcGxlOiBmb3Igcm9vdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKSBhbmQgcmlnaHRNb3N0ID0gL1BhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL19TdWJOYXYoZGQpXG5cdFx0Ly8gLS0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblxuXHRcdC8vIEZpbmQgYWxsIHNlZ21lbnRzIGluIHRoZSByaWdodG1vc3QgcGF0aFxuXHRcdGNvbnN0IGFkZGl0aW9uYWxQYXRoID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnJlcGxhY2Uocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSwgXCJcIik7XG5cdFx0Y29uc3Qgc2VnbWVudHMgPSBhZGRpdGlvbmFsUGF0aCA/IGFkZGl0aW9uYWxQYXRoLnN1YnN0cmluZygxKS5zcGxpdChcIi9cIikgOiBbXTtcblx0XHQvLyBGaXJzdCBzZWdtZW50IGlzIGFsd2F5cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSByb290IG9iamVjdCwgd2hpY2ggY2FuIGNvbnRhaW4gJy8nIGluIGNhc2Ugb2YgYSBwYXJhbWV0cml6ZWQgZW50aXR5XG5cdFx0c2VnbWVudHMudW5zaGlmdChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cblx0XHQvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0XHQvLyAyLiBSZXF1ZXN0IGNhbm9uaWNhbCBwYXRocyBvZiB0aGUgc2libGluZyBlbnRpdHkgZm9yIGVhY2ggc2VnbWVudFxuXHRcdC8vIEV4YW1wbGU6IGZvciBbXCJQYXJhbShhYSkvRW50aXR5KGJiKVwiLCBcIl9OYXYoY2MpXCIsIFwiX1N1Yk5hdihkZClcIl1cblx0XHQvLyAtLT4gcmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgZm9yIFwiUGFyYW0oYWEpL0VudGl0eShiYikvU2libGluZ0VudGl0eVwiLCBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL19OYXYoY2MpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKS9TaWJsaW5nRW50aXR5XCJcblx0XHRjb25zdCBvbGRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCBuZXdQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgY3VycmVudFBhdGggPSBcIlwiO1xuXG5cdFx0Ly8gQ29tcHV0aW5nIHNpYmxpbmcgZW50aXR5IG9mIHJvb3Qgb2YgdGhlIGRyYWZ0IGNvbnRleHQgaXMgbm90IHJlcXVpcmVkIGlmIHRoZSBjb250ZXh0IGlzIGFscmVhZHkgaW4gdGhlIHN1Yi1PUFxuXHRcdC8vIEV4YW1wbGU6IEVkaXQgaW4gU3ViLU9QIHdoZXJlIG5ldyBjb250ZXh0IGlzIGFscmVhZHkgYXZhaWxhYmxlXG5cdFx0Y29uc3QgcGF0aHMgPSBbLi4uc2VnbWVudHNdO1xuXHRcdGlmIChyb290Q29udGV4dEluZm8/LnJvb3RTaWJsaW5nUGF0aFByb21pc2UpIHtcblx0XHRcdHBhdGhzLnNoaWZ0KCk7XG5cdFx0XHRjdXJyZW50UGF0aCA9IFwiL1wiICsgcm9vdEN1cnJlbnRDb250ZXh0Py5nZXRQYXRoKCk/LnN1YnN0cmluZygxKTtcblx0XHR9XG5cdFx0Y29uc3QgY2Fub25pY2FsUGF0aFByb21pc2VzID0gcGF0aHMubWFwKGFzeW5jIChzZWdtZW50KSA9PiB7XG5cdFx0XHRjdXJyZW50UGF0aCArPSBgLyR7c2VnbWVudH1gO1xuXHRcdFx0b2xkUGF0aHMudW5zaGlmdChjdXJyZW50UGF0aCk7XG5cdFx0XHRpZiAoY3VycmVudFBhdGguZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWxcblx0XHRcdFx0XHQuYmluZENvbnRleHQoYCR7Y3VycmVudFBhdGh9L1NpYmxpbmdFbnRpdHlgLCB1bmRlZmluZWQsIGdyb3VwSWQgPyB7ICQkZ3JvdXBJZDogZ3JvdXBJZCB9IDogdW5kZWZpbmVkKVxuXHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0cmV0dXJuIHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7IC8vIDEtMSByZWxhdGlvblxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMy4gUmVjb25zdHJ1Y3QgdGhlIGZ1bGwgcGF0aHMgZnJvbSBjYW5vbmljYWwgcGF0aHMgKGZvciBwYXRoIG1hcHBpbmcpXG5cdFx0Ly8gRXhhbXBsZTogZm9yIGNhbm9uaWNhbCBwYXRocyBcIi9QYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiL0VudGl0eTIoY2Mtc2libGluZylcIiwgXCIvRW50aXR5MyhkZC1zaWJsaW5nKVwiXG5cdFx0Ly8gLS0+IFtcIlBhcmFtKGFhKS9FbnRpdHkoYmItc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZylcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpL19OYXYoY2Mtc2libGluZykvX1N1Yk5hdihkZC1zaWJsaW5nKVwiXVxuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhzID0gKGF3YWl0IFByb21pc2UuYWxsKGNhbm9uaWNhbFBhdGhQcm9taXNlcykpIGFzIHN0cmluZ1tdO1xuXG5cdFx0Ly8gV29ya2Fyb3VuZCAodGVtcG9yYXJ5ID8pOiB3aGVuIHRoZSBzaWJsaW5nIGRvZXNuJ3QgZXhpc3QsIHJlcXVlc3RDYW5vbmljYWxQYXRoIHJldHVybnMgdGhlIHNhbWUgcGF0aFxuXHRcdGlmIChcblx0XHRcdGNhbm9uaWNhbFBhdGhzLnNvbWUoKHBhdGgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHBhdGggJiYgcGF0aC5lbmRzV2l0aChcIi9TaWJsaW5nRW50aXR5XCIpO1xuXHRcdFx0fSlcblx0XHQpIHtcblx0XHRcdC8vIEF0IGxlYXN0IG9uZSBzaWJsaW5nIGVudGl0eSBkb2Vzbid0IGV4aXN0XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmIChyb290Q29udGV4dEluZm8/LnJvb3RTaWJsaW5nUGF0aFByb21pc2UpIHtcblx0XHRcdGNvbnN0IHJvb3RTaWJsaW5nUGF0aCA9IChhd2FpdCByb290Q29udGV4dEluZm8ucm9vdFNpYmxpbmdQYXRoUHJvbWlzZSk/LmdldFBhdGgoKSBhcyBzdHJpbmc7XG5cdFx0XHRjYW5vbmljYWxQYXRocy51bnNoaWZ0KHJvb3RTaWJsaW5nUGF0aCk7XG5cdFx0XHRvbGRQYXRocy5wdXNoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdH1cblx0XHRsZXQgc2libGluZ1BhdGggPSBcIlwiO1xuXHRcdGNhbm9uaWNhbFBhdGhzLmZvckVhY2goKGNhbm9uaWNhbFBhdGgsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggIT09IDApIHtcblx0XHRcdFx0aWYgKHNlZ21lbnRzW2luZGV4XS5lbmRzV2l0aChcIilcIikpIHtcblx0XHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uID0gc2VnbWVudHNbaW5kZXhdLnJlcGxhY2UoL1xcKC4qJC8sIFwiXCIpOyAvLyBLZWVwIG9ubHkgbmF2aWdhdGlvbiBuYW1lIGZyb20gdGhlIHNlZ21lbnQsIGkuZS4gYWFhKHh4eCkgLS0+IGFhYVxuXHRcdFx0XHRcdGNvbnN0IGtleXMgPSBjYW5vbmljYWxQYXRoLnJlcGxhY2UoLy4qXFwoLywgXCIoXCIpOyAvLyBLZWVwIG9ubHkgdGhlIGtleXMgZnJvbSB0aGUgY2Fub25pY2FsIHBhdGgsIGkuZS4gYWFhKHh4eCkgLS0+ICh4eHgpXG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke25hdmlnYXRpb259JHtrZXlzfWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c2libGluZ1BhdGggKz0gYC8ke3NlZ21lbnRzW2luZGV4XX1gOyAvLyAxLTEgcmVsYXRpb25cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2libGluZ1BhdGggPSBjYW5vbmljYWxQYXRoOyAvLyBUbyBtYW5hZ2UgcGFyYW1ldHJpemVkIGVudGl0aWVzXG5cdFx0XHR9XG5cdFx0XHRuZXdQYXRocy51bnNoaWZ0KHNpYmxpbmdQYXRoKTtcblx0XHR9KTtcblxuXHRcdGxldCBwYXJhbWV0ZXJzOiB7ICRzZWxlY3Q/OiBzdHJpbmc7ICQkZ3JvdXBJZD86IHN0cmluZyB9O1xuXHRcdGNvbnN0IG1lc3NhZ2VQYXRoID0gZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KTtcblx0XHRpZiAoY3JlYXRlS2VlcEFsaXZlQ29udGV4dCkge1xuXHRcdFx0cGFyYW1ldGVycyA9IHsgJCRncm91cElkOiBcIiRhdXRvLldvcmtlcnNcIiB9OyAvLyBXZSBuZWVkIHRvIHVzZSB0aGUgc2FtZSBncm91cCBJRCBhcyBmb3IgdGhlIHBhcmVudCBsaXN0IGJpbmRpbmdcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyYW1ldGVycyA9IGJpbmRpbmdQYXJhbWV0ZXJzID8/IHt9O1xuXHRcdFx0aWYgKG1lc3NhZ2VQYXRoKSB7XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJzLiRzZWxlY3QpIHtcblx0XHRcdFx0XHRwYXJhbWV0ZXJzLiRzZWxlY3QgKz0gYCwke21lc3NhZ2VQYXRofWA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cGFyYW1ldGVycy4kc2VsZWN0ID0gbWVzc2FnZVBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHBhcmFtZXRlcnMuJCRncm91cElkID0gXCIkYXV0by5IZXJvZXNcIjtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogY3JlYXRlS2VlcEFsaXZlQ29udGV4dFxuXHRcdFx0XHQ/IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoc2libGluZ1BhdGgsICEhbWVzc2FnZVBhdGgsIHBhcmFtZXRlcnMpXG5cdFx0XHRcdDogbW9kZWwuYmluZENvbnRleHQoc2libGluZ1BhdGgsIHVuZGVmaW5lZCwgcGFyYW1ldGVycykuZ2V0Qm91bmRDb250ZXh0KCksIC8vIENyZWF0ZSB0aGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dCBmcm9tIGl0cyBwYXRoXG5cdFx0XHRwYXRoTWFwcGluZzogb2xkUGF0aHMubWFwKChvbGRQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG9sZFBhdGgsXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3UGF0aHNbaW5kZXhdXG5cdFx0XHRcdH07XG5cdFx0XHR9KVxuXHRcdH07XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gQSBjYW5vbmljYWwgcGF0aCBjb3VsZG4ndCBiZSByZXNvbHZlZCAoYmVjYXVzZSBhIHNpYmxpbmcgZG9lc24ndCBleGlzdClcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZyb20gYW4gZXhpc3RpbmcgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMub1ZpZXddIFRoZSB2aWV3XG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0gZ3JvdXBJZCBUaGUgYmF0Y2ggZ3JvdXBJZCBmb3IgcG9zdCBjYWxsIG9mIGVkaXQgYWN0aW9uXG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIHRyYW5zYWN0aW9uRGV0YWlscyBPcHRpb25hbCBvYmplY3QgdG8gcmV0dXJuIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCBob3cgdGhlIHRyYW5zYWN0aW9uIHdhcyBleGVjdXRlZFxuICogQHBhcmFtIHRyYW5zYWN0aW9uRGV0YWlscy5leGlzdGluZ0RyYWZ0UmV1c2VkIEFuIGV4aXN0aW5nIGRyYWZ0IHdhcyByZXR1cm5lZCwgaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBuZXcgb25lXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRtUGFyYW1ldGVyczoge1xuXHRcdG9WaWV3OiBGRVZpZXc7XG5cdFx0YlByZXNlcnZlQ2hhbmdlcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdH0sXG5cdGdyb3VwSWQ6IHN0cmluZyxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHR0cmFuc2FjdGlvbkRldGFpbHM/OiB7XG5cdFx0ZXhpc3RpbmdEcmFmdFJldXNlZD86IGJvb2xlYW47XG5cdH1cbik6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fSxcblx0XHRiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyA9XG5cdFx0XHR0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwidW5kZWZpbmVkXCIgfHwgKHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJib29sZWFuXCIgJiYgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMpOyAvL2RlZmF1bHQgdHJ1ZVxuXG5cdC8qKlxuXHQgKiBPdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGNoYW5nZS5cblx0ICogQHBhcmFtIHJlc3BvbnNlIENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdCBvciB0aGUgZXJyb3IgcmV0cmlldmVkXG5cdCAqIEByZXR1cm5zIFJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHtAbGluayBzYXAuZmUuY29yZS5hY3Rpb25zI2V4ZWN1dGVEcmFmdEVkaXRBY3Rpb259XG5cdCAqL1xuXHRhc3luYyBmdW5jdGlvbiBvdmVyd3JpdGVDaGFuZ2UocmVzcG9uc2U6IENvbnRleHQgfCBDb250ZXh0RXJyb3JUeXBlKTogUHJvbWlzZTxDb250ZXh0IHwgQ29udGV4dEVycm9yVHlwZSB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vT3ZlcndyaXRlIGV4aXN0aW5nIGNoYW5nZXNcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKG1QYXJhbWV0ZXJzLm9WaWV3KTtcblx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGF3YWl0IGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdGlmIChkcmFmdEFkbWluRGF0YSkge1xuXHRcdFx0Ly8gcmVtb3ZlIGFsbCB1bmJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgYXMgd2Ugc2hvdyBhIHNwZWNpYWwgZGlhbG9nXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0bGV0IHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuSW5Qcm9jZXNzQnlVc2VyO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IG1QYXJhbWV0ZXJzLm9WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0O1xuXHRcdFx0aWYgKHNJbmZvKSB7XG5cdFx0XHRcdGNvbnN0IHNMb2NrZWRCeVVzZXJNc2cgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX0RSQUZUX09CSkVDVF9QQUdFX0RSQUZUX0xPQ0tFRF9CWV9VU0VSXCIsIHNJbmZvLCBzRW50aXR5U2V0KTtcblx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHNMb2NrZWRCeVVzZXJNc2cpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0luZm8gPSBkcmFmdEFkbWluRGF0YS5DcmVhdGVkQnlVc2VyRGVzY3JpcHRpb24gfHwgZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlcjtcblx0XHRcdFx0Y29uc3Qgc1Vuc2F2ZWRDaGFuZ2VzTXNnID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIiwgc0luZm8sIHNFbnRpdHlTZXQpO1xuXHRcdFx0XHRhd2FpdCBkcmFmdC5zaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnLCBvQ29udGV4dCk7XG5cdFx0XHRcdHJldHVybiBkcmFmdC5leGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBmYWxzZSwgbVBhcmFtZXRlcnMub1ZpZXcsIGdyb3VwSWQsIG1lc3NhZ2VIYW5kbGVyLCB0cnVlKTsgLy8gdHJ1ZSBiZWNhdXNlIHdlIG92ZXJ3cml0ZSBjaGFuZ2VzXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICgocmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSk/Lm1lc3NhZ2UpIHtcblx0XHRcdE1lc3NhZ2VCb3guZXJyb3IoKHJlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLm1lc3NhZ2UpO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHR9XG5cdGxldCBvRHJhZnRDb250ZXh0OiBDb250ZXh0IHwgQ29udGV4dEVycm9yVHlwZSB8IHVuZGVmaW5lZDtcblx0dHJ5IHtcblx0XHRvRHJhZnRDb250ZXh0ID0gYXdhaXQgZHJhZnQuZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3csIG1QYXJhbWV0ZXJzLm9WaWV3LCBncm91cElkLCBtZXNzYWdlSGFuZGxlcik7XG5cdH0gY2F0Y2ggKG9SZXNwb25zZSkge1xuXHRcdGlmICgob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLnN0YXR1cyA9PT0gNDA5IHx8IChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuc3RhdHVzID09PSA0MjMpIHtcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXJzID0gTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSlcblx0XHRcdFx0PyB7ICRzZWxlY3Q6IFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRBZG1pbmlzdHJhdGl2ZVVzZXJcIiB9XG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3Qgc2libGluZ0luZm8gPSBhd2FpdCBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0b0FwcENvbXBvbmVudC5faXNGY2xFbmFibGVkKClcblx0XHRcdCk7XG5cdFx0XHRpZiAoc2libGluZ0luZm8/LnRhcmdldENvbnRleHQpIHtcblx0XHRcdFx0Ly90aGVyZSBpcyBhIGNvbnRleHQgYXV0aG9yaXplZCB0byBiZSBlZGl0ZWQgYnkgdGhlIGN1cnJlbnQgdXNlclxuXHRcdFx0XHRhd2FpdCBDb21tb25VdGlscy53YWl0Rm9yQ29udGV4dFJlcXVlc3RlZChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0KTtcblx0XHRcdFx0aWYgKHRyYW5zYWN0aW9uRGV0YWlscykge1xuXHRcdFx0XHRcdHRyYW5zYWN0aW9uRGV0YWlscy5leGlzdGluZ0RyYWZ0UmV1c2VkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly90aGVyZSBpcyBubyBkcmFmdCBvd25lZCBieSB0aGUgY3VycmVudCB1c2VyXG5cdFx0XHRcdG9EcmFmdENvbnRleHQgPSBhd2FpdCBvdmVyd3JpdGVDaGFuZ2Uob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIShvUmVzcG9uc2UgJiYgKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5jYW5jZWxlZCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihvUmVzcG9uc2UgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRpZiAob0RyYWZ0Q29udGV4dCkge1xuXHRcdGNvbnN0IHNFZGl0QWN0aW9uTmFtZSA9IGRyYWZ0LmdldEFjdGlvbk5hbWUob0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCk7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNFZGl0QWN0aW9uTmFtZSwgb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRpZiAob1NpZGVFZmZlY3RzPy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRhd2FpdCBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKG9TaWRlRWZmZWN0cywgb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBvRHJhZnRDb250ZXh0IGFzIENvbnRleHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBhY3RpdmUgZG9jdW1lbnQgZnJvbSBhIGRyYWZ0IGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjaG9yZW9ncmFwaHkgZGVmaW5lZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyBhIHZldG8gYmVmb3JlIHRoZSAnQ3JlYXRlJyByZXF1ZXN0IGlzIGV4ZWN1dGVkXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3NpbmcgYWZ0ZXIgZG9jdW1lbnQgd2FzIGFjdGl2YXRlZC5cbiAqIEBwYXJhbSBbbVBhcmFtZXRlcnMucmVzb3VyY2VNb2RlbF0gUmVzb3VyY2UgTW9kZWxcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0IGNvbnRleHR9IG9mIHRoZSBuZXcgZHJhZnQgZG9jdW1lbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVEb2N1bWVudChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRtUGFyYW1ldGVyczogeyBmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQ/OiBGdW5jdGlvbjsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBGdW5jdGlvbjsgcmVzb3VyY2VNb2RlbD86IFJlc291cmNlTW9kZWwgfSxcblx0aXNTdGFuZGFyZFNhdmU/OiBib29sZWFuIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge307XG5cdGlmICghb0NvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdH1cblxuXHRjb25zdCBiRXhlY3V0ZSA9IG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBhd2FpdCBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWU7XG5cdGlmICghYkV4ZWN1dGUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEFjdGl2YXRpb24gb2YgdGhlIGRvY3VtZW50IHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHR9XG5cblx0bGV0IG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IENvbnRleHQ7XG5cdGlmICghZHJhZnQuaGFzUHJlcGFyZUFjdGlvbihvQ29udGV4dCkpIHtcblx0XHRvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihcblx0XHRcdG9Db250ZXh0LFxuXHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0bVBhcmFtZXRlcnMucmVzb3VyY2VNb2RlbFxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0LyogYWN0aXZhdGlvbiByZXF1aXJlcyBwcmVwYXJhdGlvbiAqL1xuXHRcdGNvbnN0IHNCYXRjaEdyb3VwID0gXCIkYXV0b1wiO1xuXHRcdC8vd2hlbiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIHRoZXJlIHdpbGwgYmUgYSBwYXRjaCByZXF1ZXN0IG1lcmdlZCB0b2dldGhlciB3aXRoIHRoZSBkcmFmdFByZXBhcmUgYW5kIGRyYWZ0QWNpdmF0ZS5cblx0XHQvL1RoZSBwYXRjaCBjaGFuZ2VzIHRoZSBFdGFnLCB0aGVyZm9yZSB0aGUgcHJlcGFyZSBuZWVkcyB0byBpZ25vcmUgRXRhZ3Ncblx0XHRjb25zdCBpZ25vcmVFdGFnOiBib29sZWFuID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdC8vIHdlIHVzZSB0aGUgc2FtZSBiYXRjaEdyb3VwIHRvIGZvcmNlIHByZXBhcmUgYW5kIGFjdGl2YXRlIGluIGEgc2FtZSBiYXRjaCBidXQgd2l0aCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0Y29uc3Qgb1ByZXBhcmVQcm9taXNlID0gZHJhZnQuZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24ob0NvbnRleHQsIHNCYXRjaEdyb3VwLCB1bmRlZmluZWQsIGlnbm9yZUV0YWcpO1xuXHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0JhdGNoR3JvdXApO1xuXHRcdGNvbnN0IG9BY3RpdmF0ZVByb21pc2UgPSBkcmFmdC5leGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uKFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRvQXBwQ29tcG9uZW50LFxuXHRcdFx0bWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRzQmF0Y2hHcm91cCxcblx0XHRcdG9QcmVwYXJlUHJvbWlzZSxcblx0XHRcdG1QYXJhbWV0ZXJzLnJlc291cmNlTW9kZWwsXG5cdFx0XHRpc1N0YW5kYXJkU2F2ZVxuXHRcdCk7XG5cblx0XHRjb25zdCB2YWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChbb1ByZXBhcmVQcm9taXNlLCBvQWN0aXZhdGVQcm9taXNlXSk7XG5cdFx0b0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IHZhbHVlc1sxXTtcblx0fVxuXHRyZXR1cm4gbVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50ID8gbVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KSA6IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG59XG5cbi8qKlxuICogRGlzcGxheSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZyBib3ggYWZ0ZXIgcHJlc3NpbmcgdGhlIGVkaXQgYnV0dG9uIG9mIGFuIG9iamVjdCBwYWdlIHdpdGggdW5zYXZlZCBjaGFuZ2VzLlxuICogQHBhcmFtIHNVbnNhdmVkQ2hhbmdlc01zZyBEaWFsb2cgYm94IG1lc3NhZ2UgaW5mb3JtaW5nIHRoZSB1c2VyIHRoYXQgaWYgaGUgc3RhcnRzIGVkaXRpbmcsIHRoZSBwcmV2aW91cyB1bnNhdmVkIGNoYW5nZXMgd2lsbCBiZSBsb3N0XG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveChzVW5zYXZlZENoYW5nZXNNc2c6IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0Y29uc3QgbG9jYWxJMThuUmVmID0gTGlicmFyeS5nZXRSZXNvdXJjZUJ1bmRsZUZvcihcInNhcC5mZS5jb3JlXCIpITtcblx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IHVua25vd24pID0+IHZvaWQpIHtcblx0XHRjb25zdCBvRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHR0aXRsZTogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9XQVJOSU5HXCIpLFxuXHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0Y29udGVudDogbmV3IFRleHQoe1xuXHRcdFx0XHR0ZXh0OiBzVW5zYXZlZENoYW5nZXNNc2dcblx0XHRcdH0pLFxuXHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIiksXG5cdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRyZWplY3QoYERyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0b0RpYWxvZy5vcGVuKCk7XG5cdH0pO1xufVxuXG4vKipcbiAqIEhUVFAgUE9TVCBjYWxsIHdoZW4gRHJhZnRBY3Rpb24gaXMgcHJlc2VudCBmb3IgRHJhZnQgRGVsZXRlOyBIVFRQIERFTEVURSBjYWxsIHdoZW4gdGhlcmUgaXMgbm8gRHJhZnRBY3Rpb25cbiAqIGFuZCBBY3RpdmUgSW5zdGFuY2UgYWx3YXlzIHVzZXMgREVMRVRFLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGRpc2NhcmRlZFxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGRpc2NhcmRlZFxuICogQHBhcmFtIGJFbmFibGVTdHJpY3RIYW5kbGluZ1xuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIGNvbnRleHQgaXMgZGVsZXRlZFxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVEcmFmdChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LFxuXHRiRW5hYmxlU3RyaWN0SGFuZGxpbmc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0aWYgKG9Db250ZXh0LmlzVHJhbnNpZW50KCkpIHtcblx0XHQvLyBUcmFuc2llbnQgY29udGV4dHMgKGUuZy4gd2hlbiB0cnlpbmcgdG8gZGVsZXRlIGEgY29udGV4dCB3aGljaCBjb3VsZG4ndCBiZSBjcmVhdGVkIGJlY2F1c2Ugb2YgYW4gZXJyb3IpIGNhbiBiZSBkZWxldGVkIGltbWVkaWF0ZWx5XG5cdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHR9XG5cdGNvbnN0IHNEaXNjYXJkQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpO1xuXHRjb25zdCBiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblxuXHRpZiAoYklzQWN0aXZlRW50aXR5IHx8ICghYklzQWN0aXZlRW50aXR5ICYmICFzRGlzY2FyZEFjdGlvbikpIHtcblx0XHQvL1VzZSBEZWxldGUgaW4gY2FzZSBvZiBhY3RpdmUgZW50aXR5IGFuZCBubyBkaXNjYXJkIGFjdGlvbiBhdmFpbGFibGUgZm9yIGRyYWZ0XG5cdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiYgIW9Db250ZXh0LmlzSW5hY3RpdmUoKSkge1xuXHRcdFx0YXdhaXQgb0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBXaGVuIGNhbmNlbGxpbmcgYW4gZWRpdCBkcmFmdCByb290IG5vZGUsIHVzZSBtb2RlbC5kZWxldGUgaW5zdGVhZCBvZiBjb250ZXh0LmRlbGV0ZSwgdG8gb25seSBzZW5kIGRlbGV0aW9uIHRvIGJhY2tlbmQsXG5cdFx0XHQvLyBidXQga2VlcCBjb250ZXh0IGFsaXZlIChpbmNsdWRpbmcgYmluZGluZ3MpLiBUaHVzLCB3ZSBjYW4gZW5zdXJlIHNlYW1sZXNzIHRyYW5zaXN0aW9uIGZyb20gZHJhZnQgdG8gYWN0aXZlIGluc3RhbmNlXG5cdFx0XHQvLyAod2l0aG91dCBpbnRlcm1lZGlhdGUgdW5kZWZpbmVkIGJpbmRpbmdzIGUuZy4gbGVhZGluZyB0byBmbGlja2VyaW5nKS4gVGhpcyBkb2Vzbid0IHdvcmsgaW4gY2FzZSBvZiBGQ0wgYXBwcywgYXNcblx0XHRcdC8vIG1vZGVsLmRlbGV0ZSBkb2Vzbid0IGNsZWFuIHVwIHRoZSBwYXJlbnQgbGlzdEJpbmRpbmcgcHJvcGVybHksIGxlYWRpbmcgdG8gaW5jb3JyZWN0IE9EYXRhIHJlcXVlc3RzLlxuXHRcdFx0Ly8gSW4gb3RoZXIgY2FzZXMgKGRlbGV0aW5nIGFjdGl2ZSwgZGlzY2FyZGluZyBjcmVhdGUgZHJhZnQgb3IgZGlzY2FyZGluZyBkcmFmdCBub2RlKSwgc3RheSB3aXRoIGNvbnRleHQuZGVsZXRlLlxuXHRcdFx0Ly8gV2hlbiBjYW5jZWxsaW5nIGEgY3JlYXRlIGRyYWZ0LCBwYWdlIGlzIGNsb3NlZCwgdGh1cyB0aGUgcHJvYmxlbSBvZiBmbGlja2VyaW5nIGNhbm5vdCBvY2N1ci5cblx0XHRcdC8vIEluIGNhc2Ugb2YgZGlzY2FyZGluZyBhIGRyYWZ0IG5vZGUsIHRoZW9yZXRpY2FsbHkgdGhlIHNhbWUgcHJvYmxlbSBjb3VsZFxuXHRcdFx0Ly8gb2NjdXIsIGJ1dCBuZWVkcyBxdWl0ZSBzcGVjaWZpYyBtb2RlbGxpbmcgKGJ1dHRvbiB2aXNpYmlsaXR5IG9uIGl0ZW0gbGV2ZWwgYm91bmQgYWdhaW5zdCBzZXJ2aWNlIHByb3BlcnR5IGluIGFuIEZDTCBhcHApXG5cdFx0XHQvLyBhbmQgYWN0aW5nIChsb29raW5nIGF0IGJ1dHRvbiBvbiB0aGlyZCBjb2x1bW4gd2hpbGUgZGlzY2FyZGluZyBvbiAybmQgY29sdW1uKS4gQ3VycmVudGx5LCBtb2RlbCBzZWVtcyBub3QgdG8gYmUgcHJlcGFyZWRcblx0XHRcdC8vIGZvciB0aGF0IGNhc2UsIHRodXMgZHVlIHRvIHRoZSBtaW5pbWFsIGltcGFjdCAob25seSBpbnRlcm1lZGlhdGUgdmlzdWFsIHN0YXRlKSwgYWNjZXB0aW5nIHRoaXMgZm9yIHRoZSB0aW1lIGJlaW5nLlxuXHRcdFx0cmV0dXJuICFvQXBwQ29tcG9uZW50Ll9pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHQhb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSAmJlxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChcblx0XHRcdFx0XHRnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpKT8udGFyZ2V0RW50aXR5U2V0XG5cdFx0XHRcdCkgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIilcblx0XHRcdFx0PyBvQ29udGV4dC5nZXRNb2RlbCgpLmRlbGV0ZShvQ29udGV4dClcblx0XHRcdFx0OiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly9Vc2UgRGlzY2FyZCBQb3N0IEFjdGlvbiBpZiBpdCBpcyBhIGRyYWZ0IGVudGl0eSBhbmQgZGlzY2FyZCBhY3Rpb24gZXhpc3RzXG5cdFx0YXdhaXQgZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dCwgbWVzc2FnZUhhbmRsZXIsIG9BcHBDb21wb25lbnQsIGJFbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdH1cbn1cblxuY29uc3QgZHJhZnQgPSB7XG5cdGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50OiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCxcblx0YWN0aXZhdGVEb2N1bWVudDogYWN0aXZhdGVEb2N1bWVudCxcblx0ZGVsZXRlRHJhZnQ6IGRlbGV0ZURyYWZ0LFxuXHRleGVjdXRlRHJhZnRFZGl0QWN0aW9uOiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uLFxuXHRleGVjdXRlRHJhZnRWYWxpZGF0aW9uOiBleGVjdXRlRHJhZnRWYWxpZGF0aW9uLFxuXHRleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbjogZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24sXG5cdGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb246IGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24sXG5cdGhhc1ByZXBhcmVBY3Rpb246IGhhc1ByZXBhcmVBY3Rpb24sXG5cdGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb246IGNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24sXG5cdHByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uOiBkcmFmdERhdGFMb3NzUG9wdXAucHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24sXG5cdHNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbjogZHJhZnREYXRhTG9zc1BvcHVwLnNpbGVudGx5S2VlcERyYWZ0T25Gb3J3YXJkTmF2aWdhdGlvbixcblx0Y3JlYXRlT3BlcmF0aW9uOiBjcmVhdGVPcGVyYXRpb24sXG5cdGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb246IGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24sXG5cdE5hdmlnYXRpb25UeXBlOiBkcmFmdERhdGFMb3NzUG9wdXAuTmF2aWdhdGlvblR5cGUsXG5cdGdldEFjdGlvbk5hbWU6IGdldEFjdGlvbk5hbWUsXG5cdHNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveDogc2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94XG59O1xuXG5leHBvcnQgZGVmYXVsdCBkcmFmdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7RUF1RkE7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
751
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkcmFmdE9wZXJhdGlvbnMiLCJFRElUIiwiQUNUSVZBVElPTiIsIkRJU0NBUkQiLCJQUkVQQVJFIiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiZ2V0Q29udmVydGVkQWN0aW9uIiwiY29udGV4dCIsIm9wZXJhdGlvbiIsIm9wZXJhdGlvbk5hbWUiLCJtZXRhTW9kZWwiLCJhY3Rpb25QYXRoIiwiYm91bmRBY3Rpb24iLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnZlcnRUeXBlcyIsInJlc29sdmVQYXRoIiwidGFyZ2V0IiwiZ2V0UmV0dXJuVHlwZSIsImhhc1ByZXBhcmVBY3Rpb24iLCJleGVjdXRlRHJhZnRFZGl0QWN0aW9uIiwiYlByZXNlcnZlQ2hhbmdlcyIsIm9WaWV3IiwiZ3JvdXBJZCIsIm1lc3NhZ2VIYW5kbGVyIiwib3ZlcndyaXRlQ2hhbmdlIiwiY29udmVydGVkQWN0aW9uIiwiT3BlcmF0aW9uIiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJjb250ZXh0cyIsImxhYmVsIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJiaW5kaW5nUGFyYW1ldGVycyIsIiQkaW5oZXJpdEV4cGFuZFNlbGVjdCIsIiQkdXBkYXRlR3JvdXBJZCIsInNraXBNZXNzYWdlcyIsIm9EYXRhUHJvcGVydGllcyIsImRpc2FibGVTaWRlRWZmZWN0cyIsImlnbm9yZUVUYWciLCJpc0VtcHR5T2JqZWN0IiwicmVwbGFjZVdpdGhSVkMiLCJnZXRCaW5kaW5nIiwiaXNBIiwiZGVmZXJyZWRTdWJtaXQiLCJzZXREZWZhdWx0UGFyYW1ldGVyc1ZhbHVlcyIsIlByZXNlcnZlQ2hhbmdlcyIsInJlc3VsdCIsImV4ZWN1dGUiLCJzdGF0dXMiLCJtb2RpZmllZEVycm9yIiwiRXJyb3IiLCJyZWFzb24iLCJtZXNzYWdlIiwidmFsdWUiLCJyZXR1cm5lZENvbnRleHQiLCJleGVjdXRlRHJhZnRWYWxpZGF0aW9uIiwiYXBwQ29tcG9uZW50IiwiTW9kZWxIZWxwZXIiLCJnZXRNZXNzYWdlc1BhdGgiLCJkcmFmdCIsImlzS2VlcEFsaXZlIiwicmVxdWVzdE9iamVjdCIsImV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInJlcXVlc3RNZXNzYWdlcyIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImVycm9yIiwiTG9nIiwidW5kZWZpbmVkIiwiZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbiIsIm9BcHBDb21wb25lbnQiLCJzR3JvdXBJZCIsIm9QcmVwYXJlUHJvbWlzZSIsInJlc291cmNlTW9kZWwiLCJpc1N0YW5kYXJkU2F2ZSIsImJIYXNQcmVwYXJlQWN0aW9uIiwiYklnbm9yZUV0YWciLCJnZXRQcm9wZXJ0eSIsImUiLCJwcmVwYXJlT3BlcmF0aW9uIiwiZGVzdHJveSIsImNsZWFyIiwiYWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJvQmluZGluZ1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwiYVRhcmdldFBhdGhzIiwicGF0aEV4cHJlc3Npb25zIiwibGVuZ3RoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwib0Vycm9yIiwiZ2V0TWVzc2FnZVBhdGhGb3JQcmVwYXJlIiwiZ2V0TWVzc2FnZVBhdGhGb3JDb250ZXh0IiwibWV0YUNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsImNvbnZlcnRlZENvbnRleHQiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJtZXNzYWdlcyIsInRhcmdldEVudGl0eVR5cGUiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIk1lc3NhZ2VzIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJwYXRoIiwiYk1lc3NhZ2VzIiwic01lc3NhZ2VzUGF0aCIsIm9PcGVyYXRpb24iLCIkc2VsZWN0Iiwic2V0UGFyYW1ldGVyIiwiZ2V0R3JvdXBJZCIsImludm9rZSIsInRoZW4iLCJjYXRjaCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImFyZ3VtZW50cyIsImRhdGEiLCJtZXNzYWdlSGFuZGxpbmciLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwiYkVuYWJsZVN0cmljdEhhbmRsaW5nIiwiZGlzYWJsZVN0cmljdEhhbmRsaW5nIiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0Iiwicm9vdENvbnRleHRJbmZvIiwiY3JlYXRlS2VlcEFsaXZlQ29udGV4dCIsInN0YXJ0c1dpdGgiLCJtb2RlbCIsImFkZGl0aW9uYWxQYXRoIiwicmVwbGFjZSIsInNlZ21lbnRzIiwic3Vic3RyaW5nIiwic3BsaXQiLCJ1bnNoaWZ0Iiwib2xkUGF0aHMiLCJuZXdQYXRocyIsImN1cnJlbnRQYXRoIiwicGF0aHMiLCJyb290U2libGluZ1BhdGhQcm9taXNlIiwic2hpZnQiLCJjYW5vbmljYWxQYXRoUHJvbWlzZXMiLCJtYXAiLCJzZWdtZW50IiwiZW5kc1dpdGgiLCJzaWJsaW5nQ29udGV4dCIsIiQkZ3JvdXBJZCIsImdldEJvdW5kQ29udGV4dCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjYW5vbmljYWxQYXRocyIsImFsbCIsInNvbWUiLCJyb290U2libGluZ1BhdGgiLCJwdXNoIiwic2libGluZ1BhdGgiLCJmb3JFYWNoIiwiY2Fub25pY2FsUGF0aCIsImluZGV4IiwibmF2aWdhdGlvbiIsImtleXMiLCJwYXJhbWV0ZXJzIiwibWVzc2FnZVBhdGgiLCJ0YXJnZXRDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsInBhdGhNYXBwaW5nIiwib2xkUGF0aCIsIm5ld1BhdGgiLCJjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsIm1QYXJhbWV0ZXJzIiwidHJhbnNhY3Rpb25EZXRhaWxzIiwibVBhcmFtIiwiYlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3ciLCJyZXNwb25zZSIsImRyYWZ0RGF0YUNvbnRleHQiLCJkcmFmdEFkbWluRGF0YSIsInNJbmZvIiwiSW5Qcm9jZXNzQnlVc2VyRGVzY3JpcHRpb24iLCJJblByb2Nlc3NCeVVzZXIiLCJzRW50aXR5U2V0IiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJzTG9ja2VkQnlVc2VyTXNnIiwiTWVzc2FnZUJveCIsIkNyZWF0ZWRCeVVzZXJEZXNjcmlwdGlvbiIsIkNyZWF0ZWRCeVVzZXIiLCJzVW5zYXZlZENoYW5nZXNNc2ciLCJzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3giLCJvRHJhZnRDb250ZXh0Iiwib1Jlc3BvbnNlIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJzaWJsaW5nSW5mbyIsIl9pc0ZjbEVuYWJsZWQiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsImV4aXN0aW5nRHJhZnRSZXVzZWQiLCJjYW5jZWxlZCIsInNFZGl0QWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0cyIsInRyaWdnZXJBY3Rpb25zIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJhY3RpdmF0ZURvY3VtZW50IiwiYkV4ZWN1dGUiLCJmbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQiLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0Iiwic0JhdGNoR3JvdXAiLCJpZ25vcmVFdGFnIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJzdWJtaXRCYXRjaCIsIm9BY3RpdmF0ZVByb21pc2UiLCJ2YWx1ZXMiLCJmbkFmdGVyQWN0aXZhdGVEb2N1bWVudCIsImxvY2FsSTE4blJlZiIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsInJlamVjdCIsIm9EaWFsb2ciLCJEaWFsb2ciLCJ0aXRsZSIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJ0ZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImRlbGV0ZURyYWZ0IiwiaXNUcmFuc2llbnQiLCJkZWxldGUiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaXNJbmFjdGl2ZSIsInJlc2V0Q2hhbmdlcyIsImlzSW5saW5lRWRpdEdyb3VwIiwiSU5MSU5FRURJVF9VUERBVEVHUk9VUElEIiwidGFyZ2V0RW50aXR5U2V0IiwidXNlTW9kZWxEZWxldGUiLCJpc0RyYWZ0Um9vdCIsInRlcm1pbmF0ZURyYWZ0U2Vzc2lvbiIsImdldEh0dHBIZWFkZXJzIiwib1JlcXVlc3RvciIsInNlbmRSZXF1ZXN0IiwiaW5mbyIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiZHJhZnREYXRhTG9zc1BvcHVwIiwic2lsZW50bHlLZWVwRHJhZnRPbkZvcndhcmROYXZpZ2F0aW9uIiwiTmF2aWdhdGlvblR5cGUiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aW9uIGFzIEVkbUFjdGlvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgaXNFbXB0eU9iamVjdCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9pc0VtcHR5T2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IGRyYWZ0RGF0YUxvc3NQb3B1cCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnREYXRhTG9zc1BvcHVwXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSB7IFNpZGVFZmZlY3RzU2VydmljZSB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dEVycm9yVHlwZSB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIHsgRkVWaWV3IH0gZnJvbSBcIi4uLy4uL0Jhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcIi4uLy4uL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCIuLi9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IE9wZXJhdGlvbiBmcm9tIFwiLi9vcGVyYXRpb25zL09wZXJhdGlvblwiO1xuXG5leHBvcnQgdHlwZSBTaWJsaW5nSW5mb3JtYXRpb24gPSB7XG5cdHRhcmdldENvbnRleHQ6IENvbnRleHQ7XG5cdHBhdGhNYXBwaW5nOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJvb3RDb250ZXh0SW5mbyA9IHtcblx0cm9vdFNpYmxpbmdQYXRoUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPjtcbn07XG5cbmV4cG9ydCB0eXBlIEJpbmRDb250ZXh0UGFyYW1ldGVycyA9IHtcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSBmb3IgdGhlIFwiNS4xLjIgU3lzdGVtIFF1ZXJ5IE9wdGlvbiAkZXhwYW5kXCIgb3IgYW4gb2JqZWN0IHdoaWNoIGRldGVybWluZXMgdGhhdCB2YWx1ZS4gVGhlIG9iamVjdFxuXHQgKiBpcyBhIG1hcCBmcm9tIGV4cGFuZCBwYXRoIHRvIGV4cGFuZCBvcHRpb25zLCB3aGVyZSB0aGUgb3B0aW9ucyBhcmUgYWdhaW4gbWFwcyBvZiBzeXN0ZW0gcXVlcnkgb3B0aW9ucyxcblx0ICogdHlwaWNhbGx5IHdpdGggc3RyaW5nIHZhbHVlcy4gJGNvdW50IGNhbiBhbHNvIGJlIGdpdmVuIGFzIGEgYGJvb2xlYW5gIHZhbHVlLCAkZXhwYW5kIGNhbiByZWN1cnNpdmVseVxuXHQgKiBiZSBnaXZlbiBhcyBhIG1hcCwgJGxldmVscyBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhIGBudW1iZXJgIHZhbHVlLCBhbmQgJHNlbGVjdCBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhblxuXHQgKiBhcnJheSAoYnV0IHdpdGhvdXQgbmF2aWdhdGlvbiBwYXRocykuIEFuIGVtcHR5IG1hcCBjYW4gYWxzbyBiZSBnaXZlbiBhcyBgbnVsbGAgb3IgYHRydWVgLiBTZWUgYWxzbyB7QGxpbmsgaHR0cHM6Ly91aTUuc2FwLmNvbS8jL3RvcGljLzFhYjRmNjJkZTZhYjQ2NzA5NmEyYTk4YjM2M2ExMzczIFBhcmFtZXRlcnN9LlxuXHQgKi9cblx0JGV4cGFuZD86IHN0cmluZyB8IG9iamVjdDtcblx0LyoqXG5cdCAqIEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb3IgYW4gYXJyYXkgb2YgaXRlbXMgd2hpY2ggZGV0ZXJtaW5lIHRoZSB2YWx1ZSBmb3IgdGhlIFwiNS4xLjMgU3lzdGVtIFF1ZXJ5IE9wdGlvblxuXHQgKiAkc2VsZWN0XCIuIFNpbmNlIDEuNzUuMCwgd2hlbiB1c2luZyB0aGUgXCJhdXRvRXhwYW5kU2VsZWN0XCIgbW9kZWwgcGFyYW1ldGVyIChzZWUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsI2NvbnN0cnVjdG9yfSksXG5cdCAqIHBhdGhzIHdpdGggbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGNhbiBiZSBpbmNsdWRlZCBhbmQgd2lsbCBjb250cmlidXRlIHRvIHRoZSBcIjUuMS4yIFN5c3RlbSBRdWVyeSBPcHRpb25cblx0ICogJGV4cGFuZFwiLlxuXHQgKi9cblx0JHNlbGVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIFdoZXRoZXIgYSBiaW5kaW5nIHJlbGF0aXZlIHRvIGFuIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gdXNlcyB0aGUgY2Fub25pY2FsIHBhdGggY29tcHV0ZWRcblx0ICogZnJvbSBpdHMgY29udGV4dCdzIHBhdGggZm9yIGRhdGEgc2VydmljZSByZXF1ZXN0czsgb25seSB0aGUgdmFsdWUgYHRydWVgIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHQkJGNhbm9uaWNhbFBhdGg/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yICoqcmVhZCoqIHJlcXVlc3RzIHRyaWdnZXJlZCBieSB0aGlzIGJpbmRpbmc7IGlmIG5vdCBzcGVjaWZpZWQsIGVpdGhlciB0aGVcblx0ICogcGFyZW50IGJpbmRpbmcncyBncm91cCBJRCAoaWYgdGhlIGJpbmRpbmcgaXMgcmVsYXRpdmUpIG9yIHRoZSBtb2RlbCdzIGdyb3VwIElEIGlzIHVzZWQsIHNlZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWwjY29uc3RydWN0b3J9LlxuXHQgKiBWYWxpZCB2YWx1ZXMgYXJlIGB1bmRlZmluZWRgLCAnJGF1dG8nLCAnJGF1dG8uKicsICckZGlyZWN0JyBvciBhcHBsaWNhdGlvbiBncm91cCBJRHMgYXMgc3BlY2lmaWVkIGluXG5cdCAqIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0uXG5cdCAqL1xuXHQkJGdyb3VwSWQ/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBGb3Igb3BlcmF0aW9uIGJpbmRpbmdzIG9ubHk6IFdoZXRoZXIgJGV4cGFuZCBhbmQgJHNlbGVjdCBmcm9tIHRoZSBwYXJlbnQgYmluZGluZyBhcmUgdXNlZCBpbiB0aGUgcmVxdWVzdFxuXHQgKiBzZW50IG9uIHtAbGluayAjZXhlY3V0ZX0uIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBiaW5kaW5nIG11c3Qgbm90IHNldCB0aGUgJGV4cGFuZCBpdHNlbGYsIHRoZSBvcGVyYXRpb25cblx0ICogbXVzdCBiZSBib3VuZCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgYW5kIHRoZSBiaW5kaW5nIHBhcmFtZXRlciBtdXN0IGJlbG9uZyB0byB0aGUgc2FtZSBlbnRpdHkgc2V0LlxuXHQgKi9cblx0JCRpbmhlcml0RXhwYW5kU2VsZWN0PzogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFdoZXRoZXIgdGhlIGJpbmRpbmcgYWx3YXlzIHVzZXMgYW4gb3duIHNlcnZpY2UgcmVxdWVzdCB0byByZWFkIGl0cyBkYXRhOyBvbmx5IHRoZSB2YWx1ZSBgdHJ1ZWAgaXMgYWxsb3dlZC5cblx0ICovXG5cdCQkb3duUmVxdWVzdD86IGJvb2xlYW47XG5cdC8qKlxuXHQgKiBXaGV0aGVyIGltcGxpY2l0IGxvYWRpbmcgb2Ygc2lkZSBlZmZlY3RzIHZpYSBQQVRDSCByZXF1ZXN0cyBpcyBzd2l0Y2hlZCBvZmY7IG9ubHkgdGhlIHZhbHVlIGB0cnVlYCBpc1xuXHQgKiBhbGxvd2VkLiBUaGlzIHNldHMgdGhlIHByZWZlcmVuY2UgXCJyZXR1cm49bWluaW1hbFwiIGFuZCByZXF1aXJlcyB0aGUgc2VydmljZSB0byByZXR1cm4gYW4gRVRhZyBoZWFkZXJcblx0ICogZm9yIFwiMjA0IE5vIENvbnRlbnRcIiByZXNwb25zZXMuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IGJpbmRpbmcgaXMgdXNlZC5cblx0ICovXG5cdCQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHQvKipcblx0ICogVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yICoqdXBkYXRlKiogcmVxdWVzdHMgdHJpZ2dlcmVkIGJ5IHRoaXMgYmluZGluZzsgaWYgbm90IHNwZWNpZmllZCwgZWl0aGVyIHRoZVxuXHQgKiBwYXJlbnQgYmluZGluZydzIHVwZGF0ZSBncm91cCBJRCAoaWYgdGhlIGJpbmRpbmcgaXMgcmVsYXRpdmUpIG9yIHRoZSBtb2RlbCdzIHVwZGF0ZSBncm91cCBJRCBpcyB1c2VkLFxuXHQgKiBzZWUge0BsaW5rIHNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsI2NvbnN0cnVjdG9yfS4gRm9yIHZhbGlkIHZhbHVlcywgc2VlIHBhcmFtZXRlciBcIiQkZ3JvdXBJZFwiLlxuXHQgKi9cblx0JCR1cGRhdGVHcm91cElkPzogc3RyaW5nO1xufTtcblxuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcblxuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb25zIGZvciB0aGUgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcbiAqIEBuYW1lc3BhY2VcbiAqIEBzaW5jZSAxLjU0LjBcbiAqL1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIGFjdGlvbiBuYW1lIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSBuYW1lIG9mIHRoZSBkcmFmdCBvcGVyYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aW9uTmFtZShvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdHNFbnRpdHlTZXRQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzRW50aXR5U2V0UGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC8ke3NPcGVyYXRpb259YCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb3BlcmF0aW9uIGNvbnRleHQgYmluZGluZyBmb3IgdGhlIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIChhY3Rpb24gb3IgZnVuY3Rpb24gaW1wb3J0KVxuICogQHBhcmFtIG9PcHRpb25zIE9wdGlvbnMgdG8gY3JlYXRlIHRoZSBvcGVyYXRpb24gY29udGV4dFxuICogQHJldHVybnMgVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogQ29udGV4dCwgc09wZXJhdGlvbjogc3RyaW5nLCBvT3B0aW9ucz86IEJpbmRDb250ZXh0UGFyYW1ldGVycyk6IE9EYXRhQ29udGV4dEJpbmRpbmcge1xuXHRjb25zdCBzT3BlcmF0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIHNPcGVyYXRpb24pO1xuXG5cdHJldHVybiBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGAke3NPcGVyYXRpb25OYW1lfSguLi4pYCwgb0NvbnRleHQsIG9PcHRpb25zKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb252ZXJ0ZWQgYWN0aW9uIGZvciBhIGdpdmVuIGNvbnRleHQgYW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBjb250ZXh0ICBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBhY3Rpb25cbiAqL1xuZnVuY3Rpb24gZ2V0Q29udmVydGVkQWN0aW9uKGNvbnRleHQ6IENvbnRleHQsIG9wZXJhdGlvbjogc3RyaW5nKTogRWRtQWN0aW9uIHwgdW5kZWZpbmVkIHtcblx0Y29uc3Qgb3BlcmF0aW9uTmFtZSA9IGdldEFjdGlvbk5hbWUoY29udGV4dCwgb3BlcmF0aW9uKTtcblx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdGFjdGlvblBhdGggPSBgJHttZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpfS8ke29wZXJhdGlvbk5hbWV9YCxcblx0XHRib3VuZEFjdGlvbiA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChhY3Rpb25QYXRoKSE7XG5cdHJldHVybiBjb252ZXJ0VHlwZXMobWV0YU1vZGVsKS5yZXNvbHZlUGF0aDxFZG1BY3Rpb24gfCB1bmRlZmluZWQ+KGJvdW5kQWN0aW9uLmdldFBhdGgoKSkudGFyZ2V0O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHJldHVybiB0eXBlIGZvciBhIGRyYWZ0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0gc09wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAqIEByZXR1cm5zIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZHJhZnQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJldHVyblR5cGUob0NvbnRleHQ6IENvbnRleHQsIHNPcGVyYXRpb246IHN0cmluZyk6IHVua25vd24ge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NFbnRpdHlTZXRQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290LyR7c09wZXJhdGlvbn0vJFJldHVyblR5cGVgKTtcbn1cbi8qKlxuICogQ2hlY2sgaWYgb3B0aW9uYWwgZHJhZnQgcHJlcGFyZSBhY3Rpb24gZXhpc3RzLlxuICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIFRydWUgaWYgYSBhIHByZXBhcmUgYWN0aW9uIGV4aXN0c1xuICovXG5mdW5jdGlvbiBoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdHJldHVybiAhIWdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBkcmFmdCBmcm9tIGFuIGFjdGl2ZSBkb2N1bWVudC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBiUHJlc2VydmVDaGFuZ2VzIElmIHRydWUgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIHByZXNlcnZlZCBhbmQgYW4gZXJyb3IgaXMgc2VudCBmcm9tIHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgZmFsc2UgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIG92ZXJ3cml0dGVuPC9saT5cbiAqIEBwYXJhbSBvVmlldyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXJcbiAqIEBwYXJhbSBncm91cElkIFRoZSBiYXRjaCBncm91cElkIGZvciBwb3N0IGNhbGwgb2YgZWRpdCBhY3Rpb25cbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciAgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG92ZXJ3cml0ZUNoYW5nZVxuICogQHJldHVybnMgUmVzb2x2ZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBvcGVyYXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdGJQcmVzZXJ2ZUNoYW5nZXM6IGJvb2xlYW4sXG5cdG9WaWV3OiBWaWV3LFxuXHRncm91cElkOiBzdHJpbmcsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0b3ZlcndyaXRlQ2hhbmdlPzogYm9vbGVhblxuKTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdC8vIElmIHRoZSBjb250ZXh0IGlzIG5vdCBsb2FkZWQgKGkuZS4gb0NvbnRleHQuZ2V0T2JqZWN0KCkgPT0gdW5kZWZpbmVkKSwgd2UgYXNzdW1lIGl0IGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjb250ZXh0XG5cdC8vIFRoaXMgc2l0dWF0aW9uIGhhcHBlbnMgd2hlbiBvcGVuaW5nIGFuIE9QIGRpcmVjdGx5IGluIGVkaXQgbW9kZSAoSW50ZXJuYWxSb3V0aW5nLl9iaW5kUGFnZUZvckVkaXQpXG5cdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGdldENvbnZlcnRlZEFjdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRpZiAoY29udmVydGVkQWN0aW9uKSB7XG5cdFx0Y29uc3Qgb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbihDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpLCBvQ29udGV4dC5nZXRNb2RlbCgpLCBjb252ZXJ0ZWRBY3Rpb24sIHtcblx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdGNvbnRleHRzOiBbb0NvbnRleHRdLFxuXHRcdFx0bGFiZWw6IGdldFJlc291cmNlTW9kZWwob1ZpZXcpLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpLFxuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlLCAkJHVwZGF0ZUdyb3VwSWQ6IFwiJGF1dG9cIiB9LFxuXHRcdFx0c2tpcE1lc3NhZ2VzOiB0cnVlLFxuXHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdGRpc2FibGVTaWRlRWZmZWN0czogdHJ1ZSxcblx0XHRcdFx0aWdub3JlRVRhZzogaXNFbXB0eU9iamVjdChvQ29udGV4dC5nZXRPYmplY3QoKSksIC8vIElmIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LCB3ZSBjYW4gaWdub3JlIHRoZSBFVGFnIChhcyBubyBwcmV2aW91cyBFVGFnIGlzIGF2YWlsYWJsZSlcblx0XHRcdFx0Z3JvdXBJZDogZ3JvdXBJZCxcblx0XHRcdFx0cmVwbGFjZVdpdGhSVkM6IG9Db250ZXh0LmdldEJpbmRpbmcoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSxcblx0XHRcdFx0ZGVmZXJyZWRTdWJtaXQ6IG92ZXJ3cml0ZUNoYW5nZSAhPT0gdHJ1ZSAvL1x0SWYgdGhlIGNvbnRleHQgaXMgY29taW5nIGZyb20gYSBsaXN0IGJpbmRpbmcgd2UgcGFzcyB0aGUgZmxhZyB0cnVlIHRvIHJlcGxhY2UgdGhlIGNvbnRleHQgYnkgdGhlIGFjdGl2ZSBvbmVcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvcGVyYXRpb24uc2V0RGVmYXVsdFBhcmFtZXRlcnNWYWx1ZXMoeyBQcmVzZXJ2ZUNoYW5nZXM6IGJQcmVzZXJ2ZUNoYW5nZXMgfSk7XG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9uLmV4ZWN1dGUoKTtcblx0XHRpZiAocmVzdWx0WzBdLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG5cdFx0XHRjb25zdCBtb2RpZmllZEVycm9yID0gbmV3IEVycm9yKHJlc3VsdFswXS5yZWFzb24ubWVzc2FnZSkgYXMgRXJyb3IgJiB7IHN0YXR1cz86IG51bWJlciB9O1xuXHRcdFx0Ly8gd2UgbmVlZCB0byBwZXJzaXN0IHRoZSBzdGF0dXMgaW4gdGhlIGVycm9yIHRvIGJlIGFibGUgdG8gc2hvdyB0aGUgbG9ja2VkIGJ5IGFub3RoZXIgdXNlciBkaWFsb2dcblx0XHRcdG1vZGlmaWVkRXJyb3Iuc3RhdHVzID0gcmVzdWx0WzBdLnJlYXNvbi5zdGF0dXM7XG5cdFx0XHR0aHJvdyBtb2RpZmllZEVycm9yO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0WzBdLnZhbHVlLnJldHVybmVkQ29udGV4dDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIGVkaXQgYWN0aW9uIG5vdCBmb3VuZFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkcmFmdC4gVGhlIFByZXBhcmVBY3Rpb24gaXMgdHJpZ2dlcmVkIGlmIHRoZSBtZXNzYWdlcyBhcmUgYW5ub3RhdGVkIGFuZCBlbnRpdHlTZXQgZ2V0cyBhIFByZXBhcmF0aW9uQWN0aW9uIGFubm90YXRlZC5cbiAqIElmIHRoZSBvcGVyYXRpb24gc3VjY2VlZHMgYW5kIG9wZXJhdGlvbiBkb2Vzbid0IGdldCBhIHJldHVybiB0eXBlIChSQVAgc3lzdGVtKSB0aGUgbWVzc2FnZXMgYXJlIHJlcXVlc3RlZC5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBQcmVwYXJlQWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIGlnbm9yZUVUYWcgSWYgc2V0IHRvIHRydWUsIEVUYWdzIGFyZSBpZ25vcmVkIHdoZW4gZXhlY3V0aW5nIHRoZSBhY3Rpb25cbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJuc1xuICogIC0gdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvbiBpZiB0aGUgYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZFxuICogIC0gdm9pZCBpZiB0aGUgYWN0aW9uIGhhcyBmYWlsZWRcbiAqICAtIHVuZGVmaW5lZCBpZiB0aGUgYWN0aW9uIGhhcyBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgdGhlIHByZXJlcXVpc2l0ZXMgYXJlIG5vdCBtZXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbihcblx0Y29udGV4dDogQ29udGV4dCxcblx0YXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGlnbm9yZUVUYWc6IGJvb2xlYW5cbik6IFByb21pc2U8T0RhdGFDb250ZXh0QmluZGluZyB8IHZvaWQgfCB1bmRlZmluZWQ+IHtcblx0aWYgKE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIGNvbnRleHQuZ2V0UGF0aCgpKSAmJiBkcmFmdC5oYXNQcmVwYXJlQWN0aW9uKGNvbnRleHQpKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghaWdub3JlRVRhZyAmJiAhY29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGVudGl0eSByZWxhdGVkIHRvIHRoZSBjb250ZXh0IHRvIHBvc3QgdGhlIGFjdGlvbiB3aXRoIHRoZSBJZi1NYXRjaCBoZWFkZXJcblx0XHRcdFx0Ly8gU29tZSB0cmlnZ2VycyAoZW50ZXIgb24gdGFibGUpIGNhbiBnZW5lcmF0ZSBhIHByb21pc2UgaW4gdGhlIGNhY2hlIHNvIGlmIHdlIGRvbid0IHdhaXQgZm9yIHRoZSBlbnRpdHlcblx0XHRcdFx0Ly8gdGhlIFBPU1Qgd2lsbCBiZSBzZW50IHdpdGhvdXQgSWYtTWF0Y2ggYW5kIHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3Igb24gYmFja2VuZCBzaWRlLlxuXHRcdFx0XHRhd2FpdCAoY29udGV4dC5nZXRCaW5kaW5nKCkgYXMgT0RhdGFDb250ZXh0QmluZGluZykucmVxdWVzdE9iamVjdChcIlwiKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9wZXJhdGlvbiA9IGRyYWZ0LmV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKGNvbnRleHQsIGNvbnRleHQuZ2V0VXBkYXRlR3JvdXBJZCgpLCB0cnVlLCBpZ25vcmVFVGFnKTtcblx0XHRcdGlmICghZ2V0UmV0dXJuVHlwZShjb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSkpIHtcblx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKGNvbnRleHQsIGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhd2FpdCBvcGVyYXRpb247XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuICogQHBhcmFtIFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEBwYXJhbSBbb1ByZXBhcmVQcm9taXNlXSBUaGUgcHJvbWlzZSBvZiB0aGUgcHJlcGFyZSBhY3Rpb25cbiAqIEBwYXJhbSBbcmVzb3VyY2VNb2RlbF0gVGhlIHJlc291cmNlIG1vZGVsIHRvIGxvYWQgdGV4dCByZXNvdXJjZXNcbiAqIEByZXR1cm5zIFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24oXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0c0dyb3VwSWQ/OiBzdHJpbmcsXG5cdG9QcmVwYXJlUHJvbWlzZT86IFByb21pc2U8dm9pZCB8IE9EYXRhQ29udGV4dEJpbmRpbmc+LFxuXHRyZXNvdXJjZU1vZGVsPzogUmVzb3VyY2VNb2RlbCxcblx0aXNTdGFuZGFyZFNhdmU/OiBib29sZWFuIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0Y29uc3QgYkhhc1ByZXBhcmVBY3Rpb24gPSBkcmFmdC5oYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KTtcblx0Ly8gQWNjb3JkaW5nIHRvIHRoZSBkcmFmdCBzcGVjIGlmIHRoZSBzZXJ2aWNlIGNvbnRhaW5zIGEgcHJlcGFyZSBhY3Rpb24gYW5kIHdlIHRyaWdnZXIgYm90aCBwcmVwYXJlIGFuZFxuXHQvLyBhY3RpdmF0ZSBpbiBvbmUgJGJhdGNoIHRoZSBhY3RpdmF0ZSBhY3Rpb24gaXMgY2FsbGVkIHdpdGggaUYtTWF0Y2g9KlxuXHRjb25zdCBiSWdub3JlRXRhZyA9IGJIYXNQcmVwYXJlQWN0aW9uO1xuXHRsZXQgb3BlcmF0aW9uOiBPcGVyYXRpb24gfCB1bmRlZmluZWQ7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IGNvbnZlcnRlZEFjdGlvbiA9IGdldENvbnZlcnRlZEFjdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkFDVElWQVRJT04pO1xuXHRcdGNvbnN0IGxhYmVsID0gaXNTdGFuZGFyZFNhdmUgPyByZXNvdXJjZU1vZGVsPy5nZXRUZXh0KFwiVF9PUF9PQkpFQ1RfUEFHRV9TQVZFXCIpIDogcmVzb3VyY2VNb2RlbD8uZ2V0VGV4dChcIkNfT1BfT0JKRUNUX1BBR0VfU0FWRVwiKTtcblx0XHRpZiAoY29udmVydGVkQWN0aW9uKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKG9BcHBDb21wb25lbnQsIG9Db250ZXh0LmdldE1vZGVsKCksIGNvbnZlcnRlZEFjdGlvbiwge1xuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRjb250ZXh0czogW29Db250ZXh0XSxcblx0XHRcdFx0XHRsYWJlbDogbGFiZWwsXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IHsgJCRpbmhlcml0RXhwYW5kU2VsZWN0OiB0cnVlIH0sXG5cdFx0XHRcdFx0c2tpcE1lc3NhZ2VzOiB0cnVlLFxuXHRcdFx0XHRcdG9EYXRhUHJvcGVydGllczoge1xuXHRcdFx0XHRcdFx0ZGlzYWJsZVNpZGVFZmZlY3RzOiB0cnVlLFxuXHRcdFx0XHRcdFx0Z3JvdXBJZDogc0dyb3VwSWQsXG5cdFx0XHRcdFx0XHRpZ25vcmVFVGFnOiBiSWdub3JlRXRhZyxcblx0XHRcdFx0XHRcdHJlcGxhY2VXaXRoUlZDOiBvQ29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIilcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBvcGVyYXRpb24uZXhlY3V0ZSgpO1xuXHRcdFx0XHRpZiAocmVzdWx0WzBdLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHJlc3VsdFswXS5yZWFzb24pO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJlc3VsdFswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0WzBdLnZhbHVlLnJldHVybmVkQ29udGV4dDtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0aWYgKGJIYXNQcmVwYXJlQWN0aW9uKSB7XG5cdFx0XHRcdFx0Ly8gZGVzdHJveSB0aGUgb3BlcmF0aW9uIGJpbmRpbmdzIHRvIGF2b2lkIGFkZGl0aW9uYWwgbWVzc2FnZSByZXF1ZXN0cyBzZW50IGJ5IHRoZSBtb2RlbFxuXHRcdFx0XHRcdGNvbnN0IHByZXBhcmVPcGVyYXRpb24gPSBhd2FpdCBvUHJlcGFyZVByb21pc2U7XG5cdFx0XHRcdFx0cHJlcGFyZU9wZXJhdGlvbj8uZGVzdHJveSgpO1xuXHRcdFx0XHRcdG9wZXJhdGlvbj8uY2xlYXIoKTtcblxuXHRcdFx0XHRcdGNvbnN0IGFjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSksXG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSxcblx0XHRcdFx0XHRcdG9CaW5kaW5nUGFyYW1ldGVycyA9IG9TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhhY3Rpb25OYW1lLCBvQ29udGV4dCksXG5cdFx0XHRcdFx0XHRhVGFyZ2V0UGF0aHMgPSBvQmluZGluZ1BhcmFtZXRlcnMgJiYgb0JpbmRpbmdQYXJhbWV0ZXJzLnBhdGhFeHByZXNzaW9ucztcblx0XHRcdFx0XHRpZiAoYVRhcmdldFBhdGhzICYmIGFUYXJnZXRQYXRocy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0UGF0aHMsIG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1wiLCBvRXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgcmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlLCB0cnVlKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lc3NhZ2VzXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYWN0aXZhdGlvbiBhY3Rpb24gbm90IGZvdW5kXCIpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYWN0aXZhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIEdldHMgdGhlIHN1cHBvcnRlZCBtZXNzYWdlIHByb3BlcnR5IHBhdGggb24gdGhlIFByZXBhcmVBY3Rpb24gZm9yIGEgY29udGV4dC5cbiAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgUGF0aCB0byB0aGUgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUoY29udGV4dDogQ29udGV4dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdC8vIElmIHRoZXJlIGlzIG5vIHJldHVybiBwYXJhbWV0ZXIsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXF1ZXN0IE1lc3NhZ2VzLlxuXHQvLyBSQVAgZHJhZnQgcHJlcGFyZSBoYXMgbm8gcmV0dXJuIHBhcmFtZXRlclxuXHRyZXR1cm4gZ2V0UmV0dXJuVHlwZShjb250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSkgPyBnZXRNZXNzYWdlUGF0aEZvckNvbnRleHQoY29udGV4dCkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc3VwcG9ydGVkIG1lc3NhZ2UgcHJvcGVydHkgcGF0aCBmb3IgYSBjb250ZXh0LlxuICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBQYXRoIHRvIHRoZSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VQYXRoRm9yQ29udGV4dChjb250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgbWV0YUNvbnRleHQgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRjb25zdCBjb252ZXJ0ZWRDb250ZXh0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KTtcblx0Y29uc3QgbWVzc2FnZXMgPSBjb252ZXJ0ZWRDb250ZXh0LnRhcmdldEVudGl0eVR5cGUuYW5ub3RhdGlvbnMuQ29tbW9uPy5NZXNzYWdlcztcblx0cmV0dXJuIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKG1lc3NhZ2VzKSA/IG1lc3NhZ2VzLnBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRXhlY3V0ZSBhIHByZXBhcmF0aW9uIGFjdGlvbi5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBncm91cElkIFRoZSBvcHRpb25hbCBiYXRjaCBncm91cCBpbiB3aGljaCB3ZSB3YW50IHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIGJNZXNzYWdlcyBJZiBzZXQgdG8gdHJ1ZSwgdGhlIFBSRVBBUkUgYWN0aW9uIHJldHJpZXZlcyBTQVBfTWVzc2FnZXNcbiAqIEBwYXJhbSBpZ25vcmVFVGFnIElmIHNldCB0byB0cnVlLCBFVGFnIGluZm9ybWF0aW9uIGlzIGlnbm9yZWQgd2hlbiB0aGUgYWN0aW9uIGlzIGV4ZWN1dGVkXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnRQcmVwYXJhdGlvbkFjdGlvbihcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdGdyb3VwSWQ/OiBzdHJpbmcsXG5cdGJNZXNzYWdlcz86IGJvb2xlYW4sXG5cdGlnbm9yZUVUYWc/OiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQgfCBPRGF0YUNvbnRleHRCaW5kaW5nPiB7XG5cdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBiTWVzc2FnZXMgPyBnZXRNZXNzYWdlUGF0aEZvclByZXBhcmUob0NvbnRleHQpIDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9PcGVyYXRpb24gPSBjcmVhdGVPcGVyYXRpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5QUkVQQVJFLCBzTWVzc2FnZXNQYXRoID8geyAkc2VsZWN0OiBzTWVzc2FnZXNQYXRoIH0gOiB1bmRlZmluZWQpO1xuXG5cdFx0Ly8gVE9ETzogc2lkZSBlZmZlY3RzIHF1YWxpZmllciBzaGFsbCBiZSBldmVuIGRlcHJlY2F0ZWQgdG8gYmUgY2hlY2tlZFxuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiU2lkZUVmZmVjdHNRdWFsaWZpZXJcIiwgXCJcIik7XG5cblx0XHRjb25zdCBzR3JvdXBJZCA9IGdyb3VwSWQgfHwgb09wZXJhdGlvbi5nZXRHcm91cElkKCk7XG5cdFx0cmV0dXJuIG9PcGVyYXRpb25cblx0XHRcdC5pbnZva2Uoc0dyb3VwSWQsIGlnbm9yZUVUYWcpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBvT3BlcmF0aW9uO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uXCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRyZXR1cm4gb09wZXJhdGlvbjtcblx0XHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBwcmVwYXJhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFJlcXVlc3RzIHRoZSBtZXNzYWdlcyBpZiBhbm5vdGF0ZWQgZm9yIGEgZ2l2ZW4gY29udGV4dC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgbWVzc2FnZXMgc2hhbGwgYmUgcmVxdWVzdGVkXG4gKiBAcGFyYW0gb1NpZGVFZmZlY3RzU2VydmljZSBTZXJ2aWNlIGZvciB0aGUgU2lkZUVmZmVjdHMgb24gU0FQIEZpb3JpIGVsZW1lbnRzXG4gKiBAcGFyYW0gcmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIElmIHNldCB0byB0cnVlLCB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFyZSByZW1vdmVkIGlmIHN0YXRlIG1lc3NhZ2VzIGV4aXN0XG4gKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgbWVzc2FnZXMgd2VyZSByZXF1ZXN0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdE1lc3NhZ2VzKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0b1NpZGVFZmZlY3RzU2VydmljZTogU2lkZUVmZmVjdHNTZXJ2aWNlLFxuXHRyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMgPSBmYWxzZVxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGNvbnN0IHNNZXNzYWdlc1BhdGggPSBNb2RlbEhlbHBlci5nZXRNZXNzYWdlc1BhdGgob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRhd2FpdCBvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbc01lc3NhZ2VzUGF0aF0sIG9Db250ZXh0KTtcblx0XHRpZiAocmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKSB7XG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgb0NvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0aWYgKGRhdGFbc01lc3NhZ2VzUGF0aF0ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHQvL2lmIHN0YXRlIG1lc3NhZ2VzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgUFJFUEFSQVRJT04gYWN0aW9uLCB0aGVuIHByZXZpb3VzIHRyYW5zaXRpb24gbWVzc2FnZXMgYXJlIHJlbW92ZWRcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybjtcbn1cbi8qKlxuICogRXhlY3V0ZXMgZGlzY2FyZCBvZiBhIGRyYWZ0IGZ1bmN0aW9uIHVzaW5nIEhUVFAgUG9zdC5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBBcHAgQ29tcG9uZW50XG4gKiBAcGFyYW0gYkVuYWJsZVN0cmljdEhhbmRsaW5nXG4gKiBAcmV0dXJucyBSZXNvbHZlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uKFxuXHRvQ29udGV4dDogQ29udGV4dCxcblx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdGJFbmFibGVTdHJpY3RIYW5kbGluZz86IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBjb252ZXJ0ZWRBY3Rpb24gPSBnZXRDb252ZXJ0ZWRBY3Rpb24ob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKTtcblx0XHRpZiAoY29udmVydGVkQWN0aW9uKSB7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBuZXcgT3BlcmF0aW9uKG9BcHBDb21wb25lbnQsIG9Db250ZXh0LmdldE1vZGVsKCksIGNvbnZlcnRlZEFjdGlvbiwge1xuXHRcdFx0XHRtZXNzYWdlSGFuZGxlcjogbWVzc2FnZUhhbmRsZXIsXG5cdFx0XHRcdGxhYmVsOiBnZXRSZXNvdXJjZU1vZGVsKG9BcHBDb21wb25lbnQpPy5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9CVVRUT05cIikgfHwgXCJcIixcblx0XHRcdFx0Y29udGV4dHM6IFtvQ29udGV4dF0sXG5cdFx0XHRcdHNraXBNZXNzYWdlczogdHJ1ZSxcblx0XHRcdFx0b0RhdGFQcm9wZXJ0aWVzOiB7XG5cdFx0XHRcdFx0ZGlzYWJsZVNpZGVFZmZlY3RzOiB0cnVlLFxuXHRcdFx0XHRcdGRpc2FibGVTdHJpY3RIYW5kbGluZzogIWJFbmFibGVTdHJpY3RIYW5kbGluZyxcblx0XHRcdFx0XHRpZ25vcmVFVGFnOiBpc0VtcHR5T2JqZWN0KG9Db250ZXh0LmdldE9iamVjdCgpKSwgLy8gSWYgdGhlIGNvbnRleHQgaGFzIG5vdCBiZWVuIGxvYWRlZCB5ZXQsIHdlIGNhbiBpZ25vcmUgdGhlIEVUYWcgKGFzIG5vIHByZXZpb3VzIEVUYWcgaXMgYXZhaWxhYmxlKVxuXHRcdFx0XHRcdGdyb3VwSWQ6IFwiZGlyZWN0XCIsXG5cdFx0XHRcdFx0cmVwbGFjZVdpdGhSVkM6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRkZWZlcnJlZFN1Ym1pdDogZmFsc2Vcblx0XHRcdFx0fVxuXHRcdFx0fSkuZXhlY3V0ZSgpO1xuXHRcdFx0aWYgKHJlc3VsdFswXS5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IocmVzdWx0WzBdLnJlYXNvbik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBub3QgZm91bmRcIik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aCBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRoc1xuICogYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cbiAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3QgcGFnZVxuICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgY29udGV4dCBpbmZvIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG4gKiBAcGFyYW0gZ3JvdXBJZFxuICogQHBhcmFtIGJpbmRpbmdQYXJhbWV0ZXJzIE9wdGlvbmFsIGJpbmRpbmcgcGFyYW1ldGVycyB3aGVuIGNyZWF0aW5nIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0gY3JlYXRlS2VlcEFsaXZlQ29udGV4dCBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbnRleHQgd2lsbCBiZSBjcmVhdGVkIGFzIGEga2VlcC1hbGl2ZSBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRyb290Q29udGV4dEluZm8/OiBSb290Q29udGV4dEluZm8sXG5cdGdyb3VwSWQ/OiBzdHJpbmcsXG5cdGJpbmRpbmdQYXJhbWV0ZXJzPzogb2JqZWN0LFxuXHRjcmVhdGVLZWVwQWxpdmVDb250ZXh0ID0gZmFsc2Vcbik6IFByb21pc2U8U2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkPiB7XG5cdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdExvZy5lcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0fVxuXG5cdGlmIChcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSAmJlxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZVxuXHQpIHtcblx0XHQvLyBXZSBhbHJlYWR5IGtub3cgdGhlIHNpYmxpbmcgZm9yIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IGRvZXNuJ3QgZXhpc3Rcblx0XHQvLyAtLT4gTm8gbmVlZCB0byBjaGVjayBjYW5vbmljYWwgcGF0aHMgZXRjLi4uXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdHRyeSB7XG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMS4gRmluZCBhbGwgc2VnbWVudHMgYmV0d2VlbiB0aGUgcm9vdCBvYmplY3QgYW5kIHRoZSBzdWItb2JqZWN0XG5cdFx0Ly8gRXhhbXBsZTogZm9yIHJvb3QgPSAvUGFyYW0oYWEpL0VudGl0eShiYikgYW5kIHJpZ2h0TW9zdCA9IC9QYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9fU3ViTmF2KGRkKVxuXHRcdC8vIC0tLT4gW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cblx0XHQvLyBGaW5kIGFsbCBzZWdtZW50cyBpbiB0aGUgcmlnaHRtb3N0IHBhdGhcblx0XHRjb25zdCBhZGRpdGlvbmFsUGF0aCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5yZXBsYWNlKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCksIFwiXCIpO1xuXHRcdGNvbnN0IHNlZ21lbnRzID0gYWRkaXRpb25hbFBhdGggPyBhZGRpdGlvbmFsUGF0aC5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpIDogW107XG5cdFx0Ly8gRmlyc3Qgc2VnbWVudCBpcyBhbHdheXMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgcm9vdCBvYmplY3QsIHdoaWNoIGNhbiBjb250YWluICcvJyBpbiBjYXNlIG9mIGEgcGFyYW1ldHJpemVkIGVudGl0eVxuXHRcdHNlZ21lbnRzLnVuc2hpZnQocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXG5cdFx0Ly8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdFx0Ly8gMi4gUmVxdWVzdCBjYW5vbmljYWwgcGF0aHMgb2YgdGhlIHNpYmxpbmcgZW50aXR5IGZvciBlYWNoIHNlZ21lbnRcblx0XHQvLyBFeGFtcGxlOiBmb3IgW1wiUGFyYW0oYWEpL0VudGl0eShiYilcIiwgXCJfTmF2KGNjKVwiLCBcIl9TdWJOYXYoZGQpXCJdXG5cdFx0Ly8gLS0+IHJlcXVlc3QgY2Fub25pY2FsIHBhdGhzIGZvciBcIlBhcmFtKGFhKS9FbnRpdHkoYmIpL1NpYmxpbmdFbnRpdHlcIiwgXCJQYXJhbShhYSkvRW50aXR5KGJiKS9fTmF2KGNjKS9TaWJsaW5nRW50aXR5XCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYikvX05hdihjYykvX1N1Yk5hdihkZCkvU2libGluZ0VudGl0eVwiXG5cdFx0Y29uc3Qgb2xkUGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0Y29uc3QgbmV3UGF0aHM6IHN0cmluZ1tdID0gW107XG5cdFx0bGV0IGN1cnJlbnRQYXRoID0gXCJcIjtcblxuXHRcdC8vIENvbXB1dGluZyBzaWJsaW5nIGVudGl0eSBvZiByb290IG9mIHRoZSBkcmFmdCBjb250ZXh0IGlzIG5vdCByZXF1aXJlZCBpZiB0aGUgY29udGV4dCBpcyBhbHJlYWR5IGluIHRoZSBzdWItT1Bcblx0XHQvLyBFeGFtcGxlOiBFZGl0IGluIFN1Yi1PUCB3aGVyZSBuZXcgY29udGV4dCBpcyBhbHJlYWR5IGF2YWlsYWJsZVxuXHRcdGNvbnN0IHBhdGhzID0gWy4uLnNlZ21lbnRzXTtcblx0XHRpZiAocm9vdENvbnRleHRJbmZvPy5yb290U2libGluZ1BhdGhQcm9taXNlKSB7XG5cdFx0XHRwYXRocy5zaGlmdCgpO1xuXHRcdFx0Y3VycmVudFBhdGggPSBcIi9cIiArIHJvb3RDdXJyZW50Q29udGV4dD8uZ2V0UGF0aCgpPy5zdWJzdHJpbmcoMSk7XG5cdFx0fVxuXHRcdGNvbnN0IGNhbm9uaWNhbFBhdGhQcm9taXNlcyA9IHBhdGhzLm1hcChhc3luYyAoc2VnbWVudCkgPT4ge1xuXHRcdFx0Y3VycmVudFBhdGggKz0gYC8ke3NlZ21lbnR9YDtcblx0XHRcdG9sZFBhdGhzLnVuc2hpZnQoY3VycmVudFBhdGgpO1xuXHRcdFx0aWYgKGN1cnJlbnRQYXRoLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsXG5cdFx0XHRcdFx0LmJpbmRDb250ZXh0KGAke2N1cnJlbnRQYXRofS9TaWJsaW5nRW50aXR5YCwgdW5kZWZpbmVkLCBncm91cElkID8geyAkJGdyb3VwSWQ6IGdyb3VwSWQgfSA6IHVuZGVmaW5lZClcblx0XHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdHJldHVybiBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpOyAvLyAxLTEgcmVsYXRpb25cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHRcdC8vIDMuIFJlY29uc3RydWN0IHRoZSBmdWxsIHBhdGhzIGZyb20gY2Fub25pY2FsIHBhdGhzIChmb3IgcGF0aCBtYXBwaW5nKVxuXHRcdC8vIEV4YW1wbGU6IGZvciBjYW5vbmljYWwgcGF0aHMgXCIvUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKVwiLCBcIi9FbnRpdHkyKGNjLXNpYmxpbmcpXCIsIFwiL0VudGl0eTMoZGQtc2libGluZylcIlxuXHRcdC8vIC0tPiBbXCJQYXJhbShhYSkvRW50aXR5KGJiLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpXCIsIFwiUGFyYW0oYWEpL0VudGl0eShiYi1zaWJsaW5nKS9fTmF2KGNjLXNpYmxpbmcpL19TdWJOYXYoZGQtc2libGluZylcIl1cblx0XHRjb25zdCBjYW5vbmljYWxQYXRocyA9IChhd2FpdCBQcm9taXNlLmFsbChjYW5vbmljYWxQYXRoUHJvbWlzZXMpKSBhcyBzdHJpbmdbXTtcblxuXHRcdC8vIFdvcmthcm91bmQgKHRlbXBvcmFyeSA/KTogd2hlbiB0aGUgc2libGluZyBkb2Vzbid0IGV4aXN0LCByZXF1ZXN0Q2Fub25pY2FsUGF0aCByZXR1cm5zIHRoZSBzYW1lIHBhdGhcblx0XHRpZiAoXG5cdFx0XHRjYW5vbmljYWxQYXRocy5zb21lKChwYXRoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBwYXRoICYmIHBhdGguZW5kc1dpdGgoXCIvU2libGluZ0VudGl0eVwiKTtcblx0XHRcdH0pXG5cdFx0KSB7XG5cdFx0XHQvLyBBdCBsZWFzdCBvbmUgc2libGluZyBlbnRpdHkgZG9lc24ndCBleGlzdFxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAocm9vdENvbnRleHRJbmZvPy5yb290U2libGluZ1BhdGhQcm9taXNlKSB7XG5cdFx0XHRjb25zdCByb290U2libGluZ1BhdGggPSAoYXdhaXQgcm9vdENvbnRleHRJbmZvLnJvb3RTaWJsaW5nUGF0aFByb21pc2UpPy5nZXRQYXRoKCkgYXMgc3RyaW5nO1xuXHRcdFx0Y2Fub25pY2FsUGF0aHMudW5zaGlmdChyb290U2libGluZ1BhdGgpO1xuXHRcdFx0b2xkUGF0aHMucHVzaChyb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHR9XG5cdFx0bGV0IHNpYmxpbmdQYXRoID0gXCJcIjtcblx0XHRjYW5vbmljYWxQYXRocy5mb3JFYWNoKChjYW5vbmljYWxQYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0aWYgKGluZGV4ICE9PSAwKSB7XG5cdFx0XHRcdGlmIChzZWdtZW50c1tpbmRleF0uZW5kc1dpdGgoXCIpXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvbiA9IHNlZ21lbnRzW2luZGV4XS5yZXBsYWNlKC9cXCguKiQvLCBcIlwiKTsgLy8gS2VlcCBvbmx5IG5hdmlnYXRpb24gbmFtZSBmcm9tIHRoZSBzZWdtZW50LCBpLmUuIGFhYSh4eHgpIC0tPiBhYWFcblx0XHRcdFx0XHRjb25zdCBrZXlzID0gY2Fub25pY2FsUGF0aC5yZXBsYWNlKC8uKlxcKC8sIFwiKFwiKTsgLy8gS2VlcCBvbmx5IHRoZSBrZXlzIGZyb20gdGhlIGNhbm9uaWNhbCBwYXRoLCBpLmUuIGFhYSh4eHgpIC0tPiAoeHh4KVxuXHRcdFx0XHRcdHNpYmxpbmdQYXRoICs9IGAvJHtuYXZpZ2F0aW9ufSR7a2V5c31gO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNpYmxpbmdQYXRoICs9IGAvJHtzZWdtZW50c1tpbmRleF19YDsgLy8gMS0xIHJlbGF0aW9uXG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNpYmxpbmdQYXRoID0gY2Fub25pY2FsUGF0aDsgLy8gVG8gbWFuYWdlIHBhcmFtZXRyaXplZCBlbnRpdGllc1xuXHRcdFx0fVxuXHRcdFx0bmV3UGF0aHMudW5zaGlmdChzaWJsaW5nUGF0aCk7XG5cdFx0fSk7XG5cblx0XHRsZXQgcGFyYW1ldGVyczogeyAkc2VsZWN0Pzogc3RyaW5nOyAkJGdyb3VwSWQ/OiBzdHJpbmcgfTtcblx0XHRjb25zdCBtZXNzYWdlUGF0aCA9IGdldE1lc3NhZ2VQYXRoRm9yQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dCk7XG5cdFx0aWYgKGNyZWF0ZUtlZXBBbGl2ZUNvbnRleHQpIHtcblx0XHRcdHBhcmFtZXRlcnMgPSB7ICQkZ3JvdXBJZDogXCIkYXV0by5Xb3JrZXJzXCIgfTsgLy8gV2UgbmVlZCB0byB1c2UgdGhlIHNhbWUgZ3JvdXAgSUQgYXMgZm9yIHRoZSBwYXJlbnQgbGlzdCBiaW5kaW5nXG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMgPSBiaW5kaW5nUGFyYW1ldGVycyA/PyB7fTtcblx0XHRcdGlmIChtZXNzYWdlUGF0aCkge1xuXHRcdFx0XHRpZiAocGFyYW1ldGVycy4kc2VsZWN0KSB7XG5cdFx0XHRcdFx0cGFyYW1ldGVycy4kc2VsZWN0ICs9IGAsJHttZXNzYWdlUGF0aH1gO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHBhcmFtZXRlcnMuJHNlbGVjdCA9IG1lc3NhZ2VQYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwYXJhbWV0ZXJzLiQkZ3JvdXBJZCA9IFwiJGF1dG8uSGVyb2VzXCI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IGNyZWF0ZUtlZXBBbGl2ZUNvbnRleHRcblx0XHRcdFx0PyBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KHNpYmxpbmdQYXRoLCAhIW1lc3NhZ2VQYXRoLCBwYXJhbWV0ZXJzKVxuXHRcdFx0XHQ6IG1vZGVsLmJpbmRDb250ZXh0KHNpYmxpbmdQYXRoLCB1bmRlZmluZWQsIHBhcmFtZXRlcnMpLmdldEJvdW5kQ29udGV4dCgpLCAvLyBDcmVhdGUgdGhlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHQgZnJvbSBpdHMgcGF0aFxuXHRcdFx0cGF0aE1hcHBpbmc6IG9sZFBhdGhzLm1hcCgob2xkUGF0aCwgaW5kZXgpID0+IHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRvbGRQYXRoLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld1BhdGhzW2luZGV4XVxuXHRcdFx0XHR9O1xuXHRcdFx0fSlcblx0XHR9O1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIEEgY2Fub25pY2FsIHBhdGggY291bGRuJ3QgYmUgcmVzb2x2ZWQgKGJlY2F1c2UgYSBzaWJsaW5nIGRvZXNuJ3QgZXhpc3QpXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmcm9tIGFuIGV4aXN0aW5nIGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjb3Jlb2dyYXBoeSBkZWZpbmVkLlxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm9WaWV3XSBUaGUgdmlld1xuICogQHBhcmFtIFttUGFyYW1ldGVycy5iUHJlc2VydmVDaGFuZ2VzXSBQcmVzZXJ2ZSBjaGFuZ2VzIG9mIGFuIGV4aXN0aW5nIGRyYWZ0IG9mIGFub3RoZXIgdXNlclxuICogQHBhcmFtIGdyb3VwSWQgVGhlIGJhdGNoIGdyb3VwSWQgZm9yIHBvc3QgY2FsbCBvZiBlZGl0IGFjdGlvblxuICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIFRoZSBtZXNzYWdlIGhhbmRsZXIgY29udHJvbGxlciBleHRlbnNpb25cbiAqIEBwYXJhbSB0cmFuc2FjdGlvbkRldGFpbHMgT3B0aW9uYWwgb2JqZWN0IHRvIHJldHVybiBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgaG93IHRoZSB0cmFuc2FjdGlvbiB3YXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB0cmFuc2FjdGlvbkRldGFpbHMuZXhpc3RpbmdEcmFmdFJldXNlZCBBbiBleGlzdGluZyBkcmFmdCB3YXMgcmV0dXJuZWQsIGluc3RlYWQgb2YgcmV0dXJuaW5nIGEgbmV3IG9uZVxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChcblx0b0NvbnRleHQ6IENvbnRleHQsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0bVBhcmFtZXRlcnM6IHtcblx0XHRvVmlldzogRkVWaWV3O1xuXHRcdGJQcmVzZXJ2ZUNoYW5nZXM/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHR9LFxuXHRncm91cElkOiBzdHJpbmcsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0dHJhbnNhY3Rpb25EZXRhaWxzPzoge1xuXHRcdGV4aXN0aW5nRHJhZnRSZXVzZWQ/OiBib29sZWFuO1xuXHR9XG4pOiBQcm9taXNlPENvbnRleHQgfCB1bmRlZmluZWQ+IHtcblx0Y29uc3QgbVBhcmFtID0gbVBhcmFtZXRlcnMgfHwge30sXG5cdFx0YlJ1blByZXNlcnZlQ2hhbmdlc0Zsb3cgPVxuXHRcdFx0dHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcInVuZGVmaW5lZFwiIHx8ICh0eXBlb2YgbVBhcmFtLmJQcmVzZXJ2ZUNoYW5nZXMgPT09IFwiYm9vbGVhblwiICYmIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzKTsgLy9kZWZhdWx0IHRydWVcblxuXHQvKipcblx0ICogT3ZlcndyaXRlIHRoZSBleGlzdGluZyBjaGFuZ2UuXG5cdCAqIEBwYXJhbSByZXNwb25zZSBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnQgb3IgdGhlIGVycm9yIHJldHJpZXZlZFxuXHQgKiBAcmV0dXJucyBSZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB7QGxpbmsgc2FwLmZlLmNvcmUuYWN0aW9ucyNleGVjdXRlRHJhZnRFZGl0QWN0aW9ufVxuXHQgKi9cblx0YXN5bmMgZnVuY3Rpb24gb3ZlcndyaXRlQ2hhbmdlKHJlc3BvbnNlOiBDb250ZXh0IHwgQ29udGV4dEVycm9yVHlwZSk6IFByb21pc2U8Q29udGV4dCB8IENvbnRleHRFcnJvclR5cGUgfCB1bmRlZmluZWQ+IHtcblx0XHQvL092ZXJ3cml0ZSBleGlzdGluZyBjaGFuZ2VzXG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbChtUGFyYW1ldGVycy5vVmlldyk7XG5cdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhd2FpdCBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdC8vIHJlbW92ZSBhbGwgdW5ib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIGFzIHdlIHNob3cgYSBzcGVjaWFsIGRpYWxvZ1xuXHRcdFx0bWVzc2FnZUhhbmRsaW5nLnJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdGxldCBzSW5mbyA9IGRyYWZ0QWRtaW5EYXRhLkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkluUHJvY2Vzc0J5VXNlcjtcblx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBtUGFyYW1ldGVycy5vVmlldy5nZXRWaWV3RGF0YSgpLmVudGl0eVNldDtcblx0XHRcdGlmIChzSW5mbykge1xuXHRcdFx0XHRjb25zdCBzTG9ja2VkQnlVc2VyTXNnID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9MT0NLRURfQllfVVNFUlwiLCBzSW5mbywgc0VudGl0eVNldCk7XG5cdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXI7XG5cdFx0XHRcdGNvbnN0IHNVbnNhdmVkQ2hhbmdlc01zZyA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfRFJBRlRfT0JKRUNUX1BBR0VfRFJBRlRfVU5TQVZFRF9DSEFOR0VTXCIsIHNJbmZvLCBzRW50aXR5U2V0KTtcblx0XHRcdFx0YXdhaXQgZHJhZnQuc2hvd0VkaXRDb25maXJtYXRpb25NZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZywgb0NvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm4gZHJhZnQuZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbihvQ29udGV4dCwgZmFsc2UsIG1QYXJhbWV0ZXJzLm9WaWV3LCBncm91cElkLCBtZXNzYWdlSGFuZGxlciwgdHJ1ZSk7IC8vIHRydWUgYmVjYXVzZSB3ZSBvdmVyd3JpdGUgY2hhbmdlc1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoKHJlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpPy5tZXNzYWdlKSB7XG5cdFx0XHRNZXNzYWdlQm94LmVycm9yKChyZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5tZXNzYWdlKTtcblx0XHR9XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdH1cblxuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGFjdGl2ZSBkb2N1bWVudCBpcyByZXF1aXJlZFwiKTtcblx0fVxuXHRsZXQgb0RyYWZ0Q29udGV4dDogQ29udGV4dCB8IENvbnRleHRFcnJvclR5cGUgfCB1bmRlZmluZWQ7XG5cdHRyeSB7XG5cdFx0b0RyYWZ0Q29udGV4dCA9IGF3YWl0IGRyYWZ0LmV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93LCBtUGFyYW1ldGVycy5vVmlldywgZ3JvdXBJZCwgbWVzc2FnZUhhbmRsZXIpO1xuXHR9IGNhdGNoIChvUmVzcG9uc2UpIHtcblx0XHRpZiAoKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKS5zdGF0dXMgPT09IDQwOSB8fCAob1Jlc3BvbnNlIGFzIENvbnRleHRFcnJvclR5cGUpLnN0YXR1cyA9PT0gNDIzKSB7XG5cdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVycyA9IE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkpXG5cdFx0XHRcdD8geyAkc2VsZWN0OiBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyXCIgfVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnMsXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuX2lzRmNsRW5hYmxlZCgpXG5cdFx0XHQpO1xuXHRcdFx0aWYgKHNpYmxpbmdJbmZvPy50YXJnZXRDb250ZXh0KSB7XG5cdFx0XHRcdC8vdGhlcmUgaXMgYSBjb250ZXh0IGF1dGhvcml6ZWQgdG8gYmUgZWRpdGVkIGJ5IHRoZSBjdXJyZW50IHVzZXJcblx0XHRcdFx0YXdhaXQgQ29tbW9uVXRpbHMud2FpdEZvckNvbnRleHRSZXF1ZXN0ZWQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCk7XG5cdFx0XHRcdGlmICh0cmFuc2FjdGlvbkRldGFpbHMpIHtcblx0XHRcdFx0XHR0cmFuc2FjdGlvbkRldGFpbHMuZXhpc3RpbmdEcmFmdFJldXNlZCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vdGhlcmUgaXMgbm8gZHJhZnQgb3duZWQgYnkgdGhlIGN1cnJlbnQgdXNlclxuXHRcdFx0XHRvRHJhZnRDb250ZXh0ID0gYXdhaXQgb3ZlcndyaXRlQ2hhbmdlKG9SZXNwb25zZSBhcyBDb250ZXh0RXJyb3JUeXBlKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKCEob1Jlc3BvbnNlICYmIChvUmVzcG9uc2UgYXMgQ29udGV4dEVycm9yVHlwZSkuY2FuY2VsZWQpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3Iob1Jlc3BvbnNlIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKG9EcmFmdENvbnRleHQpIHtcblx0XHRjb25zdCBzRWRpdEFjdGlvbk5hbWUgPSBkcmFmdC5nZXRBY3Rpb25OYW1lKG9EcmFmdENvbnRleHQgYXMgQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkVESVQpO1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0cyA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzRWRpdEFjdGlvbk5hbWUsIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0aWYgKG9TaWRlRWZmZWN0cz8udHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0YXdhaXQgb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbihvU2lkZUVmZmVjdHMsIG9EcmFmdENvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gb0RyYWZ0Q29udGV4dCBhcyBDb250ZXh0O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gYWN0aXZlIGRvY3VtZW50IGZyb20gYSBkcmFmdCBkb2N1bWVudC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gc3VwcG9ydHMgc2V2ZXJhbCBob29rcyBhcyB0aGVyZSBpcyBhIGNlcnRhaW4gY2hvcmVvZ3JhcGh5IGRlZmluZWQuXG4gKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgVGhlIG1lc3NhZ2UgaGFuZGxlciBjb250cm9sbGVyIGV4dGVuc2lvblxuICogQHBhcmFtIG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgYSB2ZXRvIGJlZm9yZSB0aGUgJ0NyZWF0ZScgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIFttUGFyYW1ldGVycy5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW5nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnJlc291cmNlTW9kZWxdIFJlc291cmNlIE1vZGVsXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlRG9jdW1lbnQoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0bVBhcmFtZXRlcnM6IHsgZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50PzogRnVuY3Rpb247IGZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50PzogRnVuY3Rpb247IHJlc291cmNlTW9kZWw/OiBSZXNvdXJjZU1vZGVsIH0sXG5cdGlzU3RhbmRhcmRTYXZlPzogYm9vbGVhbiB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxDb250ZXh0PiB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHR9XG5cblx0Y29uc3QgYkV4ZWN1dGUgPSBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50ID8gYXdhaXQgbVBhcmFtLmZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCkgOiB0cnVlO1xuXHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBBY3RpdmF0aW9uIG9mIHRoZSBkb2N1bWVudCB3YXMgYWJvcnRlZCBieSBleHRlbnNpb24gZm9yIGRvY3VtZW50OiAke29Db250ZXh0LmdldFBhdGgoKX1gKTtcblx0fVxuXG5cdGxldCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0OiBDb250ZXh0O1xuXHRpZiAoIWRyYWZ0Lmhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpKSB7XG5cdFx0b0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGF3YWl0IGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24oXG5cdFx0XHRvQ29udGV4dCxcblx0XHRcdG9BcHBDb21wb25lbnQsXG5cdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdG1QYXJhbWV0ZXJzLnJlc291cmNlTW9kZWxcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdC8qIGFjdGl2YXRpb24gcmVxdWlyZXMgcHJlcGFyYXRpb24gKi9cblx0XHRjb25zdCBzQmF0Y2hHcm91cCA9IFwiJGF1dG9cIjtcblx0XHQvL3doZW4gdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyB0aGVyZSB3aWxsIGJlIGEgcGF0Y2ggcmVxdWVzdCBtZXJnZWQgdG9nZXRoZXIgd2l0aCB0aGUgZHJhZnRQcmVwYXJlIGFuZCBkcmFmdEFjaXZhdGUuXG5cdFx0Ly9UaGUgcGF0Y2ggY2hhbmdlcyB0aGUgRXRhZywgdGhlcmZvcmUgdGhlIHByZXBhcmUgbmVlZHMgdG8gaWdub3JlIEV0YWdzXG5cdFx0Y29uc3QgaWdub3JlRXRhZzogYm9vbGVhbiA9IG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSA/IHRydWUgOiBmYWxzZTtcblx0XHQvLyB3ZSB1c2UgdGhlIHNhbWUgYmF0Y2hHcm91cCB0byBmb3JjZSBwcmVwYXJlIGFuZCBhY3RpdmF0ZSBpbiBhIHNhbWUgYmF0Y2ggYnV0IHdpdGggZGlmZmVyZW50IGNoYW5nZXNldFxuXHRcdGNvbnN0IG9QcmVwYXJlUHJvbWlzZSA9IGRyYWZ0LmV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKG9Db250ZXh0LCBzQmF0Y2hHcm91cCwgdW5kZWZpbmVkLCBpZ25vcmVFdGFnKTtcblx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNCYXRjaEdyb3VwKTtcblx0XHRjb25zdCBvQWN0aXZhdGVQcm9taXNlID0gZHJhZnQuZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihcblx0XHRcdG9Db250ZXh0LFxuXHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdG1lc3NhZ2VIYW5kbGVyLFxuXHRcdFx0c0JhdGNoR3JvdXAsXG5cdFx0XHRvUHJlcGFyZVByb21pc2UsXG5cdFx0XHRtUGFyYW1ldGVycy5yZXNvdXJjZU1vZGVsLFxuXHRcdFx0aXNTdGFuZGFyZFNhdmVcblx0XHQpO1xuXG5cdFx0Y29uc3QgdmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoW29QcmVwYXJlUHJvbWlzZSwgb0FjdGl2YXRlUHJvbWlzZV0pO1xuXHRcdG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSB2YWx1ZXNbMV07XG5cdH1cblx0cmV0dXJuIG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudCA/IG1QYXJhbS5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCkgOiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xufVxuXG4vKipcbiAqIERpc3BsYXkgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgYm94IGFmdGVyIHByZXNzaW5nIHRoZSBlZGl0IGJ1dHRvbiBvZiBhbiBvYmplY3QgcGFnZSB3aXRoIHVuc2F2ZWQgY2hhbmdlcy5cbiAqIEBwYXJhbSBzVW5zYXZlZENoYW5nZXNNc2cgRGlhbG9nIGJveCBtZXNzYWdlIGluZm9ybWluZyB0aGUgdXNlciB0aGF0IGlmIGhlIHN0YXJ0cyBlZGl0aW5nLCB0aGUgcHJldmlvdXMgdW5zYXZlZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdFxuICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlc1xuICovXG5hc3luYyBmdW5jdGlvbiBzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnOiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IGxvY2FsSTE4blJlZiA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZTogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiB1bmtub3duKSA9PiB2b2lkKSB7XG5cdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0dGl0bGU6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfV0FSTklOR1wiKSxcblx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHtcblx0XHRcdFx0dGV4dDogc1Vuc2F2ZWRDaGFuZ2VzTXNnXG5cdFx0XHR9KSxcblx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogbG9jYWxJMThuUmVmLmdldFRleHQoXCJDX0NPTU1PTl9PQkpFQ1RfUEFHRV9FRElUXCIpLFxuXHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKSxcblx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpOiB2b2lkIHtcblx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0cmVqZWN0KGBEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogJHtvQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdG9EaWFsb2cub3BlbigpO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgY2FsbCB3aGVuIHRoZXJlIGlzIG5vIERyYWZ0QWN0aW9uXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIGFsd2F5cyB1c2VzIERFTEVURS5cbiAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlciBUaGUgbWVzc2FnZSBoYW5kbGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uXG4gKiBAcGFyYW0gb0FwcENvbXBvbmVudCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwYXJhbSBiRW5hYmxlU3RyaWN0SGFuZGxpbmdcbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGRlbGV0ZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRHJhZnQoXG5cdG9Db250ZXh0OiBDb250ZXh0LFxuXHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsXG5cdG9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCxcblx0YkVuYWJsZVN0cmljdEhhbmRsaW5nPzogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmIChvQ29udGV4dC5pc1RyYW5zaWVudCgpKSB7XG5cdFx0Ly8gVHJhbnNpZW50IGNvbnRleHRzIChlLmcuIHdoZW4gdHJ5aW5nIHRvIGRlbGV0ZSBhIGNvbnRleHQgd2hpY2ggY291bGRuJ3QgYmUgY3JlYXRlZCBiZWNhdXNlIG9mIGFuIGVycm9yKSBjYW4gYmUgZGVsZXRlZCBpbW1lZGlhdGVseVxuXHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0fVxuXHRjb25zdCBzRGlzY2FyZEFjdGlvbiA9IGdldEFjdGlvbk5hbWUob0NvbnRleHQsIGRyYWZ0T3BlcmF0aW9ucy5ESVNDQVJEKTtcblx0Y29uc3QgYklzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSXNBY3RpdmVFbnRpdHk7XG5cblx0aWYgKGJJc0FjdGl2ZUVudGl0eSB8fCAoIWJJc0FjdGl2ZUVudGl0eSAmJiAhc0Rpc2NhcmRBY3Rpb24pKSB7XG5cdFx0Ly9Vc2UgRGVsZXRlIGluIGNhc2Ugb2YgYWN0aXZlIGVudGl0eSBhbmQgbm8gZGlzY2FyZCBhY3Rpb24gYXZhaWxhYmxlIGZvciBkcmFmdFxuXHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpICYmICFvQ29udGV4dC5pc0luYWN0aXZlKCkpIHtcblx0XHRcdGF3YWl0IG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gV2hlbiBjYW5jZWxsaW5nIGFuIGVkaXQgZHJhZnQgcm9vdCBub2RlLCB1c2UgbW9kZWwuZGVsZXRlIGluc3RlYWQgb2YgY29udGV4dC5kZWxldGUsIHRvIG9ubHkgc2VuZCBkZWxldGlvbiB0byBiYWNrZW5kLFxuXHRcdFx0Ly8gYnV0IGtlZXAgY29udGV4dCBhbGl2ZSAoaW5jbHVkaW5nIGJpbmRpbmdzKS4gVGh1cywgd2UgY2FuIGVuc3VyZSBzZWFtbGVzcyB0cmFuc2lzdGlvbiBmcm9tIGRyYWZ0IHRvIGFjdGl2ZSBpbnN0YW5jZVxuXHRcdFx0Ly8gKHdpdGhvdXQgaW50ZXJtZWRpYXRlIHVuZGVmaW5lZCBiaW5kaW5ncyBlLmcuIGxlYWRpbmcgdG8gZmxpY2tlcmluZykuIFRoaXMgZG9lc24ndCB3b3JrIGluIGNhc2Ugb2YgRkNMIGFwcHMsIGFzXG5cdFx0XHQvLyBtb2RlbC5kZWxldGUgZG9lc24ndCBjbGVhbiB1cCB0aGUgcGFyZW50IGxpc3RCaW5kaW5nIHByb3Blcmx5LCBsZWFkaW5nIHRvIGluY29ycmVjdCBPRGF0YSByZXF1ZXN0cy5cblx0XHRcdC8vIEluIG90aGVyIGNhc2VzIChkZWxldGluZyBhY3RpdmUsIGRpc2NhcmRpbmcgY3JlYXRlIGRyYWZ0IG9yIGRpc2NhcmRpbmcgZHJhZnQgbm9kZSksIHN0YXkgd2l0aCBjb250ZXh0LmRlbGV0ZS5cblx0XHRcdC8vIFdoZW4gY2FuY2VsbGluZyBhIGNyZWF0ZSBkcmFmdCwgcGFnZSBpcyBjbG9zZWQsIHRodXMgdGhlIHByb2JsZW0gb2YgZmxpY2tlcmluZyBjYW5ub3Qgb2NjdXIuXG5cdFx0XHQvLyBJbiBjYXNlIG9mIGRpc2NhcmRpbmcgYSBkcmFmdCBub2RlLCB0aGVvcmV0aWNhbGx5IHRoZSBzYW1lIHByb2JsZW0gY291bGRcblx0XHRcdC8vIG9jY3VyLCBidXQgbmVlZHMgcXVpdGUgc3BlY2lmaWMgbW9kZWxsaW5nIChidXR0b24gdmlzaWJpbGl0eSBvbiBpdGVtIGxldmVsIGJvdW5kIGFnYWluc3Qgc2VydmljZSBwcm9wZXJ0eSBpbiBhbiBGQ0wgYXBwKVxuXHRcdFx0Ly8gYW5kIGFjdGluZyAobG9va2luZyBhdCBidXR0b24gb24gdGhpcmQgY29sdW1uIHdoaWxlIGRpc2NhcmRpbmcgb24gMm5kIGNvbHVtbikuIEN1cnJlbnRseSwgbW9kZWwgc2VlbXMgbm90IHRvIGJlIHByZXBhcmVkXG5cdFx0XHQvLyBmb3IgdGhhdCBjYXNlLCB0aHVzIGR1ZSB0byB0aGUgbWluaW1hbCBpbXBhY3QgKG9ubHkgaW50ZXJtZWRpYXRlIHZpc3VhbCBzdGF0ZSksIGFjY2VwdGluZyB0aGlzIGZvciB0aGUgdGltZSBiZWluZy5cblx0XHRcdGNvbnN0IGlzSW5saW5lRWRpdEdyb3VwID0gb0NvbnRleHQuZ2V0VXBkYXRlR3JvdXBJZCgpID09PSBDb21tb25VdGlscy5JTkxJTkVFRElUX1VQREFURUdST1VQSUQ7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkpKT8udGFyZ2V0RW50aXR5U2V0O1xuXHRcdFx0Y29uc3QgdXNlTW9kZWxEZWxldGUgPVxuXHRcdFx0XHQhb0FwcENvbXBvbmVudC5faXNGY2xFbmFibGVkKCkgJiZcblx0XHRcdFx0IW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgJiZcblx0XHRcdFx0TW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QodGFyZ2V0RW50aXR5U2V0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdGlmICh1c2VNb2RlbERlbGV0ZSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZ2V0TW9kZWwoKS5kZWxldGUob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzSW5saW5lRWRpdEdyb3VwKSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoXCIkYXV0b1wiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly9Vc2UgRGlzY2FyZCBQb3N0IEFjdGlvbiBpZiBpdCBpcyBhIGRyYWZ0IGVudGl0eSBhbmQgZGlzY2FyZCBhY3Rpb24gZXhpc3RzXG5cdFx0YXdhaXQgZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dCwgbWVzc2FnZUhhbmRsZXIsIG9BcHBDb21wb25lbnQsIGJFbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdH1cbn1cblxuLyoqXG4gKiBUZXJtaW5hdGVzIHRoZSBkcmFmdCBzZXNzaW9uIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIHRlcm1pbmF0ZWRcbiAqL1xuZnVuY3Rpb24gdGVybWluYXRlRHJhZnRTZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0Y29uc3QgbW9kZWwgPSBjb250ZXh0Py5nZXRNb2RlbCgpO1xuXG5cdC8vIE9ubHkgY2xlYW4gdXAgQUJBUCBzZXNzaW9ucyBmb3IgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0aWYgKG1vZGVsPy5nZXRIdHRwSGVhZGVycyh0cnVlKT8uW1wiU0FQLUNvbnRleHRJZFwiXSkge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBBY2Nlc3MgdGhlIHByaXZhdGUgb1JlcXVlc3RvciBwcm9wZXJ0eSB3aXRoIHByb3BlciB0eXBpbmcsIHRoaXMgaGFzIGJlZW4gYWxpZ25lZCB3aXRoIHRoZSBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHQvLyB0aGV5IG1pZ2h0IG5lZWQgdG8gb2ZmZXIgYSBkZWRpY2F0ZWQgcmVzdHJpY3RlZCBtZXRob2QgZm9yIHNhcC5mZSBpbiB0aGUgZnV0dXJlLCBidXQgdW50aWwgdGhlbiB3ZSBjYW4gdXNlXG5cdFx0XHQvLyBpdCBsaWtlIHRoaXMuXG5cdFx0XHQoXG5cdFx0XHRcdG1vZGVsIGFzIHVua25vd24gYXMge1xuXHRcdFx0XHRcdG9SZXF1ZXN0b3I6IHsgc2VuZFJlcXVlc3Q6IChtZXRob2Q6IHN0cmluZywgdXJsOiBzdHJpbmcsIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IHZvaWQgfTtcblx0XHRcdFx0fVxuXHRcdFx0KS5vUmVxdWVzdG9yLnNlbmRSZXF1ZXN0KFwiSEVBRFwiLCBcIlwiLCB7IFwic2FwLXRlcm1pbmF0ZVwiOiBcInNlc3Npb25cIiB9KTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Ly8gTG9nIGVycm9yIGJ1dCBkb24ndCBibG9jayB0aGUgb3BlcmF0aW9uXG5cdFx0XHRMb2cuaW5mbyhcIkZhaWxlZCB0byB0ZXJtaW5hdGUgQUJBUCBzZXNzaW9uIGR1cmluZyBkcmFmdCBjbGVhbnVwXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG59XG5cbmNvbnN0IGRyYWZ0ID0ge1xuXHRjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudDogY3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQsXG5cdGFjdGl2YXRlRG9jdW1lbnQ6IGFjdGl2YXRlRG9jdW1lbnQsXG5cdGRlbGV0ZURyYWZ0OiBkZWxldGVEcmFmdCxcblx0ZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbjogZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbixcblx0ZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbjogZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbixcblx0ZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb246IGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uLFxuXHRleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uOiBleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uLFxuXHRoYXNQcmVwYXJlQWN0aW9uOiBoYXNQcmVwYXJlQWN0aW9uLFxuXHRjb21wdXRlU2libGluZ0luZm9ybWF0aW9uOiBjb21wdXRlU2libGluZ0luZm9ybWF0aW9uLFxuXHRwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbjogZHJhZnREYXRhTG9zc1BvcHVwLnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uLFxuXHRzaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb246IGRyYWZ0RGF0YUxvc3NQb3B1cC5zaWxlbnRseUtlZXBEcmFmdE9uRm9yd2FyZE5hdmlnYXRpb24sXG5cdGNyZWF0ZU9wZXJhdGlvbjogY3JlYXRlT3BlcmF0aW9uLFxuXHRleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uOiBleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uLFxuXHROYXZpZ2F0aW9uVHlwZTogZHJhZnREYXRhTG9zc1BvcHVwLk5hdmlnYXRpb25UeXBlLFxuXHRnZXRBY3Rpb25OYW1lOiBnZXRBY3Rpb25OYW1lLFxuXHRzaG93RWRpdENvbmZpcm1hdGlvbk1lc3NhZ2VCb3g6IHNob3dFZGl0Q29uZmlybWF0aW9uTWVzc2FnZUJveCxcblx0dGVybWluYXRlRHJhZnRTZXNzaW9uOiB0ZXJtaW5hdGVEcmFmdFNlc3Npb25cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRyYWZ0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztFQXVGQTtFQUNBLE1BQU1BLGVBQWUsR0FBRztJQUN2QkMsSUFBSSxFQUFFLFlBQVk7SUFDbEJDLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUJDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCQyxPQUFPLEVBQUU7RUFDVixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU0MsYUFBYUEsQ0FBQ0MsUUFBaUIsRUFBRUMsVUFBa0IsRUFBVTtJQUNyRSxNQUFNQyxNQUFNLEdBQUdGLFFBQVEsQ0FBQ0csUUFBUSxD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