@sapui5/sap.fe.core 1.136.1 → 1.138.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/ActionRuntime.js +76 -28
  4. package/src/sap/fe/core/ActionRuntime.ts +106 -30
  5. package/src/sap/fe/core/AppComponent.js +11 -1
  6. package/src/sap/fe/core/AppComponent.ts +10 -0
  7. package/src/sap/fe/core/AppStateHandler.js +9 -2
  8. package/src/sap/fe/core/AppStateHandler.ts +8 -2
  9. package/src/sap/fe/core/CommonUtils.js +15 -3
  10. package/src/sap/fe/core/CommonUtils.ts +13 -2
  11. package/src/sap/fe/core/PageController.controller.js +10 -0
  12. package/src/sap/fe/core/PageController.controller.ts +3 -0
  13. package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -4
  14. package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +2 -2
  15. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +3 -3
  16. package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +2 -2
  17. package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -12
  18. package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -16
  19. package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +27 -41
  20. package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +27 -41
  21. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -1
  22. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -1
  23. package/src/sap/fe/core/controllerextensions/InternalRouting.js +2 -1
  24. package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1 -0
  25. package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
  26. package/src/sap/fe/core/controllerextensions/MessageHandler.ts +22 -15
  27. package/src/sap/fe/core/controllerextensions/Paginator.js +20 -5
  28. package/src/sap/fe/core/controllerextensions/Paginator.ts +19 -0
  29. package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -2
  30. package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
  31. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -1
  32. package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -0
  33. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +9 -5
  34. package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.tsx +8 -3
  35. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +4 -2
  36. package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -2
  37. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +178 -125
  38. package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +222 -174
  39. package/src/sap/fe/core/controllerextensions/editFlow/draft.js +5 -3
  40. package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -3
  41. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +39 -5
  42. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +51 -11
  43. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +16 -1
  44. package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +17 -2
  45. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +88 -1
  46. package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +106 -7
  47. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +16 -1
  48. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +15 -0
  49. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +25 -1
  50. package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +24 -0
  51. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +11 -8
  52. package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +13 -10
  53. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -4
  54. package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +7 -3
  55. package/src/sap/fe/core/controls/DataWatcher.js +2 -2
  56. package/src/sap/fe/core/controls/DataWatcher.tsx +1 -1
  57. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +11 -6
  58. package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +13 -9
  59. package/src/sap/fe/core/controls/inlineEditFlow/InlineEditExitDialog.js +144 -0
  60. package/src/sap/fe/core/controls/inlineEditFlow/{BeforeNavigationDialog.tsx → InlineEditExitDialog.tsx} +1 -1
  61. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  62. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
  63. package/src/sap/fe/core/converters/MetaModelConverter.js +3 -2
  64. package/src/sap/fe/core/converters/MetaModelConverter.ts +12 -4
  65. package/src/sap/fe/core/converters/controls/Common/Action.js +42 -5
  66. package/src/sap/fe/core/converters/controls/Common/Action.ts +42 -5
  67. package/src/sap/fe/core/converters/controls/Common/Chart.js +4 -1
  68. package/src/sap/fe/core/converters/controls/Common/Chart.ts +2 -1
  69. package/src/sap/fe/core/converters/controls/Common/Table.js +46 -13
  70. package/src/sap/fe/core/converters/controls/Common/Table.ts +50 -11
  71. package/src/sap/fe/core/converters/controls/Common/table/Columns.js +11 -10
  72. package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +13 -1
  73. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +2 -2
  74. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +2 -1
  75. package/src/sap/fe/core/fpm/manifest.json +1 -1
  76. package/src/sap/fe/core/helpers/DeleteHelper.js +9 -9
  77. package/src/sap/fe/core/helpers/DeleteHelper.ts +8 -9
  78. package/src/sap/fe/core/helpers/FPMHelper.js +2 -2
  79. package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
  80. package/src/sap/fe/core/helpers/ModelHelper.js +4 -4
  81. package/src/sap/fe/core/helpers/ModelHelper.ts +8 -4
  82. package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
  83. package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
  84. package/src/sap/fe/core/library.js +33 -4
  85. package/src/sap/fe/core/library.ts +33 -2
  86. package/src/sap/fe/core/messagebundle.properties +18 -2
  87. package/src/sap/fe/core/messagebundle_ar.properties +3 -2
  88. package/src/sap/fe/core/messagebundle_bg.properties +2 -1
  89. package/src/sap/fe/core/messagebundle_ca.properties +2 -1
  90. package/src/sap/fe/core/messagebundle_cnr.properties +2 -1
  91. package/src/sap/fe/core/messagebundle_cs.properties +4 -3
  92. package/src/sap/fe/core/messagebundle_cy.properties +2 -1
  93. package/src/sap/fe/core/messagebundle_da.properties +2 -1
  94. package/src/sap/fe/core/messagebundle_de.properties +8 -7
  95. package/src/sap/fe/core/messagebundle_el.properties +2 -1
  96. package/src/sap/fe/core/messagebundle_en.properties +2 -1
  97. package/src/sap/fe/core/messagebundle_en_GB.properties +2 -1
  98. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +2 -1
  99. package/src/sap/fe/core/messagebundle_es.properties +5 -4
  100. package/src/sap/fe/core/messagebundle_es_MX.properties +2 -1
  101. package/src/sap/fe/core/messagebundle_et.properties +2 -1
  102. package/src/sap/fe/core/messagebundle_fi.properties +2 -1
  103. package/src/sap/fe/core/messagebundle_fr.properties +2 -1
  104. package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -1
  105. package/src/sap/fe/core/messagebundle_hi.properties +2 -1
  106. package/src/sap/fe/core/messagebundle_hr.properties +2 -1
  107. package/src/sap/fe/core/messagebundle_hu.properties +2 -1
  108. package/src/sap/fe/core/messagebundle_id.properties +2 -1
  109. package/src/sap/fe/core/messagebundle_it.properties +2 -1
  110. package/src/sap/fe/core/messagebundle_iw.properties +2 -1
  111. package/src/sap/fe/core/messagebundle_ja.properties +3 -2
  112. package/src/sap/fe/core/messagebundle_kk.properties +2 -1
  113. package/src/sap/fe/core/messagebundle_ko.properties +2 -1
  114. package/src/sap/fe/core/messagebundle_lt.properties +2 -1
  115. package/src/sap/fe/core/messagebundle_lv.properties +2 -1
  116. package/src/sap/fe/core/messagebundle_mk.properties +2 -1
  117. package/src/sap/fe/core/messagebundle_ms.properties +2 -1
  118. package/src/sap/fe/core/messagebundle_nl.properties +2 -1
  119. package/src/sap/fe/core/messagebundle_no.properties +3 -2
  120. package/src/sap/fe/core/messagebundle_pl.properties +2 -1
  121. package/src/sap/fe/core/messagebundle_pt.properties +2 -1
  122. package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -1
  123. package/src/sap/fe/core/messagebundle_ro.properties +2 -1
  124. package/src/sap/fe/core/messagebundle_ru.properties +2 -1
  125. package/src/sap/fe/core/messagebundle_sh.properties +2 -1
  126. package/src/sap/fe/core/messagebundle_sk.properties +2 -1
  127. package/src/sap/fe/core/messagebundle_sl.properties +2 -1
  128. package/src/sap/fe/core/messagebundle_sr.properties +2 -1
  129. package/src/sap/fe/core/messagebundle_sv.properties +2 -1
  130. package/src/sap/fe/core/messagebundle_th.properties +2 -1
  131. package/src/sap/fe/core/messagebundle_tr.properties +2 -1
  132. package/src/sap/fe/core/messagebundle_uk.properties +2 -1
  133. package/src/sap/fe/core/messagebundle_vi.properties +2 -1
  134. package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -1
  135. package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -1
  136. package/src/sap/fe/core/rootView/RootViewBaseController.js +6 -6
  137. package/src/sap/fe/core/rootView/RootViewBaseController.ts +5 -5
  138. package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -3
  139. package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -2
  140. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -1
  141. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -0
  142. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +8 -2
  143. package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -1
  144. package/src/sap/fe/core/templating/EntitySetHelper.js +75 -90
  145. package/src/sap/fe/core/templating/EntitySetHelper.ts +92 -118
  146. package/src/sap/fe/core/templating/UIFormatters.js +3 -3
  147. package/src/sap/fe/core/templating/UIFormatters.ts +1 -2
  148. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +0 -81
  149. package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +0 -126
  150. package/src/sap/fe/core/controllerextensions/editFlow/operations.js +0 -10
  151. package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +0 -2
  152. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +0 -68
  153. package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +0 -52
  154. package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +0 -144
@@ -321,10 +321,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
321
321
  parameters.bFindActiveContexts = true;
322
322
  BusyLocker.lock(lockObject);
323
323
  try {
324
+ const deleted = await this.deleteDocumentTransaction(contextsToDelete, parameters);
325
+ if (!deleted) {
326
+ // The delete was cancelled
327
+ return;
328
+ }
324
329
  if (this.getProgrammingModel(parameters?.selectedContexts?.[0] ?? contextsToDelete[0]) === ProgrammingModel.Sticky) {
325
330
  this.setDocumentModified(true);
326
331
  }
327
- await this.deleteDocumentTransaction(contextsToDelete, parameters);
328
332
  let result;
329
333
 
330
334
  // Multiple object deletion is triggered from a list
@@ -1251,7 +1255,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1251
1255
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1252
1256
  * @param _mParameters Object containing the parameters passed to onAfterSave
1253
1257
  * @param _mParameters.context The context we obtained after saving
1254
- * @returns A promise to be returned by the overridden method.
1258
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1255
1259
  * @public
1256
1260
  * @since 1.116.0
1257
1261
  */;
@@ -1268,7 +1272,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1268
1272
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1269
1273
  * @param _mParameters Object containing the parameters passed to onAfterCreate
1270
1274
  * @param _mParameters.context The newly created context
1271
- * @returns A promise to be returned by the overridden method.
1275
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1272
1276
  * @public
1273
1277
  * @since 1.116.0
1274
1278
  */;
@@ -1285,7 +1289,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1285
1289
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1286
1290
  * @param _mParameters Object containing the parameters passed to onAfterEdit
1287
1291
  * @param _mParameters.context Page context that is going to be edited.
1288
- * @returns A promise to be returned by the overridden method.
1292
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1289
1293
  * @public
1290
1294
  * @since 1.116.0
1291
1295
  */;
@@ -1302,7 +1306,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1302
1306
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1303
1307
  * @param _mParameters Object containing the parameters passed to onAfterDiscard
1304
1308
  * @param _mParameters.context The context obtained after discarding the object, or undefined if we discarded a new object
1305
- * @returns A promise to be returned by the overridden method.
1309
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1306
1310
  * @public
1307
1311
  * @since 1.116.0
1308
1312
  */;
@@ -1319,7 +1323,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1319
1323
  * The override execution is: {@link sap.ui.core.mvc.OverrideExecution.After}.
1320
1324
  * @param _mParameters Object containing the parameters passed to onAfterDelete
1321
1325
  * @param _mParameters.contexts An array of contexts that are going to be deleted
1322
- * @returns A promise to be returned by the overridden method.
1326
+ * @returns A promise to be returned by the overridden method. If rejected, any further processing by the framework is stopped.
1323
1327
  * @public
1324
1328
  * @since 1.116.0
1325
1329
  */;
@@ -1517,6 +1521,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1517
1521
  const transactionHelper = this.getTransactionHelper();
1518
1522
  let siblingInfo;
1519
1523
  let isNewDocument = false;
1524
+ mParameters.skipDiscardPopover = this._hiddenDraft?.enabled ? true : mParameters.skipDiscardPopover;
1520
1525
  const cancelParameters = {
1521
1526
  skipDiscardPopover: mParameters.skipDiscardPopover === true,
1522
1527
  cancelButton: mParameters.control || mParameters.cancelButton,
@@ -1617,7 +1622,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1617
1622
  const rootContext = await this.getRootContext(context, {
1618
1623
  $select: "HasActiveEntity,IsActiveEntity"
1619
1624
  });
1620
- return !rootContext.getObject("HasActiveEntity") && !rootContext.getObject("IsActiveEntity");
1625
+ // When we refresh the root context, it may not have the properties HasActiveEntity and IsActiveEntity yet, so we request them
1626
+ const draftProperties = await rootContext.requestProperty(["HasActiveEntity", "IsActiveEntity"]);
1627
+ return !draftProperties[0] && !draftProperties[1];
1621
1628
  }
1622
1629
 
1623
1630
  /**
@@ -1698,10 +1705,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
1698
1705
  }
1699
1706
  };
1700
1707
  }
1708
+ const deleted = await this.deleteDocumentTransaction(oContext, mParameters);
1709
+ if (!deleted) {
1710
+ // The delete was canceled by the user
1711
+ return;
1712
+ }
1701
1713
  if (this.getProgrammingModel(oContext) === ProgrammingModel.Sticky) {
1702
1714
  this.setDocumentModified(true);
1703
1715
  }
1704
- await this.deleteDocumentTransaction(oContext, mParameters);
1705
1716
 
1706
1717
  // Single objet deletion is triggered from an OP header button (not from a list)
1707
1718
  // --> Mark UI dirty and navigate back to dismiss the OP
@@ -2169,14 +2180,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
2169
2180
  const isCollaborationDraftSupported = ModelHelper.isCollaborationDraftSupported(model.getMetaModel());
2170
2181
  let forceDisplayMode = false;
2171
2182
  const isActiveEntity = await context.requestObject("IsActiveEntity");
2172
- if (isCollaborationDraftSupported && isActiveEntity === false) {
2183
+ if (isCollaborationDraftSupported) {
2173
2184
  forceDisplayMode = !(await this.base.collaborativeDraft.activateCollaboration(context, isActiveEntity));
2174
2185
  } else {
2175
2186
  globalModel.setProperty("/hasCollaborationAuthorization", undefined);
2176
2187
  }
2177
2188
  this.fetchCollaborativeDraftUsersPromise = undefined;
2178
2189
  if (isActiveEntity === false && !forceDisplayMode) {
2179
- // in case the document is draft set it in edit mode
2190
+ // in case the document is draft, set it in edit mode
2191
+ // unless we don't have the authorization for a collaborative user
2180
2192
  this.setEditMode(EditMode.Editable);
2181
2193
  const hasActiveEntity = await context.requestObject("HasActiveEntity");
2182
2194
  this.setEditMode(undefined, !hasActiveEntity);
@@ -2225,6 +2237,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
2225
2237
  * @param parameters.lockedContexts
2226
2238
  * @param parameters.draftsWithDeletableActive
2227
2239
  * @param parameters.draftsWithNonDeletableActive
2240
+ * @returns Promise resolves once the deletion is completed
2228
2241
  */;
2229
2242
  _proto.deleteDocumentTransaction = async function deleteDocumentTransaction(contexts, parameters) {
2230
2243
  if (parameters.selectedContexts) {
@@ -2245,7 +2258,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
2245
2258
  }
2246
2259
  }
2247
2260
  await this.syncTask();
2248
- await transactionHelper.deleteDocument(contexts, parameters, this.getAppComponent(), resourceModel, this.getMessageHandler());
2261
+ return transactionHelper.deleteDocument(contexts, parameters, this.getAppComponent(), resourceModel, this.getMessageHandler());
2249
2262
  };
2250
2263
  _proto._getResourceModel = function _getResourceModel() {
2251
2264
  return getResourceModel(this.getView());
@@ -3066,4 +3079,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/base/ClassSupport", "sap/fe/core/CommonUt
3066
3079
  }(BaseControllerExtension), _applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeExecuteAction", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeExecuteAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterSave", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterCreate", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterEdit", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDiscard", [_dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterDelete", [_dec29, _dec30], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec33, _dec34], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec35, _dec36], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec37, _dec38], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec39, _dec40], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterActionExecution", [_dec41, _dec42], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterActionExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "customMassEditSave", [_dec43, _dec44], Object.getOwnPropertyDescriptor(_class2.prototype, "customMassEditSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec45, _dec46], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype), _class2)) || _class);
3067
3080
  return EditFlow;
3068
3081
  }, false);
3069
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiRWRpdEZsb3ciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjNCIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2RlYzExIiwiX2RlYzEyIiwiX2RlYzEzIiwiX2RlYzE0IiwiX2RlYzE1IiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiX2RlYzIzIiwiX2RlYzI0IiwiX2RlYzI1IiwiX2RlYzI2IiwiX2RlYzI3IiwiX2RlYzI4IiwiX2RlYzI5IiwiX2RlYzMwIiwiX2RlYzMxIiwiX2RlYzMyIiwiX2RlYzMzIiwiX2RlYzM0IiwiX2RlYzM1IiwiX2RlYzM2IiwiX2RlYzM3IiwiX2RlYzM4IiwiX2RlYzM5IiwiX2RlYzQwIiwiX2RlYzQxIiwiX2RlYzQyIiwiX2RlYzQzIiwiX2RlYzQ0IiwiSW5zdGVhZCIsIl9kZWM0NSIsIl9kZWM0NiIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQmFzZUNvbnRyb2xsZXJFeHRlbnMiLCJfdGhpcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY2FsbCIsInN5bmNUYXNrcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJsaXN0QmluZGluZyIsImNyZWF0aW9uUHJvbWlzZSIsInZpZXdCaW5kaW5nQ29udGV4dCIsImdldFZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsIm5ld0NvbnRleHQiLCJjcmVhdGVkIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiZ2V0UGF0aCIsImVycm9yIiwiTG9nIiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwidmFsaWRhdGlvbk1lc3NhZ2VzIiwidGFibGUiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsImRhdGEiLCJjdXN0b21WYWxpZGl0eSIsImdldFByb3BlcnR5IiwiY3VzdG9tTWVzc2FnZXMiLCJmaWVsZENvbnRyb2wiLCJmaW5hbFRhcmdldCIsIm9sZE1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRDb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJmb3JFYWNoIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZ2V0VGFyZ2V0cyIsInNvbWUiLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsIk1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsImdldE1vZGVsIiwidHlwZSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJjb2RlIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYWRkQ29udHJvbElkIiwicHVzaCIsInRleHQiLCJnZXRNZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlRGlhbG9nIiwicmVzb2x2ZUNyZWF0aW9uTW9kZSIsImluaXRpYWxDcmVhdGlvbk1vZGUiLCJjcmVhdGVEYXRhIiwiQ3JlYXRpb25Nb2RlIiwiTmV3UGFnZSIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwiaXNSZWxhdGl2ZSIsImRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0IiwiZW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwibmV3QWN0aW9uIiwiRHJhZnQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIkRyYWZ0Um9vdCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiTmV3QWN0aW9uIiwidG9TdHJpbmciLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYWN0aW9ucyIsInBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsImNyZWF0aW9uUGFyYW1ldGVycyIsImdldFRyYW5zYWN0aW9uSGVscGVyIiwiZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzIiwiQXN5bmMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uSW5pdCIsIl9oaWRkZW5EcmFmdCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiSGlkZGVuRHJhZnQiLCJnZXRJbnRlcmZhY2UiLCJiYXNlIiwiZWRpdERvY3VtZW50IiwiY29udGV4dCIsInRyYW5zYWN0aW9uSGVscGVyIiwicm9vdFZpZXdDb250cm9sbGVyIiwiX2dldFJvb3RWaWV3Q29udHJvbGxlciIsIm1vZGVsIiwidmlld0RhdGEiLCJnZXRWaWV3RGF0YSIsImdyb3VwSWQiLCJtZXNzYWdlSGFuZGxpbmdLZXkiLCJyZWdpc3RlclRvSG9sZE1lc3NhZ2VzIiwicm9vdENvbnRleHQiLCJnZXRSb290Q29udGV4dCIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwicmlnaHRtb3N0Q29udGV4dCIsIl9pc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwidW5kZWZpbmVkIiwidHJhbnNhY3Rpb25EZXRhaWxzIiwibmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSIsInJvb3RDb250ZXh0SW5mbyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsInNpYmxpbmdJbmZvUHJvbWlzZSIsImNvbXB1dGVTaWJsaW5nSW5mbyIsInZpZXdMZXZlbCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic3VibWl0QmF0Y2giLCJzaWJsaW5nSW5mbyIsIm5ld0RvY3VtZW50Q29udGV4dCIsImNvbnRleHRUb05hdmlnYXRlIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX3VwZGF0ZVBhdGhzSW5IaXN0b3J5Iiwib3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiIsIlN0aWNreSIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJleGlzdGluZ0RyYWZ0UmV1c2VkIiwiY29sbGFib3JhdGl2ZURyYWZ0Iiwic2V0SW5pdGlhbFNoYXJlIiwib25BZnRlckVkaXQiLCJfaGFuZGxlTmV3Q29udGV4dCIsImVkaXRhYmxlIiwicmVjcmVhdGVDb250ZXh0IiwiZm9yY2VGb2N1cyIsInN0aWNreUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwiaGFuZGxlU3RpY2t5T24iLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsInVuSG9sZEtleSIsIm92ZXJyaWRlVUlEZWNpc2lvbiIsInJlamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlIiwicGFyZW50Q29udGV4dCIsInNpZGVFZmZlY3RTZXJ2aWNlIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUiLCJpc0EiLCJpc0luYWN0aXZlIiwiZ2V0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiQnVzeUxvY2tlciIsImxvY2siLCJzZWxlY3RlZENvbnRleHRzIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsInJlc3VsdCIsImNsZWFyU2VsZWN0aW9uIiwiaXNSb290IiwicmVmcmVzaExpc3RCaW5kaW5nIiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCIsInJlY29tbWVuZGF0aW9ucyIsImlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMiLCJvbkFmdGVyRGVsZXRlIiwiY29udGV4dHMiLCJ0YWJsZUFQSSIsImdldFBhcmVudCIsInRhYmxlRGVmaW5pdGlvbiIsImNvbnRyb2wiLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmVDcmVhdGlvblJvd3MiLCJyZW1vdmVFbXB0eVJvd3NNZXNzYWdlcyIsInNldFVwRW1wdHlSb3dzIiwiX3NlbmRBY3Rpdml0eSIsIkFjdGl2aXR5IiwiRGVsZXRlIiwidW5sb2NrIiwidXBkYXRlRG9jdW1lbnQiLCJ1cGRhdGVkQ29udGV4dCIsInVwZGF0ZVByb21pc2UiLCJvcmlnaW5hbEJpbmRpbmdDb250ZXh0IiwiaXNEcmFmdCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsInN5bmNUYXNrIiwic2V0RHJhZnRTdGF0dXMiLCJTYXZpbmciLCJjdXJyZW50QmluZGluZ0NvbnRleHQiLCJlbnRpdHlTZXROYW1lIiwiZ2V0T2JqZWN0Iiwic2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJjdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwic2hvd01lc3NhZ2VzIiwiZ2V0UGFyZW50Q29udGV4dEZyb21TZWxlY3Rpb24iLCJjcmVhdGVEb2N1bWVudCIsInNvdXJjZSIsIm1JblBhcmFtZXRlcnMiLCJvRGF0YUxpc3RCaW5kaW5nIiwiZGF0YU1vZGVsIiwic2VsZWN0ZWRQcm9wZXJ0aWVzIiwiJHNlbGVjdCIsIiQkZ3JvdXBJZCIsIkV4dGVybmFsIiwibGlzdEJpbmRpbmdGcm9tUGF0aCIsImJpbmRMaXN0IiwiY3JlYXRlQXRFbmQiLCJyZXNvbHZlZENyZWF0aW9uTW9kZSIsImdldFJvdXRlclByb3h5IiwicmVtb3ZlSUFwcFN0YXRlS2V5Iiwic2luZ2xlRHJhZnRGb3JDcmVhdGUiLCJnZXRNYW5pZmVzdCIsImFwcCIsImdldFJvb3RCaW5kaW5nIiwiZ2V0SGVhZGVyQ29udGV4dCIsIm5ld0JpbmRpbmciLCJnZXRDb250ZXh0IiwiU29ydGVyIiwiRmlsdGVyIiwiZmlsdGVycyIsInBhdGgiLCJvcGVyYXRvciIsInZhbHVlMSIsImFuZCIsInJlcXVlc3RDb250ZXh0cyIsInRoZW4iLCJkZXN0cm95IiwiX2hhbmRsZUNyZWF0aW9uTW9kZSIsInZMaXN0QmluZGluZyIsImNyZWF0ZUV4dGVybmFsRG9jdW1lbnQiLCJvdXRib3VuZCIsImNyZWF0ZURlZmVycmVkRG9jdW1lbnQiLCJDcmVhdGlvblJvdyIsImNyZWF0aW9uUm93IiwiY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQiLCJza2lwU2lkZUVmZmVjdHMiLCJJbmxpbmUiLCJjcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudCIsInRhYmxlSWQiLCJDcmVhdGlvbkRpYWxvZyIsImNyZWF0aW9uRGlhbG9nRmllbGRzIiwiY3JlYXRlRGlhbG9nQW5kU2F2ZURvY3VtZW50IiwiU3luYyIsImNyZWF0ZVN5bmNBc3luY0RvY3VtZW50IiwiYkZyb21EZWZlcnJlZCIsImNyZWF0ZUFjdGlvbiIsInBvc3REb2N1bWVudENyZWF0aW9uIiwicHJlcmVxdWlzaXRlIiwicGFyYW1zIiwib25BZnRlckNyZWF0ZSIsIm1ldGFDb250ZXh0Iiwic3RhcnRpbmdFbnRpdHlTZXQiLCJnZXRJbnRlcm5hbE1vZGVsIiwic2V0UHJvcGVydHkiLCJpc0xpc3RCaW5kaW5nQW5hbHl0aWNhbCIsImZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkIiwic2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlIiwiQ3JlYXRlIiwiaXNEcmFmdFJvb3QiLCJpc0Nvbm5lY3RlZCIsImNyZWF0aW9uIiwiYXBwQ29tcG9uZW50IiwibmF2aWdhdGlvbiIsImNyZWF0aW9uUm93Q29udGV4dCIsImRvY3VtZW50VmFsaWRhdGlvbiIsImdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uIiwiZW50aXR5VHlwZSIsImNyZWF0aW9uUm93UGF5bG9hZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJhdHRhY2hFdmVudE9uY2UiLCJzY3JvbGxUb0luZGV4IiwiZ2V0TGVuZ3RoIiwiaGFuZGxlQ3JlYXRlRXZlbnRzIiwiT2JqZWN0IiwiYXNzaWduIiwia2V5cyIsInByb3BlcnR5UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZmluZEluZGV4IiwicHJvcGVydHkiLCJuYW1lIiwibWFwIiwia2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCIsImJ1c3lNb2RlIiwiYnVzeUlkIiwiZ2V0VGFibGVEZWZpbml0aW9uIiwiYW5ub3RhdGlvbiIsImlkIiwiYmVmb3JlQ3JlYXRlQ2FsbEJhY2siLCJvbkJlZm9yZUNyZWF0ZSIsInNraXBQYXJhbWV0ZXJEaWFsb2ciLCJnZXRTdGFydHVwTW9kZSIsIkF1dG9DcmVhdGUiLCJfZ2V0UmVzb3VyY2VNb2RlbCIsImNyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJuZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJjYXRjaCIsInRyYWNlIiwiZGVsZXRlIiwiYWxsIiwiaXNMb2NrZWQiLCJjb250ZXh0SW5kZXgiLCJnZXRJbmRleCIsImFnZ3JlZ2F0aW9uRGF0YSIsImdldEFnZ3JlZ2F0aW9uIiwiaXNDcmVhdGVJblBsYWNlIiwiY3JlYXRlSW5QbGFjZSIsInNldFRpbWVvdXQiLCJnZXRCdXN5IiwiZm9jdXNSb3ciLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0VGV4dCIsInBhcmVudEluZGV4Iiwic2F2ZWREb2N1bWVudENvbnRleHQiLCJhZnRlckNyZWF0ZUluRGlhbG9nIiwib25CZWZvcmVTYXZlIiwic2F2ZURvY3VtZW50Iiwib25BZnRlclNhdmUiLCJyZWZyZXNoIiwiaXRlbUluZGV4IiwiYWZ0ZXJDcmVhdGVDYWxsQmFjayIsImdldEludGVybmFsUm91dGluZyIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzIiwibW9kZSIsInJvdXRpbmdMaXN0ZW5lciIsImNyZWF0ZUNvbnRleHRQcm9taXNlIiwiY29yZVJlc291cmNlQnVuZGxlIiwiTGlicmFyeSIsImdldFJlc291cmNlQnVuZGxlRm9yIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsIm5hdlBhcmFtZXRlcnMiLCJ0cmFuc2llbnQiLCJuYXZpZ2F0ZVRvQ29udGV4dCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNyZWF0aW9uRmFpbGVkIiwiT25CZWZvcmVDcmVhdGVGYWlsZWQiLCJpbmNsdWRlcyIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImNvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwiY3JlYXRlUGF0aCIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiY3JlYXRpb25Sb3dPYmplY3RzIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJkYXRhRm9yQ3JlYXRlIiwiaXNGcm9tQ29weVBhc3RlIiwiY3JlYXRlQXNJbmFjdGl2ZSIsInRhcmdldExpc3RCaW5kaW5nIiwibWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImNyZWF0aW9uUHJvbWlzZXMiLCJwcm9wZXJ0eVZhbHVlcyIsImNyZWF0ZVBhcmFtZXRlcnMiLCJpbmFjdGl2ZSIsIiRraW5kIiwiY3JlYXRlZENvbnRleHRzIiwiYWN0aXZlQ29udGV4dHMiLCJlcnIiLCJfbVBhcmFtZXRlcnMiLCJvbkJlZm9yZURpc2NhcmQiLCJvbkJlZm9yZUV4ZWN1dGVBY3Rpb24iLCJvbkFmdGVyRGlzY2FyZCIsIm9Db250ZXh0IiwibVBhcmFtZXRlcnMiLCJpbmxpbmVFZGl0RmxvdyIsImlzSW5saW5lRWRpdFBvc3NpYmxlIiwiaW5saW5lRWRpdFNhdmUiLCJiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwibWVyZ2VQYXRjaERyYWZ0IiwiX3N1Ym1pdE9wZW5DaGFuZ2VzIiwicmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuIiwiY2hlY2tSZWNvbW1lbmRhdGlvbk9wdGlvbiIsInNQcm9ncmFtbWluZ01vZGVsIiwiaXNGY2xFbmFibGVkIiwiX3NpZGVFZmZlY3RzIiwiaGFuZGxlUGFnZUNoYW5nZUNvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImFjdGl2ZURvY3VtZW50Q29udGV4dCIsImdldENyZWF0aW9uTW9kZSIsIl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwiQWN0aXZhdGUiLCJkaXNjb25uZWN0IiwiX3RyaWdnZXJDb25maWd1cmVkU3VydmV5IiwiU3RhbmRhcmRBY3Rpb25zIiwic2F2ZSIsIlRyaWdnZXJUeXBlIiwic3RhbmRhcmRBY3Rpb24iLCJEaXNwbGF5Iiwic3RvcmVEYXRhRm9yVGVsZW1ldHJ5IiwiX2NyZWF0ZVNpYmxpbmdJbmZvIiwicHJldmlvdXNTZW1hbnRpY1BhdGgiLCJuZXdTZW1hbnRpY1BhdGgiLCJwYXRoTWFwcGluZyIsIm9sZFBhdGgiLCJuZXdQYXRoIiwic3RheU9uQ3VycmVudFBhZ2VBZnRlclNhdmUiLCJ0YXJnZXRDb250ZXh0Iiwic2tpcEJpbmRpbmdUb1ZpZXciLCJvRXJyb3IiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwiY2FuY2VsRG9jdW1lbnQiLCJpc05ld0RvY3VtZW50IiwiY2FuY2VsUGFyYW1ldGVycyIsInNraXBEaXNjYXJkUG9wb3ZlciIsImNhbmNlbEJ1dHRvbiIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY2FuY2VsUmVzdWx0IiwiaXNEb2N1bWVudE1vZGlmaWVkIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJ2aWV3IiwiaXNLZWVwQWxpdmUiLCJzZXRLZWVwQWxpdmUiLCJEaXNjYXJkIiwic2tpcEJhY2tOYXZpZ2F0aW9uIiwibmF2aWdhdGVCYWNrRnJvbUNvbnRleHQiLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0Iiwic3RheU9uQ3VycmVudFBhZ2VBZnRlckNhbmNlbCIsIl9mZXRjaFNlbWFudGljS2V5VmFsdWVzIiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJiaW5kaW5nUGFyYW1ldGVycyIsImNyZWF0ZVJvb3RDb250ZXh0IiwiaXNSb290Q29udGV4dE5ldyIsInJlc291cmNlTW9kZWwiLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaEFmdGVyUm91dGVNYXRjaGVkIiwic2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0IiwiY2xvc2VPbkJyb3dzZXJOYXZpZ2F0aW9uIiwiZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJkZWxldGVEb2N1bWVudCIsIm9BcHBDb21wb25lbnQiLCJzaWJsaW5nQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnRQYXRoIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJkcmFmdENvbnRleHRUb1JlbW92ZSIsInJlcGxhY2VXaXRoIiwiY29udGV4dEJpbmRpbmciLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJEZWVwbGluayIsImV4aXRGcm9tQXBwIiwiYXBwbHlEb2N1bWVudCIsIm9Mb2NrT2JqZWN0IiwiaXNDb250aW51ZSIsInNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiIsIkNvbnRpbnVlIiwiY2FsbEV4dGVuc2lvbiIsImludm9rZUFjdGlvbiIsInNBY3Rpb25OYW1lIiwibUV4dHJhUGFyYW1zIiwiYVBhcnRzIiwic092ZXJsb2FkRW50aXR5VHlwZSIsIm9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzIiwib1ZpZXciLCJpc0FycmF5IiwiaXNOYXZpZ2FibGUiLCJyZXF1aXJlc05hdmlnYXRpb24iLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsImVudGl0eUNvbnRhaW5lciIsImlzQm91bmQiLCJvQ29udHJvbCIsImludGVybmFsTW9kZWxDb250ZXh0IiwiaWdub3JlRVRhZyIsInNwbGl0IiwicmVwbGFjZUFsbCIsImJTdGF0aWNBY3Rpb24iLCJfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aCIsImVuYWJsZUF1dG9TY3JvbGwiLCJjcmVhdGVBY3Rpb25Qcm9taXNlIiwiZ2V0SWQiLCJyZXNwb25zZSIsImNhbGxBY3Rpb24iLCJzdWNjZXNzRnVsbEV4ZWN1dGlvbiIsImlzRnVsZmlsbGVkIiwibGlzdFJlZnJlc2hlZCIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiQWN0aW9uIiwidmFsdWUiLCJib3VuZENvbnRleHQiLCJhY3Rpb24iLCJmUmVzb2x2ZXIiLCJjb252ZXJ0ZXJUeXBlIiwiX2dldEJvdW5kQ29udGV4dCIsInJldHVybmVkQ29udGV4dCIsIm9NZXRhTW9kZWwiLCJzQ29udGV4dE1ldGFQYXRoIiwiX2ZuVmFsaWRDb250ZXh0cyIsImFwcGxpY2FibGVDb250ZXh0cyIsImVsZW1lbnQiLCJvQWN0aW9uQ29udGV4dCIsInNBY3Rpb25Db250ZXh0TWV0YVBhdGgiLCJjaGVja05vSGFzaENoYW5nZSIsImluZm8iLCJvbkFmdGVyQWN0aW9uRXhlY3V0aW9uIiwib1Jlc3VsdCIsImZSZWplY3RvciIsIl9hY3Rpb25OYW1lIiwiY3VzdG9tTWFzc0VkaXRTYXZlIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiZmluYWxseSIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsImludGVybmFsQ29udGV4dCIsInVpQ29udGV4dCIsImdldFNvdXJjZSIsInNldElnbm9yZUVUYWciLCJoYW5kbGVJbmxpbmVFZGl0UGF0Y2hTZW50Iiwic291cmNlQmluZGluZyIsIm9QYXRjaFByb21pc2UiLCJwYXRjaENvbXBsZXRlZEV2ZW50IiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoIiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJoYW5kbGVDcmVhdGVTZW50IiwiZXZlbnQiLCJuZXdUYXNrIiwiZGVidWciLCJjb21wdXRlTW9kZWxzRm9yRWRpdE1vZGUiLCJnbG9iYWxNb2RlbCIsImZvcmNlRGlzcGxheU1vZGUiLCJpc0FjdGl2ZUVudGl0eSIsInJlcXVlc3RPYmplY3QiLCJhY3RpdmF0ZUNvbGxhYm9yYXRpb24iLCJmZXRjaENvbGxhYm9yYXRpdmVEcmFmdFVzZXJzUHJvbWlzZSIsImhhc0FjdGl2ZUVudGl0eSIsImxhc3RJbnZva2VkQWN0aW9uTmFtZSIsImlzTmV3QWN0aW9uRm9yU3RpY2t5IiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwic291cmNlQ29udHJvbCIsImdldFJlc291cmNlTW9kZWwiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm1lc3NhZ2VIYW5kbGVyIiwiZ2V0UGFnZUludGVybmFsTW9kZWwiLCJzZXRDcmVhdGlvbk1vZGUiLCJiQ3JlYXRpb25Nb2RlIiwicGFnZUludGVybmFsQ29udGV4dCIsIlVpTW9kZWxDb25zdGFudHMiLCJDcmVhdGVNb2RlIiwiRG9jdW1lbnRNb2RpZmllZCIsIm1vZGlmaWVkIiwiYmluZGluZyIsIm1lc3NhZ2VIYW5kbGluZ0tleVNldHMiLCJhdHRhY2hFdmVudCIsImV2ZW50SW5zdGFuY2UiLCJmaW5kIiwic3VjY2VzcyIsImRyYWZ0U3RhdHVzIiwiZWRpdE1vZGUiLCJpc0NyZWF0aW9uIiwiZm9yY2VkIiwic2hhbGxGb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsImFjdGlvbk5hbWUiLCJzdGlja3lTZXNzaW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJoYXNoVHJhY2tlciIsImdldEhhc2giLCJpbnRlcm5hbE1vZGVsIiwic2V0TmF2aWdhdGlvbkd1YXJkIiwic3Vic3RyaW5nIiwib25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsImJpbmQiLCJpMThuTW9kZWwiLCJyZWdpc3RlclN0aWNreVNlc3Npb25DYWxsYmFja3MiLCJnZXREaXJ0eVN0YXRlUHJvdmlkZXIiLCJnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24iLCJoYW5kbGVTdGlja3lPZmYiLCJkaXNjYXJkTmF2aWdhdGlvbkd1YXJkIiwidW5yZWdpc3RlclN0aWNreVNlc3Npb25DYWxsYmFja3MiLCJnZXRIdHRwSGVhZGVycyIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJyb3V0ZXJQcm94eSIsImxjbEhhc2hUcmFja2VyIiwiaXNEaXJ0eSIsImlzU2Vzc2lvbk9uIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsIndhcm5pbmdEaWFsb2ciLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImFmdGVyQ2xvc2UiLCJhZGRTdHlsZUNsYXNzIiwic2V0TW9kZWwiLCJhZGREZXBlbmRlbnQiLCJvcGVuIiwiY3VycmVudEhhc2giLCJkaXNjYXJkU3RpY2t5U2Vzc2lvbiIsImNsZWFyU2Vzc2lvbkNvbnRleHQiLCJkaXNjYXJkZWRDb250ZXh0Iiwic3RpY2t5IiwiZGlzY2FyZERvY3VtZW50IiwicmVzZXRDaGFuZ2VzIiwiX3JvdXRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwicmVzb2x2ZUZ1bmN0aW9uIiwicmVqZWN0RnVuY3Rpb24iLCJhY3Rpb25Qcm9taXNlIiwiY3VycmVudFZpZXciLCJtZXRhTW9kZWxEYXRhIiwibWV0YU1vZGVsQWN0aW9uIiwiYWN0aW9uUmV0dXJuVHlwZSIsIiRSZXR1cm5UeXBlIiwiJFR5cGUiLCIkS2V5Iiwib0RhdGEiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiaXNTYXZlIiwiY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyIsIkNvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZyIsIl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3ciLCJyb3dCaW5kaW5nIiwiYWN0aXZlUm93SW5kZXgiLCJnZXRDb3VudCIsImFsbFJvd0NvbnRleHRzIiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwiaW5kZXgiLCJzaW5nbGVDb250ZXh0IiwiY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXMiLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwicmVsYXRlZENvbnRleHRzIiwidHJpZ2dlcmVkQWN0aW9uTmFtZSIsImFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMiLCJzZW5kIiwidHJpZ2dlclR5cGUiLCJ0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIm9Nb2RlbCIsIm9SZXF1ZXN0b3IiLCJ3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzIiwiY2hlY2tJZkJhY2tJc091dE9mR3VhcmQiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJoaXN0b3J5IiwiYmFjayIsIm5hdmlnYXRpb25QYXJhbWV0ZXJzIiwicGVyc2lzdE9QU2Nyb2xsIiwicmVhc29uIiwiTmF2aWdhdGlvblJlYXNvbiIsIkVkaXRGbG93QWN0aW9uIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJiUmVmcmVzaEFmdGVyQWN0aW9uIiwidmlzaWJsZVZpZXdJZHMiLCJfZ2V0QWxsVmlzaWJsZVZpZXdzIiwiYU1lc3NhZ2VzIiwidmFsaWRhdGlvbiIsImdldENvbnRyb2xJZCIsIm9SZXNwb25zZSIsIm9CaW5kaW5nIiwiYUtleXMiLCJvQ3VycmVudERhdGEiLCJiUmV0dXJuZWRDb250ZXh0SXNTYW1lIiwiZXZlcnkiLCJzS2V5Iiwic0VudGl0eVNldE5hbWUiLCJhU2VtYW50aWNLZXlzIiwicGF0aHMiLCJvS2V5IiwiJFByb3BlcnR5UGF0aCIsInJlcXVlc3RQcm9wZXJ0eSIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwibWFwcGluZ3MiLCJzZXRQYXRoTWFwcGluZyIsInJvb3RDdXJyZW50Q29udGV4dCIsInJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IiwiZG9Ob3RDb21wdXRlSWZSb290Iiwic3RhcnRzV2l0aCIsInJpZ2h0TW9zdENvbnRleHRUb1VzZSIsImRyYWZ0IiwiY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbiIsImNyZWF0ZU5leHREb2N1bWVudCIsImJpbmRpbmdDb250ZXh0UGF0aCIsImxpc3RCaW5kaW5nUGF0aCIsImxhc3RJbmRleE9mIiwiQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24iLCJfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFZGl0Rmxvdy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIG1ldGhvZE92ZXJyaWRlLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBGRVZpZXcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvQmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB0eXBlIElSb3dCaW5kaW5nSW50ZXJmYWNlIGZyb20gXCJzYXAvZmUvY29yZS9JUm93QmluZGluZ0ludGVyZmFjZVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQmFzZUNvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0Jhc2VDb250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHsgU3RhbmRhcmRBY3Rpb25zLCBUcmlnZ2VyVHlwZSwgdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvRmVlZGJhY2tcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB0eXBlIHsgQ3VzdG9tTWVzc2FnZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgQWN0aXZpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9Db2xsYWJvcmF0aW9uQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7XG5cdENhbmNlbFBhcmFtZXRlcnMsXG5cdENyZWF0ZVBhcmFtZXRlcnMsXG5cdEVkaXRUcmFuc2FjdGlvbkV4ZWN1dGlvbkRldGFpbHNcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRDb250ZXh0UGFyYW1ldGVycywgUm9vdENvbnRleHRJbmZvLCBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBVaU1vZGVsQ29uc3RhbnRzIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9lZGl0Rmxvd0NvbnN0YW50c1wiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgdHlwZSB7IEhpZGRlbkRyYWZ0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IERyYWZ0U2libGluZ1BhaXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9EZWxldGVIZWxwZXJcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgRmNsQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvRmNsLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL3Jvb3RWaWV3L1Jvb3RWaWV3QmFzZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzLCBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBNYWNyb1RhYmxlIGZyb20gXCJzYXAvZmUvbWFjcm9zL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvTGliXCI7XG5pbXBvcnQgTWVzc2FnaW5nIGZyb20gXCJzYXAvdWkvY29yZS9NZXNzYWdpbmdcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBNZXNzYWdlVHlwZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlVHlwZVwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBDcmVhdGlvblJvdyBmcm9tIFwic2FwL3VpL21kYy90YWJsZS9DcmVhdGlvblJvd1wiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBTb3J0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9Tb3J0ZXJcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29udGV4dCwgZGVmYXVsdCBhcyBPRGF0YVY0Q29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUNvbnRleHRCaW5kaW5nJFBhdGNoU2VudEV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgTWV0YU1vZGVsRW50aXR5VHlwZSB9IGZyb20gXCJ0eXBlcy9tZXRhbW9kZWxfdHlwZXNcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCIuLi9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgeyBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2csIFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24gfSBmcm9tIFwiLi4vY29udHJvbHMvUmVjb21tZW5kYXRpb25zL0NvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZ1wiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlLCB0eXBlIEJhc2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgaXNGdWxmaWxsZWQgfSBmcm9tIFwiLi4vaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSB7IE9wZXJhdGlvblJlc3VsdCB9IGZyb20gXCIuL2VkaXRGbG93L29wZXJhdGlvbnMvT0RhdGFPcGVyYXRpb25cIjtcbmltcG9ydCBOYXZpZ2F0aW9uUmVhc29uIGZyb20gXCIuL3JvdXRpbmcvTmF2aWdhdGlvblJlYXNvblwiO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdFN0YXJ0dXBNb2RlID0gRkVMaWJyYXJ5LlN0YXJ0dXBNb2RlO1xuXG50eXBlIFNhdmVEb2N1bWVudFBhcmFtZXRlcnMgPSB7XG5cdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yPzogYm9vbGVhbjtcblx0bWVyZ2VQYXRjaERyYWZ0PzogYm9vbGVhbjtcblx0c2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuO1xuXHRiaW5kaW5ncz86IE9EYXRhTGlzdEJpbmRpbmdbXTtcbn07XG5cbnR5cGUgSW50ZXJuYWxDcmVhdGVQYXJhbWV0ZXJzID0ge1xuXHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uO1xuXHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdGNyZWF0ZUFjdGlvbj86IGJvb2xlYW47XG5cdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdGNyZWF0aW9uUm93PzogQ3JlYXRpb25Sb3c7XG5cdGRhdGE/OiBvYmplY3Q7XG5cdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdG91dGJvdW5kPzogc3RyaW5nO1xuXHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0c2VsZWN0ZWRDb250ZXh0cz86IE9EYXRhVjRDb250ZXh0W107XG5cdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG59O1xuXG4vKipcbiAqIEEgY29udHJvbGxlciBleHRlbnNpb24gb2ZmZXJpbmcgaG9va3MgaW50byB0aGUgZWRpdCBmbG93IG9mIHRoZSBhcHBsaWNhdGlvblxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuOTAuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1wiKVxuY2xhc3MgRWRpdEZsb3cgZXh0ZW5kcyBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBzeW5jVGFza3M6IFByb21pc2U8dW5rbm93bj4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRwcml2YXRlIGFjdGlvblByb21pc2U/OiBQcm9taXNlPHsgY29udHJvbElkPzogc3RyaW5nOyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0+O1xuXG5cdHByaXZhdGUgY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZz86IENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZztcblxuXHRwcml2YXRlIF9oaWRkZW5EcmFmdDogSGlkZGVuRHJhZnQgfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSBmZXRjaENvbGxhYm9yYXRpdmVEcmFmdFVzZXJzUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuXHRAbWV0aG9kT3ZlcnJpZGUoKVxuXHRvbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5faGlkZGVuRHJhZnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKCkuSGlkZGVuRHJhZnQgYXMgSGlkZGVuRHJhZnQ7XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQdWJsaWMgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdGdldEludGVyZmFjZSgpOiBCYXNlT2JqZWN0IHtcblx0XHRyZXR1cm4gc3VwZXIuZ2V0SW50ZXJmYWNlKCk7XG5cdH1cblxuXHRnZXRBcHBDb21wb25lbnQoKTogQXBwQ29tcG9uZW50IHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgdGhlIGV4aXN0aW5nIGFjdGl2ZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZWRpdGFibGUgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIHdpdGggdGhlIGVkaXRhYmxlIGNvbnRleHRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZWRpdERvY3VtZW50KGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0IHwgdm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncztcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXHRcdGNvbnN0IGdyb3VwSWQgPSBcImVkaXRHcm91cFwiO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJvb3RDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRSb290Q29udGV4dChjb250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUVkaXQoeyBjb250ZXh0OiByb290Q29udGV4dCB9KTtcblxuXHRcdFx0bGV0IHJpZ2h0bW9zdENvbnRleHQgPSB0aGlzLl9pc0ZjbEVuYWJsZWQoKSA/IChyb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogY29udGV4dDtcblx0XHRcdGlmIChcblx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChyaWdodG1vc3RDb250ZXh0KSAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyB3ZSBjaGVjayB0aGUgcmlnaHRtb3N0Q29udGV4dCBjYW4gYmUgdXNlZCBpbiBkcmFmdFxuXHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHRyYW5zYWN0aW9uRGV0YWlsczogRWRpdFRyYW5zYWN0aW9uRXhlY3V0aW9uRGV0YWlscyA9IHt9O1xuXHRcdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSA9IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChcblx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdHRoaXMuYmFzZS5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0Z3JvdXBJZCxcblx0XHRcdFx0dHJhbnNhY3Rpb25EZXRhaWxzXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHRJbmZvID0ge1xuXHRcdFx0XHRyb290U2libGluZ1BhdGhQcm9taXNlOiBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsLCBtb2RlbCk7XG5cblx0XHRcdGxldCBzaWJsaW5nSW5mb1Byb21pc2U7XG5cdFx0XHQvLyByaWdodG1vc3RDb250ZXh0ID09PSByb290Q29udGV4dCA9PiB3ZSdyZSBpbiBPUC4gSWYgbm90LCB3ZSdyZSBpbiBtdWx0aS1jb2x1bW4gbGF5b3V0IG9mIEZDTFxuXHRcdFx0Y29uc3QgY29tcHV0ZVNpYmxpbmdJbmZvID0gcmlnaHRtb3N0Q29udGV4dCAhPT0gcm9vdENvbnRleHQgfHwgKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDE7XG5cdFx0XHRpZiAoY29tcHV0ZVNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHNpYmxpbmdJbmZvUHJvbWlzZSA9IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCxcblx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0cm9vdENvbnRleHRJbmZvLFxuXHRcdFx0XHRcdGdyb3VwSWRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChncm91cElkKTtcblxuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgc2libGluZ0luZm9Qcm9taXNlO1xuXHRcdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0ID0gKGF3YWl0IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2UpIGFzIENvbnRleHQ7XG5cdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQgPSBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRpZiAoY29tcHV0ZVNpYmxpbmdJbmZvICYmIGNvbnRleHRUb05hdmlnYXRlKSB7XG5cdFx0XHRcdGlmIChzaWJsaW5nSW5mbyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0LFxuXHRcdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRyb290Q29udGV4dEluZm8sXG5cdFx0XHRcdFx0XHRcIiRhdXRvXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gdGhpcy5fZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQoY29udGV4dCwgbmV3RG9jdW1lbnRDb250ZXh0LCBzaWJsaW5nSW5mbyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShbXSk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBvdmVycmlkZU1lc3NhZ2VVSURlY2lzaW9uID0gZmFsc2U7XG5cdFx0XHRpZiAobmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSAmJlxuXHRcdFx0XHRcdE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsLmdldE1ldGFNb2RlbCgpKSAmJlxuXHRcdFx0XHRcdHRyYW5zYWN0aW9uRGV0YWlscy5leGlzdGluZ0RyYWZ0UmV1c2VkICE9PSB0cnVlXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIFRoZSBpbml0aWFsIHNoYXJlIGFjdGlvbiBzaGFsbCBiZSBjYWxsZWQgIChleGNlcHQgaWYgdGhlIGRyYWZ0IGFscmVhZHkgZXhpc3RlZClcblx0XHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LnNldEluaXRpYWxTaGFyZSh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckVkaXQoeyBjb250ZXh0OiBjb250ZXh0VG9OYXZpZ2F0ZSB9KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0cmVjcmVhdGVDb250ZXh0OiBmYWxzZSxcblx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHQvLyBUaGUgc3RpY2t5T24gaGFuZGxlciBtdXN0IGJlIHNldCBhZnRlciB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiBkb25lLFxuXHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRsZXQgc3RpY2t5Q29udGV4dDogQ29udGV4dDtcblx0XHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgdXNlZCB0byBiaW5kIHRoZSBwYWdlXG5cdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gbmV3RG9jdW1lbnRDb250ZXh0Py5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlU3RpY2t5T24oc3RpY2t5Q29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gV2UgY2hhbmdlIHRoZSBlZGl0IG1vZGUgYWZ0ZXIgdGhlIHBhZ2UgYmluZGluZyBoYXMgYmVlbiBkb25lLCBvdGhlcndpc2UgdGhlIGNyZWF0aW9uIG9mIGVtcHR5IHJvd3MgbWlnaHQgZmFpbCAoYXMgdGhlIHRhYmxlIGlzIHN0aWxsIG9uIHRoZSBhY3RpdmUgdmVyc2lvbilcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXksIG92ZXJyaWRlVUlEZWNpc2lvbjogb3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiB9KTtcblx0XHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIHNpZGUgZWZmZWN0cyByZXF1aXJlZCBhZnRlciBkZWxldGluZyBhbiBvYmplY3QuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIHRoZSBkZWxldGVkIG9iamVjdCBiZWxvbmdzIHRvXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHBhcmVudCBvYmplY3Qgb2YgdGhlIGRlbGV0ZWQgb2JqZWN0XG5cdCAqL1xuXHRwcml2YXRlIHJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkLCBwYXJlbnRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0aWYgKCFsaXN0QmluZGluZyB8fCAhcGFyZW50Q29udGV4dCB8fCBDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBzaWRlRWZmZWN0U2VydmljZSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0c2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgcGFyZW50Q29udGV4dCk7XG5cblx0XHRjb25zdCBzdGF0ZU1lc3NhZ2VzUGF0aCA9IE1vZGVsSGVscGVyLmdldE1lc3NhZ2VzUGF0aChsaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLCBwYXJlbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgd2UgbmVlZCB0byByZWZyZXNoIHN0YXRlIG1lc3NhZ2VzIGZvciB0aGUgT2JqZWN0UGFnZSwgYXMgc29tZSBvZiB0aGVzZSBtZXNzYWdlcyBtaWdodCBiZSBhdHRhY2hlZFxuXHRcdC8vIHRvIGNoaWxkcmVuIG9mIGEgZGVsZXRlZCByb3cgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkIHlldCwgYW5kIHRoZXJlZm9yZSB0aGUgbW9kZWwgd291bGRuJ3QgY2xlYW4gdXAgdGhlc2UgbWVzc2FnZXNcblx0XHRpZiAoc3RhdGVNZXNzYWdlc1BhdGggJiYgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRzaWRlRWZmZWN0U2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3N0YXRlTWVzc2FnZXNQYXRoXSwgcGFyZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqIEBwYXJhbSBjb250ZXh0c1RvRGVsZXRlIFRoZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0Y29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkOiBzdHJpbmc7XG5cdFx0XHRub0RpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0cGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpID8/IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdGxldCBpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGU6IENvbnRleHRbXSA9IFtdO1xuXHRcdGlmIChwYXJlbnRDb250cm9sPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlID0gY29udGV4dHNUb0RlbGV0ZS5maWx0ZXIoKGNvbnRleHQpID0+IGNvbnRleHQuaXNJbmFjdGl2ZSgpKTtcblx0XHR9XG5cdFx0aWYgKCFwYXJlbnRDb250cm9sKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSBwYXJlbnRDb250cm9sIGFzIENvbnRyb2w7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gKHBhcmVudENvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChwYXJlbnRDb250cm9sIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0cGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChwYXJhbWV0ZXJzPy5zZWxlY3RlZENvbnRleHRzPy5bMF0gPz8gY29udGV4dHNUb0RlbGV0ZVswXSkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihjb250ZXh0c1RvRGVsZXRlLCBwYXJhbWV0ZXJzKTtcblxuXHRcdFx0bGV0IHJlc3VsdDtcblxuXHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdHBhcmVudENvbnRyb2wuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlbiByZWZyZXNoIHRoZSBsaXN0LWJpbmRpbmcgKExSKSwgb3IgcmVxdWlyZSBzaWRlLWVmZmVjdHMgKE9QKVxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdHJlc3VsdCA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGxpc3RCaW5kaW5nLCB2aWV3QmluZGluZ0NvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKGNvbnRleHRzVG9EZWxldGUpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IGNvbnRleHRzVG9EZWxldGUgfSk7XG5cblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQVBJID0gcGFyZW50Q29udHJvbC5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZUNyZWF0aW9uUm93cyAmJlxuXHRcdFx0XHRcdGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZS5sZW5ndGggPiAwXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHRhYmxlQVBJLnJlbW92ZUVtcHR5Um93c01lc3NhZ2VzKGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3MocGFyZW50Q29udHJvbCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIGNvbnRleHRzVG9EZWxldGUpO1xuXG5cdFx0XHRyZXR1cm4gYXdhaXQgcmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBXZSBzdGlsbCB3YW50IHRvIHJlZnJlc2ggdGhlIGxpc3RiaW5kaW5nIGluIGNhc2Ugd2UgZGVsZXRlZCBzb21lIGluZm9ybWF0aW9uIGJ1dCBub3QgZXZlcnl0aGluZyAoRHJhZnRzIGZvciBleGFtcGxlKVxuXHRcdFx0aWYgKGxpc3RCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5yZWZyZXNoTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0fSBlbHNlIGlmIChwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmcsIHZpZXdCaW5kaW5nQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnQocylcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICogQHBhcmFtIHVwZGF0ZWRDb250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHVwZGF0ZVByb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRyYWZ0IHN0YXR1cyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHVwZGF0ZURvY3VtZW50KHVwZGF0ZWRDb250ZXh0OiBCaW5kaW5nIHwgQ29udGV4dCwgdXBkYXRlUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9yaWdpbmFsQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGlzRHJhZnQgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodXBkYXRlZENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB1cGRhdGVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKCFpc0RyYWZ0IHx8ICFjdXJyZW50QmluZGluZ0NvbnRleHQgfHwgY3VycmVudEJpbmRpbmdDb250ZXh0ICE9PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UncmUgc3RpbGwgb24gdGhlIHNhbWUgY29udGV4dFxuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0TmFtZSA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKTtcblx0XHRcdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG1ldGFNb2RlbCwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRzZW1hbnRpY0tleXM/Lmxlbmd0aCAmJlxuXHRcdFx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSAmJiAvLyBXZSBkb24ndCB1c2UgdGhlIHNlbWFudGljIGtleSBmb3IgYSBuZXcgZG9jdW1lbnQgKGNyZWF0aW9uKVxuXHRcdFx0XHRcdGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljUGF0aCA9IGN1cnJlbnRTZW1hbnRpY01hcHBpbmc/LnNlbWFudGljUGF0aCxcblx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChjdXJyZW50QmluZGluZ0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdC8vIGN1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRpZiAoY3VycmVudFNlbWFudGljUGF0aCAmJiBjdXJyZW50U2VtYW50aWNQYXRoICE9PSBzQ2hhbmdlZFBhdGgpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LCB7IGVkaXRhYmxlOiB0cnVlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdGlmIChpc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihzZWxlY3RlZENvbnRleHRzOiBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkKTogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGlmIChzZWxlY3RlZENvbnRleHRzICYmIHNlbGVjdGVkQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gT25lIHBhcmVudCBhdCBtb3N0ICEhXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgYSBuZXcgZG9jdW1lbnQgaW4gYSBUcmVlVGFibGUgd2l0aCAke3NlbGVjdGVkQ29udGV4dHMubGVuZ3RofSBwYXJlbnRzYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNlbGVjdGVkQ29udGV4dHM/Lmxlbmd0aCA9PT0gMSA/IHNlbGVjdGVkQ29udGV4dHNbMF0gOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBTeW5jIC0gdGhlIGNyZWF0aW9uIGlzIHRyaWdnZXJlZCBhbmQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCwgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBBc3luYyAtIHRoZSBjcmVhdGlvbiBhbmQgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGluc3RhbmNlIGFyZSBkb25lIGluIHBhcmFsbGVsXG5cdC8vICogICAgICAgICAgICAgICAgICAgIERlZmVycmVkIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgb24gdGhlIHRhcmdldCBwYWdlXG5cdC8vICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uUm93IC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIGFzeW5jIHNvIHRoZSB1c2VyIGlzIG5vdCBibG9ja2VkXG5cdC8vIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IEluc3RhbmNlIG9mIHRoZSBjcmVhdGlvbiByb3cgLSAoVE9ETzogZ2V0IHJpZCBidXQgdXNlIGxpc3QgYmluZGluZ3Mgb25seSlcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICogQHBhcmFtIHNvdXJjZSAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBvciBhIHRhYmxlIGJ1aWxkaW5nIGJsb2NrIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6PGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIE5ld1BhZ2UgLSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzaG93biBpbiBhIG5ldyBwYWdlLCBkZXBlbmRpbmcgb24gd2hldGhlciBtZXRhZGF0YSAnU3luYycsICdBc3luYycsIG9yICdEZWZlcnJlZCcgaXMgdXNlZDxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBJbmxpbmUgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSB3aXRoaW4gdGhlIHRhYmxlLiBOb3Qgc3VwcG9ydGVkIG9uIGEgTGlzdCBSZXBvcnQ8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciAnb3V0Ym91bmQnPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uRGlhbG9nIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gdGhlIHRhYmxlLCB3aXRoIGEgZGlhbG9nIGFsbG93aW5nIHRvIHNwZWNpZnkgc29tZSBpbml0aWFsIHByb3BlcnR5IHZhbHVlcyAodGhlIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBpbiBgY3JlYXRpb25EaWFsb2dGaWVsZHNgKVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50YWJsZUlkIElEIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZCBTcGVjaWZpZXMgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBhIHRhYmxlIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdJbmxpbmUnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iRnJvbURlZmVycmVkIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYnVzeU1vZGUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvblJvdyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzIFRoZSBjb250ZXh0cyB0aGF0IGFyZSBzZWxlY3RlZCBpbiB0aGUgdGFibGUgaW5pdGlhdGluZyB0aGUgY3JlYXRpb24uIFVzZWQgaW4gY2FzZSBvZiBhIFRyZWVUYWJsZSB0byBkZXRlcm1pbmUgdGhlIHBhcmVudCBjb250ZXh0IG9mIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNpbmdsZURyYWZ0Rm9yQ3JlYXRlIFdoZW4gZW5hYmxlZCwgYW4gZXh0cmEgcmVxdWVzdCBjaGVja3MgaWYgYW55IGRyYWZ0cyBleGlzdCB0aGF0IHdlcmUgbmV2ZXIgc2F2ZWQuIElmIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgdGhlIG5ld2VzdCBvbmUgaXMgb3BlbmVkLiBJZiBubyB1bnNhdmVkIGRyYWZ0cyBhcmUgZm91bmQsIGEgbmV3IGVudGl0eSBpcyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIERlZmluZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyB0aGF0IGFyZSBkaXNwbGF5ZWQgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZyB3aGVuIHRoZSBjcmVhdGlvbiBtb2RlIGlzIHNldCB0byAnQ3JlYXRpb25EaWFsb2cnLjxici8+VGhlIHZhbHVlIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXNcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHRzb3VyY2U6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcgfCBNYWNyb1RhYmxlLFxuXHRcdG1JblBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRiRnJvbURlZmVycmVkPzogYm9vbGVhbjtcblx0XHRcdGJ1c3lNb2RlPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0Y3JlYXRpb25Sb3c/OiBDcmVhdGlvblJvdztcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNraXBTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0XHRcdHNpbmdsZURyYWZ0Rm9yQ3JlYXRlPzogYm9vbGVhbjtcblx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzPzogc3RyaW5nW107XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgb0RhdGFMaXN0QmluZGluZyE6IE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0bGV0IHBhcmVudENvbnRleHQ6IE9EYXRhVjRDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZGF0YU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRsZXQgc2VsZWN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKGRhdGFNb2RlbCAmJiBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChkYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRzZWxlY3RlZFByb3BlcnRpZXMgPSBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyLElzQWN0aXZlRW50aXR5LEhhc0FjdGl2ZUVudGl0eVwiO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZS5pc0EgJiYgc291cmNlLmlzQTxJUm93QmluZGluZ0ludGVyZmFjZT4oXCJzYXAuZmUuY29yZS5JUm93QmluZGluZ0ludGVyZmFjZVwiKSkge1xuXHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHNvdXJjZS5nZXRSb3dCaW5kaW5nKHtcblx0XHRcdFx0JHNlbGVjdDogc2VsZWN0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uV29ya2Vyc1wiXG5cdFx0XHR9KTtcblx0XHRcdHNvdXJjZSA9IG9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0fVxuXG5cdFx0aWYgKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nRnJvbVBhdGggPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5iaW5kTGlzdChzb3VyY2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdFx0XHQkc2VsZWN0OiBzZWxlY3RlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLldvcmtlcnNcIlxuXHRcdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWxpc3RCaW5kaW5nRnJvbVBhdGgpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nRnJvbVBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVsZXRlIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgc291cmNlLmlzQSAmJiBzb3VyY2UuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHNvdXJjZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChvRGF0YUxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRwYXJlbnRDb250ZXh0ID0gdGhpcy5nZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHJlc29sdmVkQ3JlYXRpb25Nb2RlID0gdGhpcy5yZXNvbHZlQ3JlYXRpb25Nb2RlKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLCBvRGF0YUxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLmRhdGEpO1xuXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKFxuXHRcdFx0KG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGVcblx0XHRcdFx0OiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0KClbXCJzYXAuZmVcIl0/LmFwcD8uc2luZ2xlRHJhZnRGb3JDcmVhdGUpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nID09PSBvRGF0YUxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICE9PSBudWxsXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBuZXdCaW5kaW5nID0gb0RhdGFMaXN0QmluZGluZy5nZXRNb2RlbCgpPy5iaW5kTGlzdChcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRuZXcgU29ydGVyKFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZURhdGVUaW1lXCIsIHRydWUpLFxuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRmaWx0ZXJzOiBbXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJJc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIkhhc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0YW5kOiB0cnVlXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3QmluZGluZz8ucmVxdWVzdENvbnRleHRzKDAsIDEpO1xuXHRcdFx0aWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHJlc3VsdFswXSwgeyBlZGl0YWJsZTogdHJ1ZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSB9KS50aGVuKCgpID0+IG5ld0JpbmRpbmc/LmRlc3Ryb3koKSk7XG5cdFx0XHR9XG5cdFx0XHRuZXdCaW5kaW5nPy5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdFx0c291cmNlIGFzIHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmVudENvbnRleHRcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdHNvdXJjZSBhcyBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0KTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHR2TGlzdEJpbmRpbmc6IHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogSW50ZXJuYWxDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdG9EYXRhTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShbXSk7XG5cdFx0c3dpdGNoIChyZXNvbHZlZENyZWF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWw6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUV4dGVybmFsRG9jdW1lbnQodkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLm91dGJvdW5kKTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEZWZlcnJlZERvY3VtZW50KG9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQsIHBhcmFtZXRlcnMuZGF0YSk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuY3JlYXRpb25Sb3dcblx0XHRcdFx0XHQ/IHRoaXMuY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogcGFyYW1ldGVycy5jcmVhdGlvblJvdyxcblx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmRcblx0XHRcdFx0XHQgIH0pXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c6XG5cdFx0XHRcdGlmIChvRGF0YUxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdC8vIENyZWF0aW9uIHdpdGggZGlhbG9nIGluIGFuIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2csXG5cdFx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDcmVhdGlvbiB3aXRoIGRpYWxvZyBpbiBhIExpc3RSZXBvcnRcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dBbmRTYXZlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5TeW5jOlxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQXN5bmM6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZVN5bmNBc3luY0RvY3VtZW50KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogcmVzb2x2ZWRDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdFx0XHRiRnJvbURlZmVycmVkOiBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQsXG5cdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y3JlYXRlQWN0aW9uOiBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSAke3Jlc29sdmVkQ3JlYXRpb25Nb2RlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKkV4ZWN1dGVzIHRoZSBtYW5kYXRvcnkgY29uZmlndXJhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZC5cblx0ICogQHBhcmFtIHByZXJlcXVpc2l0ZSBQcm9taXNlIG9mIHRoZSBkb2N1bWVudCBjcmVhdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyBwb3N0RG9jdW1lbnRDcmVhdGlvbihwcmVyZXF1aXNpdGU6IFByb21pc2U8W0NvbnRleHQsIHVua25vd25dPiwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBwYXJhbXMgPSBhd2FpdCBwcmVyZXF1aXNpdGU7XG5cdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0ID0gcGFyYW1zWzBdO1xuXHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQ3JlYXRlKHsgY29udGV4dDogbmV3RG9jdW1lbnRDb250ZXh0IH0pO1xuXHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpOyAvLyBUaGUgY3JlYXRlTW9kZSBmbGFnIHdpbGwgYmUgc2V0IGluIGNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZVxuXHRcdGlmICghbGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCB0byB0ZWxsIHRoZSBPUCB0aGF0IHdlJ3ZlIGNyZWF0ZWQgYSBuZXcgb2JqZWN0IGZyb20gdGhlIExSXG5cdFx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRcdGNvbnN0IG5ld0FjdGlvbiA9IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBuZXdBY3Rpb24pO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpIHx8XG5cdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChsaXN0QmluZGluZylcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBpdGVtIGluIGEgaGllcmFyY2h5L2FuYWx5dGljYWwgdGFibGUgZnJvbSB0aGUgTGlzdFJlcG9ydCAoc2luY2UgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSlcblx0XHRcdFx0Ly8gLS0+IHdlIHdhbnQgdG8gZm9yY2UgdGhlIHVzZXIgdG8gZWl0aGVyIHNhdmUgb3IgZGlzY2FyZCB0aGUgZHJhZnQgYmVmb3JlIGxlYXZpbmcgdGhlIE9QXG5cdFx0XHRcdHRoaXMuZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nKTtcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChuZXdEb2N1bWVudENvbnRleHQpICYmXG5cdFx0XHRcdCF0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgaW5pdGlhbCBzaGFyZSBhY3Rpb24gc2hhbGwgYmUgY2FsbGVkXG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2V0SW5pdGlhbFNoYXJlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFRoZSBjcmVhdGlvbiByb3dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQocGFyYW1ldGVyczoge1xuXHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRjcmVhdGlvblJvdzogQ3JlYXRpb25Sb3c7XG5cdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0fSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBjcmVhdGlvbjogUHJvbWlzZTxDb250ZXh0Pjtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdztcblx0XHRjb25zdCB0YWJsZSA9IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCkgYXMgVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0bGV0IG5hdmlnYXRpb24gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRpZiAoIXRhYmxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiQ3JlYXRpb25Sb3dcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0fVxuXHRcdGNvbnN0IGNyZWF0aW9uUm93Q29udGV4dCA9IGNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRjb25zdCBkb2N1bWVudFZhbGlkYXRpb24gPSB0aGlzLmdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlKTtcblx0XHQvLyBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIGlzIHNldCB0byBmYWxzZSBpbiBtYW5pZmVzdCBjb252ZXJ0ZXIgKFRhYmxlLnRzKSBpZiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gZXhpc3RzXG5cdFx0aWYgKGNyZWF0aW9uUm93LmRhdGEoXCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhXCIpID09PSBcInRydWVcIikge1xuXHRcdFx0dGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlcyA9IGF3YWl0IHRoaXMuc3luY1Rhc2soZG9jdW1lbnRWYWxpZGF0aW9uKTtcblx0XHRpZiAodmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKHZhbGlkYXRpb25NZXNzYWdlcywgdGFibGUpO1xuXHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0Ly8gaWYgY3VzdG9tIHZhbGlkYXRpb24gZmFpbHMsIHdlIGxlYXZlIHRoZSBtZXRob2QgaW1tZWRpYXRlbHlcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSkpLnRhcmdldEVudGl0eVR5cGU7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dQYXlsb2FkID0gY3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXG5cdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHQvL21vdmVkIGFmdGVyIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMgdG8gYXZvaWQgXCInY3JlYXRpb24nIHVzZSBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIiBjb25zb2xlIGVycm9yc1xuXHRcdC8vYWZ0ZXIgdmFsaWRhdGlvbiBlcnJvcnMgb2NjdXJyZWRcblx0XHRsaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0YXdhaXQgY3JlYXRpb247XG5cdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPyB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwKTtcblx0XHR9KTtcblxuXHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKGxpc3RCaW5kaW5nKTtcblx0XHR0cnkge1xuXHRcdFx0Y3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGF0YTogT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRcdHt9LFxuXHRcdFx0XHRcdFx0Li4uT2JqZWN0LmtleXMoY3JlYXRpb25Sb3dQYXlsb2FkKVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdFx0XHRcdChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT5cblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gcHJvcGVydHlQYXRoKSA9PT0gLTFcblx0XHRcdFx0XHRcdFx0KSAvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0XHQubWFwKChwYXRoKSA9PiAoeyBbcGF0aF06IGNyZWF0aW9uUm93UGF5bG9hZFtwYXRoXSB9KSlcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IGFwcENvbXBvbmVudC5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlLCAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdFx0Ly8gU2lkZUVmZmVjdHMgb24gQ3JlYXRlXG5cdFx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdGNvbnN0IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBuZXdUcmFuc2llbnRDb250ZXh0ID0gY3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdGNyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG5ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0bmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCk/LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkNyZWF0aW9uUm93IG5hdmlnYXRpb24gZXJyb3I6IFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIElubGluZSBtb2RlIG9yIHdpdGggYSBjcmVhdGlvbiBpbmxpbmUgZGlhbG9nIChPYmplY3QgcGFnZSBjYXNlKS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IFBhcmVudCBjb250ZXh0IChmb3IgVHJlZVRhYmxlKVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEludGlhbCBkYXRhIGZvciBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyBGaWVsZHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjcmVhdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUgfCBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHR0YWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHR9XG5cdFx0aWYgKHRhYmxlPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0dGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNyZWF0ZUNvbXBsZXRlZFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCBjcmVhdGlvbjtcblx0XHRcdFx0Y29uc3QgY29udGV4dEluZGV4ID0gbmV3Q29udGV4dC5nZXRJbmRleCgpO1xuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRhdGEgPSBsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgY3JlYXRlSW5QbGFjZT86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0Y29uc3QgaXNDcmVhdGVJblBsYWNlID0gYWdncmVnYXRpb25EYXRhPy5jcmVhdGVJblBsYWNlID8/IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChjb250ZXh0SW5kZXggIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aWYgKCF0YWJsZT8uZ2V0QnVzeSgpKSB7XG5cdFx0XHRcdFx0XHRcdHRhYmxlPy5mb2N1c1Jvdyhjb250ZXh0SW5kZXgsIHRydWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQ3JlYXRlSW5QbGFjZSkge1xuXHRcdFx0XHRcdC8vIEZvciBjcmVhdGUgaW4tcGxhY2UgbW9kZSAoc2VydmVyIHBvc2l0aW9uKSwgZGlzcGxheSBhIHdhcm5pbmcgbWVzc2FnZSBpbiBjYXNlIHRoZSBuZXdseSBjcmVhdGVkIG5vZGUgaXNuJ3QgdmlzaWJsZVxuXHRcdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHRoaXMuX2dldFJlc291cmNlTW9kZWwoKS5nZXRUZXh0KFwiQ19ORVdfRUxFTUVOVF9OT1RfRElTUExBWUVEXCIpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykgJiYgIWlzQ3JlYXRlSW5QbGFjZSkge1xuXHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSB0cmVlIHRhYmxlLCB3ZSBhbHNvIHNjcm9sbCB0byBrZWVwIHRoZSBwYXJlbnQgdmlzaWJsZVxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudENvbnRleHQgPSBuZXdDb250ZXh0LmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50Q29udGV4dD8uZ2V0SW5kZXgoKTtcblx0XHRcdFx0XHRpZiAocGFyZW50SW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0XHR0YWJsZT8uc2Nyb2xsVG9JbmRleChwYXJlbnRJbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFibGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHR7XG5cdFx0XHRcdC8vQ2hlY2sgaWYgQWxsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZFxuXHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCxcblx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkczogcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkc1xuXHRcdFx0fSxcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cblx0XHRpZiAoIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKSwgbGlzdEJpbmRpbmcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdmlhIGEgZGlhbG9nIGFuZCBzYXZlcyBpdCBpbW1lZGlhdGVseSAoTGlzdFJlcG9ydCBjYXNlKS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGFibGVJZCBUaGUgaWQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgUGFyZW50IGNvbnRleHQgKGZvciBUcmVlVGFibGUpXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgSW50aWFsIGRhdGEgZm9yIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIEZpZWxkcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURpYWxvZ0FuZFNhdmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHR0YWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0YWJsZT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgIT09IHRydWUpIHtcblx0XHRcdFx0dGFibGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNhdmVkRG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IGFmdGVyQ3JlYXRlSW5EaWFsb2cgPSBhc3luYyAobmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJDcmVhdGUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBFcnJvcnMgaW4gb25BZnRlckNyZWF0ZSBhcmUgbm90IGNhdXNpbmcgdGhlIG92ZXJhbGwgZmxvdyB0byBmYWlsXG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGFmdGVyIGNyZWF0aW9uOiBcIiArIGVycm9yKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHRcdHNhdmVkRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnNhdmVEb2N1bWVudChcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRbXSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlclNhdmUoe1xuXHRcdFx0XHRcdGNvbnRleHQ6IHNhdmVkRG9jdW1lbnRDb250ZXh0XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gRXJyb3JzIGluIG9uQWZ0ZXJTYXZlIGFyZSBub3QgY2F1c2luZyB0aGUgb3ZlcmFsbCBmbG93IHRvIGZhaWxcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgYWZ0ZXIgc2F2ZTogXCIgKyBlcnJvcik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgd2UgZG9uJ3QgdXNlIHRoZSBsaXN0QmluZGluZyBmcm9tIHRoZSBMaXN0UmVwb3J0IHRvIGNyZWF0ZSB0aGUgbmV3IGl0ZW0sXG5cdFx0XHRcdC8vIFNvIHdlIGNhbid0IGtub3cgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgaXRlbSBpbiB0aGUgbGlzdEJpbmRpbmdcblx0XHRcdFx0Ly8gLS0+IFdlIHJlZnJlc2ggdGhlIHRhYmxlIGFuZCBzY3JvbGwgdG8gdGhlIHBhcmVudCBwb3NpdGlvblxuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHRhYmxlQVBJKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50SW5kZXggPSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQ/LmdldEluZGV4KCk7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVmcmVzaCgpO1xuXHRcdFx0XHRcdGlmIChwYXJlbnRJbmRleCAhPT0gdW5kZWZpbmVkICYmIHBhcmVudEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdHRhYmxlPy5zY3JvbGxUb0luZGV4KHBhcmVudEluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmbGF0IHRhYmxlLCB3ZSBjYW4gc2Nyb2xsIHRvIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW1cblx0XHRcdFx0Y29uc3QgaXRlbUluZGV4ID0gc2F2ZWREb2N1bWVudENvbnRleHQuZ2V0SW5kZXgoKTtcblx0XHRcdFx0aWYgKGl0ZW1JbmRleCAhPT0gdW5kZWZpbmVkICYmIGl0ZW1JbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgoaXRlbUluZGV4KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0e1xuXHRcdFx0XHQvL0NoZWNrIGlmIEFsbCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWRcblx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRhZnRlckNyZWF0ZUNhbGxCYWNrOiBhZnRlckNyZWF0ZUluRGlhbG9nLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZyxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKTtcblx0XHRpZiAoc2F2ZWREb2N1bWVudENvbnRleHQgJiYgcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgIT09IHRydWUpIHtcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBzYXZlZERvY3VtZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkZWZmZXJlZCBkb2N1bWVudC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IE9wdGlvbmFsIHBhcmVudCBjb250ZXh0IHdoZW4gY3JlYXRpbmcgYSBub2RlIGluIFRyZWVUYWJsZVxuXHQgKiBAcGFyYW0gZGF0YVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRGVmZXJyZWREb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0LCBkYXRhPzogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChsaXN0QmluZGluZywge1xuXHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJEZWZlcnJlZFwiLCBwYXJlbnRDb250ZXh0LCBsaXN0QmluZGluZywgZGF0YSB9LFxuXHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0fSk7XG5cdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN5bmMgb3IgYXN5bmMgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBzeW5jIG9yIGFzeW5jIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCBUaGlzIGRvY3VtZW50IGlzIGNyZWF0ZWQgYWZ0ZXIgYSBkZWZmZXJlZCBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gIFRoZSBjcmVhdGUgaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgY3JlYXRlIGFjdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhICBEYXRhIHRvIHNhdmUgb24gdGhlIG5ldyBkb2N1bWVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZVN5bmNBc3luY0RvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0ZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBuYXZpZ2F0aW9uOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCByb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldEludGVybmFsUm91dGluZygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpXG5cdFx0XHQuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHQuLi57XG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkgJiYgbmV3RG9jdW1lbnRDb250ZXh0ICYmIG5ld0RvY3VtZW50Q29udGV4dC5nZXRCaW5kaW5nKCkgIT09IGxpc3RCaW5kaW5nKSB7XG5cdFx0XHRcdFx0Ly8gSW4gRkNMIGNhc2UsIGlmIHRoZSBuZXcgY29udGV4dCBoYXMgYmVlbiBjcmVhdGVkIHdpdGggYW4gYWN0aW9uIChub3Qgd2l0aCB0aGUgc3RhbmRhcmQgUE9TVCBjcmVhdGUpLCB3ZSBuZWVkIHRvIHJlZnJlc2hcblx0XHRcdFx0XHQvLyB0aGUgb3JpZ2luYWwgbGlzdEJpbmRpbmcgc28gdGhhdCBpdCBjb250YWlucyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QgKHRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBsaXN0QmluZGluZyBmb3Igc3RhbmRhcmQgY3JlYXRlKVxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KTtcblxuXHRcdC8vIERvbid0IGRvIHRoaXMgaWYgdGhlIGludm9jYXRpb24gY29tZXMgZnJvbSBhIGRlZmVycmVkIGNyZWF0aW9uIG9yIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvd1xuXHRcdGlmIChwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgIT09IHRydWUgJiYgIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXG5cdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmMpIHtcblx0XHRcdG5hdmlnYXRpb24gPSByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiQXN5bmNcIiwgY3JlYXRlQ29udGV4dFByb21pc2U6IGNyZWF0aW9uIH0sXG5cdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2aWdhdGlvbiA9IGNyZWF0aW9uLnRoZW4oYXN5bmMgKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAoIW5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdFx0cmV0dXJuIHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfRURJVEZMT1dfU0FQRkVfQ1JFQVRJT05fRkFJTEVEX0RFU0NSSVBUSU9OXCIpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgU3luYyBjcmVhdGlvbiB3YXMgdHJpZ2dlcmVkIGZvciBhIGRlZmVycmVkIGNyZWF0aW9uLCB3ZSBkb24ndCBuYXZpZ2F0ZSBmb3J3YXJkXG5cdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0Y29uc3QgbmF2UGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0dHJhbnNpZW50OlxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpID09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHQ/IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ6IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LCBuYXZQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdC8vIGNyZWF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB1c2VyIG9yIGZhaWxlZCBpbiBiYWNrZW5kID0+IGluIGNhc2Ugd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdHJhbnNpZW50IGNvbnRleHQgYmVmb3JlLCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHQvLyB0aGUgc3dpdGNoLXN0YXRlbWVudCBhYm92ZSBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaGFwcGVucyBpbiBjcmVhdGlvbk1vZGVzIGRlZmVycmVkIGFuZCBhc3luYy4gQnV0IGluIGZhY3QsIGluIHRoZXNlIGNhc2VzIGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGZyb20gcm91dGVNYXRjaGVkIGluIE9QIGNvbXBvbmVudFxuXHRcdFx0Ly8gY3JlYXRlRGVmZXJyZWREb2N1bWVudCBpcyB0cmlnZ2VyZWQsIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIChjcmVhdGVEb2N1bWVudCkgYWdhaW4gLSB0aGlzIHRpbWUgd2l0aCBjcmVhdGlvbk1vZGUgc3luYy4gVGhlcmVmb3JlLCBhbHNvIGluIHRoYXQgbW9kZSB3ZSBuZWVkIHRvIHRyaWdnZXIgYmFjayBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gVGhlIG90aGVyIGNhc2VzIG1pZ2h0IHN0aWxsIGJlIG5lZWRlZCBpbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIGZhaWxzLlxuXHRcdFx0aWYgKFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyxcblx0XHRcdFx0XHRDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWRcblx0XHRcdFx0XS5pbmNsdWRlcyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gZXh0ZXJuYWwgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gb3V0Ym91bmQgVGhlIG91dGJvdW5kIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVFeHRlcm5hbERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLCBvdXRib3VuZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdGlmIChvdXRib3VuZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBsaXN0QmluZGluZyAhPT0gXCJzdHJpbmdcIiAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiRXh0ZXJuYWxcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRjb25zdCBjcmVhdGVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHRoaXMuYmFzZS5nZXRWaWV3KCksIGxpc3RCaW5kaW5nKTtcblx0XHRcdGNvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoY29udHJvbGxlciwgb3V0Ym91bmQsIHVuZGVmaW5lZCwgY3JlYXRlUGF0aCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRvY3VtZW50IGNyZWF0aW9uLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIGNyZWF0aW9uUHJvbWlzZSBUaGUgcHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgU2lkZUVmZmVjdHMgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRoYW5kbGVTaWRlRWZmZWN0cyA9IGFzeW5jIChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgY3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpICYmIHZpZXdCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZXMgVGhlIGVycm9yIG1lc3NhZ2VzIGZvcm0gdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdGFyZ2V0ZWQgYnkgdGhlIG1lc3NhZ2VzXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAodmFsaWRhdGlvbk1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdLCB0YWJsZTogVGFibGUpOiB2b2lkID0+IHtcblx0XHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRpdHkgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0Y29uc3QgY3VzdG9tTWVzc2FnZXM6IEN1c3RvbU1lc3NhZ2VbXSA9IFtdO1xuXHRcdGxldCBmaWVsZENvbnRyb2w7XG5cdFx0bGV0IGZpbmFsVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0Y29uc3Qgb2xkTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0Q29kZSgpID09PSBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pO1xuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvbGRNZXNzYWdlcyk7XG5cblx0XHR2YWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgodmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcblx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdGZpZWxkQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0ZmluYWxUYXJnZXQgPSBgJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdC8vIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgc3RpbGwgbm90IGV4aXN0c1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IU1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSkubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZTogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0dGVjaG5pY2FsOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogZmluYWxUYXJnZXRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSk7XG5cdFx0XHRcdGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHR0ZXh0OiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGN1c3RvbU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGN1c3RvbU1lc3NhZ2VzXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqIFByb3ZpZGVzIHRoZSBleHBlY3RlZCBjcmVhdGlvbiBtb2RlOlxuXHQgKiAtIHByZXNlcnZlcyB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGUgd2hlbiB0aGlzIG9uZSBpcyBub3QgYSBOZXdQYWdlXG5cdCAqIC0gY2FsY3VsYXRlcyB0aGUgbmV3IG9uZSBpZiB0aGUgY3JlYXRpb24gbW9kZSBpcyBhIE5ld1BhZ2UuXG5cdCAqIEBwYXJhbSBpbml0aWFsQ3JlYXRpb25Nb2RlIFRoZSBpbml0aWFsIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGNyZWF0ZURhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3Igb2JqZWN0IGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0cmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChpbml0aWFsQ3JlYXRpb25Nb2RlOiBzdHJpbmcsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuXHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdFx0Ly8gTmV3QWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBOYXZpZ2F0aW9uUHJvcGVydHkgY29sbGVjdGlvblxuXHRcdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRuZXdBY3Rpb24gPSAoXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdD8gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ6IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHRcdCk/Lk5ld0FjdGlvbj8udG9TdHJpbmcoKTtcblxuXHRcdFx0XHRpZiAobmV3QWN0aW9uICYmIGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aC50YXJnZXRFbnRpdHlUeXBlLmFjdGlvbnNbbmV3QWN0aW9uXS5wYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdGFzeW5jIHZhbGlkYXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiB7IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbj86IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuXHQpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgcmVzdWx0IG9mXG5cdCAqIGEgY3JlYXRpb24gcm93J3MgY3VzdG9tIHZhbGlkYXRpb24gYXMgYSBwcm9taXNlLiBJZiBubyBjcmVhdGlvbiByb3cgaXMgaW52b2x2ZWRcblx0ICogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiByZXR1cm5zIGEgcmVzb2x2ZWQgcHJvbWlzZS5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aXRoIHRoZSBjcmVhdGlvblJvd1xuXHQgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2Vcblx0ICovXG5cdGdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZCk6ICgpID0+IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gdGFibGU/LmdldENyZWF0aW9uUm93KCk7XG5cdFx0aWYgKGNyZWF0aW9uUm93ICYmIHRhYmxlKSB7XG5cdFx0XHRyZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4gPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGlvblJvd09iamVjdHMgPSAoY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRPYmplY3QoKTtcblx0XHRcdFx0ZGVsZXRlIGNyZWF0aW9uUm93T2JqZWN0c1tcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbGlkYXRlRG9jdW1lbnQodGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0ZGF0YTogY3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIGFzeW5jICgpID0+IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBkYXRhRm9yQ3JlYXRlIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBuZXcgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBjcmVhdGVBdEVuZCBUcnVlIGlmIHRoZSBuZXcgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGFzIGluYWN0aXZlXG5cdCAqIEBwYXJhbSByZXF1ZXN0U2lkZUVmZmVjdHMgVHJ1ZSBieSBkZWZhdWx0LCBmYWxzZSBpZiBTaWRlRWZmZWN0cyBzaG91bGQgbm90IGJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0cy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGRhdGFGb3JDcmVhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlLFxuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxDb250ZXh0W10+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZztcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHMgPSByZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YXJnZXRMaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0bGV0IG1ldGFQYXRoOiBzdHJpbmc7XG5cblx0XHRcdGlmICh0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHt0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyh0YXJnZXRMaXN0QmluZGluZyk7XG5cblx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRjb25zdCBjcmVhdGlvblByb21pc2VzID0gZGF0YUZvckNyZWF0ZS5tYXAoYXN5bmMgKHByb3BlcnR5VmFsdWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgPSB7IGRhdGE6IHt9LCBwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBkZWVwIGNyZWF0ZVxuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHttZXRhUGF0aH0vJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0cHJvcGVydHkgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdFx0XHQhcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5kYXRhIVtwcm9wZXJ0eVBhdGhdID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdHRhcmdldExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dHMgPSBjcmVhdGVkQ29udGV4dHMuZmlsdGVyKChuZXdDb250ZXh0KSA9PiAhbmV3Q29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoYWN0aXZlQ29udGV4dHMubWFwKGFzeW5jIChuZXdDb250ZXh0KSA9PiBuZXdDb250ZXh0LmNyZWF0ZWQoKSkpO1xuXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKHJlcXVlc3RTaWRlRWZmZWN0cyAmJiAhQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dCh0YXJnZXRMaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB2aWV3QmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgJiYgYWN0aXZlQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBhY3RpdmVDb250ZXh0cyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBjcmVhdGVkQ29udGV4dHM7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyBtdWx0aXBsZSBkb2N1bWVudHMuXCIpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnQ3JlYXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0UGF0aCBQYXRoIHBvaW50aW5nIHRvIHRoZSBjb250ZXh0IG9uIHdoaWNoIENyZWF0ZSBhY3Rpb24gaXMgdHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY3JlYXRlUGFyYW1ldGVycyBBcnJheSBvZiB2YWx1ZXMgdGhhdCBhcmUgZmlsbGVkIGluIHRoZSBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZUNyZWF0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRQYXRoPzogc3RyaW5nOyBjcmVhdGVQYXJhbWV0ZXJzPzogdW5rbm93bltdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRWRpdCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdFZGl0JyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoXCJBZnRlckFzeW5jXCIpXG5cdGFzeW5jIG9uQmVmb3JlRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEaXNjYXJkJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZGlzY2FyZGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEZWxldGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgYWN0aW9uIGV4ZWN1dGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUV4ZWN1dGVBY3Rpb25cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSB1c2VkIGZvciB0aGUgYWN0aW9uIGV4ZWN1dGlvblxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoXCJBZnRlckFzeW5jXCIpXG5cdGFzeW5jIG9uQmVmb3JlRXhlY3V0ZUFjdGlvbihfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIHwgQ29udGV4dCB8IG51bGwgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgY29udGV4dCB3ZSBvYnRhaW5lZCBhZnRlciBzYXZpbmdcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyU2F2ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJDcmVhdGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyQ3JlYXRlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdFZGl0JyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJFZGl0XG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBQYWdlIGNvbnRleHQgdGhhdCBpcyBnb2luZyB0byBiZSBlZGl0ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckVkaXQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckRpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IG9idGFpbmVkIGFmdGVyIGRpc2NhcmRpbmcgdGhlIG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIHdlIGRpc2NhcmRlZCBhIG5ldyBvYmplY3Rcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMTYuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckRlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgSW5kaWNhdGVzIHdoZXRoZXIgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBpZ25vcmVkIHdoZW4gdXNlciBjbGlja3Mgb24gU2F2ZSBkdXJpbmcgYW4gSW5saW5lIGNyZWF0aW9uXG5cdC8vIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5iaW5kaW5ncyBMaXN0IGJpbmRpbmdzIG9mIHRoZSB0YWJsZXMgaW4gdGhlIHZpZXcuXG5cdC8vIEJvdGggb2YgdGhlIGFib3ZlIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc2FtZSBwdXJwb3NlLiBVc2VyIGNhbiBlbnRlciBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBjcmVhdGlvbiByb3cocykgYnV0IGRvZXMgbm90ICdBZGQgcm93JywgaW5zdGVhZCBjbGlja3MgU2F2ZS5cblx0Ly8gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgaW4gdGhlIHZpZXcuXG5cblx0LyoqXG5cdCAqIFNhdmVzIGEgbmV3IGRvY3VtZW50IGFmdGVyIGNoZWNraW5nIGl0LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBzYXZlIGlzIGNvbXBsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNhdmVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbVBhcmFtZXRlcnM6IFNhdmVEb2N1bWVudFBhcmFtZXRlcnMpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBzYXZlRG9jdW1lbnQgaXMgY2FsbGVkIGZyb20gaW5saW5lIGVkaXQga2V5Ym9hcmQgc2hvcnRjdXRcblx0XHRpZiAoXG5cdFx0XHQhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSAmJlxuXHRcdFx0dGhpcy5iYXNlLmlubGluZUVkaXRGbG93Py5pc0lubGluZUVkaXRQb3NzaWJsZSgpICYmXG5cdFx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9pc0lubGluZUVkaXRBY3RpdmVcIilcblx0XHQpIHtcblx0XHRcdHRoaXMuYmFzZS5pbmxpbmVFZGl0Rmxvdy5pbmxpbmVFZGl0U2F2ZSgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0Y29uc3QgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciB8fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgYUJpbmRpbmdzID0gbVBhcmFtZXRlcnMuYmluZGluZ3MgYXMgT0RhdGFMaXN0QmluZGluZ1tdO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Ly8gaW4gY2FzZSBvZiBzYXZpbmcgLyBhY3RpdmF0aW5nIHRoZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIHNoYWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBQQVRDSC9QT1NUXG5cdFx0XHQvLyBpcyBzZW50IHRvIHRoZSBiYWNrZW5kXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMubWVyZ2VQYXRjaERyYWZ0ICE9PSB0cnVlKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdFx0Ly93ZSBuZWVkIHRvIHJlcXVlc3QgZm9yIHJlY29tbWVuZGF0aW9ucyBhbmQgdGhlbiBicmluZyB0aGUgZGlhbG9nIGhlcmVcblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLmNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24oKTtcblx0XHRcdGNvbnN0IHJvb3RDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRSb290Q29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogcm9vdENvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJlxuXHRcdFx0XHRcdHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkgfHxcblx0XHRcdFx0dGhpcy5faGlkZGVuRHJhZnRcblx0XHRcdCkge1xuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0dGhpcy5faGlkZGVuRHJhZnQgPyBvQ29udGV4dCA6IChyb290Vmlld0NvbnRyb2xsZXIgYXMgRmNsQ29udHJvbGxlcikuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRXhlY3V0ZSB0aGUgcmVnaXN0ZXJlZCBkZWZlcnJlZCBTaWRlRWZmZWN0cyB3aGljaCBoYXZlIG5vdCBiZSBleGVjdXRlZCB5ZXQgZm9yIHRoZSBwYWdlIGNvbnRleHRcblx0XHRcdC8vIENhbiBvY2N1ciB3aGVuIHNob3J0Y3V0IGlzIHVzZWQgdG8gc2F2ZSB0aGUgZG9jdW1lbnQuXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuX3NpZGVFZmZlY3RzLmhhbmRsZVBhZ2VDaGFuZ2VDb250ZXh0KG9Db250ZXh0KTtcblxuXHRcdFx0Ly8gVGhlICRhdXRvIHF1ZXVlIGNhbiBvbmx5IGhhdmUgcGVuZGluZyBjaGFuZ2VzIGF0IHRoaXMgcG9pbnQgd2hlbiBTQVZFIHdhcyBjbGlja2VkIGltbWVkaWF0ZWx5IGFmdGVyIGNoYW5naW5nIGEgZmllbGQuXG5cdFx0XHQvLyBJbiB0aGlzIGNhc2UgdGhlICRhdXRvIHF1ZXVlIGlzIGxvY2tlZCB0aGVyZWZvcmUgdGhlIGZvbGxvd2luZyBzdWJtaXQgYmF0Y2ggc2hvdWxkIG5vdCBjcmVhdGUgYSBzZXBhcmF0ZSBiYXRjaCByZXF1ZXN0LlxuXHRcdFx0Ly8gSXQgaXMgZG9uZSBpbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCBwYXRjaCwgZHJhZnRwcmVwYXJlLCBkcmFmdGFjdGl2YXRlIGVhY2ggaGF2ZSB0aGVpciBvd24gY2hhbmdlc2V0XG5cdFx0XHRpZiAob0NvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcyhcIiRhdXRvXCIpICYmIG1QYXJhbWV0ZXJzLm1lcmdlUGF0Y2hEcmFmdCkge1xuXHRcdFx0XHRvQ29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBhY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5zYXZlRG9jdW1lbnQoXG5cdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIGFzIGJvb2xlYW4sXG5cdFx0XHRcdGFCaW5kaW5ncyxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLmdldENyZWF0aW9uTW9kZSgpXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3RpdmF0ZSwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShTdGFuZGFyZEFjdGlvbnMuc2F2ZSwgVHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJTYXZlKHtcblx0XHRcdFx0Y29udGV4dDogYWN0aXZlRG9jdW1lbnRDb250ZXh0XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gdXBkYXRlIHRlbGVtZXRyeSBkYXRhIGZvciBob3cgcGFnZSB3YXMgc2F2ZWQgYW5kIHRoZW4gZG8gc3RvcmluZyBvZiB0aGlzIGRhdGEgdG8gYmFja2VuZCB0aHJvdWdoIHRoZSBzdG9yZURhdGEgZnVuY3Rpb25cblx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuc3RvcmVEYXRhRm9yVGVsZW1ldHJ5KHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbik7XG5cblx0XHRcdGlmIChhY3RpdmVEb2N1bWVudENvbnRleHQgIT09IG9Db250ZXh0KSB7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IGFjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXaGVuIHNhdmluZywgdGhlIHNlbWFudGljIGtleXMgbWF5IGhhdmUgY2hhbmdlZC5cblx0XHRcdFx0XHQvLyBJbiB0aGlzIGNhc2UsIHdlIGFsc28gbmVlZCB0byBtYW5hZ2UgdGhlIHNlbWFudGljIFVSTCBjaGFuZ2UgaW4gdGhlIGhpc3Rvcnlcblx0XHRcdFx0XHRjb25zdCBwcmV2aW91c1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChvQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29uc3QgbmV3U2VtYW50aWNQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGFjdGl2ZURvY3VtZW50Q29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHByZXZpb3VzU2VtYW50aWNQYXRoICYmIG5ld1NlbWFudGljUGF0aCAmJiBwcmV2aW91c1NlbWFudGljUGF0aCAhPT0gbmV3U2VtYW50aWNQYXRoKSB7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogcHJldmlvdXNTZW1hbnRpY1BhdGgsIG5ld1BhdGg6IG5ld1NlbWFudGljUGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmIChyb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgfHwgdGhpcy5faGlkZGVuRHJhZnQ/LnN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJTYXZlKSB7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBhY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3ICE9PSB0cnVlKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0aWYgKCEob0Vycm9yICYmIChvRXJyb3IgYXMgeyBjYW5jZWxlZD86IGJvb2xlYW4gfSkuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN3aXRjaGVzIHRoZSBVSSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBzd2l0Y2ggZnJvbVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIHN3aXRjaCBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyB0b2dnbGVEcmFmdEFjdGl2ZShvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBlZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRlZGl0YWJsZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBzdGFydCBwb2ludCBhY3RpdmUgZG9jdW1lbnRcblx0XHRcdGVkaXRhYmxlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9SaWdodG1vc3RDb250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHRpZiAoIXNpYmxpbmdJbmZvICYmIG9Db250ZXh0ICE9PSBvUmlnaHRtb3N0Q29udGV4dCkge1xuXHRcdFx0XHQvLyBUcnkgdG8gY29tcHV0ZSBzaWJsaW5nIGluZm8gZm9yIHRoZSByb290IGNvbnRleHQgaWYgaXQgZmFpbHMgZm9yIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0XHQvLyAtLT4gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlIHRyeSB0byBzd2l0Y2ggYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGJ1dCBhIGNoaWxkIGVudGl0eSBoYXMgbm8gc2libGluZywgdGhlIHN3aXRjaCB3aWxsIGNsb3NlIHRoZSBjaGlsZCBjb2x1bW5cblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBvQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSBzaWJsaW5nSW5mby5wYXRoTWFwcGluZ1tzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IGxhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLCBuZXdQYXRoOiB0YXJnZXRQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LCB7IGVkaXRhYmxlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlOiR7b0Vycm9yfWApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2wgVGhpcyBpcyB0aGUgY29udHJvbCB1c2VkIHRvIG9wZW4gdGhlIGRpc2NhcmQgcG9wb3ZlclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjYW5jZWxEb2N1bWVudChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRtUGFyYW1ldGVyczoge1xuXHRcdFx0Y29udHJvbD86IEJ1dHRvbjtcblx0XHRcdGNhbmNlbEJ1dHRvbj86IEJ1dHRvbjtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3Zlcj86IGJvb2xlYW47XG5cdFx0XHRza2lwQmFja05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0c2tpcEJpbmRpbmdUb1ZpZXc/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRsZXQgaXNOZXdEb2N1bWVudCA9IGZhbHNlO1xuXHRcdGNvbnN0IGNhbmNlbFBhcmFtZXRlcnM6IENhbmNlbFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI6IG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciA9PT0gdHJ1ZSxcblx0XHRcdGNhbmNlbEJ1dHRvbjogKG1QYXJhbWV0ZXJzLmNvbnRyb2wgfHwgbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uKSEsXG5cdFx0XHRiZWZvcmVDYW5jZWxDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZFxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHQ6IENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGlmIChcblx0XHRcdFx0KChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmIHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB8fFxuXHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdFxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gb0NvbnRleHQgOiAob1Jvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdGNhbmNlbFBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLl9oaWRkZW5EcmFmdCA/IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCkgJiYgIXJvb3RDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpIDogdGhpcy5nZXRDcmVhdGlvbk1vZGUoKSxcblx0XHRcdFx0dGhpcy5pc0RvY3VtZW50TW9kaWZpZWQoKSB8fCBzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgLy8gSW4gc3RpY2t5IG1vZGUgd2UgYWx3YXlzIGFzayBmb3IgY29uZmlybWF0aW9uXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0LmZvckVhY2goKHZpZXcpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAoY29udGV4dD8uaXNLZWVwQWxpdmUoKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGlzY2FyZCh7XG5cdFx0XHRcdGNvbnRleHQ6IGNhbmNlbFJlc3VsdFxuXHRcdFx0fSk7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQ29udGV4dCk7XG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIG5vIGFjdGl2ZUNvbnRleHQgaXMgcmV0dXJuZWQgLS0+IG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChyb290Q29udGV4dCk7XG5cdFx0XHRcdFx0aXNOZXdEb2N1bWVudCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBjYW5jZWxSZXN1bHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQodGhpcy5faXNGY2xFbmFibGVkKCkgfHwgdGhpcy5faGlkZGVuRHJhZnQ/LnN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJDYW5jZWwpICYmXG5cdFx0XHRcdFx0c2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgbG9hZGVkIHRvZ2V0aGVyIGJ5IGF1dG9FeHBhbmRTZWxlY3QsIHNvIHRoYXQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBFZGl0IG1vZGVcblx0XHRcdFx0XHQvLyAkJGluaGVyaXRFeHBhbmRTZWxlY3QgdGFrZXMgYWxsIGxvYWRlZCBwcm9wZXJ0aWVzIGludG8gYWNjb3VudCAoQkNQIDIwNzA0NjIyNjUpXG5cdFx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldykge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgeyBlZGl0YWJsZTogZmFsc2UsIHJlY3JlYXRlQ29udGV4dDogdHJ1ZSwgZm9yY2VGb2N1czogdHJ1ZSB9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEFjdGl2ZSBjb250ZXh0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgY2FuY2VsIG9mIGV4aXN0aW5nIGRvY3VtZW50LCBhbmQgaXQncyB0aGUgc2FtZSBhcyB0aGUgZWRpdGVkIGNvbnRleHRcblx0XHRcdFx0XHQvLyBTbywgd2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gYXMgaXQgbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgd2hlbiBjYWxsaW5nIHNldEtlZXBBbGl2ZShmYWxzZSkgb24gYWxsIHZpZXcncyBjb250ZXh0c1xuXHRcdFx0XHRcdC8vIGVhcmxpZXIgaW4gdGhpcyBtZXRob2Rcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgIXRoaXMuX2hpZGRlbkRyYWZ0KSB7XG5cdFx0XHRcdC8vc2hvdyBEcmFmdCBkaXNjYXJkZWQgbWVzc2FnZSB0b2FzdCBvbmx5IGZvciBkcmFmdCBlbmFibGVkIGFwcHNcblx0XHRcdFx0dGhpcy5zaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGdldFJvb3RDb250ZXh0KGNvbnRleHQ6IENvbnRleHQsIGJpbmRpbmdQYXJhbWV0ZXJzPzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm9bXCJwYXJhbWV0ZXJzXCJdKTogUHJvbWlzZTxDb250ZXh0PiB7XG5cdFx0Y29uc3Qgdmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzO1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0aWYgKCh2aWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxKSB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCB8fCBwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRyZXR1cm4gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KFxuXHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyc1xuXHRcdFx0XHQpKSBhcyBDb250ZXh0O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY29udGV4dDtcblx0fVxuXG5cdGFzeW5jIGlzUm9vdENvbnRleHROZXcoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IHJvb3RDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRSb290Q29udGV4dChjb250ZXh0LCB7ICRzZWxlY3Q6IFwiSGFzQWN0aXZlRW50aXR5LElzQWN0aXZlRW50aXR5XCIgfSk7XG5cdFx0cmV0dXJuICFyb290Q29udGV4dC5nZXRPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIikgJiYgIXJvb3RDb250ZXh0LmdldE9iamVjdChcIklzQWN0aXZlRW50aXR5XCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJyaW5ncyB1cCBhIG1lc3NhZ2UgdG9hc3Qgd2hlbiBhIGRyYWZ0IGlzIGRpc2NhcmRlZC5cblx0ICogQHBhcmFtIGlzTmV3RG9jdW1lbnQgVGhpcyBpcyBhIEJvb2xlYW4gZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgbmV3IG9yIGFscmVhZHkgZXhpc3RzLlxuXHQgKi9cblx0c2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudD86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGlmIChpc05ld0RvY3VtZW50ID09IHRydWUpIHtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCh7fSwgdGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gaW4gc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2Ugd2hlbiBubyBjb250ZXh0IGlzIHBhc3NlZC5cblx0ICovXG5cdHNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCgpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSwgeyBjbG9zZU9uQnJvd3Nlck5hdmlnYXRpb246IGZhbHNlIH0pO1xuXHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBjb250ZXh0IGNvcnJlc3BvbmRzIHRvIGEgZHJhZnQgcm9vdC5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29udGV4dCBwb2ludHMgdG8gYSBkcmFmdCByb290XG5cdCAqL1xuXHRwcml2YXRlIGlzRHJhZnRSb290KGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVNldCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM/OiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM6IGJvb2xlYW47XG5cdFx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0XHR0aXRsZT86IHN0cmluZztcblx0XHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdFx0XHR9ID0geyAuLi5tSW5QYXJhbWV0ZXJzLCBiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZSwgYmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZSB9LFxuXHRcdFx0bWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3Qob0NvbnRleHQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWVcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBEZWxldGluZyBhbiBhY3RpdmUgZW50aXR5IHdoaWNoIGhhcyBhIGRyYWZ0IHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBMaXN0UmVwb3J0IChGQ0wgY2FzZSlcblx0XHRcdFx0Ly8gLS0+IG5lZWQgdG8gcmVtb3ZlIHRoZSBkcmFmdCBmcm9tIHRoZSBMUiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBhY3RpdmUgdmVyc2lvbiwgc28gdGhhdCB0aGUgTGlzdEJpbmRpbmcgaXMgcHJvcGVybHkgcmVmcmVzaGVkXG5cdFx0XHRcdC8vIFRoZSBjb25kaXRpb24gJ29Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCcgbWFrZXMgc3VyZSB0aGUgYWN0aXZlIHZlcnNpb24gaXNuJ3QgYWxyZWFkeSBkaXNwbGF5ZWQgaW4gdGhlIExSXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gYXN5bmMgKHBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUocGFyYW1ldGVycyk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0UGF0aCA9IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdENvbnRleHRUb1JlbW92ZSA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRQYXRoKTtcblx0XHRcdFx0XHRcdGRyYWZ0Q29udGV4dFRvUmVtb3ZlLnJlcGxhY2VXaXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVwbGFjaW5nIHRoZSBkcmFmdCBpbnN0YW5jZSBpbiB0aGUgTFIgT0RMQlwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHQvLyAtLT4gTWFyayBVSSBkaXJ0eSBhbmQgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRCaW5kaW5nID0gb0NvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHRpZiAoY29udGV4dEJpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRpZiAoY29udGV4dEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdC8vIEV2ZW4gaW4gdGhlIEZDTCBjYXNlLCB3ZSBuZWVkIHRvIHJlZnJlc2ggdGhlIGxpc3RiaW5kaW5nIGluIHRoZSBMUiAobm90IE9QKSB0byB1cGRhdGUgdGhlIGNvdW50cyBpbiB0aGUgdGFicyBhbmQgcXVpY2tmaWx0ZXJzXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKGNvbnRleHRCaW5kaW5nLCBvQXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUoY29udGV4dEJpbmRpbmcsIGNvbnRleHRCaW5kaW5nLmdldENvbnRleHQoKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIG9Db250ZXh0KTtcblxuXHRcdFx0Ly8gQWZ0ZXIgZGVsZXRlIGlzIHN1Y2Nlc3NmdWxsLCB3ZSBuZWVkIHRvIGRldGFjaCB0aGUgc2V0QmFja05hdmlnYXRpb24gTWV0aG9kc1xuXHRcdFx0YXdhaXQgb0FwcENvbXBvbmVudD8uZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHRjb25zdCBpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCA9IHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQoKTtcblx0XHRcdC8vIFdlIGNsZWFyIHJlY29tbWVuZGF0aW9uIGRhdGEgYW5kIGNvbnRleHRzIGZyb20gaW50ZXJuYWwgbW9kZWwgZm9yIHRoZSBkZWxldGVkIGNvbnRleHRzXG5cdFx0XHRpZiAoaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzKFtvQ29udGV4dF0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90aWZ5IGNvbnN1bWVycyBvZiB3aGljaCBjb250ZXh0cyB3ZXJlIGRlbGV0ZWRcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRGVsZXRlKHsgY29udGV4dHM6IFtvQ29udGV4dF0gfSk7XG5cblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0aWYgKG9BcHBDb21wb25lbnQ/LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkRlZXBsaW5rKSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdC8vIHRvIHRoZSBhcHAgd2UgY2FtZSBmcm9tIChleGNlcHQgZm9yIEZDTCwgd2hlcmUgd2UgbmF2aWdhdGUgdG8gTFIgYXMgdXN1YWwpXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmV4aXRGcm9tQXBwKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRWxzZSBuYXZpZ2F0ZSBiYWNrIGZyb20gdGhlIHBhZ2UuIEluIEZDTCwgdGhpcyBpcyBkb25lIHdoZW4gdGhlIGtlcHQtYWxpdmUgY29udGV4dCBpcyBkZXN0cm95ZWQgKGNhbGxiYWNrKVxuXHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdCB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcyBhbmQgbmF2aWdhdGUgYmFjay5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpc0NvbnRpbnVlID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyhmYWxzZSk7XG5cdFx0XHRpZiAoaXNDb250aW51ZSA9PT0gUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbi5Db250aW51ZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCwgeyBjYWxsRXh0ZW5zaW9uOiB0cnVlIH0pO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgQW4gb3B0aW9uYWwgYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGFjdGlvbiBwYXJhbWV0ZXJzLCB3aGVyZSBlYWNoIG9iamVjdCBoYXMgYSBuYW1lIG9mIHN0cmluZyB0eXBlIGFuZCBhIHZhbHVlIHRoYXQgY2FuIGJlIG9mIGFueSBkYXRhIHR5cGUuXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgU2tpcHMgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nIGlmIHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBvZiB0aGVtIGluIHBhcmFtZXRlclZhbHVlc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jb250ZXh0cyBGb3IgYSBib3VuZCBhY3Rpb24sIGEgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIHRvIGJlIGNhbGxlZCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm1vZGVsIEZvciBhbiB1bmJvdW5kIGFjdGlvbiwgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWwgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBOYXZpZ2F0aW9uIHRha2VzIHBsYWNlIHRvIHRoZSBjb250ZXh0IHJldHVybmVkIGJ5IHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubGFiZWwgQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvbi4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgYWN0aW9uIGhhcyBhIHBhcmFtZXRlciBhbmQgYSBwYXJhbWV0ZXIgZGlhbG9nIGlzIHNob3duIHRvIHRoZSB1c2VyLiBUaGUgbGFiZWwgd2lsbCBiZSB1c2VkIGZvciB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyBhbmQgZm9yIHRoZSBjb25maXJtYXRpb24gYnV0dG9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udHJvbElkIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm5vdEFwcGxpY2FibGVDb250ZXh0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUV4dHJhUGFyYW1zIFBSSVZBVEVcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gSWYgcmVzb2x2ZWQsIHRoZSBwcm9taXNlIHJldHVybnM6XG5cdCAqICAtIElmIHRoZSBwYXJhbWV0ZXIgY29udGV4dHMgaXMgYW4gYXJyYXk6IGFuIGFycmF5IG9mIG9iamVjdHMsIGVhY2ggb2JqZWN0IGNvbnRhaW5pbmcgYSBrZXkgXCJzdGF0dXNcIiwgYXMgd2VsbCBhcyBcInZhbHVlXCIgcmVmZXJlbmNpbmcgdGhlIGFjdGlvbiBzdGF0dXMgYW5kIHRoZSBjb250ZXh0XG5cdCAqICAtIElmIHRoZSBwYXJhbWV0ZXIgY29udGV4dHMgaXMgbm90IGFuIGFycmF5OiBhIHNpbmdsZSBjb250ZXh0XG5cdCAqIFRoZSBjb250ZXh0KHMpIHByb3ZpZGVkIGluIHRoZSBwcm9taXNlIGlzIChhcmUpIGVpdGhlciB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQgb2YgdGhlIGFjdGlvbiBvciB0aGUgYm91bmQgY29udGV4dCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdO1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0YlN0YXRpY0FjdGlvbj86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRub3RBcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRlbmFibGVBdXRvU2Nyb2xsPzogYm9vbGVhbjtcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHR9LFxuXHRcdG1FeHRyYVBhcmFtcz86IHt9XG5cdCk6IFByb21pc2U8XG5cdFx0fCB7XG5cdFx0XHRcdHZhbHVlOiBDb250ZXh0O1xuXHRcdFx0XHRzdGF0dXM6IFwiZnVsZmlsbGVkXCI7XG5cdFx0ICB9W11cblx0XHR8IENvbnRleHRcblx0PiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6XG5cdFx0XHR8IHtcblx0XHRcdFx0XHRmUmVzb2x2ZXI6IEZ1bmN0aW9uO1xuXHRcdFx0XHRcdGZSZWplY3RvcjogRnVuY3Rpb247XG5cdFx0XHQgIH1cblx0XHRcdHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblxuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQoKG1JblBhcmFtZXRlcnMgYXMgQ29udGV4dCk/LmlzQSAmJiAobUluUGFyYW1ldGVycyBhcyBDb250ZXh0KT8uaXNBPENvbnRleHQ+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHx8XG5cdFx0XHRBcnJheS5pc0FycmF5KG1JblBhcmFtZXRlcnMpIHx8XG5cdFx0XHRtRXh0cmFQYXJhbXMgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgY29udGV4dHM6IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZCA9IG1JblBhcmFtZXRlcnMgYXMgT0RhdGFWNENvbnRleHQgfCBPRGF0YVY0Q29udGV4dFtdIHwgdW5kZWZpbmVkO1xuXHRcdFx0bUluUGFyYW1ldGVycyA9IG1FeHRyYVBhcmFtcyB8fCB7fTtcblx0XHRcdGlmIChjb250ZXh0cykge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiB7XG5cdFx0XHRiaW5kaW5nUGFyYW1ldGVycz86IEJpbmRDb250ZXh0UGFyYW1ldGVycztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRsYWJlbD86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRjb250ZXh0cz86IE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IG51bGw7XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHR2aWV3OiBGRVZpZXc7XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRpc05hdmlnYWJsZT86IGJvb2xlYW47XG5cdFx0XHRhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0aXNDcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0b3BlcmF0aW9uQXZhaWxhYmxlTWFwPzogc3RyaW5nO1xuXHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRncm91cElkPzogc3RyaW5nO1xuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uPzogc3RyaW5nO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRpc0JvdW5kPzogYm9vbGVhbjtcblx0XHRcdGlnbm9yZUVUYWc/OiBib29sZWFuO1xuXHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIHZpZXc6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfSB8fCB7IHZpZXc6IHRoaXMuYmFzZS5nZXRWaWV3KCkgfTtcblxuXHRcdG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlID0gbVBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIHx8IG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHRoZSByZWZlcmVuY2VkIGFjdGlvbiBpcyBib3VuZCBvciB1bmJvdW5kXG5cdFx0Y29uc3QgY29udmVydGVkTWV0YWRhdGEgPSBjb252ZXJ0VHlwZXModGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdC8vIFRoZSBFbnRpdHlDb250YWluZXIgbWF5IE5PVCBiZSBtaXNzaW5nLCBzbyBpdCBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgdW5kZWZpbmVkLCBidXQgc2luY2UgaW4gb3VyIGNvbnZlcnRlZCBNZXRhZGF0YVxuXHRcdC8vIGl0IGNhbiBiZSB1bmRlZmluZWQsIEkgbmVlZCB0aGlzIHdvcmthcm91bmQgaGVyZSBvZiBhZGRpbmcgXCJcIiBzaW5jZSBpbmRleE9mIGRvZXMgbm90IGFjY2VwdCBzb21ldGhpbmcgdGhhdCdzXG5cdFx0Ly8gdW5kZWZpbmVkLlxuXHRcdGlmIChzQWN0aW9uTmFtZS5pbmNsdWRlcyhcIlwiICsgY29udmVydGVkTWV0YWRhdGEuZW50aXR5Q29udGFpbmVyLm5hbWUpKSB7XG5cdFx0XHQvLyBVbmJvdW5kIGFjdGlvbnMgYXJlIGFsd2F5cyByZWZlcmVuY2VkIHZpYSB0aGUgYWN0aW9uIGltcG9ydCBhbmQgd2UgZm91bmQgdGhlIEVudGl0eUNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUgc29cblx0XHRcdC8vIGFuIHVuYm91bmQgYWN0aW9uIGlzIHJlZmVyZW5jZWQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE5vIGVudGl0eSBjb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lLCBzbyBlaXRoZXIgYSBib3VuZCBvciBzdGF0aWMgYWN0aW9uIGlzIHJlZmVyZW5jZWQgd2hpY2ggaXMgYWxzbyBib3VuZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSAmJiBtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSA9IG1QYXJhbWV0ZXJzLm1vZGVsXG5cdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHQuZ2V0TWV0YUNvbnRleHQoKEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpID8gbVBhcmFtZXRlcnMuY29udGV4dHNbMF0gOiBtUGFyYW1ldGVycy5jb250ZXh0cykuZ2V0UGF0aCgpKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0fVxuXHRcdGxldCBvQ29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0XHRpZiAobVBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRvQ29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY29udHJvbElkKSBhcyBDb250cm9sO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gaWYgc3RpY2t5IHNlc3Npb24gaXMgZW5hYmxlZCB3ZSB0cmlnZ2VyIGFjdGlvbnMgd2l0aG91dCBlVGFnXG5cdFx0bVBhcmFtZXRlcnMuaWdub3JlRVRhZyA9IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoc0FjdGlvbk5hbWUgJiYgc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCIoXCIpKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0ucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gJiYgb0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IG9Db250cm9sLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRhYmxlQVBJLmdldFJvd0JpbmRpbmcoKS5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0LFxuXHRcdFx0XHRcdG9Db250cm9sLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5nZXRJZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRXhlY3V0ZUFjdGlvbih7IGNvbnRleHRzOiBtUGFyYW1ldGVycy5jb250ZXh0cyB9KTtcblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FsbEFjdGlvbihzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdFx0XHRjb25zdCBzdWNjZXNzRnVsbEV4ZWN1dGlvbiA9IHJlc3BvbnNlLmZpbHRlcihpc0Z1bGZpbGxlZCk7XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoICE9PSBzdWNjZXNzRnVsbEV4ZWN1dGlvbi5sZW5ndGgpIHtcblx0XHRcdFx0Ly8gS2VlcCB0aGUgc2FtZSB3b3JrZmxvdyB0aGFuIGJlZm9yZVxuXHRcdFx0XHQvLyBJZiBhdCBsZWFzdCBvbmUgcHJvbWlzZSBpcyByZWplY3RlZCwgd2UgcmVqZWN0IHRoZSB3aG9sZSBwcm9taXNlXG5cdFx0XHRcdHRocm93IHJlc3BvbnNlO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGxpc3RSZWZyZXNoZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuY29udGV4dHMgJiYgQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cykgJiYgbVBhcmFtZXRlcnMuaXNCb3VuZCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRsaXN0UmVmcmVzaGVkID0gYXdhaXQgdGhpcy5fcmVmcmVzaExpc3RJZlJlcXVpcmVkKFxuXHRcdFx0XHRcdHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhzQWN0aW9uTmFtZSwgc3VjY2Vzc0Z1bGxFeGVjdXRpb24pLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpKSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShcblx0XHRcdFx0XHRBY3Rpdml0eS5BY3Rpb24sXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMsXG5cdFx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdFx0bGlzdFJlZnJlc2hlZCxcblx0XHRcdFx0XHRPYmplY3Qua2V5cyhzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHQuZ2V0T2JqZWN0KCkpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZSwgVHJpZ2dlclR5cGUuYWN0aW9uKTtcblxuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZXNvbHZlcihzdWNjZXNzRnVsbEV4ZWN1dGlvbik7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICh0aGlzLmJhc2UuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkuY29udmVydGVyVHlwZSAhPT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0aWYgKHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKVxuXHRcdFx0XHRcdFx0PyBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHRcblx0XHRcdFx0XHRcdDogc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUucmV0dXJuZWRDb250ZXh0ID8/IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dDtcblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1ZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdFx0XHRjb25zdCBzQ29udGV4dE1ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0Y29uc3QgX2ZuVmFsaWRDb250ZXh0cyA9IChjb250ZXh0czogQ29udGV4dFtdLCBhcHBsaWNhYmxlQ29udGV4dHM/OiBDb250ZXh0W10pOiBDb250ZXh0W10gPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRzLmZpbHRlcigoZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoYXBwbGljYWJsZUNvbnRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFwcGxpY2FibGVDb250ZXh0cy5pbmNsdWRlcyhlbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkNvbnRleHQgPSBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKVxuXHRcdFx0XHRcdFx0PyBfZm5WYWxpZENvbnRleHRzKG1QYXJhbWV0ZXJzLmNvbnRleHRzLCBtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMpWzBdXG5cdFx0XHRcdFx0XHQ6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0Py5nZXRQYXRoKCkgIT09IGNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZVxuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgYWN0aW9uIHJldHVybnMgYSBkcmFmdCBjb250ZXh0LCB3ZSBhbHJlYWR5IHRha2UgY2FyZSBkdXJpbmcgbmF2aWdhdGlvbiB0byBlaXRoZXIgY3JlYXRlIGEgbmV3XG5cdFx0XHRcdFx0XHRcdC8vIChmdWxsIHNjcmVlbikgb3IgdG8gdXNlIHRoZSBsaXN0IGJpbmRpbmcgY29udGV4dCBhZnRlciByZWZyZXNoIChhbmQgbm90IHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCkuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBkcmFmdCBpcyBkaXNjYXJkZWQgb3IgYWN0aXZhdGVkLCBoYXZpbmcgdGhlIGNvbnRleHQgc3RpbGwgYXMgZGVwZW5kZW50IGNvbnRleHQgY2F1c2UgaXNzdWVzXG5cdFx0XHRcdFx0XHRcdC8vIChlLmcuIGlmIGEgc2lkZSBlZmZlY3QgaXMgdHJpZ2dlcmVkKS4gVGhlcmVmb3JlLCB3ZSBkZXN0cm95IHRoZSByZXR1cm4gdmFsdWUgY29udGV4dCBoZXJlLFxuXHRcdFx0XHRcdFx0XHQvLyBhbmQgdG8gYmUgY29tcGF0aWJsZSB3ZSByZXR1cm4gYSBuZXcgY29udGV4dCB3aXRoIHRoZSBzYW1lIHBhdGguXG5cdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiZcblx0XHRcdFx0XHRcdFx0XHQoY29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSBmYWxzZSB8fCB0aGlzLl9pc0ZjbEVuYWJsZWQoKSlcblx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29udGV4dC5nZXRCaW5kaW5nKCkuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuaW5mbyhcIk5hdmlnYXRpb24gdG8gdGhlIHNhbWUgY29udGV4dCBpcyBub3QgYWxsb3dlZFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQWN0aW9uRXhlY3V0aW9uKHNBY3Rpb25OYW1lKTtcblxuXHRcdFx0Ly8gS2VlcCB0aGlzIHdlaXJkIHJldHVybmVkIHZhbHVlIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnNcblx0XHRcdC8vIGludm9rZUFjdGlvbiBpcyBwdWJsaWMgYW5kIHdlIGNhbid0IGNoYW5nZSB0aGUgcmV0dXJuZWQgdmFsdWUgZm9yIHRoZSBhY3Rpb25cblx0XHRcdGlmICghQXJyYXkuaXNBcnJheShtSW5QYXJhbWV0ZXJzPy5jb250ZXh0cykgJiYgc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJldHVybiBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5yZXR1cm5lZENvbnRleHQgPz8gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLm1hcCgob1Jlc3VsdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4geyAuLi5vUmVzdWx0LCAuLi57IHZhbHVlOiBvUmVzdWx0LnZhbHVlLnJldHVybmVkQ29udGV4dCA/PyBvUmVzdWx0LnZhbHVlLmJvdW5kQ29udGV4dCB9IH07XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIChlcnI6IHVua25vd24pIHtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdH1cblx0XHRcdGlmIChlcnIgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRGlhbG9nIGNhbmNlbGxlZFwiKTtcblx0XHRcdH1cblx0XHRcdHRocm93IGVycjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSG9vayB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBhZnRlciB0aGUgYWN0aW9uIGV4ZWN1dGlvbi5cblx0ICogQHBhcmFtIF9hY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAc2luY2UgMS4xMTQuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkFmdGVyQWN0aW9uRXhlY3V0aW9uKF9hY3Rpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvL3RvIGJlIG92ZXJyaWRkZW5cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBvbiB0aGUgbWFzcyBlZGl0IHNhdmUuXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIElmIHlvdSBkZWNpZGUgdG8gZG8geW91ciBvd24gc2F2ZSBwcm9jZXNzaW5nLCB5b3UgY2FuIHJldHVybiBgdHJ1ZWAgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBzYXZlIGJlaGF2aW9yLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycyBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5JbnN0ZWFkfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gY3VzdG9tTWFzc0VkaXRTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuYUNvbnRleHRzIEFycmF5IGNvbnRhaW5pbmcgdGhlIHNlbGVjdGVkIGNvbnRleHRzIGZvciB0aGUgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMub1VwZGF0ZURhdGEgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5UGF0aCBhbmQgaXRzIHZhbHVlXG5cdCAqIEByZXR1cm5zIGB0cnVlYCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGV4ZWN1dGlvbiwgYGZhbHNlYCB0byBrZWVwIHRoZSBzdGFuZGFyZCBiZWhhdmlvclxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjEzMC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZClcblx0YXN5bmMgY3VzdG9tTWFzc0VkaXRTYXZlKF9tUGFyYW1ldGVyczogeyBhQ29udGV4dHM6IENvbnRleHRbXTsgb1VwZGF0ZURhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICogQHBhcmFtIGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LnNldCBUcmlnZ2VycyBhIGJ1c3kgaW5kaWNhdG9yIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayBFeGVjdXRlcyBmdW5jdGlvbiBvbmx5IGlmIGFwcGxpY2F0aW9uIGlzbid0IGJ1c3kuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQgaWYgdGhlIGV4ZWN1dGlvbiBpcyBwcm9oaWJpdGVkIGFuZCByZXNvbHZlZCBieSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZm5GdW5jdGlvbi5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgc2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycz8uYnVzeT8uc2V0ID8/IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnM/LmJ1c3k/LmNoZWNrID8/IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gbVBhcmFtZXRlcnM/LnVwZGF0ZXNEb2N1bWVudCA/PyBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCBhcyBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCxcblx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cblx0XHRpZiAoYkJ1c3lDaGVjayAmJiBCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwiQXBwbGljYXRpb24gYWxyZWFkeSBidXN5IHRoZXJlZm9yZSBleGVjdXRpb24gcmVqZWN0ZWRcIik7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgaGF2ZSB0byBzZXQgYnVzeSBhbmQgZHJhZnQgaW5kaWNhdG9yIGltbWVkaWF0ZWx5IGFsc28gdGhlIGZ1bmN0aW9uIG1pZ2h0IGJlIGV4ZWN1dGVkIGxhdGVyIGluIHF1ZXVlXG5cdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdH1cblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKGZuRnVuY3Rpb24gYXMgKCkgPT4gdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4pXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IHVua25vd24pOiB2b2lkID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBwYXRjaFNlbnQgZXZlbnQ6IHJlZ2lzdGVyIGRvY3VtZW50IG1vZGlmaWNhdGlvbi5cblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlUGF0Y2hTZW50KG9FdmVudDogT0RhdGFDb250ZXh0QmluZGluZyRQYXRjaFNlbnRFdmVudCk6IHZvaWQge1xuXHRcdC8vIEluIGNvbGxhYm9yYXRpdmUgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24sIGRpc2FibGUgRVRhZyBjaGVjayBmb3IgUEFUQ0ggcmVxdWVzdHNcblx0XHRjb25zdCBpbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCB1aUNvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKTtcblx0XHRjb25zdCBpZ25vcmVFVGFnID0gdGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5pc0Nvbm5lY3RlZCgpIHx8IGludGVybmFsQ29udGV4dC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRpZiAoaWdub3JlRVRhZykge1xuXHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKHRydWUpO1xuXHRcdH1cblx0XHRpZiAodWlDb250ZXh0Py5nZXRQcm9wZXJ0eShcImlzRWRpdGFibGVcIikgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyB0aGUgdmlldyBpcyBub3QgaW4gZWRpdCBtb2RlIHRoaXMgbXVzdCBiZSBpbmxpbmUgZWRpdFxuXHRcdFx0dGhpcy5iYXNlLmlubGluZUVkaXRGbG93LmhhbmRsZUlubGluZUVkaXRQYXRjaFNlbnQob0V2ZW50KTtcblx0XHR9IGVsc2UgaWYgKCFpbnRlcm5hbENvbnRleHQ/LmdldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIikpIHtcblx0XHRcdGNvbnN0IHNvdXJjZUJpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgdW5rbm93biBhcyBPRGF0YUxpc3RCaW5kaW5nOyAvLyBGSVhNRTogVUk1IHR5cGUgc2F5cyB0aGlzIHNob3VsZCBiZSBhbiBPRGF0YUNvbnRleHRCaW5kaW5nXG5cdFx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdFx0Y29uc3Qgb1BhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsIChwYXRjaENvbXBsZXRlZEV2ZW50OiBVSTVFdmVudDx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4pID0+IHtcblx0XHRcdFx0XHQvLyBSZS1lbmFibGUgRVRhZyBjaGVja3Ncblx0XHRcdFx0XHRpZiAoaWdub3JlRVRhZykge1xuXHRcdFx0XHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5zZXRJZ25vcmVFVGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdFx0c291cmNlQmluZGluZyxcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KHNvdXJjZUJpbmRpbmcsIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGVTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0aGFuZGxlQ3JlYXRlU2VudChldmVudDogVUk1RXZlbnQ8eyBjb250ZXh0OiBDb250ZXh0IH0+KTogdm9pZCB7XG5cdFx0Y29uc3QgY29udGV4dCA9IGV2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSwgZmFsc2UsIGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBhIHRhc2sgaW4gc3luYyB3aXRoIG90aGVyIHRhc2tzIGNyZWF0ZWQgdmlhIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFJldHVybnMgdGhlIHByb21pc2UgY2hhaW4gb2YgdGhlIHRhc2suXG5cdCAqIEBwYXJhbSBbbmV3VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICovXG5cdGFzeW5jIHN5bmNUYXNrPFQ+KG5ld1Rhc2s/OiAoKCkgPT4gVCkgfCBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG5cdFx0aWYgKG5ld1Rhc2spIHtcblx0XHRcdGlmICh0eXBlb2YgbmV3VGFzayA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3MudGhlbihuZXdUYXNrKS5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc3luY1Rhc2tzID0gdGhpcy5zeW5jVGFza3Ncblx0XHRcdFx0XHQudGhlbihhc3luYyAoKSA9PiBuZXdUYXNrKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoZXJyIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2tzIGFzIFByb21pc2U8VD47XG5cdH1cblxuXHQvKipcblx0ICogdXBkYXRlcyB0aGUgVUkgYW5kIGludGVybmFsIG1vZGVscyBhY2NvcmRpbmcgdGhlIGVkaXQgbW9kZSAuXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRhc3luYyBjb21wdXRlTW9kZWxzRm9yRWRpdE1vZGUoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0XHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCA9IE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsIS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRcdGxldCBmb3JjZURpc3BsYXlNb2RlID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cblx0XHRcdFx0aWYgKGlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkICYmIGlzQWN0aXZlRW50aXR5ID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdGZvcmNlRGlzcGxheU1vZGUgPSAhKGF3YWl0IHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuYWN0aXZhdGVDb2xsYWJvcmF0aW9uKGNvbnRleHQsIGlzQWN0aXZlRW50aXR5KSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UgJiYgIWZvcmNlRGlzcGxheU1vZGUpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgaGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhaGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZXRlcm1pbmluZyB0aGUgZWRpdE1vZGUgZm9yIGRyYWZ0XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgbGFzdEludm9rZWRBY3Rpb25OYW1lID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIik7XG5cdFx0XHRpZiAobGFzdEludm9rZWRBY3Rpb25OYW1lICYmIHRoaXMuaXNOZXdBY3Rpb25Gb3JTdGlja3kobGFzdEludm9rZWRBY3Rpb25OYW1lLCBjb250ZXh0KSkge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCB0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24oY29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXModGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpLCBjb250ZXh0LmdldE1vZGVsKCkpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIGEgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0cy5cblx0ICogQHBhcmFtIGNvbnRleHRzIFRoZSBjb250ZXh0KHMpIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgZGVsZXRpb25cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2tcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5ub0RpYWxvZ1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy50aXRsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kZXNjcmlwdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKFxuXHRcdGNvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdLFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0cGFyZW50Q29udHJvbD86IENvbnRyb2w7XG5cdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzPzogYm9vbGVhbjtcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dD86IEludGVybmFsTW9kZWxDb250ZXh0IHwgbnVsbDtcblx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmcgfCB7IHBhdGg6IHN0cmluZyB9O1xuXHRcdFx0bnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzPzogbnVtYmVyO1xuXHRcdFx0dW5TYXZlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bG9ja2VkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRkcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlPzogRHJhZnRTaWJsaW5nUGFpcltdO1xuXHRcdFx0ZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZT86IENvbnRleHRbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpIHtcblx0XHRcdC8vIGFzIHNlbGVjdGVkIGNvbnRleHRzIG1heSBpbmNsdWRlIGluYWN0aXZlIGNvbnRleHQgd2UgbmVlZCB0byBjb21wdXRlIHRoaXMgcGFyYW1ldGVyIGFnYWluIHRvIGVuc3VyZSBkZWxldGUgaGVscGVyIHdvcmtzIHByb3Blcmx5XG5cdFx0XHRwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0fVxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdGlmIChwYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3Qgc291cmNlQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdFx0aWYgKHNvdXJjZUNvbnRyb2wgJiYgIXNvdXJjZUNvbnRyb2wuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBkZWxldGUgaXMgdHJpZ2dlcmVkIGZyb20gYSBNdWx0aVZhbHVlRmllbGQsIHdlIGRvbid0IHVzZSB0aGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhcyB0aGUgTVZGIGRvZXNuJ3QgaGF2ZVxuXHRcdFx0XHQvLyBzdWNoIGEgY29udGV4dCBvZiBpdHMgb3duLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXRzIHBhcmVudCBjb250ZXh0IChlLmcuIGZyb20gdGhlIGVtYmVkZGluZyBUYWJsZSlcblx0XHRcdFx0cGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IHNvdXJjZUNvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0YXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQoY29udGV4dHMsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHJlc291cmNlTW9kZWwsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VNb2RlbCgpOiBSZXNvdXJjZU1vZGVsIHtcblx0XHRyZXR1cm4gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFRyYW5zYWN0aW9uSGVscGVyKCk6IHR5cGVvZiBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdFx0cmV0dXJuIFRyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXNzYWdlSGFuZGxlcigpOiBNZXNzYWdlSGFuZGxlciB7XG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhZ2VJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwicGFnZUludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcGFnZUludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpIGFzIENvbnRleHQ7XG5cdFx0dGhpcy5nZXRQYWdlSW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSwgYkNyZWF0aW9uTW9kZSwgcGFnZUludGVybmFsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0Z2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhZ2VJbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBDb250ZXh0O1xuXHRcdHJldHVybiAhIXBhZ2VJbnRlcm5hbENvbnRleHQuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdGlzRG9jdW1lbnRNb2RpZmllZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQuXG5cdCAqIEBwYXJhbSBtb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgbW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCBoYXMgYmVlbiBtb2RpZmllZCBieSBjcmVhdGluZyBhIHN1Yi1vYmplY3QuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIG9uIHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqIEBwYXJhbSBiaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlRXZlbnRzKGJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZyk7XG5cdFx0Ly8gV2Ugc3RvcmUga2V5IHNldHMgKGNvbnRleHQgKyBrZXkpIGFzIHRoZSBjcmVhdGlvbiBpbnRlcmFjdGlvbiBtaWdodCBpbnZvbHZlIG11bHRpcGxlIGNyZWF0aW9ucy5cblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXlTZXRzOiB7IGNvbnRleHQ6IENvbnRleHQ7IG1lc3NhZ2VIYW5kbGluZ0tleTogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZVNlbnRcIiwgKGV2ZW50SW5zdGFuY2U6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbjsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY29udGV4dCA9IGV2ZW50SW5zdGFuY2UuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHRcdGxldCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxpbmdLZXlTZXRzLmZpbmQoKGluZm8pID0+IGluZm8uY29udGV4dCA9PT0gY29udGV4dCk/Lm1lc3NhZ2VIYW5kbGluZ0tleTtcblx0XHRcdGlmICghbWVzc2FnZUhhbmRsaW5nS2V5KSB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleVNldHMucHVzaCh7IGNvbnRleHQsIG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlQ29tcGxldGVkXCIsIChvRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbjsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpLFxuXHRcdFx0XHRjb250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKHN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IG1lc3NhZ2VIYW5kbGluZ0tleVNldHMuZmluZCgoaW5mbykgPT4gaW5mby5jb250ZXh0ID09PSBjb250ZXh0KT8ubWVzc2FnZUhhbmRsaW5nS2V5O1xuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGluZ0tleSkge1xuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZSAoZGlzcGxheWVkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UpLlxuXHQgKiBAcGFyYW0gZHJhZnRTdGF0dXMgVGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlXG5cdCAqL1xuXHRzZXREcmFmdFN0YXR1cyhkcmFmdFN0YXR1czogc3RyaW5nKTogdm9pZCB7XG5cdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBkcmFmdFN0YXR1cywgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIGEgYmluZGluZyBvciBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgVGhlIGJpbmRpbmcgb3IgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICogQHBhcmFtIGVkaXRNb2RlIFRoZSBlZGl0IG1vZGVcblx0ICogQHBhcmFtIGlzQ3JlYXRpb24gVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG5ld2x5IGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RWRpdE1vZGUoZWRpdE1vZGU/OiBzdHJpbmcsIGlzQ3JlYXRpb24/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKGVkaXRNb2RlKSB7XG5cdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIGVkaXRNb2RlID09PSBcIkVkaXRhYmxlXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRpZiAoZWRpdE1vZGUgIT09IFwiRWRpdGFibGVcIikge1xuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmbGFnIHRvIGZvcmNlIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdC5cblx0ICogQHBhcmFtIGZvcmNlZFxuXHQgKi9cblx0cHJpdmF0ZSBmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmb3JjZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiLCBmb3JjZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHdlIHNob3VsZCBmb3JjZSB0aGUgdXNlciB0byBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQsIG9yIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIGFsbG93ZWQuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgbm90IGFsbG93ZWRcblx0ICovXG5cdHNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIpID09PSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbiBhY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBjcmVhdGUgYWN0aW9uIGZvciBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgYSBjcmVhdGUgYWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGlzTmV3QWN0aW9uRm9yU3RpY2t5KGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdGNvbnN0IHN0aWNreVNlc3Npb24gPSBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDtcblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5OZXdBY3Rpb24gPT09IGFjdGlvbk5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMgJiYgc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMuaW5jbHVkZXMoYWN0aW9uTmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyBNb3ZlIGFsbCBzdGlja3ktcmVsYXRlZCBiZWxvdyB0byBhIHN0aWNreSBzZXNzaW9uIG1hbmFnZXIgY2xhc3NcblxuXHQvKipcblx0ICogRW5hYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgaGFuZGxlU3RpY2t5T24oY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMsIGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBBdHRhY2ggc3RpY2t5IHNlc3Npb24gY2FsbGJhY2tzXG5cdFx0XHRcdGNvbnN0IGkxOG5Nb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LnJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyhcblx0XHRcdFx0XHR0aGlzLmdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQsIGludGVybmFsTW9kZWwsIGhhc2hUcmFja2VyKSxcblx0XHRcdFx0XHR0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKSxcblx0XHRcdFx0XHR0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPZmYoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LnVucmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQudW5yZWdpc3RlclN0aWNreVNlc3Npb25DYWxsYmFja3MoKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCBtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIERpcnR5U3RhdGVQcm92aWRlciBpbiB0aGUgU2hlbGwuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgVGhlIG1vZGVsIFwiaW50ZXJuYWxcIlxuXHQgKiBAcGFyYW0gaGFzaFRyYWNrZXIgSGFzaCB0cmFja2VyXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgaGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiAobmF2aWdhdGlvbkNvbnRleHQ6IHsgaW5uZXJBcHBSb3V0ZTogc3RyaW5nIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBEaXJ0eVN0YXRlUHJvdmlkZXIgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXRIYXNoID0gbmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZTtcblx0XHRcdFx0Y29uc3Qgcm91dGVyUHJveHkgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IGxjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGlzRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGlzU2Vzc2lvbk9uID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFpc1Nlc3Npb25Pbikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpOiB1bmRlZmluZWQgfCBib29sZWFuID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHR3YXJuaW5nRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KHdhcm5pbmdEaWFsb2cpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG9uUm91dGVNYXRjaGVkIGV2ZW50IGluIGNhc2Ugb2Ygc3RpY2t5IGVkaXRpb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuICgpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIWN1cnJlbnRIYXNoIHx8ICFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoY3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5jbGVhclNlc3Npb25Db250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXNDcmVhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCk7IC8vIFN0b3JlIHRoaXMgdmFsdWUgaW4gYSB2YXJpYWJsZSwgYXMgaXQgd2lsbCBiZSByZXNldCBpbiBoYW5kbGVTdGlja3lPZmZcblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpOyAvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBiZWZvcmUgY2FsbGluZyB0aGUgYXN5bmMgbWV0aG9kIG9uIHRoZSBzZXJ2ZXIsIG90aGVyd2lzZSB0aGV5IHdpbGwgY29uZmxpY3Qgd2l0aCBSb3V0ZVByb3h5LnJlc3RvcmVIaXN0b3J5IHRoYXQgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXG5cdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQoY29udGV4dCk7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIWlzQ3JlYXRpb24pIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb24uXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbFJvdXRpbmcoKTogSW50ZXJuYWxSb3V0aW5nIHtcblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk6IFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpOiB7IGZSZXNvbHZlcjogRnVuY3Rpb247IGZSZWplY3RvcjogRnVuY3Rpb24gfSB7XG5cdFx0bGV0IHJlc29sdmVGdW5jdGlvbjogRnVuY3Rpb24sIHJlamVjdEZ1bmN0aW9uOiBGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTxQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZ1bmN0aW9uID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZ1bmN0aW9uID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKHJlc3BvbnNlOiBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjb250cm9sSWQgfSwgdGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKGFjdGlvbk5hbWUsIHJlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiByZXNvbHZlRnVuY3Rpb24hLCBmUmVqZWN0b3I6IHJlamVjdEZ1bmN0aW9uISB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0cmVzcG9uc2U6IFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdXG5cdCk6IHsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID49IDEpIHtcblx0XHRcdGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbERhdGEgPSAoY3VycmVudFZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXREYXRhKCkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsQWN0aW9uID0gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXSBhcyBNZXRhTW9kZWxBY3Rpb25bXSB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGFjdGlvblJldHVyblR5cGUgPSBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZSA/IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlLiRUeXBlIDogbnVsbDtcblx0XHRcdGNvbnN0IGtleXMgPVxuXHRcdFx0XHRhY3Rpb25SZXR1cm5UeXBlICYmIChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpXG5cdFx0XHRcdFx0PyAobWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKS4kS2V5XG5cdFx0XHRcdFx0OiBbXTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG9EYXRhOiByZXNwb25zZVswXS52YWx1ZS5ib3VuZENvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRcdGtleXNcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiBQcm9taXNlPHsgY29udHJvbElkPzogc3RyaW5nOyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coaXNTYXZlOiBib29sZWFuKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cpIHtcblx0XHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyA9IG5ldyBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2coe1xuXHRcdFx0XHR2aWV3OiB0aGlzLmdldFZpZXcoKVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/Lm9wZW4oaXNTYXZlKTtcblx0fVxuXG5cdF9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGU6IFRhYmxlKTogdm9pZCB7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRjb25zdCBhY3RpdmVSb3dJbmRleDogbnVtYmVyID0gcm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKHRhYmxlLmRhdGEoXCJ0YWJsZVR5cGVcIikgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChhY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChhY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBJbiBhIHJlc3BvbnNpdmUgdGFibGUsIHRoZSBlbXB0eSByb3dzIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZS4gQnV0IHdoZW4gd2UgY3JlYXRlIG1vcmUsIHRoZXkgYXBwZWFyIGJlbG93IHRoZSBuZXcgbGluZS5cblx0XHRcdCAqIFNvIHdlIGNoZWNrIHRoZSBmaXJzdCBpbmFjdGl2ZSByb3cgZmlyc3QsIHRoZW4gd2Ugc2V0IHRoZSBmb2N1cyBvbiBpdCB3aGVuIHdlIHByZXNzIHRoZSBidXR0b24uXG5cdFx0XHQgKiBUaGlzIGRvZXNuJ3QgaW1wYWN0IHRoZSBHcmlkVGFibGUgYmVjYXVzZSB0aGV5IGFwcGVhciBhdCB0aGUgZW5kLCBhbmQgd2UgYWxyZWFkeSBmb2N1cyB0aGUgYmVmb3JlLXRoZS1sYXN0IHJvdyAoYmVjYXVzZSAyIGVtcHR5IHJvd3MgZXhpc3QpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFsbFJvd0NvbnRleHRzID0gcm93QmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdGlmICghYWxsUm93Q29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBmb2N1c1JvdyA9IGFjdGl2ZVJvd0luZGV4LFxuXHRcdFx0XHRpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHNpbmdsZUNvbnRleHQgb2YgYWxsUm93Q29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNpbmdsZUNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZGV4IDwgZm9jdXNSb3cpIHtcblx0XHRcdFx0XHRmb2N1c1JvdyA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9jdXNSb3cgPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoZm9jdXNSb3cpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coZm9jdXNSb3csIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0aWYgKFxuXHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSAmJlxuXHRcdFx0IXRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZyxcblx0XHRyZWZyZXNoTGlzdEJpbmRpbmc/OiBib29sZWFuLFxuXHRcdGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM/OiBzdHJpbmdbXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZW50ID0gQXJyYXkuaXNBcnJheShyZWxhdGVkQ29udGV4dHMpID8gcmVsYXRlZENvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpIDogcmVsYXRlZENvbnRleHRzPy5nZXRQYXRoKCk7XG5cdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZW5kKHsgYWN0aW9uLCBjb250ZW50LCB0cmlnZ2VyZWRBY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMgfSk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IFRyaWdnZXJUeXBlKTogdm9pZCB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5iYXNlLmdldFZpZXcoKSwgc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlKTtcblx0fVxuXG5cdGFzeW5jIF9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IChvTW9kZWwub1JlcXVlc3RvciBhcyB1bmtub3duIGFzIHsgd2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0czogRnVuY3Rpb24gfSkud2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyhcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhbGwgY2hhbmdlcyB3ZXJlIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcblx0XHRcdGlmIChvTW9kZWwuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdWJtaXQgb2Ygb3BlbiBjaGFuZ2VzIGZhaWxlZFwiKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCByb3V0ZXJQcm94eSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChyb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRzdGlja3kucHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dmlldyxcblx0XHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5TdGlja3lcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGlzdG9yeS5iYWNrKCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogeyBlZGl0YWJsZTogYm9vbGVhbjsgcmVjcmVhdGVDb250ZXh0OiBib29sZWFuOyBmb3JjZUZvY3VzPzogYm9vbGVhbiB9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0cGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0cmVjcmVhdGVDb250ZXh0OiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWNyZWF0ZUNvbnRleHQsXG5cdFx0XHRyZWFzb246IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0Zm9yY2VGb2N1czogbmF2aWdhdGlvblBhcmFtZXRlcnMuZm9yY2VGb2N1cyA/PyBmYWxzZSxcblx0XHRcdGtlZXBDdXJyZW50TGF5b3V0OiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3XG5cdCAqIEBwYXJhbSBwYXJhbXMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtcy5jb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbXMuaXNOYXZpZ2FibGUgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIG5hdmlnYWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gbmVlZHMgdG8gcmV0dXJucyB0aGUgYm91bmQgY29udGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IEZFVmlldywgcGFyYW1zOiB7IGNvbnRyb2xJZD86IHN0cmluZzsgaXNOYXZpZ2FibGU/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHQvL1RoaXMgd2VpcmQgY29uZGl0aW9uIGlzIG5lZWRlZCB0byBhdm9pZCBuYXZpZ2F0aW9uIGluIGNhc2Ugb2Ygc29tZSBhY3Rpb25zIGludG8gdGhlIHRhYmxlXG5cdFx0Ly8gdGhpcyBkZWZpbml0ZWx5IG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgdG8gZ2V0IGNsZWFyIGNvbmRpdGlvbiB3aGVyZSBuYXZpZ2F0aW9uIG5lZWRzIHRvIGJlIGRvbmUgb3Igbm90XG5cdFx0Ly8gU05PVzogRElOQzAyNzg0OTBcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB2aWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdGFzeW5jIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCB2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHZpc2libGVWaWV3SWRzID0gdGhpcy5faXNGY2xFbmFibGVkKClcblx0XHRcdFx0PyAodGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcikuX2dldEFsbFZpc2libGVWaWV3cygpLm1hcCgodmlldykgPT4gdmlldy5nZXRJZCgpKVxuXHRcdFx0XHQ6IFt0aGlzLmdldFZpZXcoKS5nZXRJZCgpXTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRMb2cuaW5mbyhcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZSBvZiBhTWVzc2FnZXMpIHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChtZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmICh2aXNpYmxlVmlld0lkcy5pbmNsdWRlcyhvQ29udHJvbC5nZXRJZCgpKSkge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlLm9EYXRhXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uua2V5c1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBQcm9taXNlIGlmIHRoZSBsaXN0IHdhcyByZWZyZXNoZWRcblx0ICovXG5cdGFzeW5jIF9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0b1Jlc3BvbnNlPzogeyBvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzPzogc3RyaW5nW10gfCBudWxsIH0sXG5cdFx0b0NvbnRleHQ/OiBDb250ZXh0XG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhIHx8ICFvUmVzcG9uc2Uua2V5cykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKG9CaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBwYXRocyA9IGFTZW1hbnRpY0tleXMubWFwKChvS2V5KSA9PiBvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0YXdhaXQgb0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHBhdGhzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIGxhdGVzdCBjb250ZXh0IGluIHRoZSBtZXRhZGF0YSBoaWVyYXJjaHkgZnJvbSByb290QmluZGluZyB0byBnaXZlbiBjb250ZXh0IHBvaW50aW5nIHRvIGdpdmVuIGVudGl0eVR5cGVcblx0ICogaWYgYW55IHN1Y2ggY29udGV4dCBleGlzdHMuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgb3JpZ2luYWwgY29udGV4dC5cblx0ICogTm90ZTogSXQgaXMgb25seSBuZWVkZWQgYXMgd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcuIENvcnJlY3QgbW9kZWxsaW5nIHdvdWxkIGltcGx5IGEgRGF0YUZpZWxkRm9yQWN0aW9uIGluIGEgTGluZUl0ZW1cblx0ICogdG8gcG9pbnQgdG8gYW4gb3ZlcmxvYWQgZGVmaW5lZCBlaXRoZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgRW50aXR5VHlwZSBvciBhIGNvbGxlY3Rpb24gb2YgdGhlIHNhbWUuXG5cdCAqIEBwYXJhbSByb290Q29udGV4dCBUaGUgY29udGV4dCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gb3ZlcmxvYWRFbnRpdHlUeXBlIFRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHkgdHlwZSB0byBzZWFyY2ggZm9yXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eVxuXHQgKi9cblx0X2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgocm9vdENvbnRleHQ6IENvbnRleHQsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBvdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZyk6IENvbnRleHQge1xuXHRcdGNvbnN0IG1vZGVsOiBPRGF0YU1vZGVsID0gcm9vdENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IGNvbnRleHRTZWdtZW50czogc3RyaW5nW10gPSBsaXN0QmluZGluZy5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBjdXJyZW50Q29udGV4dDogQ29udGV4dCA9IHJvb3RDb250ZXh0O1xuXG5cdFx0Ly8gV2UgZXhwZWN0IHRoYXQgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgbGlzdEJpbmRpbmcgaXMgdGhlIExpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZS4gUmVtb3ZlIHRoaXMgZnJvbSBjb250ZXh0U2VnbWVudHNcblx0XHQvLyBiZWNhdXNlIGl0IGlzIGluY29ycmVjdCB0byBleGVjdXRlIGJpbmRDb250ZXh0IG9uIGEgbGlzdC4gV2UgZG8gbm90IGFueXdheSBuZWVkIHRvIHNlYXJjaCB0aGlzIGNvbnRleHQgZm9yIHRoZSBvdmVybG9hZC5cblx0XHRjb250ZXh0U2VnbWVudHMucG9wKCk7XG5cdFx0aWYgKGNvbnRleHRTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cyA9IFtcIlwiXTsgLy8gRG9uJ3QgbGVhdmUgY29udGV4dFNlZ21lbnRzIHVuZGVmaW5lZFxuXHRcdH1cblxuXHRcdGlmIChjb250ZXh0U2VnbWVudHNbMF0gIT09IFwiXCIpIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cy51bnNoaWZ0KFwiXCIpOyAvLyB0byBhbHNvIGdldCB0aGUgcm9vdCBjb250ZXh0LCBpLmUuIHRoZSBiaW5kaW5nQ29udGV4dCBvZiB0aGUgdGFibGVcblx0XHR9XG5cdFx0Ly8gbG9hZCBhbGwgdGhlIHBhcmVudCBjb250ZXh0cyBpbnRvIGFuIGFycmF5XG5cdFx0Y29uc3QgcGFyZW50Q29udGV4dHM6IENvbnRleHRbXSA9IGNvbnRleHRTZWdtZW50c1xuXHRcdFx0Lm1hcCgocGF0aFNlZ21lbnQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRpZiAocGF0aFNlZ21lbnQgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KHBhdGhTZWdtZW50LCBjdXJyZW50Q29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgY29udGV4dCB1c2luZyBiaW5kQ29udGV4dCguLi4pLmdldEJvdW5kQ29udGV4dCgpIGRvZXMgbm90IHdvcmsgaWYgdGhlIGV0YWcgaXMgbmVlZGVkLiBBY2NvcmRpbmcgdG8gbW9kZWwgY29sbGVhZ3Vlcyxcblx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgYWx3YXlzIHVzZSBhbiBleGlzdGluZyBjb250ZXh0IGlmIHBvc3NpYmxlLlxuXHRcdFx0XHRcdC8vIEN1cnJlbnRseSwgdGhlIG9ubHkgZXhhbXBsZSB3ZSBrbm93IGFib3V0IGlzIHVzaW5nIHRoZSByb290Q29udGV4dCAtIGFuZCBpbiB0aGlzIGNhc2UsIHdlIGNhbiBvYnZpb3VzbHkgcmV1c2UgdGhhdCBleGlzdGluZyBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIElmIG90aGVyIGV4YW1wbGVzIHNob3VsZCBjb21lIHVwLCB0aGUgYmVzdCBwb3NzaWJsZSB3b3JrIGFyb3VuZCB3b3VsZCBiZSB0byByZXF1ZXN0IHNvbWUgZGF0YSB0byBnZXQgYW4gZXhpc3RpbmcgY29udGV4dC4gVG8ga2VlcCB0aGVcblx0XHRcdFx0XHQvLyByZXF1ZXN0IGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBzaG91bGQgcmVxdWVzdCBvbmx5IHRoZSBmaXJzdCBrZXkgcHJvcGVydHkuIEFzIHRoaXMgd291bGQgaW50cm9kdWNlIGFzeW5jaHJvbmlzbSwgYW5kIGFueXdheVxuXHRcdFx0XHRcdC8vIHRoZSB3aG9sZSBsb2dpYyBpcyBvbmx5IHBhcnQgb2Ygd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcsIHdlIHdhaXQgdW50aWwgd2UgaGF2ZSBhbiBleGFtcGxlIG5lZWRpbmcgaXQgYmVmb3JlIGltcGxlbWVudGluZyB0aGlzLlxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuXHRcdFx0fSlcblx0XHRcdC5yZXZlcnNlKCk7XG5cdFx0Ly8gc2VhcmNoIGZvciBjb250ZXh0IGJhY2t3YXJkc1xuXHRcdGNvbnN0IG92ZXJsb2FkQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCA9IHBhcmVudENvbnRleHRzLmZpbmQoXG5cdFx0XHQocGFyZW50Q29udGV4dDogQ29udGV4dCkgPT5cblx0XHRcdFx0KG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwYXJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiJFR5cGVcIikgYXMgdW5rbm93biBhcyBzdHJpbmcpID09PSBvdmVybG9hZEVudGl0eVR5cGVcblx0XHQpO1xuXHRcdHJldHVybiBvdmVybG9hZENvbnRleHQgfHwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpITtcblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogQ29udGV4dCwgbmV3Q29udGV4dDogQ29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXRQYXRoTWFwcGluZyhtYXBwaW5ncyk7XG5cblx0XHQvLyBBbHNvIHVwZGF0ZSB0aGUgc2VtYW50aWMgbWFwcGluZyBpbiB0aGUgcm91dGluZyBzZXJ2aWNlXG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdGlmIChtYXBwaW5ncy5sZW5ndGggJiYgbGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ub2xkUGF0aCkge1xuXHRcdFx0bGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHR9XG5cdH1cblxuXHRfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRuZXdEb2N1bWVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0c2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZFxuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gbmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBjb250ZXh0LmdldFBhdGgoKSA9PT0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgPyBjb250ZXh0IDogc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoXG5cdCAqIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgcm9vdCBjb250ZXh0IGluZm9ybWF0aW9uIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW4sXG5cdFx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmdcblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGxldCByaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByaWdodG1vc3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KSAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0Ly8gd2UgY2hlY2sgdGhlIHJpZ2h0TW9zdEN1cnJlbnRDb250ZXh0IGNhbiBiZSB1c2VkIGluIGRyYWZ0XG5cdFx0XHRyaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByb290Q3VycmVudENvbnRleHQ7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRNb3N0Q29udGV4dFRvVXNlLmdldFBhdGgoKSA9PT0gcm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRyZXR1cm4gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihyb290Q3VycmVudENvbnRleHQsIHJpZ2h0TW9zdENvbnRleHRUb1VzZSwgcm9vdENvbnRleHRJbmZvLCBncm91cElkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgbm90IGluIGRyYWZ0IG1vZGUsIHdlIGp1c3QgcmVjcmVhdGUgYSBjb250ZXh0IGZyb20gdGhlIHBhdGggb2YgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHQvLyBObyBwYXRoIG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldEJvdW5kQ29udGV4dCgpLFxuXHRcdFx0XHRwYXRoTWFwcGluZzogW11cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0X2lzRmNsRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCk7XG5cdH1cblxuXHRhc3luYyBjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uKCk6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vVGhlIGV4aXN0aW5nIHJlY29tbWVuZGF0aW9ucyBjaGVjayBpcyBub3cgcHJlc2VudCBmdXJ0aGVyIGluIHRoZSBmbG93IGZvciBzaG93aW5nIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKHRydWUpO1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgTmV4dCBEb2N1bWVudC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZWQgb25jZSBjcmVhdGUgbmV4dCBoYXBwZW5zLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTmV4dERvY3VtZW50KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0UGF0aCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmdQYXRoID0gYmluZGluZ0NvbnRleHRQYXRoPy5zdWJzdHJpbmcoMCwgYmluZGluZ0NvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiKFwiKSk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRG9jdW1lbnQobGlzdEJpbmRpbmdQYXRoIGFzIHN0cmluZywgeyBjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5OZXdQYWdlIH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEyRUEsTUFBTUEsZ0JBQWdCLEdBQUdDLFNBQVMsQ0FBQ0QsZ0JBQWdCO0lBQ2xERSxTQUFTLEdBQUdELFNBQVMsQ0FBQ0MsU0FBUztJQUMvQkMsV0FBVyxHQUFHRixTQUFTLENBQUNFLFdBQVc7SUFDbkNDLFFBQVEsR0FBR0gsU0FBUyxDQUFDRyxRQUFRO0lBQzdCQyxXQUFXLEdBQUdKLFNBQVMsQ0FBQ0ksV0FBVztFQTBCcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEEsSUFPTUMsUUFBUSxJQUFBQyxJQUFBLEdBRGJDLGNBQWMsQ0FBQywyQ0FBMkMsQ0FBQyxFQUFBQyxLQUFBLEdBYzFEQyxjQUFjLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBd0JoQkMsZUFBZSxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUNqQkMsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQTJQaEJILGVBQWUsQ0FBQyxDQUFDLEVBQUFJLEtBQUEsR0FDakJGLGNBQWMsQ0FBQyxDQUFDLEVBQUFHLEtBQUEsR0FxR2hCTCxlQUFlLENBQUMsQ0FBQyxFQUFBTSxLQUFBLEdBQ2pCSixjQUFjLENBQUMsQ0FBQyxFQUFBSyxLQUFBLEdBbStCaEJQLGVBQWUsQ0FBQyxDQUFDLEVBQUFRLE1BQUEsR0FDakJDLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQUss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
3082
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiRWRpdEZsb3ciLCJfZGVjIiwiZGVmaW5lVUk1Q2xhc3MiLCJfZGVjMiIsIm1ldGhvZE92ZXJyaWRlIiwiX2RlYzMiLCJwdWJsaWNFeHRlbnNpb24iLCJfZGVjNCIsImZpbmFsRXh0ZW5zaW9uIiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMxMCIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiX2RlYzExIiwiX2RlYzEyIiwiX2RlYzEzIiwiX2RlYzE0IiwiX2RlYzE1IiwiX2RlYzE2IiwiX2RlYzE3IiwiX2RlYzE4IiwiX2RlYzE5IiwiX2RlYzIwIiwiX2RlYzIxIiwiX2RlYzIyIiwiX2RlYzIzIiwiX2RlYzI0IiwiX2RlYzI1IiwiX2RlYzI2IiwiX2RlYzI3IiwiX2RlYzI4IiwiX2RlYzI5IiwiX2RlYzMwIiwiX2RlYzMxIiwiX2RlYzMyIiwiX2RlYzMzIiwiX2RlYzM0IiwiX2RlYzM1IiwiX2RlYzM2IiwiX2RlYzM3IiwiX2RlYzM4IiwiX2RlYzM5IiwiX2RlYzQwIiwiX2RlYzQxIiwiX2RlYzQyIiwiX2RlYzQzIiwiX2RlYzQ0IiwiSW5zdGVhZCIsIl9kZWM0NSIsIl9kZWM0NiIsIl9jbGFzcyIsIl9jbGFzczIiLCJfQmFzZUNvbnRyb2xsZXJFeHRlbnMiLCJfdGhpcyIsIl9sZW4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiY2FsbCIsInN5bmNUYXNrcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJsaXN0QmluZGluZyIsImNyZWF0aW9uUHJvbWlzZSIsInZpZXdCaW5kaW5nQ29udGV4dCIsImdldFZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsIm5ld0NvbnRleHQiLCJjcmVhdGVkIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiZ2V0UGF0aCIsImVycm9yIiwiTG9nIiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwidmFsaWRhdGlvbk1lc3NhZ2VzIiwidGFibGUiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsImRhdGEiLCJjdXN0b21WYWxpZGl0eSIsImdldFByb3BlcnR5IiwiY3VzdG9tTWVzc2FnZXMiLCJmaWVsZENvbnRyb2wiLCJmaW5hbFRhcmdldCIsIm9sZE1lc3NhZ2VzIiwiTWVzc2FnaW5nIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRDb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJmb3JFYWNoIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiRWxlbWVudCIsImdldEVsZW1lbnRCeUlkIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZ2V0VGFyZ2V0cyIsInNvbWUiLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsIk1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsImdldE1vZGVsIiwidHlwZSIsIk1lc3NhZ2VUeXBlIiwiRXJyb3IiLCJjb2RlIiwidGVjaG5pY2FsIiwicGVyc2lzdGVudCIsImV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYWRkQ29udHJvbElkIiwicHVzaCIsInRleHQiLCJnZXRNZXNzYWdlSGFuZGxlciIsInNob3dNZXNzYWdlRGlhbG9nIiwicmVzb2x2ZUNyZWF0aW9uTW9kZSIsImluaXRpYWxDcmVhdGlvbk1vZGUiLCJjcmVhdGVEYXRhIiwiQ3JlYXRpb25Nb2RlIiwiTmV3UGFnZSIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInByb2dyYW1taW5nTW9kZWwiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwiaXNSZWxhdGl2ZSIsImRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImdldE1ldGFDb250ZXh0IiwiZW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwibmV3QWN0aW9uIiwiRHJhZnQiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIkRyYWZ0Um9vdCIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiTmV3QWN0aW9uIiwidG9TdHJpbmciLCJ0YXJnZXRFbnRpdHlUeXBlIiwiYWN0aW9ucyIsInBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsImNyZWF0aW9uUGFyYW1ldGVycyIsImdldFRyYW5zYWN0aW9uSGVscGVyIiwiZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzIiwiQXN5bmMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsIm9uSW5pdCIsIl9oaWRkZW5EcmFmdCIsImdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiSGlkZGVuRHJhZnQiLCJnZXRJbnRlcmZhY2UiLCJiYXNlIiwiZWRpdERvY3VtZW50IiwiY29udGV4dCIsInRyYW5zYWN0aW9uSGVscGVyIiwicm9vdFZpZXdDb250cm9sbGVyIiwiX2dldFJvb3RWaWV3Q29udHJvbGxlciIsIm1vZGVsIiwidmlld0RhdGEiLCJnZXRWaWV3RGF0YSIsImdyb3VwSWQiLCJtZXNzYWdlSGFuZGxpbmdLZXkiLCJyZWdpc3RlclRvSG9sZE1lc3NhZ2VzIiwicm9vdENvbnRleHQiLCJnZXRSb290Q29udGV4dCIsImVkaXRGbG93Iiwib25CZWZvcmVFZGl0IiwicmlnaHRtb3N0Q29udGV4dCIsIl9pc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwidW5kZWZpbmVkIiwidHJhbnNhY3Rpb25EZXRhaWxzIiwibmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSIsInJvb3RDb250ZXh0SW5mbyIsInJvb3RTaWJsaW5nUGF0aFByb21pc2UiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsInNpYmxpbmdJbmZvUHJvbWlzZSIsImNvbXB1dGVTaWJsaW5nSW5mbyIsInZpZXdMZXZlbCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwic3VibWl0QmF0Y2giLCJzaWJsaW5nSW5mbyIsIm5ld0RvY3VtZW50Q29udGV4dCIsImNvbnRleHRUb05hdmlnYXRlIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX3VwZGF0ZVBhdGhzSW5IaXN0b3J5Iiwib3ZlcnJpZGVNZXNzYWdlVUlEZWNpc2lvbiIsIlN0aWNreSIsIk1vZGVsSGVscGVyIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJleGlzdGluZ0RyYWZ0UmV1c2VkIiwiY29sbGFib3JhdGl2ZURyYWZ0Iiwic2V0SW5pdGlhbFNoYXJlIiwib25BZnRlckVkaXQiLCJfaGFuZGxlTmV3Q29udGV4dCIsImVkaXRhYmxlIiwicmVjcmVhdGVDb250ZXh0IiwiZm9yY2VGb2N1cyIsInN0aWNreUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwiaGFuZGxlU3RpY2t5T24iLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsInVuSG9sZEtleSIsIm92ZXJyaWRlVUlEZWNpc2lvbiIsInJlamVjdCIsInJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlIiwicGFyZW50Q29udGV4dCIsInNpZGVFZmZlY3RTZXJ2aWNlIiwic3RhdGVNZXNzYWdlc1BhdGgiLCJnZXRNZXNzYWdlc1BhdGgiLCJpc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvbkJlZm9yZURlbGV0ZSIsImxvY2tPYmplY3QiLCJnZXRHbG9iYWxVSU1vZGVsIiwicGFyZW50Q29udHJvbCIsImJ5SWQiLCJjb250cm9sSWQiLCJpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUiLCJpc0EiLCJpc0luYWN0aXZlIiwiZ2V0QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJiRmluZEFjdGl2ZUNvbnRleHRzIiwiQnVzeUxvY2tlciIsImxvY2siLCJkZWxldGVkIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsInNlbGVjdGVkQ29udGV4dHMiLCJyZXN1bHQiLCJjbGVhclNlbGVjdGlvbiIsImlzUm9vdCIsInJlZnJlc2hMaXN0QmluZGluZyIsIkVkaXRTdGF0ZSIsInNldEVkaXRTdGF0ZURpcnR5IiwiaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQiLCJyZWNvbW1lbmRhdGlvbnMiLCJpZ25vcmVSZWNvbW1lbmRhdGlvbkZvckNvbnRleHRzIiwib25BZnRlckRlbGV0ZSIsImNvbnRleHRzIiwidGFibGVBUEkiLCJnZXRQYXJlbnQiLCJ0YWJsZURlZmluaXRpb24iLCJjb250cm9sIiwiY3JlYXRpb25Nb2RlIiwiSW5saW5lQ3JlYXRpb25Sb3dzIiwicmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMiLCJzZXRVcEVtcHR5Um93cyIsIl9zZW5kQWN0aXZpdHkiLCJBY3Rpdml0eSIsIkRlbGV0ZSIsInVubG9jayIsInVwZGF0ZURvY3VtZW50IiwidXBkYXRlZENvbnRleHQiLCJ1cGRhdGVQcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImlzRHJhZnQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJzeW5jVGFzayIsInNldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwiZW50aXR5U2V0TmFtZSIsImdldE9iamVjdCIsInNlbWFudGljS2V5cyIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwiY3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJjdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsInNob3dNZXNzYWdlcyIsImdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uIiwiY3JlYXRlRG9jdW1lbnQiLCJzb3VyY2UiLCJtSW5QYXJhbWV0ZXJzIiwib0RhdGFMaXN0QmluZGluZyIsImRhdGFNb2RlbCIsInNlbGVjdGVkUHJvcGVydGllcyIsIiRzZWxlY3QiLCIkJGdyb3VwSWQiLCJFeHRlcm5hbCIsImxpc3RCaW5kaW5nRnJvbVBhdGgiLCJiaW5kTGlzdCIsImNyZWF0ZUF0RW5kIiwicmVzb2x2ZWRDcmVhdGlvbk1vZGUiLCJnZXRSb3V0ZXJQcm94eSIsInJlbW92ZUlBcHBTdGF0ZUtleSIsInNpbmdsZURyYWZ0Rm9yQ3JlYXRlIiwiZ2V0TWFuaWZlc3QiLCJhcHAiLCJnZXRSb290QmluZGluZyIsImdldEhlYWRlckNvbnRleHQiLCJuZXdCaW5kaW5nIiwiZ2V0Q29udGV4dCIsIlNvcnRlciIsIkZpbHRlciIsImZpbHRlcnMiLCJwYXRoIiwib3BlcmF0b3IiLCJ2YWx1ZTEiLCJhbmQiLCJyZXF1ZXN0Q29udGV4dHMiLCJ0aGVuIiwiZGVzdHJveSIsIl9oYW5kbGVDcmVhdGlvbk1vZGUiLCJ2TGlzdEJpbmRpbmciLCJjcmVhdGVFeHRlcm5hbERvY3VtZW50Iiwib3V0Ym91bmQiLCJjcmVhdGVEZWZlcnJlZERvY3VtZW50IiwiQ3JlYXRpb25Sb3ciLCJjcmVhdGlvblJvdyIsImNyZWF0ZUNyZWF0ZVJvd0RvY3VtZW50Iiwic2tpcFNpZGVFZmZlY3RzIiwiSW5saW5lIiwiY3JlYXRlRGlhbG9nSW5saW5lRG9jdW1lbnQiLCJ0YWJsZUlkIiwiQ3JlYXRpb25EaWFsb2ciLCJjcmVhdGlvbkRpYWxvZ0ZpZWxkcyIsImNyZWF0ZURpYWxvZ0FuZFNhdmVEb2N1bWVudCIsIlN5bmMiLCJjcmVhdGVTeW5jQXN5bmNEb2N1bWVudCIsImJGcm9tRGVmZXJyZWQiLCJjcmVhdGVBY3Rpb24iLCJwb3N0RG9jdW1lbnRDcmVhdGlvbiIsInByZXJlcXVpc2l0ZSIsInBhcmFtcyIsIm9uQWZ0ZXJDcmVhdGUiLCJtZXRhQ29udGV4dCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiZ2V0SW50ZXJuYWxNb2RlbCIsInNldFByb3BlcnR5IiwiaXNMaXN0QmluZGluZ0FuYWx5dGljYWwiLCJmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZCIsInNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSIsIkNyZWF0ZSIsImlzRHJhZnRSb290IiwiaXNDb25uZWN0ZWQiLCJjcmVhdGlvbiIsImFwcENvbXBvbmVudCIsIm5hdmlnYXRpb24iLCJjcmVhdGlvblJvd0NvbnRleHQiLCJkb2N1bWVudFZhbGlkYXRpb24iLCJnZXRDcmVhdGlvblJvd1ZhbGlkYXRpb25GdW5jdGlvbiIsImVudGl0eVR5cGUiLCJjcmVhdGlvblJvd1BheWxvYWQiLCJfY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzIiwiYXR0YWNoRXZlbnRPbmNlIiwic2Nyb2xsVG9JbmRleCIsImdldExlbmd0aCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsIk9iamVjdCIsImFzc2lnbiIsImtleXMiLCJwcm9wZXJ0eVBhdGgiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImZpbmRJbmRleCIsInByb3BlcnR5IiwibmFtZSIsIm1hcCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImJ1c3lJZCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImFubm90YXRpb24iLCJpZCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZ2V0U3RhcnR1cE1vZGUiLCJBdXRvQ3JlYXRlIiwiX2dldFJlc291cmNlTW9kZWwiLCJjcmVhdGlvblJvd0xpc3RCaW5kaW5nIiwibmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsInNldEJpbmRpbmdDb250ZXh0IiwiY2F0Y2giLCJ0cmFjZSIsImRlbGV0ZSIsImFsbCIsImlzTG9ja2VkIiwiY29udGV4dEluZGV4IiwiZ2V0SW5kZXgiLCJhZ2dyZWdhdGlvbkRhdGEiLCJnZXRBZ2dyZWdhdGlvbiIsImlzQ3JlYXRlSW5QbGFjZSIsImNyZWF0ZUluUGxhY2UiLCJzZXRUaW1lb3V0IiwiZ2V0QnVzeSIsImZvY3VzUm93IiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsImdldFRleHQiLCJwYXJlbnRJbmRleCIsInNhdmVkRG9jdW1lbnRDb250ZXh0IiwiYWZ0ZXJDcmVhdGVJbkRpYWxvZyIsIm9uQmVmb3JlU2F2ZSIsInNhdmVEb2N1bWVudCIsIm9uQWZ0ZXJTYXZlIiwicmVmcmVzaCIsIml0ZW1JbmRleCIsImFmdGVyQ3JlYXRlQ2FsbEJhY2siLCJnZXRJbnRlcm5hbFJvdXRpbmciLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJjcmVhdGVPbk5hdmlnYXRlUGFyYW1ldGVycyIsIm1vZGUiLCJyb3V0aW5nTGlzdGVuZXIiLCJjcmVhdGVDb250ZXh0UHJvbWlzZSIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsIkxpYnJhcnkiLCJnZXRSZXNvdXJjZUJ1bmRsZUZvciIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJuYXZQYXJhbWV0ZXJzIiwidHJhbnNpZW50IiwibmF2aWdhdGVUb0NvbnRleHQiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDcmVhdGlvbkZhaWxlZCIsIk9uQmVmb3JlQ3JlYXRlRmFpbGVkIiwiaW5jbHVkZXMiLCJuYXZpZ2F0ZUJhY2tGcm9tVHJhbnNpZW50U3RhdGUiLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImNyZWF0ZVBhdGgiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJfaW50ZW50QmFzZWROYXZpZ2F0aW9uIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwidmFsaWRhdGVEb2N1bWVudCIsImNyZWF0aW9uUm93T2JqZWN0cyIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwiZGF0YUZvckNyZWF0ZSIsImlzRnJvbUNvcHlQYXN0ZSIsImNyZWF0ZUFzSW5hY3RpdmUiLCJ0YXJnZXRMaXN0QmluZGluZyIsIm1ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJjcmVhdGlvblByb21pc2VzIiwicHJvcGVydHlWYWx1ZXMiLCJjcmVhdGVQYXJhbWV0ZXJzIiwiaW5hY3RpdmUiLCIka2luZCIsImNyZWF0ZWRDb250ZXh0cyIsImFjdGl2ZUNvbnRleHRzIiwiZXJyIiwiX21QYXJhbWV0ZXJzIiwib25CZWZvcmVEaXNjYXJkIiwib25CZWZvcmVFeGVjdXRlQWN0aW9uIiwib25BZnRlckRpc2NhcmQiLCJvQ29udGV4dCIsIm1QYXJhbWV0ZXJzIiwiaW5saW5lRWRpdEZsb3ciLCJpc0lubGluZUVkaXRQb3NzaWJsZSIsImlubGluZUVkaXRTYXZlIiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJiaW5kaW5ncyIsIm1lcmdlUGF0Y2hEcmFmdCIsIl9zdWJtaXRPcGVuQ2hhbmdlcyIsInJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3NlbiIsImNoZWNrUmVjb21tZW5kYXRpb25PcHRpb24iLCJzUHJvZ3JhbW1pbmdNb2RlbCIsImlzRmNsRW5hYmxlZCIsIl9zaWRlRWZmZWN0cyIsImhhbmRsZVBhZ2VDaGFuZ2VDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJhY3RpdmVEb2N1bWVudENvbnRleHQiLCJnZXRDcmVhdGlvbk1vZGUiLCJfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsIkFjdGl2YXRlIiwiZGlzY29ubmVjdCIsIl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsIlN0YW5kYXJkQWN0aW9ucyIsInNhdmUiLCJUcmlnZ2VyVHlwZSIsInN0YW5kYXJkQWN0aW9uIiwiRGlzcGxheSIsInN0b3JlRGF0YUZvclRlbGVtZXRyeSIsIl9jcmVhdGVTaWJsaW5nSW5mbyIsInByZXZpb3VzU2VtYW50aWNQYXRoIiwibmV3U2VtYW50aWNQYXRoIiwicGF0aE1hcHBpbmciLCJvbGRQYXRoIiwibmV3UGF0aCIsInN0YXlPbkN1cnJlbnRQYWdlQWZ0ZXJTYXZlIiwidGFyZ2V0Q29udGV4dCIsInNraXBCaW5kaW5nVG9WaWV3Iiwib0Vycm9yIiwiY2FuY2VsZWQiLCJ0b2dnbGVEcmFmdEFjdGl2ZSIsIm9Db250ZXh0RGF0YSIsImJJc0RyYWZ0IiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJvUmlnaHRtb3N0Q29udGV4dCIsImxhc3RTZW1hbnRpY01hcHBpbmciLCJ0ZWNobmljYWxQYXRoIiwidGFyZ2V0UGF0aCIsImNhbmNlbERvY3VtZW50IiwiaXNOZXdEb2N1bWVudCIsInNraXBEaXNjYXJkUG9wb3ZlciIsImVuYWJsZWQiLCJjYW5jZWxQYXJhbWV0ZXJzIiwiY2FuY2VsQnV0dG9uIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjYW5jZWxSZXN1bHQiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInZpZXciLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJzdGF5T25DdXJyZW50UGFnZUFmdGVyQ2FuY2VsIiwiX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMiLCJzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZSIsImJpbmRpbmdQYXJhbWV0ZXJzIiwiY3JlYXRlUm9vdENvbnRleHQiLCJpc1Jvb3RDb250ZXh0TmV3IiwiZHJhZnRQcm9wZXJ0aWVzIiwicmVxdWVzdFByb3BlcnR5IiwicmVzb3VyY2VNb2RlbCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQiLCJzaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQiLCJjbG9zZU9uQnJvd3Nlck5hdmlnYXRpb24iLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImRlbGV0ZURvY3VtZW50Iiwib0FwcENvbXBvbmVudCIsInNpYmxpbmdDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJkcmFmdFBhdGgiLCJyZXF1ZXN0Q2Fub25pY2FsUGF0aCIsImRyYWZ0Q29udGV4dFRvUmVtb3ZlIiwicmVwbGFjZVdpdGgiLCJjb250ZXh0QmluZGluZyIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIkRlZXBsaW5rIiwiZXhpdEZyb21BcHAiLCJhcHBseURvY3VtZW50Iiwib0xvY2tPYmplY3QiLCJpc0NvbnRpbnVlIiwic2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2ciLCJSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIiwiQ29udGludWUiLCJjYWxsRXh0ZW5zaW9uIiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJvVmlldyIsImlzQXJyYXkiLCJpc05hdmlnYWJsZSIsInJlcXVpcmVzTmF2aWdhdGlvbiIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwiZW50aXR5Q29udGFpbmVyIiwiaXNCb3VuZCIsIm9Db250cm9sIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJpZ25vcmVFVGFnIiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoIiwiZW5hYmxlQXV0b1Njcm9sbCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJnZXRJZCIsInJlc3BvbnNlIiwiY2FsbEFjdGlvbiIsInN1Y2Nlc3NGdWxsRXhlY3V0aW9uIiwiaXNGdWxmaWxsZWQiLCJsaXN0UmVmcmVzaGVkIiwiX3JlZnJlc2hMaXN0SWZSZXF1aXJlZCIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJBY3Rpb24iLCJ2YWx1ZSIsImJvdW5kQ29udGV4dCIsImFjdGlvbiIsImZSZXNvbHZlciIsImNvbnZlcnRlclR5cGUiLCJfZ2V0Qm91bmRDb250ZXh0IiwicmV0dXJuZWRDb250ZXh0Iiwib01ldGFNb2RlbCIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0Iiwic0FjdGlvbkNvbnRleHRNZXRhUGF0aCIsImNoZWNrTm9IYXNoQ2hhbmdlIiwiaW5mbyIsIm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24iLCJvUmVzdWx0IiwiZlJlamVjdG9yIiwiX2FjdGlvbk5hbWUiLCJjdXN0b21NYXNzRWRpdFNhdmUiLCJzZWN1cmVkRXhlY3V0aW9uIiwiZm5GdW5jdGlvbiIsImJCdXN5U2V0IiwiYnVzeSIsInNldCIsImJCdXN5Q2hlY2siLCJjaGVjayIsImJVcGRhdGVzRG9jdW1lbnQiLCJ1cGRhdGVzRG9jdW1lbnQiLCJmaW5hbGx5IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50IiwiaW50ZXJuYWxDb250ZXh0IiwidWlDb250ZXh0IiwiZ2V0U291cmNlIiwic2V0SWdub3JlRVRhZyIsImhhbmRsZUlubGluZUVkaXRQYXRjaFNlbnQiLCJzb3VyY2VCaW5kaW5nIiwib1BhdGNoUHJvbWlzZSIsInBhdGNoQ29tcGxldGVkRXZlbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2giLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsImhhbmRsZUNyZWF0ZVNlbnQiLCJldmVudCIsIm5ld1Rhc2siLCJkZWJ1ZyIsImNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZSIsImdsb2JhbE1vZGVsIiwiZm9yY2VEaXNwbGF5TW9kZSIsImlzQWN0aXZlRW50aXR5IiwicmVxdWVzdE9iamVjdCIsImFjdGl2YXRlQ29sbGFib3JhdGlvbiIsImZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlIiwiaGFzQWN0aXZlRW50aXR5IiwibGFzdEludm9rZWRBY3Rpb25OYW1lIiwiaXNOZXdBY3Rpb25Gb3JTdGlja3kiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJzb3VyY2VDb250cm9sIiwiZ2V0UmVzb3VyY2VNb2RlbCIsIlRyYW5zYWN0aW9uSGVscGVyIiwibWVzc2FnZUhhbmRsZXIiLCJnZXRQYWdlSW50ZXJuYWxNb2RlbCIsInNldENyZWF0aW9uTW9kZSIsImJDcmVhdGlvbk1vZGUiLCJwYWdlSW50ZXJuYWxDb250ZXh0IiwiVWlNb2RlbENvbnN0YW50cyIsIkNyZWF0ZU1vZGUiLCJEb2N1bWVudE1vZGlmaWVkIiwibW9kaWZpZWQiLCJiaW5kaW5nIiwibWVzc2FnZUhhbmRsaW5nS2V5U2V0cyIsImF0dGFjaEV2ZW50IiwiZXZlbnRJbnN0YW5jZSIsImZpbmQiLCJzdWNjZXNzIiwiZHJhZnRTdGF0dXMiLCJlZGl0TW9kZSIsImlzQ3JlYXRpb24iLCJmb3JjZWQiLCJzaGFsbEZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkIiwiYWN0aW9uTmFtZSIsInN0aWNreVNlc3Npb24iLCJBZGRpdGlvbmFsTmV3QWN0aW9ucyIsImhhc05hdmlnYXRpb25HdWFyZCIsImhhc2hUcmFja2VyIiwiZ2V0SGFzaCIsImludGVybmFsTW9kZWwiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiYmluZCIsImkxOG5Nb2RlbCIsInJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyIsImdldERpcnR5U3RhdGVQcm92aWRlciIsImdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJ1bnJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyIsImdldEh0dHBIZWFkZXJzIiwibmF2aWdhdGlvbkNvbnRleHQiLCJ0YXJnZXRIYXNoIiwiaW5uZXJBcHBSb3V0ZSIsInJvdXRlclByb3h5IiwibGNsSGFzaFRyYWNrZXIiLCJpc0RpcnR5IiwiaXNTZXNzaW9uT24iLCJpc05hdmlnYXRpb25GaW5hbGl6ZWQiLCJjaGVja0hhc2hXaXRoR3VhcmQiLCJpc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyIiwic2V0RGlydHlGbGFnIiwid2FybmluZ0RpYWxvZyIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJiZWdpbkJ1dHRvbiIsIkJ1dHRvbiIsInByZXNzIiwiYWZ0ZXJDbG9zZSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJjdXJyZW50SGFzaCIsImRpc2NhcmRTdGlja3lTZXNzaW9uIiwiY2xlYXJTZXNzaW9uQ29udGV4dCIsImRpc2NhcmRlZENvbnRleHQiLCJzdGlja3kiLCJkaXNjYXJkRG9jdW1lbnQiLCJyZXNldENoYW5nZXMiLCJfcm91dGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJyZXNvbHZlRnVuY3Rpb24iLCJyZWplY3RGdW5jdGlvbiIsImFjdGlvblByb21pc2UiLCJjdXJyZW50VmlldyIsIm1ldGFNb2RlbERhdGEiLCJtZXRhTW9kZWxBY3Rpb24iLCJhY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsIiRLZXkiLCJvRGF0YSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJpc1NhdmUiLCJjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nIiwiQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nIiwiX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsInJvd0JpbmRpbmciLCJhY3RpdmVSb3dJbmRleCIsImdldENvdW50IiwiYWxsUm93Q29udGV4dHMiLCJnZXRBbGxDdXJyZW50Q29udGV4dHMiLCJpbmRleCIsInNpbmdsZUNvbnRleHQiLCJjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyIsImlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUiLCJyZWxhdGVkQ29udGV4dHMiLCJ0cmlnZ2VyZWRBY3Rpb25OYW1lIiwiYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyIsInNlbmQiLCJ0cmlnZ2VyVHlwZSIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwib01vZGVsIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsInByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbiIsImhpc3RvcnkiLCJiYWNrIiwibmF2aWdhdGlvblBhcmFtZXRlcnMiLCJwZXJzaXN0T1BTY3JvbGwiLCJyZWFzb24iLCJOYXZpZ2F0aW9uUmVhc29uIiwiRWRpdEZsb3dBY3Rpb24iLCJzaG93UGxhY2Vob2xkZXIiLCJrZWVwQ3VycmVudExheW91dCIsImJSZWZyZXNoQWZ0ZXJBY3Rpb24iLCJ2aXNpYmxlVmlld0lkcyIsIl9nZXRBbGxWaXNpYmxlVmlld3MiLCJhTWVzc2FnZXMiLCJ2YWxpZGF0aW9uIiwiZ2V0Q29udHJvbElkIiwib1Jlc3BvbnNlIiwib0JpbmRpbmciLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJwYXRocyIsIm9LZXkiLCIkUHJvcGVydHlQYXRoIiwib3ZlcmxvYWRFbnRpdHlUeXBlIiwiY29udGV4dFNlZ21lbnRzIiwiY3VycmVudENvbnRleHQiLCJwb3AiLCJ1bnNoaWZ0IiwicGFyZW50Q29udGV4dHMiLCJwYXRoU2VnbWVudCIsInJldmVyc2UiLCJvdmVybG9hZENvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwicmlnaHRNb3N0Q29udGV4dFRvVXNlIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiY3JlYXRlTmV4dERvY3VtZW50IiwiYmluZGluZ0NvbnRleHRQYXRoIiwibGlzdEJpbmRpbmdQYXRoIiwibGFzdEluZGV4T2YiLCJCYXNlQ29udHJvbGxlckV4dGVuc2lvbiIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVkaXRGbG93LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRW50aXR5U2V0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvYmFzZS9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IEZFVmlldyB9IGZyb20gXCJzYXAvZmUvY29yZS9CYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHR5cGUgSVJvd0JpbmRpbmdJbnRlcmZhY2UgZnJvbSBcInNhcC9mZS9jb3JlL0lSb3dCaW5kaW5nSW50ZXJmYWNlXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCYXNlQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQmFzZUNvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIFRyaWdnZXJUeXBlLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21NZXNzYWdlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB0eXBlIHtcblx0Q2FuY2VsUGFyYW1ldGVycyxcblx0Q3JlYXRlUGFyYW1ldGVycyxcblx0RWRpdFRyYW5zYWN0aW9uRXhlY3V0aW9uRGV0YWlsc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvVHJhbnNhY3Rpb25IZWxwZXJcIjtcbmltcG9ydCBUcmFuc2FjdGlvbkhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvVHJhbnNhY3Rpb25IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgQmluZENvbnRleHRQYXJhbWV0ZXJzLCBSb290Q29udGV4dEluZm8sIFNpYmxpbmdJbmZvcm1hdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IFVpTW9kZWxDb25zdGFudHMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2VkaXRGbG93Q29uc3RhbnRzXCI7XG5pbXBvcnQgc3RpY2t5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9zdGlja3lcIjtcbmltcG9ydCB0eXBlIHsgSGlkZGVuRHJhZnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgdHlwZSB7IE1ldGFNb2RlbEFjdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgRHJhZnRTaWJsaW5nUGFpciB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IFNlbWFudGljS2V5SGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1NlbWFudGljS2V5SGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgdHlwZSBGY2xDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9yb290Vmlldy9GY2wuY29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgUm9vdFZpZXdCYXNlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvcm9vdFZpZXcvUm9vdFZpZXdCYXNlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBSb3V0aW5nTmF2aWdhdGlvblBhcmFtZXRlcnMsIFNlbWFudGljTWFwcGluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9Sb3V0aW5nU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIE1hY3JvVGFibGUgZnJvbSBcInNhcC9mZS9tYWNyb3MvVGFibGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlQVBJIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlQVBJXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9MaWJcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIENyZWF0aW9uUm93IGZyb20gXCJzYXAvdWkvbWRjL3RhYmxlL0NyZWF0aW9uUm93XCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBDb250ZXh0LCBkZWZhdWx0IGFzIE9EYXRhVjRDb250ZXh0IH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBNZXRhTW9kZWxFbnRpdHlUeXBlIH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcIi4uL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB7IENvbmZpcm1SZWNvbW1lbmRhdGlvbkRpYWxvZywgUmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB9IGZyb20gXCIuLi9jb250cm9scy9SZWNvbW1lbmRhdGlvbnMvQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nXCI7XG5pbXBvcnQgeyBDcmVhdGlvbk1vZGUsIHR5cGUgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBpc0Z1bGZpbGxlZCB9IGZyb20gXCIuLi9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4vZWRpdEZsb3cvb3BlcmF0aW9ucy9PRGF0YU9wZXJhdGlvblwiO1xuaW1wb3J0IE5hdmlnYXRpb25SZWFzb24gZnJvbSBcIi4vcm91dGluZy9OYXZpZ2F0aW9uUmVhc29uXCI7XG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0U3RhcnR1cE1vZGUgPSBGRUxpYnJhcnkuU3RhcnR1cE1vZGU7XG5cbnR5cGUgU2F2ZURvY3VtZW50UGFyYW1ldGVycyA9IHtcblx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I/OiBib29sZWFuO1xuXHRtZXJnZVBhdGNoRHJhZnQ/OiBib29sZWFuO1xuXHRza2lwQmluZGluZ1RvVmlldz86IGJvb2xlYW47XG5cdGJpbmRpbmdzPzogT0RhdGFMaXN0QmluZGluZ1tdO1xufTtcblxudHlwZSBJbnRlcm5hbENyZWF0ZVBhcmFtZXRlcnMgPSB7XG5cdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb247XG5cdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRidXN5TW9kZT86IHN0cmluZztcblx0Y3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0Y3JlYXRpb25Sb3c/OiBDcmVhdGlvblJvdztcblx0ZGF0YT86IG9iamVjdDtcblx0dGFibGVJZD86IHN0cmluZztcblx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRzZWxlY3RlZENvbnRleHRzPzogT0RhdGFWNENvbnRleHRbXTtcblx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogQSBjb250cm9sbGVyIGV4dGVuc2lvbiBvZmZlcmluZyBob29rcyBpbnRvIHRoZSBlZGl0IGZsb3cgb2YgdGhlIGFwcGxpY2F0aW9uXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIEJhc2VDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8eyBjb250cm9sSWQ/OiBzdHJpbmc7IG9EYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsga2V5czogc3RyaW5nW10gfT47XG5cblx0cHJpdmF0ZSBjb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nPzogQ29uZmlybVJlY29tbWVuZGF0aW9uRGlhbG9nO1xuXG5cdHByaXZhdGUgX2hpZGRlbkRyYWZ0OiBIaWRkZW5EcmFmdCB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIGZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG5cdEBtZXRob2RPdmVycmlkZSgpXG5cdG9uSW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLl9oaWRkZW5EcmFmdCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKS5IaWRkZW5EcmFmdCBhcyBIaWRkZW5EcmFmdDtcblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0Z2V0SW50ZXJmYWNlKCk6IEJhc2VPYmplY3Qge1xuXHRcdHJldHVybiBzdXBlci5nZXRJbnRlcmZhY2UoKTtcblx0fVxuXG5cdGdldEFwcENvbXBvbmVudCgpOiBBcHBDb21wb25lbnQge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZvciB0aGUgZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGUgd2l0aCB0aGUgZWRpdGFibGUgY29udGV4dFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8T0RhdGFWNENvbnRleHQgfCB2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3Qgdmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzO1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cdFx0Y29uc3QgZ3JvdXBJZCA9IFwiZWRpdEdyb3VwXCI7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KGNvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IHJvb3RDb250ZXh0IH0pO1xuXG5cdFx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dCA9IHRoaXMuX2lzRmNsRW5hYmxlZCgpID8gKHJvb3RWaWV3Q29udHJvbGxlciBhcyBGY2xDb250cm9sbGVyKS5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBjb250ZXh0O1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHJpZ2h0bW9zdENvbnRleHQpICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIHdlIGNoZWNrIHRoZSByaWdodG1vc3RDb250ZXh0IGNhbiBiZSB1c2VkIGluIGRyYWZ0XG5cdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdHJhbnNhY3Rpb25EZXRhaWxzOiBFZGl0VHJhbnNhY3Rpb25FeGVjdXRpb25EZXRhaWxzID0ge307XG5cdFx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHRQcm9taXNlID0gdHJhbnNhY3Rpb25IZWxwZXIuZWRpdERvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5iYXNlLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRncm91cElkLFxuXHRcdFx0XHR0cmFuc2FjdGlvbkRldGFpbHNcblx0XHRcdCk7XG5cdFx0XHRjb25zdCByb290Q29udGV4dEluZm8gPSB7XG5cdFx0XHRcdHJvb3RTaWJsaW5nUGF0aFByb21pc2U6IG5ld0RvY3VtZW50Q29udGV4dFByb21pc2Vcblx0XHRcdH07XG5cdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblxuXHRcdFx0bGV0IHNpYmxpbmdJbmZvUHJvbWlzZTtcblx0XHRcdC8vIHJpZ2h0bW9zdENvbnRleHQgPT09IHJvb3RDb250ZXh0ID0+IHdlJ3JlIGluIE9QLiBJZiBub3QsIHdlJ3JlIGluIG11bHRpLWNvbHVtbiBsYXlvdXQgb2YgRkNMXG5cdFx0XHRjb25zdCBjb21wdXRlU2libGluZ0luZm8gPSByaWdodG1vc3RDb250ZXh0ICE9PSByb290Q29udGV4dCB8fCAodmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMTtcblx0XHRcdGlmIChjb21wdXRlU2libGluZ0luZm8pIHtcblx0XHRcdFx0c2libGluZ0luZm9Qcm9taXNlID0gdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0LFxuXHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRyb290Q29udGV4dEluZm8sXG5cdFx0XHRcdFx0Z3JvdXBJZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0Y29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXG5cdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCBzaWJsaW5nSW5mb1Byb21pc2U7XG5cdFx0XHRjb25zdCBuZXdEb2N1bWVudENvbnRleHQgPSAoYXdhaXQgbmV3RG9jdW1lbnRDb250ZXh0UHJvbWlzZSkgYXMgQ29udGV4dDtcblx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZCA9IG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdGlmIChjb21wdXRlU2libGluZ0luZm8gJiYgY29udGV4dFRvTmF2aWdhdGUpIHtcblx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQsXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdHJvb3RDb250ZXh0SW5mbyxcblx0XHRcdFx0XHRcdFwiJGF1dG9cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSB0aGlzLl9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQsIHNpYmxpbmdJbmZvKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KFtdKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG92ZXJyaWRlTWVzc2FnZVVJRGVjaXNpb24gPSBmYWxzZTtcblx0XHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ICYmXG5cdFx0XHRcdFx0TW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpICYmXG5cdFx0XHRcdFx0dHJhbnNhY3Rpb25EZXRhaWxzLmV4aXN0aW5nRHJhZnRSZXVzZWQgIT09IHRydWVcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gVGhlIGluaXRpYWwgc2hhcmUgYWN0aW9uIHNoYWxsIGJlIGNhbGxlZCAgKGV4Y2VwdCBpZiB0aGUgZHJhZnQgYWxyZWFkeSBleGlzdGVkKVxuXHRcdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2V0SW5pdGlhbFNoYXJlKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyRWRpdCh7IGNvbnRleHQ6IGNvbnRleHRUb05hdmlnYXRlIH0pO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlIGFzIENvbnRleHQsIHtcblx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRyZWNyZWF0ZUNvbnRleHQ6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0Ly8gYXMgdGhlIFVSTCBtYXkgY2hhbmdlIGluIHRoZSBjYXNlIG9mIEZDTFxuXHRcdFx0XHRcdGxldCBzdGlja3lDb250ZXh0OiBDb250ZXh0O1xuXHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byB1c2UgdGhlIGtlcHQtYWxpdmUgY29udGV4dCB1c2VkIHRvIGJpbmQgdGhlIHBhZ2Vcblx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBuZXdEb2N1bWVudENvbnRleHQ/LmdldE1vZGVsKCkuZ2V0S2VlcEFsaXZlQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG5ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5oYW5kbGVTdGlja3lPbihzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvdmVycmlkZU1lc3NhZ2VVSURlY2lzaW9uID0gdHJ1ZTtcblxuXHRcdFx0XHQvLyBXZSBjaGFuZ2UgdGhlIGVkaXQgbW9kZSBhZnRlciB0aGUgcGFnZSBiaW5kaW5nIGhhcyBiZWVuIGRvbmUsIG90aGVyd2lzZSB0aGUgY3JlYXRpb24gb2YgZW1wdHkgcm93cyBtaWdodCBmYWlsIChhcyB0aGUgdGFibGUgaXMgc3RpbGwgb24gdGhlIGFjdGl2ZSB2ZXJzaW9uKVxuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSwgb3ZlcnJpZGVVSURlY2lzaW9uOiBvdmVycmlkZU1lc3NhZ2VVSURlY2lzaW9uIH0pO1xuXHRcdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgc2lkZSBlZmZlY3RzIHJlcXVpcmVkIGFmdGVyIGRlbGV0aW5nIGFuIG9iamVjdC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgdGhlIGRlbGV0ZWQgb2JqZWN0IGJlbG9uZ3MgdG9cblx0ICogQHBhcmFtIHBhcmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgcGFyZW50IG9iamVjdCBvZiB0aGUgZGVsZXRlZCBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgcmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCB1bmRlZmluZWQsIHBhcmVudENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0XHRpZiAoIWxpc3RCaW5kaW5nIHx8ICFwYXJlbnRDb250ZXh0IHx8IENvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNpZGVFZmZlY3RTZXJ2aWNlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRzaWRlRWZmZWN0U2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBwYXJlbnRDb250ZXh0KTtcblxuXHRcdGNvbnN0IHN0YXRlTWVzc2FnZXNQYXRoID0gTW9kZWxIZWxwZXIuZ2V0TWVzc2FnZXNQYXRoKGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksIHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHQvLyBJbiBjYXNlIG9mIGEgVHJlZVRhYmxlLCB3ZSBuZWVkIHRvIHJlZnJlc2ggc3RhdGUgbWVzc2FnZXMgZm9yIHRoZSBPYmplY3RQYWdlLCBhcyBzb21lIG9mIHRoZXNlIG1lc3NhZ2VzIG1pZ2h0IGJlIGF0dGFjaGVkXG5cdFx0Ly8gdG8gY2hpbGRyZW4gb2YgYSBkZWxldGVkIHJvdyB3aGljaCBtYXkgbm90IGhhdmUgYmVlbiBsb2FkZWQgeWV0LCBhbmQgdGhlcmVmb3JlIHRoZSBtb2RlbCB3b3VsZG4ndCBjbGVhbiB1cCB0aGVzZSBtZXNzYWdlc1xuXHRcdGlmIChzdGF0ZU1lc3NhZ2VzUGF0aCAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdHNpZGVFZmZlY3RTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhbc3RhdGVNZXNzYWdlc1BhdGhdLCBwYXJlbnRDb250ZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIGNvbnRleHRzVG9EZWxldGUgVGhlIGNvbnRleHRzIG9mIHRoZSBkb2N1bWVudHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRjb250ZXh0c1RvRGVsZXRlOiBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ6IHN0cmluZztcblx0XHRcdG5vRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRyb2w/OiBDb250cm9sO1xuXHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0cz86IGJvb2xlYW47XG5cdFx0XHRzZWxlY3RlZENvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyA9IHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZTtcblxuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBwYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCkgPz8gRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0bGV0IGluYWN0aXZlQ29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdID0gW107XG5cdFx0aWYgKHBhcmVudENvbnRyb2w/LmlzQTxUYWJsZT4oXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRpbmFjdGl2ZUNvbnRleHRzVG9EZWxldGUgPSBjb250ZXh0c1RvRGVsZXRlLmZpbHRlcigoY29udGV4dCkgPT4gY29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdH1cblx0XHRpZiAoIXBhcmVudENvbnRyb2wpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHBhcmVudENvbnRyb2wgYXMgQ29udHJvbDtcblx0XHR9XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSAocGFyZW50Q29udHJvbC5nZXRCaW5kaW5nKFwiaXRlbXNcIikgfHwgKHBhcmVudENvbnRyb2wgYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSB0cnVlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGNvbnRleHRzVG9EZWxldGUsIHBhcmFtZXRlcnMpO1xuXHRcdFx0aWYgKCFkZWxldGVkKSB7XG5cdFx0XHRcdC8vIFRoZSBkZWxldGUgd2FzIGNhbmNlbGxlZFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwocGFyYW1ldGVycz8uc2VsZWN0ZWRDb250ZXh0cz8uWzBdID8/IGNvbnRleHRzVG9EZWxldGVbMF0pID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRsZXQgcmVzdWx0O1xuXG5cdFx0XHQvLyBNdWx0aXBsZSBvYmplY3QgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYSBsaXN0XG5cdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0cGFyZW50Q29udHJvbC5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0cmVzdWx0ID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzT25EZWxldGUobGlzdEJpbmRpbmcsIHZpZXdCaW5kaW5nQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGlzUmVjb21tZW5kYXRpb25FbmFibGVkID0gdGhpcy5iYXNlLnJlY29tbWVuZGF0aW9ucy5pc1JlY29tbWVuZGF0aW9uRW5hYmxlZCgpO1xuXHRcdFx0Ly8gV2UgY2xlYXIgcmVjb21tZW5kYXRpb24gZGF0YSBhbmQgY29udGV4dHMgZnJvbSBpbnRlcm5hbCBtb2RlbCBmb3IgdGhlIGRlbGV0ZWQgY29udGV4dHNcblx0XHRcdGlmIChpc1JlY29tbWVuZGF0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlnbm9yZVJlY29tbWVuZGF0aW9uRm9yQ29udGV4dHMoY29udGV4dHNUb0RlbGV0ZSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBOb3RpZnkgY29uc3VtZXJzIG9mIHdoaWNoIGNvbnRleHRzIHdlcmUgZGVsZXRlZFxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEZWxldGUoeyBjb250ZXh0czogY29udGV4dHNUb0RlbGV0ZSB9KTtcblxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBwYXJlbnRDb250cm9sLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lQ3JlYXRpb25Sb3dzICYmXG5cdFx0XHRcdFx0aW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlLmxlbmd0aCA+IDBcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVtb3ZlRW1wdHlSb3dzTWVzc2FnZXMoaW5hY3RpdmVDb250ZXh0c1RvRGVsZXRlKTtcblx0XHRcdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyhwYXJlbnRDb250cm9sLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgY29udGV4dHNUb0RlbGV0ZSk7XG5cblx0XHRcdHJldHVybiBhd2FpdCByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFdlIHN0aWxsIHdhbnQgdG8gcmVmcmVzaCB0aGUgbGlzdGJpbmRpbmcgaW4gY2FzZSB3ZSBkZWxldGVkIHNvbWUgaW5mb3JtYXRpb24gYnV0IG5vdCBldmVyeXRoaW5nIChEcmFmdHMgZm9yIGV4YW1wbGUpXG5cdFx0XHRpZiAobGlzdEJpbmRpbmcuaXNSb290KCkpIHtcblx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnJlZnJlc2hMaXN0QmluZGluZyhsaXN0QmluZGluZywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSk7XG5cdFx0XHR9IGVsc2UgaWYgKHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHNPbkRlbGV0ZShsaXN0QmluZGluZywgdmlld0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKiBAcGFyYW0gdXBkYXRlZENvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0gdXBkYXRlUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgdXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IEJpbmRpbmcgfCBDb250ZXh0LCB1cGRhdGVQcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgaXNEcmFmdCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh1cGRhdGVkQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsaW5nS2V5ID0gdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlZ2lzdGVyVG9Ib2xkTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAob3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHVwZGF0ZVByb21pc2U7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHNlbWFudGljS2V5cz8ubGVuZ3RoICYmXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IGZhbHNlICYmIC8vIFdlIGRvbid0IHVzZSB0aGUgc2VtYW50aWMga2V5IGZvciBhIG5ldyBkb2N1bWVudCAoY3JlYXRpb24pXG5cdFx0XHRcdFx0Y3VycmVudEJpbmRpbmdDb250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNQYXRoID0gY3VycmVudFNlbWFudGljTWFwcGluZz8uc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gY3VycmVudFNlbWFudGljUGF0aCBjb3VsZCBiZSBudWxsIGlmIHdlIGhhdmUgbmF2aWdhdGVkIHZpYSBkZWVwIGxpbmsgdGhlbiB0aGVyZSBhcmUgbm8gc2VtYW50aWNNYXBwaW5ncyB0byBjYWxjdWxhdGUgaXQgZnJvbVxuXHRcdFx0XHRcdGlmIChjdXJyZW50U2VtYW50aWNQYXRoICYmIGN1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQsIHsgZWRpdGFibGU6IHRydWUsIHJlY3JlYXRlQ29udGV4dDogZmFsc2UgfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0aWYgKGlzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhcmVudENvbnRleHRGcm9tU2VsZWN0aW9uKHNlbGVjdGVkQ29udGV4dHM6IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQpOiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHNlbGVjdGVkQ29udGV4dHMgJiYgc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBPbmUgcGFyZW50IGF0IG1vc3QgISFcblx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhIG5ldyBkb2N1bWVudCBpbiBhIFRyZWVUYWJsZSB3aXRoICR7c2VsZWN0ZWRDb250ZXh0cy5sZW5ndGh9IHBhcmVudHNgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRDb250ZXh0cz8ubGVuZ3RoID09PSAxID8gc2VsZWN0ZWRDb250ZXh0c1swXSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gc291cmNlICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIG9yIGEgdGFibGUgYnVpbGRpbmcgYmxvY2sgZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzo8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJywgb3IgJ0RlZmVycmVkJyBpcyB1c2VkPGJyLz5cblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIHdpdGhpbiB0aGUgdGFibGUuIE5vdCBzdXBwb3J0ZWQgb24gYSBMaXN0IFJlcG9ydDxici8+XG5cdCAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCc8YnIvPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25EaWFsb2cgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBpbiB0aGUgdGFibGUsIHdpdGggYSBkaWFsb2cgYWxsb3dpbmcgdG8gc3BlY2lmeSBzb21lIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzICh0aGUgcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIGBjcmVhdGlvbkRpYWxvZ0ZpZWxkc2ApXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRhYmxlSWQgSUQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm91dGJvdW5kIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnRXh0ZXJuYWwnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGF0YSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5idXN5TW9kZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMgVGhlIGNvbnRleHRzIHRoYXQgYXJlIHNlbGVjdGVkIGluIHRoZSB0YWJsZSBpbml0aWF0aW5nIHRoZSBjcmVhdGlvbi4gVXNlZCBpbiBjYXNlIG9mIGEgVHJlZVRhYmxlIHRvIGRldGVybWluZSB0aGUgcGFyZW50IGNvbnRleHQgb2YgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgV2hlbiBlbmFibGVkLCBhbiBleHRyYSByZXF1ZXN0IGNoZWNrcyBpZiBhbnkgZHJhZnRzIGV4aXN0IHRoYXQgd2VyZSBuZXZlciBzYXZlZC4gSWYgdW5zYXZlZCBkcmFmdHMgYXJlIGZvdW5kLCB0aGUgbmV3ZXN0IG9uZSBpcyBvcGVuZWQuIElmIG5vIHVuc2F2ZWQgZHJhZnRzIGFyZSBmb3VuZCwgYSBuZXcgZW50aXR5IGlzIGNyZWF0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHMgRGVmaW5lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGUgY3JlYXRpb24gZGlhbG9nIHdoZW4gdGhlIGNyZWF0aW9uIG1vZGUgaXMgc2V0IHRvICdDcmVhdGlvbkRpYWxvZycuPGJyLz5UaGUgdmFsdWUgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHNvdXJjZTogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyB8IE1hY3JvVGFibGUsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdGJGcm9tRGVmZXJyZWQ/OiBib29sZWFuO1xuXHRcdFx0YnVzeU1vZGU/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHRjcmVhdGlvblJvdz86IENyZWF0aW9uUm93O1xuXHRcdFx0ZGF0YT86IG9iamVjdDtcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHNlbGVjdGVkQ29udGV4dHM/OiBPRGF0YVY0Q29udGV4dFtdO1xuXHRcdFx0c2luZ2xlRHJhZnRGb3JDcmVhdGU/OiBib29sZWFuO1xuXHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM/OiBzdHJpbmdbXTtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBvRGF0YUxpc3RCaW5kaW5nITogT0RhdGFMaXN0QmluZGluZztcblx0XHRsZXQgcGFyZW50Q29udGV4dDogT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgZGF0YU1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRsZXQgc2VsZWN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKGRhdGFNb2RlbCAmJiBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChkYXRhTW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRzZWxlY3RlZFByb3BlcnRpZXMgPSBcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhL0RyYWZ0QWRtaW5pc3RyYXRpdmVVc2VyLElzQWN0aXZlRW50aXR5LEhhc0FjdGl2ZUVudGl0eVwiO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZS5pc0EgJiYgc291cmNlLmlzQTxJUm93QmluZGluZ0ludGVyZmFjZT4oXCJzYXAuZmUuY29yZS5JUm93QmluZGluZ0ludGVyZmFjZVwiKSkge1xuXHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHNvdXJjZS5nZXRSb3dCaW5kaW5nKHtcblx0XHRcdFx0JHNlbGVjdDogc2VsZWN0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHQkJGdyb3VwSWQ6IFwiJGF1dG8uV29ya2Vyc1wiXG5cdFx0XHR9KTtcblx0XHRcdHNvdXJjZSA9IG9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0fVxuXG5cdFx0aWYgKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNvbnN0IGxpc3RCaW5kaW5nRnJvbVBhdGggPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5iaW5kTGlzdChzb3VyY2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcblx0XHRcdFx0XHQkc2VsZWN0OiBzZWxlY3RlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0JCRncm91cElkOiBcIiRhdXRvLldvcmtlcnNcIlxuXHRcdFx0XHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoIWxpc3RCaW5kaW5nRnJvbVBhdGgpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nRnJvbVBhdGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVsZXRlIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgc291cmNlLmlzQSAmJiBzb3VyY2UuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZyA9IHNvdXJjZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChvRGF0YUxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRwYXJlbnRDb250ZXh0ID0gdGhpcy5nZXRQYXJlbnRDb250ZXh0RnJvbVNlbGVjdGlvbihtSW5QYXJhbWV0ZXJzLnNlbGVjdGVkQ29udGV4dHMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IHJlc29sdmVkQ3JlYXRpb25Nb2RlID0gdGhpcy5yZXNvbHZlQ3JlYXRpb25Nb2RlKG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLCBvRGF0YUxpc3RCaW5kaW5nLCBtSW5QYXJhbWV0ZXJzLmRhdGEpO1xuXG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKFxuXHRcdFx0KG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGUgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IG1JblBhcmFtZXRlcnMuc2luZ2xlRHJhZnRGb3JDcmVhdGVcblx0XHRcdFx0OiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1hbmlmZXN0KClbXCJzYXAuZmVcIl0/LmFwcD8uc2luZ2xlRHJhZnRGb3JDcmVhdGUpICYmXG5cdFx0XHRvRGF0YUxpc3RCaW5kaW5nID09PSBvRGF0YUxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgJiZcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICE9PSBudWxsXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBuZXdCaW5kaW5nID0gb0RhdGFMaXN0QmluZGluZy5nZXRNb2RlbCgpPy5iaW5kTGlzdChcblx0XHRcdFx0b0RhdGFMaXN0QmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLFxuXHRcdFx0XHRuZXcgU29ydGVyKFwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvTGFzdENoYW5nZURhdGVUaW1lXCIsIHRydWUpLFxuXHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRmaWx0ZXJzOiBbXG5cdFx0XHRcdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0XHRcdFx0cGF0aDogXCJJc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0XHRwYXRoOiBcIkhhc0FjdGl2ZUVudGl0eVwiLFxuXHRcdFx0XHRcdFx0XHRvcGVyYXRvcjogXCJFUVwiLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTE6IGZhbHNlXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0YW5kOiB0cnVlXG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3QmluZGluZz8ucmVxdWVzdENvbnRleHRzKDAsIDEpO1xuXHRcdFx0aWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHJlc3VsdFswXSwgeyBlZGl0YWJsZTogdHJ1ZSwgcmVjcmVhdGVDb250ZXh0OiBmYWxzZSB9KS50aGVuKCgpID0+IG5ld0JpbmRpbmc/LmRlc3Ryb3koKSk7XG5cdFx0XHR9XG5cdFx0XHRuZXdCaW5kaW5nPy5kZXN0cm95KCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5faGFuZGxlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdFx0c291cmNlIGFzIHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRcdHBhcmVudENvbnRleHRcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSxcblx0XHRcdHNvdXJjZSBhcyBzdHJpbmcgfCBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0bUluUGFyYW1ldGVycyxcblx0XHRcdG9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0XHRwYXJlbnRDb250ZXh0XG5cdFx0KTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVDcmVhdGlvbk1vZGUoXG5cdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHR2TGlzdEJpbmRpbmc6IHN0cmluZyB8IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyYW1ldGVyczogSW50ZXJuYWxDcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdG9EYXRhTGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0cGFyZW50Q29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShbXSk7XG5cdFx0c3dpdGNoIChyZXNvbHZlZENyZWF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWw6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUV4dGVybmFsRG9jdW1lbnQodkxpc3RCaW5kaW5nLCBwYXJhbWV0ZXJzLm91dGJvdW5kKTtcblx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEZWZlcnJlZERvY3VtZW50KG9EYXRhTGlzdEJpbmRpbmcsIHBhcmVudENvbnRleHQsIHBhcmFtZXRlcnMuZGF0YSk7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0cmV0dXJuIHBhcmFtZXRlcnMuY3JlYXRpb25Sb3dcblx0XHRcdFx0XHQ/IHRoaXMuY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQoe1xuXHRcdFx0XHRcdFx0XHRjcmVhdGlvblJvdzogcGFyYW1ldGVycy5jcmVhdGlvblJvdyxcblx0XHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmRcblx0XHRcdFx0XHQgIH0pXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZURpYWxvZ0lubGluZURvY3VtZW50KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0c2tpcFNpZGVFZmZlY3RzOiBwYXJhbWV0ZXJzLnNraXBTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGFcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c6XG5cdFx0XHRcdGlmIChvRGF0YUxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdC8vIENyZWF0aW9uIHdpdGggZGlhbG9nIGluIGFuIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25Nb2RlOiBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2csXG5cdFx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDcmVhdGlvbiB3aXRoIGRpYWxvZyBpbiBhIExpc3RSZXBvcnRcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVEaWFsb2dBbmRTYXZlRG9jdW1lbnQoXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhYmxlSWQ6IHBhcmFtZXRlcnMudGFibGVJZCxcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdHNraXBTaWRlRWZmZWN0czogcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRcdHBhcmVudENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdGRhdGE6IHBhcmFtZXRlcnMuZGF0YSxcblx0XHRcdFx0XHRcdFx0Y3JlYXRpb25EaWFsb2dGaWVsZHM6IHBhcmFtZXRlcnMuY3JlYXRpb25EaWFsb2dGaWVsZHNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvRGF0YUxpc3RCaW5kaW5nXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5TeW5jOlxuXHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQXN5bmM6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZVN5bmNBc3luY0RvY3VtZW50KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogcmVzb2x2ZWRDcmVhdGlvbk1vZGUsXG5cdFx0XHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdFx0XHRiRnJvbURlZmVycmVkOiBwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQsXG5cdFx0XHRcdFx0XHRza2lwU2lkZUVmZmVjdHM6IHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y3JlYXRlQWN0aW9uOiBwYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRcdHBhcmVudENvbnRleHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9EYXRhTGlzdEJpbmRpbmdcblx0XHRcdFx0KTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSAke3Jlc29sdmVkQ3JlYXRpb25Nb2RlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKkV4ZWN1dGVzIHRoZSBtYW5kYXRvcnkgY29uZmlndXJhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZC5cblx0ICogQHBhcmFtIHByZXJlcXVpc2l0ZSBQcm9taXNlIG9mIHRoZSBkb2N1bWVudCBjcmVhdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBuYXZpZ2F0aW9uXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY29uZmlndXJhdGlvbiBpcyBkb25lXG5cdCAqL1xuXHRhc3luYyBwb3N0RG9jdW1lbnRDcmVhdGlvbihwcmVyZXF1aXNpdGU6IFByb21pc2U8W0NvbnRleHQsIHVua25vd25dPiwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IG1vZGVsID0gbGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBwYXJhbXMgPSBhd2FpdCBwcmVyZXF1aXNpdGU7XG5cdFx0Y29uc3QgbmV3RG9jdW1lbnRDb250ZXh0ID0gcGFyYW1zWzBdO1xuXHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyQ3JlYXRlKHsgY29udGV4dDogbmV3RG9jdW1lbnRDb250ZXh0IH0pO1xuXHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpOyAvLyBUaGUgY3JlYXRlTW9kZSBmbGFnIHdpbGwgYmUgc2V0IGluIGNvbXB1dGVNb2RlbHNGb3JFZGl0TW9kZVxuXHRcdGlmICghbGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0Ly8gV29ya2Fyb3VuZCB0byB0ZWxsIHRoZSBPUCB0aGF0IHdlJ3ZlIGNyZWF0ZWQgYSBuZXcgb2JqZWN0IGZyb20gdGhlIExSXG5cdFx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQobGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRcdGNvbnN0IG5ld0FjdGlvbiA9IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBuZXdBY3Rpb24pO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0dGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmlzTGlzdEJpbmRpbmdIaWVyYXJjaGljYWwobGlzdEJpbmRpbmcpIHx8XG5cdFx0XHRcdHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nQW5hbHl0aWNhbChsaXN0QmluZGluZylcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBpdGVtIGluIGEgaGllcmFyY2h5L2FuYWx5dGljYWwgdGFibGUgZnJvbSB0aGUgTGlzdFJlcG9ydCAoc2luY2UgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSlcblx0XHRcdFx0Ly8gLS0+IHdlIHdhbnQgdG8gZm9yY2UgdGhlIHVzZXIgdG8gZWl0aGVyIHNhdmUgb3IgZGlzY2FyZCB0aGUgZHJhZnQgYmVmb3JlIGxlYXZpbmcgdGhlIE9QXG5cdFx0XHRcdHRoaXMuZm9yY2VEcmFmdFNhdmVPckRpc2NhcmQodHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChuZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nKTtcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChuZXdEb2N1bWVudENvbnRleHQpICYmXG5cdFx0XHRcdCF0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBUaGUgaW5pdGlhbCBzaGFyZSBhY3Rpb24gc2hhbGwgYmUgY2FsbGVkXG5cdFx0XHRcdHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuc2V0SW5pdGlhbFNoYXJlKHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHZpYSB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uUm93IFRoZSBjcmVhdGlvbiByb3dcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlQ3JlYXRlUm93RG9jdW1lbnQocGFyYW1ldGVyczoge1xuXHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHRjcmVhdGlvblJvdzogQ3JlYXRpb25Sb3c7XG5cdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0fSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBjcmVhdGlvbjogUHJvbWlzZTxDb250ZXh0Pjtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gcGFyYW1ldGVycy5jcmVhdGlvblJvdztcblx0XHRjb25zdCB0YWJsZSA9IHBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCkgYXMgVGFibGUgfCB1bmRlZmluZWQ7XG5cdFx0bGV0IG5hdmlnYXRpb24gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRpZiAoIXRhYmxlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFibGUuZ2V0TW9kZWwoKT8uZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0aWYgKHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5pc0xpc3RCaW5kaW5nSGllcmFyY2hpY2FsKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiQ3JlYXRpb25Sb3dcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0fVxuXHRcdGNvbnN0IGNyZWF0aW9uUm93Q29udGV4dCA9IGNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRjb25zdCBkb2N1bWVudFZhbGlkYXRpb24gPSB0aGlzLmdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlKTtcblx0XHQvLyBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIGlzIHNldCB0byBmYWxzZSBpbiBtYW5pZmVzdCBjb252ZXJ0ZXIgKFRhYmxlLnRzKSBpZiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gZXhpc3RzXG5cdFx0aWYgKGNyZWF0aW9uUm93LmRhdGEoXCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhXCIpID09PSBcInRydWVcIikge1xuXHRcdFx0dGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKT8uc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlcyA9IGF3YWl0IHRoaXMuc3luY1Rhc2soZG9jdW1lbnRWYWxpZGF0aW9uKTtcblx0XHRpZiAodmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKHZhbGlkYXRpb25NZXNzYWdlcywgdGFibGUpO1xuXHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0Ly8gaWYgY3VzdG9tIHZhbGlkYXRpb24gZmFpbHMsIHdlIGxlYXZlIHRoZSBtZXRob2QgaW1tZWRpYXRlbHlcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZW50aXR5VHlwZSA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSkpLnRhcmdldEVudGl0eVR5cGU7XG5cdFx0Y29uc3QgY3JlYXRpb25Sb3dQYXlsb2FkID0gY3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXG5cdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHQvL21vdmVkIGFmdGVyIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMgdG8gYXZvaWQgXCInY3JlYXRpb24nIHVzZSBiZWZvcmUgaW5pdGlhbGl6YXRpb25cIiBjb25zb2xlIGVycm9yc1xuXHRcdC8vYWZ0ZXIgdmFsaWRhdGlvbiBlcnJvcnMgb2NjdXJyZWRcblx0XHRsaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xuXHRcdFx0YXdhaXQgY3JlYXRpb247XG5cdFx0XHR0YWJsZS5zY3JvbGxUb0luZGV4KHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPyB0YWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwKTtcblx0XHR9KTtcblxuXHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKGxpc3RCaW5kaW5nKTtcblx0XHR0cnkge1xuXHRcdFx0Y3JlYXRpb24gPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZGF0YTogT2JqZWN0LmFzc2lnbihcblx0XHRcdFx0XHRcdHt9LFxuXHRcdFx0XHRcdFx0Li4uT2JqZWN0LmtleXMoY3JlYXRpb25Sb3dQYXlsb2FkKVxuXHRcdFx0XHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdFx0XHRcdChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT5cblx0XHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZmluZEluZGV4KChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSA9PT0gcHJvcGVydHlQYXRoKSA9PT0gLTFcblx0XHRcdFx0XHRcdFx0KSAvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0XHQubWFwKChwYXRoKSA9PiAoeyBbcGF0aF06IGNyZWF0aW9uUm93UGF5bG9hZFtwYXRoXSB9KSlcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IGFwcENvbXBvbmVudC5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlLCAvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFwcENvbXBvbmVudCxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdFx0Ly8gU2lkZUVmZmVjdHMgb24gQ3JlYXRlXG5cdFx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRcdGlmICghcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVTaWRlRWZmZWN0cyhsaXN0QmluZGluZywgY3JlYXRpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBjcmVhdGlvbjtcblx0XHRcdGNvbnN0IGNyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBjcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBuZXdUcmFuc2llbnRDb250ZXh0ID0gY3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdGNyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG5ld1RyYW5zaWVudENvbnRleHQpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9ycyBUTyBiZSBjaGVja2VkIHdpdGggbW9kZWwgY29sbGVhZ3Vlc1xuXHRcdFx0bmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCk/LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHRuYXZpZ2F0aW9uID0gY3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5wb3N0RG9jdW1lbnRDcmVhdGlvbihQcm9taXNlLmFsbChbY3JlYXRpb24sIG5hdmlnYXRpb25dKSwgbGlzdEJpbmRpbmcpO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpKTtcblx0XHRcdH1cblx0XHRcdExvZy5lcnJvcihcIkNyZWF0aW9uUm93IG5hdmlnYXRpb24gZXJyb3I6IFwiLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGluIElubGluZSBtb2RlIG9yIHdpdGggYSBjcmVhdGlvbiBpbmxpbmUgZGlhbG9nIChPYmplY3QgcGFnZSBjYXNlKS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbk1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgVGhlIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkIGF0IHRoZSBlbmRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzIFRoZSBzaWRlRWZmZWN0cyBhcmUgcmVxdWVzdGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRhYmxlSWQgVGhlIGlkIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0IFBhcmVudCBjb250ZXh0IChmb3IgVHJlZVRhYmxlKVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhIEludGlhbCBkYXRhIGZvciBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkcyBGaWVsZHMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjcmVhdGlvbiBkaWFsb2dcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVEaWFsb2dJbmxpbmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUgfCBDcmVhdGlvbk1vZGUuQ3JlYXRpb25EaWFsb2c7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHR0YWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHR9XG5cdFx0aWYgKHRhYmxlPy5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0dGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNyZWF0ZUNvbXBsZXRlZFwiLCBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG5ld0NvbnRleHQgPSBhd2FpdCBjcmVhdGlvbjtcblx0XHRcdFx0Y29uc3QgY29udGV4dEluZGV4ID0gbmV3Q29udGV4dC5nZXRJbmRleCgpO1xuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRhdGEgPSBsaXN0QmluZGluZy5nZXRBZ2dyZWdhdGlvbigpIGFzIHsgY3JlYXRlSW5QbGFjZT86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0Y29uc3QgaXNDcmVhdGVJblBsYWNlID0gYWdncmVnYXRpb25EYXRhPy5jcmVhdGVJblBsYWNlID8/IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChjb250ZXh0SW5kZXggIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0SW5kZXggPj0gMCkge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aWYgKCF0YWJsZT8uZ2V0QnVzeSgpKSB7XG5cdFx0XHRcdFx0XHRcdHRhYmxlPy5mb2N1c1Jvdyhjb250ZXh0SW5kZXgsIHRydWUpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzQ3JlYXRlSW5QbGFjZSkge1xuXHRcdFx0XHRcdC8vIEZvciBjcmVhdGUgaW4tcGxhY2UgbW9kZSAoc2VydmVyIHBvc2l0aW9uKSwgZGlzcGxheSBhIHdhcm5pbmcgbWVzc2FnZSBpbiBjYXNlIHRoZSBuZXdseSBjcmVhdGVkIG5vZGUgaXNuJ3QgdmlzaWJsZVxuXHRcdFx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KHRoaXMuX2dldFJlc291cmNlTW9kZWwoKS5nZXRUZXh0KFwiQ19ORVdfRUxFTUVOVF9OT1RfRElTUExBWUVEXCIpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykgJiYgIWlzQ3JlYXRlSW5QbGFjZSkge1xuXHRcdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSB0cmVlIHRhYmxlLCB3ZSBhbHNvIHNjcm9sbCB0byBrZWVwIHRoZSBwYXJlbnQgdmlzaWJsZVxuXHRcdFx0XHRcdGNvbnN0IHBhcmVudENvbnRleHQgPSBuZXdDb250ZXh0LmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50Q29udGV4dD8uZ2V0SW5kZXgoKTtcblx0XHRcdFx0XHRpZiAocGFyZW50SW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYXJlbnRJbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0XHR0YWJsZT8uc2Nyb2xsVG9JbmRleChwYXJlbnRJbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFibGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMobGlzdEJpbmRpbmcpO1xuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHR7XG5cdFx0XHRcdC8vQ2hlY2sgaWYgQWxsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZFxuXHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkOiBmYWxzZSwgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0YnVzeU1vZGU6IFwiTG9jYWxcIiwgLy8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRidXN5SWQ6ICh0YWJsZT8uZ2V0UGFyZW50KCkgYXMgVGFibGVBUEkgfCB1bmRlZmluZWQpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZCxcblx0XHRcdFx0cGFyZW50Q29udHJvbDogdGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZSwgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IHBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogcGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHBhcmVudENvbnRleHQ6IHBhcmFtZXRlcnMucGFyZW50Q29udGV4dCxcblx0XHRcdFx0ZGF0YTogcGFyYW1ldGVycy5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkczogcGFyYW1ldGVycy5jcmVhdGlvbkRpYWxvZ0ZpZWxkc1xuXHRcdFx0fSxcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRmYWxzZVxuXHRcdCk7XG5cblx0XHRpZiAoIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKSwgbGlzdEJpbmRpbmcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgdmlhIGEgZGlhbG9nIGFuZCBzYXZlcyBpdCBpbW1lZGlhdGVseSAoTGlzdFJlcG9ydCBjYXNlKS5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBdEVuZCBUaGUgbmV3IGRvY3VtZW50IGlzIGNyZWF0ZWQgYXQgdGhlIGVuZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMudGFibGVJZCBUaGUgaWQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQgUGFyZW50IGNvbnRleHQgKGZvciBUcmVlVGFibGUpXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRhdGEgSW50aWFsIGRhdGEgZm9yIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzIEZpZWxkcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNyZWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZURpYWxvZ0FuZFNhdmVEb2N1bWVudChcblx0XHRwYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0XHRza2lwU2lkZUVmZmVjdHM/OiBib29sZWFuO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHRcdGRhdGE/OiBvYmplY3Q7XG5cdFx0XHRjcmVhdGlvbkRpYWxvZ0ZpZWxkcz86IHN0cmluZ1tdO1xuXHRcdH0sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmdcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRpZiAocGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHR0YWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZSB8IHVuZGVmaW5lZDtcblx0XHRcdGlmICh0YWJsZT8uaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikgIT09IHRydWUpIHtcblx0XHRcdFx0dGFibGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNhdmVkRG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblxuXHRcdGNvbnN0IGFmdGVyQ3JlYXRlSW5EaWFsb2cgPSBhc3luYyAobmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJDcmVhdGUoeyBjb250ZXh0OiBuZXdEb2N1bWVudENvbnRleHQgfSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBFcnJvcnMgaW4gb25BZnRlckNyZWF0ZSBhcmUgbm90IGNhdXNpbmcgdGhlIG92ZXJhbGwgZmxvdyB0byBmYWlsXG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIGFmdGVyIGNyZWF0aW9uOiBcIiArIGVycm9yKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG5ld0RvY3VtZW50Q29udGV4dCB9KTtcblx0XHRcdHNhdmVkRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnNhdmVEb2N1bWVudChcblx0XHRcdFx0bmV3RG9jdW1lbnRDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRbXSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0XHR0cnVlXG5cdFx0XHQpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlclNhdmUoe1xuXHRcdFx0XHRcdGNvbnRleHQ6IHNhdmVkRG9jdW1lbnRDb250ZXh0XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gRXJyb3JzIGluIG9uQWZ0ZXJTYXZlIGFyZSBub3QgY2F1c2luZyB0aGUgb3ZlcmFsbCBmbG93IHRvIGZhaWxcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3IgYWZ0ZXIgc2F2ZTogXCIgKyBlcnJvcik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSBvZiBhIFRyZWVUYWJsZSwgd2UgZG9uJ3QgdXNlIHRoZSBsaXN0QmluZGluZyBmcm9tIHRoZSBMaXN0UmVwb3J0IHRvIGNyZWF0ZSB0aGUgbmV3IGl0ZW0sXG5cdFx0XHRcdC8vIFNvIHdlIGNhbid0IGtub3cgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgaXRlbSBpbiB0aGUgbGlzdEJpbmRpbmdcblx0XHRcdFx0Ly8gLS0+IFdlIHJlZnJlc2ggdGhlIHRhYmxlIGFuZCBzY3JvbGwgdG8gdGhlIHBhcmVudCBwb3NpdGlvblxuXHRcdFx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlPy5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSSB8IHVuZGVmaW5lZDtcblx0XHRcdFx0aWYgKHRhYmxlQVBJKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50SW5kZXggPSBwYXJhbWV0ZXJzLnBhcmVudENvbnRleHQ/LmdldEluZGV4KCk7XG5cdFx0XHRcdFx0dGFibGVBUEkucmVmcmVzaCgpO1xuXHRcdFx0XHRcdGlmIChwYXJlbnRJbmRleCAhPT0gdW5kZWZpbmVkICYmIHBhcmVudEluZGV4ID49IDApIHtcblx0XHRcdFx0XHRcdHRhYmxlPy5zY3JvbGxUb0luZGV4KHBhcmVudEluZGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluIGNhc2Ugb2YgYSBmbGF0IHRhYmxlLCB3ZSBjYW4gc2Nyb2xsIHRvIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW1cblx0XHRcdFx0Y29uc3QgaXRlbUluZGV4ID0gc2F2ZWREb2N1bWVudENvbnRleHQuZ2V0SW5kZXgoKTtcblx0XHRcdFx0aWYgKGl0ZW1JbmRleCAhPT0gdW5kZWZpbmVkICYmIGl0ZW1JbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0dGFibGU/LnNjcm9sbFRvSW5kZXgoaXRlbUluZGV4KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBjcmVhdGlvbiA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5jcmVhdGVEb2N1bWVudChcblx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0e1xuXHRcdFx0XHQvL0NoZWNrIGlmIEFsbCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWRcblx0XHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGJ1c3lNb2RlOiBcIkxvY2FsXCIsIC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0YnVzeUlkOiAodGFibGU/LmdldFBhcmVudCgpIGFzIFRhYmxlQVBJIHwgdW5kZWZpbmVkKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQsXG5cdFx0XHRcdHBhcmVudENvbnRyb2w6IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlQ3JlYXRlLFxuXHRcdFx0XHRhZnRlckNyZWF0ZUNhbGxCYWNrOiBhZnRlckNyZWF0ZUluRGlhbG9nLFxuXHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUsIC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBwYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5DcmVhdGlvbkRpYWxvZyxcblx0XHRcdFx0cGFyZW50Q29udGV4dDogcGFyYW1ldGVycy5wYXJlbnRDb250ZXh0LFxuXHRcdFx0XHRkYXRhOiBwYXJhbWV0ZXJzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHRcdGNyZWF0aW9uRGlhbG9nRmllbGRzOiBwYXJhbWV0ZXJzLmNyZWF0aW9uRGlhbG9nRmllbGRzXG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdGZhbHNlXG5cdFx0KTtcblxuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtjcmVhdGlvbiwgdGhpcy5zeW5jVGFzayhjcmVhdGlvbildKTtcblx0XHRpZiAoc2F2ZWREb2N1bWVudENvbnRleHQgJiYgcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgIT09IHRydWUpIHtcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBzYXZlZERvY3VtZW50Q29udGV4dCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkZWZmZXJlZCBkb2N1bWVudC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgd2hlcmUgdGhlIGRvY3VtZW50IGhhcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IE9wdGlvbmFsIHBhcmVudCBjb250ZXh0IHdoZW4gY3JlYXRpbmcgYSBub2RlIGluIFRyZWVUYWJsZVxuXHQgKiBAcGFyYW0gZGF0YVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRGVmZXJyZWREb2N1bWVudChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcGFyZW50Q29udGV4dD86IE9EYXRhVjRDb250ZXh0LCBkYXRhPzogb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChsaXN0QmluZGluZywge1xuXHRcdFx0Y3JlYXRlT25OYXZpZ2F0ZVBhcmFtZXRlcnM6IHsgbW9kZTogXCJEZWZlcnJlZFwiLCBwYXJlbnRDb250ZXh0LCBsaXN0QmluZGluZywgZGF0YSB9LFxuXHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0fSk7XG5cdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHN5bmMgb3IgYXN5bmMgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBzeW5jIG9yIGFzeW5jIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZyb21EZWZlcnJlZCBUaGlzIGRvY3VtZW50IGlzIGNyZWF0ZWQgYWZ0ZXIgYSBkZWZmZXJlZCBjcmVhdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5jcmVhdGVBY3Rpb24gIFRoZSBjcmVhdGUgaGFzIGJlZW4gdHJpZ2dlcmVkIGJ5IGEgY3JlYXRlIGFjdGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kYXRhICBEYXRhIHRvIHNhdmUgb24gdGhlIG5ldyBkb2N1bWVudFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5za2lwU2lkZUVmZmVjdHMgVGhlIHNpZGVFZmZlY3RzIGFyZSByZXF1ZXN0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMucGFyZW50Q29udGV4dFxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdGFzeW5jIGNyZWF0ZVN5bmNBc3luY0RvY3VtZW50KFxuXHRcdHBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0YkZyb21EZWZlcnJlZD86IGJvb2xlYW47XG5cdFx0XHRjcmVhdGVBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0ZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0c2tpcFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdHBhcmVudENvbnRleHQ/OiBPRGF0YVY0Q29udGV4dDtcblx0XHR9LFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBuYXZpZ2F0aW9uOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCByb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldEludGVybmFsUm91dGluZygpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdGNvbnN0IGNyZWF0aW9uID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpXG5cdFx0XHQuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHQuLi57XG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVDcmVhdGUsXG5cdFx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGUgLy8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkgJiYgbmV3RG9jdW1lbnRDb250ZXh0ICYmIG5ld0RvY3VtZW50Q29udGV4dC5nZXRCaW5kaW5nKCkgIT09IGxpc3RCaW5kaW5nKSB7XG5cdFx0XHRcdFx0Ly8gSW4gRkNMIGNhc2UsIGlmIHRoZSBuZXcgY29udGV4dCBoYXMgYmVlbiBjcmVhdGVkIHdpdGggYW4gYWN0aW9uIChub3Qgd2l0aCB0aGUgc3RhbmRhcmQgUE9TVCBjcmVhdGUpLCB3ZSBuZWVkIHRvIHJlZnJlc2hcblx0XHRcdFx0XHQvLyB0aGUgb3JpZ2luYWwgbGlzdEJpbmRpbmcgc28gdGhhdCBpdCBjb250YWlucyB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QgKHRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBsaXN0QmluZGluZyBmb3Igc3RhbmRhcmQgY3JlYXRlKVxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBuZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHR9KTtcblxuXHRcdC8vIERvbid0IGRvIHRoaXMgaWYgdGhlIGludm9jYXRpb24gY29tZXMgZnJvbSBhIGRlZmVycmVkIGNyZWF0aW9uIG9yIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvd1xuXHRcdGlmIChwYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWQgIT09IHRydWUgJiYgIXBhcmFtZXRlcnMuc2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHR0aGlzLmhhbmRsZVNpZGVFZmZlY3RzKGxpc3RCaW5kaW5nLCBjcmVhdGlvbik7XG5cdFx0fVxuXG5cdFx0aWYgKHBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmMpIHtcblx0XHRcdG5hdmlnYXRpb24gPSByb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KGxpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdGNyZWF0ZU9uTmF2aWdhdGVQYXJhbWV0ZXJzOiB7IG1vZGU6IFwiQXN5bmNcIiwgY3JlYXRlQ29udGV4dFByb21pc2U6IGNyZWF0aW9uIH0sXG5cdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2aWdhdGlvbiA9IGNyZWF0aW9uLnRoZW4oYXN5bmMgKG5ld0RvY3VtZW50Q29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAoIW5ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IExpYnJhcnkuZ2V0UmVzb3VyY2VCdW5kbGVGb3IoXCJzYXAuZmUuY29yZVwiKSE7XG5cdFx0XHRcdFx0cmV0dXJuIHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLCB7XG5cdFx0XHRcdFx0XHR0aXRsZTogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUlwiKSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfRURJVEZMT1dfU0FQRkVfQ1JFQVRJT05fRkFJTEVEX0RFU0NSSVBUSU9OXCIpXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgU3luYyBjcmVhdGlvbiB3YXMgdHJpZ2dlcmVkIGZvciBhIGRlZmVycmVkIGNyZWF0aW9uLCB3ZSBkb24ndCBuYXZpZ2F0ZSBmb3J3YXJkXG5cdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0Y29uc3QgbmF2UGFyYW1ldGVyczogUm91dGluZ05hdmlnYXRpb25QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRmb3JjZUZvY3VzOiB0cnVlLFxuXHRcdFx0XHRcdFx0dHJhbnNpZW50OlxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpID09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IHBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gcGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHQ/IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvQ29udGV4dChuZXdEb2N1bWVudENvbnRleHQsIG5hdlBhcmFtZXRlcnMpXG5cdFx0XHRcdFx0XHQ6IHJvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQobmV3RG9jdW1lbnRDb250ZXh0LCBuYXZQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnBvc3REb2N1bWVudENyZWF0aW9uKFByb21pc2UuYWxsKFtjcmVhdGlvbiwgbmF2aWdhdGlvbl0pLCBsaXN0QmluZGluZyk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdC8vIGNyZWF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB1c2VyIG9yIGZhaWxlZCBpbiBiYWNrZW5kID0+IGluIGNhc2Ugd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdHJhbnNpZW50IGNvbnRleHQgYmVmb3JlLCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHQvLyB0aGUgc3dpdGNoLXN0YXRlbWVudCBhYm92ZSBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaGFwcGVucyBpbiBjcmVhdGlvbk1vZGVzIGRlZmVycmVkIGFuZCBhc3luYy4gQnV0IGluIGZhY3QsIGluIHRoZXNlIGNhc2VzIGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGZyb20gcm91dGVNYXRjaGVkIGluIE9QIGNvbXBvbmVudFxuXHRcdFx0Ly8gY3JlYXRlRGVmZXJyZWREb2N1bWVudCBpcyB0cmlnZ2VyZWQsIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIChjcmVhdGVEb2N1bWVudCkgYWdhaW4gLSB0aGlzIHRpbWUgd2l0aCBjcmVhdGlvbk1vZGUgc3luYy4gVGhlcmVmb3JlLCBhbHNvIGluIHRoYXQgbW9kZSB3ZSBuZWVkIHRvIHRyaWdnZXIgYmFjayBuYXZpZ2F0aW9uLlxuXHRcdFx0Ly8gVGhlIG90aGVyIGNhc2VzIG1pZ2h0IHN0aWxsIGJlIG5lZWRlZCBpbiBjYXNlIHRoZSBuYXZpZ2F0aW9uIGZhaWxzLlxuXHRcdFx0aWYgKFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Q29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyxcblx0XHRcdFx0XHRDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkLFxuXHRcdFx0XHRcdENvbnN0YW50cy5DcmVhdGlvbkZhaWxlZCxcblx0XHRcdFx0XHRDb25zdGFudHMuT25CZWZvcmVDcmVhdGVGYWlsZWRcblx0XHRcdFx0XS5pbmNsdWRlcyhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gZXh0ZXJuYWwgZG9jdW1lbnQuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBPRGF0YUxpc3RCaW5kaW5nIHdoZXJlIHRoZSBkb2N1bWVudCBoYXMgdG8gYmUgY3JlYXRlZFxuXHQgKiBAcGFyYW0gb3V0Ym91bmQgVGhlIG91dGJvdW5kIGFjdGlvblxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVFeHRlcm5hbERvY3VtZW50KGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLCBvdXRib3VuZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdGlmIChvdXRib3VuZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBsaXN0QmluZGluZyAhPT0gXCJzdHJpbmdcIiAmJiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuaXNMaXN0QmluZGluZ0hpZXJhcmNoaWNhbChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgY3JlYXRpb25Nb2RlIFwiRXh0ZXJuYWxcIiB3aXRoIGEgVHJlZVRhYmxlYCk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRjb25zdCBjcmVhdGVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHRoaXMuYmFzZS5nZXRWaWV3KCksIGxpc3RCaW5kaW5nKTtcblx0XHRcdGNvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQoY29udHJvbGxlciwgb3V0Ym91bmQsIHVuZGVmaW5lZCwgY3JlYXRlUGF0aCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRvY3VtZW50IGNyZWF0aW9uLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgT0RhdGFMaXN0QmluZGluZyB3aGVyZSB0aGUgZG9jdW1lbnQgaGFzIHRvIGJlIGNyZWF0ZWRcblx0ICogQHBhcmFtIGNyZWF0aW9uUHJvbWlzZSBUaGUgcHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgU2lkZUVmZmVjdHMgaGFzIGJlZW4gdHJpZ2dlcmVkXG5cdCAqL1xuXHRoYW5kbGVTaWRlRWZmZWN0cyA9IGFzeW5jIChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgY3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRjb25zdCBuZXdDb250ZXh0ID0gYXdhaXQgY3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRhd2FpdCBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpICYmIHZpZXdCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGUgY3JlYXRpb25Sb3cuXG5cdCAqIEBwYXJhbSB2YWxpZGF0aW9uTWVzc2FnZXMgVGhlIGVycm9yIG1lc3NhZ2VzIGZvcm0gdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0YWJsZSBUaGUgdGFibGUgdGFyZ2V0ZWQgYnkgdGhlIG1lc3NhZ2VzXG5cdCAqL1xuXHRjcmVhdGVDdXN0b21WYWxpZGF0aW9uTWVzc2FnZXMgPSAodmFsaWRhdGlvbk1lc3NhZ2VzOiB7IG1lc3NhZ2VUYXJnZXQ/OiBzdHJpbmc7IG1lc3NhZ2VUZXh0OiBzdHJpbmcgfVtdLCB0YWJsZTogVGFibGUpOiB2b2lkID0+IHtcblx0XHRjb25zdCBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gPSB0YWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0Y29uc3QgY3VzdG9tVmFsaWRpdHkgPSB0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0Y29uc3QgY3VzdG9tTWVzc2FnZXM6IEN1c3RvbU1lc3NhZ2VbXSA9IFtdO1xuXHRcdGxldCBmaWVsZENvbnRyb2w7XG5cdFx0bGV0IGZpbmFsVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHQvLyBSZW1vdmUgZXhpc3RpbmcgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0Y29uc3Qgb2xkTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IG1lc3NhZ2UuZ2V0Q29kZSgpID09PSBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pO1xuXHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhvbGRNZXNzYWdlcyk7XG5cblx0XHR2YWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgodmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcblx0XHRcdC8vIEhhbmRsZSBCb3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdGlmICh2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0KSB7XG5cdFx0XHRcdGZpZWxkQ29udHJvbCA9IEVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoY3VzdG9tVmFsaWRpdHlbdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0ZmluYWxUYXJnZXQgPSBgJHtmaWVsZENvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpfS8ke2ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdC8vIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgc3RpbGwgbm90IGV4aXN0c1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IU1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSkubGVuZ3RoXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdE1lc3NhZ2luZy5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZTogdmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRleHQsXG5cdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0dGVjaG5pY2FsOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdHRhcmdldDogZmluYWxUYXJnZXRcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXJcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZTogTWVzc2FnZSkgPT4gbWVzc2FnZS5nZXRUYXJnZXRzKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgPT09IGZpbmFsVGFyZ2V0KSk7XG5cdFx0XHRcdGV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChjdXN0b21WYWxpZGl0eVt2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdGNvZGU6IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHR0ZXh0OiB2YWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRwZXJzaXN0ZW50OiB0cnVlLFxuXHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGN1c3RvbU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGN1c3RvbU1lc3NhZ2VzXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc29sdmVzIHRoZSBjcmVhdGlvbiBtb2RlXG5cdCAqIFByb3ZpZGVzIHRoZSBleHBlY3RlZCBjcmVhdGlvbiBtb2RlOlxuXHQgKiAtIHByZXNlcnZlcyB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGUgd2hlbiB0aGlzIG9uZSBpcyBub3QgYSBOZXdQYWdlXG5cdCAqIC0gY2FsY3VsYXRlcyB0aGUgbmV3IG9uZSBpZiB0aGUgY3JlYXRpb24gbW9kZSBpcyBhIE5ld1BhZ2UuXG5cdCAqIEBwYXJhbSBpbml0aWFsQ3JlYXRpb25Nb2RlIFRoZSBpbml0aWFsIGNyZWF0aW9uIG1vZGVcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGNyZWF0ZURhdGEgVGhlIGluaXRpYWwgZGF0YSBmb3Igb2JqZWN0IGNyZWF0aW9uXG5cdCAqIEByZXR1cm5zIFRoZSBuZXcgY3JlYXRpb24gbW9kZVxuXHQgKi9cblx0cmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChpbml0aWFsQ3JlYXRpb25Nb2RlOiBzdHJpbmcsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhOiBvYmplY3QgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuXHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuTmV3UGFnZSkge1xuXHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGxpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwobGlzdEJpbmRpbmcpO1xuXHRcdFx0Ly8gTmV3QWN0aW9uIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBOYXZpZ2F0aW9uUHJvcGVydHkgY29sbGVjdGlvblxuXHRcdFx0aWYgKCFsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChsaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZGF0YU1vZGVsTGlzdEJpbmRpbmdQYXRoLnRhcmdldEVudGl0eVNldCBhcyBFbnRpdHlTZXQgfCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRuZXdBY3Rpb24gPSAoXG5cdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdD8gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5Db21tb24/LkRyYWZ0Um9vdFxuXHRcdFx0XHRcdFx0XHQ6IGVudGl0eVNldD8uYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdFx0XHRcdCk/Lk5ld0FjdGlvbj8udG9TdHJpbmcoKTtcblxuXHRcdFx0XHRpZiAobmV3QWN0aW9uICYmIGRhdGFNb2RlbExpc3RCaW5kaW5nUGF0aC50YXJnZXRFbnRpdHlUeXBlLmFjdGlvbnNbbmV3QWN0aW9uXS5wYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkRlZmVycmVkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjcmVhdGlvblBhcmFtZXRlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGxpc3RCaW5kaW5nLCBjcmVhdGVEYXRhLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdGlmIChjcmVhdGlvblBhcmFtZXRlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdGFzeW5jIHZhbGlkYXRlRG9jdW1lbnQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRwYXJhbWV0ZXJzOiB7IGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbj86IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuXHQpOiBQcm9taXNlPHsgbWVzc2FnZVRhcmdldD86IHN0cmluZzsgbWVzc2FnZVRleHQ6IHN0cmluZyB9W10+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgcmVzdWx0IG9mXG5cdCAqIGEgY3JlYXRpb24gcm93J3MgY3VzdG9tIHZhbGlkYXRpb24gYXMgYSBwcm9taXNlLiBJZiBubyBjcmVhdGlvbiByb3cgaXMgaW52b2x2ZWRcblx0ICogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiByZXR1cm5zIGEgcmVzb2x2ZWQgcHJvbWlzZS5cblx0ICogQHBhcmFtIHRhYmxlIFRoZSB0YWJsZSB3aXRoIHRoZSBjcmVhdGlvblJvd1xuXHQgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2Vcblx0ICovXG5cdGdldENyZWF0aW9uUm93VmFsaWRhdGlvbkZ1bmN0aW9uKHRhYmxlOiBUYWJsZSB8IHVuZGVmaW5lZCk6ICgpID0+IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4ge1xuXHRcdGNvbnN0IGNyZWF0aW9uUm93ID0gdGFibGU/LmdldENyZWF0aW9uUm93KCk7XG5cdFx0aWYgKGNyZWF0aW9uUm93ICYmIHRhYmxlKSB7XG5cdFx0XHRyZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8eyBtZXNzYWdlVGFyZ2V0Pzogc3RyaW5nOyBtZXNzYWdlVGV4dDogc3RyaW5nIH1bXT4gPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGlvblJvd09iamVjdHMgPSAoY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KS5nZXRPYmplY3QoKTtcblx0XHRcdFx0ZGVsZXRlIGNyZWF0aW9uUm93T2JqZWN0c1tcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRcdHJldHVybiB0aGlzLnZhbGlkYXRlRG9jdW1lbnQodGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0LCB7XG5cdFx0XHRcdFx0ZGF0YTogY3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogdGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIGFzeW5jICgpID0+IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBkYXRhRm9yQ3JlYXRlIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBuZXcgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBjcmVhdGVBdEVuZCBUcnVlIGlmIHRoZSBuZXcgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGFzIGluYWN0aXZlXG5cdCAqIEBwYXJhbSByZXF1ZXN0U2lkZUVmZmVjdHMgVHJ1ZSBieSBkZWZhdWx0LCBmYWxzZSBpZiBTaWRlRWZmZWN0cyBzaG91bGQgbm90IGJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0cy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGRhdGFGb3JDcmVhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlLFxuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW5cblx0KTogUHJvbWlzZTxDb250ZXh0W10+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZztcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHMgPSByZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YXJnZXRMaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0bGV0IG1ldGFQYXRoOiBzdHJpbmc7XG5cblx0XHRcdGlmICh0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHt0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyh0YXJnZXRMaXN0QmluZGluZyk7XG5cblx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRjb25zdCBjcmVhdGlvblByb21pc2VzID0gZGF0YUZvckNyZWF0ZS5tYXAoYXN5bmMgKHByb3BlcnR5VmFsdWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnM6IENyZWF0ZVBhcmFtZXRlcnMgPSB7IGRhdGE6IHt9LCBwYXJlbnRDb250cm9sOiB0aGlzLmdldFZpZXcoKSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBkZWVwIGNyZWF0ZVxuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHttZXRhUGF0aH0vJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0cHJvcGVydHkgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdFx0XHQhcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5kYXRhIVtwcm9wZXJ0eVBhdGhdID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdHRhcmdldExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dHMgPSBjcmVhdGVkQ29udGV4dHMuZmlsdGVyKChuZXdDb250ZXh0KSA9PiAhbmV3Q29udGV4dC5pc0luYWN0aXZlKCkpO1xuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoYWN0aXZlQ29udGV4dHMubWFwKGFzeW5jIChuZXdDb250ZXh0KSA9PiBuZXdDb250ZXh0LmNyZWF0ZWQoKSkpO1xuXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKHJlcXVlc3RTaWRlRWZmZWN0cyAmJiAhQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dCh0YXJnZXRMaXN0QmluZGluZykpIHtcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB2aWV3QmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgJiYgYWN0aXZlQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBhY3RpdmVDb250ZXh0cyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBjcmVhdGVkQ29udGV4dHM7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyBtdWx0aXBsZSBkb2N1bWVudHMuXCIpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnQ3JlYXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnQ3JlYXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVDcmVhdGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0UGF0aCBQYXRoIHBvaW50aW5nIHRvIHRoZSBjb250ZXh0IG9uIHdoaWNoIENyZWF0ZSBhY3Rpb24gaXMgdHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY3JlYXRlUGFyYW1ldGVycyBBcnJheSBvZiB2YWx1ZXMgdGhhdCBhcmUgZmlsbGVkIGluIHRoZSBBY3Rpb24gUGFyYW1ldGVyIERpYWxvZ1xuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRhc3luYyBvbkJlZm9yZUNyZWF0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRQYXRoPzogc3RyaW5nOyBjcmVhdGVQYXJhbWV0ZXJzPzogdW5rbm93bltdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRWRpdCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdFZGl0JyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoXCJBZnRlckFzeW5jXCIpXG5cdGFzeW5jIG9uQmVmb3JlRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShcIkFmdGVyQXN5bmNcIilcblx0YXN5bmMgb25CZWZvcmVTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEaXNjYXJkJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZGlzY2FyZGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEZWxldGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25CZWZvcmVEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgYWN0aW9uIGV4ZWN1dGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUV4ZWN1dGVBY3Rpb25cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSB1c2VkIGZvciB0aGUgYWN0aW9uIGV4ZWN1dGlvblxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoXCJBZnRlckFzeW5jXCIpXG5cdGFzeW5jIG9uQmVmb3JlRXhlY3V0ZUFjdGlvbihfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIHwgQ29udGV4dCB8IG51bGwgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdTYXZlJyBhY3Rpb24uXG5cdCAqIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQWZ0ZXJTYXZlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dCBUaGUgY29udGV4dCB3ZSBvYnRhaW5lZCBhZnRlciBzYXZpbmdcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVqZWN0ZWQsIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgdGhlIGZyYW1ld29yayBpcyBzdG9wcGVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgVGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZWplY3RlZCwgYW55IGZ1cnRoZXIgcHJvY2Vzc2luZyBieSB0aGUgZnJhbWV3b3JrIGlzIHN0b3BwZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckNyZWF0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkFmdGVyRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZWplY3RlZCwgYW55IGZ1cnRoZXIgcHJvY2Vzc2luZyBieSB0aGUgZnJhbWV3b3JrIGlzIHN0b3BwZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuMTE2LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckVkaXQoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29kZSBhZnRlciB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckRpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFRoZSBjb250ZXh0IG9idGFpbmVkIGFmdGVyIGRpc2NhcmRpbmcgdGhlIG9iamVjdCwgb3IgdW5kZWZpbmVkIGlmIHdlIGRpc2NhcmRlZCBhIG5ldyBvYmplY3Rcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVqZWN0ZWQsIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgdGhlIGZyYW1ld29yayBpcyBzdG9wcGVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgYWZ0ZXIgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25BZnRlckRlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVqZWN0ZWQsIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgdGhlIGZyYW1ld29yayBpcyBzdG9wcGVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjExNi4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2Ugc2F2ZSBpcyBjb21wbGV0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBTYXZlRG9jdW1lbnRQYXJhbWV0ZXJzKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gc2F2ZURvY3VtZW50IGlzIGNhbGxlZCBmcm9tIGlubGluZSBlZGl0IGtleWJvYXJkIHNob3J0Y3V0XG5cdFx0aWYgKFxuXHRcdFx0IXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgJiZcblx0XHRcdHRoaXMuYmFzZS5pbmxpbmVFZGl0Rmxvdz8uaXNJbmxpbmVFZGl0UG9zc2libGUoKSAmJlxuXHRcdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvaXNJbmxpbmVFZGl0QWN0aXZlXCIpXG5cdFx0KSB7XG5cdFx0XHR0aGlzLmJhc2UuaW5saW5lRWRpdEZsb3cuaW5saW5lRWRpdFNhdmUoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzIGFzIE9EYXRhTGlzdEJpbmRpbmdbXTtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdC8vIGluIGNhc2Ugb2Ygc2F2aW5nIC8gYWN0aXZhdGluZyB0aGUgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBzaGFsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgUEFUQ0gvUE9TVFxuXHRcdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm1lcmdlUGF0Y2hEcmFmdCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRcdC8vd2UgbmVlZCB0byByZXF1ZXN0IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kIHRoZW4gYnJpbmcgdGhlIGRpYWxvZyBoZXJlXG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblxuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25PcHRpb25DaG9vc2VuID0gYXdhaXQgdGhpcy5jaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uKCk7XG5cdFx0XHRjb25zdCByb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IHJvb3RDb250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCByb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiZcblx0XHRcdFx0XHRyb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHx8XG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0XG5cdFx0XHQpIHtcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdHJvb3RDb250ZXh0LFxuXHRcdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gb0NvbnRleHQgOiAocm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEV4ZWN1dGUgdGhlIHJlZ2lzdGVyZWQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgd2hpY2ggaGF2ZSBub3QgYmUgZXhlY3V0ZWQgeWV0IGZvciB0aGUgcGFnZSBjb250ZXh0XG5cdFx0XHQvLyBDYW4gb2NjdXIgd2hlbiBzaG9ydGN1dCBpcyB1c2VkIHRvIHNhdmUgdGhlIGRvY3VtZW50LlxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLl9zaWRlRWZmZWN0cy5oYW5kbGVQYWdlQ2hhbmdlQ29udGV4dChvQ29udGV4dCk7XG5cblx0XHRcdC8vIFRoZSAkYXV0byBxdWV1ZSBjYW4gb25seSBoYXZlIHBlbmRpbmcgY2hhbmdlcyBhdCB0aGlzIHBvaW50IHdoZW4gU0FWRSB3YXMgY2xpY2tlZCBpbW1lZGlhdGVseSBhZnRlciBjaGFuZ2luZyBhIGZpZWxkLlxuXHRcdFx0Ly8gSW4gdGhpcyBjYXNlIHRoZSAkYXV0byBxdWV1ZSBpcyBsb2NrZWQgdGhlcmVmb3JlIHRoZSBmb2xsb3dpbmcgc3VibWl0IGJhdGNoIHNob3VsZCBub3QgY3JlYXRlIGEgc2VwYXJhdGUgYmF0Y2ggcmVxdWVzdC5cblx0XHRcdC8vIEl0IGlzIGRvbmUgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgcGF0Y2gsIGRyYWZ0cHJlcGFyZSwgZHJhZnRhY3RpdmF0ZSBlYWNoIGhhdmUgdGhlaXIgb3duIGNoYW5nZXNldFxuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSAmJiBtUGFyYW1ldGVycy5tZXJnZVBhdGNoRHJhZnQpIHtcblx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChcIiRhdXRvXCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciBhcyBib29sZWFuLFxuXHRcdFx0XHRhQmluZGluZ3MsXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoU3RhbmRhcmRBY3Rpb25zLnNhdmUsIFRyaWdnZXJUeXBlLnN0YW5kYXJkQWN0aW9uKTtcblxuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHsgdW5Ib2xkS2V5OiBtZXNzYWdlSGFuZGxpbmdLZXkgfSk7XG5cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkFmdGVyU2F2ZSh7XG5cdFx0XHRcdGNvbnRleHQ6IGFjdGl2ZURvY3VtZW50Q29udGV4dFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHVwZGF0ZSB0ZWxlbWV0cnkgZGF0YSBmb3IgaG93IHBhZ2Ugd2FzIHNhdmVkIGFuZCB0aGVuIGRvIHN0b3Jpbmcgb2YgdGhpcyBkYXRhIHRvIGJhY2tlbmQgdGhyb3VnaCB0aGUgc3RvcmVEYXRhIGZ1bmN0aW9uXG5cdFx0XHR0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLnN0b3JlRGF0YUZvclRlbGVtZXRyeShyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4pO1xuXG5cdFx0XHRpZiAoYWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBhY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2hlbiBzYXZpbmcsIHRoZSBzZW1hbnRpYyBrZXlzIG1heSBoYXZlIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIG5lZWQgdG8gbWFuYWdlIHRoZSBzZW1hbnRpYyBVUkwgY2hhbmdlIGluIHRoZSBoaXN0b3J5XG5cdFx0XHRcdFx0Y29uc3QgcHJldmlvdXNTZW1hbnRpY1BhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgob0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGNvbnN0IG5ld1NlbWFudGljUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChhY3RpdmVEb2N1bWVudENvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdGlmIChwcmV2aW91c1NlbWFudGljUGF0aCAmJiBuZXdTZW1hbnRpY1BhdGggJiYgcHJldmlvdXNTZW1hbnRpY1BhdGggIT09IG5ld1NlbWFudGljUGF0aCkge1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IHByZXZpb3VzU2VtYW50aWNQYXRoLCBuZXdQYXRoOiBuZXdTZW1hbnRpY1BhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRpZiAocm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpIHx8IHRoaXMuX2hpZGRlbkRyYWZ0Py5zdGF5T25DdXJyZW50UGFnZUFmdGVyU2F2ZSkge1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldyAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IGZhbHNlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiB1bmtub3duKSB7XG5cdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdGlmICghKG9FcnJvciAmJiAob0Vycm9yIGFzIHsgY2FuY2VsZWQ/OiBib29sZWFuIH0pLmNhbmNlbGVkKSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzYXZpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyB0aGUgVUkgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gc3dpdGNoIGZyb21cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBzd2l0Y2ggaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgZWRpdGFibGU6IGJvb2xlYW47XG5cdFx0Y29uc3QgYklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0Ly90b2dnbGUgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBlZGl0IGRyYWZ0cyBhbmQgYWN0aXZlIGRvY3VtZW50cyB3aXRoIGRyYWZ0KVxuXHRcdGlmIChcblx0XHRcdCFiSXNEcmFmdCB8fFxuXHRcdFx0IShcblx0XHRcdFx0KCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkgfHxcblx0XHRcdFx0KG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzRHJhZnRFbnRpdHkpXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCFvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0FjdGl2ZUVudGl0eSkge1xuXHRcdFx0Ly9zdGFydCBQb2ludDogZWRpdCBkcmFmdFxuXHRcdFx0ZWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRlZGl0YWJsZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnN0IG9SaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSA/IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpIDogb0NvbnRleHQ7XG5cdFx0XHRsZXQgc2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvUmlnaHRtb3N0Q29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0aWYgKCFzaWJsaW5nSW5mbyAmJiBvQ29udGV4dCAhPT0gb1JpZ2h0bW9zdENvbnRleHQpIHtcblx0XHRcdFx0Ly8gVHJ5IHRvIGNvbXB1dGUgc2libGluZyBpbmZvIGZvciB0aGUgcm9vdCBjb250ZXh0IGlmIGl0IGZhaWxzIGZvciB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdFx0Ly8gLS0+IEluIGNhc2Ugb2YgRkNMLCBpZiB3ZSB0cnkgdG8gc3dpdGNoIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBidXQgYSBjaGlsZCBlbnRpdHkgaGFzIG5vIHNpYmxpbmcsIHRoZSBzd2l0Y2ggd2lsbCBjbG9zZSB0aGUgY2hpbGQgY29sdW1uXG5cdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb0NvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgeyBlZGl0YWJsZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmUgLSBDYW5ub3QgZmluZCBzaWJsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZToke29FcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzYXAubS5CdXR0b259IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiAtIEN1cnJlbnRseSB0aGlzIGlzIHBhc3NlZCBhcyBjYW5jZWxCdXR0b24gaW50ZXJuYWxseSAocmVwbGFjZWQgYnkgbVBhcmFtZXRlcnMuY29udHJvbCBpbiB0aGUgSlNEb2MgYmVsb3cpLiBDdXJyZW50bHkgaXQgaXMgYWxzbyBtYW5kYXRvcnkuXG5cdC8vIFBsYW4gLSBUaGlzIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5LiBJZiBub3QgcHJvdmlkZWQsIHdlIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBhY3QgYXMgcmVmZXJlbmNlIGNvbnRyb2wgZm9yIHRoZSBkaXNjYXJkIHBvcG92ZXIgT1Igd2UgY2FuIHNob3cgYSBkaWFsb2cgaW5zdGVhZCBvZiBhIHBvcG92ZXIuXG5cblx0LyoqXG5cdCAqIERpc2NhcmQgdGhlIGVkaXRhYmxlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBQUklWQVRFXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGFuZCBhbGxvd3MgY3VzdG9tIGhhbmRsaW5nXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0bVBhcmFtZXRlcnM6IHtcblx0XHRcdGNvbnRyb2w/OiBCdXR0b247XG5cdFx0XHRjYW5jZWxCdXR0b24/OiBCdXR0b247XG5cdFx0XHRza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuO1xuXHRcdFx0c2tpcEJhY2tOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdHNraXBCaW5kaW5nVG9WaWV3PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0bGV0IGlzTmV3RG9jdW1lbnQgPSBmYWxzZTtcblx0XHRtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgPSB0aGlzLl9oaWRkZW5EcmFmdD8uZW5hYmxlZCA/IHRydWUgOiBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXI7XG5cdFx0Y29uc3QgY2FuY2VsUGFyYW1ldGVyczogQ2FuY2VsUGFyYW1ldGVycyA9IHtcblx0XHRcdHNraXBEaXNjYXJkUG9wb3ZlcjogbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyID09PSB0cnVlLFxuXHRcdFx0Y2FuY2VsQnV0dG9uOiAobVBhcmFtZXRlcnMuY29udHJvbCB8fCBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24pISxcblx0XHRcdGJlZm9yZUNhbmNlbENhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkXG5cdFx0fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCByb290Q29udGV4dDogQ29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0Um9vdENvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHx8XG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0XG5cdFx0XHQpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0cm9vdENvbnRleHQsXG5cdFx0XHRcdFx0dGhpcy5faGlkZGVuRHJhZnQgPyBvQ29udGV4dCA6IChvUm9vdFZpZXdDb250cm9sbGVyIGFzIEZjbENvbnRyb2xsZXIpLmdldFJpZ2h0bW9zdENvbnRleHQoKSxcblx0XHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNhbmNlbFJlc3VsdCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbmNlbERvY3VtZW50KFxuXHRcdFx0XHRyb290Q29udGV4dCxcblx0XHRcdFx0Y2FuY2VsUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuX2hpZGRlbkRyYWZ0ID8gdGhpcy5nZXRDcmVhdGlvbk1vZGUoKSAmJiAhcm9vdENvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikgOiB0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpIHx8IHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSAvLyBJbiBzdGlja3kgbW9kZSB3ZSBhbHdheXMgYXNrIGZvciBjb25maXJtYXRpb25cblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZ2V0SW5zdGFuY2VkVmlld3MoKVxuXHRcdFx0XHQuZm9yRWFjaCgodmlldykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGlmIChjb250ZXh0Py5pc0tlZXBBbGl2ZSgpID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQWZ0ZXJEaXNjYXJkKHtcblx0XHRcdFx0Y29udGV4dDogY2FuY2VsUmVzdWx0XG5cdFx0XHR9KTtcblx0XHRcdC8vIHdlIGZvcmNlIHRoZSBlZGl0IHN0YXRlIGV2ZW4gZm9yIEZDTCBiZWNhdXNlIHRoZSBkcmFmdCBkaXNjYXJkIG1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0Ly8gYW5kIHdlIG1heSBqdXN0IGRlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0aWYgKCFjYW5jZWxSZXN1bHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9Db250ZXh0KTtcblx0XHRcdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5kaXNjb25uZWN0KCk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHJvb3RDb250ZXh0KTtcblx0XHRcdFx0XHRpc05ld0RvY3VtZW50ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGNhbmNlbFJlc3VsdDtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmJhc2UuY29sbGFib3JhdGl2ZURyYWZ0LmRpc2Nvbm5lY3QoKTtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCh0aGlzLl9pc0ZjbEVuYWJsZWQoKSB8fCB0aGlzLl9oaWRkZW5EcmFmdD8uc3RheU9uQ3VycmVudFBhZ2VBZnRlckNhbmNlbCkgJiZcblx0XHRcdFx0XHRzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB7IGVkaXRhYmxlOiBmYWxzZSwgcmVjcmVhdGVDb250ZXh0OiB0cnVlLCBmb3JjZUZvY3VzOiB0cnVlIH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnQsIGFuZCBpdCdzIHRoZSBzYW1lIGFzIHRoZSBlZGl0ZWQgY29udGV4dFxuXHRcdFx0XHRcdC8vIFNvLCB3ZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBhcyBpdCBtYXkgaGF2ZSBiZWVuIGRlc3Ryb3llZCB3aGVuIGNhbGxpbmcgc2V0S2VlcEFsaXZlKGZhbHNlKSBvbiBhbGwgdmlldydzIGNvbnRleHRzXG5cdFx0XHRcdFx0Ly8gZWFybGllciBpbiB0aGlzIG1ldGhvZFxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHsgZWRpdGFibGU6IGZhbHNlLCByZWNyZWF0ZUNvbnRleHQ6IHRydWUsIGZvcmNlRm9jdXM6IHRydWUgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiAhdGhpcy5faGlkZGVuRHJhZnQpIHtcblx0XHRcdFx0Ly9zaG93IERyYWZ0IGRpc2NhcmRlZCBtZXNzYWdlIHRvYXN0IG9ubHkgZm9yIGRyYWZ0IGVuYWJsZWQgYXBwc1xuXHRcdFx0XHR0aGlzLnNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZ2V0Um9vdENvbnRleHQoY29udGV4dDogQ29udGV4dCwgYmluZGluZ1BhcmFtZXRlcnM/OiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mb1tcInBhcmFtZXRlcnNcIl0pOiBQcm9taXNlPENvbnRleHQ+IHtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblx0XHRpZiAoKHZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0IHx8IHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdHJldHVybiAoYXdhaXQgQ29tbW9uVXRpbHMuY3JlYXRlUm9vdENvbnRleHQoXG5cdFx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzXG5cdFx0XHRcdCkpIGFzIENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0O1xuXHR9XG5cblx0YXN5bmMgaXNSb290Q29udGV4dE5ldyhjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Y29uc3Qgcm9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldFJvb3RDb250ZXh0KGNvbnRleHQsIHsgJHNlbGVjdDogXCJIYXNBY3RpdmVFbnRpdHksSXNBY3RpdmVFbnRpdHlcIiB9KTtcblx0XHQvLyBXaGVuIHdlIHJlZnJlc2ggdGhlIHJvb3QgY29udGV4dCwgaXQgbWF5IG5vdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIEhhc0FjdGl2ZUVudGl0eSBhbmQgSXNBY3RpdmVFbnRpdHkgeWV0LCBzbyB3ZSByZXF1ZXN0IHRoZW1cblx0XHRjb25zdCBkcmFmdFByb3BlcnRpZXMgPSBhd2FpdCByb290Q29udGV4dC5yZXF1ZXN0UHJvcGVydHkoW1wiSGFzQWN0aXZlRW50aXR5XCIsIFwiSXNBY3RpdmVFbnRpdHlcIl0pO1xuXHRcdHJldHVybiAhZHJhZnRQcm9wZXJ0aWVzWzBdICYmICFkcmFmdFByb3BlcnRpZXNbMV07XG5cdH1cblxuXHQvKipcblx0ICogQnJpbmdzIHVwIGEgbWVzc2FnZSB0b2FzdCB3aGVuIGEgZHJhZnQgaXMgZGlzY2FyZGVkLlxuXHQgKiBAcGFyYW0gaXNOZXdEb2N1bWVudCBUaGlzIGlzIGEgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBuZXcgb3IgYWxyZWFkeSBleGlzdHMuXG5cdCAqL1xuXHRzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50PzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0aWYgKGlzTmV3RG9jdW1lbnQgPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaEFmdGVyUm91dGVNYXRjaGVkKHt9LCB0aGlzLnNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCwgdGhpcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBpbiBzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZSB3aGVuIG5vIGNvbnRleHQgaXMgcGFzc2VkLlxuXHQgKi9cblx0c2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0KCk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlLCB7IGNsb3NlT25Ccm93c2VyTmF2aWdhdGlvbjogZmFsc2UgfSk7XG5cdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGNvbnRleHQgY29ycmVzcG9uZHMgdG8gYSBkcmFmdCByb290LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhIGRyYWZ0IHJvb3Rcblx0ICovXG5cdHByaXZhdGUgaXNEcmFmdFJvb3QoY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5U2V0KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBFbnRpdHlTZXQgdG8gd2hpY2ggdGhlIG9iamVjdCBiZWxvbmdzXG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIGRvY3VtZW50LlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBkZWxldGVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbUluUGFyYW1ldGVycz86IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnM6IHtcblx0XHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhbjtcblx0XHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0czogYm9vbGVhbjtcblx0XHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ/OiBJbnRlcm5hbE1vZGVsQ29udGV4dCB8IG51bGw7XG5cdFx0XHRcdGVudGl0eVNldE5hbWU/OiBzdHJpbmc7XG5cdFx0XHRcdHRpdGxlPzogc3RyaW5nO1xuXHRcdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0XHRcdH0gPSB7IC4uLm1JblBhcmFtZXRlcnMsIGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlLCBiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlIH0sXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5faXNGY2xFbmFibGVkKCkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChvQ29udGV4dCkgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSA9PT0gdHJ1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIERlbGV0aW5nIGFuIGFjdGl2ZSBlbnRpdHkgd2hpY2ggaGFzIGEgZHJhZnQgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBiZSBkaXNwbGF5ZWQgaW4gdGhlIExpc3RSZXBvcnQgKEZDTCBjYXNlKVxuXHRcdFx0XHQvLyAtLT4gbmVlZCB0byByZW1vdmUgdGhlIGRyYWZ0IGZyb20gdGhlIExSIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIGFjdGl2ZSB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBMaXN0QmluZGluZyBpcyBwcm9wZXJseSByZWZyZXNoZWRcblx0XHRcdFx0Ly8gVGhlIGNvbmRpdGlvbiAnb0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkJyBtYWtlcyBzdXJlIHRoZSBhY3RpdmUgdmVyc2lvbiBpc24ndCBhbHJlYWR5IGRpc3BsYXllZCBpbiB0aGUgTFJcblx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSBhc3luYyAocGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZShwYXJhbWV0ZXJzKTtcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRQYXRoID0gYXdhaXQgc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0Q29udGV4dFRvUmVtb3ZlID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChkcmFmdFBhdGgpO1xuXHRcdFx0XHRcdFx0ZHJhZnRDb250ZXh0VG9SZW1vdmUucmVwbGFjZVdpdGgob0NvbnRleHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXBsYWNpbmcgdGhlIGRyYWZ0IGluc3RhbmNlIGluIHRoZSBMUiBPRExCXCIsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHRpZiAoIWRlbGV0ZWQpIHtcblx0XHRcdFx0Ly8gVGhlIGRlbGV0ZSB3YXMgY2FuY2VsZWQgYnkgdGhlIHVzZXJcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0QmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0aWYgKGNvbnRleHRCaW5kaW5nLmlzQTxPRGF0YUxpc3RCaW5kaW5nPihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHRCaW5kaW5nLmlzUm9vdCgpKSB7XG5cdFx0XHRcdFx0XHQvLyBFdmVuIGluIHRoZSBGQ0wgY2FzZSwgd2UgbmVlZCB0byByZWZyZXNoIHRoZSBsaXN0YmluZGluZyBpbiB0aGUgTFIgKG5vdCBPUCkgdG8gdXBkYXRlIHRoZSBjb3VudHMgaW4gdGhlIHRhYnMgYW5kIHF1aWNrZmlsdGVyc1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnJlZnJlc2hMaXN0QmluZGluZyhjb250ZXh0QmluZGluZywgb0FwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChtUGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnJlcXVlc3RTaWRlRWZmZWN0c09uRGVsZXRlKGNvbnRleHRCaW5kaW5nLCBjb250ZXh0QmluZGluZy5nZXRDb250ZXh0KCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdGF3YWl0IG9BcHBDb21wb25lbnQ/LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0Y29uc3QgaXNSZWNvbW1lbmRhdGlvbkVuYWJsZWQgPSB0aGlzLmJhc2UucmVjb21tZW5kYXRpb25zLmlzUmVjb21tZW5kYXRpb25FbmFibGVkKCk7XG5cdFx0XHQvLyBXZSBjbGVhciByZWNvbW1lbmRhdGlvbiBkYXRhIGFuZCBjb250ZXh0cyBmcm9tIGludGVybmFsIG1vZGVsIGZvciB0aGUgZGVsZXRlZCBjb250ZXh0c1xuXHRcdFx0aWYgKGlzUmVjb21tZW5kYXRpb25FbmFibGVkKSB7XG5cdFx0XHRcdHRoaXMuYmFzZS5yZWNvbW1lbmRhdGlvbnMuaWdub3JlUmVjb21tZW5kYXRpb25Gb3JDb250ZXh0cyhbb0NvbnRleHRdKTtcblx0XHRcdH1cblx0XHRcdC8vIE5vdGlmeSBjb25zdW1lcnMgb2Ygd2hpY2ggY29udGV4dHMgd2VyZSBkZWxldGVkXG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckRlbGV0ZSh7IGNvbnRleHRzOiBbb0NvbnRleHRdIH0pO1xuXG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdGlmIChvQXBwQ29tcG9uZW50Py5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5EZWVwbGluaykge1xuXHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcCBoYXMgYmVlbiBsYXVuY2hlZCB3aXRoIHNlbWFudGljIGtleXMsIGRlbGV0aW5nIHRoZSBvYmplY3Qgd2UndmUgbGFuZGVkIG9uIHNoYWxsIG5hdmlnYXRlIGJhY2tcblx0XHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5leGl0RnJvbUFwcCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEVsc2UgbmF2aWdhdGUgYmFjayBmcm9tIHRoZSBwYWdlLiBJbiBGQ0wsIHRoaXMgaXMgZG9uZSB3aGVuIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgaXMgZGVzdHJveWVkIChjYWxsYmFjaylcblx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBhcHBseURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0XHQvL3dlIG5lZWQgdG8gcmVxdWVzdCBmb3IgcmVjb21tZW5kYXRpb25zIGFuZCB0aGVuIGJyaW5nIHRoZSBkaWFsb2cgaGVyZVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaXNDb250aW51ZSA9IGF3YWl0IHRoaXMuc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coZmFsc2UpO1xuXHRcdFx0aWYgKGlzQ29udGludWUgPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQsIHsgY2FsbEV4dGVuc2lvbjogdHJ1ZSB9KTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbl0gQm9vbGVhbiB2YWx1ZSBmb3Igc3RhdGljIGFjdGlvbiwgdW5kZWZpbmVkIGZvciBvdGhlciBhY3Rpb25zXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlXSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0Ly8gQ3VycmVudGx5IHRoZSBwYXJhbWV0ZXIgaXNOYXZpZ2FibGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFuZCBzaG91bGQgYmUgY2hhbmdlZCB0byByZXF1aXJlc05hdmlnYXRpb24gYXMgaXQgaXMgYSBtb3JlIGFwdCBuYW1lIGZvciB0aGlzIHBhcmFtXG5cblx0LyoqXG5cdCAqIEludm9rZXMgYW4gYWN0aW9uIChib3VuZCBvciB1bmJvdW5kKSBhbmQgdHJhY2tzIHRoZSBjaGFuZ2VzIHNvIHRoYXQgb3RoZXIgcGFnZXMgY2FuIGJlIHJlZnJlc2hlZCBhbmQgc2hvdyB0aGUgdXBkYXRlZCBkYXRhIHVwb24gbmF2aWdhdGlvbi5cblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIEFuIG9wdGlvbmFsIGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBhY3Rpb24gcGFyYW1ldGVycywgd2hlcmUgZWFjaCBvYmplY3QgaGFzIGEgbmFtZSBvZiBzdHJpbmcgdHlwZSBhbmQgYSB2YWx1ZSB0aGF0IGNhbiBiZSBvZiBhbnkgZGF0YSB0eXBlLlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgb2YgdGhlbSBpbiBwYXJhbWV0ZXJWYWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5tb2RlbCBGb3IgYW4gdW5ib3VuZCBhY3Rpb24sIGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRyb2xJZCBQUklWQVRFXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24gUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dHMgUFJJVkFURVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsIFBSSVZBVEVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIFBSSVZBVEVcblx0ICogQHBhcmFtIG1FeHRyYVBhcmFtcyBQUklWQVRFXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyBvbmNlIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIElmIHJlc29sdmVkLCB0aGUgcHJvbWlzZSByZXR1cm5zOlxuXHQgKiAgLSBJZiB0aGUgcGFyYW1ldGVyIGNvbnRleHRzIGlzIGFuIGFycmF5OiBhbiBhcnJheSBvZiBvYmplY3RzLCBlYWNoIG9iamVjdCBjb250YWluaW5nIGEga2V5IFwic3RhdHVzXCIsIGFzIHdlbGwgYXMgXCJ2YWx1ZVwiIHJlZmVyZW5jaW5nIHRoZSBhY3Rpb24gc3RhdHVzIGFuZCB0aGUgY29udGV4dFxuXHQgKiAgLSBJZiB0aGUgcGFyYW1ldGVyIGNvbnRleHRzIGlzIG5vdCBhbiBhcnJheTogYSBzaW5nbGUgY29udGV4dFxuXHQgKiBUaGUgY29udGV4dChzKSBwcm92aWRlZCBpbiB0aGUgcHJvbWlzZSBpcyAoYXJlKSBlaXRoZXIgdGhlIHJldHVybiB2YWx1ZSBjb250ZXh0IG9mIHRoZSBhY3Rpb24gb3IgdGhlIGJvdW5kIGNvbnRleHQgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBpbnZva2VBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzPzoge1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0Y29udGV4dHM/OiBDb250ZXh0IHwgQ29udGV4dFtdO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0ZW50aXR5U2V0TmFtZT86IHN0cmluZztcblx0XHRcdGludm9jYXRpb25Hcm91cGluZz86IHN0cmluZztcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGNvbnRyb2xJZD86IHN0cmluZztcblx0XHRcdGJTdGF0aWNBY3Rpb24/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0bm90QXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0ZW5hYmxlQXV0b1Njcm9sbD86IGJvb2xlYW47XG5cdFx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiB7fVxuXHQpOiBQcm9taXNlPFxuXHRcdHwge1xuXHRcdFx0XHR2YWx1ZTogQ29udGV4dDtcblx0XHRcdFx0c3RhdHVzOiBcImZ1bGZpbGxlZFwiO1xuXHRcdCAgfVtdXG5cdFx0fCBDb250ZXh0XG5cdD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0ZlJlc29sdmVyOiBGdW5jdGlvbjtcblx0XHRcdFx0XHRmUmVqZWN0b3I6IEZ1bmN0aW9uO1xuXHRcdFx0ICB9XG5cdFx0XHR8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuYmFzZS5nZXRWaWV3KCk7XG5cblx0XHQvLyBEdWUgdG8gYSBtaXN0YWtlIHRoZSBpbnZva2VBY3Rpb24gaW4gdGhlIGV4dGVuc2lvbkFQSSBoYWQgYSBkaWZmZXJlbnQgQVBJIHRoYW4gdGhpcyBvbmUuXG5cdFx0Ly8gVGhlIG9uZSBmcm9tIHRoZSBleHRlbnNpb25BUEkgZG9lc24ndCBleGlzdCBhbnltb3JlIGFzIHdlIGV4cG9zZSB0aGUgZnVsbCBlZGl0IGZsb3cgbm93IGJ1dFxuXHRcdC8vIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoZSBvbGQgc2lnbmF0dXJlXG5cdFx0aWYgKFxuXHRcdFx0KChtSW5QYXJhbWV0ZXJzIGFzIENvbnRleHQpPy5pc0EgJiYgKG1JblBhcmFtZXRlcnMgYXMgQ29udGV4dCk/LmlzQTxDb250ZXh0PihcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtSW5QYXJhbWV0ZXJzKSB8fFxuXHRcdFx0bUV4dHJhUGFyYW1zICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdGNvbnN0IGNvbnRleHRzOiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCB1bmRlZmluZWQgPSBtSW5QYXJhbWV0ZXJzIGFzIE9EYXRhVjRDb250ZXh0IHwgT0RhdGFWNENvbnRleHRbXSB8IHVuZGVmaW5lZDtcblx0XHRcdG1JblBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bUluUGFyYW1ldGVycy5jb250ZXh0cyA9IGNvbnRleHRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bUluUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBtUGFyYW1ldGVyczoge1xuXHRcdFx0YmluZGluZ1BhcmFtZXRlcnM/OiBCaW5kQ29udGV4dFBhcmFtZXRlcnM7XG5cdFx0XHRiU3RhdGljQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdHBhcmFtZXRlclZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG5cdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nPzogYm9vbGVhbjtcblx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0XHRlbnRpdHlTZXROYW1lPzogc3RyaW5nO1xuXHRcdFx0Y29udGV4dHM/OiBPRGF0YVY0Q29udGV4dCB8IE9EYXRhVjRDb250ZXh0W10gfCBudWxsO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0dmlldzogRkVWaWV3O1xuXHRcdFx0Y29udHJvbElkPzogc3RyaW5nO1xuXHRcdFx0aXNOYXZpZ2FibGU/OiBib29sZWFuO1xuXHRcdFx0YXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGlzQ3JlYXRlQWN0aW9uPzogYm9vbGVhbjtcblx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcD86IHN0cmluZztcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0Z3JvdXBJZD86IHN0cmluZztcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbj86IHN0cmluZztcblx0XHRcdGVuYWJsZUF1dG9TY3JvbGw/OiBib29sZWFuO1xuXHRcdFx0aXNCb3VuZD86IGJvb2xlYW47XG5cdFx0XHRpZ25vcmVFVGFnPzogYm9vbGVhbjtcblx0XHR9ID0geyAuLi5tSW5QYXJhbWV0ZXJzLCB2aWV3OiB0aGlzLmJhc2UuZ2V0VmlldygpIH0gfHwgeyB2aWV3OiB0aGlzLmJhc2UuZ2V0VmlldygpIH07XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGUgcmVmZXJlbmNlZCBhY3Rpb24gaXMgYm91bmQgb3IgdW5ib3VuZFxuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gY29udmVydFR5cGVzKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHQvLyBUaGUgRW50aXR5Q29udGFpbmVyIG1heSBOT1QgYmUgbWlzc2luZywgc28gaXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHVuZGVmaW5lZCwgYnV0IHNpbmNlIGluIG91ciBjb252ZXJ0ZWQgTWV0YWRhdGFcblx0XHQvLyBpdCBjYW4gYmUgdW5kZWZpbmVkLCBJIG5lZWQgdGhpcyB3b3JrYXJvdW5kIGhlcmUgb2YgYWRkaW5nIFwiXCIgc2luY2UgaW5kZXhPZiBkb2VzIG5vdCBhY2NlcHQgc29tZXRoaW5nIHRoYXQnc1xuXHRcdC8vIHVuZGVmaW5lZC5cblx0XHRpZiAoc0FjdGlvbk5hbWUuaW5jbHVkZXMoXCJcIiArIGNvbnZlcnRlZE1ldGFkYXRhLmVudGl0eUNvbnRhaW5lci5uYW1lKSkge1xuXHRcdFx0Ly8gVW5ib3VuZCBhY3Rpb25zIGFyZSBhbHdheXMgcmVmZXJlbmNlZCB2aWEgdGhlIGFjdGlvbiBpbXBvcnQgYW5kIHdlIGZvdW5kIHRoZSBFbnRpdHlDb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lIHNvXG5cdFx0XHQvLyBhbiB1bmJvdW5kIGFjdGlvbiBpcyByZWZlcmVuY2VkIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBObyBlbnRpdHkgY29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSwgc28gZWl0aGVyIGEgYm91bmQgb3Igc3RhdGljIGFjdGlvbiBpcyByZWZlcmVuY2VkIHdoaWNoIGlzIGFsc28gYm91bmQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIW1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgJiYgbVBhcmFtZXRlcnMuY29udGV4dHMgJiYgbVBhcmFtZXRlcnMubW9kZWwpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgPSBtUGFyYW1ldGVycy5tb2RlbFxuXHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0LmdldE1ldGFDb250ZXh0KChBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKSA/IG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdIDogbVBhcmFtZXRlcnMuY29udGV4dHMpLmdldFBhdGgoKSlcblx0XHRcdFx0LmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdH1cblx0XHRsZXQgb0NvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkgYXMgQ29udHJvbDtcblx0XHRcdGlmIChvQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHkgdGhpcyBzZWxlY3RlZCBjb250ZXh0cyB1cGRhdGUgaXMgZG9uZSB3aXRoaW4gdGhlIG9wZXJhdGlvbiwgc2hvdWxkIGJlIG1vdmVkIG91dFxuXHRcdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdH1cblxuXHRcdC8vIGlmIHN0aWNreSBzZXNzaW9uIGlzIGVuYWJsZWQgd2UgdHJpZ2dlciBhY3Rpb25zIHdpdGhvdXQgZVRhZ1xuXHRcdG1QYXJhbWV0ZXJzLmlnbm9yZUVUYWcgPSBtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluY2x1ZGVzKFwiKFwiKSkge1xuXHRcdFx0Ly8gZ2V0IGVudGl0eSB0eXBlIG9mIGFjdGlvbiBvdmVybG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGlvbiBwYXRoXG5cdFx0XHQvLyBFeGFtcGxlIHNBY3Rpb25OYW1lID0gXCI8QWN0aW9uTmFtZT4oQ29sbGVjdGlvbig8T3ZlcmxvYWRFbnRpdHlUeXBlPikpXCJcblx0XHRcdC8vIHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdIC0tPiA8QWN0aW9uTmFtZT5cblx0XHRcdC8vIHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbMl0gLS0+IDxPdmVybG9hZEVudGl0eVR5cGU+XG5cdFx0XHRhUGFydHMgPSBzQWN0aW9uTmFtZS5zcGxpdChcIihcIik7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXTtcblx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGUgPSBhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdLnJlcGxhY2VBbGwoXCIpXCIsIFwiXCIpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uICYmIG9Db250cm9sKSB7XG5cdFx0XHRpZiAob0NvbnRyb2wuaXNBPFRhYmxlPihcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0Y29uc3QgdGFibGVBUEkgPSBvQ29udHJvbC5nZXRQYXJlbnQoKSBhcyBUYWJsZUFQSTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSB0YWJsZUFQSS5nZXRSb3dCaW5kaW5nKCkuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSAmJiBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0E8VGFibGU+KFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IHRoaXMuX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgoXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dCxcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRSb3dCaW5kaW5nKCksXG5cdFx0XHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuZW5hYmxlQXV0b1Njcm9sbCkge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyA9IHRoaXMuY3JlYXRlQWN0aW9uUHJvbWlzZShzQWN0aW9uTmFtZSwgb0NvbnRyb2wuZ2V0SWQoKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUV4ZWN1dGVBY3Rpb24oeyBjb250ZXh0czogbVBhcmFtZXRlcnMuY29udGV4dHMgfSk7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzLCB0aGlzLmdldEFwcENvbXBvbmVudCgpLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXHRcdFx0Y29uc3Qgc3VjY2Vzc0Z1bGxFeGVjdXRpb24gPSByZXNwb25zZS5maWx0ZXIoaXNGdWxmaWxsZWQpO1xuXHRcdFx0aWYgKHJlc3BvbnNlLmxlbmd0aCAhPT0gc3VjY2Vzc0Z1bGxFeGVjdXRpb24ubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIEtlZXAgdGhlIHNhbWUgd29ya2Zsb3cgdGhhbiBiZWZvcmVcblx0XHRcdFx0Ly8gSWYgYXQgbGVhc3Qgb25lIHByb21pc2UgaXMgcmVqZWN0ZWQsIHdlIHJlamVjdCB0aGUgd2hvbGUgcHJvbWlzZVxuXHRcdFx0XHR0aHJvdyByZXNwb25zZTtcblx0XHRcdH1cblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uKSxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0c1swXVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoXG5cdFx0XHRcdFx0QWN0aXZpdHkuQWN0aW9uLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzLFxuXHRcdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRcdGxpc3RSZWZyZXNoZWQsXG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0LmdldE9iamVjdCgpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWUsIFRyaWdnZXJUeXBlLmFjdGlvbik7XG5cblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVzb2x2ZXIoc3VjY2Vzc0Z1bGxFeGVjdXRpb24pO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdFx0XHRXZSBzZXQgdGhlICh1cHBlcikgcGFnZXMgdG8gZGlydHkgYWZ0ZXIgYW4gZXhlY3V0aW9uIG9mIGFuIGFjdGlvblxuXHRcdFx0XHRcdFRPRE86IGdldCByaWQgb2YgdGhpcyB3b3JrYXJvdW5kXG5cdFx0XHRcdFx0VGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHRPbmNlIHRoaXMgaXMgc3VwcG9ydGVkIHdlIGRvbid0IG5lZWQgdG8gc2V0IHRoZSBwYWdlcyB0byBkaXJ0eSBhbnltb3JlIGFzIHRoZSBjb250ZXh0IGl0c2VsZlxuXHRcdFx0XHRcdGlzIGFscmVhZHkgcmVmcmVzaGVkIChpdCdzIGp1c3Qgbm90IHJlZmxlY3RlZCBpbiB0aGUgb2JqZWN0IHBhZ2UpXG5cdFx0XHRcdFx0d2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHRhcyBpZiBpdCBpcyBjYWxsZWQgaW4gdGhlIGxpc3QgcmVwb3J0IGl0J3Mgbm90IG5lZWRlZCAtIGFzIHdlIGFueXdheSB3aWxsIHJlbW92ZSB0aGlzIGxvZ2ljXG5cdFx0XHRcdFx0d2UgY2FuIGxpdmUgd2l0aCB0aGlzXG5cdFx0XHRcdFx0d2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHRmaXJzdCBvbmUgYXMgdGhleSBhcmUgYW55d2F5IHNpYmxpbmdzXG5cdFx0XHRcdFx0Ki9cblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRpZiAodGhpcy5iYXNlLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpLmNvbnZlcnRlclR5cGUgIT09IFwiTGlzdFJlcG9ydFwiKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlKSB7XG5cdFx0XHRcdGlmIChzdWNjZXNzRnVsbEV4ZWN1dGlvbi5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycylcblx0XHRcdFx0XHRcdD8gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUuYm91bmRDb250ZXh0XG5cdFx0XHRcdFx0XHQ6IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLnJldHVybmVkQ29udGV4dCA/PyBzdWNjZXNzRnVsbEV4ZWN1dGlvblswXS52YWx1ZS5ib3VuZENvbnRleHQ7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGNvbnN0IF9mblZhbGlkQ29udGV4dHMgPSAoY29udGV4dHM6IENvbnRleHRbXSwgYXBwbGljYWJsZUNvbnRleHRzPzogQ29udGV4dFtdKTogQ29udGV4dFtdID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBjb250ZXh0cy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5jbHVkZXMoZWxlbWVudCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25Db250ZXh0ID0gQXJyYXkuaXNBcnJheShtUGFyYW1ldGVycy5jb250ZXh0cylcblx0XHRcdFx0XHRcdD8gX2ZuVmFsaWRDb250ZXh0cyhtUGFyYW1ldGVycy5jb250ZXh0cywgbVBhcmFtZXRlcnMuYXBwbGljYWJsZUNvbnRleHRzKVswXVxuXHRcdFx0XHRcdFx0OiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uQ29udGV4dE1ldGFQYXRoID0gb0FjdGlvbkNvbnRleHQgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXG5cdFx0XHRcdFx0aWYgKHNDb250ZXh0TWV0YVBhdGggIT0gdW5kZWZpbmVkICYmIHNDb250ZXh0TWV0YVBhdGggPT09IHNBY3Rpb25Db250ZXh0TWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dD8uZ2V0UGF0aCgpICE9PSBjb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChjb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWVcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIGFjdGlvbiByZXR1cm5zIGEgZHJhZnQgY29udGV4dCwgd2UgYWxyZWFkeSB0YWtlIGNhcmUgZHVyaW5nIG5hdmlnYXRpb24gdG8gZWl0aGVyIGNyZWF0ZSBhIG5ld1xuXHRcdFx0XHRcdFx0XHQvLyAoZnVsbCBzY3JlZW4pIG9yIHRvIHVzZSB0aGUgbGlzdCBiaW5kaW5nIGNvbnRleHQgYWZ0ZXIgcmVmcmVzaCAoYW5kIG5vdCB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQpLlxuXHRcdFx0XHRcdFx0XHQvLyBJZiB0aGUgZHJhZnQgaXMgZGlzY2FyZGVkIG9yIGFjdGl2YXRlZCwgaGF2aW5nIHRoZSBjb250ZXh0IHN0aWxsIGFzIGRlcGVuZGVudCBjb250ZXh0IGNhdXNlIGlzc3Vlc1xuXHRcdFx0XHRcdFx0XHQvLyAoZS5nLiBpZiBhIHNpZGUgZWZmZWN0IGlzIHRyaWdnZXJlZCkuIFRoZXJlZm9yZSwgd2UgZGVzdHJveSB0aGUgcmV0dXJuIHZhbHVlIGNvbnRleHQgaGVyZSxcblx0XHRcdFx0XHRcdFx0Ly8gYW5kIHRvIGJlIGNvbXBhdGlibGUgd2UgcmV0dXJuIGEgbmV3IGNvbnRleHQgd2l0aCB0aGUgc2FtZSBwYXRoLlxuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0ICYmXG5cdFx0XHRcdFx0XHRcdFx0KGNvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gZmFsc2UgfHwgdGhpcy5faXNGY2xFbmFibGVkKCkpXG5cdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHQuZ2V0QmluZGluZygpLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmluZm8oXCJOYXZpZ2F0aW9uIHRvIHRoZSBzYW1lIGNvbnRleHQgaXMgbm90IGFsbG93ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckFjdGlvbkV4ZWN1dGlvbihzQWN0aW9uTmFtZSk7XG5cblx0XHRcdC8vIEtlZXAgdGhpcyB3ZWlyZCByZXR1cm5lZCB2YWx1ZSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zXG5cdFx0XHQvLyBpbnZva2VBY3Rpb24gaXMgcHVibGljIGFuZCB3ZSBjYW4ndCBjaGFuZ2UgdGhlIHJldHVybmVkIHZhbHVlIGZvciB0aGUgYWN0aW9uXG5cdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkobUluUGFyYW1ldGVycz8uY29udGV4dHMpICYmIHN1Y2Nlc3NGdWxsRXhlY3V0aW9uLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4gc3VjY2Vzc0Z1bGxFeGVjdXRpb25bMF0udmFsdWUucmV0dXJuZWRDb250ZXh0ID8/IHN1Y2Nlc3NGdWxsRXhlY3V0aW9uWzBdLnZhbHVlLmJvdW5kQ29udGV4dDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzdWNjZXNzRnVsbEV4ZWN1dGlvbi5tYXAoKG9SZXN1bHQpID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgLi4ub1Jlc3VsdCwgLi4ueyB2YWx1ZTogb1Jlc3VsdC52YWx1ZS5yZXR1cm5lZENvbnRleHQgPz8gb1Jlc3VsdC52YWx1ZS5ib3VuZENvbnRleHQgfSB9O1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlamVjdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZXJyID09PSBDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRpYWxvZyBjYW5jZWxsZWRcIik7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBfYWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0YXN5bmMgb25BZnRlckFjdGlvbkV4ZWN1dGlvbihfYWN0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly90byBiZSBvdmVycmlkZGVuXG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleGVjdXRlIGNvZGUgb24gdGhlIG1hc3MgZWRpdCBzYXZlLlxuXHQgKiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBJZiB5b3UgZGVjaWRlIHRvIGRvIHlvdXIgb3duIHNhdmUgcHJvY2Vzc2luZywgeW91IGNhbiByZXR1cm4gYHRydWVgIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgc2F2ZSBiZWhhdmlvci5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uSW5zdGVhZH0uXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGN1c3RvbU1hc3NFZGl0U2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmFDb250ZXh0cyBBcnJheSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBjb250ZXh0cyBmb3IgdGhlIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLm9VcGRhdGVEYXRhIEEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eVBhdGggYW5kIGl0cyB2YWx1ZVxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBleGVjdXRpb24sIGBmYWxzZWAgdG8ga2VlcCB0aGUgc3RhbmRhcmQgYmVoYXZpb3Jcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS4xMzAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkluc3RlYWQpXG5cdGFzeW5jIGN1c3RvbU1hc3NFZGl0U2F2ZShfbVBhcmFtZXRlcnM6IHsgYUNvbnRleHRzOiBDb250ZXh0W107IG9VcGRhdGVEYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNlY3VyZWQgZXhlY3V0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4gRW5zdXJlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQuXG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNlY3VyZWRFeGVjdXRpb24oXG5cdFx0Zm5GdW5jdGlvbjogRnVuY3Rpb24sXG5cdFx0bVBhcmFtZXRlcnM/OiB7XG5cdFx0XHRidXN5Pzoge1xuXHRcdFx0XHRzZXQ/OiBib29sZWFuO1xuXHRcdFx0XHRjaGVjaz86IGJvb2xlYW47XG5cdFx0XHR9O1xuXHRcdFx0dXBkYXRlc0RvY3VtZW50PzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJCdXN5U2V0ID0gbVBhcmFtZXRlcnM/LmJ1c3k/LnNldCA/PyB0cnVlLFxuXHRcdFx0YkJ1c3lDaGVjayA9IG1QYXJhbWV0ZXJzPy5idXN5Py5jaGVjayA/PyB0cnVlLFxuXHRcdFx0YlVwZGF0ZXNEb2N1bWVudCA9IG1QYXJhbWV0ZXJzPy51cGRhdGVzRG9jdW1lbnQgPz8gZmFsc2UsXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLFxuXHRcdFx0b0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0YklzRHJhZnQgPSBvQ29udGV4dCAmJiB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQgYXMgQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQsXG5cdFx0XHRtZXNzYWdlSGFuZGxpbmdLZXkgPSB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVnaXN0ZXJUb0hvbGRNZXNzYWdlcygpO1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHR9XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhmbkZ1bmN0aW9uIGFzICgpID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+KVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7IHVuSG9sZEtleTogbWVzc2FnZUhhbmRsaW5nS2V5IH0pO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZVBhdGNoU2VudChvRXZlbnQ6IE9EYXRhQ29udGV4dEJpbmRpbmckUGF0Y2hTZW50RXZlbnQpOiB2b2lkIHtcblx0XHQvLyBJbiBjb2xsYWJvcmF0aXZlIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uLCBkaXNhYmxlIEVUYWcgY2hlY2sgZm9yIFBBVENIIHJlcXVlc3RzXG5cdFx0Y29uc3QgaW50ZXJuYWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3QgdWlDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwidWlcIik7XG5cdFx0Y29uc3QgaWdub3JlRVRhZyA9IHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuaXNDb25uZWN0ZWQoKSB8fCBpbnRlcm5hbENvbnRleHQuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyh0cnVlKTtcblx0XHR9XG5cdFx0aWYgKHVpQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJpc0VkaXRhYmxlXCIpID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gdGhlIHZpZXcgaXMgbm90IGluIGVkaXQgbW9kZSB0aGlzIG11c3QgYmUgaW5saW5lIGVkaXRcblx0XHRcdHRoaXMuYmFzZS5pbmxpbmVFZGl0Rmxvdy5oYW5kbGVJbmxpbmVFZGl0UGF0Y2hTZW50KG9FdmVudCk7XG5cdFx0fSBlbHNlIGlmICghaW50ZXJuYWxDb250ZXh0Py5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VCaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIHVua25vd24gYXMgT0RhdGFMaXN0QmluZGluZzsgLy8gRklYTUU6IFVJNSB0eXBlIHNheXMgdGhpcyBzaG91bGQgYmUgYW4gT0RhdGFDb250ZXh0QmluZGluZ1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogVUk1RXZlbnQ8eyBzdWNjZXNzOiBib29sZWFuIH0+KSA9PiB7XG5cdFx0XHRcdFx0Ly8gUmUtZW5hYmxlIEVUYWcgY2hlY2tzXG5cdFx0XHRcdFx0aWYgKGlnbm9yZUVUYWcpIHtcblx0XHRcdFx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuc2V0SWdub3JlRVRhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9FdmVudC5nZXRTb3VyY2UoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50QWZ0ZXJQYXRjaChcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUJpbmRpbmcsXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBiU3VjY2VzcyA9IHBhdGNoQ29tcGxldGVkRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdFx0XHRpZiAoYlN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51cGRhdGVEb2N1bWVudChzb3VyY2VCaW5kaW5nLCBvUGF0Y2hQcm9taXNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZUNyZWF0ZVNlbnQoZXZlbnQ6IFVJNUV2ZW50PHsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJjb250ZXh0XCIpO1xuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UsIGZhbHNlLCBjb250ZXh0LmdldFBhdGgoKSk7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKiBAcGFyYW0gW25ld1Rhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqL1xuXHRhc3luYyBzeW5jVGFzazxUPihuZXdUYXNrPzogKCgpID0+IFQpIHwgUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuXHRcdGlmIChuZXdUYXNrKSB7XG5cdFx0XHRpZiAodHlwZW9mIG5ld1Rhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzLnRoZW4obmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdExvZy5kZWJ1ZyhlcnIgYXMgc3RyaW5nKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzXG5cdFx0XHRcdFx0LnRoZW4oYXN5bmMgKCkgPT4gbmV3VGFzaylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycjogdW5rbm93bikge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKGVyciBhcyBzdHJpbmcpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrcyBhcyBQcm9taXNlPFQ+O1xuXHR9XG5cblx0LyoqXG5cdCAqIHVwZGF0ZXMgdGhlIFVJIGFuZCBpbnRlcm5hbCBtb2RlbHMgYWNjb3JkaW5nIHRoZSBlZGl0IG1vZGUgLlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgZGlzcGxheWVkIG9yIGVkaXRlZFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0IG1vZGUgaXMgY29tcHV0ZWRcblx0ICovXG5cblx0YXN5bmMgY29tcHV0ZU1vZGVsc0ZvckVkaXRNb2RlKGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHQpO1xuXG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCB0cnVlLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdFx0XHRcdGNvbnN0IG1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdFx0Y29uc3QgaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQgPSBNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbCEuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0XHRsZXQgZm9yY2VEaXNwbGF5TW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRjb25zdCBpc0FjdGl2ZUVudGl0eSA9IGF3YWl0IGNvbnRleHQucmVxdWVzdE9iamVjdChcIklzQWN0aXZlRW50aXR5XCIpO1xuXG5cdFx0XHRcdGlmIChpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCkge1xuXHRcdFx0XHRcdGZvcmNlRGlzcGxheU1vZGUgPSAhKGF3YWl0IHRoaXMuYmFzZS5jb2xsYWJvcmF0aXZlRHJhZnQuYWN0aXZhdGVDb2xsYWJvcmF0aW9uKGNvbnRleHQsIGlzQWN0aXZlRW50aXR5KSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaGFzQ29sbGFib3JhdGlvbkF1dGhvcml6YXRpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmZldGNoQ29sbGFib3JhdGl2ZURyYWZ0VXNlcnNQcm9taXNlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoaXNBY3RpdmVFbnRpdHkgPT09IGZhbHNlICYmICFmb3JjZURpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdFx0Ly8gaW4gY2FzZSB0aGUgZG9jdW1lbnQgaXMgZHJhZnQsIHNldCBpdCBpbiBlZGl0IG1vZGVcblx0XHRcdFx0XHQvLyB1bmxlc3Mgd2UgZG9uJ3QgaGF2ZSB0aGUgYXV0aG9yaXphdGlvbiBmb3IgYSBjb2xsYWJvcmF0aXZlIHVzZXJcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRjb25zdCBoYXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFoYXNBY3RpdmVFbnRpdHkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFjdGl2ZSBkb2N1bWVudCwgc3RheSBvbiBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRldGVybWluaW5nIHRoZSBlZGl0TW9kZSBmb3IgZHJhZnRcIiwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBsYXN0SW52b2tlZEFjdGlvbk5hbWUgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiKTtcblx0XHRcdGlmIChsYXN0SW52b2tlZEFjdGlvbk5hbWUgJiYgdGhpcy5pc05ld0FjdGlvbkZvclN0aWNreShsYXN0SW52b2tlZEFjdGlvbk5hbWUsIGNvbnRleHQpKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihjb250ZXh0KTtcblx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyh0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCksIGNvbnRleHQuZ2V0TW9kZWwoKSk7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHJpdmF0ZSBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0LyoqXG5cdCAqIEludGVybmFsIG1ldGhvZCB0byBkZWxldGUgYSBjb250ZXh0IG9yIGFuIGFycmF5IG9mIGNvbnRleHRzLlxuXHQgKiBAcGFyYW0gY29udGV4dHMgVGhlIGNvbnRleHQocykgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBQYXJhbWV0ZXJzIGZvciBkZWxldGlvblxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFja1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuY29udHJvbElkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2xcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm5vRGlhbG9nXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLnRpdGxlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c1xuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy51blNhdmVkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHNcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMuZHJhZnRzV2l0aERlbGV0YWJsZUFjdGl2ZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZGVsZXRpb24gaXMgY29tcGxldGVkXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oXG5cdFx0Y29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10sXG5cdFx0cGFyYW1ldGVyczoge1xuXHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s/OiBGdW5jdGlvbjtcblx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0cz86IGJvb2xlYW47XG5cdFx0XHRjb250cm9sSWQ/OiBzdHJpbmc7XG5cdFx0XHRwYXJlbnRDb250cm9sPzogQ29udHJvbDtcblx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM/OiBib29sZWFuO1xuXHRcdFx0bm9EaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0c2VsZWN0ZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGludGVybmFsTW9kZWxDb250ZXh0PzogSW50ZXJuYWxNb2RlbENvbnRleHQgfCBudWxsO1xuXHRcdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0XHRkZXNjcmlwdGlvbj86IHN0cmluZyB8IHsgcGF0aDogc3RyaW5nIH07XG5cdFx0XHRudW1iZXJPZlNlbGVjdGVkQ29udGV4dHM/OiBudW1iZXI7XG5cdFx0XHR1blNhdmVkQ29udGV4dHM/OiBDb250ZXh0W107XG5cdFx0XHRsb2NrZWRDb250ZXh0cz86IENvbnRleHRbXTtcblx0XHRcdGRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmU/OiBEcmFmdFNpYmxpbmdQYWlyW107XG5cdFx0XHRkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlPzogQ29udGV4dFtdO1xuXHRcdH1cblx0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKHBhcmFtZXRlcnMuc2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0Ly8gYXMgc2VsZWN0ZWQgY29udGV4dHMgbWF5IGluY2x1ZGUgaW5hY3RpdmUgY29udGV4dCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhpcyBwYXJhbWV0ZXIgYWdhaW4gdG8gZW5zdXJlIGRlbGV0ZSBoZWxwZXIgd29ya3MgcHJvcGVybHlcblx0XHRcdHBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gcGFyYW1ldGVycy5zZWxlY3RlZENvbnRleHRzLmxlbmd0aDtcblx0XHR9XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgc2V0dGluZyBhbmQgcmVtb3Zpbmcgb2YgY29udGV4dHMgc2hvdWxkbid0IGJlIGluIHRoZSB0cmFuc2FjdGlvbiBoZWxwZXIgYXQgYWxsXG5cdFx0Ly8gZm9yIHRoZSB0aW1lIGJlaW5nIEkga2VwdCBpdCBhbmQgcHJvdmlkZSB0aGUgaW50ZXJuYWwgbW9kZWwgY29udGV4dCB0byBub3QgYnJlYWsgc29tZXRoaW5nXG5cdFx0aWYgKHBhcmFtZXRlcnMuY29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VDb250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHRpZiAoc291cmNlQ29udHJvbCAmJiAhc291cmNlQ29udHJvbC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpKSB7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGRlbGV0ZSBpcyB0cmlnZ2VyZWQgZnJvbSBhIE11bHRpVmFsdWVGaWVsZCwgd2UgZG9uJ3QgdXNlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IGFzIHRoZSBNVkYgZG9lc24ndCBoYXZlXG5cdFx0XHRcdC8vIHN1Y2ggYSBjb250ZXh0IG9mIGl0cyBvd24sIGFuZCB3ZSBkb24ndCB3YW50IHRvIHVzZSBpdHMgcGFyZW50IGNvbnRleHQgKGUuZy4gZnJvbSB0aGUgZW1iZWRkaW5nIFRhYmxlKVxuXHRcdFx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gc291cmNlQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQoY29udGV4dHMsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHJlc291cmNlTW9kZWwsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VNb2RlbCgpOiBSZXNvdXJjZU1vZGVsIHtcblx0XHRyZXR1cm4gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFRyYW5zYWN0aW9uSGVscGVyKCk6IHR5cGVvZiBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdFx0cmV0dXJuIFRyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXNzYWdlSGFuZGxlcigpOiBNZXNzYWdlSGFuZGxlciB7XG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldFBhZ2VJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwicGFnZUludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3QgcGFnZUludGVybmFsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpIGFzIENvbnRleHQ7XG5cdFx0dGhpcy5nZXRQYWdlSW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuQ3JlYXRlTW9kZSwgYkNyZWF0aW9uTW9kZSwgcGFnZUludGVybmFsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0Z2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhZ2VJbnRlcm5hbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInBhZ2VJbnRlcm5hbFwiKSBhcyBDb250ZXh0O1xuXHRcdHJldHVybiAhIXBhZ2VJbnRlcm5hbENvbnRleHQuZ2V0UHJvcGVydHkoVWlNb2RlbENvbnN0YW50cy5DcmVhdGVNb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdGlzRG9jdW1lbnRNb2RpZmllZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShVaU1vZGVsQ29uc3RhbnRzLkRvY3VtZW50TW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQuXG5cdCAqIEBwYXJhbSBtb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFVpTW9kZWxDb25zdGFudHMuRG9jdW1lbnRNb2RpZmllZCwgbW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCBoYXMgYmVlbiBtb2RpZmllZCBieSBjcmVhdGluZyBhIHN1Yi1vYmplY3QuXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIG9uIHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqIEBwYXJhbSBiaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlRXZlbnRzKGJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZyk7XG5cdFx0Ly8gV2Ugc3RvcmUga2V5IHNldHMgKGNvbnRleHQgKyBrZXkpIGFzIHRoZSBjcmVhdGlvbiBpbnRlcmFjdGlvbiBtaWdodCBpbnZvbHZlIG11bHRpcGxlIGNyZWF0aW9ucy5cblx0XHRjb25zdCBtZXNzYWdlSGFuZGxpbmdLZXlTZXRzOiB7IGNvbnRleHQ6IENvbnRleHQ7IG1lc3NhZ2VIYW5kbGluZ0tleTogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZVNlbnRcIiwgKGV2ZW50SW5zdGFuY2U6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbjsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY29udGV4dCA9IGV2ZW50SW5zdGFuY2UuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKTtcblx0XHRcdGxldCBtZXNzYWdlSGFuZGxpbmdLZXkgPSBtZXNzYWdlSGFuZGxpbmdLZXlTZXRzLmZpbmQoKGluZm8pID0+IGluZm8uY29udGV4dCA9PT0gY29udGV4dCk/Lm1lc3NhZ2VIYW5kbGluZ0tleTtcblx0XHRcdGlmICghbWVzc2FnZUhhbmRsaW5nS2V5KSB7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleSA9IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZWdpc3RlclRvSG9sZE1lc3NhZ2VzKCk7XG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZ0tleVNldHMucHVzaCh7IGNvbnRleHQsIG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlQ29tcGxldGVkXCIsIChvRXZlbnQ6IFVJNUV2ZW50PHsgc3VjY2VzczogYm9vbGVhbjsgY29udGV4dDogQ29udGV4dCB9Pik6IHZvaWQgPT4ge1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpLFxuXHRcdFx0XHRjb250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIik7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKHN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGluZ0tleSA9IG1lc3NhZ2VIYW5kbGluZ0tleVNldHMuZmluZCgoaW5mbykgPT4gaW5mby5jb250ZXh0ID09PSBjb250ZXh0KT8ubWVzc2FnZUhhbmRsaW5nS2V5O1xuXHRcdFx0aWYgKG1lc3NhZ2VIYW5kbGluZ0tleSkge1xuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coeyB1bkhvbGRLZXk6IG1lc3NhZ2VIYW5kbGluZ0tleSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZSAoZGlzcGxheWVkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UpLlxuXHQgKiBAcGFyYW0gZHJhZnRTdGF0dXMgVGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlXG5cdCAqL1xuXHRzZXREcmFmdFN0YXR1cyhkcmFmdFN0YXR1czogc3RyaW5nKTogdm9pZCB7XG5cdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBkcmFmdFN0YXR1cywgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIGEgYmluZGluZyBvciBhIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgVGhlIGJpbmRpbmcgb3IgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICogQHBhcmFtIGVkaXRNb2RlIFRoZSBlZGl0IG1vZGVcblx0ICogQHBhcmFtIGlzQ3JlYXRpb24gVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG5ld2x5IGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RWRpdE1vZGUoZWRpdE1vZGU/OiBzdHJpbmcsIGlzQ3JlYXRpb24/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKGVkaXRNb2RlKSB7XG5cdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIGVkaXRNb2RlID09PSBcIkVkaXRhYmxlXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRpZiAoZWRpdE1vZGUgIT09IFwiRWRpdGFibGVcIikge1xuXHRcdFx0XHR0aGlzLmZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmbGFnIHRvIGZvcmNlIFNhdmUgb3IgRGlzY2FyZCB3aGVuIGxlYXZpbmcgYSBkcmFmdC5cblx0ICogQHBhcmFtIGZvcmNlZFxuXHQgKi9cblx0cHJpdmF0ZSBmb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZChmb3JjZWQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9mb3JjZURyYWZ0U2F2ZU9yRGlzY2FyZFwiLCBmb3JjZWQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHdlIHNob3VsZCBmb3JjZSB0aGUgdXNlciB0byBTYXZlIG9yIERpc2NhcmQgd2hlbiBsZWF2aW5nIGEgZHJhZnQsIG9yIGlmIGtlZXBpbmcgdGhlIGRyYWZ0IGlzIGFsbG93ZWQuXG5cdCAqIEByZXR1cm5zIFRydWUgaWYga2VlcGluZyB0aGUgZHJhZnQgaXMgbm90IGFsbG93ZWRcblx0ICovXG5cdHNoYWxsRm9yY2VEcmFmdFNhdmVPckRpc2NhcmQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2ZvcmNlRHJhZnRTYXZlT3JEaXNjYXJkXCIpID09PSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbiBhY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBjcmVhdGUgYWN0aW9uIGZvciBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgYSBjcmVhdGUgYWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGlzTmV3QWN0aW9uRm9yU3RpY2t5KGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdGNvbnN0IHN0aWNreVNlc3Npb24gPSBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDtcblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5OZXdBY3Rpb24gPT09IGFjdGlvbk5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMgJiYgc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMuaW5jbHVkZXMoYWN0aW9uTmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyBNb3ZlIGFsbCBzdGlja3ktcmVsYXRlZCBiZWxvdyB0byBhIHN0aWNreSBzZXNzaW9uIG1hbmFnZXIgY2xhc3NcblxuXHQvKipcblx0ICogRW5hYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgaGFuZGxlU3RpY2t5T24oY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRhd2FpdCBhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMsIGNvbnRleHQpKTtcblxuXHRcdFx0XHQvLyBBdHRhY2ggc3RpY2t5IHNlc3Npb24gY2FsbGJhY2tzXG5cdFx0XHRcdGNvbnN0IGkxOG5Nb2RlbCA9IHRoaXMuYmFzZS5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LnJlZ2lzdGVyU3RpY2t5U2Vzc2lvbkNhbGxiYWNrcyhcblx0XHRcdFx0XHR0aGlzLmdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQsIGludGVybmFsTW9kZWwsIGhhc2hUcmFja2VyKSxcblx0XHRcdFx0XHR0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKSxcblx0XHRcdFx0XHR0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPZmYoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LnVucmVnaXN0ZXJTdGlja3lTZXNzaW9uQ2FsbGJhY2tzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQudW5yZWdpc3RlclN0aWNreVNlc3Npb25DYWxsYmFja3MoKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCk6IHZvaWQge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCBtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIERpcnR5U3RhdGVQcm92aWRlciBpbiB0aGUgU2hlbGwuXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgVGhlIG1vZGVsIFwiaW50ZXJuYWxcIlxuXHQgKiBAcGFyYW0gaGFzaFRyYWNrZXIgSGFzaCB0cmFja2VyXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgaGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiAobmF2aWdhdGlvbkNvbnRleHQ6IHsgaW5uZXJBcHBSb3V0ZTogc3RyaW5nIH0pOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBEaXJ0eVN0YXRlUHJvdmlkZXIgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXRIYXNoID0gbmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZTtcblx0XHRcdFx0Y29uc3Qgcm91dGVyUHJveHkgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IGxjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGlzRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGlzU2Vzc2lvbk9uID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFpc1Nlc3Npb25Pbikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpOiB1bmRlZmluZWQgfCBib29sZWFuID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCk6IHZvaWQgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRcdFx0XHR3YXJuaW5nRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KHdhcm5pbmdEaWFsb2cpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG9uUm91dGVNYXRjaGVkIGV2ZW50IGluIGNhc2Ugb2Ygc3RpY2t5IGVkaXRpb24uXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuICgpOiB2b2lkID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIWN1cnJlbnRIYXNoIHx8ICFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoY3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5jbGVhclNlc3Npb25Db250ZXh0KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXNDcmVhdGlvbiA9IHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCk7IC8vIFN0b3JlIHRoaXMgdmFsdWUgaW4gYSB2YXJpYWJsZSwgYXMgaXQgd2lsbCBiZSByZXNldCBpbiBoYW5kbGVTdGlja3lPZmZcblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpOyAvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBiZWZvcmUgY2FsbGluZyB0aGUgYXN5bmMgbWV0aG9kIG9uIHRoZSBzZXJ2ZXIsIG90aGVyd2lzZSB0aGV5IHdpbGwgY29uZmxpY3Qgd2l0aCBSb3V0ZVByb3h5LnJlc3RvcmVIaXN0b3J5IHRoYXQgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXG5cdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQoY29udGV4dCk7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIWlzQ3JlYXRpb24pIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb24uXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbFJvdXRpbmcoKTogSW50ZXJuYWxSb3V0aW5nIHtcblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk6IFJvb3RWaWV3QmFzZUNvbnRyb2xsZXIge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHJldHVybnMgVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpOiB7IGZSZXNvbHZlcjogRnVuY3Rpb247IGZSZWplY3RvcjogRnVuY3Rpb24gfSB7XG5cdFx0bGV0IHJlc29sdmVGdW5jdGlvbjogRnVuY3Rpb24sIHJlamVjdEZ1bmN0aW9uOiBGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZTxQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZ1bmN0aW9uID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZ1bmN0aW9uID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKHJlc3BvbnNlOiBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PE9wZXJhdGlvblJlc3VsdD5bXSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjb250cm9sSWQgfSwgdGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKGFjdGlvbk5hbWUsIHJlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiByZXNvbHZlRnVuY3Rpb24hLCBmUmVqZWN0b3I6IHJlamVjdEZ1bmN0aW9uISB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhcblx0XHRhY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0cmVzcG9uc2U6IFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8T3BlcmF0aW9uUmVzdWx0PltdXG5cdCk6IHsgb0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID49IDEpIHtcblx0XHRcdGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbERhdGEgPSAoY3VycmVudFZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXREYXRhKCkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsQWN0aW9uID0gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXSBhcyBNZXRhTW9kZWxBY3Rpb25bXSB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGFjdGlvblJldHVyblR5cGUgPSBtZXRhTW9kZWxBY3Rpb24/LlswXS4kUmV0dXJuVHlwZSA/IG1ldGFNb2RlbEFjdGlvbj8uWzBdLiRSZXR1cm5UeXBlLiRUeXBlIDogbnVsbDtcblx0XHRcdGNvbnN0IGtleXMgPVxuXHRcdFx0XHRhY3Rpb25SZXR1cm5UeXBlICYmIChtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdIGFzIE1ldGFNb2RlbEVudGl0eVR5cGUpXG5cdFx0XHRcdFx0PyAobWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSBhcyBNZXRhTW9kZWxFbnRpdHlUeXBlKS4kS2V5XG5cdFx0XHRcdFx0OiBbXTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG9EYXRhOiByZXNwb25zZVswXS52YWx1ZS5ib3VuZENvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRcdGtleXNcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpOiBQcm9taXNlPHsgY29udHJvbElkPzogc3RyaW5nOyBvRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTogdm9pZCB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgc2hvd0NvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2coaXNTYXZlOiBib29sZWFuKTogUHJvbWlzZTxSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uIHwgdW5kZWZpbmVkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2cpIHtcblx0XHRcdHRoaXMuY29uZmlybVJlY29tbWVuZGF0aW9uc0RpYWxvZyA9IG5ldyBDb25maXJtUmVjb21tZW5kYXRpb25EaWFsb2coe1xuXHRcdFx0XHR2aWV3OiB0aGlzLmdldFZpZXcoKVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbmZpcm1SZWNvbW1lbmRhdGlvbnNEaWFsb2c/Lm9wZW4oaXNTYXZlKTtcblx0fVxuXG5cdF9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGU6IFRhYmxlKTogdm9pZCB7XG5cdFx0Y29uc3Qgcm93QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRjb25zdCBhY3RpdmVSb3dJbmRleDogbnVtYmVyID0gcm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKHRhYmxlLmRhdGEoXCJ0YWJsZVR5cGVcIikgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChhY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChhY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBJbiBhIHJlc3BvbnNpdmUgdGFibGUsIHRoZSBlbXB0eSByb3dzIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZS4gQnV0IHdoZW4gd2UgY3JlYXRlIG1vcmUsIHRoZXkgYXBwZWFyIGJlbG93IHRoZSBuZXcgbGluZS5cblx0XHRcdCAqIFNvIHdlIGNoZWNrIHRoZSBmaXJzdCBpbmFjdGl2ZSByb3cgZmlyc3QsIHRoZW4gd2Ugc2V0IHRoZSBmb2N1cyBvbiBpdCB3aGVuIHdlIHByZXNzIHRoZSBidXR0b24uXG5cdFx0XHQgKiBUaGlzIGRvZXNuJ3QgaW1wYWN0IHRoZSBHcmlkVGFibGUgYmVjYXVzZSB0aGV5IGFwcGVhciBhdCB0aGUgZW5kLCBhbmQgd2UgYWxyZWFkeSBmb2N1cyB0aGUgYmVmb3JlLXRoZS1sYXN0IHJvdyAoYmVjYXVzZSAyIGVtcHR5IHJvd3MgZXhpc3QpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFsbFJvd0NvbnRleHRzID0gcm93QmluZGluZy5nZXRBbGxDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdGlmICghYWxsUm93Q29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBmb2N1c1JvdyA9IGFjdGl2ZVJvd0luZGV4LFxuXHRcdFx0XHRpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHNpbmdsZUNvbnRleHQgb2YgYWxsUm93Q29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNpbmdsZUNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZGV4IDwgZm9jdXNSb3cpIHtcblx0XHRcdFx0XHRmb2N1c1JvdyA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9jdXNSb3cgPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoZm9jdXNSb3cpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coZm9jdXNSb3csIHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzKHRhYmxlOiBUYWJsZSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0aWYgKFxuXHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSAmJlxuXHRcdFx0IXRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwicGFnZUludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZyxcblx0XHRyZWZyZXNoTGlzdEJpbmRpbmc/OiBib29sZWFuLFxuXHRcdGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXM/OiBzdHJpbmdbXVxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZW50ID0gQXJyYXkuaXNBcnJheShyZWxhdGVkQ29udGV4dHMpID8gcmVsYXRlZENvbnRleHRzLm1hcCgoY29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpIDogcmVsYXRlZENvbnRleHRzPy5nZXRQYXRoKCk7XG5cdFx0dGhpcy5iYXNlLmNvbGxhYm9yYXRpdmVEcmFmdC5zZW5kKHsgYWN0aW9uLCBjb250ZW50LCB0cmlnZ2VyZWRBY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMgfSk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IFRyaWdnZXJUeXBlKTogdm9pZCB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5iYXNlLmdldFZpZXcoKSwgc0FjdGlvbk5hbWUsIHRyaWdnZXJUeXBlKTtcblx0fVxuXG5cdGFzeW5jIF9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IChvTW9kZWwub1JlcXVlc3RvciBhcyB1bmtub3duIGFzIHsgd2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0czogRnVuY3Rpb24gfSkud2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyhcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhbGwgY2hhbmdlcyB3ZXJlIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcblx0XHRcdGlmIChvTW9kZWwuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdWJtaXQgb2Ygb3BlbiBjaGFuZ2VzIGZhaWxlZFwiKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCByb3V0ZXJQcm94eSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChyb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRzdGlja3kucHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dmlldyxcblx0XHRcdFx0UHJvZ3JhbW1pbmdNb2RlbC5TdGlja3lcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aGlzdG9yeS5iYWNrKCk7XG5cdH1cblxuXHRhc3luYyBfaGFuZGxlTmV3Q29udGV4dChcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRuYXZpZ2F0aW9uUGFyYW1ldGVyczogeyBlZGl0YWJsZTogYm9vbGVhbjsgcmVjcmVhdGVDb250ZXh0OiBib29sZWFuOyBmb3JjZUZvY3VzPzogYm9vbGVhbiB9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IG5hdmlnYXRpb25QYXJhbWV0ZXJzLmVkaXRhYmxlLFxuXHRcdFx0cGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0cmVjcmVhdGVDb250ZXh0OiBuYXZpZ2F0aW9uUGFyYW1ldGVycy5yZWNyZWF0ZUNvbnRleHQsXG5cdFx0XHRyZWFzb246IE5hdmlnYXRpb25SZWFzb24uRWRpdEZsb3dBY3Rpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0Zm9yY2VGb2N1czogbmF2aWdhdGlvblBhcmFtZXRlcnMuZm9yY2VGb2N1cyA/PyBmYWxzZSxcblx0XHRcdGtlZXBDdXJyZW50TGF5b3V0OiB0cnVlXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHQuXG5cdCAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3XG5cdCAqIEBwYXJhbSBwYXJhbXMgVGhlIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIHBhcmFtcy5jb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEBwYXJhbSBwYXJhbXMuaXNOYXZpZ2FibGUgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIG5hdmlnYWJsZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gbmVlZHMgdG8gcmV0dXJucyB0aGUgYm91bmQgY29udGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRfZ2V0Qm91bmRDb250ZXh0KHZpZXc6IEZFVmlldywgcGFyYW1zOiB7IGNvbnRyb2xJZD86IHN0cmluZzsgaXNOYXZpZ2FibGU/OiBib29sZWFuIH0pOiBib29sZWFuIHtcblx0XHQvL1RoaXMgd2VpcmQgY29uZGl0aW9uIGlzIG5lZWRlZCB0byBhdm9pZCBuYXZpZ2F0aW9uIGluIGNhc2Ugb2Ygc29tZSBhY3Rpb25zIGludG8gdGhlIHRhYmxlXG5cdFx0Ly8gdGhpcyBkZWZpbml0ZWx5IG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgdG8gZ2V0IGNsZWFyIGNvbmRpdGlvbiB3aGVyZSBuYXZpZ2F0aW9uIG5lZWRzIHRvIGJlIGRvbmUgb3Igbm90XG5cdFx0Ly8gU05PVzogRElOQzAyNzg0OTBcblx0XHRjb25zdCB2aWV3TGV2ZWwgPSB2aWV3LmdldFZpZXdEYXRhKCkudmlld0xldmVsO1xuXHRcdGNvbnN0IGJSZWZyZXNoQWZ0ZXJBY3Rpb24gPSB2aWV3TGV2ZWwgPiAxIHx8ICh2aWV3TGV2ZWwgPT09IDEgJiYgcGFyYW1zLmNvbnRyb2xJZCk7XG5cdFx0cmV0dXJuICFwYXJhbXMuaXNOYXZpZ2FibGUgfHwgISFiUmVmcmVzaEFmdGVyQWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiAocGFyc2UpIGVycm9ycyBmb3IgY29udHJvbHMgYm91bmQgdG8gYSBnaXZlbiBjb250ZXh0XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdGFzeW5jIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQgfCB2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHZpc2libGVWaWV3SWRzID0gdGhpcy5faXNGY2xFbmFibGVkKClcblx0XHRcdFx0PyAodGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgRmNsQ29udHJvbGxlcikuX2dldEFsbFZpc2libGVWaWV3cygpLm1hcCgodmlldykgPT4gdmlldy5nZXRJZCgpKVxuXHRcdFx0XHQ6IFt0aGlzLmdldFZpZXcoKS5nZXRJZCgpXTtcblx0XHRcdGNvbnN0IGFNZXNzYWdlcyA9IE1lc3NhZ2luZy5nZXRNZXNzYWdlTW9kZWwoKS5nZXREYXRhKCk7XG5cdFx0XHRsZXQgb0NvbnRyb2w7XG5cblx0XHRcdGlmICghYU1lc3NhZ2VzLmxlbmd0aCkge1xuXHRcdFx0XHRMb2cuaW5mbyhcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgbWVzc2FnZSBvZiBhTWVzc2FnZXMpIHtcblx0XHRcdFx0aWYgKG1lc3NhZ2UudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdG9Db250cm9sID0gRWxlbWVudC5nZXRFbGVtZW50QnlJZChtZXNzYWdlLmdldENvbnRyb2xJZCgpKTtcblx0XHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRcdGlmICh2aXNpYmxlVmlld0lkcy5pbmNsdWRlcyhvQ29udHJvbC5nZXRJZCgpKSkge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBcInZhbGlkYXRpb24gZXJyb3JzIGV4aXN0XCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlLm9EYXRhXG5cdCAqIEBwYXJhbSBvUmVzcG9uc2Uua2V5c1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBQcm9taXNlIGlmIHRoZSBsaXN0IHdhcyByZWZyZXNoZWRcblx0ICovXG5cdGFzeW5jIF9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0b1Jlc3BvbnNlPzogeyBvRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBrZXlzPzogc3RyaW5nW10gfCBudWxsIH0sXG5cdFx0b0NvbnRleHQ/OiBDb250ZXh0XG5cdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghb0NvbnRleHQgfHwgIW9SZXNwb25zZSB8fCAhb1Jlc3BvbnNlLm9EYXRhIHx8ICFvUmVzcG9uc2Uua2V5cykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBPE9EYXRhTGlzdEJpbmRpbmc+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkucmVmcmVzaExpc3RCaW5kaW5nKG9CaW5kaW5nLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBwYXRocyA9IGFTZW1hbnRpY0tleXMubWFwKChvS2V5KSA9PiBvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0YXdhaXQgb0NvbnRleHQucmVxdWVzdFByb3BlcnR5KHBhdGhzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIGxhdGVzdCBjb250ZXh0IGluIHRoZSBtZXRhZGF0YSBoaWVyYXJjaHkgZnJvbSByb290QmluZGluZyB0byBnaXZlbiBjb250ZXh0IHBvaW50aW5nIHRvIGdpdmVuIGVudGl0eVR5cGVcblx0ICogaWYgYW55IHN1Y2ggY29udGV4dCBleGlzdHMuIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgb3JpZ2luYWwgY29udGV4dC5cblx0ICogTm90ZTogSXQgaXMgb25seSBuZWVkZWQgYXMgd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcuIENvcnJlY3QgbW9kZWxsaW5nIHdvdWxkIGltcGx5IGEgRGF0YUZpZWxkRm9yQWN0aW9uIGluIGEgTGluZUl0ZW1cblx0ICogdG8gcG9pbnQgdG8gYW4gb3ZlcmxvYWQgZGVmaW5lZCBlaXRoZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgRW50aXR5VHlwZSBvciBhIGNvbGxlY3Rpb24gb2YgdGhlIHNhbWUuXG5cdCAqIEBwYXJhbSByb290Q29udGV4dCBUaGUgY29udGV4dCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gb3ZlcmxvYWRFbnRpdHlUeXBlIFRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHkgdHlwZSB0byBzZWFyY2ggZm9yXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eVxuXHQgKi9cblx0X2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgocm9vdENvbnRleHQ6IENvbnRleHQsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBvdmVybG9hZEVudGl0eVR5cGU6IHN0cmluZyk6IENvbnRleHQge1xuXHRcdGNvbnN0IG1vZGVsOiBPRGF0YU1vZGVsID0gcm9vdENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCBtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IGNvbnRleHRTZWdtZW50czogc3RyaW5nW10gPSBsaXN0QmluZGluZy5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBjdXJyZW50Q29udGV4dDogQ29udGV4dCA9IHJvb3RDb250ZXh0O1xuXG5cdFx0Ly8gV2UgZXhwZWN0IHRoYXQgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgbGlzdEJpbmRpbmcgaXMgdGhlIExpc3RCaW5kaW5nIG9mIHRoZSB0YWJsZS4gUmVtb3ZlIHRoaXMgZnJvbSBjb250ZXh0U2VnbWVudHNcblx0XHQvLyBiZWNhdXNlIGl0IGlzIGluY29ycmVjdCB0byBleGVjdXRlIGJpbmRDb250ZXh0IG9uIGEgbGlzdC4gV2UgZG8gbm90IGFueXdheSBuZWVkIHRvIHNlYXJjaCB0aGlzIGNvbnRleHQgZm9yIHRoZSBvdmVybG9hZC5cblx0XHRjb250ZXh0U2VnbWVudHMucG9wKCk7XG5cdFx0aWYgKGNvbnRleHRTZWdtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cyA9IFtcIlwiXTsgLy8gRG9uJ3QgbGVhdmUgY29udGV4dFNlZ21lbnRzIHVuZGVmaW5lZFxuXHRcdH1cblxuXHRcdGlmIChjb250ZXh0U2VnbWVudHNbMF0gIT09IFwiXCIpIHtcblx0XHRcdGNvbnRleHRTZWdtZW50cy51bnNoaWZ0KFwiXCIpOyAvLyB0byBhbHNvIGdldCB0aGUgcm9vdCBjb250ZXh0LCBpLmUuIHRoZSBiaW5kaW5nQ29udGV4dCBvZiB0aGUgdGFibGVcblx0XHR9XG5cdFx0Ly8gbG9hZCBhbGwgdGhlIHBhcmVudCBjb250ZXh0cyBpbnRvIGFuIGFycmF5XG5cdFx0Y29uc3QgcGFyZW50Q29udGV4dHM6IENvbnRleHRbXSA9IGNvbnRleHRTZWdtZW50c1xuXHRcdFx0Lm1hcCgocGF0aFNlZ21lbnQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRpZiAocGF0aFNlZ21lbnQgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KHBhdGhTZWdtZW50LCBjdXJyZW50Q29udGV4dCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRpbmcgYSBuZXcgY29udGV4dCB1c2luZyBiaW5kQ29udGV4dCguLi4pLmdldEJvdW5kQ29udGV4dCgpIGRvZXMgbm90IHdvcmsgaWYgdGhlIGV0YWcgaXMgbmVlZGVkLiBBY2NvcmRpbmcgdG8gbW9kZWwgY29sbGVhZ3Vlcyxcblx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgYWx3YXlzIHVzZSBhbiBleGlzdGluZyBjb250ZXh0IGlmIHBvc3NpYmxlLlxuXHRcdFx0XHRcdC8vIEN1cnJlbnRseSwgdGhlIG9ubHkgZXhhbXBsZSB3ZSBrbm93IGFib3V0IGlzIHVzaW5nIHRoZSByb290Q29udGV4dCAtIGFuZCBpbiB0aGlzIGNhc2UsIHdlIGNhbiBvYnZpb3VzbHkgcmV1c2UgdGhhdCBleGlzdGluZyBjb250ZXh0LlxuXHRcdFx0XHRcdC8vIElmIG90aGVyIGV4YW1wbGVzIHNob3VsZCBjb21lIHVwLCB0aGUgYmVzdCBwb3NzaWJsZSB3b3JrIGFyb3VuZCB3b3VsZCBiZSB0byByZXF1ZXN0IHNvbWUgZGF0YSB0byBnZXQgYW4gZXhpc3RpbmcgY29udGV4dC4gVG8ga2VlcCB0aGVcblx0XHRcdFx0XHQvLyByZXF1ZXN0IGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBzaG91bGQgcmVxdWVzdCBvbmx5IHRoZSBmaXJzdCBrZXkgcHJvcGVydHkuIEFzIHRoaXMgd291bGQgaW50cm9kdWNlIGFzeW5jaHJvbmlzbSwgYW5kIGFueXdheVxuXHRcdFx0XHRcdC8vIHRoZSB3aG9sZSBsb2dpYyBpcyBvbmx5IHBhcnQgb2Ygd29yay1hcm91bmQgZm9yIGluY29ycmVjdCBtb2RlbGxpbmcsIHdlIHdhaXQgdW50aWwgd2UgaGF2ZSBhbiBleGFtcGxlIG5lZWRpbmcgaXQgYmVmb3JlIGltcGxlbWVudGluZyB0aGlzLlxuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuXHRcdFx0fSlcblx0XHRcdC5yZXZlcnNlKCk7XG5cdFx0Ly8gc2VhcmNoIGZvciBjb250ZXh0IGJhY2t3YXJkc1xuXHRcdGNvbnN0IG92ZXJsb2FkQ29udGV4dDogQ29udGV4dCB8IHVuZGVmaW5lZCA9IHBhcmVudENvbnRleHRzLmZpbmQoXG5cdFx0XHQocGFyZW50Q29udGV4dDogQ29udGV4dCkgPT5cblx0XHRcdFx0KG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChwYXJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiJFR5cGVcIikgYXMgdW5rbm93biBhcyBzdHJpbmcpID09PSBvdmVybG9hZEVudGl0eVR5cGVcblx0XHQpO1xuXHRcdHJldHVybiBvdmVybG9hZENvbnRleHQgfHwgbGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpITtcblx0fVxuXG5cdF9jcmVhdGVTaWJsaW5nSW5mbyhjdXJyZW50Q29udGV4dDogQ29udGV4dCwgbmV3Q29udGV4dDogQ29udGV4dCk6IFNpYmxpbmdJbmZvcm1hdGlvbiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldENvbnRleHQ6IG5ld0NvbnRleHQsXG5cdFx0XHRwYXRoTWFwcGluZzogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b2xkUGF0aDogY3VycmVudENvbnRleHQuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdG5ld1BhdGg6IG5ld0NvbnRleHQuZ2V0UGF0aCgpXG5cdFx0XHRcdH1cblx0XHRcdF1cblx0XHR9O1xuXHR9XG5cblx0X3VwZGF0ZVBhdGhzSW5IaXN0b3J5KG1hcHBpbmdzOiB7IG9sZFBhdGg6IHN0cmluZzsgbmV3UGF0aDogc3RyaW5nIH1bXSk6IHZvaWQge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXRQYXRoTWFwcGluZyhtYXBwaW5ncyk7XG5cblx0XHQvLyBBbHNvIHVwZGF0ZSB0aGUgc2VtYW50aWMgbWFwcGluZyBpbiB0aGUgcm91dGluZyBzZXJ2aWNlXG5cdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdGlmIChtYXBwaW5ncy5sZW5ndGggJiYgbGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ub2xkUGF0aCkge1xuXHRcdFx0bGFzdFNlbWFudGljTWFwcGluZy50ZWNobmljYWxQYXRoID0gbWFwcGluZ3NbbWFwcGluZ3MubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHR9XG5cdH1cblxuXHRfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQoXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRuZXdEb2N1bWVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0c2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZFxuXHQpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gbmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBjb250ZXh0LmdldFBhdGgoKSA9PT0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgPyBjb250ZXh0IDogc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbnRleHRUb05hdmlnYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaWJsaW5nIGNvbnRleHQgZm9yIGEgc3Vib2JqZWN0IHBhZ2UsIGFuZCBjYWxjdWxhdGVzIGEgc2libGluZyBwYXRoXG5cdCAqIGZvciBhbGwgaW50ZXJtZWRpYXRlIHBhdGhzIGJldHdlZW4gdGhlIG9iamVjdCBwYWdlIGFuZCB0aGUgc3Vib2JqZWN0IHBhZ2UuXG5cdCAqIEBwYXJhbSByb290Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcGFyYW0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIHN1Ym9iamVjdFxuXHQgKiBAcGFyYW0gc1Byb2dyYW1taW5nTW9kZWwgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqIEBwYXJhbSBkb05vdENvbXB1dGVJZlJvb3QgSWYgdHJ1ZSwgd2UgZG9uJ3QgY29tcHV0ZSBzaWJsaW5nSW5mbyBpZiB0aGUgcm9vdCBhbmQgdGhlIHJpZ2h0bW9zdCBjb250ZXh0cyBhcmUgdGhlIHNhbWVcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0SW5mbyBUaGUgcm9vdCBjb250ZXh0IGluZm9ybWF0aW9uIG9mIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW4sXG5cdFx0cm9vdENvbnRleHRJbmZvPzogUm9vdENvbnRleHRJbmZvLFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmdcblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGxldCByaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByaWdodG1vc3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0KSAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0Ly8gd2UgY2hlY2sgdGhlIHJpZ2h0TW9zdEN1cnJlbnRDb250ZXh0IGNhbiBiZSB1c2VkIGluIGRyYWZ0XG5cdFx0XHRyaWdodE1vc3RDb250ZXh0VG9Vc2UgPSByb290Q3VycmVudENvbnRleHQ7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRNb3N0Q29udGV4dFRvVXNlLmdldFBhdGgoKSA9PT0gcm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGVsID0gcm9vdEN1cnJlbnRDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRyZXR1cm4gZHJhZnQuY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihyb290Q3VycmVudENvbnRleHQsIHJpZ2h0TW9zdENvbnRleHRUb1VzZSwgcm9vdENvbnRleHRJbmZvLCBncm91cElkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgbm90IGluIGRyYWZ0IG1vZGUsIHdlIGp1c3QgcmVjcmVhdGUgYSBjb250ZXh0IGZyb20gdGhlIHBhdGggb2YgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHQvLyBObyBwYXRoIG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldEJvdW5kQ29udGV4dCgpLFxuXHRcdFx0XHRwYXRoTWFwcGluZzogW11cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0X2lzRmNsRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCk7XG5cdH1cblxuXHRhc3luYyBjaGVja1JlY29tbWVuZGF0aW9uT3B0aW9uKCk6IFByb21pc2U8UmVjb21tZW5kYXRpb25EaWFsb2dEZWNpc2lvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vVGhlIGV4aXN0aW5nIHJlY29tbWVuZGF0aW9ucyBjaGVjayBpcyBub3cgcHJlc2VudCBmdXJ0aGVyIGluIHRoZSBmbG93IGZvciBzaG93aW5nIGNvbmZpcm1hdGlvbiBkaWFsb2dcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPSBhd2FpdCB0aGlzLnNob3dDb25maXJtUmVjb21tZW5kYXRpb25zRGlhbG9nKHRydWUpO1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvbk9wdGlvbkNob29zZW4gPT09IFJlY29tbWVuZGF0aW9uRGlhbG9nRGVjaXNpb24uQ29udGludWUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChSZWNvbW1lbmRhdGlvbkRpYWxvZ0RlY2lzaW9uLkNvbnRpbnVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uT3B0aW9uQ2hvb3Nlbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgTmV4dCBEb2N1bWVudC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZWQgb25jZSBjcmVhdGUgbmV4dCBoYXBwZW5zLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTmV4dERvY3VtZW50KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0UGF0aCA9IHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmdQYXRoID0gYmluZGluZ0NvbnRleHRQYXRoPy5zdWJzdHJpbmcoMCwgYmluZGluZ0NvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiKFwiKSk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRG9jdW1lbnQobGlzdEJpbmRpbmdQYXRoIGFzIHN0cmluZywgeyBjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5OZXdQYWdlIH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEyRUEsTUFBTUEsZ0JBQWdCLEdBQUdDLFNBQVMsQ0FBQ0QsZ0JBQWdCO0lBQ2xERSxTQUFTLEdBQUdELFNBQVMsQ0FBQ0MsU0FBUztJQUMvQkMsV0FBVyxHQUFHRixTQUFTLENBQUNFLFdBQVc7SUFDbkNDLFFBQVEsR0FBR0gsU0FBUyxDQUFDRyxRQUFRO0lBQzdCQyxXQUFXLEdBQUdKLFNBQVMsQ0FBQ0ksV0FBVztFQTBCcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEEsSUFPTUMsUUFBUSxJQUFBQyxJQUFBLEdBRGJDLGNBQWMsQ0FBQywyQ0FBMkMsQ0FBQyxFQUFBQyxLQUFBLEdBYzFEQyxjQUFjLENBQUMsQ0FBQyxFQUFBQyxLQUFBLEdBd0JoQkMsZUFBZSxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQUNqQkMsY0FBYyxDQUFDLENBQUMsRUFBQUMsS0FBQSxHQStQaEJILGVBQWUsQ0FBQyxDQUFDLEVBQUFJLEtBQUEsR0FDakJGLGNBQWMsQ0FBQyxDQUFDLEVBQUFHLEtBQUEsR0FxR2hCTCxlQUFlLENBQUMsQ0FBQyxFQUFBTSxLQUFBLEdBQ2pCSixjQUFjLENB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