@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
@@ -85,6 +85,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
85
85
  showConnectionLostDialog();
86
86
  });
87
87
  this.webSocket.attachClose(evt => {
88
+ if (this.webSocketStatus === WEBSOCKET_STATUS.ERROR) {
89
+ return;
90
+ }
88
91
  this.webSocketStatus = WEBSOCKET_STATUS.CLOSED;
89
92
  // RFC 6455 defines the status codes when closing an established connection : https://datatracker.ietf.org/doc/html/rfc6455#section-7.4
90
93
  // status code 1000 means normal closure
@@ -1110,4 +1113,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
1110
1113
  }(ServiceFactory);
1111
1114
  return SideEffectsServiceFactory;
1112
1115
  }, false);
1113
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaWRlRWZmZWN0c1NlcnZpY2UiLCJfU2VydmljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2V4cG9ydHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsImluaXQiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsImFwcENvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwic2lkZUVmZmVjdHNSZWdpc3RyeSIsIm9EYXRhIiwiZW50aXRpZXMiLCJhY3Rpb25zIiwiYm91bmRBY3Rpb25zIiwidW5Cb3VuZEFjdGlvbnMiLCJjb250cm9sIiwicmVjb21tZW5kYXRpb25SZWdpc3RyeSIsInJvbGVzIiwidGFyZ2V0Q2FsbGJhY2tzIiwiaW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24iLCJtb2RlbCIsImdldE1vZGVsIiwidXJsIiwiZ2V0V2ViU29ja2V0QmFzZVVybCIsImNoYW5uZWwiLCJnZXRXZWJTb2NrZXRDaGFubmVsVXJsIiwiQ2hhbm5lbFR5cGUiLCJTaWRlRWZmZWN0c0V2ZW50cyIsIndlYlNvY2tldCIsImNyZWF0ZVdlYlNvY2tldCIsImF0dGFjaE1lc3NhZ2UiLCJvblNpZGVFZmZlY3RzRXZlbnRSZWNlaXZlZCIsImJpbmQiLCJ3ZWJTb2NrZXRTdGF0dXMiLCJXRUJTT0NLRVRfU1RBVFVTIiwiQ09OTkVDVEVEIiwic2hvd0Nvbm5lY3Rpb25Mb3N0RGlhbG9nIiwiQ0xPU0VEIiwiRVJST1IiLCJpbmNsdWRlcyIsInJlc291cmNlTW9kZWwiLCJnZXRSZXNvdXJjZU1vZGVsIiwibG9zdE9mQ29ubmVjdGlvblRleHQiLCJnZXRUZXh0IiwiTWVzc2FnZUJveCIsIndhcm5pbmciLCJBY3Rpb24iLCJPSyIsImVtcGhhc2l6ZWRBY3Rpb24iLCJhdHRhY2hFcnJvciIsImF0dGFjaENsb3NlIiwiZXZ0IiwiZ2V0UGFyYW1ldGVyIiwiZXZlbnQiLCJtZXNzYWdlIiwic2VydmVyQWN0aW9uIiwic2lkZUVmZmVjdEV2ZW50TmFtZSIsInNpZGVFZmZlY3RTb3VyY2UiLCJtZXRhUGF0aCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFDb250ZXh0IiwiZGF0YU1vZGVsIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwicmVsZXZhbnRTaWRlRWZmZWN0cyIsImdldFNpZGVFZmZlY3RXaGVyZUV2ZW50SXNTb3VyY2UiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibGVuZ3RoIiwicmVsZXZhbnRQYWdlcyIsInBhZ2VzIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0VmlzaWJsZVZpZXdzIiwicGFnZSIsInBhZ2VDb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImlzQSIsIl9zaWRlRWZmZWN0cyIsImlzRGF0YVBhdGhSZWxldmFudCIsInB1c2giLCJzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24iLCJvbmx5UmVjb21tZW5kYXRpb25zIiwiaXNPbmx5UmVjb21tZW5kYXRpb25zIiwiaW50ZXJhY3Rpb25UeXBlIiwiZ2V0U2lkZUVmZmVjdHNJbnRlcmFjdGlvblR5cGUiLCJjb25maXJtRGF0YVJlZnJlc2giLCJlcnJvciIsIm5vdGlmeURhdGFSZWZyZXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yRXZlbnQiLCJyZWNvbW1lbmRhdGlvblBhdGgiLCJhbm5vdGF0aW9ucyIsIlVJIiwiUmVjb21tZW5kYXRpb25zIiwicGF0aCIsInNpZGVFZmZlY3QiLCJhbm5vdGF0aW9uIiwiZW50aXR5IiwicXVhbGlmaWVyIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwidW5kZWZpbmVkIiwiaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbiIsImdldE1hbmlmZXN0RW50cnkiLCJhcHAiLCJzaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uVHlwZSIsImV2ZW50cyIsImRlZmF1bHQiLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJlbnRpdHlUeXBlIiwic291cmNlQ29udHJvbElkIiwiY29udHJvbFNpZGVFZmZlY3QiLCJlbnRpdHlDb250cm9sU2lkZUVmZmVjdHMiLCJleGVjdXRlQWN0aW9uIiwidHJpZ2dlckFjdGlvbiIsImdyb3VwSWQiLCJhY3Rpb24iLCJiaW5kQ29udGV4dCIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwic3VibWl0QmF0Y2giLCJleGVjdXRlIiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiY29udmVydFR5cGVzIiwiY2FwYWJpbGl0aWVzIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibWV0YU1vZGVsIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImVudGl0eVR5cGVOYW1lIiwiaXNDb250cm9sU2lkZUVmZmVjdHMiLCJzaWRlRWZmZWN0cyIsImdldEdsb2JhbE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJlbnRpdHlTaWRlRWZmZWN0cyIsImdsb2JhbFNpZGVFZmZlY3RzIiwia2V5Iiwic291cmNlRW50aXRpZXMiLCJzb3VyY2VQcm9wZXJ0aWVzIiwic291cmNlRXZlbnRzIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsImFjdGlvbk5hbWUiLCJnZXRPRGF0YVNpZGVFZmZlY3RzRnJvbUNvbnRleHRFdmVudCIsInNpZGVFZmZlY3RzSW5mbyIsIm1hcCIsImluaXRpYWxpemUiLCJzaWRlRWZmZWN0U291cmNlcyIsInByb3BlcnRpZXMiLCJlbnZpcm9ubWVudENhcGFiaWxpdGllc1NlcnZpY2UiLCJnZXRTZXJ2aWNlIiwicmVxdWVzdE9iamVjdCIsImdldENhcGFiaWxpdGllcyIsImNvbnZlcnRlZE1ldGFNb2RlbCIsImNvbnRhaW5lck5hbWUiLCJlbnRpdHlDb250YWluZXIiLCJjb250YWluZXJSZWdleFBhdHRlcm4iLCJSZWdFeHAiLCJlbnRpdHlUeXBlUmVnZXhQYXR0ZXJuIiwiZW50aXR5VHlwZXMiLCJmb3JFYWNoIiwibWFwRmllbGRBbm5vdGF0aW9ucyIsInJldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIm1hcFNpZGVFZmZlY3RTb3VyY2VzIiwiaXNCb3VuZCIsInNvdXJjZUVudGl0eVR5cGUiLCJyZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncyIsInNvdXJjZSIsImFkZFJlY29tbWVuZGF0aW9uUm9sZXMiLCJzb3VyY2VOYW1lIiwiaGFzT3duUHJvcGVydHkiLCJpbnB1dCIsIm91dHB1dCIsImVudGl0eVByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsImNvbW1vbkFubm8iLCJDb21tb24iLCJSZWNvbW1lbmRhdGlvblJvbGUiLCJyb2xlVHlwZSIsInZhbHVlT2YiLCJuYW1lIiwiZ2V0UmVjb21tZW5kYXRpb25zTWFwcGluZyIsImNoZWNrSWZGaWVsZElzUmVjb21tZW5kYXRpb25SZWxldmFudCIsImZpZWxkIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJwcm9wZXJ0eU5hbWUiLCJkYXRhIiwic291cmNlUGF0aCIsInNwbGl0IiwicG9wIiwibWV0YUNvbnRleHQiLCJ0YXJnZXREYXRhTW9kZWxPYmplY3QiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlUeXBlTmFtZSIsImlzRW50aXR5U2V0IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRUeXBlIiwicmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eSIsImdldFJlY29tbWVuZGF0aW9uT3V0cHV0RmllbGRzIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiY29udHJvbElkIiwic0VudGl0eVR5cGUiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJsb2dSZXF1ZXN0IiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJwcm9taXNlcyIsInRyaWdnZXJBY3Rpb25zIiwiUHJvbWlzZSIsImFsbCIsInJlc29sdmUiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCJpZ25vcmVUcmlnZ2VyQWN0aW9ucyIsImJhc2VFbnRpdHlUeXBlIiwibmF2aWdhdGlvblBhdGgiLCJzaWRlRWZmZWN0c1RhcmdldHMiLCJmaWx0ZXIiLCJhbm5vdGF0aW9uTmFtZSIsInNvbWUiLCJuYXZpZ2F0aW9uIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVBhdGgiLCJzdGFydHNXaXRoIiwicmVwbGFjZSIsInNBbm5vdGF0aW9uTmFtZSIsImNvbmNhdCIsInNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbiIsInJlbW92ZUR1cGxpY2F0ZVRhcmdldHMiLCJjYXRjaCIsIkxvZyIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsImdldFNpZGVFZmZlY3RXaGVyZUVudGl0eUlzU291cmNlIiwiZXZlbnROYW1lIiwiY29tcHV0ZUZpZWxkR3JvdXBJZHMiLCJzb3VyY2VQcm9wZXJ0eSIsImVudGl0eUZpZWxkR3JvdXBJZHMiLCJzaWRlRWZmZWN0SW5mbyIsImdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3QiLCJnZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlIiwicmVnaXN0ZXJUYXJnZXRDYWxsYmFjayIsInRhcmdldCIsImNhbGxiYWNrIiwiZGVyZWdpc3RlclRhcmdldENhbGxiYWNrIiwiZ2V0UmVnaXN0ZXJlZENhbGxiYWNrIiwiYWRkVGV4dFByb3BlcnRpZXMiLCJzZXRPZlByb3BlcnRpZXMiLCJTZXQiLCJzZXRPZkVudGl0aWVzIiwiZGF0YU1vZGVsUHJvcGVydHlQYXRoIiwiZ2V0RGF0YU1vZGVsUHJvcGVydGllc0Zyb21BUGF0aCIsImFzc29jaWF0ZWRUZXh0UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwiYWRkVGV4dFByb3BlcnR5IiwiQXJyYXkiLCJmcm9tIiwiZGF0YU1vZGVsVGV4dFBhdGgiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsInJlbGF0aXZlTmF2aWdhdGlvbiIsInRhcmdldEVudGl0eVNldCIsImdldFRhcmdldE5hdmlnYXRpb25QYXRoIiwidGFyZ2V0UGF0aCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJpc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyIsImlzUHJvcGVydHlBc3NvY2lhdGVkVGV4dE9uRGlmZmVyZW50RW50aXR5U2V0IiwiYWRkIiwiaXNQcm9wZXJ0eSIsImhhcyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiY29udmVydFNpZGVFZmZlY3RzIiwiYmluZGluZ1BhcmFtZXRlciIsIlRyaWdnZXJBY3Rpb24iLCJuZXdTaWRlRWZmZWN0cyIsImNvbnZlcnRTaWRlRWZmZWN0c0Zvcm1hdCIsInJlbW92ZUJpbmRpbmdQYXJhbWV0ZXIiLCJmb3JtYXRQcm9wZXJ0aWVzIiwicmVkdWNlIiwiaXNQcm9wZXJ0eVBhdGhFeHByZXNzaW9uIiwidmFsdWUiLCJmb3JtYXRFbnRpdGllcyIsInRhcmdldEVudGl0eSIsIlNvdXJjZVByb3BlcnRpZXMiLCJTb3VyY2VFbnRpdGllcyIsIlNvdXJjZUV2ZW50cyIsIlRhcmdldFByb3BlcnRpZXMiLCJUYXJnZXRFbnRpdGllcyIsImRhdGFNb2RlbE9iamVjdFBhdGhzIiwicHJvcGVydHlSZWxhdGl2ZVBhdGgiLCJ0ZXN0RW50aXR5VHlwZU5hbWUiLCJtYXRjaCIsInRlc3RFbnRpdHlUeXBlIiwicmVzb2x2ZVBhdGgiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZmluZCIsInJlbGF0ZWRFbnRpdHlTZXQiLCJzaW5nbGV0b25zIiwic2luZ2xldG9uIiwiZW50aXR5U2V0Q29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZGF0YU1vZGVsRW50aXR5U2V0IiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImlzQ29tcGxleFR5cGUiLCJpc0VudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0eSIsImRlc3Ryb3kiLCJnZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJiaW5kaW5nQWxpYXMiLCJpc1NvdXJjZUVudGl0eVR5cGUiLCJjb21tb25Bbm5vdGF0aW9uIiwicGFyYW1ldGVycyIsInBhcmFtZXRlciIsInR5cGUiLCJnZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlIiwic2lkZUVmZmVjdEFubm8iLCJpc1NpZGVFZmZlY3RzQW5ub3RhdGlvbiIsIiRUeXBlIiwidGFyZ2V0UGF0aHMiLCJwYXRocyIsImRlYnVnIiwiYmluZGluZ1BhcmFtZXRlck5hbWUiLCJyZXBsYWNlQmluZGluZ1BhcmFtZXRlciIsInRhcmdldFByb3BlcnR5IiwidGFyZ2V0RW50aXRpZXNQYXRocyIsInVuaXF1ZVRhcmdldGVkRW50aXRpZXNQYXRoIiwidW5pcXVlVGFyZ2V0UHJvcGVydGllcyIsInVuaXF1ZVRhcmdldGVkRW50aXRpZXMiLCJlbnRpdHlQYXRoIiwib0RhdGFTaWRlRWZmZWN0Iiwic2lkZUVmZmVjdHNTb3VyY2VzIiwic2lkZUVmZmVjdERlZmluaXRpb24iLCJtYXBTaWRlRWZmZWN0U291cmNlRW50aXRpZXMiLCJtYXBTaWRlRWZmZWN0U291cmNlUHJvcGVydGllcyIsIm1hcFNpZGVFZmZlY3RTb3VyY2VFdmVudHMiLCJzb3VyY2VFbnRpdHkiLCIkdGFyZ2V0IiwiaGFzVW5pcXVlU291cmNlUHJvcGVydHkiLCJzb3VyY2VFdmVudCIsInRvU3RyaW5nIiwiaXNJbW1lZGlhdGUiLCJzaWRlRWZmZWN0V2l0aFF1YWxpZmllciIsImdldEludGVyZmFjZSIsIlNlcnZpY2UiLCJTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IiwiX1NlcnZpY2VGYWN0b3J5IiwiX3Byb3RvMiIsImNyZWF0ZUluc3RhbmNlIiwib1NlcnZpY2VDb250ZXh0IiwiU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSIsIlNlcnZpY2VGYWN0b3J5Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcblx0QWN0aW9uLFxuXHRDb252ZXJ0ZWRNZXRhZGF0YSxcblx0RW50aXR5U2V0LFxuXHRFbnRpdHlUeXBlLFxuXHROYXZpZ2F0aW9uUHJvcGVydHksXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFByb3BlcnR5LFxuXHRQcm9wZXJ0eVBhdGhcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIEVkbSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvRWRtXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUeXBlIGFzIENvbW1vblNpZGVFZmZlY3RzVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uX0VkbVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHtcblx0U2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvbk1hbmlmZXN0U2V0dGluZyxcblx0U2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvblR5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQge1xuXHRpc0NvbXBsZXhUeXBlLFxuXHRpc0VudGl0eVNldCxcblx0aXNFbnRpdHlUeXBlLFxuXHRpc05hdmlnYXRpb25Qcm9wZXJ0eSxcblx0aXNQcm9wZXJ0eSxcblx0aXNQcm9wZXJ0eVBhdGhFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IENoYW5uZWxUeXBlLCBXRUJTT0NLRVRfU1RBVFVTLCBjcmVhdGVXZWJTb2NrZXQsIGdldFdlYlNvY2tldEJhc2VVcmwsIGdldFdlYlNvY2tldENoYW5uZWxVcmwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9XZWJTb2NrZXRcIjtcbmltcG9ydCB7IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgU2FwUGNwV2ViU29ja2V0IGZyb20gXCJzYXAvdWkvY29yZS93cy9TYXBQY3BXZWJTb2NrZXRcIjtcbmltcG9ydCB0eXBlIHsgV2ViU29ja2V0JENsb3NlRXZlbnQsIFdlYlNvY2tldCRNZXNzYWdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvd3MvV2ViU29ja2V0XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGgsIGdldFRhcmdldE5hdmlnYXRpb25QYXRoLCBnZXRUYXJnZXRPYmplY3RQYXRoIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudENhcGFiaWxpdGllcywgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlIH0gZnJvbSBcIi4vRW52aXJvbm1lbnRTZXJ2aWNlRmFjdG9yeVwiO1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eUFubm90YXRpb25zV2l0aFJlY29tbWVuZGF0aW9uID0gUHJvcGVydHlBbm5vdGF0aW9uc19Db21tb24gJiB7XG5cdFJlY29tbWVuZGF0aW9uUm9sZT86IHN0cmluZztcbn07XG5cbnR5cGUgU2lkZUVmZmVjdHNTZXR0aW5ncyA9IHt9O1xuXG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c0VudGl0eVR5cGUgPSB7XG5cdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUYXJnZXQgPSBTaWRlRWZmZWN0c0VudGl0eVR5cGUgfCBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0dGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXTtcbn07XG5cbnR5cGUgQmFzZVNpZGVFZmZlY3RzVHlwZSA9IHtcblx0c291cmNlUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHRzb3VyY2VFbnRpdGllcz86IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdO1xuXHRzb3VyY2VFdmVudHM/OiBzdHJpbmdbXTtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59ICYgU2lkZUVmZmVjdHNUYXJnZXRUeXBlO1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IEJhc2VTaWRlRWZmZWN0c1R5cGUgJiB7XG5cdHRyaWdnZXJBY3Rpb24/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdHBhdGhFeHByZXNzaW9ucz86IFNpZGVFZmZlY3RzVGFyZ2V0W107XG5cdHRyaWdnZXJBY3Rpb25zPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0gUGFydGlhbDxCYXNlU2lkZUVmZmVjdHNUeXBlPiAmIHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cdHNvdXJjZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRzb3VyY2VDb250cm9sSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVHlwZSA9IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgfCBPRGF0YVNpZGVFZmZlY3RzVHlwZTtcblxuLy9UT0RPIGZpeCB0aGlzIHR5cGUgaW4gdGhlIHV4IHZvY2FidWxhcmllc1xuLy9UT0RPOiBTb3VyY2UgRXZlbnRzIGFyZSBzdGlsbCBleHBlcmltZW50YWwsIHJlbW92ZSBvbmNlIHB1YmxpY1xudHlwZSBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXIgPSBDb21tb25TaWRlRWZmZWN0c1R5cGUgJiB7IHF1YWxpZmllcj86IHN0cmluZzsgU291cmNlRXZlbnRzPzogRWRtLlN0cmluZ1tdIH07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlID0geyBlbnRpdHk6IHN0cmluZzsgcXVhbGlmaWVyPzogc3RyaW5nOyBoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eT86IGJvb2xlYW4gfTtcblxudHlwZSBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5ID0ge1xuXHRvRGF0YToge1xuXHRcdGVudGl0aWVzOiB7XG5cdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0XHRhY3Rpb25zOiB7XG5cdFx0XHRib3VuZEFjdGlvbnM6IHtcblx0XHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcblx0XHRcdH07XG5cdFx0XHR1bkJvdW5kQWN0aW9uczoge1xuXHRcdFx0XHRbYWN0aW9uOiBzdHJpbmddOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH07XG5cdGNvbnRyb2w6IHtcblx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPjtcblx0fTtcbn07XG5cbnR5cGUgUmVjb21tZW5kYXRpb25zUm9sZXMgPSB7XG5cdGlucHV0OiBzdHJpbmdbXTtcblx0b3V0cHV0OiBzdHJpbmdbXTtcblx0cmVxdWlyZWQ/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlY29tbWVuZGF0aW9uc1JlZ2lzdHJ5ID0ge1xuXHRyb2xlczogUmVjb3JkPHN0cmluZywgUmVjb21tZW5kYXRpb25zUm9sZXM+O1xufTtcblxudHlwZSBXZWJTb2NrZXRNZXNzYWdlID0ge1xuXHRzZXJ2ZXJBY3Rpb246IFwiUmFpc2VTaWRlRWZmZWN0XCI7XG5cdHNpZGVFZmZlY3RFdmVudE5hbWU6IHN0cmluZztcblx0c2lkZUVmZmVjdFNvdXJjZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIFNpZGVFZmZlY3RzU2VydmljZSBleHRlbmRzIFNlcnZpY2U8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRhcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBzaWRlRWZmZWN0c1JlZ2lzdHJ5ITogU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeTtcblxuXHRwcml2YXRlIHJlY29tbWVuZGF0aW9uUmVnaXN0cnkhOiBSZWNvbW1lbmRhdGlvbnNSZWdpc3RyeTtcblxuXHRwcml2YXRlIGNhcGFiaWxpdGllcyE6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzIToge1xuXHRcdGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHR9O1xuXG5cdC8vIENhbGxiYWNrIG1ldGhvZHMgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEgc2lkZSBlZmZlY3QgdGFyZ2V0IGlzIGhpdFxuXHRwcml2YXRlIHRhcmdldENhbGxiYWNrcyE6IFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPjtcblxuXHQvLyBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byByZXRyaWV2ZSBTaWRlRWZmZWN0cyBldmVudHNcblx0cHJpdmF0ZSB3ZWJTb2NrZXQ/OiBTYXBQY3BXZWJTb2NrZXQ7XG5cblx0cHJpdmF0ZSBjb250YWluZXJOYW1lPzogc3RyaW5nO1xuXG5cdHByaXZhdGUgY29udGFpbmVyUmVnZXhQYXR0ZXJuITogUmVnRXhwO1xuXG5cdHByaXZhdGUgZW50aXR5VHlwZVJlZ2V4UGF0dGVybiE6IFJlZ0V4cDtcblxuXHRwcml2YXRlIHdlYlNvY2tldFN0YXR1cyE6IFdFQlNPQ0tFVF9TVEFUVVM7XG5cdC8vIEludGVyYWN0aW9uIHR5cGUgZm9yIFNpZGVFZmZlY3RzIGV2ZW50c1xuXHRwcml2YXRlIGludGVyYWN0aW9uVHlwZURlZmluaXRpb24/OiBTaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uTWFuaWZlc3RTZXR0aW5nO1xuXG5cdC8vICE6IG1lYW5zIHRoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGFzc2lnbmVkIGJlZm9yZSB1c2FnZVxuXHRpbml0KCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHR0aGlzLmFwcENvbXBvbmVudCA9IGNvbnRleHQ/LnNjb3BlT2JqZWN0IGFzIEFwcENvbXBvbmVudDtcblx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkgPSB7XG5cdFx0XHRvRGF0YToge1xuXHRcdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRcdGFjdGlvbnM6IHtcblx0XHRcdFx0XHRib3VuZEFjdGlvbnM6IHt9LFxuXHRcdFx0XHRcdHVuQm91bmRBY3Rpb25zOiB7fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbDoge31cblx0XHR9O1xuXG5cdFx0dGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5ID0ge1xuXHRcdFx0cm9sZXM6IHt9XG5cdFx0fTtcblx0XHR0aGlzLnRhcmdldENhbGxiYWNrcyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbm5lY3RzIHRvIGEgZ2l2ZW4gV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gcmV0cmlldmUgU2lkZUVmZmVjdHMgZXZlbnRzLlxuXHQgKlxuXHQgKi9cblx0aW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24oKTogdm9pZCB7XG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmFwcENvbXBvbmVudC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHVybCA9IGdldFdlYlNvY2tldEJhc2VVcmwobW9kZWwpO1xuXHRcdGNvbnN0IGNoYW5uZWwgPSBnZXRXZWJTb2NrZXRDaGFubmVsVXJsKENoYW5uZWxUeXBlLlNpZGVFZmZlY3RzRXZlbnRzLCBtb2RlbCk7XG5cblx0XHRpZiAodXJsICYmIGNoYW5uZWwpIHtcblx0XHRcdHRoaXMud2ViU29ja2V0ID0gY3JlYXRlV2ViU29ja2V0KENoYW5uZWxUeXBlLlNpZGVFZmZlY3RzRXZlbnRzLCBtb2RlbCk7XG5cdFx0XHR0aGlzLndlYlNvY2tldC5hdHRhY2hNZXNzYWdlKHRoaXMub25TaWRlRWZmZWN0c0V2ZW50UmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLndlYlNvY2tldFN0YXR1cyA9IFdFQlNPQ0tFVF9TVEFUVVMuQ09OTkVDVEVEO1xuXG5cdFx0XHRjb25zdCBzaG93Q29ubmVjdGlvbkxvc3REaWFsb2cgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmIChbV0VCU09DS0VUX1NUQVRVUy5DTE9TRUQsIFdFQlNPQ0tFVF9TVEFUVVMuRVJST1JdLmluY2x1ZGVzKHRoaXMud2ViU29ja2V0U3RhdHVzKSkge1xuXHRcdFx0XHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRjb25zdCBsb3N0T2ZDb25uZWN0aW9uVGV4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfU0lERUVGRkVDVF9DT05ORUNUSU9OX0xPU1RcIik7XG5cblx0XHRcdFx0XHRNZXNzYWdlQm94Lndhcm5pbmcobG9zdE9mQ29ubmVjdGlvblRleHQsIHtcblx0XHRcdFx0XHRcdGFjdGlvbnM6IFtNZXNzYWdlQm94LkFjdGlvbi5PS10sXG5cdFx0XHRcdFx0XHRlbXBoYXNpemVkQWN0aW9uOiBNZXNzYWdlQm94LkFjdGlvbi5PS1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLndlYlNvY2tldC5hdHRhY2hFcnJvcigoKSA9PiB7XG5cdFx0XHRcdHRoaXMud2ViU29ja2V0U3RhdHVzID0gV0VCU09DS0VUX1NUQVRVUy5FUlJPUjtcblx0XHRcdFx0c2hvd0Nvbm5lY3Rpb25Mb3N0RGlhbG9nKCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy53ZWJTb2NrZXQuYXR0YWNoQ2xvc2UoKGV2dDogV2ViU29ja2V0JENsb3NlRXZlbnQpID0+IHtcblx0XHRcdFx0dGhpcy53ZWJTb2NrZXRTdGF0dXMgPSBXRUJTT0NLRVRfU1RBVFVTLkNMT1NFRDtcblx0XHRcdFx0Ly8gUkZDIDY0NTUgZGVmaW5lcyB0aGUgc3RhdHVzIGNvZGVzIHdoZW4gY2xvc2luZyBhbiBlc3RhYmxpc2hlZCBjb25uZWN0aW9uIDogIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTcuNFxuXHRcdFx0XHQvLyBzdGF0dXMgY29kZSAxMDAwIG1lYW5zIG5vcm1hbCBjbG9zdXJlXG5cdFx0XHRcdGlmICgoZXZ0LmdldFBhcmFtZXRlcihcImNvZGVcIikgYXMgbnVtYmVyIHwgdW5kZWZpbmVkKSAhPT0gMTAwMCkge1xuXHRcdFx0XHRcdHNob3dDb25uZWN0aW9uTG9zdERpYWxvZygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb25uZWN0ZWQgV2ViU29ja2V0IHNlbmRzIGEgbWVzc2FnZS5cblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB3aXRoIHRoZSByZWxldmFudCBzaWRlRWZmZWN0IGluZm9ybWF0aW9uXG5cdCAqL1xuXHRhc3luYyBvblNpZGVFZmZlY3RzRXZlbnRSZWNlaXZlZChldmVudDogV2ViU29ja2V0JE1lc3NhZ2VFdmVudCAmIEV2ZW50PHsgcGNwRmllbGRzPzogV2ViU29ja2V0TWVzc2FnZSB9Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwY3BGaWVsZHNcIik7XG5cblx0XHRpZiAobWVzc2FnZT8uc2VydmVyQWN0aW9uICE9PSBcIlJhaXNlU2lkZUVmZmVjdFwiIHx8ICFtZXNzYWdlLnNpZGVFZmZlY3RFdmVudE5hbWUgfHwgIW1lc3NhZ2Uuc2lkZUVmZmVjdFNvdXJjZSkge1xuXHRcdFx0Ly8gbWVzc2FnZSBpcyBub3QgcmVsZXZhbnRcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhUGF0aCA9IHRoaXMuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQobWVzc2FnZS5zaWRlRWZmZWN0U291cmNlKTtcblx0XHRjb25zdCBkYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFQYXRoKTtcblx0XHRjb25zdCByZWxldmFudFNpZGVFZmZlY3RzID0gdGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVFdmVudElzU291cmNlKFxuXHRcdFx0ZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0bWVzc2FnZS5zaWRlRWZmZWN0RXZlbnROYW1lXG5cdFx0KTtcblxuXHRcdGlmIChyZWxldmFudFNpZGVFZmZlY3RzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gbm8gc2lkZSBlZmZlY3QgZm9yIHRoaXMgc291cmNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVsZXZhbnRQYWdlczogUGFnZUNvbnRyb2xsZXJbXSA9IFtdO1xuXHRcdGNvbnN0IHBhZ2VzID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZ2V0VmlzaWJsZVZpZXdzKCk7XG5cdFx0Zm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG5cdFx0XHRjb25zdCBwYWdlQ29udHJvbGxlciA9IHBhZ2UuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRwYWdlQ29udHJvbGxlci5pc0E8UGFnZUNvbnRyb2xsZXI+KFwic2FwLmZlLmNvcmUuUGFnZUNvbnRyb2xsZXJcIikgJiZcblx0XHRcdFx0cGFnZUNvbnRyb2xsZXIuX3NpZGVFZmZlY3RzLmlzRGF0YVBhdGhSZWxldmFudChtZXNzYWdlLnNpZGVFZmZlY3RTb3VyY2UsIG1lc3NhZ2Uuc2lkZUVmZmVjdEV2ZW50TmFtZSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZWxldmFudFBhZ2VzLnB1c2gocGFnZUNvbnRyb2xsZXIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyZWxldmFudFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gbm8gcmVsZXZhbnQgcGFnZSBmb3VuZCBmb3IgdGhpcyBzb3VyY2Vcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyB3ZSBhc2sgdGhlIHVzZXIgdG8gY29uZmlybSB0aGUgcmVmcmVzaCBvciBub3RpZnkgdGhlIHVzZXIsIHdlIHVzZSB0aGUgbW9zdCBzcGVjaWZpYyBwYWdlXG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uID0gcmVsZXZhbnRQYWdlc1tyZWxldmFudFBhZ2VzLmxlbmd0aCAtIDFdLl9zaWRlRWZmZWN0cztcblx0XHRjb25zdCBvbmx5UmVjb21tZW5kYXRpb25zID0gdGhpcy5pc09ubHlSZWNvbW1lbmRhdGlvbnMoZGF0YU1vZGVsLCByZWxldmFudFNpZGVFZmZlY3RzKTtcblx0XHRjb25zdCBpbnRlcmFjdGlvblR5cGUgPSB0aGlzLmdldFNpZGVFZmZlY3RzSW50ZXJhY3Rpb25UeXBlKG1lc3NhZ2Uuc2lkZUVmZmVjdEV2ZW50TmFtZSwgb25seVJlY29tbWVuZGF0aW9ucyk7XG5cblx0XHRzd2l0Y2ggKGludGVyYWN0aW9uVHlwZSkge1xuXHRcdFx0Y2FzZSBcIkNvbmZpcm1hdGlvblwiOlxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IHNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbi5jb25maXJtRGF0YVJlZnJlc2goKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTm90aWZpY2F0aW9uXCI6XG5cdFx0XHRcdHNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbi5ub3RpZnlEYXRhUmVmcmVzaCgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOb25lXCI6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdC8vIG5vdyByZWZyZXNoIHRoZSBwYWdlcywgZm9yd2FyZCB0aGlzIHRhc2sgdG8gdGhlIHNpZGUgZWZmZWN0cyBjb250cm9sbGVyIGV4dGVuc2lvbnMgdG8gYWxsb3cgb3ZlcnJpZGluZyBwZXIgcGFnZSAoaS5lLiBMUilcblx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcmVsZXZhbnRQYWdlcykge1xuXHRcdFx0YXdhaXQgcGFnZS5fc2lkZUVmZmVjdHMucmVxdWVzdFNpZGVFZmZlY3RzRm9yRXZlbnQobWVzc2FnZS5zaWRlRWZmZWN0RXZlbnROYW1lLCBtZXNzYWdlLnNpZGVFZmZlY3RTb3VyY2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBvbmx5IHJlY29tbWVuZGF0aW9ucyBhcmUgZGVmaW5lZCBmb3IgYSBzcGVjaWZpYyBldmVudC5cblx0ICogQHBhcmFtIGRhdGFNb2RlbCBUaGUgZGF0YSBtb2RlbCBvYmplY3QgcGF0aFxuXHQgKiBAcGFyYW0gcmVsZXZhbnRTaWRlRWZmZWN0cyBUaGUgcmVsZXZhbnQgc2lkZSBlZmZlY3RzIGZvciB0aGUgc291cmNlXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgb25seSByZWNvbW1lbmRhdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoZSBldmVudFxuXHQgKi9cblx0aXNPbmx5UmVjb21tZW5kYXRpb25zKGRhdGFNb2RlbDogRGF0YU1vZGVsT2JqZWN0UGF0aDx1bmtub3duPiwgcmVsZXZhbnRTaWRlRWZmZWN0czogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXSk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uUGF0aCA9IChcblx0XHRcdGRhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmFubm90YXRpb25zLlVJPy5SZWNvbW1lbmRhdGlvbnMgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHN0cmluZz4gfCB1bmRlZmluZWRcblx0XHQpPy5wYXRoO1xuXHRcdGZvciAoY29uc3Qgc2lkZUVmZmVjdCBvZiByZWxldmFudFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uID1cblx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2RhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0/Lltcblx0XHRcdFx0XHRgJHtzaWRlRWZmZWN0LmVudGl0eX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpZGVFZmZlY3RzIyR7c2lkZUVmZmVjdC5xdWFsaWZpZXJ9YFxuXHRcdFx0XHRdO1xuXHRcdFx0Ly8gY2hlY2sgaWYgdGhlIHNpZGUgZWZmZWN0IGlzIG9ubHkgYSByZWNvbW1lbmRhdGlvblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhbm5vdGF0aW9uPy50YXJnZXRQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0XHRhbm5vdGF0aW9uPy50YXJnZXRFbnRpdGllcy5sZW5ndGggPT09IDAgJiZcblx0XHRcdFx0YW5ub3RhdGlvbj8udGFyZ2V0UHJvcGVydGllc1swXSA9PT0gcmVjb21tZW5kYXRpb25QYXRoXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgc2lkZSBlZmZlY3RzIGludGVyYWN0aW9uIHR5cGUgZnJvbSB0aGUgbWFuaWZlc3QuXG5cdCAqICBAcGFyYW0gZXZlbnQgVGhlIHNpZGUgZWZmZWN0cyBldmVudCBuYW1lXG5cdCAqICBAcGFyYW0gb25seVJlY29tbWVuZGF0aW9ucyBJbmRpY2F0b3IgaWYgb25seSByZWNvbW1lbmRhdGlvbnMgYXJlIHNob3duXG5cdCAqIEByZXR1cm5zIFRoZSBzaWRlIGVmZmVjdHMgaW50ZXJhY3Rpb24gdHlwZVxuXHQgKi9cblx0Z2V0U2lkZUVmZmVjdHNJbnRlcmFjdGlvblR5cGUoZXZlbnQ6IHN0cmluZywgb25seVJlY29tbWVuZGF0aW9ucyA9IGZhbHNlKTogU2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvblR5cGUge1xuXHRcdGlmICghdGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uKSB7XG5cdFx0XHR0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24gPSB0aGlzLmFwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmZlXCIpPy5hcHA/LnNpZGVFZmZlY3RzRXZlbnRzSW50ZXJhY3Rpb25UeXBlO1xuXHRcdH1cblx0XHRpZiAob25seVJlY29tbWVuZGF0aW9ucykge1xuXHRcdFx0Ly8gSW4gY2FzZSBvZiBvbmx5IHJlY29tbWVuZGF0aW9ucywgd2UgZG8gbm90IHNob3cgYW55IG5vdGlmaWNhdGlvblxuXHRcdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgdGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHQvLyBhIGdsb2JhbCBpbnRlcmFjdGlvbiB0eXBlIGlzIGRlZmluZWRcblx0XHRcdHJldHVybiB0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb247XG5cdFx0fVxuXG5cdFx0aWYgKGV2ZW50ICYmIHRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbj8uZXZlbnRzPy5bZXZlbnRdKSB7XG5cdFx0XHQvLyBhbiBpbnRlcmFjdGlvbiB0eXBlIGlzIGRlZmluZWQgZm9yIHRoZSBldmVudFxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbi5ldmVudHNbZXZlbnRdO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24/LmRlZmF1bHQpIHtcblx0XHRcdC8vIGEgZGVmYXVsdCBpbnRlcmFjdGlvbiB0eXBlIGlzIGRlZmluZWQgZm9yIHRoZSBldmVudFxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbi5kZWZhdWx0O1xuXHRcdH1cblxuXHRcdHJldHVybiBcIk5vdGlmaWNhdGlvblwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sXG5cdCAqIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gaXMgYWRkZWQgYnkgYSBjb250cm9sIHRvIGtlZXAgZGF0YSB1cCB0byBkYXRlXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGdldCBsaW1pdGVkIHNjb3BlIGNvbXBhcmVkIHdpdGggU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgc2VydmljZTpcblx0ICogLSBPbmx5IG9uZSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgY29tYmluYXRpb24gZW50aXR5IHR5cGUgLSBjb250cm9sIElkXG5cdCAqIC0gT25seSBTaWRlRWZmZWN0cyBzb3VyY2UgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgdXNlZCB0byB0cmlnZ2VyIFNpZGVFZmZlY3RzXG5cdCAqXG5cdCAqIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoZW50aXR5VHlwZTogc3RyaW5nLCBzaWRlRWZmZWN0OiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0aWYgKHNpZGVFZmZlY3Quc291cmNlQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBjb250cm9sU2lkZUVmZmVjdDogQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdFx0Li4uc2lkZUVmZmVjdCxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtlbnRpdHlUeXBlfS9TaWRlRWZmZWN0c0ZvckNvbnRyb2wvJHtzaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZH1gXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZW50aXR5Q29udHJvbFNpZGVFZmZlY3RzID0gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbZW50aXR5VHlwZV0gfHwge307XG5cdFx0XHRlbnRpdHlDb250cm9sU2lkZUVmZmVjdHNbY29udHJvbFNpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXSA9IGNvbnRyb2xTaWRlRWZmZWN0O1xuXHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbZW50aXR5VHlwZV0gPSBlbnRpdHlDb250cm9sU2lkZUVmZmVjdHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIFNpZGVFZmZlY3RzIGFjdGlvbi5cblx0ICogQHBhcmFtIHRyaWdnZXJBY3Rpb24gTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGhvdXQgZGF0YSBvciB3aXRoIGEgcmV0dXJuIHZhbHVlIGNvbnRleHQgd2hlbiB0aGUgYWN0aW9uIGNhbGwgc3VjY2VlZHNcblx0ICovXG5cdHB1YmxpYyBhc3luYyBleGVjdXRlQWN0aW9uKHRyaWdnZXJBY3Rpb246IHN0cmluZywgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFjdGlvbiA9IGNvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHt0cmlnZ2VyQWN0aW9ufSguLi4pYCwgY29udGV4dCk7XG5cdFx0Z3JvdXBJZCA9IGdyb3VwSWQgfHwgY29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0VXBkYXRlR3JvdXBJZCgpO1xuXHRcdC8vIHRoZSB0cmlnZ2VyQWN0aW9uIGlzIGV4ZWN1dGVkIGluIHNhbWUgJGJhdGNoIGJ1dCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0Y29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRcdGF3YWl0IGFjdGlvbi5leGVjdXRlKGdyb3VwSWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICogQHJldHVybnMgQ29udmVydGVkIE9EYXRhIG1ldGFNb2RlbFxuXHQgKi9cblx0cHVibGljIGdldENvbnZlcnRlZE1ldGFNb2RlbCgpOiBDb252ZXJ0ZWRNZXRhZGF0YSB7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyh0aGlzLmdldE1ldGFNb2RlbCgpLCB0aGlzLmNhcGFiaWxpdGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgYSBjb250ZXh0LlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdGVudGl0eVR5cGUgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KG1ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBlbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJcyBhIFNpZGVFZmZlY3RzIGdlbmVyYXRlZCBieSBhIGNvbnRyb2wuXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBUaGUgU2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgU2lkZUVmZmVjdHMgaXMgZ2VuZXJhdGVkIGJ5IGEgY29udHJvbCwgb3RoZXJ3aXNlIGZhbHNlXG5cdCAqL1xuXHRwdWJsaWMgaXNDb250cm9sU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSk6IHNpZGVFZmZlY3RzIGlzIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUge1xuXHRcdHJldHVybiAhIShzaWRlRWZmZWN0cyBhcyBDb250cm9sU2lkZUVmZmVjdHNUeXBlKS5zb3VyY2VDb250cm9sSWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZ2xvYmFsIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBHbG9iYWwgU2lkZUVmZmVjdHNcblx0ICovXG5cdHB1YmxpYyBnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdIHtcblx0XHRjb25zdCBlbnRpdHlTaWRlRWZmZWN0cyA9IHRoaXMuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZSk7XG5cdFx0Y29uc3QgZ2xvYmFsU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHlTaWRlRWZmZWN0cykge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHMgPSBlbnRpdHlTaWRlRWZmZWN0c1trZXldO1xuXHRcdFx0aWYgKCFzaWRlRWZmZWN0cy5zb3VyY2VFbnRpdGllcyAmJiAhc2lkZUVmZmVjdHMuc291cmNlUHJvcGVydGllcyAmJiAhc2lkZUVmZmVjdHMuc291cmNlRXZlbnRzKSB7XG5cdFx0XHRcdGdsb2JhbFNpZGVFZmZlY3RzLnB1c2goc2lkZUVmZmVjdHMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZ2xvYmFsU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgc2VydmljZS5cblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0PzogQ29udGV4dCk6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGlmIChlbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy5ib3VuZEFjdGlvbnNbZW50aXR5VHlwZV0/LlthY3Rpb25OYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5vRGF0YS5hY3Rpb25zLnVuQm91bmRBY3Rpb25zPy5bYWN0aW9uTmFtZV07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgZm9yIHRoZSBjb250ZXh0IGFuZCB0aGUgZXZlbnQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIFNpZGVFZmZlY3RzIG9mIHRoZSBldmVudFxuXHQgKiBAcmV0dXJucyBBbiBhcnJheSBjb250YWluaW5nIHRoZSBTaWRlRWZmZWN0cyBtYXRjaGluZyB3aXRoIHRoZSBjb250ZXh0IGFuZCB0aGUgZXZlbnRcblx0ICovXG5cdHB1YmxpYyBnZXRPRGF0YVNpZGVFZmZlY3RzRnJvbUNvbnRleHRFdmVudChjb250ZXh0OiBDb250ZXh0LCBldmVudDogc3RyaW5nKTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0Y29uc3QgbWV0YVBhdGggPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdGNvbnN0IGRhdGFNb2RlbCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhUGF0aCk7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNJbmZvID0gdGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVFdmVudElzU291cmNlKGRhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgZXZlbnQpO1xuXHRcdHJldHVybiBzaWRlRWZmZWN0c0luZm8ubWFwKFxuXHRcdFx0KHNpZGVFZmZlY3QpID0+XG5cdFx0XHRcdHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5vRGF0YS5lbnRpdGllc1tkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdPy5bXG5cdFx0XHRcdFx0YCR7c2lkZUVmZmVjdC5lbnRpdHl9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0cyMke3NpZGVFZmZlY3QucXVhbGlmaWVyfWBcblx0XHRcdFx0XVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqICBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB3aXRoIHRoZSBTaWRlRWZmZWN0cyBzZXJ2aWNlIG9uY2UgZGF0YSBoYXMgYmVlbiB3cml0dGVuXG5cdCAqL1xuXHRhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dGhpcz4ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSA9IHtcblx0XHRcdGVudGl0aWVzOiB7fSxcblx0XHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdFx0ZXZlbnRzOiB7fVxuXHRcdH07XG5cdFx0Y29uc3QgZW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlID0gKGF3YWl0IHRoaXMuYXBwQ29tcG9uZW50LmdldFNlcnZpY2UoXG5cdFx0XHRcImVudmlyb25tZW50Q2FwYWJpbGl0aWVzXCJcblx0XHQpKSBhcyBFbnZpcm9ubWVudENhcGFiaWxpdGllc1NlcnZpY2U7XG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmFwcENvbXBvbmVudC5nZXRNb2RlbCgpO1xuXHRcdGlmIChtb2RlbD8uaXNBPy48T0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgTWV0YU1vZGVsIHRvIGJlIHJlcXVlc3RlZFxuXHRcdFx0YXdhaXQgbW9kZWwuZ2V0TWV0YU1vZGVsKCkucmVxdWVzdE9iamVjdChcIi8kRW50aXR5Q29udGFpbmVyL1wiKTtcblx0XHRcdHRoaXMuY2FwYWJpbGl0aWVzID0gZW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlLmdldENhcGFiaWxpdGllcygpO1xuXG5cdFx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0dGhpcy5jb250YWluZXJOYW1lID0gY29udmVydGVkTWV0YU1vZGVsLmVudGl0eUNvbnRhaW5lci5mdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0XHR0aGlzLmNvbnRhaW5lclJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoYF5cXFxcLyR7dGhpcy5jb250YWluZXJOYW1lfVxcXFwvW14vXStcXFxcLyguKyk/JGApO1xuXHRcdFx0dGhpcy5lbnRpdHlUeXBlUmVnZXhQYXR0ZXJuID0gbmV3IFJlZ0V4cChgXi8ke3RoaXMuY29udGFpbmVyTmFtZX0vKFteL10rKWApO1xuXHRcdFx0Y29udmVydGVkTWV0YU1vZGVsLmVudGl0eVR5cGVzLmZvckVhY2goKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpID0+IHtcblx0XHRcdFx0dGhpcy5tYXBGaWVsZEFubm90YXRpb25zKGVudGl0eVR5cGUpO1xuXHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuZW50aXRpZXNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gdGhpcy5yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7XG5cdFx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZXMoZW50aXR5VHlwZSwgc2lkZUVmZmVjdFNvdXJjZXMpO1xuXHRcdFx0fSk7XG5cdFx0XHRjb252ZXJ0ZWRNZXRhTW9kZWwuYWN0aW9ucy5mb3JFYWNoKChhY3Rpb246IEFjdGlvbikgPT4ge1xuXHRcdFx0XHRpZiAoYWN0aW9uLmlzQm91bmQpIHtcblx0XHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy5ib3VuZEFjdGlvbnNbYWN0aW9uLnNvdXJjZUVudGl0eVR5cGUhLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy5ib3VuZEFjdGlvbnNbYWN0aW9uLnNvdXJjZUVudGl0eVR5cGUhLmZ1bGx5UXVhbGlmaWVkTmFtZV0sXG5cdFx0XHRcdFx0XHQuLi50aGlzLnJldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoYWN0aW9uKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMudW5Cb3VuZEFjdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy51bkJvdW5kQWN0aW9ucyxcblx0XHRcdFx0XHRcdC4uLnRoaXMucmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhhY3Rpb24pXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoT2JqZWN0LmtleXMoc2lkZUVmZmVjdFNvdXJjZXMuZXZlbnRzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuaW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5zb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MgPSBzaWRlRWZmZWN0U291cmNlcztcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByaXZhdGUgbWFwRmllbGRBbm5vdGF0aW9ucyhzb3VyY2U6IEVudGl0eVR5cGUpOiB2b2lkIHtcblx0XHRjb25zdCBhZGRSZWNvbW1lbmRhdGlvblJvbGVzID0gKHNvdXJjZU5hbWU6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXMuaGFzT3duUHJvcGVydHkoYCR7c291cmNlTmFtZX1gKSkge1xuXHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlTmFtZX1gXSA9IHtcblx0XHRcdFx0XHRpbnB1dDogW10sXG5cdFx0XHRcdFx0b3V0cHV0OiBbXVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0c291cmNlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IGNvbW1vbkFubm8gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24gYXMgUHJvcGVydHlBbm5vdGF0aW9uc1dpdGhSZWNvbW1lbmRhdGlvbjtcblx0XHRcdGlmIChjb21tb25Bbm5vPy5SZWNvbW1lbmRhdGlvblJvbGUpIHtcblx0XHRcdFx0Y29uc3Qgcm9sZVR5cGUgPSBjb21tb25Bbm5vLlJlY29tbWVuZGF0aW9uUm9sZTtcblx0XHRcdFx0aWYgKHJvbGVUeXBlLnZhbHVlT2YoKS5pbmNsdWRlcyhcIklucHV0XCIpKSB7XG5cdFx0XHRcdFx0YWRkUmVjb21tZW5kYXRpb25Sb2xlcyhgJHtzb3VyY2UubmFtZX1gKTtcblx0XHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlLm5hbWV9YF0uaW5wdXQucHVzaChwcm9wZXJ0eS5uYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocm9sZVR5cGUudmFsdWVPZigpLmluY2x1ZGVzKFwiT3V0cHV0XCIpKSB7XG5cdFx0XHRcdFx0YWRkUmVjb21tZW5kYXRpb25Sb2xlcyhgJHtzb3VyY2UubmFtZX1gKTtcblx0XHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlLm5hbWV9YF0ub3V0cHV0LnB1c2gocHJvcGVydHkubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZWNvbW1lbmRhdGlvbnNNYXBwaW5nKCk6IFJlY29tbWVuZGF0aW9uc1JlZ2lzdHJ5IHtcblx0XHRyZXR1cm4gdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZiBmaWVsZCBpcyBwYXJ0IG9mIFJlY29tbWVuZGF0aW9uJ3MgaW5wdXQgbWFwcGluZyBhbmQgZnJvbSB0aGUgc2FtZSBlbnRpdHkuXG5cdCAqIE90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG5cdCAqIEBwYXJhbSBmaWVsZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGZpZWxkIGlzIGhhcyByZWNvbW1lbmRhdGlvbiByb2xlIC0gSW5wdXQgYW5ub3RhdGlvblxuXHQgKi9cblx0cHVibGljIGNoZWNrSWZGaWVsZElzUmVjb21tZW5kYXRpb25SZWxldmFudChmaWVsZDogQ29udHJvbCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGZpZWxkLmRhdGEoKS5zb3VyY2VQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKTtcblx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dD8uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gKG1ldGFNb2RlbCBhcyBPRGF0YU1ldGFNb2RlbCk/LmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHRhcmdldERhdGFNb2RlbE9iamVjdCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8RW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5PihtZXRhQ29udGV4dClcblx0XHRcdFx0LnRhcmdldE9iamVjdCE7XG5cdFx0XHRsZXQgdGFyZ2V0RW50aXR5VHlwZU5hbWU7XG5cdFx0XHRpZiAoaXNFbnRpdHlTZXQodGFyZ2V0RGF0YU1vZGVsT2JqZWN0KSkge1xuXHRcdFx0XHR0YXJnZXRFbnRpdHlUeXBlTmFtZSA9IHRhcmdldERhdGFNb2RlbE9iamVjdC5lbnRpdHlUeXBlPy5uYW1lO1xuXHRcdFx0fSBlbHNlIGlmIChpc05hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXREYXRhTW9kZWxPYmplY3QpKSB7XG5cdFx0XHRcdHRhcmdldEVudGl0eVR5cGVOYW1lID0gdGFyZ2V0RGF0YU1vZGVsT2JqZWN0LnRhcmdldFR5cGU/Lm5hbWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ID0gdGFyZ2V0RW50aXR5VHlwZU5hbWUgJiYgdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW3RhcmdldEVudGl0eVR5cGVOYW1lXTtcblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ICYmIHJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHk/LmlucHV0Py5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHJldHVybnMgdGhlIHByb3BlcnRpZXMgaW4gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSB3aGljaCBhcmUgbWFya2VkIGFzIFJlY29tbWVuZGF0aW9uUm9sZSBPdXRwdXQuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb24gT3V0cHV0IGZpZWxkcyBuZWVkcyB0byBiZSBmaWd1cmVkXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHdoaWNoIGFyZSBtYXJrZWQgUmVjb21tZW5kYXRpb25Sb2xlIE91dHB1dFxuXHQgKi9cblx0cHVibGljIGdldFJlY29tbWVuZGF0aW9uT3V0cHV0RmllbGRzKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdFx0Ly9UT0RPOiBXZSBoYXZlIHRvIGNvbnNpZGVyIDE6MSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2VsbC5cblx0XHRjb25zdCByZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ID0gdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW2VudGl0eVR5cGVOYW1lXTtcblx0XHRpZiAocmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eT8ub3V0cHV0Py5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eS5vdXRwdXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBjb250cm9sLlxuXHQgKiBAcGFyYW0gY29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoY29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRPYmplY3Qua2V5cyh0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbCkuZm9yRWFjaCgoc0VudGl0eVR5cGUpID0+IHtcblx0XHRcdGlmICh0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbFtzRW50aXR5VHlwZV1bY29udHJvbElkXSkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbc0VudGl0eVR5cGVdW2NvbnRyb2xJZF07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICogQHBhcmFtIHBhdGhFeHByZXNzaW9ucyBUYXJnZXRzIG9mIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzKHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmIChwYXRoRXhwcmVzc2lvbnMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmxvZ1JlcXVlc3QocGF0aEV4cHJlc3Npb25zLCBjb250ZXh0KTtcblx0XHRcdGF3YWl0IGNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKHBhdGhFeHByZXNzaW9ucywgZ3JvdXBJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYW4gT0RhdGEgYWN0aW9uLlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0cyBhbmQgYWN0aW9uIGV4ZWN1dGlvblxuXHQgKi9cblx0cHVibGljIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKHNpZGVFZmZlY3RzOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUsIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPCh2b2lkIHwgdW5kZWZpbmVkKVtdPiB7XG5cdFx0bGV0IHByb21pc2VzOiBQcm9taXNlPHZvaWQgfCB1bmRlZmluZWQ+W107XG5cblx0XHRpZiAoc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0cHJvbWlzZXMgPSBzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9ucy5tYXAoYXN5bmMgKGFjdGlvbk5hbWUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZXhlY3V0ZUFjdGlvbihhY3Rpb25OYW1lLCBjb250ZXh0KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9taXNlcyA9IFtdO1xuXHRcdH1cblxuXHRcdGlmIChzaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnM/Lmxlbmd0aCkge1xuXHRcdFx0cHJvbWlzZXMucHVzaCh0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnMsIGNvbnRleHQpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvbWlzZXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbWlzZXMpIDogUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgU2lkZUVmZmVjdHMgZm9yIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUHJvcGVydHkgTmF2aWdhdGlvbiBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWQgQmF0Y2ggZ3JvdXAgZm9yIHRoZSBxdWVyeVxuXHQgKiBAcGFyYW0gaWdub3JlVHJpZ2dlckFjdGlvbnMgSWYgdHJ1ZSwgd2UgZG8gbm90IHRyaWdnZXIgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBzaWRlIGVmZmVjdFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0Z3JvdXBJZD86IHN0cmluZyxcblx0XHRpZ25vcmVUcmlnZ2VyQWN0aW9ucyA9IGZhbHNlXG5cdCk6IFByb21pc2U8dm9pZCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IGJhc2VFbnRpdHlUeXBlID0gdGhpcy5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0aWYgKGJhc2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aCA9IGAke25hdmlnYXRpb25Qcm9wZXJ0eX0vYDtcblx0XHRcdGNvbnN0IGVudGl0eVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGJhc2VFbnRpdHlUeXBlKTtcblx0XHRcdGxldCB0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0bGV0IHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXSA9IFtdO1xuXHRcdFx0bGV0IHNpZGVFZmZlY3RzVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXHRcdFx0T2JqZWN0LmtleXMoZW50aXR5U2lkZUVmZmVjdHMpXG5cdFx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWxldmFudCBTaWRlRWZmZWN0c1xuXHRcdFx0XHRcdC8vIDEuIFNvdXJjZUVudGl0aWVzIG1hdGNoIE9SXG5cdFx0XHRcdFx0Ly8gMi4gT25seSAxIFNvdXJjZVByb3BlcnRpZXMgYW5kIG1hdGNoXG5cdFx0XHRcdFx0KGFubm90YXRpb25OYW1lKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBlbnRpdHlTaWRlRWZmZWN0c1thbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHQoc2lkZUVmZmVjdHMuc291cmNlRW50aXRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0KG5hdmlnYXRpb24pID0+IG5hdmlnYXRpb24uJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT09IG5hdmlnYXRpb25Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHQpIHx8XG5cdFx0XHRcdFx0XHRcdChzaWRlRWZmZWN0cy5zb3VyY2VQcm9wZXJ0aWVzPy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0cy5zb3VyY2VQcm9wZXJ0aWVzLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0XHQocHJvcGVydHlQYXRoKSA9PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGguc3RhcnRzV2l0aChuYXZpZ2F0aW9uUGF0aCkgJiYgIXByb3BlcnR5UGF0aC5yZXBsYWNlKG5hdmlnYXRpb25QYXRoLCBcIlwiKS5pbmNsdWRlcyhcIi9cIilcblx0XHRcdFx0XHRcdFx0XHQpKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmZvckVhY2goKHNBbm5vdGF0aW9uTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzID0gZW50aXR5U2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAoc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbiAmJiAhaWdub3JlVHJpZ2dlckFjdGlvbnMpIHtcblx0XHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUFjdGlvbihzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9uLCBjb250ZXh0LCBncm91cElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGFyZ2V0UHJvcGVydGllcyA9IHRhcmdldFByb3BlcnRpZXMuY29uY2F0KHNpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMpO1xuXHRcdFx0XHRcdHRhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXMuY29uY2F0KHNpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzKTtcblx0XHRcdFx0fSk7XG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlIHRhcmdldHNcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbiA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyh7XG5cdFx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHRhcmdldFByb3BlcnRpZXMsXG5cdFx0XHRcdHRhcmdldEVudGl0aWVzOiB0YXJnZXRFbnRpdGllc1xuXHRcdFx0fSk7XG5cdFx0XHRzaWRlRWZmZWN0c1RhcmdldHMgPSBbLi4uc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uLnRhcmdldFByb3BlcnRpZXMsIC4uLnNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbi50YXJnZXRFbnRpdGllc107XG5cdFx0XHRpZiAoc2lkZUVmZmVjdHNUYXJnZXRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNUYXJnZXRzLCBjb250ZXh0LCBncm91cElkKS5jYXRjaCgoZXJyb3IpID0+XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgU2lkZUVmZmVjdHMgZm9yIE5hdmlnYXRpb24gUHJvcGVydHkgJHtuYXZpZ2F0aW9uUHJvcGVydHl9YCwgZXJyb3IpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBjb250cm9scy5cblx0ICogQHBhcmFtIGVudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIE5hbWVcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbFtlbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cycgcXVhbGlmaWVyIGFuZCBvd25lciBlbnRpdHkgd2hlcmUgdGhpcyBlbnRpdHkgaXMgdXNlZCBhcyBzb3VyY2UuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzaWRlRWZmZWN0cyBpbmZvXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U2lkZUVmZmVjdFdoZXJlRW50aXR5SXNTb3VyY2UoZW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10ge1xuXHRcdHJldHVybiB0aGlzLnNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncy5lbnRpdGllc1tlbnRpdHlUeXBlTmFtZV0gfHwgW107XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cycgcXVhbGlmaWVycyB3aGVyZSB0aGlzIGV2ZW50IGlzIHVzZWQgYXMgc291cmNlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgZnVsbHkgcXVhbGlmaWVkXG5cdCAqIEBwYXJhbSBldmVudE5hbWUgU2lkZSBFZmZlY3QgZXZlbnQgbmFtZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzaWRlRWZmZWN0cyBpbmZvXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U2lkZUVmZmVjdFdoZXJlRXZlbnRJc1NvdXJjZShlbnRpdHlUeXBlTmFtZTogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZyk6IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10ge1xuXHRcdHJldHVybiB0aGlzLnNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncy5ldmVudHNbZXZlbnROYW1lXT8uZmlsdGVyKChldmVudCkgPT4gZXZlbnQuZW50aXR5ID09PSBlbnRpdHlUeXBlTmFtZSkgfHwgW107XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIGZvciBhIHNpZGVFZmZlY3QgZXZlbnQgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKiBAcGFyYW0gZXZlbnQgU2lkZUVmZmVjdHMgZXZlbnQgd2hpY2ggc2hvdWxkIGJlXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdCAqL1xuXHRhc3luYyByZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudChldmVudDogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0LCBncm91cElkPzogc3RyaW5nKTogUHJvbWlzZTx1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0cyA9IHRoaXMuZ2V0T0RhdGFTaWRlRWZmZWN0c0Zyb21Db250ZXh0RXZlbnQoY29udGV4dCwgZXZlbnQpO1xuXHRcdGxldCB0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCB0YXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNFbnRpdHlUeXBlW10gPSBbXTtcblxuXHRcdHNpZGVFZmZlY3RzLmZvckVhY2goKHNpZGVFZmZlY3QpID0+IHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXMgPSB0YXJnZXRQcm9wZXJ0aWVzLmNvbmNhdChzaWRlRWZmZWN0LnRhcmdldFByb3BlcnRpZXMpO1xuXHRcdFx0dGFyZ2V0RW50aXRpZXMgPSB0YXJnZXRFbnRpdGllcy5jb25jYXQoc2lkZUVmZmVjdC50YXJnZXRFbnRpdGllcyk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBzaWRlRWZmZWN0c1RhcmdldERlZmluaXRpb24gPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldHMoe1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogdGFyZ2V0UHJvcGVydGllcyxcblx0XHRcdHRhcmdldEVudGl0aWVzOiB0YXJnZXRFbnRpdGllc1xuXHRcdH0pO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzVGFyZ2V0cyA9IFsuLi5zaWRlRWZmZWN0c1RhcmdldERlZmluaXRpb24udGFyZ2V0UHJvcGVydGllcywgLi4uc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uLnRhcmdldEVudGl0aWVzXTtcblx0XHRpZiAoc2lkZUVmZmVjdHNUYXJnZXRzLmxlbmd0aCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNUYXJnZXRzLCBjb250ZXh0LCBncm91cElkKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5lcnJvcihgU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFNpZGVFZmZlY3RzIGZvciBFdmVudCAke2V2ZW50fWAsIGVycm9yIGFzIHN0cmluZyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvbW1vbiBtZXRob2QgdG8gZ2V0IHRoZSBmaWVsZCBncm91cElkcyBmb3IgYSBzb3VyY2UgZW50aXR5IGFuZCBhIHNvdXJjZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHNvdXJjZUVudGl0eVR5cGVcblx0ICogQHBhcmFtIHNvdXJjZVByb3BlcnR5XG5cdCAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiBmaWVsZEdyb3VwSWRzXG5cdCAqL1xuXHRwdWJsaWMgY29tcHV0ZUZpZWxkR3JvdXBJZHMoc291cmNlRW50aXR5VHlwZTogc3RyaW5nLCBzb3VyY2VQcm9wZXJ0eTogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGVudGl0eUZpZWxkR3JvdXBJZHMgPSB0aGlzLmdldFNpZGVFZmZlY3RXaGVyZUVudGl0eUlzU291cmNlKHNvdXJjZUVudGl0eVR5cGUpLm1hcCgoc2lkZUVmZmVjdEluZm8pID0+XG5cdFx0XHR0aGlzLmdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3Qoc2lkZUVmZmVjdEluZm8sIHRydWUpXG5cdFx0KTtcblx0XHRyZXR1cm4gZW50aXR5RmllbGRHcm91cElkcy5jb25jYXQoXG5cdFx0XHR0aGlzLmdldFNpZGVFZmZlY3RXaGVyZVByb3BlcnR5SXNTb3VyY2Uoc291cmNlUHJvcGVydHkpLm1hcCgoc2lkZUVmZmVjdEluZm8pID0+XG5cdFx0XHRcdHRoaXMuZ2V0RmllbGRHcm91cElkRm9yU2lkZUVmZmVjdChzaWRlRWZmZWN0SW5mbylcblx0XHRcdClcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMnIHF1YWxpZmllciBhbmQgb3duZXIgZW50aXR5IHdoZXJlIHRoaXMgcHJvcGVydHkgaXMgdXNlZCBhcyBzb3VyY2UuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgZnVsbHkgcXVhbGlmaWVkIG5hbWVcblx0ICogQHJldHVybnMgQXJyYXkgb2Ygc2lkZUVmZmVjdHMgaW5mb1xuXHQgKi9cblx0cHVibGljIGdldFNpZGVFZmZlY3RXaGVyZVByb3BlcnR5SXNTb3VyY2UocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdIHtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdIHx8IFtdO1xuXHR9XG5cblx0Ly8gY2hlY2sgaWYgY2FuIGRlZmluZSB3aGV0aGVyIGNhbGxiYWNrcyBhcmUgYXN5bmMuIE90aGVyd2lzZSBjb21tZW50XG5cdC8vIG9ubHkgb25lIGNhbGxiYWNrIGZvciBvbmUgdGFyZ2V0XG5cdHB1YmxpYyByZWdpc3RlclRhcmdldENhbGxiYWNrKHRhcmdldDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHR0aGlzLnRhcmdldENhbGxiYWNrc1t0YXJnZXRdID0gY2FsbGJhY2s7XG5cdH1cblxuXHRwdWJsaWMgZGVyZWdpc3RlclRhcmdldENhbGxiYWNrKHRhcmdldDogc3RyaW5nKTogdm9pZCB7XG5cdFx0ZGVsZXRlIHRoaXMudGFyZ2V0Q2FsbGJhY2tzW3RhcmdldF07XG5cdH1cblxuXHQvLyBwYXNzIHBhcmFtZXRlclxuXHRwdWJsaWMgZ2V0UmVnaXN0ZXJlZENhbGxiYWNrKHRhcmdldDogc3RyaW5nKTogRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRhcmdldENhbGxiYWNrc1t0YXJnZXRdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdXBkYXRlZCBzaWRlIGVmZmVjdHMgZGVmaW5pdGlvbiB3aXRoIGFsbCB0ZXh0IHJlbGF0ZWQgcHJvcGVydGllcy5cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzVGFyZ2V0cyBUaGUgdGFyZ2V0cyBvZiB0aGUgc2lkZSBlZmZlY3Rcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBzaWRlIGVmZmVjdCBpcyByZWdpc3RlcmVkXG5cdCAqIEByZXR1cm5zIFVwZGF0ZWQgc2lkZSBlZmZlY3RzJyB0YXJnZXRzIHdpdGggYWRkZWQgdGV4dCBwcm9wZXJ0aWVzIG9yIGVudGl0aWVzXG5cdCAqL1xuXHRwcml2YXRlIGFkZFRleHRQcm9wZXJ0aWVzKHNpZGVFZmZlY3RzVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlLCBlbnRpdHlUeXBlPzogRW50aXR5VHlwZSk6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB7XG5cdFx0Y29uc3Qgc2V0T2ZQcm9wZXJ0aWVzID0gbmV3IFNldChzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcyk7XG5cdFx0Y29uc3Qgc2V0T2ZFbnRpdGllcyA9IG5ldyBTZXQoc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpKTtcblx0XHQvLyBHZW5lcmF0ZSBhbGwgcGF0aHMgcmVsYXRlZCB0byB0aGUgdGV4dCBwcm9wZXJ0aWVzIGFuZCBub3QgYWxyZWFkeSBjb3ZlcmVkIGJ5IHRoZSBTaWRlRWZmZWN0c1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlQYXRoIG9mIHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGRhdGFNb2RlbFByb3BlcnR5UGF0aCBvZiB0aGlzLmdldERhdGFNb2RlbFByb3BlcnRpZXNGcm9tQVBhdGgocHJvcGVydHlQYXRoLCBlbnRpdHlUeXBlKSkge1xuXHRcdFx0XHRjb25zdCBhc3NvY2lhdGVkVGV4dFBhdGggPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aChkYXRhTW9kZWxQcm9wZXJ0eVBhdGgudGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0aWYgKGFzc29jaWF0ZWRUZXh0UGF0aCkge1xuXHRcdFx0XHRcdHRoaXMuYWRkVGV4dFByb3BlcnR5KGRhdGFNb2RlbFByb3BlcnR5UGF0aCwgcHJvcGVydHlQYXRoLCBhc3NvY2lhdGVkVGV4dFBhdGgsIHNldE9mUHJvcGVydGllcywgc2V0T2ZFbnRpdGllcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IEFycmF5LmZyb20oc2V0T2ZQcm9wZXJ0aWVzKSxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBBcnJheS5mcm9tKHNldE9mRW50aXRpZXMpLm1hcCgobmF2aWdhdGlvbikgPT4ge1xuXHRcdFx0XHRyZXR1cm4geyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogbmF2aWdhdGlvbiB9O1xuXHRcdFx0fSlcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgdGV4dCByZWxhdGVkIHByb3BlcnR5IHRvIHRoZSBzaWRlIGVmZmVjdHMgdGFyZ2V0c1xuXHQgKiBJZiB0aGUgcHJvcGVydHkgaGFzIGFuIGFzc29jaWF0ZWQgdGV4dCB0aGVuIHRoaXMgdGV4dCBuZWVkcyB0byBiZSBhZGRlZCBpZiBpdCdzIG5vdCBhbHJlYWR5IHJlZmxlY3RlZCBpbiB0aGUgc2lkZSBlZmZlY3RzIGRlZmluaXRpb246XG5cdCAqIC0gYXMgdGFyZ2V0UHJvcGVydGllcyBpZiB0aGUgcHJvcGVydHkgYW5kIGl0cyBhc3NvY2lhdGVkIHRleHQgYXJlIG9uIHRoZSBzYW1lIGVudGl0eVNldFxuXHQgKiAtIGFzIHRhcmdldEVudGl0aWVzIGlmIHRoZXkgYXJlIGRlZmluZWQgb24gZGlmZmVyZW50IGVudGl0eVNldHMuXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggVGhlIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBhc3NvY2lhdGVkVGV4dFBhdGggVGhlIGFzc29jaWF0ZWQgdGV4dCBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBzZXRPZlByb3BlcnRpZXMgU2V0IG9mIGV4aXN0aW5nIHNpZGVFZmZlY3QncyB0YXJnZXQgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2V0T2ZFbnRpdGllcyBTZXQgb2YgZXhpc3Rpbmcgc2lkZUVmZmVjdCdzIHRhcmdldCBlbnRpdGllc1xuXHQgKi9cblx0cHJpdmF0ZSBhZGRUZXh0UHJvcGVydHkoXG5cdFx0ZGF0YU1vZGVsUHJvcGVydHlQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0XHRhc3NvY2lhdGVkVGV4dFBhdGg6IHN0cmluZyxcblx0XHRzZXRPZlByb3BlcnRpZXM6IFNldDxzdHJpbmc+LFxuXHRcdHNldE9mRW50aXRpZXM6IFNldDxzdHJpbmc+XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGRhdGFNb2RlbFRleHRQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbFByb3BlcnR5UGF0aCwgYXNzb2NpYXRlZFRleHRQYXRoKTtcblx0XHRjb25zdCByZWxhdGl2ZU5hdmlnYXRpb24gPVxuXHRcdFx0cHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmXG5cdFx0XHRkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlTZXQgJiZcblx0XHRcdGRhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldC5uYW1lICE9PSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGgudGFyZ2V0RW50aXR5U2V0Py5uYW1lXG5cdFx0XHRcdD8gYC8ke2RhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldD8uZnVsbHlRdWFsaWZpZWROYW1lfWBcblx0XHRcdFx0OiBnZXRUYXJnZXROYXZpZ2F0aW9uUGF0aChkYXRhTW9kZWxUZXh0UGF0aCwgdHJ1ZSk7XG5cdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHByb3BlcnR5UGF0aC5zdGFydHNXaXRoKFwiL1wiKVxuXHRcdFx0PyBgLyR7ZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0RW50aXR5U2V0Py5mdWxseVF1YWxpZmllZE5hbWV9LyR7ZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0T2JqZWN0IS5uYW1lfWBcblx0XHRcdDogZ2V0VGFyZ2V0T2JqZWN0UGF0aChkYXRhTW9kZWxUZXh0UGF0aCwgdHJ1ZSk7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5pc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyhcblx0XHRcdFx0ZGF0YU1vZGVsVGV4dFBhdGgsXG5cdFx0XHRcdHJlbGF0aXZlTmF2aWdhdGlvbixcblx0XHRcdFx0dGFyZ2V0UGF0aCxcblx0XHRcdFx0c2V0T2ZQcm9wZXJ0aWVzLFxuXHRcdFx0XHRzZXRPZkVudGl0aWVzXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRpZiAodGhpcy5pc1Byb3BlcnR5QXNzb2NpYXRlZFRleHRPbkRpZmZlcmVudEVudGl0eVNldChkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIGRhdGFNb2RlbFRleHRQYXRoKSkge1xuXHRcdFx0XHRzZXRPZkVudGl0aWVzLmFkZChyZWxhdGl2ZU5hdmlnYXRpb24pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0T2ZQcm9wZXJ0aWVzLmFkZCh0YXJnZXRQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBhc3NvY2lhdGVkIHRleHQgcHJvcGVydHkgbmVlZHMgdG8gYmUgYWRkZWQgaWYgaXQncyBub3QgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIHNpZGUgZWZmZWN0cyBkZWZpbml0aW9uOlxuXHQgKiAtIGFzIHRhcmdldFByb3BlcnRpZXMgaWYgdGhlIHByb3BlcnR5IGFuZCBpdHMgYXNzb2NpYXRlZCB0ZXh0IGFyZSBvbiB0aGUgc2FtZSBlbnRpdHlTZXRcblx0ICogLSBhcyB0YXJnZXRFbnRpdGllcyBpZiB0aGV5IGFyZSBkZWZpbmVkIG9uIGRpZmZlcmVudCBlbnRpdHlTZXRzLlxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsVGV4dFBhdGggVGhlIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBhc3NvY2lhdGVkIHRleHRcblx0ICogQHBhcmFtIHJlbGF0aXZlTmF2aWdhdGlvbiBUaGUgbmF2aWdhdGlvbiB0byB0aGUgdGV4dCBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gdGFyZ2V0UGF0aCBUaGUgYXNzb2NpYXRlZCB0ZXh0IHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHNldE9mUHJvcGVydGllcyBTZXQgb2YgZXhpc3Rpbmcgc2lkZUVmZmVjdCdzIHRhcmdldCBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzZXRPZkVudGl0aWVzIFNldCBvZiBleGlzdGluZyBzaWRlRWZmZWN0J3MgdGFyZ2V0IGVudGl0aWVzXG5cdCAqIEByZXR1cm5zIFVwZGF0ZWQgc2lkZSBlZmZlY3RzJyB0YXJnZXRzIHdpdGggYWRkZWQgdGV4dCBwcm9wZXJ0eSBvciBlbnRpdHlcblx0ICovXG5cdHByaXZhdGUgaXNBc3NvY2lhdGVkVGV4dExpc3RlZEluU2lkZUVmZmVjdFRhcmdldHMoXG5cdFx0ZGF0YU1vZGVsVGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRcdHJlbGF0aXZlTmF2aWdhdGlvbjogc3RyaW5nLFxuXHRcdHRhcmdldFBhdGg6IHN0cmluZyxcblx0XHRzZXRPZlByb3BlcnRpZXM6IFNldDxzdHJpbmc+LFxuXHRcdHNldE9mRW50aXRpZXM6IFNldDxzdHJpbmc+XG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRpc1Byb3BlcnR5KGRhdGFNb2RlbFRleHRQYXRoLnRhcmdldE9iamVjdCkgJiZcblx0XHRcdCFzZXRPZlByb3BlcnRpZXMuaGFzKHRhcmdldFBhdGgpICYmIC8vIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGxpc3RlZFxuXHRcdFx0IXNldE9mUHJvcGVydGllcy5oYXMoYCR7cmVsYXRpdmVOYXZpZ2F0aW9ufSR7ZGF0YU1vZGVsVGV4dFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoID8gXCIvXCIgOiBcIlwifSpgKSAmJiAvLyB0aGUgcHJvcGVydHkgaXMgYWxyZWFkeSBsaXN0ZWQgdGhhbmtzIHRvIHRoZSBcIipcIlxuXHRcdFx0IXNldE9mRW50aXRpZXMuaGFzKGAke3JlbGF0aXZlTmF2aWdhdGlvbn1gKSAvLyB0aGUgcHJvcGVydHkgaXMgbm90IHBhcnQgb2YgYSBUYXJnZXRFbnRpdGllc1xuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBwcm9wZXJ0eSBhbmQgaXRzIGFzc29jaWF0ZWQgdGV4dCBwcm9wZXJ0eSBhcmUgb24gZGlmZmVyZW50IGVudGl0eVNldC5cblx0ICogQHBhcmFtIGRhdGFNb2RlbFByb3BlcnR5UGF0aCBUaGUgbW9kZWwgb2JqZWN0IHBhdGggb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxUZXh0UGF0aCBUaGUgbW9kZWwgb2JqZWN0IHBhdGggb2YgdGhlIGFzc29jaWF0ZWQgdGV4dCBwcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBlbnRpdHlTZXQgaXMgZGlmZmVyZW50XG5cdCAqL1xuXHRwcml2YXRlIGlzUHJvcGVydHlBc3NvY2lhdGVkVGV4dE9uRGlmZmVyZW50RW50aXR5U2V0KFxuXHRcdGRhdGFNb2RlbFByb3BlcnR5UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdFx0ZGF0YU1vZGVsVGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+XG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAoXG5cdFx0XHRkYXRhTW9kZWxQcm9wZXJ0eVBhdGgudGFyZ2V0RW50aXR5U2V0ICE9PSBkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlTZXQgJiZcblx0XHRcdCEhZGF0YU1vZGVsVGV4dFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMgJiZcblx0XHRcdCEhZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0RW50aXR5VHlwZVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgdGhlIFNpZGVFZmZlY3RzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAtIFNldCBUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZ1xuXHQgKiAtIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRhcmdldHMgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqIC0gUmVtb3ZlcyBiaW5kaW5nIHBhcmFtZXRlciBmcm9tIFNpZGVFZmZlY3RzIHRhcmdldHMgcHJvcGVydGllc1xuXHQgKiAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAtIFJlcGxhY2VzIFRhcmdldFByb3BlcnRpZXMgaGF2aW5nIHJlZmVyZW5jZSB0byBTb3VyY2UgUHJvcGVydGllcyBmb3IgYSBTaWRlRWZmZWN0cy5cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHBhcmFtIGJpbmRpbmdQYXJhbWV0ZXIgTmFtZSBvZiB0aGUgYmluZGluZyBwYXJhbWV0ZXJcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBjb252ZXJ0U2lkZUVmZmVjdHMoXG5cdFx0c2lkZUVmZmVjdHM6IENvbW1vblNpZGVFZmZlY3RzVHlwZSxcblx0XHRlbnRpdHlUeXBlPzogRW50aXR5VHlwZSxcblx0XHRiaW5kaW5nUGFyYW1ldGVyPzogc3RyaW5nXG5cdCk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCB0cmlnZ2VyQWN0aW9uID0gc2lkZUVmZmVjdHMuVHJpZ2dlckFjdGlvbiBhcyBzdHJpbmc7XG5cdFx0Y29uc3QgbmV3U2lkZUVmZmVjdHMgPSB0aGlzLmNvbnZlcnRTaWRlRWZmZWN0c0Zvcm1hdChzaWRlRWZmZWN0cyk7XG5cdFx0bGV0IHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHsgdGFyZ2V0UHJvcGVydGllczogbmV3U2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcywgdGFyZ2V0RW50aXRpZXM6IG5ld1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzIH07XG5cdFx0c2lkZUVmZmVjdHNUYXJnZXRzID0gdGhpcy5yZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHNpZGVFZmZlY3RzVGFyZ2V0cywgYmluZGluZ1BhcmFtZXRlcik7XG5cdFx0c2lkZUVmZmVjdHNUYXJnZXRzID0gdGhpcy5hZGRUZXh0UHJvcGVydGllcyhzaWRlRWZmZWN0c1RhcmdldHMsIGVudGl0eVR5cGUpO1xuXHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhzaWRlRWZmZWN0c1RhcmdldHMpO1xuXHRcdHJldHVybiB7XG5cdFx0XHQuLi5uZXdTaWRlRWZmZWN0cyxcblx0XHRcdC4uLnsgdGFyZ2V0RW50aXRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllcywgdGFyZ2V0UHJvcGVydGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMsIHRyaWdnZXJBY3Rpb24gfVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgdGhlIFNpZGVFZmZlY3RzIHRhcmdldHMgKFRhcmdldEVudGl0aWVzIGFuZCBUYXJnZXRQcm9wZXJ0aWVzKSB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogLSBUYXJnZXRQcm9wZXJ0aWVzIGFzIGFycmF5IG9mIHN0cmluZ1xuXHQgKiAtIFRhcmdldEVudGl0aWVzIGFzIGFycmF5IG9mIG9iamVjdCB3aXRoIHByb3BlcnR5ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoLlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcmV0dXJucyBDb252ZXJ0ZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgY29udmVydFNpZGVFZmZlY3RzRm9ybWF0KHNpZGVFZmZlY3RzOiBDb21tb25TaWRlRWZmZWN0c1R5cGUpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgZm9ybWF0UHJvcGVydGllcyA9IChwcm9wZXJ0aWVzPzogKHN0cmluZyB8IFByb3BlcnR5UGF0aClbXSk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHJldHVybiBwcm9wZXJ0aWVzXG5cdFx0XHRcdD8gcHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdLCB0YXJnZXQpID0+IHtcblx0XHRcdFx0XHRcdGxldCBwYXRoID0gXCJcIjtcblx0XHRcdFx0XHRcdGlmIChpc1Byb3BlcnR5UGF0aEV4cHJlc3Npb24odGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gdGFyZ2V0LnZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdHBhdGggPSB0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRQcm9wZXJ0aWVzLnB1c2gocGF0aCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0XHRcdFx0YFNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBUYXJnZXRQcm9wZXJ0aWVzIGZvciBTaWRlRWZmZWN0cyAke3NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0UHJvcGVydGllcztcblx0XHRcdFx0ICB9LCBbXSlcblx0XHRcdFx0OiBwcm9wZXJ0aWVzO1xuXHRcdH07XG5cdFx0Y29uc3QgZm9ybWF0RW50aXRpZXMgPSAoZW50aXRpZXM/OiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW10pOiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgfVtdIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHJldHVybiBlbnRpdGllc1xuXHRcdFx0XHQ/IGVudGl0aWVzLm1hcCgodGFyZ2V0RW50aXR5KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogdGFyZ2V0RW50aXR5LnZhbHVlIH07XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBlbnRpdGllcztcblx0XHR9O1xuXG5cdFx0Ly8gVE9ETzogU291cmNlRXZlbnRzIGFyZSBzdGlsbCBleHBlcmltZW50YWwsIHJlbW92ZSBvbmNlIHB1YmxpY1xuXHRcdHR5cGUgQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoU291cmNlRXZlbnRzID0gQ29tbW9uU2lkZUVmZmVjdHNUeXBlICYgeyBTb3VyY2VFdmVudHM/OiBFZG0uU3RyaW5nW10gfTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IHNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdHNvdXJjZVByb3BlcnRpZXM6IGZvcm1hdFByb3BlcnRpZXMoc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyksXG5cdFx0XHRzb3VyY2VFbnRpdGllczogZm9ybWF0RW50aXRpZXMoc2lkZUVmZmVjdHMuU291cmNlRW50aXRpZXMpLFxuXHRcdFx0c291cmNlRXZlbnRzOiAoc2lkZUVmZmVjdHMgYXMgQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoU291cmNlRXZlbnRzKS5Tb3VyY2VFdmVudHMgYXMgc3RyaW5nW10sXG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBmb3JtYXRQcm9wZXJ0aWVzKHNpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgKHN0cmluZyB8IFByb3BlcnR5UGF0aClbXSkgPz8gW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogZm9ybWF0RW50aXRpZXMoc2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMpID8/IFtdXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGFsbCBkYXRhTW9kZWxPYmplY3RQYXRoIHJlbGF0ZWQgdG8gcHJvcGVydGllcyBsaXN0ZWQgYnkgYSBwYXRoXG5cdCAqXG5cdCAqIFRoZSBwYXRoIGNhbiBiZTpcblx0ICogLSBhIHBhdGggdGFyZ2V0aW5nIGEgcHJvcGVydHkgb24gYSBjb21wbGV4VHlwZSBvciBhbiBFbnRpdHlUeXBlXG5cdCAqIC0gYSBwYXRoIHdpdGggYSBzdGFyIHRhcmdldGluZyBhbGwgcHJvcGVydGllcyBvbiBhIGNvbXBsZXhUeXBlIG9yIGFuIEVudGl0eVR5cGUuXG5cdCAqIC0gYWJzb2x1dGUuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHBhdGggdG8gYW5hbHl6ZVxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBkYXRhTW9kZWxPYmplY3RQYXRoIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBnZXREYXRhTW9kZWxQcm9wZXJ0aWVzRnJvbUFQYXRoKHByb3BlcnR5UGF0aDogc3RyaW5nLCBlbnRpdHlUeXBlPzogRW50aXR5VHlwZSk6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+W10ge1xuXHRcdGxldCBkYXRhTW9kZWxPYmplY3RQYXRoczogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT5bXSA9IFtdO1xuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFNb2RlbCA9IHRoaXMuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk7XG5cblx0XHRsZXQgcHJvcGVydHlSZWxhdGl2ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgdGVzdEVudGl0eVR5cGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbDtcblx0XHRpZiAocHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoYC8ke3RoaXMuY29udGFpbmVyTmFtZX0vYCkpIHtcblx0XHRcdG1hdGNoID0gcHJvcGVydHlQYXRoLm1hdGNoKHRoaXMuY29udGFpbmVyUmVnZXhQYXR0ZXJuKTtcblx0XHRcdHByb3BlcnR5UmVsYXRpdmVQYXRoID0gbWF0Y2ggPyBtYXRjaFsxXSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCFlbnRpdHlUeXBlKSB7XG5cdFx0XHRtYXRjaCA9IHByb3BlcnR5UGF0aC5tYXRjaCh0aGlzLmVudGl0eVR5cGVSZWdleFBhdHRlcm4pO1xuXHRcdFx0dGVzdEVudGl0eVR5cGVOYW1lID0gbWF0Y2ggPyBtYXRjaFsxXSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgdGVzdEVudGl0eVR5cGUgPVxuXHRcdFx0ZW50aXR5VHlwZSA/P1xuXHRcdFx0KCh0ZXN0RW50aXR5VHlwZU5hbWUgPyBjb252ZXJ0ZWRNZXRhTW9kZWwucmVzb2x2ZVBhdGgoYC8ke3Rlc3RFbnRpdHlUeXBlTmFtZX0vYCkudGFyZ2V0IDogdW5kZWZpbmVkKSBhcyBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkKTtcblx0XHRjb25zdCBlbnRpdHlTZXQgPVxuXHRcdFx0Y29udmVydGVkTWV0YU1vZGVsLmVudGl0eVNldHMuZmluZCgocmVsYXRlZEVudGl0eVNldCkgPT4gcmVsYXRlZEVudGl0eVNldC5lbnRpdHlUeXBlID09PSB0ZXN0RW50aXR5VHlwZSkgPz9cblx0XHRcdGNvbnZlcnRlZE1ldGFNb2RlbC5zaW5nbGV0b25zLmZpbmQoKHNpbmdsZXRvbikgPT4gc2luZ2xldG9uLmVudGl0eVR5cGUgPT09IHRlc3RFbnRpdHlUeXBlKTtcblx0XHRpZiAoZW50aXR5U2V0KSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0aGlzLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRlbnRpdHlTZXRDb250ZXh0ID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAvJHtlbnRpdHlTZXQubmFtZX1gKTtcblx0XHRcdGlmIChlbnRpdHlTZXRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFNb2RlbEVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhlbnRpdHlTZXRDb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5IHwgRW50aXR5VHlwZT4oXG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxFbnRpdHlTZXQsXG5cdFx0XHRcdFx0XHQocHJvcGVydHlSZWxhdGl2ZVBhdGggfHwgcHJvcGVydHlQYXRoKS5yZXBsYWNlKFwiKlwiLCBcIlwiKSB8fCBcIi9cIlxuXHRcdFx0XHRcdCksIC8vIFwiKlwiIGlzIHJlcGxhY2VkIGJ5IFwiL1wiIHRvIHRhcmdldCB0aGUgY3VycmVudCBFbnRpdHlUeXBlXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdFx0XHRcdGlmIChpc1Byb3BlcnR5KHRhcmdldE9iamVjdCkpIHtcblx0XHRcdFx0XHRpZiAoaXNDb21wbGV4VHlwZSh0YXJnZXRPYmplY3QudGFyZ2V0VHlwZSkpIHtcblx0XHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGhzID0gZGF0YU1vZGVsT2JqZWN0UGF0aHMuY29uY2F0KFxuXHRcdFx0XHRcdFx0XHR0YXJnZXRPYmplY3QudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+XG5cdFx0XHRcdFx0XHRcdFx0ZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbE9iamVjdFBhdGgsIHByb3BlcnR5Lm5hbWUpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGhzLnB1c2goZGF0YU1vZGVsT2JqZWN0UGF0aCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGlzRW50aXR5VHlwZSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aHMgPSBkYXRhTW9kZWxPYmplY3RQYXRocy5jb25jYXQoXG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKGVudGl0eVByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgZW50aXR5UHJvcGVydHkubmFtZSk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZW50aXR5U2V0Q29udGV4dC5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBkYXRhTW9kZWxPYmplY3RQYXRocy5maWx0ZXIoKGRhdGFNb2RlbE9iamVjdFBhdGgpID0+IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBPZGF0YSBtZXRhbW9kZWwuXG5cdCAqIEByZXR1cm5zIFRoZSBPRGF0YSBtZXRhbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0TWV0YU1vZGVsKCk6IE9EYXRhTWV0YU1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGFuIGVudGl0eSB0eXBlIG9yIGFjdGlvbiB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aCBleHBlY3RlZCBmb3JtYXQuXG5cdCAqIEBwYXJhbSBzb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIGdldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShzb3VyY2U6IEVudGl0eVR5cGUgfCBBY3Rpb24pOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdIHtcblx0XHRsZXQgYmluZGluZ0FsaWFzID0gXCJcIjtcblx0XHRjb25zdCBpc1NvdXJjZUVudGl0eVR5cGUgPSBpc0VudGl0eVR5cGUoc291cmNlKTtcblx0XHRjb25zdCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkID0gaXNTb3VyY2VFbnRpdHlUeXBlID8gc291cmNlIDogc291cmNlLnNvdXJjZUVudGl0eVR5cGU7XG5cdFx0Y29uc3QgY29tbW9uQW5ub3RhdGlvbiA9IHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIGFzIHVuZGVmaW5lZCB8IHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgQ29tbW9uQW5ub3RhdGlvblR5cGVzPjtcblx0XHRpZiAoY29tbW9uQW5ub3RhdGlvbikge1xuXHRcdFx0aWYgKGVudGl0eVR5cGUgJiYgIWlzU291cmNlRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nUGFyYW1ldGVyID0gc291cmNlLnBhcmFtZXRlcnM/LmZpbmQoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLnR5cGUgPT09IGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdFx0YmluZGluZ0FsaWFzID0gYmluZGluZ1BhcmFtZXRlcj8uZnVsbHlRdWFsaWZpZWROYW1lLnNwbGl0KFwiL1wiKVsxXSA/PyBcIlwiO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0U2lkZUVmZmVjdHNBbm5vdGF0aW9uRnJvbVNvdXJjZShzb3VyY2UpLm1hcCgoc2lkZUVmZmVjdEFubm8pID0+XG5cdFx0XHRcdHRoaXMuY29udmVydFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RBbm5vLCBlbnRpdHlUeXBlLCBiaW5kaW5nQWxpYXMpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uLlxuXHQgKiBAcGFyYW0gc291cmNlIEVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBnZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlKHNvdXJjZTogRW50aXR5VHlwZSB8IEFjdGlvbik6IENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllcltdIHtcblx0XHRjb25zdCBzaWRlRWZmZWN0czogQ29tbW9uU2lkZUVmZmVjdHNUeXBlW10gPSBbXTtcblx0XHRjb25zdCBjb21tb25Bbm5vdGF0aW9uID0gc291cmNlLmFubm90YXRpb25zPy5Db21tb24gYXMgdW5kZWZpbmVkIHwgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXI+O1xuXHRcdGZvciAoY29uc3Qga2V5IGluIGNvbW1vbkFubm90YXRpb24pIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb24gPSBjb21tb25Bbm5vdGF0aW9uW2tleV07XG5cdFx0XHRpZiAodGhpcy5pc1NpZGVFZmZlY3RzQW5ub3RhdGlvbihhbm5vdGF0aW9uKSkge1xuXHRcdFx0XHRzaWRlRWZmZWN0cy5wdXNoKGFubm90YXRpb24pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBhbm5vdGF0aW9uIGlzIGEgU2lkZUVmZmVjdHMgYW5ub3RhdGlvbi5cblx0ICogQHBhcmFtIGFubm90YXRpb24gQW5ub3RhdGlvblxuXHQgKiBAcmV0dXJucyBCb29sZWFuXG5cdCAqL1xuXHRwcml2YXRlIGlzU2lkZUVmZmVjdHNBbm5vdGF0aW9uKGFubm90YXRpb246IHVua25vd24pOiBhbm5vdGF0aW9uIGlzIENvbW1vblNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0cmV0dXJuIChhbm5vdGF0aW9uIGFzIENvbW1vblNpZGVFZmZlY3RzVHlwZSk/LiRUeXBlID09PSBDb21tb25Bbm5vdGF0aW9uVHlwZXMuU2lkZUVmZmVjdHNUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgdGhlIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqIEBwYXJhbSBwYXRoRXhwcmVzc2lvbnMgU2lkZUVmZmVjdHMgdGFyZ2V0c1xuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqL1xuXHRwcml2YXRlIGxvZ1JlcXVlc3QocGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBjb250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3QgdGFyZ2V0UGF0aHMgPSBwYXRoRXhwcmVzc2lvbnMucmVkdWNlKGZ1bmN0aW9uIChwYXRocywgdGFyZ2V0KSB7XG5cdFx0XHRyZXR1cm4gYCR7cGF0aHN9XFxuXFx0XFx0JHsodGFyZ2V0IGFzIFNpZGVFZmZlY3RzRW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgdGFyZ2V0IHx8IFwiXCJ9YDtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoYFNpZGVFZmZlY3RzIC0gUmVxdWVzdDpcXG5cXHRDb250ZXh0IHBhdGggOiAke2NvbnRleHQuZ2V0UGF0aCgpfVxcblxcdFByb3BlcnR5IHBhdGhzIDoke3RhcmdldFBhdGhzfWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIG5hbWUgb2YgdGhlIGJpbmRpbmcgcGFyYW1ldGVyIG9uIHRoZSBTaWRlRWZmZWN0cyB0YXJnZXRzLlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNUYXJnZXRzIFNpZGVFZmZlY3RzIFRhcmdldHNcblx0ICogQHBhcmFtIGJpbmRpbmdQYXJhbWV0ZXJOYW1lIE5hbWUgb2YgYmluZGluZyBwYXJhbWV0ZXJcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHJpdmF0ZSByZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHNpZGVFZmZlY3RzVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlLCBiaW5kaW5nUGFyYW1ldGVyTmFtZT86IHN0cmluZyk6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB7XG5cdFx0aWYgKGJpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCByZXBsYWNlQmluZGluZ1BhcmFtZXRlciA9IGZ1bmN0aW9uICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXiR7YmluZGluZ1BhcmFtZXRlck5hbWV9Lz9gKSwgXCJcIik7XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dGFyZ2V0UHJvcGVydGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMubWFwKCh0YXJnZXRQcm9wZXJ0eSkgPT4gcmVwbGFjZUJpbmRpbmdQYXJhbWV0ZXIodGFyZ2V0UHJvcGVydHkpKSxcblx0XHRcdFx0dGFyZ2V0RW50aXRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllcy5tYXAoKHRhcmdldEVudGl0eSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiByZXBsYWNlQmluZGluZ1BhcmFtZXRlcih0YXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpIH07XG5cdFx0XHRcdH0pXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMsXG5cdFx0XHR0YXJnZXRFbnRpdGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgZHVwbGljYXRlcyBpbiBTaWRlRWZmZWN0cyB0YXJnZXRzLlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNUYXJnZXRzIFNpZGVFZmZlY3RzIFRhcmdldHNcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgdGFyZ2V0cyB3aXRob3V0IGR1cGxpY2F0ZXNcblx0ICovXG5cdHByaXZhdGUgcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhzaWRlRWZmZWN0c1RhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSk6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXRpZXNQYXRocyA9IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllcy5tYXAoKHRhcmdldEVudGl0eSkgPT4gdGFyZ2V0RW50aXR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCB1bmlxdWVUYXJnZXRlZEVudGl0aWVzUGF0aCA9IG5ldyBTZXQ8c3RyaW5nPih0YXJnZXRFbnRpdGllc1BhdGhzKTtcblx0XHRjb25zdCB1bmlxdWVUYXJnZXRQcm9wZXJ0aWVzID0gbmV3IFNldDxzdHJpbmc+KHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzKTtcblxuXHRcdGNvbnN0IHVuaXF1ZVRhcmdldGVkRW50aXRpZXMgPSBBcnJheS5mcm9tKHVuaXF1ZVRhcmdldGVkRW50aXRpZXNQYXRoKS5tYXAoKGVudGl0eVBhdGgpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBlbnRpdHlQYXRoXG5cdFx0XHR9O1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHsgdGFyZ2V0UHJvcGVydGllczogQXJyYXkuZnJvbSh1bmlxdWVUYXJnZXRQcm9wZXJ0aWVzKSwgdGFyZ2V0RW50aXRpZXM6IHVuaXF1ZVRhcmdldGVkRW50aXRpZXMgfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIGFjdGlvbiB0eXBlIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgb24gYWN0aW9uc1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uXG5cdCAqIEByZXR1cm5zIEVudGl0eSB0eXBlIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHByaXZhdGUgcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhhY3Rpb246IEFjdGlvbik6IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0Y29uc3QgdHJpZ2dlckFjdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRsZXQgdGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgdGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdID0gW107XG5cblx0XHR0aGlzLmdldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShhY3Rpb24pLmZvckVhY2goKG9EYXRhU2lkZUVmZmVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgdHJpZ2dlckFjdGlvbiA9IG9EYXRhU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uO1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllcyA9IHRhcmdldFByb3BlcnRpZXMuY29uY2F0KG9EYXRhU2lkZUVmZmVjdC50YXJnZXRQcm9wZXJ0aWVzKTtcblx0XHRcdHRhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXMuY29uY2F0KG9EYXRhU2lkZUVmZmVjdC50YXJnZXRFbnRpdGllcyk7XG5cdFx0XHRpZiAodHJpZ2dlckFjdGlvbikge1xuXHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5hZGQodHJpZ2dlckFjdGlvbik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNUYXJnZXRzID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHsgdGFyZ2V0UHJvcGVydGllcywgdGFyZ2V0RW50aXRpZXMgfSk7XG5cdFx0Y29uc3QgYWN0aW9uTmFtZSA9IGFjdGlvbi5pc0JvdW5kID8gYWN0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZS5tYXRjaCgvXlteKF0rLyk/LlswXSA6IGFjdGlvbi5uYW1lO1xuXHRcdHNpZGVFZmZlY3RzW2FjdGlvbk5hbWUhXSA9IHtcblx0XHRcdHBhdGhFeHByZXNzaW9uczogWy4uLnNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLCAuLi5zaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXNdLFxuXHRcdFx0dHJpZ2dlckFjdGlvbnM6IEFycmF5LmZyb20odHJpZ2dlckFjdGlvbnMpXG5cdFx0fTtcblx0XHRyZXR1cm4gc2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBlbnRpdHkgdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSByZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3QgZW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKGVudGl0eVR5cGUpLmZvckVhY2goKHNpZGVFZmZlY3RzKSA9PiB7XG5cdFx0XHRlbnRpdHlTaWRlRWZmZWN0c1tzaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gc2lkZUVmZmVjdHM7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGVudGl0eVNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgYSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgb24gdGhlIGVudGl0eSB0byB0cmFjayB3aGVyZSB0aG9zZSBzb3VyY2VzIGFyZSB1c2VkIGluIFNpZGVFZmZlY3RzIGFubm90YXRpb24uXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHlUeXBlIHdlIGxvb2sgZm9yIHNpZGUgRWZmZWN0cyBhbm5vdGF0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMgVGhlIG1hcHBpbmcgb2JqZWN0IGluIGNvbnN0cnVjdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1xuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlcyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH1cblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBzaWRlRWZmZWN0RGVmaW5pdGlvbiBvZiB0aGlzLmdldFNpZGVFZmZlY3RzQW5ub3RhdGlvbkZyb21Tb3VyY2UoZW50aXR5VHlwZSkpIHtcblx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZUVudGl0aWVzKGVudGl0eVR5cGUsIHNpZGVFZmZlY3RzU291cmNlcywgc2lkZUVmZmVjdERlZmluaXRpb24pO1xuXHRcdFx0dGhpcy5tYXBTaWRlRWZmZWN0U291cmNlUHJvcGVydGllcyhlbnRpdHlUeXBlLCBzaWRlRWZmZWN0c1NvdXJjZXMsIHNpZGVFZmZlY3REZWZpbml0aW9uKTtcblx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZUV2ZW50cyhlbnRpdHlUeXBlLCBzaWRlRWZmZWN0c1NvdXJjZXMsIHNpZGVFZmZlY3REZWZpbml0aW9uKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmlsbHMgdGhlIG1hcCBmb3IgdGhlIFNvdXJjZXMgb2Ygc2lkZUVmZmVjdCB3aXRoIHNvdXJjZSBlbnRpdGllcy5cblx0ICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eVR5cGUgd2UgbG9vayBmb3Igc2lkZSBFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcyBUaGUgbWFwcGluZyBvYmplY3QgaW4gY29uc3RydWN0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0RGVmaW5pdGlvbiBUaGUgc2lkZSBlZmZlY3QgZGVmaW5pdGlvbiB0byBiZSBldmFsdWF0ZWRcblx0ICovXG5cdHByaXZhdGUgbWFwU2lkZUVmZmVjdFNvdXJjZUVudGl0aWVzKFxuXHRcdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c2lkZUVmZmVjdHNTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSxcblx0XHRzaWRlRWZmZWN0RGVmaW5pdGlvbjogQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3Qgc291cmNlRW50aXR5IG9mIHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZUVudGl0aWVzID8/IFtdKSB7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gc291cmNlRW50aXR5LnZhbHVlID8gc291cmNlRW50aXR5LiR0YXJnZXQ/LnRhcmdldFR5cGUgOiBlbnRpdHlUeXBlO1xuXHRcdFx0aWYgKHRhcmdldEVudGl0eVR5cGUpIHtcblx0XHRcdFx0aWYgKCFzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNbdGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzW3RhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1t0YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0ucHVzaCh7XG5cdFx0XHRcdFx0ZW50aXR5OiBlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0XHRxdWFsaWZpZXI6IHNpZGVFZmZlY3REZWZpbml0aW9uLnF1YWxpZmllclxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmlsbHMgdGhlIG1hcCBmb3IgdGhlIFNvdXJjZXMgb2Ygc2lkZUVmZmVjdCB3aXRoIHNvdXJjZSBwcm9wZXJ0aWVzLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSB3ZSBsb29rIGZvciBzaWRlIEVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzIFRoZSBtYXBwaW5nIG9iamVjdCBpbiBjb25zdHJ1Y3Rpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3REZWZpbml0aW9uIFRoZSBzaWRlIGVmZmVjdCBkZWZpbml0aW9uIHRvIGJlIGV2YWx1YXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlUHJvcGVydGllcyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0sXG5cdFx0c2lkZUVmZmVjdERlZmluaXRpb246IENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllclxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eSA9IHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZVByb3BlcnRpZXM/Lmxlbmd0aCA9PT0gMTtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZVByb3BlcnR5IG9mIHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZVByb3BlcnRpZXMgPz8gW10pIHtcblx0XHRcdGlmIChzb3VyY2VQcm9wZXJ0eS4kdGFyZ2V0KSB7XG5cdFx0XHRcdGlmICghc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNbc291cmNlUHJvcGVydHkuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNbc291cmNlUHJvcGVydHkuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWVdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNbc291cmNlUHJvcGVydHkuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWVdLnB1c2goe1xuXHRcdFx0XHRcdGVudGl0eTogZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdFx0cXVhbGlmaWVyOiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5xdWFsaWZpZXIsXG5cdFx0XHRcdFx0aGFzVW5pcXVlU291cmNlUHJvcGVydHlcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoZSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgd2l0aCBzb3VyY2UgZXZlbnRzLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSB3ZSBsb29rIGZvciBzaWRlIEVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzIFRoZSBtYXBwaW5nIG9iamVjdCBpbiBjb25zdHJ1Y3Rpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3REZWZpbml0aW9uIFRoZSBzaWRlIGVmZmVjdCBkZWZpbml0aW9uIHRvIGJlIGV2YWx1YXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlRXZlbnRzKFxuXHRcdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c2lkZUVmZmVjdHNTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSxcblx0XHRzaWRlRWZmZWN0RGVmaW5pdGlvbjogQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3Qgc291cmNlRXZlbnQgb2Ygc2lkZUVmZmVjdERlZmluaXRpb24uU291cmNlRXZlbnRzID8/IFtdKSB7XG5cdFx0XHRpZiAoIXNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNbc291cmNlRXZlbnQudG9TdHJpbmcoKV0pIHtcblx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1tzb3VyY2VFdmVudC50b1N0cmluZygpXSA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1tzb3VyY2VFdmVudC50b1N0cmluZygpXS5wdXNoKHtcblx0XHRcdFx0ZW50aXR5OiBlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0cXVhbGlmaWVyOiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5xdWFsaWZpZXJcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZpZWxkR3JvdXBJZCBiYXNlZCBvbiB0aGUgc3RvcmVkIGluZm9ybWF0aW9uIG9uIHRoIHNpZGUgZWZmZWN0LlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdEluZm9cblx0ICogQHBhcmFtIGlzSW1tZWRpYXRlXG5cdCAqIEByZXR1cm5zIEEgc3RyaW5nIGZvciB0aGUgZmllbGRHcm91cElkLlxuXHQgKi9cblx0cHJpdmF0ZSBnZXRGaWVsZEdyb3VwSWRGb3JTaWRlRWZmZWN0KHNpZGVFZmZlY3RJbmZvOiBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZSwgaXNJbW1lZGlhdGUgPSBmYWxzZSk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdFdpdGhRdWFsaWZpZXIgPSBzaWRlRWZmZWN0SW5mby5xdWFsaWZpZXJcblx0XHRcdD8gYCR7c2lkZUVmZmVjdEluZm8uZW50aXR5fSMke3NpZGVFZmZlY3RJbmZvLnF1YWxpZmllcn1gXG5cdFx0XHQ6IHNpZGVFZmZlY3RJbmZvLmVudGl0eTtcblx0XHRyZXR1cm4gaXNJbW1lZGlhdGUgfHwgc2lkZUVmZmVjdEluZm8uaGFzVW5pcXVlU291cmNlUHJvcGVydHkgPT09IHRydWVcblx0XHRcdD8gYCR7c2lkZUVmZmVjdFdpdGhRdWFsaWZpZXJ9JCRJbW1lZGlhdGVSZXF1ZXN0YFxuXHRcdFx0OiBzaWRlRWZmZWN0V2l0aFF1YWxpZmllcjtcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBTaWRlRWZmZWN0c1NlcnZpY2Uge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGFzeW5jIGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8U2lkZUVmZmVjdHNTZXR0aW5ncz4pOiBQcm9taXNlPFNpZGVFZmZlY3RzU2VydmljZT4ge1xuXHRcdGNvbnN0IFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UgPSBuZXcgU2lkZUVmZmVjdHNTZXJ2aWNlKG9TZXJ2aWNlQ29udGV4dCk7XG5cdFx0cmV0dXJuIFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UuaW5pdGlhbGl6ZSgpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwRkE7RUFDQTtFQUFBLElBd0NhQSxrQkFBa0IsMEJBQUFDLFFBQUE7SUFBQSxTQUFBRCxtQkFBQTtNQUFBLE9BQUFDLFFBQUEsQ0FBQUMsS0FBQSxPQUFB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
1116
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaWRlRWZmZWN0c1NlcnZpY2UiLCJfU2VydmljZSIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2V4cG9ydHMiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsImluaXQiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsImFwcENvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwic2lkZUVmZmVjdHNSZWdpc3RyeSIsIm9EYXRhIiwiZW50aXRpZXMiLCJhY3Rpb25zIiwiYm91bmRBY3Rpb25zIiwidW5Cb3VuZEFjdGlvbnMiLCJjb250cm9sIiwicmVjb21tZW5kYXRpb25SZWdpc3RyeSIsInJvbGVzIiwidGFyZ2V0Q2FsbGJhY2tzIiwiaW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24iLCJtb2RlbCIsImdldE1vZGVsIiwidXJsIiwiZ2V0V2ViU29ja2V0QmFzZVVybCIsImNoYW5uZWwiLCJnZXRXZWJTb2NrZXRDaGFubmVsVXJsIiwiQ2hhbm5lbFR5cGUiLCJTaWRlRWZmZWN0c0V2ZW50cyIsIndlYlNvY2tldCIsImNyZWF0ZVdlYlNvY2tldCIsImF0dGFjaE1lc3NhZ2UiLCJvblNpZGVFZmZlY3RzRXZlbnRSZWNlaXZlZCIsImJpbmQiLCJ3ZWJTb2NrZXRTdGF0dXMiLCJXRUJTT0NLRVRfU1RBVFVTIiwiQ09OTkVDVEVEIiwic2hvd0Nvbm5lY3Rpb25Mb3N0RGlhbG9nIiwiQ0xPU0VEIiwiRVJST1IiLCJpbmNsdWRlcyIsInJlc291cmNlTW9kZWwiLCJnZXRSZXNvdXJjZU1vZGVsIiwibG9zdE9mQ29ubmVjdGlvblRleHQiLCJnZXRUZXh0IiwiTWVzc2FnZUJveCIsIndhcm5pbmciLCJBY3Rpb24iLCJPSyIsImVtcGhhc2l6ZWRBY3Rpb24iLCJhdHRhY2hFcnJvciIsImF0dGFjaENsb3NlIiwiZXZ0IiwiZ2V0UGFyYW1ldGVyIiwiZXZlbnQiLCJtZXNzYWdlIiwic2VydmVyQWN0aW9uIiwic2lkZUVmZmVjdEV2ZW50TmFtZSIsInNpZGVFZmZlY3RTb3VyY2UiLCJtZXRhUGF0aCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFDb250ZXh0IiwiZGF0YU1vZGVsIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwicmVsZXZhbnRTaWRlRWZmZWN0cyIsImdldFNpZGVFZmZlY3RXaGVyZUV2ZW50SXNTb3VyY2UiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibGVuZ3RoIiwicmVsZXZhbnRQYWdlcyIsInBhZ2VzIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0VmlzaWJsZVZpZXdzIiwicGFnZSIsInBhZ2VDb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImlzQSIsIl9zaWRlRWZmZWN0cyIsImlzRGF0YVBhdGhSZWxldmFudCIsInB1c2giLCJzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24iLCJvbmx5UmVjb21tZW5kYXRpb25zIiwiaXNPbmx5UmVjb21tZW5kYXRpb25zIiwiaW50ZXJhY3Rpb25UeXBlIiwiZ2V0U2lkZUVmZmVjdHNJbnRlcmFjdGlvblR5cGUiLCJjb25maXJtRGF0YVJlZnJlc2giLCJlcnJvciIsIm5vdGlmeURhdGFSZWZyZXNoIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yRXZlbnQiLCJyZWNvbW1lbmRhdGlvblBhdGgiLCJhbm5vdGF0aW9ucyIsIlVJIiwiUmVjb21tZW5kYXRpb25zIiwicGF0aCIsInNpZGVFZmZlY3QiLCJhbm5vdGF0aW9uIiwiZW50aXR5IiwicXVhbGlmaWVyIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwidW5kZWZpbmVkIiwiaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbiIsImdldE1hbmlmZXN0RW50cnkiLCJhcHAiLCJzaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uVHlwZSIsImV2ZW50cyIsImRlZmF1bHQiLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJlbnRpdHlUeXBlIiwic291cmNlQ29udHJvbElkIiwiY29udHJvbFNpZGVFZmZlY3QiLCJlbnRpdHlDb250cm9sU2lkZUVmZmVjdHMiLCJleGVjdXRlQWN0aW9uIiwidHJpZ2dlckFjdGlvbiIsImdyb3VwSWQiLCJhY3Rpb24iLCJiaW5kQ29udGV4dCIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwic3VibWl0QmF0Y2giLCJleGVjdXRlIiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiY29udmVydFR5cGVzIiwiY2FwYWJpbGl0aWVzIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibWV0YU1vZGVsIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImVudGl0eVR5cGVOYW1lIiwiaXNDb250cm9sU2lkZUVmZmVjdHMiLCJzaWRlRWZmZWN0cyIsImdldEdsb2JhbE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJlbnRpdHlTaWRlRWZmZWN0cyIsImdsb2JhbFNpZGVFZmZlY3RzIiwia2V5Iiwic291cmNlRW50aXRpZXMiLCJzb3VyY2VQcm9wZXJ0aWVzIiwic291cmNlRXZlbnRzIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsImFjdGlvbk5hbWUiLCJnZXRPRGF0YVNpZGVFZmZlY3RzRnJvbUNvbnRleHRFdmVudCIsInNpZGVFZmZlY3RzSW5mbyIsIm1hcCIsImluaXRpYWxpemUiLCJzaWRlRWZmZWN0U291cmNlcyIsInByb3BlcnRpZXMiLCJlbnZpcm9ubWVudENhcGFiaWxpdGllc1NlcnZpY2UiLCJnZXRTZXJ2aWNlIiwicmVxdWVzdE9iamVjdCIsImdldENhcGFiaWxpdGllcyIsImNvbnZlcnRlZE1ldGFNb2RlbCIsImNvbnRhaW5lck5hbWUiLCJlbnRpdHlDb250YWluZXIiLCJjb250YWluZXJSZWdleFBhdHRlcm4iLCJSZWdFeHAiLCJlbnRpdHlUeXBlUmVnZXhQYXR0ZXJuIiwiZW50aXR5VHlwZXMiLCJmb3JFYWNoIiwibWFwRmllbGRBbm5vdGF0aW9ucyIsInJldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIm1hcFNpZGVFZmZlY3RTb3VyY2VzIiwiaXNCb3VuZCIsInNvdXJjZUVudGl0eVR5cGUiLCJyZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncyIsInNvdXJjZSIsImFkZFJlY29tbWVuZGF0aW9uUm9sZXMiLCJzb3VyY2VOYW1lIiwiaGFzT3duUHJvcGVydHkiLCJpbnB1dCIsIm91dHB1dCIsImVudGl0eVByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsImNvbW1vbkFubm8iLCJDb21tb24iLCJSZWNvbW1lbmRhdGlvblJvbGUiLCJyb2xlVHlwZSIsInZhbHVlT2YiLCJuYW1lIiwiZ2V0UmVjb21tZW5kYXRpb25zTWFwcGluZyIsImNoZWNrSWZGaWVsZElzUmVjb21tZW5kYXRpb25SZWxldmFudCIsImZpZWxkIiwiZ2V0QmluZGluZ0NvbnRleHQiLCJwcm9wZXJ0eU5hbWUiLCJkYXRhIiwic291cmNlUGF0aCIsInNwbGl0IiwicG9wIiwibWV0YUNvbnRleHQiLCJ0YXJnZXREYXRhTW9kZWxPYmplY3QiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlUeXBlTmFtZSIsImlzRW50aXR5U2V0IiwiaXNOYXZpZ2F0aW9uUHJvcGVydHkiLCJ0YXJnZXRUeXBlIiwicmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eSIsImdldFJlY29tbWVuZGF0aW9uT3V0cHV0RmllbGRzIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiY29udHJvbElkIiwic0VudGl0eVR5cGUiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJwYXRoRXhwcmVzc2lvbnMiLCJsb2dSZXF1ZXN0IiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24iLCJwcm9taXNlcyIsInRyaWdnZXJBY3Rpb25zIiwiUHJvbWlzZSIsImFsbCIsInJlc29sdmUiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCJpZ25vcmVUcmlnZ2VyQWN0aW9ucyIsImJhc2VFbnRpdHlUeXBlIiwibmF2aWdhdGlvblBhdGgiLCJzaWRlRWZmZWN0c1RhcmdldHMiLCJmaWx0ZXIiLCJhbm5vdGF0aW9uTmFtZSIsInNvbWUiLCJuYXZpZ2F0aW9uIiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eVBhdGgiLCJzdGFydHNXaXRoIiwicmVwbGFjZSIsInNBbm5vdGF0aW9uTmFtZSIsImNvbmNhdCIsInNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbiIsInJlbW92ZUR1cGxpY2F0ZVRhcmdldHMiLCJjYXRjaCIsIkxvZyIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsImdldFNpZGVFZmZlY3RXaGVyZUVudGl0eUlzU291cmNlIiwiZXZlbnROYW1lIiwiY29tcHV0ZUZpZWxkR3JvdXBJZHMiLCJzb3VyY2VQcm9wZXJ0eSIsImVudGl0eUZpZWxkR3JvdXBJZHMiLCJzaWRlRWZmZWN0SW5mbyIsImdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3QiLCJnZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlIiwicmVnaXN0ZXJUYXJnZXRDYWxsYmFjayIsInRhcmdldCIsImNhbGxiYWNrIiwiZGVyZWdpc3RlclRhcmdldENhbGxiYWNrIiwiZ2V0UmVnaXN0ZXJlZENhbGxiYWNrIiwiYWRkVGV4dFByb3BlcnRpZXMiLCJzZXRPZlByb3BlcnRpZXMiLCJTZXQiLCJzZXRPZkVudGl0aWVzIiwiZGF0YU1vZGVsUHJvcGVydHlQYXRoIiwiZ2V0RGF0YU1vZGVsUHJvcGVydGllc0Zyb21BUGF0aCIsImFzc29jaWF0ZWRUZXh0UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwiYWRkVGV4dFByb3BlcnR5IiwiQXJyYXkiLCJmcm9tIiwiZGF0YU1vZGVsVGV4dFBhdGgiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsInJlbGF0aXZlTmF2aWdhdGlvbiIsInRhcmdldEVudGl0eVNldCIsImdldFRhcmdldE5hdmlnYXRpb25QYXRoIiwidGFyZ2V0UGF0aCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJpc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyIsImlzUHJvcGVydHlBc3NvY2lhdGVkVGV4dE9uRGlmZmVyZW50RW50aXR5U2V0IiwiYWRkIiwiaXNQcm9wZXJ0eSIsImhhcyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiY29udmVydFNpZGVFZmZlY3RzIiwiYmluZGluZ1BhcmFtZXRlciIsIlRyaWdnZXJBY3Rpb24iLCJuZXdTaWRlRWZmZWN0cyIsImNvbnZlcnRTaWRlRWZmZWN0c0Zvcm1hdCIsInJlbW92ZUJpbmRpbmdQYXJhbWV0ZXIiLCJmb3JtYXRQcm9wZXJ0aWVzIiwicmVkdWNlIiwiaXNQcm9wZXJ0eVBhdGhFeHByZXNzaW9uIiwidmFsdWUiLCJmb3JtYXRFbnRpdGllcyIsInRhcmdldEVudGl0eSIsIlNvdXJjZVByb3BlcnRpZXMiLCJTb3VyY2VFbnRpdGllcyIsIlNvdXJjZUV2ZW50cyIsIlRhcmdldFByb3BlcnRpZXMiLCJUYXJnZXRFbnRpdGllcyIsImRhdGFNb2RlbE9iamVjdFBhdGhzIiwicHJvcGVydHlSZWxhdGl2ZVBhdGgiLCJ0ZXN0RW50aXR5VHlwZU5hbWUiLCJtYXRjaCIsInRlc3RFbnRpdHlUeXBlIiwicmVzb2x2ZVBhdGgiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZmluZCIsInJlbGF0ZWRFbnRpdHlTZXQiLCJzaW5nbGV0b25zIiwic2luZ2xldG9uIiwiZW50aXR5U2V0Q29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZGF0YU1vZGVsRW50aXR5U2V0IiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImlzQ29tcGxleFR5cGUiLCJpc0VudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0eSIsImRlc3Ryb3kiLCJnZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJiaW5kaW5nQWxpYXMiLCJpc1NvdXJjZUVudGl0eVR5cGUiLCJjb21tb25Bbm5vdGF0aW9uIiwicGFyYW1ldGVycyIsInBhcmFtZXRlciIsInR5cGUiLCJnZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlIiwic2lkZUVmZmVjdEFubm8iLCJpc1NpZGVFZmZlY3RzQW5ub3RhdGlvbiIsIiRUeXBlIiwidGFyZ2V0UGF0aHMiLCJwYXRocyIsImRlYnVnIiwiYmluZGluZ1BhcmFtZXRlck5hbWUiLCJyZXBsYWNlQmluZGluZ1BhcmFtZXRlciIsInRhcmdldFByb3BlcnR5IiwidGFyZ2V0RW50aXRpZXNQYXRocyIsInVuaXF1ZVRhcmdldGVkRW50aXRpZXNQYXRoIiwidW5pcXVlVGFyZ2V0UHJvcGVydGllcyIsInVuaXF1ZVRhcmdldGVkRW50aXRpZXMiLCJlbnRpdHlQYXRoIiwib0RhdGFTaWRlRWZmZWN0Iiwic2lkZUVmZmVjdHNTb3VyY2VzIiwic2lkZUVmZmVjdERlZmluaXRpb24iLCJtYXBTaWRlRWZmZWN0U291cmNlRW50aXRpZXMiLCJtYXBTaWRlRWZmZWN0U291cmNlUHJvcGVydGllcyIsIm1hcFNpZGVFZmZlY3RTb3VyY2VFdmVudHMiLCJzb3VyY2VFbnRpdHkiLCIkdGFyZ2V0IiwiaGFzVW5pcXVlU291cmNlUHJvcGVydHkiLCJzb3VyY2VFdmVudCIsInRvU3RyaW5nIiwiaXNJbW1lZGlhdGUiLCJzaWRlRWZmZWN0V2l0aFF1YWxpZmllciIsImdldEludGVyZmFjZSIsIlNlcnZpY2UiLCJTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IiwiX1NlcnZpY2VGYWN0b3J5IiwiX3Byb3RvMiIsImNyZWF0ZUluc3RhbmNlIiwib1NlcnZpY2VDb250ZXh0IiwiU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSIsIlNlcnZpY2VGYWN0b3J5Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcblx0QWN0aW9uLFxuXHRDb252ZXJ0ZWRNZXRhZGF0YSxcblx0RW50aXR5U2V0LFxuXHRFbnRpdHlUeXBlLFxuXHROYXZpZ2F0aW9uUHJvcGVydHksXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgsXG5cdFByb3BlcnR5LFxuXHRQcm9wZXJ0eVBhdGhcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSAqIGFzIEVkbSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvRWRtXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUeXBlIGFzIENvbW1vblNpZGVFZmZlY3RzVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uX0VkbVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHtcblx0U2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvbk1hbmlmZXN0U2V0dGluZyxcblx0U2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvblR5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQge1xuXHRpc0NvbXBsZXhUeXBlLFxuXHRpc0VudGl0eVNldCxcblx0aXNFbnRpdHlUeXBlLFxuXHRpc05hdmlnYXRpb25Qcm9wZXJ0eSxcblx0aXNQcm9wZXJ0eSxcblx0aXNQcm9wZXJ0eVBhdGhFeHByZXNzaW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IENoYW5uZWxUeXBlLCBXRUJTT0NLRVRfU1RBVFVTLCBjcmVhdGVXZWJTb2NrZXQsIGdldFdlYlNvY2tldEJhc2VVcmwsIGdldFdlYlNvY2tldENoYW5uZWxVcmwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9XZWJTb2NrZXRcIjtcbmltcG9ydCB7IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBTZXJ2aWNlIGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VcIjtcbmltcG9ydCBTZXJ2aWNlRmFjdG9yeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgU2FwUGNwV2ViU29ja2V0IGZyb20gXCJzYXAvdWkvY29yZS93cy9TYXBQY3BXZWJTb2NrZXRcIjtcbmltcG9ydCB0eXBlIHsgV2ViU29ja2V0JENsb3NlRXZlbnQsIFdlYlNvY2tldCRNZXNzYWdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvd3MvV2ViU29ja2V0XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGgsIGdldFRhcmdldE5hdmlnYXRpb25QYXRoLCBnZXRUYXJnZXRPYmplY3RQYXRoIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudENhcGFiaWxpdGllcywgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlIH0gZnJvbSBcIi4vRW52aXJvbm1lbnRTZXJ2aWNlRmFjdG9yeVwiO1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eUFubm90YXRpb25zV2l0aFJlY29tbWVuZGF0aW9uID0gUHJvcGVydHlBbm5vdGF0aW9uc19Db21tb24gJiB7XG5cdFJlY29tbWVuZGF0aW9uUm9sZT86IHN0cmluZztcbn07XG5cbnR5cGUgU2lkZUVmZmVjdHNTZXR0aW5ncyA9IHt9O1xuXG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c0VudGl0eVR5cGUgPSB7XG5cdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUYXJnZXQgPSBTaWRlRWZmZWN0c0VudGl0eVR5cGUgfCBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0dGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXTtcbn07XG5cbnR5cGUgQmFzZVNpZGVFZmZlY3RzVHlwZSA9IHtcblx0c291cmNlUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHRzb3VyY2VFbnRpdGllcz86IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdO1xuXHRzb3VyY2VFdmVudHM/OiBzdHJpbmdbXTtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59ICYgU2lkZUVmZmVjdHNUYXJnZXRUeXBlO1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IEJhc2VTaWRlRWZmZWN0c1R5cGUgJiB7XG5cdHRyaWdnZXJBY3Rpb24/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdHBhdGhFeHByZXNzaW9ucz86IFNpZGVFZmZlY3RzVGFyZ2V0W107XG5cdHRyaWdnZXJBY3Rpb25zPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0gUGFydGlhbDxCYXNlU2lkZUVmZmVjdHNUeXBlPiAmIHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cdHNvdXJjZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRzb3VyY2VDb250cm9sSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVHlwZSA9IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgfCBPRGF0YVNpZGVFZmZlY3RzVHlwZTtcblxuLy9UT0RPIGZpeCB0aGlzIHR5cGUgaW4gdGhlIHV4IHZvY2FidWxhcmllc1xuLy9UT0RPOiBTb3VyY2UgRXZlbnRzIGFyZSBzdGlsbCBleHBlcmltZW50YWwsIHJlbW92ZSBvbmNlIHB1YmxpY1xudHlwZSBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXIgPSBDb21tb25TaWRlRWZmZWN0c1R5cGUgJiB7IHF1YWxpZmllcj86IHN0cmluZzsgU291cmNlRXZlbnRzPzogRWRtLlN0cmluZ1tdIH07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlID0geyBlbnRpdHk6IHN0cmluZzsgcXVhbGlmaWVyPzogc3RyaW5nOyBoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eT86IGJvb2xlYW4gfTtcblxudHlwZSBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5ID0ge1xuXHRvRGF0YToge1xuXHRcdGVudGl0aWVzOiB7XG5cdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0XHRhY3Rpb25zOiB7XG5cdFx0XHRib3VuZEFjdGlvbnM6IHtcblx0XHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcblx0XHRcdH07XG5cdFx0XHR1bkJvdW5kQWN0aW9uczoge1xuXHRcdFx0XHRbYWN0aW9uOiBzdHJpbmddOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGU7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH07XG5cdGNvbnRyb2w6IHtcblx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPjtcblx0fTtcbn07XG5cbnR5cGUgUmVjb21tZW5kYXRpb25zUm9sZXMgPSB7XG5cdGlucHV0OiBzdHJpbmdbXTtcblx0b3V0cHV0OiBzdHJpbmdbXTtcblx0cmVxdWlyZWQ/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlY29tbWVuZGF0aW9uc1JlZ2lzdHJ5ID0ge1xuXHRyb2xlczogUmVjb3JkPHN0cmluZywgUmVjb21tZW5kYXRpb25zUm9sZXM+O1xufTtcblxudHlwZSBXZWJTb2NrZXRNZXNzYWdlID0ge1xuXHRzZXJ2ZXJBY3Rpb246IFwiUmFpc2VTaWRlRWZmZWN0XCI7XG5cdHNpZGVFZmZlY3RFdmVudE5hbWU6IHN0cmluZztcblx0c2lkZUVmZmVjdFNvdXJjZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIFNpZGVFZmZlY3RzU2VydmljZSBleHRlbmRzIFNlcnZpY2U8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRhcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cblx0cHJpdmF0ZSBzaWRlRWZmZWN0c1JlZ2lzdHJ5ITogU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeTtcblxuXHRwcml2YXRlIHJlY29tbWVuZGF0aW9uUmVnaXN0cnkhOiBSZWNvbW1lbmRhdGlvbnNSZWdpc3RyeTtcblxuXHRwcml2YXRlIGNhcGFiaWxpdGllcyE6IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzIHwgdW5kZWZpbmVkO1xuXG5cdHByaXZhdGUgc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzIToge1xuXHRcdGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHR9O1xuXG5cdC8vIENhbGxiYWNrIG1ldGhvZHMgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEgc2lkZSBlZmZlY3QgdGFyZ2V0IGlzIGhpdFxuXHRwcml2YXRlIHRhcmdldENhbGxiYWNrcyE6IFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPjtcblxuXHQvLyBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byByZXRyaWV2ZSBTaWRlRWZmZWN0cyBldmVudHNcblx0cHJpdmF0ZSB3ZWJTb2NrZXQ/OiBTYXBQY3BXZWJTb2NrZXQ7XG5cblx0cHJpdmF0ZSBjb250YWluZXJOYW1lPzogc3RyaW5nO1xuXG5cdHByaXZhdGUgY29udGFpbmVyUmVnZXhQYXR0ZXJuITogUmVnRXhwO1xuXG5cdHByaXZhdGUgZW50aXR5VHlwZVJlZ2V4UGF0dGVybiE6IFJlZ0V4cDtcblxuXHRwcml2YXRlIHdlYlNvY2tldFN0YXR1cyE6IFdFQlNPQ0tFVF9TVEFUVVM7XG5cdC8vIEludGVyYWN0aW9uIHR5cGUgZm9yIFNpZGVFZmZlY3RzIGV2ZW50c1xuXHRwcml2YXRlIGludGVyYWN0aW9uVHlwZURlZmluaXRpb24/OiBTaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uTWFuaWZlc3RTZXR0aW5nO1xuXG5cdC8vICE6IG1lYW5zIHRoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGFzc2lnbmVkIGJlZm9yZSB1c2FnZVxuXHRpbml0KCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHR0aGlzLmFwcENvbXBvbmVudCA9IGNvbnRleHQ/LnNjb3BlT2JqZWN0IGFzIEFwcENvbXBvbmVudDtcblx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkgPSB7XG5cdFx0XHRvRGF0YToge1xuXHRcdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRcdGFjdGlvbnM6IHtcblx0XHRcdFx0XHRib3VuZEFjdGlvbnM6IHt9LFxuXHRcdFx0XHRcdHVuQm91bmRBY3Rpb25zOiB7fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbDoge31cblx0XHR9O1xuXG5cdFx0dGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5ID0ge1xuXHRcdFx0cm9sZXM6IHt9XG5cdFx0fTtcblx0XHR0aGlzLnRhcmdldENhbGxiYWNrcyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbm5lY3RzIHRvIGEgZ2l2ZW4gV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gcmV0cmlldmUgU2lkZUVmZmVjdHMgZXZlbnRzLlxuXHQgKlxuXHQgKi9cblx0aW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24oKTogdm9pZCB7XG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmFwcENvbXBvbmVudC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHVybCA9IGdldFdlYlNvY2tldEJhc2VVcmwobW9kZWwpO1xuXHRcdGNvbnN0IGNoYW5uZWwgPSBnZXRXZWJTb2NrZXRDaGFubmVsVXJsKENoYW5uZWxUeXBlLlNpZGVFZmZlY3RzRXZlbnRzLCBtb2RlbCk7XG5cblx0XHRpZiAodXJsICYmIGNoYW5uZWwpIHtcblx0XHRcdHRoaXMud2ViU29ja2V0ID0gY3JlYXRlV2ViU29ja2V0KENoYW5uZWxUeXBlLlNpZGVFZmZlY3RzRXZlbnRzLCBtb2RlbCk7XG5cdFx0XHR0aGlzLndlYlNvY2tldC5hdHRhY2hNZXNzYWdlKHRoaXMub25TaWRlRWZmZWN0c0V2ZW50UmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLndlYlNvY2tldFN0YXR1cyA9IFdFQlNPQ0tFVF9TVEFUVVMuQ09OTkVDVEVEO1xuXG5cdFx0XHRjb25zdCBzaG93Q29ubmVjdGlvbkxvc3REaWFsb2cgPSAoKTogdm9pZCA9PiB7XG5cdFx0XHRcdGlmIChbV0VCU09DS0VUX1NUQVRVUy5DTE9TRUQsIFdFQlNPQ0tFVF9TVEFUVVMuRVJST1JdLmluY2x1ZGVzKHRoaXMud2ViU29ja2V0U3RhdHVzKSkge1xuXHRcdFx0XHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0XHRjb25zdCBsb3N0T2ZDb25uZWN0aW9uVGV4dCA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfU0lERUVGRkVDVF9DT05ORUNUSU9OX0xPU1RcIik7XG5cblx0XHRcdFx0XHRNZXNzYWdlQm94Lndhcm5pbmcobG9zdE9mQ29ubmVjdGlvblRleHQsIHtcblx0XHRcdFx0XHRcdGFjdGlvbnM6IFtNZXNzYWdlQm94LkFjdGlvbi5PS10sXG5cdFx0XHRcdFx0XHRlbXBoYXNpemVkQWN0aW9uOiBNZXNzYWdlQm94LkFjdGlvbi5PS1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLndlYlNvY2tldC5hdHRhY2hFcnJvcigoKSA9PiB7XG5cdFx0XHRcdHRoaXMud2ViU29ja2V0U3RhdHVzID0gV0VCU09DS0VUX1NUQVRVUy5FUlJPUjtcblx0XHRcdFx0c2hvd0Nvbm5lY3Rpb25Mb3N0RGlhbG9nKCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy53ZWJTb2NrZXQuYXR0YWNoQ2xvc2UoKGV2dDogV2ViU29ja2V0JENsb3NlRXZlbnQpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMud2ViU29ja2V0U3RhdHVzID09PSBXRUJTT0NLRVRfU1RBVFVTLkVSUk9SKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMud2ViU29ja2V0U3RhdHVzID0gV0VCU09DS0VUX1NUQVRVUy5DTE9TRUQ7XG5cdFx0XHRcdC8vIFJGQyA2NDU1IGRlZmluZXMgdGhlIHN0YXR1cyBjb2RlcyB3aGVuIGNsb3NpbmcgYW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbiA6ICBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LjRcblx0XHRcdFx0Ly8gc3RhdHVzIGNvZGUgMTAwMCBtZWFucyBub3JtYWwgY2xvc3VyZVxuXHRcdFx0XHRpZiAoKGV2dC5nZXRQYXJhbWV0ZXIoXCJjb2RlXCIpIGFzIG51bWJlciB8IHVuZGVmaW5lZCkgIT09IDEwMDApIHtcblx0XHRcdFx0XHRzaG93Q29ubmVjdGlvbkxvc3REaWFsb2coKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29ubmVjdGVkIFdlYlNvY2tldCBzZW5kcyBhIG1lc3NhZ2UuXG5cdCAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgd2l0aCB0aGUgcmVsZXZhbnQgc2lkZUVmZmVjdCBpbmZvcm1hdGlvblxuXHQgKi9cblx0YXN5bmMgb25TaWRlRWZmZWN0c0V2ZW50UmVjZWl2ZWQoZXZlbnQ6IFdlYlNvY2tldCRNZXNzYWdlRXZlbnQgJiBFdmVudDx7IHBjcEZpZWxkcz86IFdlYlNvY2tldE1lc3NhZ2UgfT4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBtZXNzYWdlID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwicGNwRmllbGRzXCIpO1xuXG5cdFx0aWYgKG1lc3NhZ2U/LnNlcnZlckFjdGlvbiAhPT0gXCJSYWlzZVNpZGVFZmZlY3RcIiB8fCAhbWVzc2FnZS5zaWRlRWZmZWN0RXZlbnROYW1lIHx8ICFtZXNzYWdlLnNpZGVFZmZlY3RTb3VyY2UpIHtcblx0XHRcdC8vIG1lc3NhZ2UgaXMgbm90IHJlbGV2YW50XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWV0YVBhdGggPSB0aGlzLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KG1lc3NhZ2Uuc2lkZUVmZmVjdFNvdXJjZSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsID0gTWV0YU1vZGVsQ29udmVydGVyLmdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhUGF0aCk7XG5cdFx0Y29uc3QgcmVsZXZhbnRTaWRlRWZmZWN0cyA9IHRoaXMuZ2V0U2lkZUVmZmVjdFdoZXJlRXZlbnRJc1NvdXJjZShcblx0XHRcdGRhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdG1lc3NhZ2Uuc2lkZUVmZmVjdEV2ZW50TmFtZVxuXHRcdCk7XG5cblx0XHRpZiAocmVsZXZhbnRTaWRlRWZmZWN0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIG5vIHNpZGUgZWZmZWN0IGZvciB0aGlzIHNvdXJjZVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbGV2YW50UGFnZXM6IFBhZ2VDb250cm9sbGVyW10gPSBbXTtcblx0XHRjb25zdCBwYWdlcyA9IHRoaXMuYXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpLmdldFZpc2libGVWaWV3cygpO1xuXHRcdGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuXHRcdFx0Y29uc3QgcGFnZUNvbnRyb2xsZXIgPSBwYWdlLmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGlmIChcblx0XHRcdFx0cGFnZUNvbnRyb2xsZXIuaXNBPFBhZ2VDb250cm9sbGVyPihcInNhcC5mZS5jb3JlLlBhZ2VDb250cm9sbGVyXCIpICYmXG5cdFx0XHRcdHBhZ2VDb250cm9sbGVyLl9zaWRlRWZmZWN0cy5pc0RhdGFQYXRoUmVsZXZhbnQobWVzc2FnZS5zaWRlRWZmZWN0U291cmNlLCBtZXNzYWdlLnNpZGVFZmZlY3RFdmVudE5hbWUpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsZXZhbnRQYWdlcy5wdXNoKHBhZ2VDb250cm9sbGVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocmVsZXZhbnRQYWdlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIG5vIHJlbGV2YW50IHBhZ2UgZm91bmQgZm9yIHRoaXMgc291cmNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gd2UgYXNrIHRoZSB1c2VyIHRvIGNvbmZpcm0gdGhlIHJlZnJlc2ggb3Igbm90aWZ5IHRoZSB1c2VyLCB3ZSB1c2UgdGhlIG1vc3Qgc3BlY2lmaWMgcGFnZVxuXHRcdGNvbnN0IHNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiA9IHJlbGV2YW50UGFnZXNbcmVsZXZhbnRQYWdlcy5sZW5ndGggLSAxXS5fc2lkZUVmZmVjdHM7XG5cdFx0Y29uc3Qgb25seVJlY29tbWVuZGF0aW9ucyA9IHRoaXMuaXNPbmx5UmVjb21tZW5kYXRpb25zKGRhdGFNb2RlbCwgcmVsZXZhbnRTaWRlRWZmZWN0cyk7XG5cdFx0Y29uc3QgaW50ZXJhY3Rpb25UeXBlID0gdGhpcy5nZXRTaWRlRWZmZWN0c0ludGVyYWN0aW9uVHlwZShtZXNzYWdlLnNpZGVFZmZlY3RFdmVudE5hbWUsIG9ubHlSZWNvbW1lbmRhdGlvbnMpO1xuXG5cdFx0c3dpdGNoIChpbnRlcmFjdGlvblR5cGUpIHtcblx0XHRcdGNhc2UgXCJDb25maXJtYXRpb25cIjpcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24uY29uZmlybURhdGFSZWZyZXNoKCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vdGlmaWNhdGlvblwiOlxuXHRcdFx0XHRzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24ubm90aWZ5RGF0YVJlZnJlc2goKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTm9uZVwiOlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvLyBub3cgcmVmcmVzaCB0aGUgcGFnZXMsIGZvcndhcmQgdGhpcyB0YXNrIHRvIHRoZSBzaWRlIGVmZmVjdHMgY29udHJvbGxlciBleHRlbnNpb25zIHRvIGFsbG93IG92ZXJyaWRpbmcgcGVyIHBhZ2UgKGkuZS4gTFIpXG5cdFx0Zm9yIChjb25zdCBwYWdlIG9mIHJlbGV2YW50UGFnZXMpIHtcblx0XHRcdGF3YWl0IHBhZ2UuX3NpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50KG1lc3NhZ2Uuc2lkZUVmZmVjdEV2ZW50TmFtZSwgbWVzc2FnZS5zaWRlRWZmZWN0U291cmNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgb25seSByZWNvbW1lbmRhdGlvbnMgYXJlIGRlZmluZWQgZm9yIGEgc3BlY2lmaWMgZXZlbnQuXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWwgVGhlIGRhdGEgbW9kZWwgb2JqZWN0IHBhdGhcblx0ICogQHBhcmFtIHJlbGV2YW50U2lkZUVmZmVjdHMgVGhlIHJlbGV2YW50IHNpZGUgZWZmZWN0cyBmb3IgdGhlIHNvdXJjZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIG9ubHkgcmVjb21tZW5kYXRpb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgZXZlbnRcblx0ICovXG5cdGlzT25seVJlY29tbWVuZGF0aW9ucyhkYXRhTW9kZWw6IERhdGFNb2RlbE9iamVjdFBhdGg8dW5rbm93bj4sIHJlbGV2YW50U2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10pOiBib29sZWFuIHtcblx0XHRjb25zdCByZWNvbW1lbmRhdGlvblBhdGggPSAoXG5cdFx0XHRkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5hbm5vdGF0aW9ucy5VST8uUmVjb21tZW5kYXRpb25zIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxzdHJpbmc+IHwgdW5kZWZpbmVkXG5cdFx0KT8ucGF0aDtcblx0XHRmb3IgKGNvbnN0IHNpZGVFZmZlY3Qgb2YgcmVsZXZhbnRTaWRlRWZmZWN0cykge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbiA9XG5cdFx0XHRcdHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5vRGF0YS5lbnRpdGllc1tkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdPy5bXG5cdFx0XHRcdFx0YCR7c2lkZUVmZmVjdC5lbnRpdHl9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0cyMke3NpZGVFZmZlY3QucXVhbGlmaWVyfWBcblx0XHRcdFx0XTtcblx0XHRcdC8vIGNoZWNrIGlmIHRoZSBzaWRlIGVmZmVjdCBpcyBvbmx5IGEgcmVjb21tZW5kYXRpb25cblx0XHRcdGlmIChcblx0XHRcdFx0YW5ub3RhdGlvbj8udGFyZ2V0UHJvcGVydGllcy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0YW5ub3RhdGlvbj8udGFyZ2V0RW50aXRpZXMubGVuZ3RoID09PSAwICYmXG5cdFx0XHRcdGFubm90YXRpb24/LnRhcmdldFByb3BlcnRpZXNbMF0gPT09IHJlY29tbWVuZGF0aW9uUGF0aFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHNpZGUgZWZmZWN0cyBpbnRlcmFjdGlvbiB0eXBlIGZyb20gdGhlIG1hbmlmZXN0LlxuXHQgKiAgQHBhcmFtIGV2ZW50IFRoZSBzaWRlIGVmZmVjdHMgZXZlbnQgbmFtZVxuXHQgKiAgQHBhcmFtIG9ubHlSZWNvbW1lbmRhdGlvbnMgSW5kaWNhdG9yIGlmIG9ubHkgcmVjb21tZW5kYXRpb25zIGFyZSBzaG93blxuXHQgKiBAcmV0dXJucyBUaGUgc2lkZSBlZmZlY3RzIGludGVyYWN0aW9uIHR5cGVcblx0ICovXG5cdGdldFNpZGVFZmZlY3RzSW50ZXJhY3Rpb25UeXBlKGV2ZW50OiBzdHJpbmcsIG9ubHlSZWNvbW1lbmRhdGlvbnMgPSBmYWxzZSk6IFNpZGVFZmZlY3RzRXZlbnRzSW50ZXJhY3Rpb25UeXBlIHtcblx0XHRpZiAoIXRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbikge1xuXHRcdFx0dGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5mZVwiKT8uYXBwPy5zaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uVHlwZTtcblx0XHR9XG5cdFx0aWYgKG9ubHlSZWNvbW1lbmRhdGlvbnMpIHtcblx0XHRcdC8vIEluIGNhc2Ugb2Ygb25seSByZWNvbW1lbmRhdGlvbnMsIHdlIGRvIG5vdCBzaG93IGFueSBub3RpZmljYXRpb25cblx0XHRcdHJldHVybiBcIk5vbmVcIjtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHRoaXMuaW50ZXJhY3Rpb25UeXBlRGVmaW5pdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0Ly8gYSBnbG9iYWwgaW50ZXJhY3Rpb24gdHlwZSBpcyBkZWZpbmVkXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uO1xuXHRcdH1cblxuXHRcdGlmIChldmVudCAmJiB0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24/LmV2ZW50cz8uW2V2ZW50XSkge1xuXHRcdFx0Ly8gYW4gaW50ZXJhY3Rpb24gdHlwZSBpcyBkZWZpbmVkIGZvciB0aGUgZXZlbnRcblx0XHRcdHJldHVybiB0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24uZXZlbnRzW2V2ZW50XTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5pbnRlcmFjdGlvblR5cGVEZWZpbml0aW9uPy5kZWZhdWx0KSB7XG5cdFx0XHQvLyBhIGRlZmF1bHQgaW50ZXJhY3Rpb24gdHlwZSBpcyBkZWZpbmVkIGZvciB0aGUgZXZlbnRcblx0XHRcdHJldHVybiB0aGlzLmludGVyYWN0aW9uVHlwZURlZmluaXRpb24uZGVmYXVsdDtcblx0XHR9XG5cblx0XHRyZXR1cm4gXCJOb3RpZmljYXRpb25cIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbFxuXHQgKiBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGlzIGFkZGVkIGJ5IGEgY29udHJvbCB0byBrZWVwIGRhdGEgdXAgdG8gZGF0ZVxuXHQgKiBUaGVzZSBTaWRlRWZmZWN0cyBnZXQgbGltaXRlZCBzY29wZSBjb21wYXJlZCB3aXRoIFNpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGFuIE9EYXRhIHNlcnZpY2U6XG5cdCAqIC0gT25seSBvbmUgU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBjYW4gYmUgZGVmaW5lZCBmb3IgdGhlIGNvbWJpbmF0aW9uIGVudGl0eSB0eXBlIC0gY29udHJvbCBJZFxuXHQgKiAtIE9ubHkgU2lkZUVmZmVjdHMgc291cmNlIHByb3BlcnRpZXMgYXJlIHJlY29nbml6ZWQgYW5kIHVzZWQgdG8gdHJpZ2dlciBTaWRlRWZmZWN0c1xuXHQgKlxuXHQgKiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ29udHJvbFNpZGVFZmZlY3RzKGVudGl0eVR5cGU6IHN0cmluZywgc2lkZUVmZmVjdDogT21pdDxDb250cm9sU2lkZUVmZmVjdHNUeXBlLCBcImZ1bGx5UXVhbGlmaWVkTmFtZVwiPik6IHZvaWQge1xuXHRcdGlmIChzaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZCkge1xuXHRcdFx0Y29uc3QgY29udHJvbFNpZGVFZmZlY3Q6IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRcdC4uLnNpZGVFZmZlY3QsXG5cdFx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogYCR7ZW50aXR5VHlwZX0vU2lkZUVmZmVjdHNGb3JDb250cm9sLyR7c2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWR9YFxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyA9IHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5jb250cm9sW2VudGl0eVR5cGVdIHx8IHt9O1xuXHRcdFx0ZW50aXR5Q29udHJvbFNpZGVFZmZlY3RzW2NvbnRyb2xTaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZF0gPSBjb250cm9sU2lkZUVmZmVjdDtcblx0XHRcdHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5jb250cm9sW2VudGl0eVR5cGVdID0gZW50aXR5Q29udHJvbFNpZGVFZmZlY3RzO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBTaWRlRWZmZWN0cyBhY3Rpb24uXG5cdCAqIEBwYXJhbSB0cmlnZ2VyQWN0aW9uIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aXRob3V0IGRhdGEgb3Igd2l0aCBhIHJldHVybiB2YWx1ZSBjb250ZXh0IHdoZW4gdGhlIGFjdGlvbiBjYWxsIHN1Y2NlZWRzXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgZXhlY3V0ZUFjdGlvbih0cmlnZ2VyQWN0aW9uOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBhY3Rpb24gPSBjb250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoYCR7dHJpZ2dlckFjdGlvbn0oLi4uKWAsIGNvbnRleHQpO1xuXHRcdGdyb3VwSWQgPSBncm91cElkIHx8IGNvbnRleHQuZ2V0QmluZGluZygpLmdldFVwZGF0ZUdyb3VwSWQoKTtcblx0XHQvLyB0aGUgdHJpZ2dlckFjdGlvbiBpcyBleGVjdXRlZCBpbiBzYW1lICRiYXRjaCBidXQgZGlmZmVyZW50IGNoYW5nZXNldFxuXHRcdGNvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChncm91cElkKTtcblx0XHRhd2FpdCBhY3Rpb24uZXhlY3V0ZShncm91cElkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGNvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWwuXG5cdCAqIEByZXR1cm5zIENvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWxcblx0ICovXG5cdHB1YmxpYyBnZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTogQ29udmVydGVkTWV0YWRhdGEge1xuXHRcdHJldHVybiBjb252ZXJ0VHlwZXModGhpcy5nZXRNZXRhTW9kZWwoKSwgdGhpcy5jYXBhYmlsaXRpZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGVudGl0eSB0eXBlIG9mIGEgY29udGV4dC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyBFbnRpdHkgVHlwZVxuXHQgKi9cblx0cHVibGljIGdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChjb250ZXh0LmdldFBhdGgoKSksXG5cdFx0XHRlbnRpdHlUeXBlID0gbWV0YU1vZGVsLmdldE9iamVjdChtZXRhUGF0aClbXCIkVHlwZVwiXTtcblx0XHRyZXR1cm4gZW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5vRGF0YS5lbnRpdGllc1tlbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogSXMgYSBTaWRlRWZmZWN0cyBnZW5lcmF0ZWQgYnkgYSBjb250cm9sLlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgVGhlIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIFNpZGVFZmZlY3RzIGlzIGdlbmVyYXRlZCBieSBhIGNvbnRyb2wsIG90aGVyd2lzZSBmYWxzZVxuXHQgKi9cblx0cHVibGljIGlzQ29udHJvbFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGUpOiBzaWRlRWZmZWN0cyBpcyBDb250cm9sU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRyZXR1cm4gISEoc2lkZUVmZmVjdHMgYXMgQ29udHJvbFNpZGVFZmZlY3RzVHlwZSkuc291cmNlQ29udHJvbElkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGdsb2JhbCBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgR2xvYmFsIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwdWJsaWMgZ2V0R2xvYmFsT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0Y29uc3QgZW50aXR5U2lkZUVmZmVjdHMgPSB0aGlzLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZU5hbWUpO1xuXHRcdGNvbnN0IGdsb2JhbFNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gZW50aXR5U2lkZUVmZmVjdHMpIHtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzID0gZW50aXR5U2lkZUVmZmVjdHNba2V5XTtcblx0XHRcdGlmICghc2lkZUVmZmVjdHMuc291cmNlRW50aXRpZXMgJiYgIXNpZGVFZmZlY3RzLnNvdXJjZVByb3BlcnRpZXMgJiYgIXNpZGVFZmZlY3RzLnNvdXJjZUV2ZW50cykge1xuXHRcdFx0XHRnbG9iYWxTaWRlRWZmZWN0cy5wdXNoKHNpZGVFZmZlY3RzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGdsb2JhbFNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dD86IENvbnRleHQpOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gdGhpcy5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0XHRpZiAoZW50aXR5VHlwZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMuYm91bmRBY3Rpb25zW2VudGl0eVR5cGVdPy5bYWN0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy51bkJvdW5kQWN0aW9ucz8uW2FjdGlvbk5hbWVdO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIGZvciB0aGUgY29udGV4dCBhbmQgdGhlIGV2ZW50LlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBTaWRlRWZmZWN0cyBvZiB0aGUgZXZlbnRcblx0ICogQHJldHVybnMgQW4gYXJyYXkgY29udGFpbmluZyB0aGUgU2lkZUVmZmVjdHMgbWF0Y2hpbmcgd2l0aCB0aGUgY29udGV4dCBhbmQgdGhlIGV2ZW50XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFTaWRlRWZmZWN0c0Zyb21Db250ZXh0RXZlbnQoY29udGV4dDogQ29udGV4dCwgZXZlbnQ6IHN0cmluZyk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10ge1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRjb25zdCBkYXRhTW9kZWwgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YVBhdGgpO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzSW5mbyA9IHRoaXMuZ2V0U2lkZUVmZmVjdFdoZXJlRXZlbnRJc1NvdXJjZShkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIGV2ZW50KTtcblx0XHRyZXR1cm4gc2lkZUVmZmVjdHNJbmZvLm1hcChcblx0XHRcdChzaWRlRWZmZWN0KSA9PlxuXHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuZW50aXRpZXNbZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXT8uW1xuXHRcdFx0XHRcdGAke3NpZGVFZmZlY3QuZW50aXR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMjJHtzaWRlRWZmZWN0LnF1YWxpZmllcn1gXG5cdFx0XHRcdF1cblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIFNpZGVFZmZlY3RzLlxuXHQgKiAgQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgd2l0aCB0aGUgU2lkZUVmZmVjdHMgc2VydmljZSBvbmNlIGRhdGEgaGFzIGJlZW4gd3JpdHRlblxuXHQgKi9cblx0YXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHRoaXM+IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0U291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0gPSB7XG5cdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGV2ZW50czoge31cblx0XHR9O1xuXHRcdGNvbnN0IGVudmlyb25tZW50Q2FwYWJpbGl0aWVzU2VydmljZSA9IChhd2FpdCB0aGlzLmFwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFxuXHRcdFx0XCJlbnZpcm9ubWVudENhcGFiaWxpdGllc1wiXG5cdFx0KSkgYXMgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlO1xuXHRcdGNvbnN0IG1vZGVsID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRpZiAobW9kZWw/LmlzQT8uPE9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIE1ldGFNb2RlbCB0byBiZSByZXF1ZXN0ZWRcblx0XHRcdGF3YWl0IG1vZGVsLmdldE1ldGFNb2RlbCgpLnJlcXVlc3RPYmplY3QoXCIvJEVudGl0eUNvbnRhaW5lci9cIik7XG5cdFx0XHR0aGlzLmNhcGFiaWxpdGllcyA9IGVudmlyb25tZW50Q2FwYWJpbGl0aWVzU2VydmljZS5nZXRDYXBhYmlsaXRpZXMoKTtcblxuXHRcdFx0Y29uc3QgY29udmVydGVkTWV0YU1vZGVsID0gdGhpcy5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTtcblx0XHRcdHRoaXMuY29udGFpbmVyTmFtZSA9IGNvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlDb250YWluZXIuZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdFx0dGhpcy5jb250YWluZXJSZWdleFBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeXFxcXC8ke3RoaXMuY29udGFpbmVyTmFtZX1cXFxcL1teL10rXFxcXC8oLispPyRgKTtcblx0XHRcdHRoaXMuZW50aXR5VHlwZVJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4vJHt0aGlzLmNvbnRhaW5lck5hbWV9LyhbXi9dKylgKTtcblx0XHRcdGNvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKChlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSA9PiB7XG5cdFx0XHRcdHRoaXMubWFwRmllbGRBbm5vdGF0aW9ucyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMucmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpO1xuXHRcdFx0XHR0aGlzLm1hcFNpZGVFZmZlY3RTb3VyY2VzKGVudGl0eVR5cGUsIHNpZGVFZmZlY3RTb3VyY2VzKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29udmVydGVkTWV0YU1vZGVsLmFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBBY3Rpb24pID0+IHtcblx0XHRcdFx0aWYgKGFjdGlvbi5pc0JvdW5kKSB7XG5cdFx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMuYm91bmRBY3Rpb25zW2FjdGlvbi5zb3VyY2VFbnRpdHlUeXBlIS5mdWxseVF1YWxpZmllZE5hbWVdID0ge1xuXHRcdFx0XHRcdFx0Li4udGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMuYm91bmRBY3Rpb25zW2FjdGlvbi5zb3VyY2VFbnRpdHlUeXBlIS5mdWxseVF1YWxpZmllZE5hbWVdLFxuXHRcdFx0XHRcdFx0Li4udGhpcy5yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKGFjdGlvbilcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5vRGF0YS5hY3Rpb25zLnVuQm91bmRBY3Rpb25zID0ge1xuXHRcdFx0XHRcdFx0Li4udGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMudW5Cb3VuZEFjdGlvbnMsXG5cdFx0XHRcdFx0XHQuLi50aGlzLnJldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoYWN0aW9uKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0aWYgKE9iamVjdC5rZXlzKHNpZGVFZmZlY3RTb3VyY2VzLmV2ZW50cykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHR0aGlzLmluaXRpYWxpemVXZWJTb2NrZXRDb25uZWN0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzID0gc2lkZUVmZmVjdFNvdXJjZXM7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwcml2YXRlIG1hcEZpZWxkQW5ub3RhdGlvbnMoc291cmNlOiBFbnRpdHlUeXBlKTogdm9pZCB7XG5cdFx0Y29uc3QgYWRkUmVjb21tZW5kYXRpb25Sb2xlcyA9IChzb3VyY2VOYW1lOiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRcdGlmICghdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzLmhhc093blByb3BlcnR5KGAke3NvdXJjZU5hbWV9YCkpIHtcblx0XHRcdFx0dGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW2Ake3NvdXJjZU5hbWV9YF0gPSB7XG5cdFx0XHRcdFx0aW5wdXQ6IFtdLFxuXHRcdFx0XHRcdG91dHB1dDogW11cblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHNvdXJjZS5lbnRpdHlQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb25zdCBjb21tb25Bbm5vID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uIGFzIFByb3BlcnR5QW5ub3RhdGlvbnNXaXRoUmVjb21tZW5kYXRpb247XG5cdFx0XHRpZiAoY29tbW9uQW5ubz8uUmVjb21tZW5kYXRpb25Sb2xlKSB7XG5cdFx0XHRcdGNvbnN0IHJvbGVUeXBlID0gY29tbW9uQW5uby5SZWNvbW1lbmRhdGlvblJvbGU7XG5cdFx0XHRcdGlmIChyb2xlVHlwZS52YWx1ZU9mKCkuaW5jbHVkZXMoXCJJbnB1dFwiKSkge1xuXHRcdFx0XHRcdGFkZFJlY29tbWVuZGF0aW9uUm9sZXMoYCR7c291cmNlLm5hbWV9YCk7XG5cdFx0XHRcdFx0dGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW2Ake3NvdXJjZS5uYW1lfWBdLmlucHV0LnB1c2gocHJvcGVydHkubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHJvbGVUeXBlLnZhbHVlT2YoKS5pbmNsdWRlcyhcIk91dHB1dFwiKSkge1xuXHRcdFx0XHRcdGFkZFJlY29tbWVuZGF0aW9uUm9sZXMoYCR7c291cmNlLm5hbWV9YCk7XG5cdFx0XHRcdFx0dGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW2Ake3NvdXJjZS5uYW1lfWBdLm91dHB1dC5wdXNoKHByb3BlcnR5Lm5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVjb21tZW5kYXRpb25zTWFwcGluZygpOiBSZWNvbW1lbmRhdGlvbnNSZWdpc3RyeSB7XG5cdFx0cmV0dXJuIHRoaXMucmVjb21tZW5kYXRpb25SZWdpc3RyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgaWYgZmllbGQgaXMgcGFydCBvZiBSZWNvbW1lbmRhdGlvbidzIGlucHV0IG1hcHBpbmcgYW5kIGZyb20gdGhlIHNhbWUgZW50aXR5LlxuXHQgKiBPdGhlcndpc2UgcmV0dXJuIGZhbHNlLlxuXHQgKiBAcGFyYW0gZmllbGRcblx0ICogQHJldHVybnMgVHJ1ZSBpZiBmaWVsZCBpcyBoYXMgcmVjb21tZW5kYXRpb24gcm9sZSAtIElucHV0IGFubm90YXRpb25cblx0ICovXG5cdHB1YmxpYyBjaGVja0lmRmllbGRJc1JlY29tbWVuZGF0aW9uUmVsZXZhbnQoZmllbGQ6IENvbnRyb2wpOiBib29sZWFuIHtcblx0XHRjb25zdCBjb250ZXh0ID0gZmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBmaWVsZC5kYXRhKCkuc291cmNlUGF0aC5zcGxpdChcIi9cIikucG9wKCk7XG5cdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQ/LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IChtZXRhTW9kZWwgYXMgT0RhdGFNZXRhTW9kZWwpPy5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCB0YXJnZXREYXRhTW9kZWxPYmplY3QgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzPEVudGl0eVNldCB8IE5hdmlnYXRpb25Qcm9wZXJ0eT4obWV0YUNvbnRleHQpXG5cdFx0XHRcdC50YXJnZXRPYmplY3QhO1xuXHRcdFx0bGV0IHRhcmdldEVudGl0eVR5cGVOYW1lO1xuXHRcdFx0aWYgKGlzRW50aXR5U2V0KHRhcmdldERhdGFNb2RlbE9iamVjdCkpIHtcblx0XHRcdFx0dGFyZ2V0RW50aXR5VHlwZU5hbWUgPSB0YXJnZXREYXRhTW9kZWxPYmplY3QuZW50aXR5VHlwZT8ubmFtZTtcblx0XHRcdH0gZWxzZSBpZiAoaXNOYXZpZ2F0aW9uUHJvcGVydHkodGFyZ2V0RGF0YU1vZGVsT2JqZWN0KSkge1xuXHRcdFx0XHR0YXJnZXRFbnRpdHlUeXBlTmFtZSA9IHRhcmdldERhdGFNb2RlbE9iamVjdC50YXJnZXRUeXBlPy5uYW1lO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eSA9IHRhcmdldEVudGl0eVR5cGVOYW1lICYmIHRoaXMucmVjb21tZW5kYXRpb25SZWdpc3RyeS5yb2xlc1t0YXJnZXRFbnRpdHlUeXBlTmFtZV07XG5cdFx0XHRpZiAocmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eSAmJiByZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5Py5pbnB1dD8uaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCByZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIGluIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgd2hpY2ggYXJlIG1hcmtlZCBhcyBSZWNvbW1lbmRhdGlvblJvbGUgT3V0cHV0LlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgZm9yIHdoaWNoIHJlY29tbWVuZGF0aW9uIE91dHB1dCBmaWVsZHMgbmVlZHMgdG8gYmUgZmlndXJlZFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB3aGljaCBhcmUgbWFya2VkIFJlY29tbWVuZGF0aW9uUm9sZSBPdXRwdXRcblx0ICovXG5cdHB1YmxpYyBnZXRSZWNvbW1lbmRhdGlvbk91dHB1dEZpZWxkcyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRcdC8vVE9ETzogV2UgaGF2ZSB0byBjb25zaWRlciAxOjEgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlbGwuXG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eSA9IHRoaXMucmVjb21tZW5kYXRpb25SZWdpc3RyeS5yb2xlc1tlbnRpdHlUeXBlTmFtZV07XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHk/Lm91dHB1dD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHkub3V0cHV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBDb250cm9sIElkXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKGNvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2wpLmZvckVhY2goKHNFbnRpdHlUeXBlKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbc0VudGl0eVR5cGVdW2NvbnRyb2xJZF0pIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5jb250cm9sW3NFbnRpdHlUeXBlXVtjb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBwYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0cyhwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10sIGNvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAocGF0aEV4cHJlc3Npb25zLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5sb2dSZXF1ZXN0KHBhdGhFeHByZXNzaW9ucywgY29udGV4dCk7XG5cdFx0XHRhd2FpdCBjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhwYXRoRXhwcmVzc2lvbnMsIGdyb3VwSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgU2lkZUVmZmVjdHMgZm9yIGFuIE9EYXRhIGFjdGlvbi5cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdHMgYW5kIGFjdGlvbiBleGVjdXRpb25cblx0ICovXG5cdHB1YmxpYyBhc3luYyByZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbihzaWRlRWZmZWN0czogQWN0aW9uU2lkZUVmZmVjdHNUeXBlLCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTwodm9pZCB8IHVuZGVmaW5lZClbXT4ge1xuXHRcdGxldCBwcm9taXNlczogUHJvbWlzZTx2b2lkIHwgdW5kZWZpbmVkPltdO1xuXG5cdFx0aWYgKHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb25zPy5sZW5ndGgpIHtcblx0XHRcdHByb21pc2VzID0gc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbnMubWFwKGFzeW5jIChhY3Rpb25OYW1lKTogUHJvbWlzZTx2b2lkPiA9PiB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmV4ZWN1dGVBY3Rpb24oYWN0aW9uTmFtZSwgY29udGV4dCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvbWlzZXMgPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoc2lkZUVmZmVjdHMucGF0aEV4cHJlc3Npb25zPy5sZW5ndGgpIHtcblx0XHRcdHByb21pc2VzLnB1c2godGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHMucGF0aEV4cHJlc3Npb25zLCBjb250ZXh0KSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb21pc2VzLmxlbmd0aCA/IFByb21pc2UuYWxsKHByb21pc2VzKSA6IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIGZvciBhIG5hdmlnYXRpb24gcHJvcGVydHkgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKiBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5IE5hdmlnYXRpb24gcHJvcGVydHlcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBncm91cElkIEJhdGNoIGdyb3VwIGZvciB0aGUgcXVlcnlcblx0ICogQHBhcmFtIGlnbm9yZVRyaWdnZXJBY3Rpb25zIElmIHRydWUsIHdlIGRvIG5vdCB0cmlnZ2VyIGFjdGlvbnMgZGVmaW5lZCBpbiB0aGUgc2lkZSBlZmZlY3Rcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShcblx0XHRuYXZpZ2F0aW9uUHJvcGVydHk6IHN0cmluZyxcblx0XHRjb250ZXh0OiBDb250ZXh0LFxuXHRcdGdyb3VwSWQ/OiBzdHJpbmcsXG5cdFx0aWdub3JlVHJpZ2dlckFjdGlvbnMgPSBmYWxzZVxuXHQpOiBQcm9taXNlPHZvaWQgfCB1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBiYXNlRW50aXR5VHlwZSA9IHRoaXMuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHQpO1xuXHRcdGlmIChiYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGggPSBgJHtuYXZpZ2F0aW9uUHJvcGVydHl9L2A7XG5cdFx0XHRjb25zdCBlbnRpdHlTaWRlRWZmZWN0cyA9IHRoaXMuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhiYXNlRW50aXR5VHlwZSk7XG5cdFx0XHRsZXQgdGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGxldCB0YXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNFbnRpdHlUeXBlW10gPSBbXTtcblx0XHRcdGxldCBzaWRlRWZmZWN0c1RhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKGVudGl0eVNpZGVFZmZlY3RzKVxuXHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdC8vIEtlZXAgcmVsZXZhbnQgU2lkZUVmZmVjdHNcblx0XHRcdFx0XHQvLyAxLiBTb3VyY2VFbnRpdGllcyBtYXRjaCBPUlxuXHRcdFx0XHRcdC8vIDIuIE9ubHkgMSBTb3VyY2VQcm9wZXJ0aWVzIGFuZCBtYXRjaFxuXHRcdFx0XHRcdChhbm5vdGF0aW9uTmFtZSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gZW50aXR5U2lkZUVmZmVjdHNbYW5ub3RhdGlvbk5hbWVdO1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0KHNpZGVFZmZlY3RzLnNvdXJjZUVudGl0aWVzIHx8IFtdKS5zb21lKFxuXHRcdFx0XHRcdFx0XHRcdChuYXZpZ2F0aW9uKSA9PiBuYXZpZ2F0aW9uLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID09PSBuYXZpZ2F0aW9uUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0KSB8fFxuXHRcdFx0XHRcdFx0XHQoc2lkZUVmZmVjdHMuc291cmNlUHJvcGVydGllcz8ubGVuZ3RoID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdFx0c2lkZUVmZmVjdHMuc291cmNlUHJvcGVydGllcy5zb21lKFxuXHRcdFx0XHRcdFx0XHRcdFx0KHByb3BlcnR5UGF0aCkgPT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgobmF2aWdhdGlvblBhdGgpICYmICFwcm9wZXJ0eVBhdGgucmVwbGFjZShuYXZpZ2F0aW9uUGF0aCwgXCJcIikuaW5jbHVkZXMoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdFx0KSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpXG5cdFx0XHRcdC5mb3JFYWNoKChzQW5ub3RhdGlvbk5hbWUpID0+IHtcblx0XHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0cyA9IGVudGl0eVNpZGVFZmZlY3RzW3NBbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb24gJiYgIWlnbm9yZVRyaWdnZXJBY3Rpb25zKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4ZWN1dGVBY3Rpb24oc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbiwgY29udGV4dCwgZ3JvdXBJZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRhcmdldFByb3BlcnRpZXMgPSB0YXJnZXRQcm9wZXJ0aWVzLmNvbmNhdChzaWRlRWZmZWN0cy50YXJnZXRQcm9wZXJ0aWVzKTtcblx0XHRcdFx0XHR0YXJnZXRFbnRpdGllcyA9IHRhcmdldEVudGl0aWVzLmNvbmNhdChzaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZSB0YXJnZXRzXG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1RhcmdldERlZmluaXRpb24gPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldHMoe1xuXHRcdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiB0YXJnZXRQcm9wZXJ0aWVzLFxuXHRcdFx0XHR0YXJnZXRFbnRpdGllczogdGFyZ2V0RW50aXRpZXNcblx0XHRcdH0pO1xuXHRcdFx0c2lkZUVmZmVjdHNUYXJnZXRzID0gWy4uLnNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbi50YXJnZXRQcm9wZXJ0aWVzLCAuLi5zaWRlRWZmZWN0c1RhcmdldERlZmluaXRpb24udGFyZ2V0RW50aXRpZXNdO1xuXHRcdFx0aWYgKHNpZGVFZmZlY3RzVGFyZ2V0cy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzVGFyZ2V0cywgY29udGV4dCwgZ3JvdXBJZCkuY2F0Y2goKGVycm9yKSA9PlxuXHRcdFx0XHRcdExvZy5lcnJvcihgU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFNpZGVFZmZlY3RzIGZvciBOYXZpZ2F0aW9uIFByb3BlcnR5ICR7bmF2aWdhdGlvblByb3BlcnR5fWAsIGVycm9yKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gY29udHJvbHMuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBOYW1lXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHB1YmxpYyBnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbZW50aXR5VHlwZU5hbWVdIHx8IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMnIHF1YWxpZmllciBhbmQgb3duZXIgZW50aXR5IHdoZXJlIHRoaXMgZW50aXR5IGlzIHVzZWQgYXMgc291cmNlLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgZnVsbHkgcXVhbGlmaWVkIG5hbWVcblx0ICogQHJldHVybnMgQXJyYXkgb2Ygc2lkZUVmZmVjdHMgaW5mb1xuXHQgKi9cblx0cHVibGljIGdldFNpZGVFZmZlY3RXaGVyZUVudGl0eUlzU291cmNlKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdIHtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MuZW50aXRpZXNbZW50aXR5VHlwZU5hbWVdIHx8IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMnIHF1YWxpZmllcnMgd2hlcmUgdGhpcyBldmVudCBpcyB1c2VkIGFzIHNvdXJjZS5cblx0ICogQHBhcmFtIGVudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIGZ1bGx5IHF1YWxpZmllZFxuXHQgKiBAcGFyYW0gZXZlbnROYW1lIFNpZGUgRWZmZWN0IGV2ZW50IG5hbWVcblx0ICogQHJldHVybnMgQXJyYXkgb2Ygc2lkZUVmZmVjdHMgaW5mb1xuXHQgKi9cblx0cHVibGljIGdldFNpZGVFZmZlY3RXaGVyZUV2ZW50SXNTb3VyY2UoZW50aXR5VHlwZU5hbWU6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcpOiBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdIHtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MuZXZlbnRzW2V2ZW50TmFtZV0/LmZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmVudGl0eSA9PT0gZW50aXR5VHlwZU5hbWUpIHx8IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYSBzaWRlRWZmZWN0IGV2ZW50IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICogQHBhcmFtIGV2ZW50IFNpZGVFZmZlY3RzIGV2ZW50IHdoaWNoIHNob3VsZCBiZVxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0YXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yRXZlbnQoZXZlbnQ6IHN0cmluZywgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dW5kZWZpbmVkPiB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHMgPSB0aGlzLmdldE9EYXRhU2lkZUVmZmVjdHNGcm9tQ29udGV4dEV2ZW50KGNvbnRleHQsIGV2ZW50KTtcblx0XHRsZXQgdGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgdGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdID0gW107XG5cblx0XHRzaWRlRWZmZWN0cy5mb3JFYWNoKChzaWRlRWZmZWN0KSA9PiB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzID0gdGFyZ2V0UHJvcGVydGllcy5jb25jYXQoc2lkZUVmZmVjdC50YXJnZXRQcm9wZXJ0aWVzKTtcblx0XHRcdHRhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXMuY29uY2F0KHNpZGVFZmZlY3QudGFyZ2V0RW50aXRpZXMpO1xuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHRhcmdldFByb3BlcnRpZXMsXG5cdFx0XHR0YXJnZXRFbnRpdGllczogdGFyZ2V0RW50aXRpZXNcblx0XHR9KTtcblx0XHRjb25zdCBzaWRlRWZmZWN0c1RhcmdldHMgPSBbLi4uc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uLnRhcmdldFByb3BlcnRpZXMsIC4uLnNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbi50YXJnZXRFbnRpdGllc107XG5cdFx0aWYgKHNpZGVFZmZlY3RzVGFyZ2V0cy5sZW5ndGgpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzVGFyZ2V0cywgY29udGV4dCwgZ3JvdXBJZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuZXJyb3IoYFNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBTaWRlRWZmZWN0cyBmb3IgRXZlbnQgJHtldmVudH1gLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21tb24gbWV0aG9kIHRvIGdldCB0aGUgZmllbGQgZ3JvdXBJZHMgZm9yIGEgc291cmNlIGVudGl0eSBhbmQgYSBzb3VyY2UgcHJvcGVydHkuXG5cdCAqIEBwYXJhbSBzb3VyY2VFbnRpdHlUeXBlXG5cdCAqIEBwYXJhbSBzb3VyY2VQcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2YgZmllbGRHcm91cElkc1xuXHQgKi9cblx0cHVibGljIGNvbXB1dGVGaWVsZEdyb3VwSWRzKHNvdXJjZUVudGl0eVR5cGU6IHN0cmluZywgc291cmNlUHJvcGVydHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBlbnRpdHlGaWVsZEdyb3VwSWRzID0gdGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVFbnRpdHlJc1NvdXJjZShzb3VyY2VFbnRpdHlUeXBlKS5tYXAoKHNpZGVFZmZlY3RJbmZvKSA9PlxuXHRcdFx0dGhpcy5nZXRGaWVsZEdyb3VwSWRGb3JTaWRlRWZmZWN0KHNpZGVFZmZlY3RJbmZvLCB0cnVlKVxuXHRcdCk7XG5cdFx0cmV0dXJuIGVudGl0eUZpZWxkR3JvdXBJZHMuY29uY2F0KFxuXHRcdFx0dGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlKHNvdXJjZVByb3BlcnR5KS5tYXAoKHNpZGVFZmZlY3RJbmZvKSA9PlxuXHRcdFx0XHR0aGlzLmdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3Qoc2lkZUVmZmVjdEluZm8pXG5cdFx0XHQpXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzJyBxdWFsaWZpZXIgYW5kIG93bmVyIGVudGl0eSB3aGVyZSB0aGlzIHByb3BlcnR5IGlzIHVzZWQgYXMgc291cmNlLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IGZ1bGx5IHF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHNpZGVFZmZlY3RzIGluZm9cblx0ICovXG5cdHB1YmxpYyBnZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlKHByb3BlcnR5TmFtZTogc3RyaW5nKTogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXSB7XG5cdFx0cmV0dXJuIHRoaXMuc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSB8fCBbXTtcblx0fVxuXG5cdC8vIGNoZWNrIGlmIGNhbiBkZWZpbmUgd2hldGhlciBjYWxsYmFja3MgYXJlIGFzeW5jLiBPdGhlcndpc2UgY29tbWVudFxuXHQvLyBvbmx5IG9uZSBjYWxsYmFjayBmb3Igb25lIHRhcmdldFxuXHRwdWJsaWMgcmVnaXN0ZXJUYXJnZXRDYWxsYmFjayh0YXJnZXQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy50YXJnZXRDYWxsYmFja3NbdGFyZ2V0XSA9IGNhbGxiYWNrO1xuXHR9XG5cblx0cHVibGljIGRlcmVnaXN0ZXJUYXJnZXRDYWxsYmFjayh0YXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGRlbGV0ZSB0aGlzLnRhcmdldENhbGxiYWNrc1t0YXJnZXRdO1xuXHR9XG5cblx0Ly8gcGFzcyBwYXJhbWV0ZXJcblx0cHVibGljIGdldFJlZ2lzdGVyZWRDYWxsYmFjayh0YXJnZXQ6IHN0cmluZyk6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy50YXJnZXRDYWxsYmFja3NbdGFyZ2V0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHVwZGF0ZWQgc2lkZSBlZmZlY3RzIGRlZmluaXRpb24gd2l0aCBhbGwgdGV4dCByZWxhdGVkIHByb3BlcnRpZXMuXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1RhcmdldHMgVGhlIHRhcmdldHMgb2YgdGhlIHNpZGUgZWZmZWN0XG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB3aGVyZSB0aGUgc2lkZSBlZmZlY3QgaXMgcmVnaXN0ZXJlZFxuXHQgKiBAcmV0dXJucyBVcGRhdGVkIHNpZGUgZWZmZWN0cycgdGFyZ2V0cyB3aXRoIGFkZGVkIHRleHQgcHJvcGVydGllcyBvciBlbnRpdGllc1xuXHQgKi9cblx0cHJpdmF0ZSBhZGRUZXh0UHJvcGVydGllcyhzaWRlRWZmZWN0c1RhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSwgZW50aXR5VHlwZT86IEVudGl0eVR5cGUpOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUge1xuXHRcdGNvbnN0IHNldE9mUHJvcGVydGllcyA9IG5ldyBTZXQoc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMpO1xuXHRcdGNvbnN0IHNldE9mRW50aXRpZXMgPSBuZXcgU2V0KHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllcy5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSk7XG5cdFx0Ly8gR2VuZXJhdGUgYWxsIHBhdGhzIHJlbGF0ZWQgdG8gdGhlIHRleHQgcHJvcGVydGllcyBhbmQgbm90IGFscmVhZHkgY292ZXJlZCBieSB0aGUgU2lkZUVmZmVjdHNcblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBvZiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcykge1xuXHRcdFx0Zm9yIChjb25zdCBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggb2YgdGhpcy5nZXREYXRhTW9kZWxQcm9wZXJ0aWVzRnJvbUFQYXRoKHByb3BlcnR5UGF0aCwgZW50aXR5VHlwZSkpIHtcblx0XHRcdFx0Y29uc3QgYXNzb2NpYXRlZFRleHRQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgoZGF0YU1vZGVsUHJvcGVydHlQYXRoLnRhcmdldE9iamVjdCk7XG5cdFx0XHRcdGlmIChhc3NvY2lhdGVkVGV4dFBhdGgpIHtcblx0XHRcdFx0XHR0aGlzLmFkZFRleHRQcm9wZXJ0eShkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIHByb3BlcnR5UGF0aCwgYXNzb2NpYXRlZFRleHRQYXRoLCBzZXRPZlByb3BlcnRpZXMsIHNldE9mRW50aXRpZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKHNldE9mUHJvcGVydGllcyksXG5cdFx0XHR0YXJnZXRFbnRpdGllczogQXJyYXkuZnJvbShzZXRPZkVudGl0aWVzKS5tYXAoKG5hdmlnYXRpb24pID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IG5hdmlnYXRpb24gfTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHRleHQgcmVsYXRlZCBwcm9wZXJ0eSB0byB0aGUgc2lkZSBlZmZlY3RzIHRhcmdldHNcblx0ICogSWYgdGhlIHByb3BlcnR5IGhhcyBhbiBhc3NvY2lhdGVkIHRleHQgdGhlbiB0aGlzIHRleHQgbmVlZHMgdG8gYmUgYWRkZWQgaWYgaXQncyBub3QgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIHNpZGUgZWZmZWN0cyBkZWZpbml0aW9uOlxuXHQgKiAtIGFzIHRhcmdldFByb3BlcnRpZXMgaWYgdGhlIHByb3BlcnR5IGFuZCBpdHMgYXNzb2NpYXRlZCB0ZXh0IGFyZSBvbiB0aGUgc2FtZSBlbnRpdHlTZXRcblx0ICogLSBhcyB0YXJnZXRFbnRpdGllcyBpZiB0aGV5IGFyZSBkZWZpbmVkIG9uIGRpZmZlcmVudCBlbnRpdHlTZXRzLlxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsUHJvcGVydHlQYXRoIFRoZSBtb2RlbCBvYmplY3QgcGF0aCBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gYXNzb2NpYXRlZFRleHRQYXRoIFRoZSBhc3NvY2lhdGVkIHRleHQgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gc2V0T2ZQcm9wZXJ0aWVzIFNldCBvZiBleGlzdGluZyBzaWRlRWZmZWN0J3MgdGFyZ2V0IHByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNldE9mRW50aXRpZXMgU2V0IG9mIGV4aXN0aW5nIHNpZGVFZmZlY3QncyB0YXJnZXQgZW50aXRpZXNcblx0ICovXG5cdHByaXZhdGUgYWRkVGV4dFByb3BlcnR5KFxuXHRcdGRhdGFNb2RlbFByb3BlcnR5UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0YXNzb2NpYXRlZFRleHRQYXRoOiBzdHJpbmcsXG5cdFx0c2V0T2ZQcm9wZXJ0aWVzOiBTZXQ8c3RyaW5nPixcblx0XHRzZXRPZkVudGl0aWVzOiBTZXQ8c3RyaW5nPlxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBkYXRhTW9kZWxUZXh0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIGFzc29jaWF0ZWRUZXh0UGF0aCk7XG5cdFx0Y29uc3QgcmVsYXRpdmVOYXZpZ2F0aW9uID1cblx0XHRcdHByb3BlcnR5UGF0aC5zdGFydHNXaXRoKFwiL1wiKSAmJlxuXHRcdFx0ZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0RW50aXR5U2V0ICYmXG5cdFx0XHRkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlTZXQubmFtZSAhPT0gZGF0YU1vZGVsUHJvcGVydHlQYXRoLnRhcmdldEVudGl0eVNldD8ubmFtZVxuXHRcdFx0XHQ/IGAvJHtkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlTZXQ/LmZ1bGx5UXVhbGlmaWVkTmFtZX1gXG5cdFx0XHRcdDogZ2V0VGFyZ2V0TmF2aWdhdGlvblBhdGgoZGF0YU1vZGVsVGV4dFBhdGgsIHRydWUpO1xuXHRcdGNvbnN0IHRhcmdldFBhdGggPSBwcm9wZXJ0eVBhdGguc3RhcnRzV2l0aChcIi9cIilcblx0XHRcdD8gYC8ke2RhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldD8uZnVsbHlRdWFsaWZpZWROYW1lfS8ke2RhdGFNb2RlbFRleHRQYXRoLnRhcmdldE9iamVjdCEubmFtZX1gXG5cdFx0XHQ6IGdldFRhcmdldE9iamVjdFBhdGgoZGF0YU1vZGVsVGV4dFBhdGgsIHRydWUpO1xuXHRcdGlmIChcblx0XHRcdHRoaXMuaXNBc3NvY2lhdGVkVGV4dExpc3RlZEluU2lkZUVmZmVjdFRhcmdldHMoXG5cdFx0XHRcdGRhdGFNb2RlbFRleHRQYXRoLFxuXHRcdFx0XHRyZWxhdGl2ZU5hdmlnYXRpb24sXG5cdFx0XHRcdHRhcmdldFBhdGgsXG5cdFx0XHRcdHNldE9mUHJvcGVydGllcyxcblx0XHRcdFx0c2V0T2ZFbnRpdGllc1xuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0aWYgKHRoaXMuaXNQcm9wZXJ0eUFzc29jaWF0ZWRUZXh0T25EaWZmZXJlbnRFbnRpdHlTZXQoZGF0YU1vZGVsUHJvcGVydHlQYXRoLCBkYXRhTW9kZWxUZXh0UGF0aCkpIHtcblx0XHRcdFx0c2V0T2ZFbnRpdGllcy5hZGQocmVsYXRpdmVOYXZpZ2F0aW9uKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNldE9mUHJvcGVydGllcy5hZGQodGFyZ2V0UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgYXNzb2NpYXRlZCB0ZXh0IHByb3BlcnR5IG5lZWRzIHRvIGJlIGFkZGVkIGlmIGl0J3Mgbm90IGFscmVhZHkgcmVmbGVjdGVkIGluIHRoZSBzaWRlIGVmZmVjdHMgZGVmaW5pdGlvbjpcblx0ICogLSBhcyB0YXJnZXRQcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBhbmQgaXRzIGFzc29jaWF0ZWQgdGV4dCBhcmUgb24gdGhlIHNhbWUgZW50aXR5U2V0XG5cdCAqIC0gYXMgdGFyZ2V0RW50aXRpZXMgaWYgdGhleSBhcmUgZGVmaW5lZCBvbiBkaWZmZXJlbnQgZW50aXR5U2V0cy5cblx0ICogQHBhcmFtIGRhdGFNb2RlbFRleHRQYXRoIFRoZSBtb2RlbCBvYmplY3QgcGF0aCBvZiB0aGUgYXNzb2NpYXRlZCB0ZXh0XG5cdCAqIEBwYXJhbSByZWxhdGl2ZU5hdmlnYXRpb24gVGhlIG5hdmlnYXRpb24gdG8gdGhlIHRleHQgcHJvcGVydHlcblx0ICogQHBhcmFtIHRhcmdldFBhdGggVGhlIGFzc29jaWF0ZWQgdGV4dCBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBzZXRPZlByb3BlcnRpZXMgU2V0IG9mIGV4aXN0aW5nIHNpZGVFZmZlY3QncyB0YXJnZXQgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2V0T2ZFbnRpdGllcyBTZXQgb2YgZXhpc3Rpbmcgc2lkZUVmZmVjdCdzIHRhcmdldCBlbnRpdGllc1xuXHQgKiBAcmV0dXJucyBVcGRhdGVkIHNpZGUgZWZmZWN0cycgdGFyZ2V0cyB3aXRoIGFkZGVkIHRleHQgcHJvcGVydHkgb3IgZW50aXR5XG5cdCAqL1xuXHRwcml2YXRlIGlzQXNzb2NpYXRlZFRleHRMaXN0ZWRJblNpZGVFZmZlY3RUYXJnZXRzKFxuXHRcdGRhdGFNb2RlbFRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0XHRyZWxhdGl2ZU5hdmlnYXRpb246IHN0cmluZyxcblx0XHR0YXJnZXRQYXRoOiBzdHJpbmcsXG5cdFx0c2V0T2ZQcm9wZXJ0aWVzOiBTZXQ8c3RyaW5nPixcblx0XHRzZXRPZkVudGl0aWVzOiBTZXQ8c3RyaW5nPlxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0aXNQcm9wZXJ0eShkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRPYmplY3QpICYmXG5cdFx0XHQhc2V0T2ZQcm9wZXJ0aWVzLmhhcyh0YXJnZXRQYXRoKSAmJiAvLyB0aGUgcHJvcGVydHkgaXMgYWxyZWFkeSBsaXN0ZWRcblx0XHRcdCFzZXRPZlByb3BlcnRpZXMuaGFzKGAke3JlbGF0aXZlTmF2aWdhdGlvbn0ke2RhdGFNb2RlbFRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCA/IFwiL1wiIDogXCJcIn0qYCkgJiYgLy8gdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgbGlzdGVkIHRoYW5rcyB0byB0aGUgXCIqXCJcblx0XHRcdCFzZXRPZkVudGl0aWVzLmhhcyhgJHtyZWxhdGl2ZU5hdmlnYXRpb259YCkgLy8gdGhlIHByb3BlcnR5IGlzIG5vdCBwYXJ0IG9mIGEgVGFyZ2V0RW50aXRpZXNcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgcHJvcGVydHkgYW5kIGl0cyBhc3NvY2lhdGVkIHRleHQgcHJvcGVydHkgYXJlIG9uIGRpZmZlcmVudCBlbnRpdHlTZXQuXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggVGhlIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsVGV4dFBhdGggVGhlIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBhc3NvY2lhdGVkIHRleHQgcHJvcGVydHlcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZW50aXR5U2V0IGlzIGRpZmZlcmVudFxuXHQgKi9cblx0cHJpdmF0ZSBpc1Byb3BlcnR5QXNzb2NpYXRlZFRleHRPbkRpZmZlcmVudEVudGl0eVNldChcblx0XHRkYXRhTW9kZWxQcm9wZXJ0eVBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRcdGRhdGFNb2RlbFRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5PlxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0ZGF0YU1vZGVsUHJvcGVydHlQYXRoLnRhcmdldEVudGl0eVNldCAhPT0gZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0RW50aXR5U2V0ICYmXG5cdFx0XHQhIWRhdGFNb2RlbFRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzICYmXG5cdFx0XHQhIWRhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVR5cGVcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBTaWRlRWZmZWN0cyB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogLSBTZXQgVHJpZ2dlckFjdGlvbiBhcyBzdHJpbmdcblx0ICogLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAtIFJlbW92ZXMgYmluZGluZyBwYXJhbWV0ZXIgZnJvbSBTaWRlRWZmZWN0cyB0YXJnZXRzIHByb3BlcnRpZXNcblx0ICogLSBBZGRzIHRoZSB0ZXh0IHByb3BlcnRpZXNcblx0ICogLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSBiaW5kaW5nUGFyYW1ldGVyIE5hbWUgb2YgdGhlIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgY29udmVydFNpZGVFZmZlY3RzKFxuXHRcdHNpZGVFZmZlY3RzOiBDb21tb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0ZW50aXR5VHlwZT86IEVudGl0eVR5cGUsXG5cdFx0YmluZGluZ1BhcmFtZXRlcj86IHN0cmluZ1xuXHQpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgdHJpZ2dlckFjdGlvbiA9IHNpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nO1xuXHRcdGNvbnN0IG5ld1NpZGVFZmZlY3RzID0gdGhpcy5jb252ZXJ0U2lkZUVmZmVjdHNGb3JtYXQoc2lkZUVmZmVjdHMpO1xuXHRcdGxldCBzaWRlRWZmZWN0c1RhcmdldHMgPSB7IHRhcmdldFByb3BlcnRpZXM6IG5ld1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMsIHRhcmdldEVudGl0aWVzOiBuZXdTaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcyB9O1xuXHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMucmVtb3ZlQmluZGluZ1BhcmFtZXRlcihzaWRlRWZmZWN0c1RhcmdldHMsIGJpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMuYWRkVGV4dFByb3BlcnRpZXMoc2lkZUVmZmVjdHNUYXJnZXRzLCBlbnRpdHlUeXBlKTtcblx0XHRzaWRlRWZmZWN0c1RhcmdldHMgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldHMoc2lkZUVmZmVjdHNUYXJnZXRzKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4ubmV3U2lkZUVmZmVjdHMsXG5cdFx0XHQuLi57IHRhcmdldEVudGl0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXMsIHRhcmdldFByb3BlcnRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLCB0cmlnZ2VyQWN0aW9uIH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBTaWRlRWZmZWN0cyB0YXJnZXRzIChUYXJnZXRFbnRpdGllcyBhbmQgVGFyZ2V0UHJvcGVydGllcykgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqIC0gVGFyZ2V0UHJvcGVydGllcyBhcyBhcnJheSBvZiBzdHJpbmdcblx0ICogLSBUYXJnZXRFbnRpdGllcyBhcyBhcnJheSBvZiBvYmplY3Qgd2l0aCBwcm9wZXJ0eSAkTmF2aWdhdGlvblByb3BlcnR5UGF0aC5cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHJldHVybnMgQ29udmVydGVkIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIGNvbnZlcnRTaWRlRWZmZWN0c0Zvcm1hdChzaWRlRWZmZWN0czogQ29tbW9uU2lkZUVmZmVjdHNUeXBlKTogT0RhdGFTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IGZvcm1hdFByb3BlcnRpZXMgPSAocHJvcGVydGllcz86IChzdHJpbmcgfCBQcm9wZXJ0eVBhdGgpW10pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9PiB7XG5cdFx0XHRyZXR1cm4gcHJvcGVydGllc1xuXHRcdFx0XHQ/IHByb3BlcnRpZXMucmVkdWNlKCh0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSwgdGFyZ2V0KSA9PiB7XG5cdFx0XHRcdFx0XHRsZXQgcGF0aCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRpZiAoaXNQcm9wZXJ0eVBhdGhFeHByZXNzaW9uKHRhcmdldCkpIHtcblx0XHRcdFx0XHRcdFx0cGF0aCA9IHRhcmdldC52YWx1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gdGFyZ2V0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHBhdGgpIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0UHJvcGVydGllcy5wdXNoKHBhdGgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRcdFx0XHRcdGBTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgVGFyZ2V0UHJvcGVydGllcyBmb3IgU2lkZUVmZmVjdHMgJHtzaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWV9YFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHRhcmdldFByb3BlcnRpZXM7XG5cdFx0XHRcdCAgfSwgW10pXG5cdFx0XHRcdDogcHJvcGVydGllcztcblx0XHR9O1xuXHRcdGNvbnN0IGZvcm1hdEVudGl0aWVzID0gKGVudGl0aWVzPzogTmF2aWdhdGlvblByb3BlcnR5UGF0aFtdKTogeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nIH1bXSB8IHVuZGVmaW5lZCA9PiB7XG5cdFx0XHRyZXR1cm4gZW50aXRpZXNcblx0XHRcdFx0PyBlbnRpdGllcy5tYXAoKHRhcmdldEVudGl0eSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHRhcmdldEVudGl0eS52YWx1ZSB9O1xuXHRcdFx0XHQgIH0pXG5cdFx0XHRcdDogZW50aXRpZXM7XG5cdFx0fTtcblxuXHRcdC8vIFRPRE86IFNvdXJjZUV2ZW50cyBhcmUgc3RpbGwgZXhwZXJpbWVudGFsLCByZW1vdmUgb25jZSBwdWJsaWNcblx0XHR0eXBlIENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFNvdXJjZUV2ZW50cyA9IENvbW1vblNpZGVFZmZlY3RzVHlwZSAmIHsgU291cmNlRXZlbnRzPzogRWRtLlN0cmluZ1tdIH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRzb3VyY2VQcm9wZXJ0aWVzOiBmb3JtYXRQcm9wZXJ0aWVzKHNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMpLFxuXHRcdFx0c291cmNlRW50aXRpZXM6IGZvcm1hdEVudGl0aWVzKHNpZGVFZmZlY3RzLlNvdXJjZUVudGl0aWVzKSxcblx0XHRcdHNvdXJjZUV2ZW50czogKHNpZGVFZmZlY3RzIGFzIENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFNvdXJjZUV2ZW50cykuU291cmNlRXZlbnRzIGFzIHN0cmluZ1tdLFxuXHRcdFx0dGFyZ2V0UHJvcGVydGllczogZm9ybWF0UHJvcGVydGllcyhzaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIChzdHJpbmcgfCBQcm9wZXJ0eVBhdGgpW10pID8/IFtdLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IGZvcm1hdEVudGl0aWVzKHNpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzKSA/PyBbXVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBhbGwgZGF0YU1vZGVsT2JqZWN0UGF0aCByZWxhdGVkIHRvIHByb3BlcnRpZXMgbGlzdGVkIGJ5IGEgcGF0aFxuXHQgKlxuXHQgKiBUaGUgcGF0aCBjYW4gYmU6XG5cdCAqIC0gYSBwYXRoIHRhcmdldGluZyBhIHByb3BlcnR5IG9uIGEgY29tcGxleFR5cGUgb3IgYW4gRW50aXR5VHlwZVxuXHQgKiAtIGEgcGF0aCB3aXRoIGEgc3RhciB0YXJnZXRpbmcgYWxsIHByb3BlcnRpZXMgb24gYSBjb21wbGV4VHlwZSBvciBhbiBFbnRpdHlUeXBlLlxuXHQgKiAtIGFic29sdXRlLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBwYXRoIHRvIGFuYWx5emVcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgQXJyYXkgb2YgZGF0YU1vZGVsT2JqZWN0UGF0aCByZXByZXNlbnRpbmcgdGhlIHByb3BlcnRpZXNcblx0ICovXG5cdHByaXZhdGUgZ2V0RGF0YU1vZGVsUHJvcGVydGllc0Zyb21BUGF0aChwcm9wZXJ0eVBhdGg6IHN0cmluZywgZW50aXR5VHlwZT86IEVudGl0eVR5cGUpOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5PltdIHtcblx0XHRsZXQgZGF0YU1vZGVsT2JqZWN0UGF0aHM6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+W10gPSBbXTtcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXG5cdFx0bGV0IHByb3BlcnR5UmVsYXRpdmVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlc3RFbnRpdHlUeXBlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGw7XG5cdFx0aWYgKHByb3BlcnR5UGF0aC5zdGFydHNXaXRoKGAvJHt0aGlzLmNvbnRhaW5lck5hbWV9L2ApKSB7XG5cdFx0XHRtYXRjaCA9IHByb3BlcnR5UGF0aC5tYXRjaCh0aGlzLmNvbnRhaW5lclJlZ2V4UGF0dGVybik7XG5cdFx0XHRwcm9wZXJ0eVJlbGF0aXZlUGF0aCA9IG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICghZW50aXR5VHlwZSkge1xuXHRcdFx0bWF0Y2ggPSBwcm9wZXJ0eVBhdGgubWF0Y2godGhpcy5lbnRpdHlUeXBlUmVnZXhQYXR0ZXJuKTtcblx0XHRcdHRlc3RFbnRpdHlUeXBlTmFtZSA9IG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IHRlc3RFbnRpdHlUeXBlID1cblx0XHRcdGVudGl0eVR5cGUgPz9cblx0XHRcdCgodGVzdEVudGl0eVR5cGVOYW1lID8gY29udmVydGVkTWV0YU1vZGVsLnJlc29sdmVQYXRoKGAvJHt0ZXN0RW50aXR5VHlwZU5hbWV9L2ApLnRhcmdldCA6IHVuZGVmaW5lZCkgYXMgRW50aXR5VHlwZSB8IHVuZGVmaW5lZCk7XG5cdFx0Y29uc3QgZW50aXR5U2V0ID1cblx0XHRcdGNvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlTZXRzLmZpbmQoKHJlbGF0ZWRFbnRpdHlTZXQpID0+IHJlbGF0ZWRFbnRpdHlTZXQuZW50aXR5VHlwZSA9PT0gdGVzdEVudGl0eVR5cGUpID8/XG5cdFx0XHRjb252ZXJ0ZWRNZXRhTW9kZWwuc2luZ2xldG9ucy5maW5kKChzaW5nbGV0b24pID0+IHNpbmdsZXRvbi5lbnRpdHlUeXBlID09PSB0ZXN0RW50aXR5VHlwZSk7XG5cdFx0aWYgKGVudGl0eVNldCkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gdGhpcy5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0ZW50aXR5U2V0Q29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgLyR7ZW50aXR5U2V0Lm5hbWV9YCk7XG5cdFx0XHRpZiAoZW50aXR5U2V0Q29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBkYXRhTW9kZWxFbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMoZW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eSB8IEVudGl0eVR5cGU+KFxuXHRcdFx0XHRcdFx0ZGF0YU1vZGVsRW50aXR5U2V0LFxuXHRcdFx0XHRcdFx0KHByb3BlcnR5UmVsYXRpdmVQYXRoIHx8IHByb3BlcnR5UGF0aCkucmVwbGFjZShcIipcIiwgXCJcIikgfHwgXCIvXCJcblx0XHRcdFx0XHQpLCAvLyBcIipcIiBpcyByZXBsYWNlZCBieSBcIi9cIiB0byB0YXJnZXQgdGhlIGN1cnJlbnQgRW50aXR5VHlwZVxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRcdFx0XHRpZiAoaXNQcm9wZXJ0eSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0aWYgKGlzQ29tcGxleFR5cGUodGFyZ2V0T2JqZWN0LnRhcmdldFR5cGUpKSB7XG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRocyA9IGRhdGFNb2RlbE9iamVjdFBhdGhzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0dGFyZ2V0T2JqZWN0LnRhcmdldFR5cGUucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PlxuXHRcdFx0XHRcdFx0XHRcdGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxPYmplY3RQYXRoLCBwcm9wZXJ0eS5uYW1lKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRocy5wdXNoKGRhdGFNb2RlbE9iamVjdFBhdGggYXMgRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChpc0VudGl0eVR5cGUodGFyZ2V0T2JqZWN0KSkge1xuXHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGhzID0gZGF0YU1vZGVsT2JqZWN0UGF0aHMuY29uY2F0KFxuXHRcdFx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChlbnRpdHlQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbE9iamVjdFBhdGgsIGVudGl0eVByb3BlcnR5Lm5hbWUpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVudGl0eVNldENvbnRleHQuZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZGF0YU1vZGVsT2JqZWN0UGF0aHMuZmlsdGVyKChkYXRhTW9kZWxPYmplY3RQYXRoKSA9PiBkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgT2RhdGEgbWV0YW1vZGVsLlxuXHQgKiBAcmV0dXJucyBUaGUgT0RhdGEgbWV0YW1vZGVsXG5cdCAqL1xuXHRwcml2YXRlIGdldE1ldGFNb2RlbCgpOiBPRGF0YU1ldGFNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGggZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKiBAcGFyYW0gc291cmNlIEVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBnZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uoc291cmNlOiBFbnRpdHlUeXBlIHwgQWN0aW9uKTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0bGV0IGJpbmRpbmdBbGlhcyA9IFwiXCI7XG5cdFx0Y29uc3QgaXNTb3VyY2VFbnRpdHlUeXBlID0gaXNFbnRpdHlUeXBlKHNvdXJjZSk7XG5cdFx0Y29uc3QgZW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IGlzU291cmNlRW50aXR5VHlwZSA/IHNvdXJjZSA6IHNvdXJjZS5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGNvbW1vbkFubm90YXRpb24gPSBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbiBhcyB1bmRlZmluZWQgfCB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIENvbW1vbkFubm90YXRpb25UeXBlcz47XG5cdFx0aWYgKGNvbW1vbkFubm90YXRpb24pIHtcblx0XHRcdGlmIChlbnRpdHlUeXBlICYmICFpc1NvdXJjZUVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlciA9IHNvdXJjZS5wYXJhbWV0ZXJzPy5maW5kKChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci50eXBlID09PSBlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRcdGJpbmRpbmdBbGlhcyA9IGJpbmRpbmdQYXJhbWV0ZXI/LmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIi9cIilbMV0gPz8gXCJcIjtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmdldFNpZGVFZmZlY3RzQW5ub3RhdGlvbkZyb21Tb3VyY2Uoc291cmNlKS5tYXAoKHNpZGVFZmZlY3RBbm5vKSA9PlxuXHRcdFx0XHR0aGlzLmNvbnZlcnRTaWRlRWZmZWN0cyhzaWRlRWZmZWN0QW5ubywgZW50aXR5VHlwZSwgYmluZGluZ0FsaWFzKVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYW4gZW50aXR5IHR5cGUgb3IgYWN0aW9uIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIG9yIGFjdGlvbi5cblx0ICogQHBhcmFtIHNvdXJjZSBFbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogQHJldHVybnMgQXJyYXkgb2YgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgZ2V0U2lkZUVmZmVjdHNBbm5vdGF0aW9uRnJvbVNvdXJjZShzb3VyY2U6IEVudGl0eVR5cGUgfCBBY3Rpb24pOiBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXJbXSB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHM6IENvbW1vblNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Y29uc3QgY29tbW9uQW5ub3RhdGlvbiA9IHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIGFzIHVuZGVmaW5lZCB8IHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyPjtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBjb21tb25Bbm5vdGF0aW9uKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uID0gY29tbW9uQW5ub3RhdGlvbltrZXldO1xuXHRcdFx0aWYgKHRoaXMuaXNTaWRlRWZmZWN0c0Fubm90YXRpb24oYW5ub3RhdGlvbikpIHtcblx0XHRcdFx0c2lkZUVmZmVjdHMucHVzaChhbm5vdGF0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBhIFNpZGVFZmZlY3RzIGFubm90YXRpb24uXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uIEFubm90YXRpb25cblx0ICogQHJldHVybnMgQm9vbGVhblxuXHQgKi9cblx0cHJpdmF0ZSBpc1NpZGVFZmZlY3RzQW5ub3RhdGlvbihhbm5vdGF0aW9uOiB1bmtub3duKTogYW5ub3RhdGlvbiBpcyBDb21tb25TaWRlRWZmZWN0c1R5cGUge1xuXHRcdHJldHVybiAoYW5ub3RhdGlvbiBhcyBDb21tb25TaWRlRWZmZWN0c1R5cGUpPy4kVHlwZSA9PT0gQ29tbW9uQW5ub3RhdGlvblR5cGVzLlNpZGVFZmZlY3RzVHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIHRoZSBTaWRlRWZmZWN0cyByZXF1ZXN0LlxuXHQgKiBAcGFyYW0gcGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBsb2dSZXF1ZXN0KHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHRhcmdldFBhdGhzID0gcGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbiAocGF0aHMsIHRhcmdldCkge1xuXHRcdFx0cmV0dXJuIGAke3BhdGhzfVxcblxcdFxcdCR7KHRhcmdldCBhcyBTaWRlRWZmZWN0c0VudGl0eVR5cGUpLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIHx8IHRhcmdldCB8fCBcIlwifWA7XG5cdFx0fSwgXCJcIik7XG5cdFx0TG9nLmRlYnVnKGBTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogJHtjb250ZXh0LmdldFBhdGgoKX1cXG5cXHRQcm9wZXJ0eSBwYXRocyA6JHt0YXJnZXRQYXRoc31gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBuYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlciBvbiB0aGUgU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzVGFyZ2V0cyBTaWRlRWZmZWN0cyBUYXJnZXRzXG5cdCAqIEBwYXJhbSBiaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgcmVtb3ZlQmluZGluZ1BhcmFtZXRlcihzaWRlRWZmZWN0c1RhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSwgYmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUge1xuXHRcdGlmIChiaW5kaW5nUGFyYW1ldGVyTmFtZSkge1xuXHRcdFx0Y29uc3QgcmVwbGFjZUJpbmRpbmdQYXJhbWV0ZXIgPSBmdW5jdGlvbiAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4ke2JpbmRpbmdQYXJhbWV0ZXJOYW1lfS8/YCksIFwiXCIpO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLm1hcCgodGFyZ2V0UHJvcGVydHkpID0+IHJlcGxhY2VCaW5kaW5nUGFyYW1ldGVyKHRhcmdldFByb3BlcnR5KSksXG5cdFx0XHRcdHRhcmdldEVudGl0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXMubWFwKCh0YXJnZXRFbnRpdHkpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4geyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogcmVwbGFjZUJpbmRpbmdQYXJhbWV0ZXIodGFyZ2V0RW50aXR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSB9O1xuXHRcdFx0XHR9KVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllc1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzVGFyZ2V0cyBTaWRlRWZmZWN0cyBUYXJnZXRzXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIHRhcmdldHMgd2l0aG91dCBkdXBsaWNhdGVzXG5cdCAqL1xuXHRwcml2YXRlIHJlbW92ZUR1cGxpY2F0ZVRhcmdldHMoc2lkZUVmZmVjdHNUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUpOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0aWVzUGF0aHMgPSBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXMubWFwKCh0YXJnZXRFbnRpdHkpID0+IHRhcmdldEVudGl0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0Y29uc3QgdW5pcXVlVGFyZ2V0ZWRFbnRpdGllc1BhdGggPSBuZXcgU2V0PHN0cmluZz4odGFyZ2V0RW50aXRpZXNQYXRocyk7XG5cdFx0Y29uc3QgdW5pcXVlVGFyZ2V0UHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPihzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcyk7XG5cblx0XHRjb25zdCB1bmlxdWVUYXJnZXRlZEVudGl0aWVzID0gQXJyYXkuZnJvbSh1bmlxdWVUYXJnZXRlZEVudGl0aWVzUGF0aCkubWFwKChlbnRpdHlQYXRoKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogZW50aXR5UGF0aFxuXHRcdFx0fTtcblx0XHR9KTtcblxuXHRcdHJldHVybiB7IHRhcmdldFByb3BlcnRpZXM6IEFycmF5LmZyb20odW5pcXVlVGFyZ2V0UHJvcGVydGllcyksIHRhcmdldEVudGl0aWVzOiB1bmlxdWVUYXJnZXRlZEVudGl0aWVzIH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBhY3Rpb24gdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIG9uIGFjdGlvbnNcblx0ICogcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGhcblx0ICogZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKiBAcGFyYW0gYWN0aW9uIEFjdGlvblxuXHQgKiBAcmV0dXJucyBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIHJldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoYWN0aW9uOiBBY3Rpb24pOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdGNvbnN0IHRyaWdnZXJBY3Rpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0bGV0IHRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0bGV0IHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXSA9IFtdO1xuXG5cdFx0dGhpcy5nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UoYWN0aW9uKS5mb3JFYWNoKChvRGF0YVNpZGVFZmZlY3QpID0+IHtcblx0XHRcdGNvbnN0IHRyaWdnZXJBY3Rpb24gPSBvRGF0YVNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbjtcblx0XHRcdHRhcmdldFByb3BlcnRpZXMgPSB0YXJnZXRQcm9wZXJ0aWVzLmNvbmNhdChvRGF0YVNpZGVFZmZlY3QudGFyZ2V0UHJvcGVydGllcyk7XG5cdFx0XHR0YXJnZXRFbnRpdGllcyA9IHRhcmdldEVudGl0aWVzLmNvbmNhdChvRGF0YVNpZGVFZmZlY3QudGFyZ2V0RW50aXRpZXMpO1xuXHRcdFx0aWYgKHRyaWdnZXJBY3Rpb24pIHtcblx0XHRcdFx0dHJpZ2dlckFjdGlvbnMuYWRkKHRyaWdnZXJBY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyh7IHRhcmdldFByb3BlcnRpZXMsIHRhcmdldEVudGl0aWVzIH0pO1xuXHRcdGNvbnN0IGFjdGlvbk5hbWUgPSBhY3Rpb24uaXNCb3VuZCA/IGFjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUubWF0Y2goL15bXihdKy8pPy5bMF0gOiBhY3Rpb24ubmFtZTtcblx0XHRzaWRlRWZmZWN0c1thY3Rpb25OYW1lIV0gPSB7XG5cdFx0XHRwYXRoRXhwcmVzc2lvbnM6IFsuLi5zaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcywgLi4uc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzXSxcblx0XHRcdHRyaWdnZXJBY3Rpb25zOiBBcnJheS5mcm9tKHRyaWdnZXJBY3Rpb25zKVxuXHRcdH07XG5cdFx0cmV0dXJuIHNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgZW50aXR5IHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0c1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIEVudGl0eSB0eXBlIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHByaXZhdGUgcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IGVudGl0eVNpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4gPSB7fTtcblx0XHR0aGlzLmdldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShlbnRpdHlUeXBlKS5mb3JFYWNoKChzaWRlRWZmZWN0cykgPT4ge1xuXHRcdFx0ZW50aXR5U2lkZUVmZmVjdHNbc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHNpZGVFZmZlY3RzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBlbnRpdHlTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIGEgbWFwIGZvciB0aGUgU291cmNlcyBvZiBzaWRlRWZmZWN0IG9uIHRoZSBlbnRpdHkgdG8gdHJhY2sgd2hlcmUgdGhvc2Ugc291cmNlcyBhcmUgdXNlZCBpbiBTaWRlRWZmZWN0cyBhbm5vdGF0aW9uLlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSB3ZSBsb29rIGZvciBzaWRlIEVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzIFRoZSBtYXBwaW5nIG9iamVjdCBpbiBjb25zdHJ1Y3Rpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNcblx0ICovXG5cdHByaXZhdGUgbWFwU2lkZUVmZmVjdFNvdXJjZXMoXG5cdFx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0XHRzaWRlRWZmZWN0c1NvdXJjZXM6IHtcblx0XHRcdGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHR9XG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3Qgc2lkZUVmZmVjdERlZmluaXRpb24gb2YgdGhpcy5nZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlKGVudGl0eVR5cGUpKSB7XG5cdFx0XHR0aGlzLm1hcFNpZGVFZmZlY3RTb3VyY2VFbnRpdGllcyhlbnRpdHlUeXBlLCBzaWRlRWZmZWN0c1NvdXJjZXMsIHNpZGVFZmZlY3REZWZpbml0aW9uKTtcblx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZVByb3BlcnRpZXMoZW50aXR5VHlwZSwgc2lkZUVmZmVjdHNTb3VyY2VzLCBzaWRlRWZmZWN0RGVmaW5pdGlvbik7XG5cdFx0XHR0aGlzLm1hcFNpZGVFZmZlY3RTb3VyY2VFdmVudHMoZW50aXR5VHlwZSwgc2lkZUVmZmVjdHNTb3VyY2VzLCBzaWRlRWZmZWN0RGVmaW5pdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoZSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgd2l0aCBzb3VyY2UgZW50aXRpZXMuXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHlUeXBlIHdlIGxvb2sgZm9yIHNpZGUgRWZmZWN0cyBhbm5vdGF0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMgVGhlIG1hcHBpbmcgb2JqZWN0IGluIGNvbnN0cnVjdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdERlZmluaXRpb24gVGhlIHNpZGUgZWZmZWN0IGRlZmluaXRpb24gdG8gYmUgZXZhbHVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIG1hcFNpZGVFZmZlY3RTb3VyY2VFbnRpdGllcyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0sXG5cdFx0c2lkZUVmZmVjdERlZmluaXRpb246IENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllclxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZUVudGl0eSBvZiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5Tb3VyY2VFbnRpdGllcyA/PyBbXSkge1xuXHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IHNvdXJjZUVudGl0eS52YWx1ZSA/IHNvdXJjZUVudGl0eS4kdGFyZ2V0Py50YXJnZXRUeXBlIDogZW50aXR5VHlwZTtcblx0XHRcdGlmICh0YXJnZXRFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGlmICghc2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzW3RhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1t0YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNbdGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdLnB1c2goe1xuXHRcdFx0XHRcdGVudGl0eTogZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdFx0cXVhbGlmaWVyOiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5xdWFsaWZpZXJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoZSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgd2l0aCBzb3VyY2UgcHJvcGVydGllcy5cblx0ICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eVR5cGUgd2UgbG9vayBmb3Igc2lkZSBFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcyBUaGUgbWFwcGluZyBvYmplY3QgaW4gY29uc3RydWN0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0RGVmaW5pdGlvbiBUaGUgc2lkZSBlZmZlY3QgZGVmaW5pdGlvbiB0byBiZSBldmFsdWF0ZWRcblx0ICovXG5cdHByaXZhdGUgbWFwU2lkZUVmZmVjdFNvdXJjZVByb3BlcnRpZXMoXG5cdFx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0XHRzaWRlRWZmZWN0c1NvdXJjZXM6IHtcblx0XHRcdGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHR9LFxuXHRcdHNpZGVFZmZlY3REZWZpbml0aW9uOiBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXJcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgaGFzVW5pcXVlU291cmNlUHJvcGVydHkgPSBzaWRlRWZmZWN0RGVmaW5pdGlvbi5Tb3VyY2VQcm9wZXJ0aWVzPy5sZW5ndGggPT09IDE7XG5cdFx0Zm9yIChjb25zdCBzb3VyY2VQcm9wZXJ0eSBvZiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5Tb3VyY2VQcm9wZXJ0aWVzID8/IFtdKSB7XG5cdFx0XHRpZiAoc291cmNlUHJvcGVydHkuJHRhcmdldCkge1xuXHRcdFx0XHRpZiAoIXNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzW3NvdXJjZVByb3BlcnR5LiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzW3NvdXJjZVByb3BlcnR5LiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzW3NvdXJjZVByb3BlcnR5LiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXS5wdXNoKHtcblx0XHRcdFx0XHRlbnRpdHk6IGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRcdHF1YWxpZmllcjogc2lkZUVmZmVjdERlZmluaXRpb24ucXVhbGlmaWVyLFxuXHRcdFx0XHRcdGhhc1VuaXF1ZVNvdXJjZVByb3BlcnR5XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGaWxscyB0aGUgbWFwIGZvciB0aGUgU291cmNlcyBvZiBzaWRlRWZmZWN0IHdpdGggc291cmNlIGV2ZW50cy5cblx0ICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eVR5cGUgd2UgbG9vayBmb3Igc2lkZSBFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcyBUaGUgbWFwcGluZyBvYmplY3QgaW4gY29uc3RydWN0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0RGVmaW5pdGlvbiBUaGUgc2lkZSBlZmZlY3QgZGVmaW5pdGlvbiB0byBiZSBldmFsdWF0ZWRcblx0ICovXG5cdHByaXZhdGUgbWFwU2lkZUVmZmVjdFNvdXJjZUV2ZW50cyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0sXG5cdFx0c2lkZUVmZmVjdERlZmluaXRpb246IENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllclxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZUV2ZW50IG9mIHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZUV2ZW50cyA/PyBbXSkge1xuXHRcdFx0aWYgKCFzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzW3NvdXJjZUV2ZW50LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNbc291cmNlRXZlbnQudG9TdHJpbmcoKV0gPSBbXTtcblx0XHRcdH1cblx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNbc291cmNlRXZlbnQudG9TdHJpbmcoKV0ucHVzaCh7XG5cdFx0XHRcdGVudGl0eTogZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdHF1YWxpZmllcjogc2lkZUVmZmVjdERlZmluaXRpb24ucXVhbGlmaWVyXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmaWVsZEdyb3VwSWQgYmFzZWQgb24gdGhlIHN0b3JlZCBpbmZvcm1hdGlvbiBvbiB0aCBzaWRlIGVmZmVjdC5cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RJbmZvXG5cdCAqIEBwYXJhbSBpc0ltbWVkaWF0ZVxuXHQgKiBAcmV0dXJucyBBIHN0cmluZyBmb3IgdGhlIGZpZWxkR3JvdXBJZC5cblx0ICovXG5cdHByaXZhdGUgZ2V0RmllbGRHcm91cElkRm9yU2lkZUVmZmVjdChzaWRlRWZmZWN0SW5mbzogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2UsIGlzSW1tZWRpYXRlID0gZmFsc2UpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RXaXRoUXVhbGlmaWVyID0gc2lkZUVmZmVjdEluZm8ucXVhbGlmaWVyXG5cdFx0XHQ/IGAke3NpZGVFZmZlY3RJbmZvLmVudGl0eX0jJHtzaWRlRWZmZWN0SW5mby5xdWFsaWZpZXJ9YFxuXHRcdFx0OiBzaWRlRWZmZWN0SW5mby5lbnRpdHk7XG5cdFx0cmV0dXJuIGlzSW1tZWRpYXRlIHx8IHNpZGVFZmZlY3RJbmZvLmhhc1VuaXF1ZVNvdXJjZVByb3BlcnR5ID09PSB0cnVlXG5cdFx0XHQ/IGAke3NpZGVFZmZlY3RXaXRoUXVhbGlmaWVyfSQkSW1tZWRpYXRlUmVxdWVzdGBcblx0XHRcdDogc2lkZUVmZmVjdFdpdGhRdWFsaWZpZXI7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogU2lkZUVmZmVjdHNTZXJ2aWNlIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRhc3luYyBjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFNpZGVFZmZlY3RzU2V0dGluZ3M+KTogUHJvbWlzZTxTaWRlRWZmZWN0c1NlcnZpY2U+IHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRpYWxpemUoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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