@sapui5/sap.fe.macros 1.139.0 → 1.140.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 (152) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/macros/.library +1 -1
  3. package/src/sap/fe/macros/Field.js +65 -55
  4. package/src/sap/fe/macros/Field.ts +83 -57
  5. package/src/sap/fe/macros/FooterContent.js +5 -2
  6. package/src/sap/fe/macros/FooterContent.tsx +4 -1
  7. package/src/sap/fe/macros/MessageButton.js +1 -2
  8. package/src/sap/fe/macros/MessageButton.tsx +0 -1
  9. package/src/sap/fe/macros/MultiValueField.js +1 -3
  10. package/src/sap/fe/macros/MultiValueField.tsx +0 -2
  11. package/src/sap/fe/macros/Share.js +14 -2
  12. package/src/sap/fe/macros/Share.tsx +13 -0
  13. package/src/sap/fe/macros/Status.js +226 -0
  14. package/src/sap/fe/macros/Status.tsx +192 -0
  15. package/src/sap/fe/macros/ValueHelp.js +4 -28
  16. package/src/sap/fe/macros/ValueHelp.tsx +2 -42
  17. package/src/sap/fe/macros/ai/EasyFilterBar.js +105 -96
  18. package/src/sap/fe/macros/ai/EasyFilterBar.tsx +122 -103
  19. package/src/sap/fe/macros/ai/SummarizationButton.js +2 -2
  20. package/src/sap/fe/macros/ai/SummarizationButton.tsx +1 -1
  21. package/src/sap/fe/macros/chart/ChartHelper.js +1 -2
  22. package/src/sap/fe/macros/chart/ChartHelper.ts +0 -1
  23. package/src/sap/fe/macros/chart/ChartRuntime.js +1 -2
  24. package/src/sap/fe/macros/chart/ChartRuntime.ts +0 -1
  25. package/src/sap/fe/macros/chart/MdcChartTemplate.js +2 -4
  26. package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +1 -4
  27. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.js +3 -1
  28. package/src/sap/fe/macros/controls/BuildingBlockWithTemplating.ts +2 -0
  29. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +2 -2
  30. package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -2
  31. package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +43 -4
  32. package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +48 -1
  33. package/src/sap/fe/macros/designtime/Designtime.helper.js +28 -1
  34. package/src/sap/fe/macros/designtime/Designtime.helper.ts +27 -0
  35. package/src/sap/fe/macros/field/FieldBaseDelegate.js +13 -7
  36. package/src/sap/fe/macros/field/FieldBaseDelegate.ts +12 -8
  37. package/src/sap/fe/macros/field/FieldRuntime.js +1 -2
  38. package/src/sap/fe/macros/field/FieldRuntime.ts +0 -1
  39. package/src/sap/fe/macros/filter/FilterUtils.js +3 -5
  40. package/src/sap/fe/macros/filter/FilterUtils.ts +2 -4
  41. package/src/sap/fe/macros/form/Form.js +1 -4
  42. package/src/sap/fe/macros/form/Form.tsx +0 -3
  43. package/src/sap/fe/macros/form/FormContainer.block.js +1 -2
  44. package/src/sap/fe/macros/form/FormContainer.block.ts +0 -1
  45. package/src/sap/fe/macros/form/FormDelegate.js +20 -1
  46. package/src/sap/fe/macros/form/FormDelegate.ts +25 -0
  47. package/src/sap/fe/macros/form/FormHelper.js +1 -2
  48. package/src/sap/fe/macros/form/FormHelper.ts +0 -1
  49. package/src/sap/fe/macros/fpm/CustomFragment.block.js +1 -2
  50. package/src/sap/fe/macros/fpm/CustomFragment.block.ts +0 -1
  51. package/src/sap/fe/macros/internal/ActionCommand.block.js +1 -2
  52. package/src/sap/fe/macros/internal/ActionCommand.block.ts +0 -1
  53. package/src/sap/fe/macros/internal/FilterField.block.js +7 -1
  54. package/src/sap/fe/macros/internal/FilterField.block.ts +8 -0
  55. package/src/sap/fe/macros/internal/field/DisplayStyle.js +3 -3
  56. package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +2 -2
  57. package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +1 -1
  58. package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +1 -0
  59. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.js +46 -8
  60. package/src/sap/fe/macros/internal/valuehelp/AdditionalValueHelper.ts +60 -6
  61. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +38 -2
  62. package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +37 -2
  63. package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +1 -1
  64. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +10 -3
  65. package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +13 -2
  66. package/src/sap/fe/macros/library.js +1 -1
  67. package/src/sap/fe/macros/messagebundle.properties +5 -3
  68. package/src/sap/fe/macros/messagebundle_ar.properties +7 -1
  69. package/src/sap/fe/macros/messagebundle_bg.properties +7 -1
  70. package/src/sap/fe/macros/messagebundle_ca.properties +10 -4
  71. package/src/sap/fe/macros/messagebundle_cnr.properties +7 -1
  72. package/src/sap/fe/macros/messagebundle_cs.properties +6 -0
  73. package/src/sap/fe/macros/messagebundle_cy.properties +8 -2
  74. package/src/sap/fe/macros/messagebundle_da.properties +7 -1
  75. package/src/sap/fe/macros/messagebundle_de.properties +13 -7
  76. package/src/sap/fe/macros/messagebundle_el.properties +6 -0
  77. package/src/sap/fe/macros/messagebundle_en.properties +10 -4
  78. package/src/sap/fe/macros/messagebundle_en_GB.properties +8 -2
  79. package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +10 -4
  80. package/src/sap/fe/macros/messagebundle_es.properties +8 -2
  81. package/src/sap/fe/macros/messagebundle_es_MX.properties +10 -4
  82. package/src/sap/fe/macros/messagebundle_et.properties +8 -2
  83. package/src/sap/fe/macros/messagebundle_fi.properties +6 -0
  84. package/src/sap/fe/macros/messagebundle_fr.properties +8 -2
  85. package/src/sap/fe/macros/messagebundle_fr_CA.properties +7 -1
  86. package/src/sap/fe/macros/messagebundle_hi.properties +7 -1
  87. package/src/sap/fe/macros/messagebundle_hr.properties +7 -1
  88. package/src/sap/fe/macros/messagebundle_hu.properties +6 -0
  89. package/src/sap/fe/macros/messagebundle_id.properties +10 -4
  90. package/src/sap/fe/macros/messagebundle_it.properties +6 -0
  91. package/src/sap/fe/macros/messagebundle_iw.properties +7 -1
  92. package/src/sap/fe/macros/messagebundle_ja.properties +8 -2
  93. package/src/sap/fe/macros/messagebundle_kk.properties +10 -4
  94. package/src/sap/fe/macros/messagebundle_ko.properties +6 -0
  95. package/src/sap/fe/macros/messagebundle_lt.properties +7 -1
  96. package/src/sap/fe/macros/messagebundle_lv.properties +7 -1
  97. package/src/sap/fe/macros/messagebundle_mk.properties +7 -1
  98. package/src/sap/fe/macros/messagebundle_ms.properties +6 -0
  99. package/src/sap/fe/macros/messagebundle_nl.properties +6 -0
  100. package/src/sap/fe/macros/messagebundle_no.properties +6 -0
  101. package/src/sap/fe/macros/messagebundle_pl.properties +7 -1
  102. package/src/sap/fe/macros/messagebundle_pt.properties +6 -0
  103. package/src/sap/fe/macros/messagebundle_pt_PT.properties +6 -0
  104. package/src/sap/fe/macros/messagebundle_ro.properties +7 -1
  105. package/src/sap/fe/macros/messagebundle_ru.properties +9 -3
  106. package/src/sap/fe/macros/messagebundle_sh.properties +7 -1
  107. package/src/sap/fe/macros/messagebundle_sk.properties +6 -0
  108. package/src/sap/fe/macros/messagebundle_sl.properties +6 -0
  109. package/src/sap/fe/macros/messagebundle_sr.properties +7 -1
  110. package/src/sap/fe/macros/messagebundle_sv.properties +6 -0
  111. package/src/sap/fe/macros/messagebundle_th.properties +7 -1
  112. package/src/sap/fe/macros/messagebundle_tr.properties +6 -0
  113. package/src/sap/fe/macros/messagebundle_uk.properties +9 -3
  114. package/src/sap/fe/macros/messagebundle_vi.properties +8 -2
  115. package/src/sap/fe/macros/messagebundle_zh_CN.properties +6 -0
  116. package/src/sap/fe/macros/messagebundle_zh_TW.properties +7 -1
  117. package/src/sap/fe/macros/messages/MessageButton.js +39 -18
  118. package/src/sap/fe/macros/messages/MessageButton.ts +40 -17
  119. package/src/sap/fe/macros/messages/MessagePopover.js +2 -2
  120. package/src/sap/fe/macros/messages/MessagePopover.ts +4 -4
  121. package/src/sap/fe/macros/microchart/MicroChartContainer.js +1 -2
  122. package/src/sap/fe/macros/microchart/MicroChartContainer.ts +1 -2
  123. package/src/sap/fe/macros/microchart/MicroChartHelper.js +1 -2
  124. package/src/sap/fe/macros/microchart/MicroChartHelper.tsx +0 -1
  125. package/src/sap/fe/macros/share/ShareAPI.js +4 -29
  126. package/src/sap/fe/macros/share/ShareAPI.ts +1 -32
  127. package/src/sap/fe/macros/situations/SituationsPopover.js +3 -1
  128. package/src/sap/fe/macros/situations/SituationsPopover.ts +2 -0
  129. package/src/sap/fe/macros/table/MdcTableTemplate.js +3 -1
  130. package/src/sap/fe/macros/table/MdcTableTemplate.tsx +6 -2
  131. package/src/sap/fe/macros/table/TableHelper.js +1 -2
  132. package/src/sap/fe/macros/table/TableHelper.ts +0 -1
  133. package/src/sap/fe/macros/table/TableRuntime.js +24 -5
  134. package/src/sap/fe/macros/table/TableRuntime.ts +31 -3
  135. package/src/sap/fe/macros/table/Utils.js +6 -2
  136. package/src/sap/fe/macros/table/Utils.ts +5 -1
  137. package/src/sap/fe/macros/table/delegates/ALPTableDelegate.js +1 -2
  138. package/src/sap/fe/macros/table/delegates/ALPTableDelegate.ts +0 -1
  139. package/src/sap/fe/macros/table/delegates/TableDelegate.js +1 -2
  140. package/src/sap/fe/macros/table/delegates/TableDelegate.ts +0 -1
  141. package/src/sap/fe/macros/table/delegates/TreeTableDelegate.js +1 -2
  142. package/src/sap/fe/macros/table/delegates/TreeTableDelegate.ts +0 -1
  143. package/src/sap/fe/macros/table/mixin/TableHierarchy.js +5 -1
  144. package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +7 -0
  145. package/src/sap/fe/macros/table/mixin/TableSharing.js +3 -2
  146. package/src/sap/fe/macros/table/mixin/TableSharing.ts +9 -1
  147. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +10 -1
  148. package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +17 -0
  149. package/src/sap/fe/macros/visualfilters/VisualFilter.js +1 -2
  150. package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +0 -1
  151. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +2 -3
  152. package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +1 -2
@@ -748,6 +748,15 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/base/util/deepEq
748
748
  }
749
749
  return conditionPayload;
750
750
  },
751
+ modifySelectionBehaviour: function (valueHelp, content, change) {
752
+ const conditions = change.conditions;
753
+ const oldConditions = content.getConditions();
754
+ // Prevent de-select in dialog scenarios
755
+ if (content?.getParent()?.isQuickSelectActive?.() && !conditions.length && oldConditions.length) {
756
+ change.conditions = oldConditions;
757
+ }
758
+ return change;
759
+ },
751
760
  /**
752
761
  * Provides the possibility to customize selections in 'Select from list' scenarios.
753
762
  * By default, only condition keys are considered. This may be extended with payload dependent filters.
@@ -1044,4 +1053,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/ObjectPath", "sap/base/util/deepEq
1044
1053
  }
1045
1054
  });
1046
1055
  }, false);
1047
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZUNvcmVDb250cm9sc0ZpbHRlckJhciIsIkFubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJWYWx1ZUhlbHBEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJ1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzIiwiV2Vha01hcCIsImlzU2VhcmNoU3VwcG9ydGVkIiwidmFsdWVIZWxwIiwiY29udGVudCIsIl9saXN0QmluZGluZyIsImRhdGEiLCJ1cGRhdGVCaW5kaW5nSW5mbyIsImJpbmRpbmdJbmZvIiwic2VhcmNoIiwiZ2V0RmlsdGVyVmFsdWUiLCJub3JtYWxpemVkU2VhcmNoIiwiQ29tbW9uVXRpbHMiLCJub3JtYWxpemVTZWFyY2hUZXJtIiwicGFyYW1ldGVycyIsIiRzZWFyY2giLCJ1bmRlZmluZWQiLCJfZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UiLCJjb250cm9sIiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0VGFyZ2V0VmlldyIsImdldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlIiwiX2dldEhpc3RvcnlEYXRhIiwicGF5bG9hZCIsImhpc3RvcnkiLCJlbmFibGVkIiwiaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsInZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlIiwiZmllbGREYXRhIiwiZ2V0RmllbGREYXRhIiwicHJvcGVydHlQYXRoIiwidmFsdWVIZWxwUXVhbGlmaWVyIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJTdHJpbmciLCJfc2V0SGlzdG9yeURhdGEiLCJjb25kaXRpb25zIiwibGVuZ3RoIiwidmFsdWVMaXN0UHJvcGVydHkiLCJfZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllciIsImNvbmRpdGlvbiIsImlzVW5pdFZhbHVlSGVscCIsInZhbGlkYXRlZCIsIkNvbmRpdGlvblZhbGlkYXRlZCIsIlZhbGlkYXRlZCIsImNvbmRpdGlvblBheWxvYWRNYXAiLCJfZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QiLCJwdXNoIiwiY29udmVydENvbmRpdGlvblBheWxvYWRUb05lc3RlZE9iamVjdCIsInNldEZpZWxkRGF0YSIsImNvbmRpdGlvblBheWxvYWQiLCJuZXN0ZWRPYmplY3QiLCJrZXkiLCJPYmplY3RQYXRoIiwic2V0Iiwic3BsaXQiLCJfaXNFbXB0eURpZ2l0U2VxdWVuY2UiLCJ2YWx1ZSIsImlzRGlnaXRTZXF1ZW5jZSIsImlzRW1wdHlEaWdpdFNlcXVlbmNlIiwiZXZlcnkiLCJjaGFyIiwidXBkYXRlQmluZGluZyIsImxpc3RCaW5kaW5nIiwiaXNBIiwiZ2V0UGF5bG9hZCIsImlzVHlwZWFoZWFkIiwidXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSIsIm5ld1Byb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlIiwiZ2V0IiwidGhlbiIsImZpZWxkIiwiZ2V0Q29udHJvbCIsImlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJhZGRpdGlvbmFsVmFsdWVzIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRPYmplY3QiLCJoYXNQZW5kaW5nVXNlcklucHV0IiwidmFsdWVzIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJncm91cEtleSIsIkFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IiwicmVjb21tZW5kYXRpb24iLCJ0YWJsZSIsImdldFRhYmxlIiwic29ydGVyc0N1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiZmlsdGVyIiwiZ2V0S2V5Iiwic29ydGVycyIsIl91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzIiwiX3VwZGF0ZUJpbmRpbmciLCJleGVjdXRlRmlsdGVyIiwicmVxdWVzdGVkSXRlbXMiLCJnZXRDb250ZXh0cyIsImNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nIiwiX3ZhbHVlSGVscCIsImlzUGVuZGluZyIsImhhcyIsImlzU3VzcGVuZGVkIiwiY29udGV4dHMiLCJyZXF1ZXN0Q29udGV4dHMiLCJjYW5jZWxlZCIsImdldFR5cGVNYXAiLCJUeXBlTWFwIiwicmV0cmlldmVDb250ZW50IiwiY29udGFpbmVyIiwiY29udGVudElkIiwiVmFsdWVMaXN0SGVscGVyIiwic2hvd1ZhbHVlTGlzdCIsInZhbHVlSGVscFF1YWxpZmllcnMiLCJrZXlzIiwiY29uZGl0aW9uUGF5bG9hZExpc3QiLCJwYXJhbXMiLCJxdWFsaWZpZXJzIiwidmhQYXJhbWV0ZXJzIiwidmhLZXlzIiwicHJvcGVydHlLZXlQYXRoIiwidmFsdWVIZWxwS2V5UGF0aCIsImZpbHRlcmVkS2V5cyIsImhlbHBQYXRocyIsImZvckVhY2giLCJwYXJhbSIsImhlbHBQYXRoIiwiaW5jbHVkZXMiLCJfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyIiwib3V0UGFyYW1ldGVycyIsImZpbHRlckJhciIsImxpc3RSZXBvcnRGaWx0ZXJCYXIiLCJzdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInN0YXRlSXRlbXMiLCJpdGVtcyIsImZpbHRlckJhclByb3BlcnRpZXMiLCJGaWx0ZXJVdGlscyIsImdldEZpbHRlclByb3BlcnR5SW5mbyIsIm1ldGFNb2RlbCIsIm91dFBhcmFtZXRlciIsImZpbHRlckJhclByb3BlcnR5IiwiX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgiLCJmaW5kIiwiaXRlbSIsIm5hbWUiLCJjb25kaXRpb25QYXRoIiwiZmlsdGVyZWQiLCJuZXdDb25kaXRpb24iLCJDb25kaXRpb24iLCJjcmVhdGVDb25kaXRpb24iLCJjb25kaXRpb25BbHJlYWR5RXhpc3RzIiwidGVzdENvbmRpdGlvbiIsImRlZXBFcXVhbCIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsImNvbnRleHRQYXRoIiwiZmlsdGVyVGFyZ2V0Iiwic291cmNlIiwicG9wIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJmaWx0ZXJUYXJnZXRQYXRoIiwic3Vic3RyaW5nIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRSZWR1Y2VkUGF0aCIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dCIsImNvbnRleHQiLCJvdXRWYWx1ZXMiLCJ3YXJuaW5nIiwiX29uQ29uZGl0aW9uUHJvcGFnYXRpb25VcGRhdGVQcm9wZXJ0eSIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwicm9vdFBhdGgiLCJnZXRNZXRhQ29udGV4dCIsImdldFBhdGgiLCJjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzIiwiaXNUcmFuc2llbnQiLCJpc0luYWN0aXZlIiwib3V0UGFyYW1ldGVyU291cmNlcyIsIl91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlciIsInZpZXciLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJnZXRDb250cm9sbGVyIiwiaXNDb25uZWN0ZWQiLCJiaW5kaW5nIiwiZ2V0QmluZGluZyIsImdldEJpbmRpbmdDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwic2VuZCIsImFjdGlvbiIsIkFjdGl2aXR5IiwiQ2hhbmdlIiwibWFwIiwidGFyZ2V0UHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsInRhcmdldCIsImZpZWxkQ29udHJvbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRmllbGRDb250cm9sIiwiZHluYW1pY1JlYWRPbmx5IiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJnZXRQcm9wZXJ0eSIsInBhdGgiLCJzaWRlRWZmZWN0UGF0aCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImN1cnJlbnRWYWwiLCJuZXdWYWwiLCJzZXRQcm9wZXJ0eSIsInRleHRQYXRoIiwiVGV4dCIsImdldEZpbHRlckNvbmRpdGlvbnMiLCJjb25maWciLCJnZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucyIsIm9uQ29uZGl0aW9uUHJvcGFnYXRpb24iLCJyZWFzb24iLCJfY29uZmlnIiwiaXNEZWZpbmVDb25kaXRpb25WYWx1ZUhlbHAiLCJxdWFsaWZpZXIiLCJnZXRPdXRQYXJhbWV0ZXJzIiwiZmllbGRQYXJlbnQiLCJnZXRQYXJlbnQiLCJnZXRDb25kaXRpb25zIiwiaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMiLCJwcm9wZXJ0eU5hbWUiLCJwYXlsb2FkS2V5cyIsInBheWxvYWRLZXkiLCJjb25kaXRpb25WYWx1ZWtleXMiLCJjb25kaXRpb25WYWx1ZWtleSIsInZhbHVlS2V5Iiwia2V5VmFsdWUiLCJfY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbiIsImluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQiLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZyIsImluQ29uZGl0aW9ucyIsImluUGFyYW1ldGVycyIsImJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJwcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiaW5QYXJhbWV0ZXIiLCJtZXRhRGF0YUVycm9yIiwibmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsInJlcGxhY2UiLCIkUGFydG5lciIsIiRraW5kIiwiX2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdCIsImNvbnRleHRVbmRlckNyZWF0aW9uIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInN0YXJ0c1dpdGgiLCJlcnJvck1lc3NhZ2VzSW5Db250ZXh0IiwiZ2V0TWVzc2FnZXMiLCJnZXRUeXBlIiwiTWVzc2FnZVR5cGUiLCJjcmVhdGVkIiwicmVxdWVzdFByb3BlcnR5IiwiaSIsIm1ldGFNb2RlbENvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInJlbGF0aXZlUGF0aFBhcnRzIiwic2xpY2UiLCJwYXJ0IiwicGFydG5lciIsImxvY2FsRGF0YVBhdGgiLCJsb2NhbERhdGFQYXJ0cyIsIm1hdGNoQ291bnQiLCJmaW5kSW5kZXgiLCJpbmRleCIsImNvbmNhdCIsImpvaW4iLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyIiwic291cmNlRmllbGQiLCJfZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlciIsIl9wYXJ0aXRpb25JblBhcmFtZXRlcnMiLCJpblBhcmFtZXRlck1hcCIsImNvbnN0YW50IiwiY29uc3RhbnRWYWx1ZSIsImluZGV4T2YiLCJfdGFibGVBZnRlclJlbmRlckRlbGVnYXRlIiwib25BZnRlclJlbmRlcmluZyIsImV2ZW50Iiwic3JjQ29udHJvbCIsInRhYmxlQ2VsbHNEb21SZWZzIiwiJCIsIm1kY01UYWJsZSIsImhpZ2hsaWdodERPTUVsZW1lbnRzIiwicG9wb3ZlclRhYmxlIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJnZXRJblBhcmFtZXRlcnMiLCJpc09iamVjdFBhZ2UiLCJjcmVhdGVDb25kaXRpb25QYXlsb2FkIiwiX3ZhbHVlcyIsImVudHJ5IiwiaXNNdWx0aVZhbHVlRmllbGQiLCJleHRlcm5hbElkUGF0aCIsInZoS2V5UHJvcGVydHkiLCJ2aEtleVZhbHVlIiwidmhQcm9wZXJ0aWVzIiwidmhLZXkiLCJmaW5kQ29uZGl0aW9uc0ZvckNvbnRleHQiLCJrZXlQYXRoIiwiZ2V0S2V5UGF0aCIsImZpbmRDb25kaXRpb24iLCJjb25kaXRpb25TZWxlY3RlZFJvdyIsInVzZU11bHRpVmFsdWVGaWVsZCIsImNvbnRleHRLZXlzIiwic2VsZWN0ZWRDb25kaXRpb24iLCJfdXBkYXRlQmluZGluZ0F0dHJpYnV0ZXMiLCJyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIiwicmVjZW50VmFsdWVzQ29udGV4dERhdGEiLCJvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSIsIl9nZXRSZWxldmFudEFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwic29ydCIsImhhc1JlbGV2YW50RGF0YSIsInJlc2V0Q2hhbmdlcyIsImRlYnVnIiwiYWRkaXRpb25hbFZhbHVlSGVscGVyIiwiY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInJvb3RCaW5kaW5nIiwiZ2V0Um9vdEJpbmRpbmciLCJzdXNwZW5kIiwic29ydEFuZEZpbHRlckxpc3RCaW5kaW5nIiwiY2hhbmdlUGFyYW1ldGVycyIsInJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXMiLCJyZXF1ZXN0Rm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEiLCJ2YWx1ZUhlbHBLZXlzIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhIiwiZ2V0UmVsZXZhbnRSZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSIsInJlcGxhY2VBbGwiLCJnZXRSZWxldmFudE90aGVyc1ZhbHVlc0NvbnRleHREYXRhIiwiZmlsdGVycyIsIkZpbHRlclR5cGUiLCJBcHBsaWNhdGlvbiIsInNvcnRlciIsInJlc3VtZSIsIl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyIsImNoZWNrUmVjb21tZW5kYXRpb25zIiwiYXJndW1lbnRzIiwicmVjb21tZW5kYXRpb25WYWx1ZXMiLCJyZWNlbnRWYWx1ZXMiLCJjb250ZW50TW9kZWwiLCJsb2NhbEFubm90YXRpb25Nb2RlbCIsImdldExvY2FsQW5ub3RhdGlvbk1vZGVsIiwiYmluZGluZ0NvbnRleHRQYXRoIiwiZmllbGRQYXRoIiwiaW5wdXRWYWx1ZXMiLCJ0eXBlQWhlYWRGb3JGaWx0ZXJhYmxlQ29udGVudCIsInNob3dJdCIsInR5cGVBaGVhZENvbnRlbnQiLCJnZXRDb250ZW50IiwiZmlsdGVyVmFsdWUiLCJmaWVsZFRleHRWYWx1ZSIsImdldEFkZGl0aW9uYWxWYWx1ZSIsImNvbmRpdGlvbkZvclJlcXVlc3RTaG93Q29udGFpbmVyIiwicGFyZW50Q29udHJvbCIsImZpZWxkSWQiLCJnZXRJZCIsImlzVmlzdWFsRmlsdGVyIiwidmFsdWVIZWxwVGFibGUiLCJnZXRQYXJlbnREaWFsb2ciLCJpbm5lckNvbnRlbnQiLCJnZXREb21SZWYiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImlkIiwiZ2V0SW5pdGlhbEZvY3VzIiwiY2hlY2tIaXN0b3J5RW5hYmxlZCIsInJlcXVlc3RTaG93Q29udGFpbmVyIiwicmVxdWVzdFNob3dDb250YWluZXJSZWFzb24iLCJSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiIsIlRhYiIsIlRhcCIsIlR5cGluZyIsIkZpbHRlciIsIlZhbHVlSGVscFJlcXVlc3QiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlZhbHVlSGVscERlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udmVydGVkTWV0YWRhdGEsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBkZWVwRXF1YWwgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcEVxdWFsXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUluZm8gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9MaXN0UmVwb3J0L0ZpbHRlckJhclwiO1xuaW1wb3J0IHsgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgdHlwZSB7IEZpZWxkRGF0YVR5cGUsIFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1ZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBJRmlsdGVyQ29udHJvbCB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuaW1wb3J0IEZpbHRlclV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBJbk91dFBhcmFtZXRlciwgU29ydGVyVHlwZSwgVmFsdWVIZWxwUGF5bG9hZCB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ludGVybmFsL3ZhbHVlaGVscC9WYWx1ZUxpc3RIZWxwZXJcIjtcbmltcG9ydCBWYWx1ZUxpc3RIZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvbS9UYWJsZVwiO1xuaW1wb3J0IGhpZ2hsaWdodERPTUVsZW1lbnRzIGZyb20gXCJzYXAvbS9pbnB1dFV0aWxzL2hpZ2hsaWdodERPTUVsZW1lbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE1lc3NhZ2VUeXBlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VUeXBlXCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgRmllbGQgfSBmcm9tIFwic2FwL3VpL21kYy9GaWVsZFwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyIGZyb20gXCJzYXAvdWkvbWRjL0ZpbHRlckJhclwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyRmllbGRcIjtcbmltcG9ydCB0eXBlIE11bHRpVmFsdWVGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9NdWx0aVZhbHVlRmllbGRcIjtcbmltcG9ydCB0eXBlIFZhbHVlSGVscCBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBcIjtcbmltcG9ydCBWYWx1ZUhlbHBEZWxlZ2F0ZSBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBEZWxlZ2F0ZVwiO1xuaW1wb3J0IHR5cGUgeyBDb25kaXRpb25PYmplY3QgfSBmcm9tIFwic2FwL3VpL21kYy9jb25kaXRpb24vQ29uZGl0aW9uXCI7XG5pbXBvcnQgQ29uZGl0aW9uIGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9Db25kaXRpb25cIjtcbmltcG9ydCBDb25kaXRpb25WYWxpZGF0ZWQgZnJvbSBcInNhcC91aS9tZGMvZW51bXMvQ29uZGl0aW9uVmFsaWRhdGVkXCI7XG5pbXBvcnQgUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24gZnJvbSBcInNhcC91aS9tZGMvZW51bXMvUmVxdWVzdFNob3dDb250YWluZXJSZWFzb25cIjtcbmltcG9ydCB0eXBlIEZpZWxkQmFzZSBmcm9tIFwic2FwL3VpL21kYy9maWVsZC9GaWVsZEJhc2VcIjtcbmltcG9ydCB0eXBlIEZpbHRlckJhckJhc2UgZnJvbSBcInNhcC91aS9tZGMvZmlsdGVyYmFyL0ZpbHRlckJhckJhc2VcIjtcbmltcG9ydCBUeXBlTWFwIGZyb20gXCJzYXAvdWkvbWRjL29kYXRhL3Y0L1R5cGVNYXBcIjtcbmltcG9ydCBTdGF0ZVV0aWwgZnJvbSBcInNhcC91aS9tZGMvcDEzbi9TdGF0ZVV0aWxcIjtcbmltcG9ydCB0eXBlIE1EQ1BvcG92ZXIgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL1BvcG92ZXJcIjtcbmltcG9ydCB0eXBlIENvbnRhaW5lciBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvYmFzZS9Db250YWluZXJcIjtcbmltcG9ydCB0eXBlIENvbnRlbnQgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvQ29udGVudFwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyYWJsZUxpc3RDb250ZW50IGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9iYXNlL0ZpbHRlcmFibGVMaXN0Q29udGVudFwiO1xuaW1wb3J0IHR5cGUgTVRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9jb250ZW50L01UYWJsZVwiO1xuaW1wb3J0IEZpbHRlclR5cGUgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJUeXBlXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgVmFsdWUgfSBmcm9tIFwiLi4vZmllbGQvRmllbGRCYXNlRGVsZWdhdGVcIjtcbmltcG9ydCB0eXBlIHsgQWRkaXRpb25hbFZhbHVlVHlwZSwgQmluZGluZ0luZm9QYXJhbWV0ZXJzIH0gZnJvbSBcIi4uL2ludGVybmFsL3ZhbHVlaGVscC9BZGRpdGlvbmFsVmFsdWVIZWxwZXJcIjtcbmltcG9ydCB7IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LCBhZGRpdGlvbmFsVmFsdWVIZWxwZXIgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdmFsdWVoZWxwL0FkZGl0aW9uYWxWYWx1ZUhlbHBlclwiO1xuXG5jb25zdCBGZUNvcmVDb250cm9sc0ZpbHRlckJhciA9IFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5GaWx0ZXJCYXJcIjtcbmNvbnN0IEFubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2UgPSBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuSXNEaWdpdFNlcXVlbmNlXCI7XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvbk9iamVjdE1hcCA9IFJlY29yZDxzdHJpbmcsIENvbmRpdGlvbk9iamVjdFtdPjtcblxuZXhwb3J0IHR5cGUgRXh0ZXJuYWxTdGF0ZVR5cGUgPSB7XG5cdGl0ZW1zOiB7IG5hbWU6IHN0cmluZyB9W107XG5cdGZpbHRlcjogQ29uZGl0aW9uT2JqZWN0TWFwO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvblBheWxvYWRNYXAgPSBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25QYXlsb2FkVHlwZVtdPjtcblxudHlwZSBNRENDb25maWdUeXBlID0ge1xuXHR2YWx1ZTogdW5rbm93bjtcblx0cGFyc2VkVmFsdWU6IHVua25vd247XG5cdGNvbnRleHQ6IG9iamVjdDtcblx0Y29udHJvbDogQ29udHJvbDsgLy8gSW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgY29udHJvbFxuXHRiaW5kaW5nQ29udGV4dDogT0RhdGFWNENvbnRleHQ7XG5cdGNoZWNrS2V5OiBib29sZWFuO1xuXHRjaGVja0Rlc2NyaXB0aW9uOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbih7fSwgVmFsdWVIZWxwRGVsZWdhdGUsIHtcblx0YXBpVmVyc2lvbjogMixcblx0dXBkYXRlQmluZGluZ0RvbmVQcm9taXNlczogbmV3IFdlYWtNYXA8b2JqZWN0LCBQcm9taXNlPHZvaWQ+PigpLFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gc3VwcG9ydHMgJFNlYXJjaC5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBDb250ZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIF9saXN0QmluZGluZ1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmICRzZWFyY2ggaXMgc3VwcG9ydGVkXG5cdCAqL1xuXHRpc1NlYXJjaFN1cHBvcnRlZDogZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBGaWx0ZXJhYmxlTGlzdENvbnRlbnQsIF9saXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZykge1xuXHRcdHJldHVybiAhIWNvbnRlbnQuZGF0YShcInNlYXJjaFN1cHBvcnRlZFwiKTtcblx0fSxcblxuXHQvKlxuXHQgKiBBZGp1c3RhYmxlIGZpbHRlcmluZyBmb3IgbGlzdC1iYXNlZCBjb250ZW50cy5cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCByZXF1ZXN0aW5nIGNvbmRpdGlvbnMgY29uZmlndXJhdGlvblxuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKi9cblx0dXBkYXRlQmluZGluZ0luZm86IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogRmlsdGVyYWJsZUxpc3RDb250ZW50LCBiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8pIHtcblx0XHRWYWx1ZUhlbHBEZWxlZ2F0ZS51cGRhdGVCaW5kaW5nSW5mbyh2YWx1ZUhlbHAsIGNvbnRlbnQsIGJpbmRpbmdJbmZvKTtcblxuXHRcdGlmIChjb250ZW50LmRhdGEoXCJzZWFyY2hTdXBwb3J0ZWRcIikpIHtcblx0XHRcdGNvbnN0IHNlYXJjaCA9IGNvbnRlbnQuZ2V0RmlsdGVyVmFsdWUoKTtcblx0XHRcdGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBDb21tb25VdGlscy5ub3JtYWxpemVTZWFyY2hUZXJtKHNlYXJjaCk7IC8vIGFkanVzdFNlYXJjaFxuXG5cdFx0XHRpZiAoYmluZGluZ0luZm8ucGFyYW1ldGVycykge1xuXHRcdFx0XHQoYmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuJHNlYXJjaCA9IG5vcm1hbGl6ZWRTZWFyY2ggfHwgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSB2YWx1ZSBoZWxwIGhpc3Rvcnkgc2VydmljZSBmcm9tIHRoZSBhcHAgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIHRvIGZpbmQgdGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2Vcblx0ICovXG5cdF9nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZShjb250cm9sOiBDb250cm9sKTogVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2Uge1xuXHRcdC8vIEZvciBzb21lIHJlYXNvbiB3ZSBjYW5ub3QgdXNlIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChjb250cm9sKSBoZXJlIGJ1dCBuZWVkIHRvIGdldCB0aGUgVmlldyBmaXJzdC5cblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQoQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyhjb250cm9sKSk7XG5cdFx0cmV0dXJuIGFwcENvbXBvbmVudC5nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZSgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGhpc3RvcnkgZGF0YSBmb3IgdGhlIHZhbHVlIGxpc3QgcHJvcGVydHkgZnJvbSB0aGUgaGlzdG9yeSBzZXJ2aWNlLlxuXHQgKiBObyBoaXN0b3J5IGRhdGEgaXMgZmV0Y2hlZCBmb3IgZmllbGRzIGFubm90YXRlZCB3aXRoIElzUG90ZW50aWFsbHlTZW5zaXRpdmUuXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIFZhbHVlSGVscFxuXHQgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIHRvIGZpbmQgdGhlIGFwcCBjb21wb25lbnQsIGUuZy4gdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgdG8gYSBsaXN0IG9mIGZpZWxkIGRhdGEgZm9yIHRoZSB2YWx1ZSBsaXN0IHByb3BlcnR5XG5cdCAqL1xuXHRfZ2V0SGlzdG9yeURhdGE6IGFzeW5jIGZ1bmN0aW9uIChwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLCBjb250cm9sOiBDb250cm9sKTogUHJvbWlzZTxGaWVsZERhdGFUeXBlW10+IHtcblx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Py5lbmFibGVkICYmIHBheWxvYWQuaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSAhPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgdmFsdWVMaXN0SGlzdG9yeVNlcnZpY2UgPSB0aGlzLl9nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZShjb250cm9sKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkRGF0YSA9IGF3YWl0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlLmdldEZpZWxkRGF0YShwYXlsb2FkLnByb3BlcnR5UGF0aCArIFwiL1wiICsgcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXIpO1xuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkuZGF0YSA9IGZpZWxkRGF0YTtcblx0XHRcdFx0cmV0dXJuIGZpZWxkRGF0YTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGhpc3RvcnkgZGF0YSBmb3IgdGhlIHZhbHVlIGxpc3QgcHJvcGVydHkgaW4gdGhlIGhpc3Rvcnkgc2VydmljZS5cblx0ICogTm8gaGlzdG9yeSBkYXRhIGlzIHN0b3JlZCBmb3IgZmllbGRzIGFubm90YXRlZCB3aXRoIElzUG90ZW50aWFsbHlTZW5zaXRpdmUuXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIFZhbHVlSGVscFxuXHQgKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUgY29uZGl0aW9uIG9iamVjdCB0byBnZXQgdGhlIHNlbGVjdGVkIGRhdGEgZnJvbVxuXHQgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIHRvIGZpbmQgdGhlIGFwcCBjb21wb25lbnQsIGUuZy4gdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgd2hlbiB0aGUgZGF0YSBpcyBzZXQgaW4gdGhlIGhpc3Rvcnkgc2VydmljZVxuXHQgKi9cblx0X3NldEhpc3RvcnlEYXRhOiBhc3luYyBmdW5jdGlvbiAocGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCwgY29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10sIGNvbnRyb2w6IENvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Py5lbmFibGVkICYmIHBheWxvYWQuaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSAhPT0gdHJ1ZSAmJiBjb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgdmFsdWVMaXN0UHJvcGVydHkgPSB0aGlzLl9nZXRWYWx1ZUxpc3RQcm9wZXJ0eUZyb21QYXlsb2FkUXVhbGlmaWVyKHBheWxvYWQpO1xuXHRcdFx0aWYgKHZhbHVlTGlzdFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGRhdGE6IEZpZWxkRGF0YVR5cGVbXSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAocGF5bG9hZC5pc1VuaXRWYWx1ZUhlbHAgfHwgY29uZGl0aW9uLnZhbGlkYXRlZCA9PT0gQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbik/LlswXTtcblx0XHRcdFx0XHRcdGlmIChjb25kaXRpb25QYXlsb2FkTWFwKSB7XG5cdFx0XHRcdFx0XHRcdGRhdGEucHVzaCh0aGlzLmNvbnZlcnRDb25kaXRpb25QYXlsb2FkVG9OZXN0ZWRPYmplY3QoY29uZGl0aW9uUGF5bG9hZE1hcCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYXRhLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlID0gdGhpcy5fZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UoY29udHJvbCk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdmFsdWVMaXN0SGlzdG9yeVNlcnZpY2Uuc2V0RmllbGREYXRhKHBheWxvYWQucHJvcGVydHlQYXRoICsgXCIvXCIgKyBwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllciwgZGF0YSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbnZlcnRpbmcgdGhlIGNvbmRpdGlvbiBwYXlsb2FkIHRvIGEgbmVzdGVkIG9iamVjdC5cblx0ICogQHBhcmFtIGNvbmRpdGlvblBheWxvYWQgVGhlIGNvbmRpdGlvbiBwYXlsb2FkIG9iamVjdCB0byBiZSBjb252ZXJ0ZWRcblx0ICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBuZXN0ZWQgb2JqZWN0XG5cdCAqL1xuXHRjb252ZXJ0Q29uZGl0aW9uUGF5bG9hZFRvTmVzdGVkT2JqZWN0OiBmdW5jdGlvbiAoY29uZGl0aW9uUGF5bG9hZDogQ29uZGl0aW9uUGF5bG9hZFR5cGUpOiBDb25kaXRpb25QYXlsb2FkVHlwZSB7XG5cdFx0Y29uc3QgbmVzdGVkT2JqZWN0OiBDb25kaXRpb25QYXlsb2FkVHlwZSA9IHt9O1xuXHRcdGZvciAoY29uc3Qga2V5IGluIGNvbmRpdGlvblBheWxvYWQpIHtcblx0XHRcdE9iamVjdFBhdGguc2V0KGtleS5zcGxpdChcIi9cIiksIGNvbmRpdGlvblBheWxvYWRba2V5XSwgbmVzdGVkT2JqZWN0KTtcblx0XHR9XG5cdFx0cmV0dXJuIG5lc3RlZE9iamVjdDtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2sgaWYgdmFsdWUgaXMgZGlnaXQgc2VxdWVuY2Ugd2l0aCBubyB2YWx1ZS5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xuXHQgKiBAcGFyYW0gaXNEaWdpdFNlcXVlbmNlIEluZGljYXRlcyBpZiB0aGUgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBkaWdpdCBzZXF1ZW5jZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBkaWdpdCBzZXF1ZW5jZSwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRfaXNFbXB0eURpZ2l0U2VxdWVuY2U6IGZ1bmN0aW9uICh2YWx1ZTogVmFsdWUsIGlzRGlnaXRTZXF1ZW5jZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGxldCBpc0VtcHR5RGlnaXRTZXF1ZW5jZSA9IGZhbHNlO1xuXHRcdGlmIChpc0RpZ2l0U2VxdWVuY2UpIHtcblx0XHRcdGlzRW1wdHlEaWdpdFNlcXVlbmNlID1cblx0XHRcdFx0dHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG5cdFx0XHRcdFx0PyB2YWx1ZS5zcGxpdChcIlwiKS5ldmVyeSgoY2hhcikgPT4gY2hhciA9PT0gXCIwXCIpID8/IHZhbHVlID09PSBcIlwiXG5cdFx0XHRcdFx0OiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNFbXB0eURpZ2l0U2VxdWVuY2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBmaWVsZCBpcyByZWNvbW1lbmRhdGlvbiByZWxldmFudCBhbmQgY2FsbHMgZWl0aGVyIF91cGRhdGVCaW5kaW5nIG9yIF91cGRhdGVCaW5kaW5nRm9yUmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIGNvbnRlbnQgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICovXG5cdHVwZGF0ZUJpbmRpbmc6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0Y29udGVudDogTVRhYmxlXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIGxpc3RCaW5kaW5nIHNob3VsZCBiZSBvZiB0eXBlIE9EYXRhTGlzdEJpbmRpbmdcblx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly9XZSBmZXRjaCB0aGUgdmFsdWVsaXN0IHByb3BlcnR5IGZyb20gdGhlIHBheWxvYWQgdG8gbWFrZSBzdXJlIHdlIHBhc3MgdGhlIHJpZ2h0IHByb3BlcnR5IHdoaWxlIG1ha2luZyBhIGNhbGwgb24gdmFsdWVsaXN0IGVudGl0eSBzZXRcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGlmIChjb250ZW50LmlzVHlwZWFoZWFkKCkpIHtcblx0XHRcdGxldCB1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIGNyZWF0ZSBhIHByb21pc2UgdG8gbWFrZSBzdXJlIGNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nIGlzIG9ubHkgY29tcGxldGVkIG9uY2UgdGhpcyBwcm9taXNlIGlzIHJlc29sdmVkXG5cdFx0XHRjb25zdCBuZXdQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdFx0dXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgZXhpc3RpbmdVcGRhdGVCaW5kaW5nRG9uZVByb21pc2UgPSB0aGlzLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXMuZ2V0KGxpc3RCaW5kaW5nKTtcblx0XHRcdC8vYnVpbGQgYSBwcm9taXNlIGNoYWluIGlmIG5lY2Vzc2FyeVxuXHRcdFx0dGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLnNldChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdGV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlID8gZXhpc3RpbmdVcGRhdGVCaW5kaW5nRG9uZVByb21pc2UudGhlbihhc3luYyAoKSA9PiBuZXdQcm9taXNlKSA6IG5ld1Byb21pc2Vcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHZhbHVlTGlzdFByb3BlcnR5ID0gdGhpcy5fZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllcihwYXlsb2FkKTtcblx0XHRcdGNvbnN0IGZpZWxkID0gY29udGVudC5nZXRDb250cm9sKCkgYXMgRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZDtcblx0XHRcdGNvbnN0IGlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQgPVxuXHRcdFx0XHRmaWVsZC5pc0E8RmlsdGVyRmllbGQ+KFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSB8fCBmaWVsZC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpO1xuXHRcdFx0Y29uc3QgZmllbGRWYWx1ZSA9ICFpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkICYmIGZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10gPSBbXTtcblxuXHRcdFx0Ly8gV2UgbmVlZCB0byBzaG93IHJlY29tbWVuZGF0aW9ucyBvbmx5IHdoZW4gdGhlIGZpZWxkIGhhcyBlbXB0eSB2YWx1ZSBvciB3aGVuIHVzZXIgaXMgdHlwaW5nIGEgdmFsdWUuIE90aGVyIHRpbWVzIHdlIHNob3VsZCBub3Qgc2hvdyByZWNvbW1lbmRhdGlvbnMuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgZmllbGQgaGFzIGFueSBwZW5kaW5nIHVzZXIgaW5wdXQgYW5kIGlmIGl0IGlzIHRoZW4gd2Ugc2hvdyByZWNvbW1lbmRhdGlvbnMgaWYgYW55LlxuXHRcdFx0Y29uc3QgaXNEaWdpdFNlcXVlbmNlID1cblx0XHRcdFx0KGZpZWxkLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KGAke3BheWxvYWQucHJvcGVydHlQYXRofSR7QW5ub3RhdGlvbklzRGlnaXRTZXF1ZW5jZX1gKSA/PyBmYWxzZTtcblx0XHRcdGlmICghZmllbGRWYWx1ZSB8fCBmaWVsZC5oYXNQZW5kaW5nVXNlcklucHV0KCkgfHwgdGhpcy5faXNFbXB0eURpZ2l0U2VxdWVuY2UoZmllbGRWYWx1ZSwgaXNEaWdpdFNlcXVlbmNlKSkge1xuXHRcdFx0XHQvL2dldCB0aGUgcmVjb21tZW5kYXRpb24gZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBtb2RlbFxuXHRcdFx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKGNvbnRlbnQsIHBheWxvYWQpO1xuXG5cdFx0XHRcdC8vaWYgdGhlcmUgYXJlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9ucyB0aGVuIGNyZWF0ZSBhZGRpdGlvbmFsIHZhbHVlIHN0cnVjdHVyZSBhbmQgY2FsbCBfdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9uc1xuXHRcdFx0XHRpZiAodmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMucHVzaCh7IHByb3BlcnR5UGF0aDogdmFsdWVMaXN0UHJvcGVydHksIHZhbHVlcywgZ3JvdXBLZXk6IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LnJlY29tbWVuZGF0aW9uIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHRhYmxlID0gY29udGVudC5nZXRUYWJsZSgpO1xuXHRcdFx0Y29uc3Qgc29ydGVyc0N1c3RvbURhdGEgPSB0YWJsZS5nZXRDdXN0b21EYXRhKCkuZmlsdGVyKChkYXRhKSA9PiBkYXRhLmdldEtleSgpID09PSBcInNvcnRlcnNcIik7XG5cdFx0XHRsZXQgc29ydGVyczogU29ydGVyVHlwZVtdID0gW107XG5cdFx0XHRpZiAoc29ydGVyc0N1c3RvbURhdGEubGVuZ3RoKSBzb3J0ZXJzID0gc29ydGVyc0N1c3RvbURhdGFbMF0uZ2V0VmFsdWUoKS5zb3J0ZXJzO1xuXG5cdFx0XHRhd2FpdCB0aGlzLl91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzKFxuXHRcdFx0XHRwYXlsb2FkLFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0YmluZGluZ0luZm8sXG5cdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMsXG5cdFx0XHRcdHZhbHVlTGlzdFByb3BlcnR5LFxuXHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0c29ydGVycyxcblx0XHRcdFx0dGFibGVcblx0XHRcdCk7XG5cdFx0XHRpZiAodXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSkge1xuXHRcdFx0XHQvL3Jlc29sdmUgdGhlIHByb21pc2UgYXMgZXZlcnl0aGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0dXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL2NhbGwgX3VwZGF0ZUJpbmRpbmcgaWYgdGhlcmUgYXJlIG5vIHJlbGV2YW50IHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0dGhpcy5fdXBkYXRlQmluZGluZyhsaXN0QmluZGluZywgYmluZGluZ0luZm8pO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGEgZmlsdGVyIGluIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+LlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIHJlcXVlc3RlZEl0ZW1zIE51bWJlciBvZiByZXF1ZXN0ZWQgaXRlbXNcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGlmIHNlYXJjaCBpcyBleGVjdXRlZFxuXHQgKi9cblx0ZXhlY3V0ZUZpbHRlcjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXM6IG51bWJlcikge1xuXHRcdGxpc3RCaW5kaW5nLmdldENvbnRleHRzKDAsIHJlcXVlc3RlZEl0ZW1zKTtcblxuXHRcdGF3YWl0IHRoaXMuY2hlY2tMaXN0QmluZGluZ1BlbmRpbmcodmFsdWVIZWxwLCBsaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXMpO1xuXHRcdHJldHVybiBsaXN0QmluZGluZztcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gaXMgd2FpdGluZyBmb3IgYW4gdXBkYXRlLlxuXHQgKiBBcyBsb25nIGFzIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBzZXQgZm9yIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPixcblx0ICogPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBuZWVkcyB0byB3YWl0LlxuXHQgKiBAcGFyYW0gX3ZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdEJpbmRpbmcgdG8gY2hlY2tcblx0ICogQHBhcmFtIHJlcXVlc3RlZEl0ZW1zIE51bWJlciBvZiByZXF1ZXN0ZWQgaXRlbXNcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9uY2UgTGlzdEJpbmRpbmcgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKi9cblx0Y2hlY2tMaXN0QmluZGluZ1BlbmRpbmc6IGFzeW5jIGZ1bmN0aW9uIChfdmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkLCByZXF1ZXN0ZWRJdGVtczogbnVtYmVyKSB7XG5cdFx0bGV0IGlzUGVuZGluZyA9IGZhbHNlO1xuXHRcdGlmIChsaXN0QmluZGluZyAmJiB0aGlzLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXMuaGFzKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0YXdhaXQgdGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLmdldChsaXN0QmluZGluZyk7XG5cdFx0fVxuXHRcdGlmIChsaXN0QmluZGluZyAmJiAhbGlzdEJpbmRpbmcuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgY29udGV4dHMgPSBhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgcmVxdWVzdGVkSXRlbXMpO1xuXHRcdFx0XHRpc1BlbmRpbmcgPSBjb250ZXh0cy5sZW5ndGggPT09IDA7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRpZiAoZXJyb3IgJiYgKGVycm9yIGFzIHsgY2FuY2VsZWQ/OiBib29sZWFuIH0pPy5jYW5jZWxlZCkge1xuXHRcdFx0XHRcdHJldHVybiBpc1BlbmRpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpc1BlbmRpbmc7XG5cdH0sXG5cblx0Z2V0VHlwZU1hcDogZnVuY3Rpb24gKF92YWx1ZUhlbHA6IFZhbHVlSGVscCkge1xuXHRcdHJldHVybiBUeXBlTWFwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgY29udGVudCBvZiB0aGUgdmFsdWUgaGVscC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgaGVscCBpcyBvcGVuZWQgb3IgYSBrZXkgb3IgZGVzY3JpcHRpb24gaXMgcmVxdWVzdGVkLlxuXHQgKlxuXHQgKiBTbywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBoZWxwIGNvbnRlbnQgdXNlZCwgYWxsIGNvbnRlbnQgY29udHJvbHMgYW5kIGRhdGEgbmVlZCB0byBiZSBhc3NpZ25lZC5cblx0ICogT25jZSB0aGV5IGFyZSBhc3NpZ25lZCBhbmQgdGhlIGRhdGEgaXMgc2V0LCB0aGUgcmV0dXJuZWQgPGNvZGU+UHJvbWlzZTwvY29kZT4gbmVlZHMgdG8gYmUgcmVzb2x2ZWQuXG5cdCAqIE9ubHkgdGhlbiBkb2VzIHRoZSB2YWx1ZSBoZWxwIGNvbnRpbnVlIG9wZW5pbmcgb3IgcmVhZGluZyBkYXRhLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250YWluZXIgQ29udGFpbmVyIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50SWQgSWQgb2YgdGhlIGNvbnRlbnQgc2hvd24gYWZ0ZXIgdGhpcyBjYWxsIHRvIHJldHJpZXZlQ29udGVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgaWYgYWxsIGNvbnRlbnQgaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRyZXRyaWV2ZUNvbnRlbnQ6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGFpbmVyOiBDb250YWluZXIsIGNvbnRlbnRJZDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRyZXR1cm4gVmFsdWVMaXN0SGVscGVyLnNob3dWYWx1ZUxpc3QocGF5bG9hZCwgY29udGFpbmVyLCBjb250ZW50SWQpO1xuXHR9LFxuXG5cdF9nZXRDb25kaXRpb25QYXlsb2FkTGlzdDogZnVuY3Rpb24gKGNvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0KSB7XG5cdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IChjb25kaXRpb24ucGF5bG9hZCB8fCB7fSkgYXMgQ29uZGl0aW9uUGF5bG9hZE1hcCxcblx0XHRcdHZhbHVlSGVscFF1YWxpZmllcnMgPSBPYmplY3Qua2V5cyhjb25kaXRpb25QYXlsb2FkTWFwKSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdmFsdWVIZWxwUXVhbGlmaWVycy5sZW5ndGggPyBjb25kaXRpb25QYXlsb2FkTWFwW3ZhbHVlSGVscFF1YWxpZmllcnNbMF1dIDogW107XG5cblx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZExpc3Q7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIFZhbHVlTGlzdFByb3BlcnR5IGZyb20gUGF5bG9hZCBiYXNlZCBvbiBkYXRhIGZyb20gcGF5bG9hZCBrZXlzIGFuZCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBWYWx1ZUxpc3RQcm9wZXJ0eVxuXHQgKi9cblx0X2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXI6IGZ1bmN0aW9uIChwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXT8udmhQYXJhbWV0ZXJzIHx8IFtdO1xuXHRcdGNvbnN0IGtleXMgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdPy52aEtleXMgfHwgW107XG5cdFx0Y29uc3QgcHJvcGVydHlLZXlQYXRoID0gcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoO1xuXHRcdGxldCBmaWx0ZXJlZEtleXM6IHN0cmluZ1tdID0gWy4uLmtleXNdO1xuXHRcdGNvbnN0IGhlbHBQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRpZiAocGFyYW1zLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vY3JlYXRlIGhlbHBQYXRocyBhcnJheSB3aGljaCB3aWxsIG9ubHkgY29uc2lzdCBvZiBwYXJhbXMgaGVscHBhdGhcblx0XHRcdHBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbTogSW5PdXRQYXJhbWV0ZXIpIHtcblx0XHRcdFx0aGVscFBhdGhzLnB1c2gocGFyYW0uaGVscFBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0XHQvL2ZpbHRlciB0aGUga2V5cyBiYXNlZCBvbiBoZWxwUGF0aHMuIElmIGtleSBpcyBub3QgcHJlc2VudCBpbiBoZWxwUGF0aCB0aGVuIGl0IGlzIHZhbHVlbGlzdHByb3BlcnR5XG5cdFx0XHRmaWx0ZXJlZEtleXMgPSBrZXlzLmZpbHRlcigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0cmV0dXJuICFoZWxwUGF0aHMuaW5jbHVkZXMoa2V5KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIGZyb20gZmlsdGVyZWRLZXlzIHJldHVybiB0aGUga2V5IHRoYXQgbWF0Y2hlcyB0aGUgcHJvcGVydHkgbmFtZVxuXHRcdHJldHVybiBwcm9wZXJ0eUtleVBhdGggJiYgZmlsdGVyZWRLZXlzLmluY2x1ZGVzKHByb3BlcnR5S2V5UGF0aCkgPyBwcm9wZXJ0eUtleVBhdGggOiBcIlwiO1xuXHR9LFxuXG5cdF9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9GaWx0ZXJCYXI6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXSxcblx0XHRvdXRQYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdGZpbHRlckJhcjogRmlsdGVyQmFyLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0bGlzdFJlcG9ydEZpbHRlckJhcjogRmlsdGVyQmFyXG5cdCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzdGF0ZTogRXh0ZXJuYWxTdGF0ZVR5cGUgPSBhd2FpdCBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKGxpc3RSZXBvcnRGaWx0ZXJCYXIpO1xuXHRcdFx0Y29uc3Qgc3RhdGVJdGVtcyA9IHN0YXRlLml0ZW1zOyAvLyBWaXNpYmxlIEZpbHRlckl0ZW1zIGluIHRoZSBMUi1GaWx0ZXJCYXJcblx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnRpZXMgPSBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJQcm9wZXJ0eUluZm8oZmlsdGVyQmFyIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gZmlsdGVyQmFyLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgb25seSBpZiB0aGUgZmlsdGVyIGZpZWxkIGlzIHZpc2libGUgaW4gdGhlIExSIGZpbHRlcmJhclxuXHRcdFx0Ly8gTFIgRmlsdGVyQmFyIG9yIExSIEFkYXB0RmlsdGVyXG5cdFx0XHRmb3IgKGNvbnN0IG91dFBhcmFtZXRlciBvZiBvdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gdGhpcy5fZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aChcblx0XHRcdFx0XHRvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0bWV0YU1vZGVsLFxuXHRcdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGZpbHRlckJhclByb3BlcnR5ICYmIHN0YXRlSXRlbXM/LmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gZmlsdGVyQmFyUHJvcGVydHkubmFtZSkpIHtcblx0XHRcdFx0XHQvKiBSZXNldCB0aGUgY29uZGl0aW9ucyBiZWZvcmUgY3JlYXRlIG5ldyBjb25kaXRpb25zIG90aGVyd2lzZSBpdCBnZXRzIG5vdCB1cGRhdGVkICovXG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF0aCA9IGZpbHRlckJhclByb3BlcnR5LmNvbmRpdGlvblBhdGggYXMgc3RyaW5nO1xuXHRcdFx0XHRcdHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXT8uZm9yRWFjaCgoY29uZGl0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25kaXRpb24uZmlsdGVyZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgZm9yIGVhY2ggY29uZGl0aW9uc1xuXHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTGlzdCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbik7XG5cdFx0XHRcdGZvciAoY29uc3Qgb3V0UGFyYW1ldGVyIG9mIG91dFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0eSA9IHRoaXMuX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgoXG5cdFx0XHRcdFx0XHRvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0XHRwYXlsb2FkLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdC8vIFByb3BhZ2F0ZSBPVVQgcGFyYW1ldGVyIG9ubHkgaWYgdGhlIGZpbHRlciBmaWVsZCBpcyB2aXNpYmxlIGluIHRoZSBMUiBmaWx0ZXJiYXJcblx0XHRcdFx0XHQvLyBMUiBGaWx0ZXJCYXIgb3IgTFIgQWRhcHRGaWx0ZXJcblx0XHRcdFx0XHRpZiAoZmlsdGVyQmFyUHJvcGVydHkgJiYgc3RhdGVJdGVtcz8uZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJCYXJQcm9wZXJ0eS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb25QYXlsb2FkIG9mIGNvbmRpdGlvblBheWxvYWRMaXN0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXG5cdFx0XHRcdFx0XHRcdFx0XCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcdFtjb25kaXRpb25QYXlsb2FkW291dFBhcmFtZXRlci5oZWxwUGF0aF1dLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBhdGggPSBmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoIGFzIHN0cmluZztcblx0XHRcdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uQWxyZWFkeUV4aXN0cyA9IHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXT8uZmluZCgodGVzdENvbmRpdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSB0ZXN0Q29uZGl0aW9uLmZpbHRlcmVkO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChkZWVwRXF1YWwodGVzdENvbmRpdGlvbiwgbmV3Q29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdC8vIHJlc2V0IGZpbHRlcmVkIHRvIGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0dGVzdENvbmRpdGlvbi5maWx0ZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmICghY29uZGl0aW9uQWxyZWFkeUV4aXN0cykge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXSB8fD0gW107XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUuZmlsdGVyW2NvbmRpdGlvblBhdGhdLnB1c2gobmV3Q29uZGl0aW9uKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gQXBwbHkgdG8gdGhlIHBhcmVudCBvZiB0aGUgRmlsdGVyRmllbGRcblx0XHRcdFN0YXRlVXRpbC5hcHBseUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyLCBzdGF0ZSk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuXHRcdFx0TG9nLmVycm9yKGBWYWx1ZUhlbHBEZWxlZ2F0ZTogJHttZXNzYWdlfWApO1xuXHRcdH1cblx0fSxcblxuXHRfZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aDogZnVuY3Rpb24gKFxuXHRcdG91dFBhcmFtZXRlcjogSW5PdXRQYXJhbWV0ZXIsXG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRmaWx0ZXJCYXJQcm9wZXJ0aWVzOiBQcm9wZXJ0eUluZm9bXVxuXHQpIHtcblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGAvJHtwcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzFdfWA7XG5cdFx0Y29uc3QgZmlsdGVyVGFyZ2V0ID0gb3V0UGFyYW1ldGVyLnNvdXJjZS5zcGxpdChcImNvbmRpdGlvbnMvXCIpLnBvcCgpIHx8IFwiXCI7XG5cdFx0Y29uc3QgbGFzdEluZGV4ID0gcHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRjb25zdCBmaWx0ZXJUYXJnZXRQYXRoID0gbGFzdEluZGV4ID4gMCA/IGAke3Byb3BlcnR5UGF0aC5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KX0vJHtmaWx0ZXJUYXJnZXR9YCA6IGZpbHRlclRhcmdldDtcblx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aCA9IG1ldGFNb2RlbD8uZ2V0UmVkdWNlZFBhdGgoZmlsdGVyVGFyZ2V0UGF0aCwgY29udGV4dFBhdGgpO1xuXHRcdHJldHVybiBmaWx0ZXJCYXJQcm9wZXJ0aWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uYW5ub3RhdGlvblBhdGggPT09IGFubm90YXRpb25QYXRoKTtcblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQ6IGZ1bmN0aW9uIChcblx0XHRjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXSxcblx0XHRvdXRQYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwXG5cdCkge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdGhpcy5fZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QoY29uZGl0aW9uKSxcblx0XHRcdFx0b3V0VmFsdWVzID0gY29uZGl0aW9uUGF5bG9hZExpc3QubGVuZ3RoID09PSAxID8gY29uZGl0aW9uUGF5bG9hZExpc3RbMF0gOiB1bmRlZmluZWQ7XG5cblx0XHRcdGlmIChjb25kaXRpb25QYXlsb2FkTGlzdC5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiVmFsdWVIZWxwRGVsZWdhdGU6IFBhcmFtZXRlck91dCBpbiBtdWx0aS12YWx1ZS1maWVsZCBub3Qgc3VwcG9ydGVkXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG91dFZhbHVlcykge1xuXHRcdFx0XHR0aGlzLl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVXBkYXRlUHJvcGVydHkobWV0YU1vZGVsLCBvdXRWYWx1ZXMsIG91dFBhcmFtZXRlcnMsIGNvbnRleHQsIHZhbHVlSGVscCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdF9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVXBkYXRlUHJvcGVydHk6IGZ1bmN0aW9uIChcblx0XHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdG91dFZhbHVlczogQ29uZGl0aW9uUGF5bG9hZFR5cGUsXG5cdFx0b3V0UGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscFxuXHQpIHtcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHJvb3RQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKS5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cyA9IGNvbnRleHQuaXNUcmFuc2llbnQoKSAhPT0gdHJ1ZSAmJiAhY29udGV4dC5pc0luYWN0aXZlKCk7XG5cdFx0Y29uc3Qgb3V0UGFyYW1ldGVyU291cmNlczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG91dFBhcmFtZXRlciBvZiBvdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHQvKiBVcGRhdGVkIHByb3BlcnR5IHZpYSBvdXQtcGFyYW1ldGVyIGlmIHZhbHVlIGNoYW5nZWQgKi9cblx0XHRcdHRoaXMuX3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyKFxuXHRcdFx0XHRjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0cm9vdFBhdGgsXG5cdFx0XHRcdG91dFZhbHVlcyxcblx0XHRcdFx0b3V0UGFyYW1ldGVyLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzXG5cdFx0XHQpO1xuXHRcdFx0b3V0UGFyYW1ldGVyU291cmNlcy5wdXNoKG91dFBhcmFtZXRlci5zb3VyY2UpO1xuXHRcdH1cblx0XHRjb25zdCB2aWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyh2YWx1ZUhlbHApO1xuXHRcdGNvbnN0IGNvbGxhYm9yYXRpdmVEcmFmdCA9IHZpZXcuZ2V0Q29udHJvbGxlcigpLmNvbGxhYm9yYXRpdmVEcmFmdDtcblx0XHRpZiAoY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgJiYgb3V0UGFyYW1ldGVyU291cmNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyB3ZSBkZXRlcm1pbmUgdGhlIGJpbmRpbmcgdGhhdCBzZW5kcyB0aGUgcmVxdWVzdFxuXHRcdFx0bGV0IGJpbmRpbmc7XG5cdFx0XHRpZiAoY29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0YmluZGluZyA9IGNvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YmluZGluZyA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRCaW5kaW5nKCk7XG5cdFx0XHR9XG5cdFx0XHQvKiBUaGUgb3V0IHZhbHVlcyBoYXZlIGJlZW4gY2hhbmdlZCAtLT4gd2FpdCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIgYmVmb3JlIHNlbmRpbmcgYSBub3RpZmljYXRpb24gdG8gdGhlIG90aGVyIGNvbGxhYm9yYXRvcnNcblx0XHRcdFx0XHRcdFx0IFdlIGF0dGFjaCB0aGUgZXZlbnQgb24gdGhlIHJpZ2h0IGJpbmRpbmcgKi9cblx0XHRcdGJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRjb2xsYWJvcmF0aXZlRHJhZnQuc2VuZCh7XG5cdFx0XHRcdFx0YWN0aW9uOiBBY3Rpdml0eS5DaGFuZ2UsXG5cdFx0XHRcdFx0Y29udGVudDogb3V0UGFyYW1ldGVyU291cmNlcy5tYXAoKHNvdXJjZSkgPT4gY29udGV4dC5nZXRQYXRoKCkgKyBcIi9cIiArIHNvdXJjZSlcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoXG5cdFx0Y29udmVydGVkTWV0YWRhdGE6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdHJvb3RQYXRoOiBzdHJpbmcsXG5cdFx0b3V0VmFsdWVzOiBDb25kaXRpb25QYXlsb2FkVHlwZSxcblx0XHRvdXRQYXJhbWV0ZXI6IEluT3V0UGFyYW1ldGVyLFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHM6IGJvb2xlYW5cblx0KSB7XG5cdFx0LyogVXBkYXRlZCBwcm9wZXJ0eSB2aWEgb3V0LXBhcmFtZXRlciBpZiB2YWx1ZSBjaGFuZ2VkICovXG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gYCR7cm9vdFBhdGh9LyR7b3V0UGFyYW1ldGVyLnNvdXJjZX1gO1xuXHRcdGNvbnN0IHRhcmdldFByb3BlcnR5ID0gY29udmVydGVkTWV0YWRhdGEucmVzb2x2ZVBhdGg8UHJvcGVydHk+KHByb3BlcnR5UGF0aCkudGFyZ2V0O1xuXHRcdGNvbnN0IGZpZWxkQ29udHJvbCA9IHRhcmdldFByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWVsZENvbnRyb2w7XG5cdFx0Y29uc3QgZHluYW1pY1JlYWRPbmx5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZmllbGRDb250cm9sKSA/IGNvbnRleHQuZ2V0UHJvcGVydHkoZmllbGRDb250cm9sLnBhdGgpID09PSAxIDogZmFsc2U7XG5cdFx0aWYgKGR5bmFtaWNSZWFkT25seSAmJiBjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHQvKiBOb24tVHJhbnNpZW50IGFuZCBhY3RpdmUgY29udGV4dCAqL1xuXHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gb3V0UGFyYW1ldGVyLnNvdXJjZS5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0UGF0aCA9IGxhc3RJbmRleCA+IDAgPyBvdXRQYXJhbWV0ZXIuc291cmNlLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogb3V0UGFyYW1ldGVyLnNvdXJjZTtcblx0XHRcdC8qIFdlIHNlbmQgWzxwcm9wZXJ0eU5hbWU+XSBpbiBjYXNlIG9mIGEgcHJvcGVydHkgcGF0aCB3aXRob3V0IGFueSBuYXZpZ2F0aW9uIGludm9sdmVkICovXG5cdFx0XHQvKiBJbiBjYXNlIG9mIGEgcGF0aCBpbnZvbHZpbmcgbmF2aWdhdGlvbnMsIHdlIHNlbmQgWzxuYXZpZ2F0aW9uUGF0aD5dIGVuZGluZyB3aXRoIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBhbmQgbm90IHdpdGggYSBwcm9wZXJ0eSAqL1xuXHRcdFx0Y29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NpZGVFZmZlY3RQYXRoXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIFRoZSBmYXN0IGNyZWF0aW9uIHJvdyAodHJhbnNpZW50IGNvbnRleHQpIGNhbsK0dCBoYXZlIGluc3RhbnQgc3BlY2lmaWMgKGR5bmFtaWMpIHJlYWQtb25seSBmaWVsZHMsIHRoZXJlZm9yZSB3ZSBkb27CtHQgbmVlZCB0byBoYW5kbGUvY29uc2lkZXIgdGhpcyBjYXNlIHNwZWNpZmljYWxseSAqL1xuXHRcdFx0LyogQWRkaXRpb25hbCBpbmZvczogKi9cblx0XHRcdC8qIFRoZSBmYXN0IGNyZWF0aW9uIHJvdyBpcyBvbmx5IHVzZWQgYnkgU0QgKi9cblx0XHRcdC8qIFRoZSBncm91cCBJRCAodGhpcmQgYXJndW1lbnQgb2Ygc2V0UHJvcGVydHkgZGVzY3JpYmVkIGFwaSBkb2N1bWVudGF0aW9uIG9mIHRoZSBDb250ZXh0KSBpcyB1c2VkIGZvciB0aGUgUEFUQ0ggcmVxdWVzdCwgaWYgbm90IHNwZWNpZmllZCwgdGhlIHVwZGF0ZSBncm91cCBJRCBmb3IgdGhlIGNvbnRleHQncyBiaW5kaW5nIGlzIHVzZWQsICdudWxsJyB0byBwcmV2ZW50IHRoZSBQQVRDSCByZXF1ZXN0ICovXG5cdFx0XHQvKiBUaGUgVHJhbnNpZW50IGNvbnRleHQgY2Fubm90IHJlcXVlc3QgU2lkZUVmZmVjdHMgYW5kICBjYW5ub3QgcGF0Y2ggdmlhIGdyb3VwICdudWxsJyAqL1xuXHRcdFx0Y29uc3QgY3VycmVudFZhbCA9IGNvbnRleHQuZ2V0UHJvcGVydHkob3V0UGFyYW1ldGVyLnNvdXJjZSk7XG5cdFx0XHRjb25zdCBuZXdWYWwgPSBvdXRWYWx1ZXNbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXTtcblx0XHRcdGlmIChjdXJyZW50VmFsICE9PSBuZXdWYWwpIHtcblx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShvdXRQYXJhbWV0ZXIuc291cmNlLCBudWxsKTtcblx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShvdXRQYXJhbWV0ZXIuc291cmNlLCBvdXRWYWx1ZXNbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8qIElmIHRoZSBrZXkgZ2V0cyB1cGRhdGVkIHZpYSBvdXQtcGFyYW1ldGVyLCB0aGVuIHRoZSBkZXNjcmlwdGlvbiBuZWVkcyBhbHNvIHJldHJpZXZlZCB3aXRoIHJlcXVlc3RTaWRlRWZmZWN0cyAqL1xuXHRcdGNvbnN0IHRleHRQYXRoID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQpXG5cdFx0XHQ/IHRhcmdldFByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0LnBhdGhcblx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGlmICh0ZXh0UGF0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IHRleHRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RQYXRoID0gbGFzdEluZGV4ID4gMCA/IHRleHRQYXRoLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogdGV4dFBhdGg7XG5cdFx0XHQvKiBUaGUgc2lkZUVmZmVjdFBhdGggY2FuIGJlIFs8cHJvcGVydHlOYW1lPl0gb3IgWzxuYXZpZ2F0aW9uUGF0aD5dICovXG5cdFx0XHRjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdFBhdGhdKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIGEgbWFwIG9mIGNvbmRpdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczpcblx0ICogSW5pdGlhbCBzZXQgb2YgY29uZGl0aW9ucyBhcHBsaWVkIGV2ZXJ5IHRpbWUgdmFsdWUgaGVscCBjb250ZW50IGlzIHNob3duIGZvciB0aGUgZmlyc3QgdGltZSBzaW5jZSBvcGVuaW5nIGl0cyBjb250YWluZXIuXG5cdCAqIERldGFpbGVkIHNldCBvZiBjb25kaXRpb25zIGluIGdldEl0ZW1Gb3JWYWx1ZSBzY2VuYXJpb3MgdGhhdCBhbGxvdyB5b3UgdG8gZmluZCBhIHNwZWNpZmljIHZhbHVlIGhlbHAgaXRlbSAoaW5kaWNhdGVkIGJ5IGNvbmZpZyBhdmFpbGFiaWxpdHkpLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSBWYWx1ZUhlbHAgY29udHJvbCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0XG5cdCAqIEByZXR1cm5zIFJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byBhIG1hcCBvZiBjb25kaXRpb25zXG5cdCAqL1xuXHRnZXRGaWx0ZXJDb25kaXRpb25zOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IENvbnRlbnQsIGNvbmZpZz86IE1EQ0NvbmZpZ1R5cGUpIHtcblx0XHRpZiAodGhpcy5nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucykge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnModmFsdWVIZWxwLCBjb250ZW50LCAoY29uZmlnICYmIGNvbmZpZy5jb250cm9sKSB8fCAoY29udGVudCAmJiBjb250ZW50LmdldENvbnRyb2woKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4ge307XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxiYWNrIGludm9rZWQgZXZlcnkgdGltZSBhIHtAbGluayBzYXAudWkubWRjLlZhbHVlSGVscCBWYWx1ZUhlbHB9IGZpcmVzIGEgc2VsZWN0IGV2ZW50IG9yIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBjaGFuZ2VzXG5cdCAqIFRoaXMgY2FsbGJhY2sgbWF5IGJlIHVzZWQgdG8gdXBkYXRlIGV4dGVybmFsIGZpZWxkcy5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBWYWx1ZUhlbHAgY29udHJvbCBpbnN0YW5jZSByZWNlaXZpbmcgdGhlIDxjb2RlPmNvbnRyb2xDaGFuZ2U8L2NvZGU+XG5cdCAqIEBwYXJhbSByZWFzb24gUmVhc29uIHdoeSB0aGUgbWV0aG9kIHdhcyBpbnZva2VkXG5cdCAqIEBwYXJhbSBfY29uZmlnIEN1cnJlbnQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSB0aGUgY2FsbGluZyBjb250cm9sXG5cdCAqIEBzaW5jZSAxLjEwMS4wXG5cdCAqL1xuXHRvbkNvbmRpdGlvblByb3BhZ2F0aW9uOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIHJlYXNvbjogc3RyaW5nLCBfY29uZmlnOiB1bmtub3duKSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRpZiAocmVhc29uICE9PSBcIkNvbnRyb2xDaGFuZ2VcIiB8fCBwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHQvLyBoYW5kbGUgb25seSBDb250cm9sQ2hhbmdlIHJlYXNvblxuXHRcdFx0Ly8gYWxzbyBkb24ndCBoYW5kbGUgZm9yIGRlZmluZSBjb25kaXRpb24gdmFsdWUgaGVscCBhcyBwcm9wYWdhdGluZyBjb25kaXRpb25zIG9uIHRoZSB2YWx1ZSBoZWxwXG5cdFx0XHQvLyB0byBkZWZpbmUgY29uZGl0aW9ucyBkb2VzIG5vdCBtYWtlIHNlbnNlIGJ1dCB3b3VsZCBvbmx5IGNvbmZ1c2UgdXNlcnMgYnkgYWxsb3dpbmcgcmVjdXJzaXZlIHVzZVxuXHRcdFx0Ly8gb2YgdGhlIGNvbmRpdGlvbiB2YWx1ZSBoZWxwXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0Y29uc3Qgb3V0UGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0T3V0UGFyYW1ldGVycyhxdWFsaWZpZXIudmhQYXJhbWV0ZXJzKSA6IFtdLFxuXHRcdFx0ZmllbGQgPSB2YWx1ZUhlbHAuZ2V0Q29udHJvbCgpIGFzIEZpZWxkQmFzZSxcblx0XHRcdGZpZWxkUGFyZW50ID0gZmllbGQuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZSB8IENvbnRyb2w7XG5cblx0XHRsZXQgY29uZGl0aW9ucyA9IGZpZWxkLmdldENvbmRpdGlvbnMoKSBhcyBDb25kaXRpb25PYmplY3RbXTtcblx0XHRpZiAoIXBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdHRoaXMuX3NldEhpc3RvcnlEYXRhKHBheWxvYWQsIGNvbmRpdGlvbnMsIGZpZWxkKTtcblx0XHR9XG5cdFx0Y29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSAoY29uZGl0aW9uLnBheWxvYWQgfHwge30pIGFzIENvbmRpdGlvblBheWxvYWRNYXA7XG5cdFx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZE1hcFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0fSk7XG5cblx0XHRjb25zdCBsaXN0UmVwb3J0RmlsdGVyQmFyID0gZmllbGQuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZSB8IENvbnRyb2w7IC8vIENvbnRyb2wgZS5nLiBGb3JtQ29udGFpbmVyXG5cdFx0aWYgKGxpc3RSZXBvcnRGaWx0ZXJCYXIuaXNBKEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyKSAmJiBvdXRQYXJhbWV0ZXJzLmxlbmd0aCAmJiBjb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Ly8gUHJvcGFnYXRlIHRoZSB2YWx1ZSBvbmx5IGlmIHRoZSBGaWx0ZXJGaWVsZCBpcyBwYXJ0IG9mIHRoZSBMUi1GaWx0ZXJCYXIgYWxzbyBpbnNpZGUgaW4gQWRhcHQgRmlsdGVycyBkaWFsb2dcblx0XHRcdGF3YWl0IHRoaXMuX29uQ29uZGl0aW9uUHJvcGFnYXRpb25Ub0ZpbHRlckJhcihcblx0XHRcdFx0Y29uZGl0aW9ucyxcblx0XHRcdFx0b3V0UGFyYW1ldGVycyxcblx0XHRcdFx0ZmllbGRQYXJlbnQgYXMgRmlsdGVyQmFyLFxuXHRcdFx0XHRwYXlsb2FkLFxuXHRcdFx0XHRsaXN0UmVwb3J0RmlsdGVyQmFyIGFzIEZpbHRlckJhclxuXHRcdFx0KTtcblx0XHRcdC8vIExSIFNldHRpbmdzIERpYWxvZyBvciBPUCBTZXR0aW5ncyBEaWFsb2cgc2hhbGwgbm90IHByb3BhZ2F0ZSB2YWx1ZSB0byB0aGUgZGlhbG9nIGZpbHRlcmZpZWxkcyBvciBjb250ZXh0XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE9iamVjdCBQYWdlXG5cdFx0XHQvKiBUbyBhdm9pZCB0aW1pbmcgaXNzdWUgd2UgdXNlIHRoZSBCaW5kaW5nQ29udGV4dCBvZiB0aGUgY29udHJvbCBpbnN0ZWFkIG9mIHRoZSBWYWx1ZUhlbHAgKEJDUCAyMzgwMDU3MjI3KSAqL1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IGZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSAoZmllbGQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IG1ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3BheWxvYWQucHJvcGVydHlQYXRofUBzYXB1aS5uYW1lYCk7XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvbiA9IGNvbmRpdGlvbnMubGVuZ3RoID4gMCA/IGNvbmRpdGlvbnNbMF0gOiAoe30gYXMgQ29uZGl0aW9uT2JqZWN0KTtcblx0XHRcdFx0Y29uc3QgcGF5bG9hZEtleXMgPSBjb25kaXRpb24/LnBheWxvYWQgPyBPYmplY3Qua2V5cyhjb25kaXRpb24ucGF5bG9hZCkgOiBbXTtcblx0XHRcdFx0cGF5bG9hZEtleXMuZm9yRWFjaCgocGF5bG9hZEtleSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSBjb25kaXRpb24ucGF5bG9hZCBhcyBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWQgPSBjb25kaXRpb25QYXlsb2FkTWFwPy5bcGF5bG9hZEtleV0/LlswXSB8fCB7fTtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25WYWx1ZWtleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb25QYXlsb2FkKTtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25WYWx1ZWtleSA9IGNvbmRpdGlvblZhbHVla2V5cy5maW5kKCh2YWx1ZUtleSkgPT4gdmFsdWVLZXkuaW5jbHVkZXMoXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIikpO1xuXHRcdFx0XHRcdGlmIChjb25kaXRpb25WYWx1ZWtleSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qga2V5VmFsdWUgPSBjb25kaXRpb25QYXlsb2FkW2NvbmRpdGlvblZhbHVla2V5XTtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBrZXlWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5fb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQoY29uZGl0aW9ucywgb3V0UGFyYW1ldGVycywgY29udGV4dCwgdmFsdWVIZWxwKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gaW5pdGlhbCBmaWx0ZXIgY29uZGl0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBpbml0aWFsIHZhbHVlIGlzIHNpZ25pZmljYW50LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgZmlsdGVyIGNvbmRpdGlvbi5cblx0ICogQHBhcmFtIGluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQgRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBpbml0aWFsIHZhbHVlIGlzIHNpZ25pZmljYW50LlxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbi5cblx0ICovXG5cdF9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uOiBmdW5jdGlvbiAodmFsdWU6IFZhbHVlLCBpbml0aWFsVmFsdWVJc1NpZ25pZmljYW50OiBib29sZWFuKSB7XG5cdFx0bGV0IGNvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdExvZy5lcnJvcihcIlZhbHVlSGVscERlbGVnYXRlOiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIHJlcXVlc3RlZFwiKTtcblx0XHR9IGVsc2UgaWYgKCh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gbnVsbCkgJiYgaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCkge1xuXHRcdFx0Y29uZGl0aW9uID0gQ29uZGl0aW9uLmNyZWF0ZUNvbmRpdGlvbihcIkVtcHR5XCIsIFtdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IFwiXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdGNvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXCJFUVwiLCBbdmFsdWVdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbmRpdGlvbjtcblx0fSxcblxuXHRfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZzogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFiaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IE5vIEJpbmRpbmdDb250ZXh0XCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udHJvbC5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCByb290UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChiaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdGxldCBwcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gaW5QYXJhbWV0ZXJzLm1hcCgoaW5QYXJhbWV0ZXIpID0+IGluUGFyYW1ldGVyLnNvdXJjZSk7XG5cdFx0LyogSW4gY2FzZSBvZiBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZywgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdGggXCIkUGFyYW1ldGVyXCIsIHRoZSBiaW5kaW5nIGNvbnRleHQgaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBpbi1wYXJhbWV0ZXJzLiAqL1xuXHRcdC8qIFdlIG5lZWQgdG8gcmVxdWVzdCB0aGUgaW4tcGFyYW1ldGVyIHZhbHVlcyByZWxhdGl2ZSB0byB0aGUgYmluZGluZyBjb250ZXh0LlxuSW4gc29tZSBjYXNlcyAoZS5nLiBtdWx0aSB2YWx1ZSBmaWVsZCksIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3QgcG9pbnQgdG8gdGhlXG5WSCBhbm5vdGF0aW9uIHRhcmdldCwgdGh1cyB3ZSBpZGVudGlmeSB0aGUgbmVlZGVkIG5hdmlnYXRpb24gcmVsYXRpb24gYnlcbnJlZHVjaW5nIHRoZSBwYXlsb2FkLnByb3BlcnR5UGF0aCBieSB0aGUgcGF0aCBkZXJpdmVkIGZyb20gYmluZGluZyBjb250ZXh0LlxuVGhpcyBjYW5ub3QgaGFwcGVuIGluIGNhc2Ugb2YgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2csIHdoaWNoIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXRoIFwiJFBhcmFtZXRlclwiLlxuKi9cblxuXHRcdC8vIENoZWNrIHdoZXRoZXIgdGhlIGZpbHRlciBwcm9wZXJ0eSB3aXRoIG5hdmlnYXRpb24gcGF0aCBleGlzdHMsIG90aGVyd2lzZSB0aGUgbWV0YWRhdGEgYXJlIG5vdCB3ZWxsIGRlZmluZWRcblx0XHRsZXQgbWV0YURhdGFFcnJvciA9IGZhbHNlO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IHBheWxvYWQucHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKTtcblx0XHRsZXQgbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHRsZXQgbmF2aWdhdGlvblByb3BlcnR5O1xuXG5cdFx0Ly9Gb3IgYSBWSCBvbiBhbiBhY3Rpb24gZGlhbG9nIHBhcmFtZXRlciB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgZmlsbCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoXG5cdFx0Ly93aXRoIHRoZSBhY3Rpb24gZXZlbiB0aG91Z2ggbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBleGlzdHMgLT4gbGVhdmUgbmF2aWdhdGlvblByb3BlcnR5UGF0aCBlbXB0eVxuXHRcdGlmIChiaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0UGF0aCgpICE9PSBcIiRQYXJhbWV0ZXJcIikge1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IHBheWxvYWQucHJvcGVydHlQYXRoLnJlcGxhY2UoYC8ke3Byb3BlcnR5TmFtZX1gLCBcIlwiKTtcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QobmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikgJiYgbmF2aWdhdGlvblByb3BlcnR5ICYmIG5hdmlnYXRpb25Qcm9wZXJ0eS4kUGFydG5lciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvL0Nhc2UgbWRjLk11bHRpVmFsdWVGaWVsZDogdGhlICRQYXJ0bmVyIChhc3NvY2lhdGlvbiB0byBvbmUpIGlzIGEgcHJlY29uZGl0aW9uIHRvIHJlcXVlc3QgdGhlIGZpbHRlciB2YWx1ZVxuXHRcdFx0Ly9FeGNlcHRpb246IFdoZW4gdGhlIE11bHRpVmFsdWVGaWVsZCBpcyBhbiBhY3Rpb24gcGFyYW1ldGVyIHRoZW4gdGhlIGNvbnRleHQgb2YgdGhlIGFjdGlvbiBpcyB1c2VkIHRvIGZpbGwgdGhlIGluIHBhcmFtZXRlciBhbmRcblx0XHRcdC8vbm8gJFBhcnRuZXIgYXNzb2NpYXRpb24gaXMgbmVlZGVkLiBGb3Igc3VjaCBjYXNlcyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGlzIG5vIGZpbGxlZFxuXHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRgVmFsdWVIZWxwRGVsZWdhdGU6IEJlY2F1c2Ugb2YgbWlzc2luZyBwYXJ0bmVyIGRlZmluaXRpb24sIHRoZSBmaWx0ZXIgdmFsdWUgZm9yIFZhbHVlTGlzdFBhcmFtZXRlckluIHByb3BlcnR5IGNhbiBub3QgcmVxdWVzdGVkLmBcblx0XHRcdCk7XG5cdFx0XHRtZXRhRGF0YUVycm9yID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eSAmJiBuYXZpZ2F0aW9uUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgbmF2aWdhdGlvblByb3BlcnR5LiRQYXJ0bmVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHByb3BlcnRpZXNUb1JlcXVlc3QgPSB0aGlzLl9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3QocHJvcGVydGllc1RvUmVxdWVzdCwgcm9vdFBhdGgsIG1ldGFNb2RlbCwgcGF5bG9hZC5wcm9wZXJ0eVBhdGgpO1xuXHRcdH1cblx0XHRpZiAoIW1ldGFEYXRhRXJyb3IpIHtcblx0XHRcdC8vIFVwZGF0ZUdyb3VwSWQgaXMgJGF1dG8gaXMgdXNlZCBpbiBjYXNlIG9mIGNyZWF0aW9uIHJvdy5cblx0XHRcdC8vIFVwZGF0ZUdyb3VwSWQgaXMgc3VibWl0TGF0ZXIgaW4gY2FzZSBvZiBjcmVhdGUgZGlhbG9nLlxuXHRcdFx0Ly8gV2UgbmVlZCB0byBjb25zaWRlciB0aGUgY2FzZSBvZiBpc0luYWN0aXZlIGNvbnRleHQsIHdoaWNoIGlzIG5vdCB5ZXQgY3JlYXRlZC5cblx0XHRcdGNvbnN0IGNvbnRleHRVbmRlckNyZWF0aW9uID1cblx0XHRcdFx0YmluZGluZ0NvbnRleHQuaXNUcmFuc2llbnQoKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHQhYmluZGluZ0NvbnRleHQuaXNJbmFjdGl2ZSgpICYmXG5cdFx0XHRcdGJpbmRpbmdDb250ZXh0LmdldFVwZGF0ZUdyb3VwSWQoKT8uc3RhcnRzV2l0aChcIiRhdXRvXCIpO1xuXHRcdFx0bGV0IGVycm9yTWVzc2FnZXNJbkNvbnRleHQgPSBbXTtcblx0XHRcdGVycm9yTWVzc2FnZXNJbkNvbnRleHQgPSAoYmluZGluZ0NvbnRleHQuZ2V0TWVzc2FnZXMoKSA/PyBbXSkuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdFx0XHR9KTtcblx0XHRcdC8vIFdlIGF3YWl0IGNyZWF0aW9uIGlmIGl0IGlzIHN0aWxsIGluIHByb2Nlc3MuXG5cdFx0XHRpZiAoY29udGV4dFVuZGVyQ3JlYXRpb24gJiYgIWVycm9yTWVzc2FnZXNJbkNvbnRleHQ/Lmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCBiaW5kaW5nQ29udGV4dD8uY3JlYXRlZCgpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQWNjb3JkaW5nIHRvIG9kYXRhIHY0IGFwaSBkb2N1bWVudGF0aW9uIGZvciByZXF1ZXN0UHJvcGVydHk6IFByb3BlcnR5IHZhbHVlcyB0aGF0IGFyZSBub3QgY2FjaGVkIHlldCBhcmUgcmVxdWVzdGVkIGZyb20gdGhlIGJhY2sgZW5kXG5cdFx0XHRjb25zdCB2YWx1ZXMgPSBhd2FpdCBiaW5kaW5nQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkocHJvcGVydGllc1RvUmVxdWVzdCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGluUGFyYW1ldGVyID0gaW5QYXJhbWV0ZXJzW2ldO1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKHZhbHVlc1tpXSwgaW5QYXJhbWV0ZXIuaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCk7XG5cblx0XHRcdFx0aWYgKGNvbmRpdGlvbikge1xuXHRcdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdF9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3Q6IGZ1bmN0aW9uIChwcm9wZXJ0aWVzVG9SZXF1ZXN0OiBzdHJpbmdbXSwgcm9vdFBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHQvKlxuXHRcdFx0XHRUaGUgaW5QYXJhbWV0ZXJzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUgdmFsdWUgaGVscCBkZWZpbml0aW9uLCBpLmUuIHRoZWlyIHNvdXJjZSBpcyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGFubm90YXRpb24gdGFyZ2V0IChvciBtb3JlIHByZWNpc2VseSB0aGUgRW50aXR5U2V0IHRoZSBhbm5vdGF0aW9uIHRhcmdldCBiZWxvbmdzIHRvKS4gVGhlIGFubm90YXRpb24gdGFyZ2V0IGlzIHRoZSBwcm9wZXJ0eSB0aGUgdmFsdWUgaGVscCBpcyBkZWZpbmVkIGZvci5cblx0XHRcdFx0VG8gcmVxdWVzdCB0aGUgdmFsdWVzIGZvciB0aGUgaW5QYXJhbWV0ZXJzIGZyb20gdGhlIGJpbmRpbmdDb250ZXh0ICh0aGUgY29udHJvbCBpcyBib3VuZCB0byksIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoaXMgdG8gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBiaW5kaW5nQ29udGV4dC4gVGhpcyBkaWZmZXJzLCBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQgZm9yIGEgZGlyZWN0IHByb3BlcnR5LCBidXQgd2l0aCBhIHBhdGggY29udGFpbmluZyBvbmUgb3IgbW9yZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgKGVzcC4gbmVjZXNzYXJ5IHRvIGRlZmluZSBtdWx0aSB2YWx1ZSBmaWVsZHMpLlxuXHRcdFx0XHRUbyBtYWtlIHRoaXMgdHJhbnNsYXRpb24gcG9zc2libGUsIHRoZSBwYXlsb2FkIHByb3ZpZGVzIHRoZSBwcm9wZXJ0eVBhdGgsIHdoaWNoIGlzIGFuIGFic29sdXRlIG1ldGFQYXRoIHRvIHRoZSBwcm9wZXJ0eSAoaS5lLiBpbmNsdWRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgYW5kIHRoZSBhZGRpdGlvbmFsIHBhdGggdGhlIHByb3BlcnR5IGlzIGJvdW5kIHRvKS5cblxuXHRcdFx0XHRTbyBmYXIsIHRoaXMgbWVhbnMgd2UgaGF2ZSB0byByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggb2YgdGhlIGJpbmRpbmdDb250ZXh0IGZyb20gdGhlIGxlZnQgc2lkZSwgYW5kIHRoZSBsYXN0IHNlZ21lbnQgKHRoZSBwcm9wZXJ0eSBpdHNlbGYpIGZyb20gdGhlIHRoZSByaWdodCBzaWRlIG9mIHRoZSBwcm9wZXJ0eVBhdGggcHJvdmlkZWQgaW4gdGhlIHBheWxvYWQsIHRvIGdldCBhIG1ldGFQYXRoIGZyb20gdGhlIGJpbmRpbmcgY29udGV4dCB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQuXG5cdFx0XHRcdElmIHRoaXMgbWV0YVBhdGggY29udGFpbnMgMTpuLW5hdmlnYXRpb25zICh3aGljaCBjYW5ub3QgYmUgdHJhbnNsYXRlZCBiYWNrIHRvIGEgcGF0aCwgYXMgdGhpcyB3b3VsZCBtZWFuIHRvIGFkZCBjb3JyZXNwb25kaW5nIGtleXMsIHdoaWNoIGFyZSBub3Qga25vd24pLCB0aGUgc291cmNlIHBhdGggaW4gdGhlIGluUGFyYW1ldGVyIGRlZmluaXRpb24gb2YgdGhlIHZhbHVlIG5lZWRzIHRvIHBvaW50IGJhY2sgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcGFydG5lciBuYXZpZ2F0aW9uKHMpIHRvIGF2b2lkIGFtYmlndW91cyBkZWZpbml0aW9uIG9mIGhvdyB0byBnZXQgaXRzIHZhbHVlLlxuXHRcdFx0XHRUaHVzLCB3ZSBjYW4gYW5kIG5lZWQgdG8gbWF0Y2ggYW5kIHJlZHVjZSB0aGUgcGFydHMgb2YgdGhpcyByZWxhdGl2ZSBtZXRhUGF0aCBmcm9tIHRoZSByaWdodCBzaWRlIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgcGFydHMgb2YgdGhlIGluUGFyYW1ldGVycyBzb3VyY2UgZGVmaW5pdGlvbiBmcm9tIHRoZSBsZWZ0IHNpZGUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGV5IGFyZSBjb3JyZXNwb25kaW5nIHBhcnRuZXIgbmF2aWdhdGlvbnMuIFdoZW4gd2UgYXJlIGRvbmUgKG5vIG1vcmUgcGFydHMgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCwgbm8gbW9yZSBwYXJ0cyBpbiByZWR1Y2VkIGluUGFyYW1ldGVyIHNvdXJjZSBwYXRoLCBvciBtb3N0IHJpZ2h0IHBhcnQgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCBpcyBub3QgdGhlIHBhcnRuZXIgb2YgbW9zdCBsZWZ0IHBhcnQgaW4gcmVkdWNlZCBpblBhcmFtZXRlciBzb3VyY2UpLCBuZWl0aGVyIHJlZHVjZWQgcmVsYXRpdmUgbWV0YVBhdGggbm9yIHJlZHVjZWQgaW5QYXJhbWV0ZXIgc291cmNlIHBhdGggbWF5IGNvbnRhaW4gYW55IDE6bi1uYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG5cdFx0XHRcdElmIHRoaXMgY29uZGl0aW9uIGlzIGZ1bGZpbGxlZCwgd2UgY2FuIGNvbWJpbmUgdGhlIGFuZCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIGJpbmRpbmcgY29udGV4dC4gSWYgbm90LCB0aGUgdmFsdWUgaGVscCBkZWZpbml0aW9uIGRvZXMgbm90IGFsbG93IHRvIHJldHJpZXZlIHRoZSBpblBhcmFtZXRlcnMgdmFsdWUgaW4gYW4gdW5hbWJpZ3VvdXMgd2F5LCBpLnQuIHRoZSB2YWx1ZSBoZWxwIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseS5cblx0XHRcdFx0Ki9cblx0XHQvLyBjb21tb24gZm9yIGFsbCBpblBhcmFtZXRlcnNcblx0XHRsZXQgbWV0YU1vZGVsQ29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChyb290UGF0aCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0Y29uc3QgcmVsYXRpdmVQYXRoUGFydHMgPSBwcm9wZXJ0eVBhdGhcblx0XHRcdC5zbGljZShyb290UGF0aC5sZW5ndGgpIC8vIHJlbW92ZSByb290IHBhdGhcblx0XHRcdC5zcGxpdChcIi9cIikgLy8gdHJhbnNmb3JtIHRvIGFycmF5XG5cdFx0XHQuc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBmaXJzdCAoZW1wdHksIGFzIHJvb3RQYXRoIHByb3ZpZGVkIHdpdGhvdXQgZW5kaW5nIFwiL1wiKSwgYW5kIGxhc3QgKHByb3BlcnR5IHRoZSBWSCBpcyBhdHRhY2hlZCB0bykgcGFydFxuXHRcdFx0Lm1hcCgocGFydCkgPT4ge1xuXHRcdFx0XHQvLyBkZXRlcm1pbmUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIGFuZCBjb3JyZXNwb25kaW5nIHBhcnRuZXIgZm9yIGVhY2ggbmF2aWdhdGlvbiBzdGVwXG5cdFx0XHRcdG1ldGFNb2RlbENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocGFydCwgbWV0YU1vZGVsQ29udGV4dCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0cGFydDogcGFydCxcblx0XHRcdFx0XHRwYXJ0bmVyOiBtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLiRQYXJ0bmVyXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHQvLyBhY3R1YWwgcmVkdWN0aW9uIHBlciBpblBhcmFtZXRlclxuXHRcdHJldHVybiBwcm9wZXJ0aWVzVG9SZXF1ZXN0Lm1hcCgobG9jYWxEYXRhUGF0aCkgPT4ge1xuXHRcdFx0Y29uc3QgbG9jYWxEYXRhUGFydHMgPSBsb2NhbERhdGFQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IG1hdGNoQ291bnQgPSBsb2NhbERhdGFQYXJ0cy5maW5kSW5kZXgoXG5cdFx0XHRcdChcblx0XHRcdFx0XHRwYXJ0LFxuXHRcdFx0XHRcdGluZGV4IC8vIGZpbmQgZmlyc3Qgbm9uLW1hdGNoaW5nIGluZGV4XG5cdFx0XHRcdCkgPT4gcmVsYXRpdmVQYXRoUGFydHNbLWluZGV4XT8ucGFydG5lciAhPT0gcGFydFxuXHRcdFx0KTsgLy8gcmVsYXRpdmVQYXRoUGFydHMgdG8gbWF0Y2ggZnJvbSB0aGUgZW5kICg9PiBcIi1pbmRleFwiKSB0byBsb2NhbERhdGFQYXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmdcblx0XHRcdC8vIGxhc3QgcGFydCBvZiBsb2NhbERhdGEgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aHVzIGl0IGNhbm5vdCBtYXRjaC4gT3RoZXJ3aXNlIG1hdGNoQ291bnQgY291bGQgYmUgLTEgaWYgZXZlcnl0aGluZyBtYXRjaGVzXG5cdFx0XHQvLyAoaWYgd2Ugd2FudCB0byBhZGRpdGlvbmFsbHkgc2VjdXJlIGFnYWluc3QgdGhpcyBzaXR1YXRpb24sIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHdvdWxkIGJlIHRvIHNldCBtYXRjaENvdW50ID0gbG9jYWxEYXRhUGFydHMubGVuZ3RoIOKAkyAxKVxuXHRcdFx0cmV0dXJuIHJlbGF0aXZlUGF0aFBhcnRzXG5cdFx0XHRcdC5zbGljZSgwLCAtbWF0Y2hDb3VudCkgLy8gcmVtb3ZlIGFsbCBtYXRjaGVkIHBhcnRzIChmcm9tIHRoZSBlbmQpXG5cdFx0XHRcdC5tYXAoKHBhcnQpID0+IHBhcnQucGFydClcblx0XHRcdFx0LmNvbmNhdChsb2NhbERhdGFQYXJ0cy5zbGljZShtYXRjaENvdW50KSkgLy8gcmVtb3ZlIHRoZSBtYXRjaGVkIHBhcnRzIGZyb20gbG9jYWxEYXRhIChmcm9tIHRoZSBiZWdpbm5pbmcpXG5cdFx0XHRcdC5qb2luKFwiL1wiKTsgLy8gdHJhbnNmZXIgYmFjayB0byBzdHJpbmcgKGJ1dCBvbmx5IG9uY2UgYXQgdGhlIGVuZCA7KSApXG5cdFx0fSk7XG5cdH0sXG5cblx0X2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUZpbHRlckJhcjogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gY29udHJvbC5nZXRQYXJlbnQoKSBhcyBGaWx0ZXJCYXJCYXNlO1xuXHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnRpZXMgPSBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJQcm9wZXJ0eUluZm8oZmlsdGVyQmFyIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wpO1xuXHRcdGNvbnN0IHN0YXRlOiBFeHRlcm5hbFN0YXRlVHlwZSA9IGF3YWl0IFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSAoZmlsdGVyQmFyLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Zm9yIChjb25zdCBpblBhcmFtZXRlciBvZiBpblBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gdGhpcy5fZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aChcblx0XHRcdFx0aW5QYXJhbWV0ZXIsXG5cdFx0XHRcdHBheWxvYWQucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRtZXRhTW9kZWwsXG5cdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlckJhclByb3BlcnR5ID8gZmlsdGVyQmFyUHJvcGVydHkuY29uZGl0aW9uUGF0aCA6IGluUGFyYW1ldGVyLnNvdXJjZS5zcGxpdChcImNvbmRpdGlvbnMvXCIpLnBvcCgpO1xuXG5cdFx0XHRjb25zdCBjb25kaXRpb25zID0gdGhpcy5fZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcihzb3VyY2VGaWVsZCBhcyBzdHJpbmcsIHN0YXRlKTtcblx0XHRcdGlmIChjb25kaXRpb25zKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBjb25kaXRpb25zO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgY29uZGl0aW9ucy5cblx0ICogUmVnYXJkaW5nIGEgbmF2aWdhdGlvbiBwYXRoIGluIHRoZSBJbk91dCBwYXJhbWV0ZXJzIGFuZCBkaXNyZWdhcmRpbmcgcHJlZml4ZXMgaW4gdGhlIG5hdmlnYXRpb24gcGF0aCBsaWtlIGUuZy4gJyRmaWx0ZXJzPi9jb25kaXRpb25zLycgb3IgJ293bmVyJy5cblx0ICogQHBhcmFtIHNvdXJjZUZpZWxkIEluUGFyYW1ldGVyIHByb3BlcnR5IG9mIHRoZSBmaWx0ZXIgZmllbGQgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc3RhdGUgVGhlIGV4dGVybmFsIGZpbHRlciBzdGF0ZVxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbnNcblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdF9nZXRDb25kaXRpb25zRnJvbUluUGFyYW1ldGVyOiBmdW5jdGlvbiAoc291cmNlRmllbGQ6IHN0cmluZywgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlKSB7XG5cdFx0Y29uc3Qga2V5ID0gT2JqZWN0LmtleXMoc3RhdGUuZmlsdGVyKS5maW5kKChrZXkpID0+IGtleSA9PT0gc291cmNlRmllbGQpOyAvLyBjb25kaXRpb24gcGF0aCBvZiB0aGUgZmlsdGVyIGZpZWxkXG5cdFx0cmV0dXJuIGtleSAmJiBzdGF0ZS5maWx0ZXJba2V5XTtcblx0fSxcblxuXHRfcGFydGl0aW9uSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoaW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdKSB7XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXA6IFJlY29yZDxzdHJpbmcsIEluT3V0UGFyYW1ldGVyW10+ID0ge1xuXHRcdFx0Y29uc3RhbnQ6IFtdLFxuXHRcdFx0YmluZGluZzogW10sXG5cdFx0XHRmaWx0ZXI6IFtdXG5cdFx0fTtcblxuXHRcdGZvciAoY29uc3QgaW5QYXJhbWV0ZXIgb2YgaW5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRpZiAoaW5QYXJhbWV0ZXIuY29uc3RhbnRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyTWFwLmNvbnN0YW50LnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fSBlbHNlIGlmIChpblBhcmFtZXRlci5zb3VyY2UuaW5kZXhPZihcIiRmaWx0ZXJcIikgPT09IDApIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuZmlsdGVyLnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuYmluZGluZy5wdXNoKGluUGFyYW1ldGVyKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGluUGFyYW1ldGVyTWFwO1xuXHR9LFxuXG5cdF90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGU6IHtcblx0XHRvbkFmdGVyUmVuZGVyaW5nOiBmdW5jdGlvbiAoZXZlbnQ6IGpRdWVyeS5FdmVudCAmIHsgc3JjQ29udHJvbDogQ29udHJvbCB9KSB7XG5cdFx0XHRjb25zdCB0YWJsZSA9IGV2ZW50LnNyY0NvbnRyb2wsIC8vIG0uVGFibGVcblx0XHRcdFx0dGFibGVDZWxsc0RvbVJlZnMgPSB0YWJsZS4kKCkuZmluZChcInRib2R5IC5zYXBNVGV4dFwiKSxcblx0XHRcdFx0bWRjTVRhYmxlID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgTVRhYmxlO1xuXG5cdFx0XHRoaWdobGlnaHRET01FbGVtZW50cyh0YWJsZUNlbGxzRG9tUmVmcywgbWRjTVRhYmxlLmdldEZpbHRlclZhbHVlKCksIHRydWUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgYW4gaW5pdGlhbCBjb25kaXRpb24gY29uZmlndXJhdGlvbiBldmVyeXRpbWUgYSB2YWx1ZSBoZWxwIGNvbnRlbnQgaXMgc2hvd24uXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgcmVxdWVzdGluZyBjb25kaXRpb25zIGNvbmZpZ3VyYXRpb25cblx0ICogQHBhcmFtIGNvbnRyb2wgSW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgY29udHJvbFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIGEgbWFwIG9mIGNvbmRpdGlvbnMgc3VpdGFibGUgZm9yIGEgc2FwLnVpLm1kYy5GaWx0ZXJCYXIgY29udHJvbFxuXHQgKiBAc2luY2UgMS4xMDEuMFxuXHQgKi9cblx0Z2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnM6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogQ29udGVudCwgY29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZCkge1xuXHRcdC8vIGhpZ2hsaWdodCB0ZXh0IGluIFZhbHVlSGVscCBwb3BvdmVyXG5cdFx0aWYgKGNvbnRlbnQ/LmlzQTxNVGFibGU+KFwic2FwLnVpLm1kYy52YWx1ZWhlbHAuY29udGVudC5NVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IHBvcG92ZXJUYWJsZSA9IGNvbnRlbnQuZ2V0VGFibGUoKTtcblx0XHRcdHBvcG92ZXJUYWJsZT8ucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUpO1xuXHRcdFx0cG9wb3ZlclRhYmxlPy5hZGRFdmVudERlbGVnYXRlKHRoaXMuX3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZSwgdGhpcyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRjb25zdCBpbkNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdE1hcCA9IHt9O1xuXG5cdFx0Ly8gRm9yIGRlZmluZSBjb25kaXRpb25zIHZhbHVlaGVscCBpbml0aWFsIGZpbHRlciBjb25kaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHRoZSBjb250cm9sIG9mIHRoZSBkZWZpbmUgY29uZGl0aW9uc1xuXHRcdC8vIGlzIGNsb25lZCBhbmQgbm90IHRoZSBvcmlnaW5hbCBvbmUgdG8gd2hpY2ggZmllbGQgdmFsdWVoZWxwIHdhcyBhdHRhY2hlZC4gQW5kIGFzIGEgcmVzdWx0IHdlIGNhbm5vdCBnZXQgaW4gcGFyYW1ldGVyIHZhbHVlLiBGb3Igc2ltcGxpY2l0eVxuXHRcdC8vIHdlIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUgY29kZSByZWxhdGVkIHRvIGZpbHRlciBjb25kaXRpb25zLlxuXHRcdGlmIChwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHRcdH1cblxuXHRcdGlmICghY29udHJvbCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IENvbnRyb2wgdW5kZWZpbmVkXCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0SW5QYXJhbWV0ZXJzKHF1YWxpZmllci52aFBhcmFtZXRlcnMpIDogW107XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXAgPSB0aGlzLl9wYXJ0aXRpb25JblBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBpc09iamVjdFBhZ2UgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVyTWFwLmNvbnN0YW50KSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKFxuXHRcdFx0XHRpblBhcmFtZXRlci5jb25zdGFudFZhbHVlLFxuXHRcdFx0XHRpc09iamVjdFBhZ2UgPyBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVJc1NpZ25pZmljYW50IDogZmFsc2UgLy8gbm8gZmlsdGVyIHdpdGggXCJlbXB0eVwiIG9uIExpc3RSZXBvcnRcblx0XHRcdCk7XG5cdFx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuYmluZGluZy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUJpbmRpbmcoaW5Db25kaXRpb25zLCBjb250cm9sLCBpblBhcmFtZXRlck1hcC5iaW5kaW5nLCBwYXlsb2FkKTtcblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLmxlbmd0aCkge1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyKGluQ29uZGl0aW9ucywgY29udHJvbCwgaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLCBwYXlsb2FkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGNvbnZleSBjdXN0b20gZGF0YSBpbiBjb25kaXRpb25zLlxuXHQgKiBUaGlzIGVuYWJsZXMgYW4gYXBwbGljYXRpb24gdG8gZW5oYW5jZSBjb25kaXRpb25zIHdpdGggZGF0YSByZWxldmFudCBmb3IgY29tYmluZWQga2V5IG9yIG91dHBhcmFtZXRlciBzY2VuYXJpb3MuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIF92YWx1ZXMgRGVzY3JpcHRpb24gcGFpciBmb3IgdGhlIGNvbmRpdGlvbiB3aGljaCBpcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIGFkZGl0aW9uYWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPcHRpb25hbGx5IHJldHVybnMgYSBzZXJpYWxpemFibGUgb2JqZWN0IHRvIGJlIHN0b3JlZCBpbiB0aGUgY29uZGl0aW9uIHBheWxvYWQgZmllbGRcblx0ICogQHNpbmNlIDEuMTAxLjBcblx0ICovXG5cdGNyZWF0ZUNvbmRpdGlvblBheWxvYWQ6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRjb250ZW50OiBDb250ZW50LFxuXHRcdF92YWx1ZXM6IHVua25vd25bXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dFxuXHQpOiBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0sXG5cdFx0XHRlbnRyeTogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAgPSB7fTtcblx0XHRjb25zdCBjb250cm9sID0gY29udGVudC5nZXRDb250cm9sKCk7XG5cdFx0Y29uc3QgaXNNdWx0aVZhbHVlRmllbGQgPSBjb250cm9sPy5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblxuXHRcdC8qIEVYVEVSTkFMSUQ6IHdlIGFkZCB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlckZpZWxkIHRvIHRoZSBjb25kaXRpb25QYXlsb2FkICovXG5cdFx0aWYgKHBheWxvYWQuZXh0ZXJuYWxJZFBhdGggJiYgcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoKSB7XG5cdFx0XHRjb25zdCB2aEtleVByb3BlcnR5ID0gcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoO1xuXHRcdFx0Y29uc3QgdmhLZXlWYWx1ZSA9IHF1YWxpZmllci52aEtleXMgJiYgY29udGV4dC5nZXRPYmplY3QocXVhbGlmaWVyLnZoS2V5c1swXSB8fCB2aEtleVByb3BlcnR5KTtcblx0XHRcdGVudHJ5W3BheWxvYWQucHJvcGVydHlQYXRoICsgXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIl0gPSB2aEtleVZhbHVlO1xuXHRcdFx0Y29uZGl0aW9uUGF5bG9hZFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0gPSBbZW50cnldO1xuXHRcdH0gZWxzZSBpZiAoIXF1YWxpZmllci52aFByb3BlcnRpZXMgfHwgaXNNdWx0aVZhbHVlRmllbGQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHF1YWxpZmllci52aFByb3BlcnRpZXM/LmZvckVhY2goZnVuY3Rpb24gKHZoS2V5KSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KHZoS2V5KTtcblx0XHRcdGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRcdGVudHJ5W3ZoS2V5XSA9IHZhbHVlPy5sZW5ndGggPT09IDAgPyBcIlwiIDogdmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbnRyeVt2aEtleV0gPSBudWxsOyAvLyBudWxsIHZhbHVlIGlzIGFsc28gdmFsaWRcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoZW50cnkpLmxlbmd0aCkge1xuXHRcdFx0LyogdmggcXVhbGlmaWVyIGFzIGtleSBmb3IgcmVsZXZhbnQgY29uZGl0aW9uICovXG5cdFx0XHRjb25kaXRpb25QYXlsb2FkW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXSA9IFtlbnRyeV07XG5cdFx0fVxuXHRcdHJldHVybiBjb25kaXRpb25QYXlsb2FkO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gY3VzdG9taXplIHNlbGVjdGlvbnMgaW4gJ1NlbGVjdCBmcm9tIGxpc3QnIHNjZW5hcmlvcy5cblx0ICogQnkgZGVmYXVsdCwgb25seSBjb25kaXRpb24ga2V5cyBhcmUgY29uc2lkZXJlZC4gVGhpcyBtYXkgYmUgZXh0ZW5kZWQgd2l0aCBwYXlsb2FkIGRlcGVuZGVudCBmaWx0ZXJzLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50IFZhbHVlSGVscCBjb250ZW50IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgb2YgdGhlIHNlbGVjdGVkIGl0ZW1cblx0ICogQHBhcmFtIGNvbmRpdGlvbnMgQ3VycmVudCBjb25kaXRpb25zXG5cdCAqIEByZXR1cm5zIENvbmRpdGlvbnMgb3IgW11cblx0ICovXG5cdGZpbmRDb25kaXRpb25zRm9yQ29udGV4dDogZnVuY3Rpb24gKFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwLFxuXHRcdGNvbnRlbnQ6IEZpbHRlcmFibGVMaXN0Q29udGVudCxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHRjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXVxuXHQpIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdC8qIERvIG5vdCBjb25zaWRlciBcIk5vdFZhbGlkYXRlZFwiIGNvbmRpdGlvbnMgKi9cblx0XHRjb25kaXRpb25zID0gY29uZGl0aW9ucy5maWx0ZXIoKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLnZhbGlkYXRlZCA9PT0gQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCk7XG5cblx0XHRjb25zdCB2aEtleXMgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdPy52aEtleXMgfHwgW107XG5cdFx0Y29uc3Qga2V5UGF0aCA9IGNvbnRlbnQuZ2V0S2V5UGF0aCgpO1xuXHRcdGNvbnN0IHZhbHVlSGVscFF1YWxpZmllciA9IHBheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyIHx8IFwiXCI7XG5cdFx0Y29uc3QgZmluZENvbmRpdGlvbiA9IChjb25kaXRpb25QYXlsb2FkTWFwOiBDb25kaXRpb25QYXlsb2FkTWFwLCB2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwpOiBib29sZWFuID0+IHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblNlbGVjdGVkUm93ID0gY29uZGl0aW9uUGF5bG9hZE1hcD8uW3ZhbHVlSGVscFF1YWxpZmllcl0/LlswXSB8fCB7fTtcblx0XHRcdGlmICh2aEtleXMubGVuZ3RoID09PSAxIHx8IHBheWxvYWQ/LnVzZU11bHRpVmFsdWVGaWVsZCB8fCAhY29uZGl0aW9uUGF5bG9hZE1hcCkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dD8uZ2V0T2JqZWN0KGtleVBhdGgpID09PSB2YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRLZXlzID0gT2JqZWN0LmtleXMoY29udGV4dC5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdHJldHVybiB2aEtleXMuZXZlcnkoZnVuY3Rpb24gKHZoS2V5KSB7XG5cdFx0XHRcdFx0cmV0dXJuICFjb250ZXh0S2V5cy5pbmNsdWRlcyh2aEtleSkgfHwgY29udGV4dD8uZ2V0T2JqZWN0KHZoS2V5KSA9PT0gY29uZGl0aW9uU2VsZWN0ZWRSb3dbdmhLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IHNlbGVjdGVkQ29uZGl0aW9uID0gY29uZGl0aW9ucy5maW5kKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSBjb25kaXRpb24ucGF5bG9hZCBhcyBDb25kaXRpb25QYXlsb2FkTWFwO1xuXHRcdFx0aWYgKGNvbnRleHQ/LmdldE9iamVjdChrZXlQYXRoKSA9PT0gY29uZGl0aW9uUGF5bG9hZE1hcD8uW3ZhbHVlSGVscFF1YWxpZmllcl0/LlswXT8uW2tleVBhdGhdKSB7XG5cdFx0XHRcdHJldHVybiBmaW5kQ29uZGl0aW9uKGNvbmRpdGlvblBheWxvYWRNYXAsIGNvbmRpdGlvblBheWxvYWRNYXA/Llt2YWx1ZUhlbHBRdWFsaWZpZXJdPy5bMF0/LltrZXlQYXRoXSk7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRleHQ/LmdldE9iamVjdChrZXlQYXRoKSA9PT0gY29uZGl0aW9uPy52YWx1ZXNbMF0pIHtcblx0XHRcdFx0cmV0dXJuIGZpbmRDb25kaXRpb24oY29uZGl0aW9uUGF5bG9hZE1hcCwgY29uZGl0aW9uPy52YWx1ZXNbMF0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHNlbGVjdGVkQ29uZGl0aW9uID8gW3NlbGVjdGVkQ29uZGl0aW9uXSA6IFtdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGNvbnRleHRzIGZvciBhZGRpdGlvbmFsIHZhbHVlcyBhbmQgcmVzdW1lcyB0aGUgbGlzdCBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBhZGRpdGlvbmFsVmFsdWVzIEFycmF5IG9mIEFkZGl0aW9uYWxWYWx1ZXNcblx0ICogQHBhcmFtIHZhbHVlTGlzdFByb3BlcnR5IFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEBwYXJhbSBmaWVsZCBDb250cm9sIGNvbm5lY3RlZCB0byB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRfdXBkYXRlQmluZGluZ1dpdGhUcmFuc2llbnRDb250ZXh0czogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdGFkZGl0aW9uYWxWYWx1ZXM6IEFkZGl0aW9uYWxWYWx1ZVR5cGVbXSxcblx0XHR2YWx1ZUxpc3RQcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGZpZWxkOiBGaWx0ZXJGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IEZpZWxkLFxuXHRcdHNvcnRlcnM6IFNvcnRlclR5cGVbXSxcblx0XHR0YWJsZTogVGFibGVcblx0KSB7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuX3VwZGF0ZUJpbmRpbmdBdHRyaWJ1dGVzKGxpc3RCaW5kaW5nLCBiaW5kaW5nSW5mbywgc29ydGVycyk7XG5cblx0XHRcdGNvbnN0IHsgcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSwgcmVjZW50VmFsdWVzQ29udGV4dERhdGEsIG90aGVyc1ZhbHVlc0NvbnRleHREYXRhIH0gPVxuXHRcdFx0XHRhd2FpdCB0aGlzLl9nZXRSZWxldmFudEFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhKFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMsXG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0YmluZGluZ0luZm8sXG5cdFx0XHRcdFx0cGF5bG9hZCxcblx0XHRcdFx0XHR2YWx1ZUxpc3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0XHRzb3J0ZXJzLFxuXHRcdFx0XHRcdHRhYmxlXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIG5vIGdyb3VwaW5nIHNob3VsZCBiZSBzaG93biBpbiB0aGUgc3VnZ2VzdGlvbiBsaXN0IGlmIHRoZSBzZWFyY2ggcmVzdWx0IG9ubHkgY29udGFpbnMgdmFsdWVzIGZyb20gdGhlICdPdGhlcnMnIGdyb3VwXG5cdFx0XHRpZiAocmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YS5sZW5ndGggPT09IDAgJiYgcmVjZW50VmFsdWVzQ29udGV4dERhdGEubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGxpc3RCaW5kaW5nLnNvcnQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBheWxvYWQ/Lmhpc3Rvcnk/LmVuYWJsZWQpIHtcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5Lmhhc1JlbGV2YW50RGF0YSA9IHJlY2VudFZhbHVlc0NvbnRleHREYXRhLmxlbmd0aCAhPT0gMDtcblx0XHRcdH1cblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIE5vdyB3ZSBtYWtlIHN1cmUgdG8gcmVzZXQgdGhlIGxpc3RiaW5kaW5nLCBiZWZvcmUgdGhlIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgY3JlYXRlZFxuXHRcdFx0XHRhd2FpdCBsaXN0QmluZGluZy5yZXNldENoYW5nZXMoKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hpbGUgY2xlYXJpbmcgdGhlIGxpc3QgYmluZGluZzogJHtlcnJvcn1gKTtcblx0XHRcdH1cblx0XHRcdC8vIGFkZCB0cmFuc2llbnQgY29udGV4dCB0byBsaXN0IGJpbmRpbmcgYWZ0ZXIgYmFja2VuZCBxdWVyeSBpcyBkb25lXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVIZWxwZXIuY3JlYXRlVHJhbnNpZW50Q29udGV4dHNGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHRsaXN0QmluZGluZ1xuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly9EbyBub3RoaW5nIGFzIHdlIGtub3cgdGhhdCByZXNldCBjaGFuZ2VzIHdvdWxkIHRocm93IGFuIGVycm9yIGluIGNvbnNvbGUgYW5kIHRoaXMgd2lsbCBwaWxlIHVwIGEgbG90IG9mIGNvbnNvbGUgZXJyb3JzXG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNoYW5nZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdmFsdWUgaGVscCwgc3VjaCBhcyBzb3J0LCBmaWx0ZXIsIHBhcmFtZXRlcnMgZXRjLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqL1xuXHRfdXBkYXRlQmluZGluZ0F0dHJpYnV0ZXM6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0c29ydGVyczogU29ydGVyVHlwZVtdXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHJvb3RCaW5kaW5nID0gbGlzdEJpbmRpbmcuZ2V0Um9vdEJpbmRpbmcoKSB8fCBsaXN0QmluZGluZztcblx0XHRpZiAoIXJvb3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHJvb3RCaW5kaW5nLnN1c3BlbmQoKTtcblx0XHR9XG5cdFx0Ly9zb3J0IGFuZCBmaWx0ZXIgdmFsdWUgaGVscCBiaW5kaW5nIHRvIG1ha2Ugc3VyZSB3ZSByZW5kZXIgb3RoZXJzIGdyb3VwXG5cdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLnNvcnRBbmRGaWx0ZXJMaXN0QmluZGluZyhsaXN0QmluZGluZywgc29ydGVycyk7XG5cdFx0aWYgKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpIHtcblx0XHRcdGxpc3RCaW5kaW5nLmNoYW5nZVBhcmFtZXRlcnMoYmluZGluZ0luZm8ucGFyYW1ldGVycyk7XG5cdFx0fVxuXHRcdC8vcmVzdW1lIHRoZSBsaXN0IGJpbmRpbmcgYW5kIHRoZW4gcmVzZXQgdGhlIGNoYW5nZXNcblx0XHRhd2FpdCBhZGRpdGlvbmFsVmFsdWVIZWxwZXIucmVzdW1lVmFsdWVMaXN0QmluZGluZ0FuZFJlc2V0Q2hhbmdlcyhsaXN0QmluZGluZyk7XG5cdH0sXG5cdC8qKlxuXHQgKiBNZXRob2QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIGxpc3Qgb2YgYWxsIHR5cGVzIG9mIGFkZGl0aW9uYWwgdmFsdWUgY29udGV4dCBkYXRhIChyZWNvbW1lbmRhdGlvbiwgcmVjZW50bHkgdXNlZCBhbmQgb3RoZXJzKSB0byBiZSB1c2VkLlxuXHQgKiBAcGFyYW0gYWRkaXRpb25hbFZhbHVlcyBBcnJheSBvZiBBZGRpdGlvbmFsVmFsdWVzXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHBhcmFtIHZhbHVlTGlzdFByb3BlcnR5IFZhbHVlTGlzdFByb3BlcnR5IG9mIHRoZSBwYXlsb2FkXG5cdCAqIEBwYXJhbSBmaWVsZCBDb250cm9sIGNvbm5lY3RlZCB0byB2YWx1ZSBoZWxwXG5cdCAqIEBwYXJhbSBzb3J0ZXJzIFNvcnRlcnMgb2YgdGhlIHZhbHVlIGhlbHAgbGlzdCBiaW5kaW5nXG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aGljaCBjb250YWlucyByZWNvbW1lbmRhdGlvbnMsIHJlY2VudGx5IHVzZWQsIGFuZCBvdGhlcnMgY29udGV4dCBkYXRhLlxuXHQgKi9cblx0X2dldFJlbGV2YW50QWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGE6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10sXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0dmFsdWVMaXN0UHJvcGVydHk6IHN0cmluZyxcblx0XHRmaWVsZDogRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZCxcblx0XHRzb3J0ZXJzOiBTb3J0ZXJUeXBlW10sXG5cdFx0dGFibGU6IFRhYmxlXG5cdCk6IFByb21pc2U8e1xuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdO1xuXHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW107XG5cdH0+IHtcblx0XHRsZXQgeyByZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSB9ID0gYXdhaXQgYWRkaXRpb25hbFZhbHVlSGVscGVyLnJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMsXG5cdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdGJpbmRpbmdJbmZvLFxuXHRcdFx0cGF5bG9hZCxcblx0XHRcdHNvcnRlcnMsXG5cdFx0XHR0YWJsZVxuXHRcdCk7XG5cblx0XHQvLyBhcHBseSBzZWFyY2ggYW5kIGZpbHRlcnMgdG8gYWRkaXRpb25hbCB2YWx1ZXMgY29udGV4dCBkYXRhXG5cdFx0Y29uc3QgdmFsdWVIZWxwS2V5cyA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0udmhLZXlzIHx8IFtdO1xuXHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEgPSBhZGRpdGlvbmFsVmFsdWVIZWxwZXIuZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhKFxuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdGFkZGl0aW9uYWxWYWx1ZXNbMF0/LnZhbHVlcyxcblx0XHRcdHZhbHVlTGlzdFByb3BlcnR5XG5cdFx0KTtcblxuXHRcdGxldCByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdID0gW107XG5cdFx0aWYgKCFwYXlsb2FkLmlzVmFsdWVMaXN0V2l0aEZpeGVkVmFsdWVzKSB7XG5cdFx0XHQvLyBubyBoaXN0b3J5IGZvciB2YWx1ZXMgbGlzdHMgd2l0aCBmaXhlZCB2YWx1ZXMgKHRoZXkgYXJlIHVzdWFsbHkgc2hvcnQpXG5cdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSA9IGF3YWl0IHRoaXMuX2dldEhpc3RvcnlEYXRhKHBheWxvYWQsIGZpZWxkKTtcblx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhID0gYWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjZW50VmFsdWVzQ29udGV4dERhdGEoXG5cdFx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0dmFsdWVIZWxwS2V5cyxcblx0XHRcdFx0KGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMgYXMgQmluZGluZ0luZm9QYXJhbWV0ZXJzKS4kc2VhcmNoPy5yZXBsYWNlQWxsKCdcIicsIFwiXCIpLFxuXHRcdFx0XHRiaW5kaW5nSW5mb1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSA9IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5nZXRSZWxldmFudE90aGVyc1ZhbHVlc0NvbnRleHREYXRhKFxuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHR2YWx1ZUhlbHBLZXlzXG5cdFx0KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YVxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBFeGVjdXRlcyBhIGZpbHRlciBpbiBhIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPiBhbmQgcmVzdW1lcyBpdCwgaWYgc3VzcGVuZGVkLlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqL1xuXHRfdXBkYXRlQmluZGluZzogZnVuY3Rpb24gKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLCBiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8pIHtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgfHwgbGlzdEJpbmRpbmc7XG5cdFx0aWYgKCFyb290QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRyb290QmluZGluZy5zdXNwZW5kKCk7XG5cdFx0fVxuXHRcdGlmIChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRsaXN0QmluZGluZy5jaGFuZ2VQYXJhbWV0ZXJzKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHRsaXN0QmluZGluZy5maWx0ZXIoYmluZGluZ0luZm8uZmlsdGVycywgRmlsdGVyVHlwZS5BcHBsaWNhdGlvbik7XG5cdFx0bGlzdEJpbmRpbmcuc29ydChiaW5kaW5nSW5mby5zb3J0ZXIpO1xuXG5cdFx0aWYgKHJvb3RCaW5kaW5nLmlzU3VzcGVuZGVkKCkpIHtcblx0XHRcdHJvb3RCaW5kaW5nLnJlc3VtZSgpO1xuXHRcdFx0cm9vdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHR9LFxuXHQvKipcblx0ICogUmV0dXJucyBhbiBib29sZWFuIHZhbHVlIGlmIGFkZGl0aW9uYWx2YWx1ZXMgZXhpc3RzIHdoaWNoIHdpbGwgY29udGFpbiBkaWZmZXJlbnQgZ3JvdXBzIGxpa2UgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcGFyYW0gY2hlY2tSZWNvbW1lbmRhdGlvbnMgRGVmaW5lcyBpZiB3ZSBzaGFsbCBjaGVjayBmb3IgcmVjb21tZW5kYXRpb25zXG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWVcblx0ICovXG5cdF9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0czogYXN5bmMgZnVuY3Rpb24gKGNvbnRlbnQ6IE1UYWJsZSwgcGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCwgY2hlY2tSZWNvbW1lbmRhdGlvbnMgPSB0cnVlKSB7XG5cdFx0Ly8gRm9yIGRlZmluZSBjb25kaXRpb25zIHZhbHVlaGVscCByZWNvbW1lbmRhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSBcImludGVybmFsXCIgbW9kZWwgaXMgbm90IGF2YWlsYWJsZS5cblx0XHRpZiAocGF5bG9hZC5pc0RlZmluZUNvbmRpdGlvblZhbHVlSGVscCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlY29tbWVuZGF0aW9uVmFsdWVzID0gY2hlY2tSZWNvbW1lbmRhdGlvbnMgPyB0aGlzLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKGNvbnRlbnQsIHBheWxvYWQpIDogW107XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uVmFsdWVzPy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2lmIHRoZXJlIGFyZSByZWxldmFudCByZWNvbW1lbmRhdGlvbnMgdGhlbiByZXR1cm4gdHJ1ZVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHBheWxvYWQuaGlzdG9yeT8uZW5hYmxlZCkge1xuXHRcdFx0Ly8gbm93IGNoZWNrIGZvciByZWNlbnQgdmFsdWVzXG5cdFx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Lmhhc1JlbGV2YW50RGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBwYXlsb2FkLmhpc3RvcnkuaGFzUmVsZXZhbnREYXRhO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgcmVjZW50VmFsdWVzID0gYXdhaXQgdGhpcy5fZ2V0SGlzdG9yeURhdGEocGF5bG9hZCwgY29udGVudC5nZXRDb250cm9sKCkpO1xuXHRcdFx0aWYgKHJlY2VudFZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0Ly9pZiB0aGVyZSBhcmUgcmVjZW50bHkgZW50ZXJlZCB2YWx1ZXMgcmV0dXJuIHRydWVcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBSZWxldmFudCByZWNvbW1lbmRhdGlvbnNcblx0ICovXG5cdGdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKGNvbnRlbnQ6IE1UYWJsZSwgcGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuXHRcdGxldCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcblx0XHRjb25zdCBpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkID1cblx0XHRcdGNvbnRlbnQuZ2V0Q29udHJvbCgpLmlzQShcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikgfHwgY29udGVudC5nZXRDb250cm9sKCkuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIik7XG5cblx0XHRpZiAoIWlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRNb2RlbCA9IGNvbnRlbnQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsICYgeyBnZXRMb2NhbEFubm90YXRpb25Nb2RlbDogRnVuY3Rpb24gfTtcblx0XHRcdGNvbnN0IGxvY2FsQW5ub3RhdGlvbk1vZGVsID0gY29udGVudE1vZGVsLmdldExvY2FsQW5ub3RhdGlvbk1vZGVsICYmIGNvbnRlbnRNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCgpO1xuXHRcdFx0aWYgKGxvY2FsQW5ub3RhdGlvbk1vZGVsKSB7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdDb250ZXh0UGF0aCA9IGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdFx0Y29uc3QgZmllbGRQYXRoID0gY29udGVudC5nZXRDb250cm9sKCkuZ2V0QmluZGluZyhcInZhbHVlXCIpPy5nZXRQYXRoKCk7XG5cdFx0XHRcdHZhbHVlcyA9IGxvY2FsQW5ub3RhdGlvbk1vZGVsLmdldE9iamVjdChgJHtiaW5kaW5nQ29udGV4dFBhdGh9LyR7ZmllbGRQYXRofUAkdWk1LmZlLnJlY29tbWVuZGF0aW9ucy50eXBlQWhlYWRWYWx1ZXNgKSA/PyBbXTtcblx0XHRcdH1cblx0XHRcdGlmICghdmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBpbnB1dFZhbHVlcyA9IChjb250ZW50LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsKS5nZXRQcm9wZXJ0eShcIi9yZWNvbW1lbmRhdGlvbnNEYXRhXCIpIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IGNvbnRlbnQuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBPRGF0YVY0Q29udGV4dDtcblx0XHRcdFx0dmFsdWVzID1cblx0XHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVIZWxwZXIuZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMoXG5cdFx0XHRcdFx0XHRpbnB1dFZhbHVlcyxcblx0XHRcdFx0XHRcdGJpbmRpbmdDb250ZXh0LFxuXHRcdFx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5nZXRCaW5kaW5nKFwidmFsdWVcIik/LmdldFBhdGgoKVxuXHRcdFx0XHRcdCkgfHwgW107XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBib29sZWFuIHZhbHVlIHdoaWNoIHdpbGwgdGVsbCB3aGV0aGVyIHR5cGVhaGVhZCBzaG91bGQgYmUgb3BlbmVkIG9yIG5vdC5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlIHdoZXRoZXIgdG8gc2hvdyB0eXBlYWhlYWQgb3Igbm90XG5cdCAqL1xuXHR0eXBlQWhlYWRGb3JGaWx0ZXJhYmxlQ29udGVudDogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBNRENQb3BvdmVyKSB7XG5cdFx0bGV0IHNob3dJdCA9IHRydWU7XG5cdFx0Y29uc3QgdHlwZUFoZWFkQ29udGVudCA9IGNvbnRlbnQ/LmdldENvbnRlbnQoKVswXSBhcyBNVGFibGU7XG5cdFx0Y29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZUhlbHA/LmdldEZpbHRlclZhbHVlKCk7XG5cdFx0Y29uc3QgZmllbGQgPSB0eXBlQWhlYWRDb250ZW50LmdldENvbnRyb2woKSBhcyBGaWx0ZXJGaWVsZCB8IE11bHRpVmFsdWVGaWVsZCB8IEZpZWxkO1xuXHRcdGNvbnN0IHBheWxvYWQgPSB2YWx1ZUhlbHAuZ2V0UGF5bG9hZCgpIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cblx0XHRpZiAoZmllbGQuaXNBPEZpbHRlckZpZWxkPihcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikgfHwgZmllbGQuaXNBPE11bHRpVmFsdWVGaWVsZD4oXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKSkge1xuXHRcdFx0aWYgKCFmaWx0ZXJWYWx1ZSkge1xuXHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcmVjb21tZW5kYXRpb24gVVggd2UgZG9uJ3QgY2hlY2sgZm9yIHJlY29tbWVuZGF0aW9ucyBidXQgcmVjZW50bHkgZW50ZXJlZCB2YWx1ZXMgb25seVxuXHRcdFx0XHRzaG93SXQgPSBhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGZpZWxkVmFsdWUgPSBmaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0Y29uc3QgZmllbGRUZXh0VmFsdWUgPSBmaWVsZC5nZXRBZGRpdGlvbmFsVmFsdWUoKTtcblx0XHRcdGlmIChmaWVsZFZhbHVlIHx8IGZpZWxkVGV4dFZhbHVlKSB7XG5cdFx0XHRcdC8vIHZhbHVlaGVscCBoYWQgc29tZSB2YWx1ZSwgYnV0IHVzZXIgY2xlYXJlZCB0aGUgdmFsdWVcblx0XHRcdFx0Ly8gaW4gc3VjaCBjYXNlIHdlIGdldCBpbnB1dCB2YWx1ZSBhcyAnJyBhbmQgd2Ugd2lsbCByZXR1cm4gZmFsc2Vcblx0XHRcdFx0Ly9Ob3RlOiBJbiBTRHMgdXNlY2FzZSB3ZSB3YW50ZWQgdG8gb3BlbiB0aGUgdHlwZUFoZWFkIGlmIHRoZXJlIGFyZSByZWNvbW1lbmRhdGlvbnMgYW5kIHZhbHVlIGlzIGJsYW5rLCB0aGV5IHNob3VsZCBwYXNzIHVzIGEgZmxhZyBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgdGhpcyBhY2NvcmRpbmdseVxuXHRcdFx0XHRjb25zdCBpc0RpZ2l0U2VxdWVuY2UgPVxuXHRcdFx0XHRcdChmaWVsZC5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWwpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChgJHtwYXlsb2FkLnByb3BlcnR5UGF0aH0ke0Fubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2V9YCkgPz9cblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0aWYgKGZpZWxkLmhhc1BlbmRpbmdVc2VySW5wdXQoKSB8fCB0aGlzLl9pc0VtcHR5RGlnaXRTZXF1ZW5jZShmaWVsZFZhbHVlLCBpc0RpZ2l0U2VxdWVuY2UpKSB7XG5cdFx0XHRcdFx0c2hvd0l0ID0gZmlsdGVyVmFsdWUgIT09IFwiXCIgfHwgKGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHR5cGVBaGVhZENvbnRlbnQsIHBheWxvYWQpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBjaGVjayByZWNlbnRseSB1c2VkIG9ubHlcblx0XHRcdFx0XHRzaG93SXQgPSBhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoIWZpbHRlclZhbHVlKSB7XG5cdFx0XHRcdHNob3dJdCA9IGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHR5cGVBaGVhZENvbnRlbnQsIHBheWxvYWQpO1xuXHRcdFx0XHQvLyBlbHNlOiB0aGUgdXNlciB0eXBlcywgd2Ugc2hhbGwgYWx3YXlzIHNob3cgdGhlIG90aGVyIHZhbHVlc1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc2hvd0l0O1xuXHR9LFxuXG5cdGNvbmRpdGlvbkZvclJlcXVlc3RTaG93Q29udGFpbmVyOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IE1EQ1BvcG92ZXIpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcGFyZW50Q29udHJvbCA9IHZhbHVlSGVscC5nZXRDb250cm9sKCk7XG5cdFx0XHRpZiAocGFyZW50Q29udHJvbCAmJiBwYXJlbnRDb250cm9sPy5pc0E8RmlsdGVyRmllbGQ+KFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSkge1xuXHRcdFx0XHRjb25zdCBmaWVsZElkID0gcGFyZW50Q29udHJvbC5nZXRDb250ZW50KCk/LmdldElkKCk7XG5cdFx0XHRcdGNvbnN0IGlzVmlzdWFsRmlsdGVyID0gZmllbGRJZCA/IGZpZWxkSWQuaW5jbHVkZXMoXCJWaXN1YWxGaWx0ZXJcIikgOiBmYWxzZTtcblx0XHRcdFx0Ly9WaXN1YWwgRmlsdGVyIGNvbnRhaW5pbmcgdmFsdWVIZWxwIHNob3VsZCBub3Qgb3BlbiBvbiBmb2N1cyBmb3IgcmVjZW50bHkgc2VsZWN0ZWQgdmFsdWVzIG8gciByZWNvbW1lbmRhdGlvbnNcblx0XHRcdFx0aWYgKGlzVmlzdWFsRmlsdGVyKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHZhbHVlSGVscFRhYmxlID0gY29udGVudD8uZ2V0Q29udGVudCgpWzBdIGFzIE1UYWJsZTtcblx0XHRcdGxldCBjb250cm9sOiBVSTVFbGVtZW50IHwgRGlhbG9nIHwgdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgZ2V0UGFyZW50RGlhbG9nID0gZnVuY3Rpb24gKGlubmVyQ29udGVudDogVUk1RWxlbWVudCk6IERpYWxvZyB8IHVuZGVmaW5lZCB7XG5cdFx0XHRcdGNvbnRyb2wgPSBpbm5lckNvbnRlbnQ/LmdldFBhcmVudCgpIGFzIFVJNUVsZW1lbnQ7XG5cdFx0XHRcdGlmIChjb250cm9sICYmIGNvbnRyb2wuaXNBPERpYWxvZz4oXCJzYXAubS5EaWFsb2dcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gY29udHJvbDtcblx0XHRcdFx0fSBlbHNlIGlmIChjb250cm9sID09PSB1bmRlZmluZWQgfHwgY29udHJvbCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGdldFBhcmVudERpYWxvZyhjb250cm9sKTtcblx0XHRcdH07XG5cdFx0XHRjb250cm9sID0gZ2V0UGFyZW50RGlhbG9nKGNvbnRlbnQpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRjb250cm9sICYmXG5cdFx0XHRcdGNvbnRyb2wuZGF0YShcImZlX0luaXRpYWxUeXBlQWhlYWRGb2N1c0RvbmVcIikgPT09IG51bGwgJiZcblx0XHRcdFx0Y29udGVudC5nZXRDb250cm9sKCkuZ2V0RG9tUmVmKCk/LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF0uaWQgPT09IChjb250cm9sIGFzIERpYWxvZykuZ2V0SW5pdGlhbEZvY3VzKClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250cm9sLmRhdGEoXCJmZV9Jbml0aWFsVHlwZUFoZWFkRm9jdXNEb25lXCIsIHRydWUpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkgPSBwYXlsb2FkLmhpc3RvcnkgfHwge307XG5cdFx0XHRcdHBheWxvYWQuaGlzdG9yeS5oYXNSZWxldmFudERhdGEgPSB1bmRlZmluZWQ7IC8vIG5lZWRzIHRvIGJlIGluaXRpYWxpemVcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5LmVuYWJsZWQgPSBwYXlsb2FkLmhpc3RvcnkuZW5hYmxlZCA/PyBWYWx1ZUxpc3RIZWxwZXIuY2hlY2tIaXN0b3J5RW5hYmxlZCh2YWx1ZUhlbHAsIHBheWxvYWQpO1xuXHRcdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5fY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHModmFsdWVIZWxwVGFibGUsIHBheWxvYWQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRMb2cuZXJyb3IoZXJyb3IgYXMgc3RyaW5nKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYW4gYm9vbGVhbiB2YWx1ZSBkZXRlcm1pbmluZyBpZiByZXF1ZXN0U2hvd0NvbnRhaW5lciBzaGFsbCBvcGVuIHRoZSBwb3BvdmVyIG9yIG5vdC5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGFpbmVyIEZpbHRlcmFibGUgTGlzdCBDb250ZW50XG5cdCAqIEBwYXJhbSByZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiBFbnVtIGRlZmluaW5nIHRoZSByZWFzb24gZm9yIHBvc3NpYmxlIHRyaWdnZXJcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZVxuXHQgKi9cblx0cmVxdWVzdFNob3dDb250YWluZXI6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGFpbmVyOiBNRENQb3BvdmVyLCByZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbjogc3RyaW5nKSB7XG5cdFx0Ly8gRW5zdXJlIHRoZSB2YWx1ZSBoZWxwIHBvcG92ZXIgb3BlbnMgZm9yIHR5cGluZywgZmlsdGVyLCB0YXAgZXZlbnRzIGFuZCB0YWIgbmF2aWdhdGlvblxuXHRcdGlmIChbUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uVGFiLCBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbi5UYXBdLmluY2x1ZGVzKHJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29uZGl0aW9uRm9yUmVxdWVzdFNob3dDb250YWluZXIodmFsdWVIZWxwLCBjb250YWluZXIpO1xuXHRcdH0gZWxzZSBpZiAoW1JlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLlR5cGluZywgUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uRmlsdGVyXS5pbmNsdWRlcyhyZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbikpIHtcblx0XHRcdHJldHVybiB0aGlzLnR5cGVBaGVhZEZvckZpbHRlcmFibGVDb250ZW50KHZhbHVlSGVscCwgY29udGFpbmVyKTtcblx0XHR9XG5cdFx0cmV0dXJuIFJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLlZhbHVlSGVscFJlcXVlc3QgPT09IHJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uO1xuXHR9XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0VBbURBLE1BQU1BLHVCQUF1QixHQUFHLGtDQUFrQztFQUNsRSxNQUFNQyx5QkFBeUIsR0FBRyxpREFBaUQ7RUFBQyxPQXVCckVDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFQyxpQkFBaUIsRUFBRTtJQUNuREMsVUFBVSxFQUFFLENBQUM7SUFDYkMseUJBQXlCLEVBQUUsSUFBSUMsT0FBTyxDQUF3QixDQUFDO0lBRS9EO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0ND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
1056
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZUNvcmVDb250cm9sc0ZpbHRlckJhciIsIkFubm90YXRpb25Jc0RpZ2l0U2VxdWVuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJWYWx1ZUhlbHBEZWxlZ2F0ZSIsImFwaVZlcnNpb24iLCJ1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzIiwiV2Vha01hcCIsImlzU2VhcmNoU3VwcG9ydGVkIiwidmFsdWVIZWxwIiwiY29udGVudCIsIl9saXN0QmluZGluZyIsImRhdGEiLCJ1cGRhdGVCaW5kaW5nSW5mbyIsImJpbmRpbmdJbmZvIiwic2VhcmNoIiwiZ2V0RmlsdGVyVmFsdWUiLCJub3JtYWxpemVkU2VhcmNoIiwiQ29tbW9uVXRpbHMiLCJub3JtYWxpemVTZWFyY2hUZXJtIiwicGFyYW1ldGVycyIsIiRzZWFyY2giLCJ1bmRlZmluZWQiLCJfZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UiLCJjb250cm9sIiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZ2V0VGFyZ2V0VmlldyIsImdldFZhbHVlSGVscEhpc3RvcnlTZXJ2aWNlIiwiX2dldEhpc3RvcnlEYXRhIiwicGF5bG9hZCIsImhpc3RvcnkiLCJlbmFibGVkIiwiaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsInZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlIiwiZmllbGREYXRhIiwiZ2V0RmllbGREYXRhIiwicHJvcGVydHlQYXRoIiwidmFsdWVIZWxwUXVhbGlmaWVyIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJTdHJpbmciLCJfc2V0SGlzdG9yeURhdGEiLCJjb25kaXRpb25zIiwibGVuZ3RoIiwidmFsdWVMaXN0UHJvcGVydHkiLCJfZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllciIsImNvbmRpdGlvbiIsImlzVW5pdFZhbHVlSGVscCIsInZhbGlkYXRlZCIsIkNvbmRpdGlvblZhbGlkYXRlZCIsIlZhbGlkYXRlZCIsImNvbmRpdGlvblBheWxvYWRNYXAiLCJfZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QiLCJwdXNoIiwiY29udmVydENvbmRpdGlvblBheWxvYWRUb05lc3RlZE9iamVjdCIsInNldEZpZWxkRGF0YSIsImNvbmRpdGlvblBheWxvYWQiLCJuZXN0ZWRPYmplY3QiLCJrZXkiLCJPYmplY3RQYXRoIiwic2V0Iiwic3BsaXQiLCJfaXNFbXB0eURpZ2l0U2VxdWVuY2UiLCJ2YWx1ZSIsImlzRGlnaXRTZXF1ZW5jZSIsImlzRW1wdHlEaWdpdFNlcXVlbmNlIiwiZXZlcnkiLCJjaGFyIiwidXBkYXRlQmluZGluZyIsImxpc3RCaW5kaW5nIiwiaXNBIiwiZ2V0UGF5bG9hZCIsImlzVHlwZWFoZWFkIiwidXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSIsIm5ld1Byb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlIiwiZ2V0IiwidGhlbiIsImZpZWxkIiwiZ2V0Q29udHJvbCIsImlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQiLCJmaWVsZFZhbHVlIiwiZ2V0VmFsdWUiLCJhZGRpdGlvbmFsVmFsdWVzIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRPYmplY3QiLCJoYXNQZW5kaW5nVXNlcklucHV0IiwidmFsdWVzIiwiZ2V0UmVsZXZhbnRSZWNvbW1lbmRhdGlvbnMiLCJncm91cEtleSIsIkFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5IiwicmVjb21tZW5kYXRpb24iLCJ0YWJsZSIsImdldFRhYmxlIiwic29ydGVyc0N1c3RvbURhdGEiLCJnZXRDdXN0b21EYXRhIiwiZmlsdGVyIiwiZ2V0S2V5Iiwic29ydGVycyIsIl91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzIiwiX3VwZGF0ZUJpbmRpbmciLCJleGVjdXRlRmlsdGVyIiwicmVxdWVzdGVkSXRlbXMiLCJnZXRDb250ZXh0cyIsImNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nIiwiX3ZhbHVlSGVscCIsImlzUGVuZGluZyIsImhhcyIsImlzU3VzcGVuZGVkIiwiY29udGV4dHMiLCJyZXF1ZXN0Q29udGV4dHMiLCJjYW5jZWxlZCIsImdldFR5cGVNYXAiLCJUeXBlTWFwIiwicmV0cmlldmVDb250ZW50IiwiY29udGFpbmVyIiwiY29udGVudElkIiwiVmFsdWVMaXN0SGVscGVyIiwic2hvd1ZhbHVlTGlzdCIsInZhbHVlSGVscFF1YWxpZmllcnMiLCJrZXlzIiwiY29uZGl0aW9uUGF5bG9hZExpc3QiLCJwYXJhbXMiLCJxdWFsaWZpZXJzIiwidmhQYXJhbWV0ZXJzIiwidmhLZXlzIiwicHJvcGVydHlLZXlQYXRoIiwidmFsdWVIZWxwS2V5UGF0aCIsImZpbHRlcmVkS2V5cyIsImhlbHBQYXRocyIsImZvckVhY2giLCJwYXJhbSIsImhlbHBQYXRoIiwiaW5jbHVkZXMiLCJfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvRmlsdGVyQmFyIiwib3V0UGFyYW1ldGVycyIsImZpbHRlckJhciIsImxpc3RSZXBvcnRGaWx0ZXJCYXIiLCJzdGF0ZSIsIlN0YXRlVXRpbCIsInJldHJpZXZlRXh0ZXJuYWxTdGF0ZSIsInN0YXRlSXRlbXMiLCJpdGVtcyIsImZpbHRlckJhclByb3BlcnRpZXMiLCJGaWx0ZXJVdGlscyIsImdldEZpbHRlclByb3BlcnR5SW5mbyIsIm1ldGFNb2RlbCIsIm91dFBhcmFtZXRlciIsImZpbHRlckJhclByb3BlcnR5IiwiX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgiLCJmaW5kIiwiaXRlbSIsIm5hbWUiLCJjb25kaXRpb25QYXRoIiwiZmlsdGVyZWQiLCJuZXdDb25kaXRpb24iLCJDb25kaXRpb24iLCJjcmVhdGVDb25kaXRpb24iLCJjb25kaXRpb25BbHJlYWR5RXhpc3RzIiwidGVzdENvbmRpdGlvbiIsImRlZXBFcXVhbCIsImFwcGx5RXh0ZXJuYWxTdGF0ZSIsImNvbnRleHRQYXRoIiwiZmlsdGVyVGFyZ2V0Iiwic291cmNlIiwicG9wIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJmaWx0ZXJUYXJnZXRQYXRoIiwic3Vic3RyaW5nIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRSZWR1Y2VkUGF0aCIsIl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9CaW5kaW5nQ29udGV4dCIsImNvbnRleHQiLCJvdXRWYWx1ZXMiLCJ3YXJuaW5nIiwiX29uQ29uZGl0aW9uUHJvcGFnYXRpb25VcGRhdGVQcm9wZXJ0eSIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwicm9vdFBhdGgiLCJnZXRNZXRhQ29udGV4dCIsImdldFBhdGgiLCJjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzIiwiaXNUcmFuc2llbnQiLCJpc0luYWN0aXZlIiwib3V0UGFyYW1ldGVyU291cmNlcyIsIl91cGRhdGVQcm9wZXJ0eVZpYU91dFBhcmFtZXRlciIsInZpZXciLCJjb2xsYWJvcmF0aXZlRHJhZnQiLCJnZXRDb250cm9sbGVyIiwiaXNDb25uZWN0ZWQiLCJiaW5kaW5nIiwiZ2V0QmluZGluZyIsImdldEJpbmRpbmdDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwic2VuZCIsImFjdGlvbiIsIkFjdGl2aXR5IiwiQ2hhbmdlIiwibWFwIiwidGFyZ2V0UHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsInRhcmdldCIsImZpZWxkQ29udHJvbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiRmllbGRDb250cm9sIiwiZHluYW1pY1JlYWRPbmx5IiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJnZXRQcm9wZXJ0eSIsInBhdGgiLCJzaWRlRWZmZWN0UGF0aCIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImN1cnJlbnRWYWwiLCJuZXdWYWwiLCJzZXRQcm9wZXJ0eSIsInRleHRQYXRoIiwiVGV4dCIsImdldEZpbHRlckNvbmRpdGlvbnMiLCJjb25maWciLCJnZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucyIsIm9uQ29uZGl0aW9uUHJvcGFnYXRpb24iLCJyZWFzb24iLCJfY29uZmlnIiwiaXNEZWZpbmVDb25kaXRpb25WYWx1ZUhlbHAiLCJxdWFsaWZpZXIiLCJnZXRPdXRQYXJhbWV0ZXJzIiwiZmllbGRQYXJlbnQiLCJnZXRQYXJlbnQiLCJnZXRDb25kaXRpb25zIiwiaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMiLCJwcm9wZXJ0eU5hbWUiLCJwYXlsb2FkS2V5cyIsInBheWxvYWRLZXkiLCJjb25kaXRpb25WYWx1ZWtleXMiLCJjb25kaXRpb25WYWx1ZWtleSIsInZhbHVlS2V5Iiwia2V5VmFsdWUiLCJfY3JlYXRlSW5pdGlhbEZpbHRlckNvbmRpdGlvbiIsImluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQiLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZyIsImluQ29uZGl0aW9ucyIsImluUGFyYW1ldGVycyIsImJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJwcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiaW5QYXJhbWV0ZXIiLCJtZXRhRGF0YUVycm9yIiwibmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsInJlcGxhY2UiLCIkUGFydG5lciIsIiRraW5kIiwiX2J1aWxkUHJvcGVydGllc1RvUmVxdWVzdCIsImNvbnRleHRVbmRlckNyZWF0aW9uIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInN0YXJ0c1dpdGgiLCJlcnJvck1lc3NhZ2VzSW5Db250ZXh0IiwiZ2V0TWVzc2FnZXMiLCJnZXRUeXBlIiwiTWVzc2FnZVR5cGUiLCJjcmVhdGVkIiwicmVxdWVzdFByb3BlcnR5IiwiaSIsIm1ldGFNb2RlbENvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInJlbGF0aXZlUGF0aFBhcnRzIiwic2xpY2UiLCJwYXJ0IiwicGFydG5lciIsImxvY2FsRGF0YVBhdGgiLCJsb2NhbERhdGFQYXJ0cyIsIm1hdGNoQ291bnQiLCJmaW5kSW5kZXgiLCJpbmRleCIsImNvbmNhdCIsImpvaW4iLCJfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyIiwic291cmNlRmllbGQiLCJfZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlciIsIl9wYXJ0aXRpb25JblBhcmFtZXRlcnMiLCJpblBhcmFtZXRlck1hcCIsImNvbnN0YW50IiwiY29uc3RhbnRWYWx1ZSIsImluZGV4T2YiLCJfdGFibGVBZnRlclJlbmRlckRlbGVnYXRlIiwib25BZnRlclJlbmRlcmluZyIsImV2ZW50Iiwic3JjQ29udHJvbCIsInRhYmxlQ2VsbHNEb21SZWZzIiwiJCIsIm1kY01UYWJsZSIsImhpZ2hsaWdodERPTUVsZW1lbnRzIiwicG9wb3ZlclRhYmxlIiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJnZXRJblBhcmFtZXRlcnMiLCJpc09iamVjdFBhZ2UiLCJjcmVhdGVDb25kaXRpb25QYXlsb2FkIiwiX3ZhbHVlcyIsImVudHJ5IiwiaXNNdWx0aVZhbHVlRmllbGQiLCJleHRlcm5hbElkUGF0aCIsInZoS2V5UHJvcGVydHkiLCJ2aEtleVZhbHVlIiwidmhQcm9wZXJ0aWVzIiwidmhLZXkiLCJtb2RpZnlTZWxlY3Rpb25CZWhhdmlvdXIiLCJjaGFuZ2UiLCJvbGRDb25kaXRpb25zIiwiaXNRdWlja1NlbGVjdEFjdGl2ZSIsImZpbmRDb25kaXRpb25zRm9yQ29udGV4dCIsImtleVBhdGgiLCJnZXRLZXlQYXRoIiwiZmluZENvbmRpdGlvbiIsImNvbmRpdGlvblNlbGVjdGVkUm93IiwidXNlTXVsdGlWYWx1ZUZpZWxkIiwiY29udGV4dEtleXMiLCJzZWxlY3RlZENvbmRpdGlvbiIsIl91cGRhdGVCaW5kaW5nQXR0cmlidXRlcyIsInJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEiLCJyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSIsIm90aGVyc1ZhbHVlc0NvbnRleHREYXRhIiwiX2dldFJlbGV2YW50QWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEiLCJzb3J0IiwiaGFzUmVsZXZhbnREYXRhIiwicmVzZXRDaGFuZ2VzIiwiZGVidWciLCJhZGRpdGlvbmFsVmFsdWVIZWxwZXIiLCJjcmVhdGVUcmFuc2llbnRDb250ZXh0c0ZvckFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhIiwicm9vdEJpbmRpbmciLCJnZXRSb290QmluZGluZyIsInN1c3BlbmQiLCJzb3J0QW5kRmlsdGVyTGlzdEJpbmRpbmciLCJjaGFuZ2VQYXJhbWV0ZXJzIiwicmVzdW1lVmFsdWVMaXN0QmluZGluZ0FuZFJlc2V0Q2hhbmdlcyIsInJlcXVlc3RGb3JBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YSIsInZhbHVlSGVscEtleXMiLCJnZXRSZWxldmFudFJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEiLCJnZXRSZWxldmFudFJlY2VudFZhbHVlc0NvbnRleHREYXRhIiwicmVwbGFjZUFsbCIsImdldFJlbGV2YW50T3RoZXJzVmFsdWVzQ29udGV4dERhdGEiLCJmaWx0ZXJzIiwiRmlsdGVyVHlwZSIsIkFwcGxpY2F0aW9uIiwic29ydGVyIiwicmVzdW1lIiwiX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzIiwiY2hlY2tSZWNvbW1lbmRhdGlvbnMiLCJhcmd1bWVudHMiLCJyZWNvbW1lbmRhdGlvblZhbHVlcyIsInJlY2VudFZhbHVlcyIsImNvbnRlbnRNb2RlbCIsImxvY2FsQW5ub3RhdGlvbk1vZGVsIiwiZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwiLCJiaW5kaW5nQ29udGV4dFBhdGgiLCJmaWVsZFBhdGgiLCJpbnB1dFZhbHVlcyIsInR5cGVBaGVhZEZvckZpbHRlcmFibGVDb250ZW50Iiwic2hvd0l0IiwidHlwZUFoZWFkQ29udGVudCIsImdldENvbnRlbnQiLCJmaWx0ZXJWYWx1ZSIsImZpZWxkVGV4dFZhbHVlIiwiZ2V0QWRkaXRpb25hbFZhbHVlIiwiY29uZGl0aW9uRm9yUmVxdWVzdFNob3dDb250YWluZXIiLCJwYXJlbnRDb250cm9sIiwiZmllbGRJZCIsImdldElkIiwiaXNWaXN1YWxGaWx0ZXIiLCJ2YWx1ZUhlbHBUYWJsZSIsImdldFBhcmVudERpYWxvZyIsImlubmVyQ29udGVudCIsImdldERvbVJlZiIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiaWQiLCJnZXRJbml0aWFsRm9jdXMiLCJjaGVja0hpc3RvcnlFbmFibGVkIiwicmVxdWVzdFNob3dDb250YWluZXIiLCJyZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiIsIlJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uIiwiVGFiIiwiVGFwIiwiVHlwaW5nIiwiRmlsdGVyIiwiVmFsdWVIZWxwUmVxdWVzdCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVmFsdWVIZWxwRGVsZWdhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb252ZXJ0ZWRNZXRhZGF0YSwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwRXF1YWxcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IEFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5SW5mbyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0xpc3RSZXBvcnQvRmlsdGVyQmFyXCI7XG5pbXBvcnQgeyBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB0eXBlIHsgRmllbGREYXRhVHlwZSwgVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSB7IElGaWx0ZXJDb250cm9sIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEluT3V0UGFyYW1ldGVyLCBTb3J0ZXJUeXBlLCBWYWx1ZUhlbHBQYXlsb2FkIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyXCI7XG5pbXBvcnQgdHlwZSBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC9tL1RhYmxlXCI7XG5pbXBvcnQgaGlnaGxpZ2h0RE9NRWxlbWVudHMgZnJvbSBcInNhcC9tL2lucHV0VXRpbHMvaGlnaGxpZ2h0RE9NRWxlbWVudHNcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8gfSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBGaWVsZCB9IGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJGaWVsZFwiO1xuaW1wb3J0IHR5cGUgTXVsdGlWYWx1ZUZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL011bHRpVmFsdWVGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IFZhbHVlSGVscERlbGVnYXRlIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscERlbGVnYXRlXCI7XG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbk9iamVjdCB9IGZyb20gXCJzYXAvdWkvbWRjL2NvbmRpdGlvbi9Db25kaXRpb25cIjtcbmltcG9ydCBDb25kaXRpb24gZnJvbSBcInNhcC91aS9tZGMvY29uZGl0aW9uL0NvbmRpdGlvblwiO1xuaW1wb3J0IENvbmRpdGlvblZhbGlkYXRlZCBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9Db25kaXRpb25WYWxpZGF0ZWRcIjtcbmltcG9ydCBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbiBmcm9tIFwic2FwL3VpL21kYy9lbnVtcy9SZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvblwiO1xuaW1wb3J0IHR5cGUgRmllbGRCYXNlIGZyb20gXCJzYXAvdWkvbWRjL2ZpZWxkL0ZpZWxkQmFzZVwiO1xuaW1wb3J0IHR5cGUgRmlsdGVyQmFyQmFzZSBmcm9tIFwic2FwL3VpL21kYy9maWx0ZXJiYXIvRmlsdGVyQmFyQmFzZVwiO1xuaW1wb3J0IFR5cGVNYXAgZnJvbSBcInNhcC91aS9tZGMvb2RhdGEvdjQvVHlwZU1hcFwiO1xuaW1wb3J0IFN0YXRlVXRpbCBmcm9tIFwic2FwL3VpL21kYy9wMTNuL1N0YXRlVXRpbFwiO1xuaW1wb3J0IHR5cGUgTURDUG9wb3ZlciBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvUG9wb3ZlclwiO1xuaW1wb3J0IHR5cGUgQ29udGFpbmVyIGZyb20gXCJzYXAvdWkvbWRjL3ZhbHVlaGVscC9iYXNlL0NvbnRhaW5lclwiO1xuaW1wb3J0IHR5cGUgQ29udGVudCBmcm9tIFwic2FwL3VpL21kYy92YWx1ZWhlbHAvYmFzZS9Db250ZW50XCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJhYmxlTGlzdENvbnRlbnQgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvRmlsdGVyYWJsZUxpc3RDb250ZW50XCI7XG5pbXBvcnQgdHlwZSBNVGFibGUgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2NvbnRlbnQvTVRhYmxlXCI7XG5pbXBvcnQgRmlsdGVyVHlwZSBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclR5cGVcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZSB9IGZyb20gXCIuLi9maWVsZC9GaWVsZEJhc2VEZWxlZ2F0ZVwiO1xuaW1wb3J0IHR5cGUgeyBBZGRpdGlvbmFsVmFsdWVUeXBlLCBCaW5kaW5nSW5mb1BhcmFtZXRlcnMgfSBmcm9tIFwiLi4vaW50ZXJuYWwvdmFsdWVoZWxwL0FkZGl0aW9uYWxWYWx1ZUhlbHBlclwiO1xuaW1wb3J0IHsgQWRkaXRpb25hbFZhbHVlR3JvdXBLZXksIGFkZGl0aW9uYWxWYWx1ZUhlbHBlciB9IGZyb20gXCIuLi9pbnRlcm5hbC92YWx1ZWhlbHAvQWRkaXRpb25hbFZhbHVlSGVscGVyXCI7XG5pbXBvcnQgdHlwZSBWYWx1ZUhlbHBEaWFsb2cgZnJvbSBcInNhcC91aS9tZGMvdmFsdWVoZWxwL2Jhc2UvVmFsdWVIZWxwRGlhbG9nXCI7XG5cbmNvbnN0IEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyID0gXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLkZpbHRlckJhclwiO1xuY29uc3QgQW5ub3RhdGlvbklzRGlnaXRTZXF1ZW5jZSA9IFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5Jc0RpZ2l0U2VxdWVuY2VcIjtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uT2JqZWN0TWFwID0gUmVjb3JkPHN0cmluZywgQ29uZGl0aW9uT2JqZWN0W10+O1xuXG5leHBvcnQgdHlwZSBFeHRlcm5hbFN0YXRlVHlwZSA9IHtcblx0aXRlbXM6IHsgbmFtZTogc3RyaW5nIH1bXTtcblx0ZmlsdGVyOiBDb25kaXRpb25PYmplY3RNYXA7XG59O1xuXG50eXBlIFNlbGVjdGlvbkNoYW5nZSA9IHtcblx0Y29uZGl0aW9uczogb2JqZWN0W107XG5cdHR5cGU6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIENvbmRpdGlvblBheWxvYWRNYXAgPSBSZWNvcmQ8c3RyaW5nLCBDb25kaXRpb25QYXlsb2FkVHlwZVtdPjtcblxudHlwZSBNRENDb25maWdUeXBlID0ge1xuXHR2YWx1ZTogdW5rbm93bjtcblx0cGFyc2VkVmFsdWU6IHVua25vd247XG5cdGNvbnRleHQ6IG9iamVjdDtcblx0Y29udHJvbDogQ29udHJvbDsgLy8gSW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgY29udHJvbFxuXHRiaW5kaW5nQ29udGV4dDogT0RhdGFWNENvbnRleHQ7XG5cdGNoZWNrS2V5OiBib29sZWFuO1xuXHRjaGVja0Rlc2NyaXB0aW9uOiBib29sZWFuO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbih7fSwgVmFsdWVIZWxwRGVsZWdhdGUsIHtcblx0YXBpVmVyc2lvbjogMixcblx0dXBkYXRlQmluZGluZ0RvbmVQcm9taXNlczogbmV3IFdlYWtNYXA8b2JqZWN0LCBQcm9taXNlPHZvaWQ+PigpLFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gc3VwcG9ydHMgJFNlYXJjaC5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBDb250ZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIF9saXN0QmluZGluZ1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmICRzZWFyY2ggaXMgc3VwcG9ydGVkXG5cdCAqL1xuXHRpc1NlYXJjaFN1cHBvcnRlZDogZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBGaWx0ZXJhYmxlTGlzdENvbnRlbnQsIF9saXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZykge1xuXHRcdHJldHVybiAhIWNvbnRlbnQuZGF0YShcInNlYXJjaFN1cHBvcnRlZFwiKTtcblx0fSxcblxuXHQvKlxuXHQgKiBBZGp1c3RhYmxlIGZpbHRlcmluZyBmb3IgbGlzdC1iYXNlZCBjb250ZW50cy5cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCByZXF1ZXN0aW5nIGNvbmRpdGlvbnMgY29uZmlndXJhdGlvblxuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKi9cblx0dXBkYXRlQmluZGluZ0luZm86IGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogRmlsdGVyYWJsZUxpc3RDb250ZW50LCBiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8pIHtcblx0XHRWYWx1ZUhlbHBEZWxlZ2F0ZS51cGRhdGVCaW5kaW5nSW5mbyh2YWx1ZUhlbHAsIGNvbnRlbnQsIGJpbmRpbmdJbmZvKTtcblxuXHRcdGlmIChjb250ZW50LmRhdGEoXCJzZWFyY2hTdXBwb3J0ZWRcIikpIHtcblx0XHRcdGNvbnN0IHNlYXJjaCA9IGNvbnRlbnQuZ2V0RmlsdGVyVmFsdWUoKTtcblx0XHRcdGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBDb21tb25VdGlscy5ub3JtYWxpemVTZWFyY2hUZXJtKHNlYXJjaCk7IC8vIGFkanVzdFNlYXJjaFxuXG5cdFx0XHRpZiAoYmluZGluZ0luZm8ucGFyYW1ldGVycykge1xuXHRcdFx0XHQoYmluZGluZ0luZm8ucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuJHNlYXJjaCA9IG5vcm1hbGl6ZWRTZWFyY2ggfHwgdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogR2V0IHRoZSB2YWx1ZSBoZWxwIGhpc3Rvcnkgc2VydmljZSBmcm9tIHRoZSBhcHAgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIHRvIGZpbmQgdGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2Vcblx0ICovXG5cdF9nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZShjb250cm9sOiBDb250cm9sKTogVmFsdWVIZWxwSGlzdG9yeVNlcnZpY2Uge1xuXHRcdC8vIEZvciBzb21lIHJlYXNvbiB3ZSBjYW5ub3QgdXNlIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChjb250cm9sKSBoZXJlIGJ1dCBuZWVkIHRvIGdldCB0aGUgVmlldyBmaXJzdC5cblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQoQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyhjb250cm9sKSk7XG5cdFx0cmV0dXJuIGFwcENvbXBvbmVudC5nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZSgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGhpc3RvcnkgZGF0YSBmb3IgdGhlIHZhbHVlIGxpc3QgcHJvcGVydHkgZnJvbSB0aGUgaGlzdG9yeSBzZXJ2aWNlLlxuXHQgKiBObyBoaXN0b3J5IGRhdGEgaXMgZmV0Y2hlZCBmb3IgZmllbGRzIGFubm90YXRlZCB3aXRoIElzUG90ZW50aWFsbHlTZW5zaXRpdmUuXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIFZhbHVlSGVscFxuXHQgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIHRvIGZpbmQgdGhlIGFwcCBjb21wb25lbnQsIGUuZy4gdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgdG8gYSBsaXN0IG9mIGZpZWxkIGRhdGEgZm9yIHRoZSB2YWx1ZSBsaXN0IHByb3BlcnR5XG5cdCAqL1xuXHRfZ2V0SGlzdG9yeURhdGE6IGFzeW5jIGZ1bmN0aW9uIChwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLCBjb250cm9sOiBDb250cm9sKTogUHJvbWlzZTxGaWVsZERhdGFUeXBlW10+IHtcblx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Py5lbmFibGVkICYmIHBheWxvYWQuaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSAhPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgdmFsdWVMaXN0SGlzdG9yeVNlcnZpY2UgPSB0aGlzLl9nZXRWYWx1ZUhlbHBIaXN0b3J5U2VydmljZShjb250cm9sKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGZpZWxkRGF0YSA9IGF3YWl0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlLmdldEZpZWxkRGF0YShwYXlsb2FkLnByb3BlcnR5UGF0aCArIFwiL1wiICsgcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXIpO1xuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkuZGF0YSA9IGZpZWxkRGF0YTtcblx0XHRcdFx0cmV0dXJuIGZpZWxkRGF0YTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXQgdGhlIGhpc3RvcnkgZGF0YSBmb3IgdGhlIHZhbHVlIGxpc3QgcHJvcGVydHkgaW4gdGhlIGhpc3Rvcnkgc2VydmljZS5cblx0ICogTm8gaGlzdG9yeSBkYXRhIGlzIHN0b3JlZCBmb3IgZmllbGRzIGFubm90YXRlZCB3aXRoIElzUG90ZW50aWFsbHlTZW5zaXRpdmUuXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIFZhbHVlSGVscFxuXHQgKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUgY29uZGl0aW9uIG9iamVjdCB0byBnZXQgdGhlIHNlbGVjdGVkIGRhdGEgZnJvbVxuXHQgKiBAcGFyYW0gY29udHJvbCBDb250cm9sIHRvIGZpbmQgdGhlIGFwcCBjb21wb25lbnQsIGUuZy4gdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgd2hlbiB0aGUgZGF0YSBpcyBzZXQgaW4gdGhlIGhpc3Rvcnkgc2VydmljZVxuXHQgKi9cblx0X3NldEhpc3RvcnlEYXRhOiBhc3luYyBmdW5jdGlvbiAocGF5bG9hZDogVmFsdWVIZWxwUGF5bG9hZCwgY29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W10sIGNvbnRyb2w6IENvbnRyb2wpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAocGF5bG9hZC5oaXN0b3J5Py5lbmFibGVkICYmIHBheWxvYWQuaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSAhPT0gdHJ1ZSAmJiBjb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgdmFsdWVMaXN0UHJvcGVydHkgPSB0aGlzLl9nZXRWYWx1ZUxpc3RQcm9wZXJ0eUZyb21QYXlsb2FkUXVhbGlmaWVyKHBheWxvYWQpO1xuXHRcdFx0aWYgKHZhbHVlTGlzdFByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbnN0IGRhdGE6IEZpZWxkRGF0YVR5cGVbXSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdFx0XHRpZiAocGF5bG9hZC5pc1VuaXRWYWx1ZUhlbHAgfHwgY29uZGl0aW9uLnZhbGlkYXRlZCA9PT0gQ29uZGl0aW9uVmFsaWRhdGVkLlZhbGlkYXRlZCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbik/LlswXTtcblx0XHRcdFx0XHRcdGlmIChjb25kaXRpb25QYXlsb2FkTWFwKSB7XG5cdFx0XHRcdFx0XHRcdGRhdGEucHVzaCh0aGlzLmNvbnZlcnRDb25kaXRpb25QYXlsb2FkVG9OZXN0ZWRPYmplY3QoY29uZGl0aW9uUGF5bG9hZE1hcCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChkYXRhLmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IHZhbHVlTGlzdEhpc3RvcnlTZXJ2aWNlID0gdGhpcy5fZ2V0VmFsdWVIZWxwSGlzdG9yeVNlcnZpY2UoY29udHJvbCk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdmFsdWVMaXN0SGlzdG9yeVNlcnZpY2Uuc2V0RmllbGREYXRhKHBheWxvYWQucHJvcGVydHlQYXRoICsgXCIvXCIgKyBwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllciwgZGF0YSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENvbnZlcnRpbmcgdGhlIGNvbmRpdGlvbiBwYXlsb2FkIHRvIGEgbmVzdGVkIG9iamVjdC5cblx0ICogQHBhcmFtIGNvbmRpdGlvblBheWxvYWQgVGhlIGNvbmRpdGlvbiBwYXlsb2FkIG9iamVjdCB0byBiZSBjb252ZXJ0ZWRcblx0ICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBuZXN0ZWQgb2JqZWN0XG5cdCAqL1xuXHRjb252ZXJ0Q29uZGl0aW9uUGF5bG9hZFRvTmVzdGVkT2JqZWN0OiBmdW5jdGlvbiAoY29uZGl0aW9uUGF5bG9hZDogQ29uZGl0aW9uUGF5bG9hZFR5cGUpOiBDb25kaXRpb25QYXlsb2FkVHlwZSB7XG5cdFx0Y29uc3QgbmVzdGVkT2JqZWN0OiBDb25kaXRpb25QYXlsb2FkVHlwZSA9IHt9O1xuXHRcdGZvciAoY29uc3Qga2V5IGluIGNvbmRpdGlvblBheWxvYWQpIHtcblx0XHRcdE9iamVjdFBhdGguc2V0KGtleS5zcGxpdChcIi9cIiksIGNvbmRpdGlvblBheWxvYWRba2V5XSwgbmVzdGVkT2JqZWN0KTtcblx0XHR9XG5cdFx0cmV0dXJuIG5lc3RlZE9iamVjdDtcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2sgaWYgdmFsdWUgaXMgZGlnaXQgc2VxdWVuY2Ugd2l0aCBubyB2YWx1ZS5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVja1xuXHQgKiBAcGFyYW0gaXNEaWdpdFNlcXVlbmNlIEluZGljYXRlcyBpZiB0aGUgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBkaWdpdCBzZXF1ZW5jZVxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBkaWdpdCBzZXF1ZW5jZSwgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRfaXNFbXB0eURpZ2l0U2VxdWVuY2U6IGZ1bmN0aW9uICh2YWx1ZTogVmFsdWUsIGlzRGlnaXRTZXF1ZW5jZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGxldCBpc0VtcHR5RGlnaXRTZXF1ZW5jZSA9IGZhbHNlO1xuXHRcdGlmIChpc0RpZ2l0U2VxdWVuY2UpIHtcblx0XHRcdGlzRW1wdHlEaWdpdFNlcXVlbmNlID1cblx0XHRcdFx0dHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiXG5cdFx0XHRcdFx0PyB2YWx1ZS5zcGxpdChcIlwiKS5ldmVyeSgoY2hhcikgPT4gY2hhciA9PT0gXCIwXCIpID8/IHZhbHVlID09PSBcIlwiXG5cdFx0XHRcdFx0OiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAwO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNFbXB0eURpZ2l0U2VxdWVuY2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBmaWVsZCBpcyByZWNvbW1lbmRhdGlvbiByZWxldmFudCBhbmQgY2FsbHMgZWl0aGVyIF91cGRhdGVCaW5kaW5nIG9yIF91cGRhdGVCaW5kaW5nRm9yUmVjb21tZW5kYXRpb25zLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGJpbmRpbmdJbmZvIFRoZSBiaW5kaW5nIGluZm8gb2JqZWN0IHRvIGJlIHVzZWQgdG8gYmluZCB0aGUgbGlzdCB0byB0aGUgbW9kZWxcblx0ICogQHBhcmFtIGNvbnRlbnQgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICovXG5cdHVwZGF0ZUJpbmRpbmc6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRiaW5kaW5nSW5mbzogQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8sXG5cdFx0Y29udGVudDogTVRhYmxlXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIGxpc3RCaW5kaW5nIHNob3VsZCBiZSBvZiB0eXBlIE9EYXRhTGlzdEJpbmRpbmdcblx0XHRpZiAoIWxpc3RCaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly9XZSBmZXRjaCB0aGUgdmFsdWVsaXN0IHByb3BlcnR5IGZyb20gdGhlIHBheWxvYWQgdG8gbWFrZSBzdXJlIHdlIHBhc3MgdGhlIHJpZ2h0IHByb3BlcnR5IHdoaWxlIG1ha2luZyBhIGNhbGwgb24gdmFsdWVsaXN0IGVudGl0eSBzZXRcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGlmIChjb250ZW50LmlzVHlwZWFoZWFkKCkpIHtcblx0XHRcdGxldCB1cGRhdGVCaW5kaW5nRG9uZVByb21pc2VSZXNvbHZlOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIGNyZWF0ZSBhIHByb21pc2UgdG8gbWFrZSBzdXJlIGNoZWNrTGlzdEJpbmRpbmdQZW5kaW5nIGlzIG9ubHkgY29tcGxldGVkIG9uY2UgdGhpcyBwcm9taXNlIGlzIHJlc29sdmVkXG5cdFx0XHRjb25zdCBuZXdQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0XHRcdFx0dXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgZXhpc3RpbmdVcGRhdGVCaW5kaW5nRG9uZVByb21pc2UgPSB0aGlzLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXMuZ2V0KGxpc3RCaW5kaW5nKTtcblx0XHRcdC8vYnVpbGQgYSBwcm9taXNlIGNoYWluIGlmIG5lY2Vzc2FyeVxuXHRcdFx0dGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLnNldChcblx0XHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRcdGV4aXN0aW5nVXBkYXRlQmluZGluZ0RvbmVQcm9taXNlID8gZXhpc3RpbmdVcGRhdGVCaW5kaW5nRG9uZVByb21pc2UudGhlbihhc3luYyAoKSA9PiBuZXdQcm9taXNlKSA6IG5ld1Byb21pc2Vcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHZhbHVlTGlzdFByb3BlcnR5ID0gdGhpcy5fZ2V0VmFsdWVMaXN0UHJvcGVydHlGcm9tUGF5bG9hZFF1YWxpZmllcihwYXlsb2FkKTtcblx0XHRcdGNvbnN0IGZpZWxkID0gY29udGVudC5nZXRDb250cm9sKCkgYXMgRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZDtcblx0XHRcdGNvbnN0IGlzRmlsdGVyRmllbGRPck11bHRpVmFsdWVkRmllbGQgPVxuXHRcdFx0XHRmaWVsZC5pc0E8RmlsdGVyRmllbGQ+KFwic2FwLnVpLm1kYy5GaWx0ZXJGaWVsZFwiKSB8fCBmaWVsZC5pc0E8TXVsdGlWYWx1ZUZpZWxkPihcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpO1xuXHRcdFx0Y29uc3QgZmllbGRWYWx1ZSA9ICFpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkICYmIGZpZWxkLmdldFZhbHVlKCk7XG5cdFx0XHRjb25zdCBhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10gPSBbXTtcblxuXHRcdFx0Ly8gV2UgbmVlZCB0byBzaG93IHJlY29tbWVuZGF0aW9ucyBvbmx5IHdoZW4gdGhlIGZpZWxkIGhhcyBlbXB0eSB2YWx1ZSBvciB3aGVuIHVzZXIgaXMgdHlwaW5nIGEgdmFsdWUuIE90aGVyIHRpbWVzIHdlIHNob3VsZCBub3Qgc2hvdyByZWNvbW1lbmRhdGlvbnMuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGUgZmllbGQgaGFzIGFueSBwZW5kaW5nIHVzZXIgaW5wdXQgYW5kIGlmIGl0IGlzIHRoZW4gd2Ugc2hvdyByZWNvbW1lbmRhdGlvbnMgaWYgYW55LlxuXHRcdFx0Y29uc3QgaXNEaWdpdFNlcXVlbmNlID1cblx0XHRcdFx0KGZpZWxkLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KGAke3BheWxvYWQucHJvcGVydHlQYXRofSR7QW5ub3RhdGlvbklzRGlnaXRTZXF1ZW5jZX1gKSA/PyBmYWxzZTtcblx0XHRcdGlmICghZmllbGRWYWx1ZSB8fCBmaWVsZC5oYXNQZW5kaW5nVXNlcklucHV0KCkgfHwgdGhpcy5faXNFbXB0eURpZ2l0U2VxdWVuY2UoZmllbGRWYWx1ZSwgaXNEaWdpdFNlcXVlbmNlKSkge1xuXHRcdFx0XHQvL2dldCB0aGUgcmVjb21tZW5kYXRpb24gZGF0YSBmcm9tIHRoZSBpbnRlcm5hbCBtb2RlbFxuXHRcdFx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKGNvbnRlbnQsIHBheWxvYWQpO1xuXG5cdFx0XHRcdC8vaWYgdGhlcmUgYXJlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9ucyB0aGVuIGNyZWF0ZSBhZGRpdGlvbmFsIHZhbHVlIHN0cnVjdHVyZSBhbmQgY2FsbCBfdXBkYXRlQmluZGluZ0ZvclJlY29tbWVuZGF0aW9uc1xuXHRcdFx0XHRpZiAodmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMucHVzaCh7IHByb3BlcnR5UGF0aDogdmFsdWVMaXN0UHJvcGVydHksIHZhbHVlcywgZ3JvdXBLZXk6IEFkZGl0aW9uYWxWYWx1ZUdyb3VwS2V5LnJlY29tbWVuZGF0aW9uIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHRhYmxlID0gY29udGVudC5nZXRUYWJsZSgpO1xuXHRcdFx0Y29uc3Qgc29ydGVyc0N1c3RvbURhdGEgPSB0YWJsZS5nZXRDdXN0b21EYXRhKCkuZmlsdGVyKChkYXRhKSA9PiBkYXRhLmdldEtleSgpID09PSBcInNvcnRlcnNcIik7XG5cdFx0XHRsZXQgc29ydGVyczogU29ydGVyVHlwZVtdID0gW107XG5cdFx0XHRpZiAoc29ydGVyc0N1c3RvbURhdGEubGVuZ3RoKSBzb3J0ZXJzID0gc29ydGVyc0N1c3RvbURhdGFbMF0uZ2V0VmFsdWUoKS5zb3J0ZXJzO1xuXG5cdFx0XHRhd2FpdCB0aGlzLl91cGRhdGVCaW5kaW5nV2l0aFRyYW5zaWVudENvbnRleHRzKFxuXHRcdFx0XHRwYXlsb2FkLFxuXHRcdFx0XHRsaXN0QmluZGluZyxcblx0XHRcdFx0YmluZGluZ0luZm8sXG5cdFx0XHRcdGFkZGl0aW9uYWxWYWx1ZXMsXG5cdFx0XHRcdHZhbHVlTGlzdFByb3BlcnR5LFxuXHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0c29ydGVycyxcblx0XHRcdFx0dGFibGVcblx0XHRcdCk7XG5cdFx0XHRpZiAodXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSkge1xuXHRcdFx0XHQvL3Jlc29sdmUgdGhlIHByb21pc2UgYXMgZXZlcnl0aGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0dXBkYXRlQmluZGluZ0RvbmVQcm9taXNlUmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvL2NhbGwgX3VwZGF0ZUJpbmRpbmcgaWYgdGhlcmUgYXJlIG5vIHJlbGV2YW50IHJlY29tbWVuZGF0aW9uc1xuXHRcdFx0dGhpcy5fdXBkYXRlQmluZGluZyhsaXN0QmluZGluZywgYmluZGluZ0luZm8pO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIEV4ZWN1dGVzIGEgZmlsdGVyIGluIGEgPGNvZGU+TGlzdEJpbmRpbmc8L2NvZGU+LlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBMaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIHJlcXVlc3RlZEl0ZW1zIE51bWJlciBvZiByZXF1ZXN0ZWQgaXRlbXNcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGlmIHNlYXJjaCBpcyBleGVjdXRlZFxuXHQgKi9cblx0ZXhlY3V0ZUZpbHRlcjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXM6IG51bWJlcikge1xuXHRcdGxpc3RCaW5kaW5nLmdldENvbnRleHRzKDAsIHJlcXVlc3RlZEl0ZW1zKTtcblxuXHRcdGF3YWl0IHRoaXMuY2hlY2tMaXN0QmluZGluZ1BlbmRpbmcodmFsdWVIZWxwLCBsaXN0QmluZGluZywgcmVxdWVzdGVkSXRlbXMpO1xuXHRcdHJldHVybiBsaXN0QmluZGluZztcblx0fSxcblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gaXMgd2FpdGluZyBmb3IgYW4gdXBkYXRlLlxuXHQgKiBBcyBsb25nIGFzIHRoZSBjb250ZXh0IGhhcyBub3QgYmVlbiBzZXQgZm9yIDxjb2RlPkxpc3RCaW5kaW5nPC9jb2RlPixcblx0ICogPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBuZWVkcyB0byB3YWl0LlxuXHQgKiBAcGFyYW0gX3ZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdEJpbmRpbmcgdG8gY2hlY2tcblx0ICogQHBhcmFtIHJlcXVlc3RlZEl0ZW1zIE51bWJlciBvZiByZXF1ZXN0ZWQgaXRlbXNcblx0ICogQHJldHVybnMgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9uY2UgTGlzdEJpbmRpbmcgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKi9cblx0Y2hlY2tMaXN0QmluZGluZ1BlbmRpbmc6IGFzeW5jIGZ1bmN0aW9uIChfdmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkLCByZXF1ZXN0ZWRJdGVtczogbnVtYmVyKSB7XG5cdFx0bGV0IGlzUGVuZGluZyA9IGZhbHNlO1xuXHRcdGlmIChsaXN0QmluZGluZyAmJiB0aGlzLnVwZGF0ZUJpbmRpbmdEb25lUHJvbWlzZXMuaGFzKGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0YXdhaXQgdGhpcy51cGRhdGVCaW5kaW5nRG9uZVByb21pc2VzLmdldChsaXN0QmluZGluZyk7XG5cdFx0fVxuXHRcdGlmIChsaXN0QmluZGluZyAmJiAhbGlzdEJpbmRpbmcuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgY29udGV4dHMgPSBhd2FpdCBsaXN0QmluZGluZy5yZXF1ZXN0Q29udGV4dHMoMCwgcmVxdWVzdGVkSXRlbXMpO1xuXHRcdFx0XHRpc1BlbmRpbmcgPSBjb250ZXh0cy5sZW5ndGggPT09IDA7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRpZiAoZXJyb3IgJiYgKGVycm9yIGFzIHsgY2FuY2VsZWQ/OiBib29sZWFuIH0pPy5jYW5jZWxlZCkge1xuXHRcdFx0XHRcdHJldHVybiBpc1BlbmRpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpc1BlbmRpbmc7XG5cdH0sXG5cblx0Z2V0VHlwZU1hcDogZnVuY3Rpb24gKF92YWx1ZUhlbHA6IFZhbHVlSGVscCkge1xuXHRcdHJldHVybiBUeXBlTWFwO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgY29udGVudCBvZiB0aGUgdmFsdWUgaGVscC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgaGVscCBpcyBvcGVuZWQgb3IgYSBrZXkgb3IgZGVzY3JpcHRpb24gaXMgcmVxdWVzdGVkLlxuXHQgKlxuXHQgKiBTbywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBoZWxwIGNvbnRlbnQgdXNlZCwgYWxsIGNvbnRlbnQgY29udHJvbHMgYW5kIGRhdGEgbmVlZCB0byBiZSBhc3NpZ25lZC5cblx0ICogT25jZSB0aGV5IGFyZSBhc3NpZ25lZCBhbmQgdGhlIGRhdGEgaXMgc2V0LCB0aGUgcmV0dXJuZWQgPGNvZGU+UHJvbWlzZTwvY29kZT4gbmVlZHMgdG8gYmUgcmVzb2x2ZWQuXG5cdCAqIE9ubHkgdGhlbiBkb2VzIHRoZSB2YWx1ZSBoZWxwIGNvbnRpbnVlIG9wZW5pbmcgb3IgcmVhZGluZyBkYXRhLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSA8Y29kZT5WYWx1ZUhlbHA8L2NvZGU+IGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250YWluZXIgQ29udGFpbmVyIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBjb250ZW50SWQgSWQgb2YgdGhlIGNvbnRlbnQgc2hvd24gYWZ0ZXIgdGhpcyBjYWxsIHRvIHJldHJpZXZlQ29udGVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgaWYgYWxsIGNvbnRlbnQgaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRyZXRyaWV2ZUNvbnRlbnQ6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGFpbmVyOiBDb250YWluZXIsIGNvbnRlbnRJZDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRyZXR1cm4gVmFsdWVMaXN0SGVscGVyLnNob3dWYWx1ZUxpc3QocGF5bG9hZCwgY29udGFpbmVyLCBjb250ZW50SWQpO1xuXHR9LFxuXG5cdF9nZXRDb25kaXRpb25QYXlsb2FkTGlzdDogZnVuY3Rpb24gKGNvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0KSB7XG5cdFx0Y29uc3QgY29uZGl0aW9uUGF5bG9hZE1hcCA9IChjb25kaXRpb24ucGF5bG9hZCB8fCB7fSkgYXMgQ29uZGl0aW9uUGF5bG9hZE1hcCxcblx0XHRcdHZhbHVlSGVscFF1YWxpZmllcnMgPSBPYmplY3Qua2V5cyhjb25kaXRpb25QYXlsb2FkTWFwKSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdmFsdWVIZWxwUXVhbGlmaWVycy5sZW5ndGggPyBjb25kaXRpb25QYXlsb2FkTWFwW3ZhbHVlSGVscFF1YWxpZmllcnNbMF1dIDogW107XG5cblx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZExpc3Q7XG5cdH0sXG5cdC8qKlxuXHQgKiBSZXR1cm5zIFZhbHVlTGlzdFByb3BlcnR5IGZyb20gUGF5bG9hZCBiYXNlZCBvbiBkYXRhIGZyb20gcGF5bG9hZCBrZXlzIGFuZCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGZvciBkZWxlZ2F0ZVxuXHQgKiBAcmV0dXJucyBWYWx1ZUxpc3RQcm9wZXJ0eVxuXHQgKi9cblx0X2dldFZhbHVlTGlzdFByb3BlcnR5RnJvbVBheWxvYWRRdWFsaWZpZXI6IGZ1bmN0aW9uIChwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXT8udmhQYXJhbWV0ZXJzIHx8IFtdO1xuXHRcdGNvbnN0IGtleXMgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdPy52aEtleXMgfHwgW107XG5cdFx0Y29uc3QgcHJvcGVydHlLZXlQYXRoID0gcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoO1xuXHRcdGxldCBmaWx0ZXJlZEtleXM6IHN0cmluZ1tdID0gWy4uLmtleXNdO1xuXHRcdGNvbnN0IGhlbHBQYXRoczogc3RyaW5nW10gPSBbXTtcblx0XHRpZiAocGFyYW1zLmxlbmd0aCA+IDApIHtcblx0XHRcdC8vY3JlYXRlIGhlbHBQYXRocyBhcnJheSB3aGljaCB3aWxsIG9ubHkgY29uc2lzdCBvZiBwYXJhbXMgaGVscHBhdGhcblx0XHRcdHBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbTogSW5PdXRQYXJhbWV0ZXIpIHtcblx0XHRcdFx0aGVscFBhdGhzLnB1c2gocGFyYW0uaGVscFBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0XHQvL2ZpbHRlciB0aGUga2V5cyBiYXNlZCBvbiBoZWxwUGF0aHMuIElmIGtleSBpcyBub3QgcHJlc2VudCBpbiBoZWxwUGF0aCB0aGVuIGl0IGlzIHZhbHVlbGlzdHByb3BlcnR5XG5cdFx0XHRmaWx0ZXJlZEtleXMgPSBrZXlzLmZpbHRlcigoa2V5OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0cmV0dXJuICFoZWxwUGF0aHMuaW5jbHVkZXMoa2V5KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIGZyb20gZmlsdGVyZWRLZXlzIHJldHVybiB0aGUga2V5IHRoYXQgbWF0Y2hlcyB0aGUgcHJvcGVydHkgbmFtZVxuXHRcdHJldHVybiBwcm9wZXJ0eUtleVBhdGggJiYgZmlsdGVyZWRLZXlzLmluY2x1ZGVzKHByb3BlcnR5S2V5UGF0aCkgPyBwcm9wZXJ0eUtleVBhdGggOiBcIlwiO1xuXHR9LFxuXG5cdF9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVG9GaWx0ZXJCYXI6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXSxcblx0XHRvdXRQYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdGZpbHRlckJhcjogRmlsdGVyQmFyLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsXG5cdFx0bGlzdFJlcG9ydEZpbHRlckJhcjogRmlsdGVyQmFyXG5cdCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzdGF0ZTogRXh0ZXJuYWxTdGF0ZVR5cGUgPSBhd2FpdCBTdGF0ZVV0aWwucmV0cmlldmVFeHRlcm5hbFN0YXRlKGxpc3RSZXBvcnRGaWx0ZXJCYXIpO1xuXHRcdFx0Y29uc3Qgc3RhdGVJdGVtcyA9IHN0YXRlLml0ZW1zOyAvLyBWaXNpYmxlIEZpbHRlckl0ZW1zIGluIHRoZSBMUi1GaWx0ZXJCYXJcblx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnRpZXMgPSBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJQcm9wZXJ0eUluZm8oZmlsdGVyQmFyIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wpO1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gZmlsdGVyQmFyLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgb25seSBpZiB0aGUgZmlsdGVyIGZpZWxkIGlzIHZpc2libGUgaW4gdGhlIExSIGZpbHRlcmJhclxuXHRcdFx0Ly8gTFIgRmlsdGVyQmFyIG9yIExSIEFkYXB0RmlsdGVyXG5cdFx0XHRmb3IgKGNvbnN0IG91dFBhcmFtZXRlciBvZiBvdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gdGhpcy5fZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aChcblx0XHRcdFx0XHRvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0cGF5bG9hZC5wcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0bWV0YU1vZGVsLFxuXHRcdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdFx0KTtcblx0XHRcdFx0aWYgKGZpbHRlckJhclByb3BlcnR5ICYmIHN0YXRlSXRlbXM/LmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmFtZSA9PT0gZmlsdGVyQmFyUHJvcGVydHkubmFtZSkpIHtcblx0XHRcdFx0XHQvKiBSZXNldCB0aGUgY29uZGl0aW9ucyBiZWZvcmUgY3JlYXRlIG5ldyBjb25kaXRpb25zIG90aGVyd2lzZSBpdCBnZXRzIG5vdCB1cGRhdGVkICovXG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uUGF0aCA9IGZpbHRlckJhclByb3BlcnR5LmNvbmRpdGlvblBhdGggYXMgc3RyaW5nO1xuXHRcdFx0XHRcdHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXT8uZm9yRWFjaCgoY29uZGl0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25kaXRpb24uZmlsdGVyZWQgPSBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gUHJvcGFnYXRlIE9VVCBwYXJhbWV0ZXIgZm9yIGVhY2ggY29uZGl0aW9uc1xuXHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTGlzdCA9IHRoaXMuX2dldENvbmRpdGlvblBheWxvYWRMaXN0KGNvbmRpdGlvbik7XG5cdFx0XHRcdGZvciAoY29uc3Qgb3V0UGFyYW1ldGVyIG9mIG91dFBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJCYXJQcm9wZXJ0eSA9IHRoaXMuX2ZpbmRGaWx0ZXJCYXJQcm9wZXJ0eUJ5QW5ub3RhdGlvblBhdGgoXG5cdFx0XHRcdFx0XHRvdXRQYXJhbWV0ZXIsXG5cdFx0XHRcdFx0XHRwYXlsb2FkLnByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdG1ldGFNb2RlbCxcblx0XHRcdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdC8vIFByb3BhZ2F0ZSBPVVQgcGFyYW1ldGVyIG9ubHkgaWYgdGhlIGZpbHRlciBmaWVsZCBpcyB2aXNpYmxlIGluIHRoZSBMUiBmaWx0ZXJiYXJcblx0XHRcdFx0XHQvLyBMUiBGaWx0ZXJCYXIgb3IgTFIgQWRhcHRGaWx0ZXJcblx0XHRcdFx0XHRpZiAoZmlsdGVyQmFyUHJvcGVydHkgJiYgc3RhdGVJdGVtcz8uZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJCYXJQcm9wZXJ0eS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb25QYXlsb2FkIG9mIGNvbmRpdGlvblBheWxvYWRMaXN0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXG5cdFx0XHRcdFx0XHRcdFx0XCJFUVwiLFxuXHRcdFx0XHRcdFx0XHRcdFtjb25kaXRpb25QYXlsb2FkW291dFBhcmFtZXRlci5oZWxwUGF0aF1dLFxuXHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBhdGggPSBmaWx0ZXJCYXJQcm9wZXJ0eS5jb25kaXRpb25QYXRoIGFzIHN0cmluZztcblx0XHRcdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uQWxyZWFkeUV4aXN0cyA9IHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXT8uZmluZCgodGVzdENvbmRpdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSB0ZXN0Q29uZGl0aW9uLmZpbHRlcmVkO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChkZWVwRXF1YWwodGVzdENvbmRpdGlvbiwgbmV3Q29uZGl0aW9uKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdC8vIHJlc2V0IGZpbHRlcmVkIHRvIGZhbHNlXG5cdFx0XHRcdFx0XHRcdFx0dGVzdENvbmRpdGlvbi5maWx0ZXJlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmICghY29uZGl0aW9uQWxyZWFkeUV4aXN0cykge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLmZpbHRlcltjb25kaXRpb25QYXRoXSB8fD0gW107XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUuZmlsdGVyW2NvbmRpdGlvblBhdGhdLnB1c2gobmV3Q29uZGl0aW9uKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gQXBwbHkgdG8gdGhlIHBhcmVudCBvZiB0aGUgRmlsdGVyRmllbGRcblx0XHRcdFN0YXRlVXRpbC5hcHBseUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyLCBzdGF0ZSk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuXHRcdFx0TG9nLmVycm9yKGBWYWx1ZUhlbHBEZWxlZ2F0ZTogJHttZXNzYWdlfWApO1xuXHRcdH1cblx0fSxcblxuXHRfZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aDogZnVuY3Rpb24gKFxuXHRcdG91dFBhcmFtZXRlcjogSW5PdXRQYXJhbWV0ZXIsXG5cdFx0cHJvcGVydHlQYXRoOiBzdHJpbmcsXG5cdFx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0XHRmaWx0ZXJCYXJQcm9wZXJ0aWVzOiBQcm9wZXJ0eUluZm9bXVxuXHQpIHtcblx0XHRjb25zdCBjb250ZXh0UGF0aCA9IGAvJHtwcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpWzFdfWA7XG5cdFx0Y29uc3QgZmlsdGVyVGFyZ2V0ID0gb3V0UGFyYW1ldGVyLnNvdXJjZS5zcGxpdChcImNvbmRpdGlvbnMvXCIpLnBvcCgpIHx8IFwiXCI7XG5cdFx0Y29uc3QgbGFzdEluZGV4ID0gcHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRjb25zdCBmaWx0ZXJUYXJnZXRQYXRoID0gbGFzdEluZGV4ID4gMCA/IGAke3Byb3BlcnR5UGF0aC5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KX0vJHtmaWx0ZXJUYXJnZXR9YCA6IGZpbHRlclRhcmdldDtcblx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aCA9IG1ldGFNb2RlbD8uZ2V0UmVkdWNlZFBhdGgoZmlsdGVyVGFyZ2V0UGF0aCwgY29udGV4dFBhdGgpO1xuXHRcdHJldHVybiBmaWx0ZXJCYXJQcm9wZXJ0aWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uYW5ub3RhdGlvblBhdGggPT09IGFubm90YXRpb25QYXRoKTtcblx0fSxcblxuXHRfb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQ6IGZ1bmN0aW9uIChcblx0XHRjb25kaXRpb25zOiBDb25kaXRpb25PYmplY3RbXSxcblx0XHRvdXRQYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdHZhbHVlSGVscDogVmFsdWVIZWxwXG5cdCkge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRMaXN0ID0gdGhpcy5fZ2V0Q29uZGl0aW9uUGF5bG9hZExpc3QoY29uZGl0aW9uKSxcblx0XHRcdFx0b3V0VmFsdWVzID0gY29uZGl0aW9uUGF5bG9hZExpc3QubGVuZ3RoID09PSAxID8gY29uZGl0aW9uUGF5bG9hZExpc3RbMF0gOiB1bmRlZmluZWQ7XG5cblx0XHRcdGlmIChjb25kaXRpb25QYXlsb2FkTGlzdC5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdExvZy53YXJuaW5nKFwiVmFsdWVIZWxwRGVsZWdhdGU6IFBhcmFtZXRlck91dCBpbiBtdWx0aS12YWx1ZS1maWVsZCBub3Qgc3VwcG9ydGVkXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG91dFZhbHVlcykge1xuXHRcdFx0XHR0aGlzLl9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVXBkYXRlUHJvcGVydHkobWV0YU1vZGVsLCBvdXRWYWx1ZXMsIG91dFBhcmFtZXRlcnMsIGNvbnRleHQsIHZhbHVlSGVscCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdF9vbkNvbmRpdGlvblByb3BhZ2F0aW9uVXBkYXRlUHJvcGVydHk6IGZ1bmN0aW9uIChcblx0XHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdG91dFZhbHVlczogQ29uZGl0aW9uUGF5bG9hZFR5cGUsXG5cdFx0b3V0UGFyYW1ldGVyczogSW5PdXRQYXJhbWV0ZXJbXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dCxcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscFxuXHQpIHtcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHJvb3RQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKS5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgY29udGV4dENhblJlcXVlc3RTaWRlRWZmZWN0cyA9IGNvbnRleHQuaXNUcmFuc2llbnQoKSAhPT0gdHJ1ZSAmJiAhY29udGV4dC5pc0luYWN0aXZlKCk7XG5cdFx0Y29uc3Qgb3V0UGFyYW1ldGVyU291cmNlczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG91dFBhcmFtZXRlciBvZiBvdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHQvKiBVcGRhdGVkIHByb3BlcnR5IHZpYSBvdXQtcGFyYW1ldGVyIGlmIHZhbHVlIGNoYW5nZWQgKi9cblx0XHRcdHRoaXMuX3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyKFxuXHRcdFx0XHRjb252ZXJ0ZWRNZXRhZGF0YSxcblx0XHRcdFx0cm9vdFBhdGgsXG5cdFx0XHRcdG91dFZhbHVlcyxcblx0XHRcdFx0b3V0UGFyYW1ldGVyLFxuXHRcdFx0XHRjb250ZXh0LFxuXHRcdFx0XHRjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzXG5cdFx0XHQpO1xuXHRcdFx0b3V0UGFyYW1ldGVyU291cmNlcy5wdXNoKG91dFBhcmFtZXRlci5zb3VyY2UpO1xuXHRcdH1cblx0XHRjb25zdCB2aWV3ID0gQ29tbW9uVXRpbHMuZ2V0VGFyZ2V0Vmlldyh2YWx1ZUhlbHApO1xuXHRcdGNvbnN0IGNvbGxhYm9yYXRpdmVEcmFmdCA9IHZpZXcuZ2V0Q29udHJvbGxlcigpLmNvbGxhYm9yYXRpdmVEcmFmdDtcblx0XHRpZiAoY29sbGFib3JhdGl2ZURyYWZ0LmlzQ29ubmVjdGVkKCkgJiYgb3V0UGFyYW1ldGVyU291cmNlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyB3ZSBkZXRlcm1pbmUgdGhlIGJpbmRpbmcgdGhhdCBzZW5kcyB0aGUgcmVxdWVzdFxuXHRcdFx0bGV0IGJpbmRpbmc7XG5cdFx0XHRpZiAoY29udGV4dC5nZXRCaW5kaW5nKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0YmluZGluZyA9IGNvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YmluZGluZyA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRCaW5kaW5nKCk7XG5cdFx0XHR9XG5cdFx0XHQvKiBUaGUgb3V0IHZhbHVlcyBoYXZlIGJlZW4gY2hhbmdlZCAtLT4gd2FpdCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIgYmVmb3JlIHNlbmRpbmcgYSBub3RpZmljYXRpb24gdG8gdGhlIG90aGVyIGNvbGxhYm9yYXRvcnNcblx0XHRcdFx0XHRcdFx0IFdlIGF0dGFjaCB0aGUgZXZlbnQgb24gdGhlIHJpZ2h0IGJpbmRpbmcgKi9cblx0XHRcdGJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwicGF0Y2hDb21wbGV0ZWRcIiwgKCkgPT4ge1xuXHRcdFx0XHRjb2xsYWJvcmF0aXZlRHJhZnQuc2VuZCh7XG5cdFx0XHRcdFx0YWN0aW9uOiBBY3Rpdml0eS5DaGFuZ2UsXG5cdFx0XHRcdFx0Y29udGVudDogb3V0UGFyYW1ldGVyU291cmNlcy5tYXAoKHNvdXJjZSkgPT4gY29udGV4dC5nZXRQYXRoKCkgKyBcIi9cIiArIHNvdXJjZSlcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0X3VwZGF0ZVByb3BlcnR5VmlhT3V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoXG5cdFx0Y29udmVydGVkTWV0YWRhdGE6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRcdHJvb3RQYXRoOiBzdHJpbmcsXG5cdFx0b3V0VmFsdWVzOiBDb25kaXRpb25QYXlsb2FkVHlwZSxcblx0XHRvdXRQYXJhbWV0ZXI6IEluT3V0UGFyYW1ldGVyLFxuXHRcdGNvbnRleHQ6IE9EYXRhVjRDb250ZXh0LFxuXHRcdGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHM6IGJvb2xlYW5cblx0KSB7XG5cdFx0LyogVXBkYXRlZCBwcm9wZXJ0eSB2aWEgb3V0LXBhcmFtZXRlciBpZiB2YWx1ZSBjaGFuZ2VkICovXG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gYCR7cm9vdFBhdGh9LyR7b3V0UGFyYW1ldGVyLnNvdXJjZX1gO1xuXHRcdGNvbnN0IHRhcmdldFByb3BlcnR5ID0gY29udmVydGVkTWV0YWRhdGEucmVzb2x2ZVBhdGg8UHJvcGVydHk+KHByb3BlcnR5UGF0aCkudGFyZ2V0O1xuXHRcdGNvbnN0IGZpZWxkQ29udHJvbCA9IHRhcmdldFByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWVsZENvbnRyb2w7XG5cdFx0Y29uc3QgZHluYW1pY1JlYWRPbmx5ID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24oZmllbGRDb250cm9sKSA/IGNvbnRleHQuZ2V0UHJvcGVydHkoZmllbGRDb250cm9sLnBhdGgpID09PSAxIDogZmFsc2U7XG5cdFx0aWYgKGR5bmFtaWNSZWFkT25seSAmJiBjb250ZXh0Q2FuUmVxdWVzdFNpZGVFZmZlY3RzKSB7XG5cdFx0XHQvKiBOb24tVHJhbnNpZW50IGFuZCBhY3RpdmUgY29udGV4dCAqL1xuXHRcdFx0Y29uc3QgbGFzdEluZGV4ID0gb3V0UGFyYW1ldGVyLnNvdXJjZS5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0UGF0aCA9IGxhc3RJbmRleCA+IDAgPyBvdXRQYXJhbWV0ZXIuc291cmNlLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogb3V0UGFyYW1ldGVyLnNvdXJjZTtcblx0XHRcdC8qIFdlIHNlbmQgWzxwcm9wZXJ0eU5hbWU+XSBpbiBjYXNlIG9mIGEgcHJvcGVydHkgcGF0aCB3aXRob3V0IGFueSBuYXZpZ2F0aW9uIGludm9sdmVkICovXG5cdFx0XHQvKiBJbiBjYXNlIG9mIGEgcGF0aCBpbnZvbHZpbmcgbmF2aWdhdGlvbnMsIHdlIHNlbmQgWzxuYXZpZ2F0aW9uUGF0aD5dIGVuZGluZyB3aXRoIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBhbmQgbm90IHdpdGggYSBwcm9wZXJ0eSAqL1xuXHRcdFx0Y29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMoW3NpZGVFZmZlY3RQYXRoXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8qIFRoZSBmYXN0IGNyZWF0aW9uIHJvdyAodHJhbnNpZW50IGNvbnRleHQpIGNhbsK0dCBoYXZlIGluc3RhbnQgc3BlY2lmaWMgKGR5bmFtaWMpIHJlYWQtb25seSBmaWVsZHMsIHRoZXJlZm9yZSB3ZSBkb27CtHQgbmVlZCB0byBoYW5kbGUvY29uc2lkZXIgdGhpcyBjYXNlIHNwZWNpZmljYWxseSAqL1xuXHRcdFx0LyogQWRkaXRpb25hbCBpbmZvczogKi9cblx0XHRcdC8qIFRoZSBmYXN0IGNyZWF0aW9uIHJvdyBpcyBvbmx5IHVzZWQgYnkgU0QgKi9cblx0XHRcdC8qIFRoZSBncm91cCBJRCAodGhpcmQgYXJndW1lbnQgb2Ygc2V0UHJvcGVydHkgZGVzY3JpYmVkIGFwaSBkb2N1bWVudGF0aW9uIG9mIHRoZSBDb250ZXh0KSBpcyB1c2VkIGZvciB0aGUgUEFUQ0ggcmVxdWVzdCwgaWYgbm90IHNwZWNpZmllZCwgdGhlIHVwZGF0ZSBncm91cCBJRCBmb3IgdGhlIGNvbnRleHQncyBiaW5kaW5nIGlzIHVzZWQsICdudWxsJyB0byBwcmV2ZW50IHRoZSBQQVRDSCByZXF1ZXN0ICovXG5cdFx0XHQvKiBUaGUgVHJhbnNpZW50IGNvbnRleHQgY2Fubm90IHJlcXVlc3QgU2lkZUVmZmVjdHMgYW5kICBjYW5ub3QgcGF0Y2ggdmlhIGdyb3VwICdudWxsJyAqL1xuXHRcdFx0Y29uc3QgY3VycmVudFZhbCA9IGNvbnRleHQuZ2V0UHJvcGVydHkob3V0UGFyYW1ldGVyLnNvdXJjZSk7XG5cdFx0XHRjb25zdCBuZXdWYWwgPSBvdXRWYWx1ZXNbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXTtcblx0XHRcdGlmIChjdXJyZW50VmFsICE9PSBuZXdWYWwpIHtcblx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShvdXRQYXJhbWV0ZXIuc291cmNlLCBudWxsKTtcblx0XHRcdFx0Y29udGV4dC5zZXRQcm9wZXJ0eShvdXRQYXJhbWV0ZXIuc291cmNlLCBvdXRWYWx1ZXNbb3V0UGFyYW1ldGVyLmhlbHBQYXRoXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8qIElmIHRoZSBrZXkgZ2V0cyB1cGRhdGVkIHZpYSBvdXQtcGFyYW1ldGVyLCB0aGVuIHRoZSBkZXNjcmlwdGlvbiBuZWVkcyBhbHNvIHJldHJpZXZlZCB3aXRoIHJlcXVlc3RTaWRlRWZmZWN0cyAqL1xuXHRcdGNvbnN0IHRleHRQYXRoID0gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0UHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQpXG5cdFx0XHQ/IHRhcmdldFByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0LnBhdGhcblx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGlmICh0ZXh0UGF0aCAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRDYW5SZXF1ZXN0U2lkZUVmZmVjdHMpIHtcblx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IHRleHRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RQYXRoID0gbGFzdEluZGV4ID4gMCA/IHRleHRQYXRoLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpIDogdGV4dFBhdGg7XG5cdFx0XHQvKiBUaGUgc2lkZUVmZmVjdFBhdGggY2FuIGJlIFs8cHJvcGVydHlOYW1lPl0gb3IgWzxuYXZpZ2F0aW9uUGF0aD5dICovXG5cdFx0XHRjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhbc2lkZUVmZmVjdFBhdGhdKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIGEgbWFwIG9mIGNvbmRpdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczpcblx0ICogSW5pdGlhbCBzZXQgb2YgY29uZGl0aW9ucyBhcHBsaWVkIGV2ZXJ5IHRpbWUgdmFsdWUgaGVscCBjb250ZW50IGlzIHNob3duIGZvciB0aGUgZmlyc3QgdGltZSBzaW5jZSBvcGVuaW5nIGl0cyBjb250YWluZXIuXG5cdCAqIERldGFpbGVkIHNldCBvZiBjb25kaXRpb25zIGluIGdldEl0ZW1Gb3JWYWx1ZSBzY2VuYXJpb3MgdGhhdCBhbGxvdyB5b3UgdG8gZmluZCBhIHNwZWNpZmljIHZhbHVlIGhlbHAgaXRlbSAoaW5kaWNhdGVkIGJ5IGNvbmZpZyBhdmFpbGFiaWxpdHkpLlxuXHQgKiBAcGFyYW0gdmFsdWVIZWxwIFRoZSBWYWx1ZUhlbHAgY29udHJvbCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0XG5cdCAqIEByZXR1cm5zIFJldHVybnMgYSBwcm9taXNlIHJlc29sdmluZyB0byBhIG1hcCBvZiBjb25kaXRpb25zXG5cdCAqL1xuXHRnZXRGaWx0ZXJDb25kaXRpb25zOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IENvbnRlbnQsIGNvbmZpZz86IE1EQ0NvbmZpZ1R5cGUpIHtcblx0XHRpZiAodGhpcy5nZXRJbml0aWFsRmlsdGVyQ29uZGl0aW9ucykge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnModmFsdWVIZWxwLCBjb250ZW50LCAoY29uZmlnICYmIGNvbmZpZy5jb250cm9sKSB8fCAoY29udGVudCAmJiBjb250ZW50LmdldENvbnRyb2woKSkpO1xuXHRcdH1cblx0XHRyZXR1cm4ge307XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxiYWNrIGludm9rZWQgZXZlcnkgdGltZSBhIHtAbGluayBzYXAudWkubWRjLlZhbHVlSGVscCBWYWx1ZUhlbHB9IGZpcmVzIGEgc2VsZWN0IGV2ZW50IG9yIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBjaGFuZ2VzXG5cdCAqIFRoaXMgY2FsbGJhY2sgbWF5IGJlIHVzZWQgdG8gdXBkYXRlIGV4dGVybmFsIGZpZWxkcy5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBWYWx1ZUhlbHAgY29udHJvbCBpbnN0YW5jZSByZWNlaXZpbmcgdGhlIDxjb2RlPmNvbnRyb2xDaGFuZ2U8L2NvZGU+XG5cdCAqIEBwYXJhbSByZWFzb24gUmVhc29uIHdoeSB0aGUgbWV0aG9kIHdhcyBpbnZva2VkXG5cdCAqIEBwYXJhbSBfY29uZmlnIEN1cnJlbnQgY29uZmlndXJhdGlvbiBwcm92aWRlZCBieSB0aGUgY2FsbGluZyBjb250cm9sXG5cdCAqIEBzaW5jZSAxLjEwMS4wXG5cdCAqL1xuXHRvbkNvbmRpdGlvblByb3BhZ2F0aW9uOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIHJlYXNvbjogc3RyaW5nLCBfY29uZmlnOiB1bmtub3duKSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRpZiAocmVhc29uICE9PSBcIkNvbnRyb2xDaGFuZ2VcIiB8fCBwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHQvLyBoYW5kbGUgb25seSBDb250cm9sQ2hhbmdlIHJlYXNvblxuXHRcdFx0Ly8gYWxzbyBkb24ndCBoYW5kbGUgZm9yIGRlZmluZSBjb25kaXRpb24gdmFsdWUgaGVscCBhcyBwcm9wYWdhdGluZyBjb25kaXRpb25zIG9uIHRoZSB2YWx1ZSBoZWxwXG5cdFx0XHQvLyB0byBkZWZpbmUgY29uZGl0aW9ucyBkb2VzIG5vdCBtYWtlIHNlbnNlIGJ1dCB3b3VsZCBvbmx5IGNvbmZ1c2UgdXNlcnMgYnkgYWxsb3dpbmcgcmVjdXJzaXZlIHVzZVxuXHRcdFx0Ly8gb2YgdGhlIGNvbmRpdGlvbiB2YWx1ZSBoZWxwXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0Y29uc3Qgb3V0UGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0T3V0UGFyYW1ldGVycyhxdWFsaWZpZXIudmhQYXJhbWV0ZXJzKSA6IFtdLFxuXHRcdFx0ZmllbGQgPSB2YWx1ZUhlbHAuZ2V0Q29udHJvbCgpIGFzIEZpZWxkQmFzZSxcblx0XHRcdGZpZWxkUGFyZW50ID0gZmllbGQuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZSB8IENvbnRyb2w7XG5cblx0XHRsZXQgY29uZGl0aW9ucyA9IGZpZWxkLmdldENvbmRpdGlvbnMoKSBhcyBDb25kaXRpb25PYmplY3RbXTtcblx0XHRpZiAoIXBheWxvYWQuaXNWYWx1ZUxpc3RXaXRoRml4ZWRWYWx1ZXMpIHtcblx0XHRcdHRoaXMuX3NldEhpc3RvcnlEYXRhKHBheWxvYWQsIGNvbmRpdGlvbnMsIGZpZWxkKTtcblx0XHR9XG5cdFx0Y29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKGZ1bmN0aW9uIChjb25kaXRpb24pIHtcblx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSAoY29uZGl0aW9uLnBheWxvYWQgfHwge30pIGFzIENvbmRpdGlvblBheWxvYWRNYXA7XG5cdFx0XHRyZXR1cm4gY29uZGl0aW9uUGF5bG9hZE1hcFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl07XG5cdFx0fSk7XG5cblx0XHRjb25zdCBsaXN0UmVwb3J0RmlsdGVyQmFyID0gZmllbGQuZ2V0UGFyZW50KCkgYXMgRmlsdGVyQmFyQmFzZSB8IENvbnRyb2w7IC8vIENvbnRyb2wgZS5nLiBGb3JtQ29udGFpbmVyXG5cdFx0aWYgKGxpc3RSZXBvcnRGaWx0ZXJCYXIuaXNBKEZlQ29yZUNvbnRyb2xzRmlsdGVyQmFyKSAmJiBvdXRQYXJhbWV0ZXJzLmxlbmd0aCAmJiBjb25kaXRpb25zLmxlbmd0aCkge1xuXHRcdFx0Ly8gUHJvcGFnYXRlIHRoZSB2YWx1ZSBvbmx5IGlmIHRoZSBGaWx0ZXJGaWVsZCBpcyBwYXJ0IG9mIHRoZSBMUi1GaWx0ZXJCYXIgYWxzbyBpbnNpZGUgaW4gQWRhcHQgRmlsdGVycyBkaWFsb2dcblx0XHRcdGF3YWl0IHRoaXMuX29uQ29uZGl0aW9uUHJvcGFnYXRpb25Ub0ZpbHRlckJhcihcblx0XHRcdFx0Y29uZGl0aW9ucyxcblx0XHRcdFx0b3V0UGFyYW1ldGVycyxcblx0XHRcdFx0ZmllbGRQYXJlbnQgYXMgRmlsdGVyQmFyLFxuXHRcdFx0XHRwYXlsb2FkLFxuXHRcdFx0XHRsaXN0UmVwb3J0RmlsdGVyQmFyIGFzIEZpbHRlckJhclxuXHRcdFx0KTtcblx0XHRcdC8vIExSIFNldHRpbmdzIERpYWxvZyBvciBPUCBTZXR0aW5ncyBEaWFsb2cgc2hhbGwgbm90IHByb3BhZ2F0ZSB2YWx1ZSB0byB0aGUgZGlhbG9nIGZpbHRlcmZpZWxkcyBvciBjb250ZXh0XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE9iamVjdCBQYWdlXG5cdFx0XHQvKiBUbyBhdm9pZCB0aW1pbmcgaXNzdWUgd2UgdXNlIHRoZSBCaW5kaW5nQ29udGV4dCBvZiB0aGUgY29udHJvbCBpbnN0ZWFkIG9mIHRoZSBWYWx1ZUhlbHAgKEJDUCAyMzgwMDU3MjI3KSAqL1xuXHRcdFx0Y29uc3QgY29udGV4dCA9IGZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSAoZmllbGQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IG1ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3BheWxvYWQucHJvcGVydHlQYXRofUBzYXB1aS5uYW1lYCk7XG5cdFx0XHRcdGNvbnN0IGNvbmRpdGlvbiA9IGNvbmRpdGlvbnMubGVuZ3RoID4gMCA/IGNvbmRpdGlvbnNbMF0gOiAoe30gYXMgQ29uZGl0aW9uT2JqZWN0KTtcblx0XHRcdFx0Y29uc3QgcGF5bG9hZEtleXMgPSBjb25kaXRpb24/LnBheWxvYWQgPyBPYmplY3Qua2V5cyhjb25kaXRpb24ucGF5bG9hZCkgOiBbXTtcblx0XHRcdFx0cGF5bG9hZEtleXMuZm9yRWFjaCgocGF5bG9hZEtleSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWRNYXAgPSBjb25kaXRpb24ucGF5bG9hZCBhcyBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvblBheWxvYWQgPSBjb25kaXRpb25QYXlsb2FkTWFwPy5bcGF5bG9hZEtleV0/LlswXSB8fCB7fTtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25WYWx1ZWtleXMgPSBPYmplY3Qua2V5cyhjb25kaXRpb25QYXlsb2FkKTtcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25WYWx1ZWtleSA9IGNvbmRpdGlvblZhbHVla2V5cy5maW5kKCh2YWx1ZUtleSkgPT4gdmFsdWVLZXkuaW5jbHVkZXMoXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIikpO1xuXHRcdFx0XHRcdGlmIChjb25kaXRpb25WYWx1ZWtleSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qga2V5VmFsdWUgPSBjb25kaXRpb25QYXlsb2FkW2NvbmRpdGlvblZhbHVla2V5XTtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBrZXlWYWx1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5fb25Db25kaXRpb25Qcm9wYWdhdGlvblRvQmluZGluZ0NvbnRleHQoY29uZGl0aW9ucywgb3V0UGFyYW1ldGVycywgY29udGV4dCwgdmFsdWVIZWxwKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gaW5pdGlhbCBmaWx0ZXIgY29uZGl0aW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZSBhbmQgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBpbml0aWFsIHZhbHVlIGlzIHNpZ25pZmljYW50LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgZmlsdGVyIGNvbmRpdGlvbi5cblx0ICogQHBhcmFtIGluaXRpYWxWYWx1ZUlzU2lnbmlmaWNhbnQgRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBpbml0aWFsIHZhbHVlIGlzIHNpZ25pZmljYW50LlxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbi5cblx0ICovXG5cdF9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uOiBmdW5jdGlvbiAodmFsdWU6IFZhbHVlLCBpbml0aWFsVmFsdWVJc1NpZ25pZmljYW50OiBib29sZWFuKSB7XG5cdFx0bGV0IGNvbmRpdGlvbjogQ29uZGl0aW9uT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdExvZy5lcnJvcihcIlZhbHVlSGVscERlbGVnYXRlOiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIHJlcXVlc3RlZFwiKTtcblx0XHR9IGVsc2UgaWYgKCh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gbnVsbCkgJiYgaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCkge1xuXHRcdFx0Y29uZGl0aW9uID0gQ29uZGl0aW9uLmNyZWF0ZUNvbmRpdGlvbihcIkVtcHR5XCIsIFtdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IFwiXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcblx0XHRcdGNvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGVDb25kaXRpb24oXCJFUVwiLCBbdmFsdWVdLCBudWxsLCBudWxsLCBDb25kaXRpb25WYWxpZGF0ZWQuVmFsaWRhdGVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbmRpdGlvbjtcblx0fSxcblxuXHRfZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tQmluZGluZzogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKCFiaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IE5vIEJpbmRpbmdDb250ZXh0XCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udHJvbC5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCByb290UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChiaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdGxldCBwcm9wZXJ0aWVzVG9SZXF1ZXN0ID0gaW5QYXJhbWV0ZXJzLm1hcCgoaW5QYXJhbWV0ZXIpID0+IGluUGFyYW1ldGVyLnNvdXJjZSk7XG5cdFx0LyogSW4gY2FzZSBvZiBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZywgd2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdGggXCIkUGFyYW1ldGVyXCIsIHRoZSBiaW5kaW5nIGNvbnRleHQgaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBpbi1wYXJhbWV0ZXJzLiAqL1xuXHRcdC8qIFdlIG5lZWQgdG8gcmVxdWVzdCB0aGUgaW4tcGFyYW1ldGVyIHZhbHVlcyByZWxhdGl2ZSB0byB0aGUgYmluZGluZyBjb250ZXh0LlxuSW4gc29tZSBjYXNlcyAoZS5nLiBtdWx0aSB2YWx1ZSBmaWVsZCksIHRoZSBiaW5kaW5nIGNvbnRleHQgZG9lcyBub3QgcG9pbnQgdG8gdGhlXG5WSCBhbm5vdGF0aW9uIHRhcmdldCwgdGh1cyB3ZSBpZGVudGlmeSB0aGUgbmVlZGVkIG5hdmlnYXRpb24gcmVsYXRpb24gYnlcbnJlZHVjaW5nIHRoZSBwYXlsb2FkLnByb3BlcnR5UGF0aCBieSB0aGUgcGF0aCBkZXJpdmVkIGZyb20gYmluZGluZyBjb250ZXh0LlxuVGhpcyBjYW5ub3QgaGFwcGVuIGluIGNhc2Ugb2YgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2csIHdoaWNoIGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXRoIFwiJFBhcmFtZXRlclwiLlxuKi9cblxuXHRcdC8vIENoZWNrIHdoZXRoZXIgdGhlIGZpbHRlciBwcm9wZXJ0eSB3aXRoIG5hdmlnYXRpb24gcGF0aCBleGlzdHMsIG90aGVyd2lzZSB0aGUgbWV0YWRhdGEgYXJlIG5vdCB3ZWxsIGRlZmluZWRcblx0XHRsZXQgbWV0YURhdGFFcnJvciA9IGZhbHNlO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IHBheWxvYWQucHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKTtcblx0XHRsZXQgbmF2aWdhdGlvblByb3BlcnR5UGF0aDtcblx0XHRsZXQgbmF2aWdhdGlvblByb3BlcnR5O1xuXG5cdFx0Ly9Gb3IgYSBWSCBvbiBhbiBhY3Rpb24gZGlhbG9nIHBhcmFtZXRlciB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgZmlsbCBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoXG5cdFx0Ly93aXRoIHRoZSBhY3Rpb24gZXZlbiB0aG91Z2ggbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBleGlzdHMgLT4gbGVhdmUgbmF2aWdhdGlvblByb3BlcnR5UGF0aCBlbXB0eVxuXHRcdGlmIChiaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0UGF0aCgpICE9PSBcIiRQYXJhbWV0ZXJcIikge1xuXHRcdFx0bmF2aWdhdGlvblByb3BlcnR5UGF0aCA9IHBheWxvYWQucHJvcGVydHlQYXRoLnJlcGxhY2UoYC8ke3Byb3BlcnR5TmFtZX1gLCBcIlwiKTtcblx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QobmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikgJiYgbmF2aWdhdGlvblByb3BlcnR5ICYmIG5hdmlnYXRpb25Qcm9wZXJ0eS4kUGFydG5lciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvL0Nhc2UgbWRjLk11bHRpVmFsdWVGaWVsZDogdGhlICRQYXJ0bmVyIChhc3NvY2lhdGlvbiB0byBvbmUpIGlzIGEgcHJlY29uZGl0aW9uIHRvIHJlcXVlc3QgdGhlIGZpbHRlciB2YWx1ZVxuXHRcdFx0Ly9FeGNlcHRpb246IFdoZW4gdGhlIE11bHRpVmFsdWVGaWVsZCBpcyBhbiBhY3Rpb24gcGFyYW1ldGVyIHRoZW4gdGhlIGNvbnRleHQgb2YgdGhlIGFjdGlvbiBpcyB1c2VkIHRvIGZpbGwgdGhlIGluIHBhcmFtZXRlciBhbmRcblx0XHRcdC8vbm8gJFBhcnRuZXIgYXNzb2NpYXRpb24gaXMgbmVlZGVkLiBGb3Igc3VjaCBjYXNlcyBuYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGlzIG5vIGZpbGxlZFxuXHRcdFx0TG9nLmVycm9yKFxuXHRcdFx0XHRgVmFsdWVIZWxwRGVsZWdhdGU6IEJlY2F1c2Ugb2YgbWlzc2luZyBwYXJ0bmVyIGRlZmluaXRpb24sIHRoZSBmaWx0ZXIgdmFsdWUgZm9yIFZhbHVlTGlzdFBhcmFtZXRlckluIHByb3BlcnR5IGNhbiBub3QgcmVxdWVzdGVkLmBcblx0XHRcdCk7XG5cdFx0XHRtZXRhRGF0YUVycm9yID0gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eSAmJiBuYXZpZ2F0aW9uUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiYgbmF2aWdhdGlvblByb3BlcnR5LiRQYXJ0bmVyICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHByb3BlcnRpZXNUb1JlcXVlc3QgPSB0aGlzLl9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3QocHJvcGVydGllc1RvUmVxdWVzdCwgcm9vdFBhdGgsIG1ldGFNb2RlbCwgcGF5bG9hZC5wcm9wZXJ0eVBhdGgpO1xuXHRcdH1cblx0XHRpZiAoIW1ldGFEYXRhRXJyb3IpIHtcblx0XHRcdC8vIFVwZGF0ZUdyb3VwSWQgaXMgJGF1dG8gaXMgdXNlZCBpbiBjYXNlIG9mIGNyZWF0aW9uIHJvdy5cblx0XHRcdC8vIFVwZGF0ZUdyb3VwSWQgaXMgc3VibWl0TGF0ZXIgaW4gY2FzZSBvZiBjcmVhdGUgZGlhbG9nLlxuXHRcdFx0Ly8gV2UgbmVlZCB0byBjb25zaWRlciB0aGUgY2FzZSBvZiBpc0luYWN0aXZlIGNvbnRleHQsIHdoaWNoIGlzIG5vdCB5ZXQgY3JlYXRlZC5cblx0XHRcdGNvbnN0IGNvbnRleHRVbmRlckNyZWF0aW9uID1cblx0XHRcdFx0YmluZGluZ0NvbnRleHQuaXNUcmFuc2llbnQoKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHQhYmluZGluZ0NvbnRleHQuaXNJbmFjdGl2ZSgpICYmXG5cdFx0XHRcdGJpbmRpbmdDb250ZXh0LmdldFVwZGF0ZUdyb3VwSWQoKT8uc3RhcnRzV2l0aChcIiRhdXRvXCIpO1xuXHRcdFx0bGV0IGVycm9yTWVzc2FnZXNJbkNvbnRleHQgPSBbXTtcblx0XHRcdGVycm9yTWVzc2FnZXNJbkNvbnRleHQgPSAoYmluZGluZ0NvbnRleHQuZ2V0TWVzc2FnZXMoKSA/PyBbXSkuZmlsdGVyKChtZXNzYWdlOiBNZXNzYWdlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBtZXNzYWdlLmdldFR5cGUoKSA9PT0gTWVzc2FnZVR5cGUuRXJyb3I7XG5cdFx0XHR9KTtcblx0XHRcdC8vIFdlIGF3YWl0IGNyZWF0aW9uIGlmIGl0IGlzIHN0aWxsIGluIHByb2Nlc3MuXG5cdFx0XHRpZiAoY29udGV4dFVuZGVyQ3JlYXRpb24gJiYgIWVycm9yTWVzc2FnZXNJbkNvbnRleHQ/Lmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCBiaW5kaW5nQ29udGV4dD8uY3JlYXRlZCgpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQWNjb3JkaW5nIHRvIG9kYXRhIHY0IGFwaSBkb2N1bWVudGF0aW9uIGZvciByZXF1ZXN0UHJvcGVydHk6IFByb3BlcnR5IHZhbHVlcyB0aGF0IGFyZSBub3QgY2FjaGVkIHlldCBhcmUgcmVxdWVzdGVkIGZyb20gdGhlIGJhY2sgZW5kXG5cdFx0XHRjb25zdCB2YWx1ZXMgPSBhd2FpdCBiaW5kaW5nQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkocHJvcGVydGllc1RvUmVxdWVzdCk7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5QYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGluUGFyYW1ldGVyID0gaW5QYXJhbWV0ZXJzW2ldO1xuXHRcdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKHZhbHVlc1tpXSwgaW5QYXJhbWV0ZXIuaW5pdGlhbFZhbHVlSXNTaWduaWZpY2FudCk7XG5cblx0XHRcdFx0aWYgKGNvbmRpdGlvbikge1xuXHRcdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdF9idWlsZFByb3BlcnRpZXNUb1JlcXVlc3Q6IGZ1bmN0aW9uIChwcm9wZXJ0aWVzVG9SZXF1ZXN0OiBzdHJpbmdbXSwgcm9vdFBhdGg6IHN0cmluZywgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgcHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHQvKlxuXHRcdFx0XHRUaGUgaW5QYXJhbWV0ZXJzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUgdmFsdWUgaGVscCBkZWZpbml0aW9uLCBpLmUuIHRoZWlyIHNvdXJjZSBpcyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGFubm90YXRpb24gdGFyZ2V0IChvciBtb3JlIHByZWNpc2VseSB0aGUgRW50aXR5U2V0IHRoZSBhbm5vdGF0aW9uIHRhcmdldCBiZWxvbmdzIHRvKS4gVGhlIGFubm90YXRpb24gdGFyZ2V0IGlzIHRoZSBwcm9wZXJ0eSB0aGUgdmFsdWUgaGVscCBpcyBkZWZpbmVkIGZvci5cblx0XHRcdFx0VG8gcmVxdWVzdCB0aGUgdmFsdWVzIGZvciB0aGUgaW5QYXJhbWV0ZXJzIGZyb20gdGhlIGJpbmRpbmdDb250ZXh0ICh0aGUgY29udHJvbCBpcyBib3VuZCB0byksIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoaXMgdG8gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBiaW5kaW5nQ29udGV4dC4gVGhpcyBkaWZmZXJzLCBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQgZm9yIGEgZGlyZWN0IHByb3BlcnR5LCBidXQgd2l0aCBhIHBhdGggY29udGFpbmluZyBvbmUgb3IgbW9yZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgKGVzcC4gbmVjZXNzYXJ5IHRvIGRlZmluZSBtdWx0aSB2YWx1ZSBmaWVsZHMpLlxuXHRcdFx0XHRUbyBtYWtlIHRoaXMgdHJhbnNsYXRpb24gcG9zc2libGUsIHRoZSBwYXlsb2FkIHByb3ZpZGVzIHRoZSBwcm9wZXJ0eVBhdGgsIHdoaWNoIGlzIGFuIGFic29sdXRlIG1ldGFQYXRoIHRvIHRoZSBwcm9wZXJ0eSAoaS5lLiBpbmNsdWRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgYW5kIHRoZSBhZGRpdGlvbmFsIHBhdGggdGhlIHByb3BlcnR5IGlzIGJvdW5kIHRvKS5cblxuXHRcdFx0XHRTbyBmYXIsIHRoaXMgbWVhbnMgd2UgaGF2ZSB0byByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgbWV0YVBhdGggb2YgdGhlIGJpbmRpbmdDb250ZXh0IGZyb20gdGhlIGxlZnQgc2lkZSwgYW5kIHRoZSBsYXN0IHNlZ21lbnQgKHRoZSBwcm9wZXJ0eSBpdHNlbGYpIGZyb20gdGhlIHRoZSByaWdodCBzaWRlIG9mIHRoZSBwcm9wZXJ0eVBhdGggcHJvdmlkZWQgaW4gdGhlIHBheWxvYWQsIHRvIGdldCBhIG1ldGFQYXRoIGZyb20gdGhlIGJpbmRpbmcgY29udGV4dCB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQuXG5cdFx0XHRcdElmIHRoaXMgbWV0YVBhdGggY29udGFpbnMgMTpuLW5hdmlnYXRpb25zICh3aGljaCBjYW5ub3QgYmUgdHJhbnNsYXRlZCBiYWNrIHRvIGEgcGF0aCwgYXMgdGhpcyB3b3VsZCBtZWFuIHRvIGFkZCBjb3JyZXNwb25kaW5nIGtleXMsIHdoaWNoIGFyZSBub3Qga25vd24pLCB0aGUgc291cmNlIHBhdGggaW4gdGhlIGluUGFyYW1ldGVyIGRlZmluaXRpb24gb2YgdGhlIHZhbHVlIG5lZWRzIHRvIHBvaW50IGJhY2sgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcGFydG5lciBuYXZpZ2F0aW9uKHMpIHRvIGF2b2lkIGFtYmlndW91cyBkZWZpbml0aW9uIG9mIGhvdyB0byBnZXQgaXRzIHZhbHVlLlxuXHRcdFx0XHRUaHVzLCB3ZSBjYW4gYW5kIG5lZWQgdG8gbWF0Y2ggYW5kIHJlZHVjZSB0aGUgcGFydHMgb2YgdGhpcyByZWxhdGl2ZSBtZXRhUGF0aCBmcm9tIHRoZSByaWdodCBzaWRlIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgcGFydHMgb2YgdGhlIGluUGFyYW1ldGVycyBzb3VyY2UgZGVmaW5pdGlvbiBmcm9tIHRoZSBsZWZ0IHNpZGUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGV5IGFyZSBjb3JyZXNwb25kaW5nIHBhcnRuZXIgbmF2aWdhdGlvbnMuIFdoZW4gd2UgYXJlIGRvbmUgKG5vIG1vcmUgcGFydHMgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCwgbm8gbW9yZSBwYXJ0cyBpbiByZWR1Y2VkIGluUGFyYW1ldGVyIHNvdXJjZSBwYXRoLCBvciBtb3N0IHJpZ2h0IHBhcnQgaW4gcmVkdWNlZCByZWxhdGl2ZSBtZXRhUGF0aCBpcyBub3QgdGhlIHBhcnRuZXIgb2YgbW9zdCBsZWZ0IHBhcnQgaW4gcmVkdWNlZCBpblBhcmFtZXRlciBzb3VyY2UpLCBuZWl0aGVyIHJlZHVjZWQgcmVsYXRpdmUgbWV0YVBhdGggbm9yIHJlZHVjZWQgaW5QYXJhbWV0ZXIgc291cmNlIHBhdGggbWF5IGNvbnRhaW4gYW55IDE6bi1uYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG5cdFx0XHRcdElmIHRoaXMgY29uZGl0aW9uIGlzIGZ1bGZpbGxlZCwgd2UgY2FuIGNvbWJpbmUgdGhlIGFuZCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIGJpbmRpbmcgY29udGV4dC4gSWYgbm90LCB0aGUgdmFsdWUgaGVscCBkZWZpbml0aW9uIGRvZXMgbm90IGFsbG93IHRvIHJldHJpZXZlIHRoZSBpblBhcmFtZXRlcnMgdmFsdWUgaW4gYW4gdW5hbWJpZ3VvdXMgd2F5LCBpLnQuIHRoZSB2YWx1ZSBoZWxwIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseS5cblx0XHRcdFx0Ki9cblx0XHQvLyBjb21tb24gZm9yIGFsbCBpblBhcmFtZXRlcnNcblx0XHRsZXQgbWV0YU1vZGVsQ29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChyb290UGF0aCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0Y29uc3QgcmVsYXRpdmVQYXRoUGFydHMgPSBwcm9wZXJ0eVBhdGhcblx0XHRcdC5zbGljZShyb290UGF0aC5sZW5ndGgpIC8vIHJlbW92ZSByb290IHBhdGhcblx0XHRcdC5zcGxpdChcIi9cIikgLy8gdHJhbnNmb3JtIHRvIGFycmF5XG5cdFx0XHQuc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSBmaXJzdCAoZW1wdHksIGFzIHJvb3RQYXRoIHByb3ZpZGVkIHdpdGhvdXQgZW5kaW5nIFwiL1wiKSwgYW5kIGxhc3QgKHByb3BlcnR5IHRoZSBWSCBpcyBhdHRhY2hlZCB0bykgcGFydFxuXHRcdFx0Lm1hcCgocGFydCkgPT4ge1xuXHRcdFx0XHQvLyBkZXRlcm1pbmUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIGFuZCBjb3JyZXNwb25kaW5nIHBhcnRuZXIgZm9yIGVhY2ggbmF2aWdhdGlvbiBzdGVwXG5cdFx0XHRcdG1ldGFNb2RlbENvbnRleHQgPSBtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQocGFydCwgbWV0YU1vZGVsQ29udGV4dCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0cGFydDogcGFydCxcblx0XHRcdFx0XHRwYXJ0bmVyOiBtZXRhTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLiRQYXJ0bmVyXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHQvLyBhY3R1YWwgcmVkdWN0aW9uIHBlciBpblBhcmFtZXRlclxuXHRcdHJldHVybiBwcm9wZXJ0aWVzVG9SZXF1ZXN0Lm1hcCgobG9jYWxEYXRhUGF0aCkgPT4ge1xuXHRcdFx0Y29uc3QgbG9jYWxEYXRhUGFydHMgPSBsb2NhbERhdGFQYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdGNvbnN0IG1hdGNoQ291bnQgPSBsb2NhbERhdGFQYXJ0cy5maW5kSW5kZXgoXG5cdFx0XHRcdChcblx0XHRcdFx0XHRwYXJ0LFxuXHRcdFx0XHRcdGluZGV4IC8vIGZpbmQgZmlyc3Qgbm9uLW1hdGNoaW5nIGluZGV4XG5cdFx0XHRcdCkgPT4gcmVsYXRpdmVQYXRoUGFydHNbLWluZGV4XT8ucGFydG5lciAhPT0gcGFydFxuXHRcdFx0KTsgLy8gcmVsYXRpdmVQYXRoUGFydHMgdG8gbWF0Y2ggZnJvbSB0aGUgZW5kICg9PiBcIi1pbmRleFwiKSB0byBsb2NhbERhdGFQYXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmdcblx0XHRcdC8vIGxhc3QgcGFydCBvZiBsb2NhbERhdGEgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aHVzIGl0IGNhbm5vdCBtYXRjaC4gT3RoZXJ3aXNlIG1hdGNoQ291bnQgY291bGQgYmUgLTEgaWYgZXZlcnl0aGluZyBtYXRjaGVzXG5cdFx0XHQvLyAoaWYgd2Ugd2FudCB0byBhZGRpdGlvbmFsbHkgc2VjdXJlIGFnYWluc3QgdGhpcyBzaXR1YXRpb24sIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHdvdWxkIGJlIHRvIHNldCBtYXRjaENvdW50ID0gbG9jYWxEYXRhUGFydHMubGVuZ3RoIOKAkyAxKVxuXHRcdFx0cmV0dXJuIHJlbGF0aXZlUGF0aFBhcnRzXG5cdFx0XHRcdC5zbGljZSgwLCAtbWF0Y2hDb3VudCkgLy8gcmVtb3ZlIGFsbCBtYXRjaGVkIHBhcnRzIChmcm9tIHRoZSBlbmQpXG5cdFx0XHRcdC5tYXAoKHBhcnQpID0+IHBhcnQucGFydClcblx0XHRcdFx0LmNvbmNhdChsb2NhbERhdGFQYXJ0cy5zbGljZShtYXRjaENvdW50KSkgLy8gcmVtb3ZlIHRoZSBtYXRjaGVkIHBhcnRzIGZyb20gbG9jYWxEYXRhIChmcm9tIHRoZSBiZWdpbm5pbmcpXG5cdFx0XHRcdC5qb2luKFwiL1wiKTsgLy8gdHJhbnNmZXIgYmFjayB0byBzdHJpbmcgKGJ1dCBvbmx5IG9uY2UgYXQgdGhlIGVuZCA7KSApXG5cdFx0fSk7XG5cdH0sXG5cblx0X2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUZpbHRlckJhcjogYXN5bmMgZnVuY3Rpb24gKFxuXHRcdGluQ29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0TWFwLFxuXHRcdGNvbnRyb2w6IENvbnRyb2wsXG5cdFx0aW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdLFxuXHRcdHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWRcblx0KSB7XG5cdFx0Y29uc3QgZmlsdGVyQmFyID0gY29udHJvbC5nZXRQYXJlbnQoKSBhcyBGaWx0ZXJCYXJCYXNlO1xuXHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnRpZXMgPSBGaWx0ZXJVdGlscy5nZXRGaWx0ZXJQcm9wZXJ0eUluZm8oZmlsdGVyQmFyIGFzIHVua25vd24gYXMgSUZpbHRlckNvbnRyb2wpO1xuXHRcdGNvbnN0IHN0YXRlOiBFeHRlcm5hbFN0YXRlVHlwZSA9IGF3YWl0IFN0YXRlVXRpbC5yZXRyaWV2ZUV4dGVybmFsU3RhdGUoZmlsdGVyQmFyKTtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSAoZmlsdGVyQmFyLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Zm9yIChjb25zdCBpblBhcmFtZXRlciBvZiBpblBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IGZpbHRlckJhclByb3BlcnR5ID0gdGhpcy5fZmluZEZpbHRlckJhclByb3BlcnR5QnlBbm5vdGF0aW9uUGF0aChcblx0XHRcdFx0aW5QYXJhbWV0ZXIsXG5cdFx0XHRcdHBheWxvYWQucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRtZXRhTW9kZWwsXG5cdFx0XHRcdGZpbHRlckJhclByb3BlcnRpZXNcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlckJhclByb3BlcnR5ID8gZmlsdGVyQmFyUHJvcGVydHkuY29uZGl0aW9uUGF0aCA6IGluUGFyYW1ldGVyLnNvdXJjZS5zcGxpdChcImNvbmRpdGlvbnMvXCIpLnBvcCgpO1xuXG5cdFx0XHRjb25zdCBjb25kaXRpb25zID0gdGhpcy5fZ2V0Q29uZGl0aW9uc0Zyb21JblBhcmFtZXRlcihzb3VyY2VGaWVsZCBhcyBzdHJpbmcsIHN0YXRlKTtcblx0XHRcdGlmIChjb25kaXRpb25zKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBjb25kaXRpb25zO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgY29uZGl0aW9ucy5cblx0ICogUmVnYXJkaW5nIGEgbmF2aWdhdGlvbiBwYXRoIGluIHRoZSBJbk91dCBwYXJhbWV0ZXJzIGFuZCBkaXNyZWdhcmRpbmcgcHJlZml4ZXMgaW4gdGhlIG5hdmlnYXRpb24gcGF0aCBsaWtlIGUuZy4gJyRmaWx0ZXJzPi9jb25kaXRpb25zLycgb3IgJ293bmVyJy5cblx0ICogQHBhcmFtIHNvdXJjZUZpZWxkIEluUGFyYW1ldGVyIHByb3BlcnR5IG9mIHRoZSBmaWx0ZXIgZmllbGQgdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc3RhdGUgVGhlIGV4dGVybmFsIGZpbHRlciBzdGF0ZVxuXHQgKiBAcmV0dXJucyBUaGUgZmlsdGVyIGNvbmRpdGlvbnNcblx0ICogQHNpbmNlIDEuMTE0LjBcblx0ICovXG5cdF9nZXRDb25kaXRpb25zRnJvbUluUGFyYW1ldGVyOiBmdW5jdGlvbiAoc291cmNlRmllbGQ6IHN0cmluZywgc3RhdGU6IEV4dGVybmFsU3RhdGVUeXBlKSB7XG5cdFx0Y29uc3Qga2V5ID0gT2JqZWN0LmtleXMoc3RhdGUuZmlsdGVyKS5maW5kKChrZXkpID0+IGtleSA9PT0gc291cmNlRmllbGQpOyAvLyBjb25kaXRpb24gcGF0aCBvZiB0aGUgZmlsdGVyIGZpZWxkXG5cdFx0cmV0dXJuIGtleSAmJiBzdGF0ZS5maWx0ZXJba2V5XTtcblx0fSxcblxuXHRfcGFydGl0aW9uSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoaW5QYXJhbWV0ZXJzOiBJbk91dFBhcmFtZXRlcltdKSB7XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXA6IFJlY29yZDxzdHJpbmcsIEluT3V0UGFyYW1ldGVyW10+ID0ge1xuXHRcdFx0Y29uc3RhbnQ6IFtdLFxuXHRcdFx0YmluZGluZzogW10sXG5cdFx0XHRmaWx0ZXI6IFtdXG5cdFx0fTtcblxuXHRcdGZvciAoY29uc3QgaW5QYXJhbWV0ZXIgb2YgaW5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRpZiAoaW5QYXJhbWV0ZXIuY29uc3RhbnRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGluUGFyYW1ldGVyTWFwLmNvbnN0YW50LnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fSBlbHNlIGlmIChpblBhcmFtZXRlci5zb3VyY2UuaW5kZXhPZihcIiRmaWx0ZXJcIikgPT09IDApIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuZmlsdGVyLnB1c2goaW5QYXJhbWV0ZXIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5QYXJhbWV0ZXJNYXAuYmluZGluZy5wdXNoKGluUGFyYW1ldGVyKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGluUGFyYW1ldGVyTWFwO1xuXHR9LFxuXG5cdF90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGU6IHtcblx0XHRvbkFmdGVyUmVuZGVyaW5nOiBmdW5jdGlvbiAoZXZlbnQ6IGpRdWVyeS5FdmVudCAmIHsgc3JjQ29udHJvbDogQ29udHJvbCB9KSB7XG5cdFx0XHRjb25zdCB0YWJsZSA9IGV2ZW50LnNyY0NvbnRyb2wsIC8vIG0uVGFibGVcblx0XHRcdFx0dGFibGVDZWxsc0RvbVJlZnMgPSB0YWJsZS4kKCkuZmluZChcInRib2R5IC5zYXBNVGV4dFwiKSxcblx0XHRcdFx0bWRjTVRhYmxlID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgTVRhYmxlO1xuXG5cdFx0XHRoaWdobGlnaHRET01FbGVtZW50cyh0YWJsZUNlbGxzRG9tUmVmcywgbWRjTVRhYmxlLmdldEZpbHRlclZhbHVlKCksIHRydWUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgYW4gaW5pdGlhbCBjb25kaXRpb24gY29uZmlndXJhdGlvbiBldmVyeXRpbWUgYSB2YWx1ZSBoZWxwIGNvbnRlbnQgaXMgc2hvd24uXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgcmVxdWVzdGluZyBjb25kaXRpb25zIGNvbmZpZ3VyYXRpb25cblx0ICogQHBhcmFtIGNvbnRyb2wgSW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgY29udHJvbFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIGEgbWFwIG9mIGNvbmRpdGlvbnMgc3VpdGFibGUgZm9yIGEgc2FwLnVpLm1kYy5GaWx0ZXJCYXIgY29udHJvbFxuXHQgKiBAc2luY2UgMS4xMDEuMFxuXHQgKi9cblx0Z2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnM6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogQ29udGVudCwgY29udHJvbDogQ29udHJvbCB8IHVuZGVmaW5lZCkge1xuXHRcdC8vIGhpZ2hsaWdodCB0ZXh0IGluIFZhbHVlSGVscCBwb3BvdmVyXG5cdFx0aWYgKGNvbnRlbnQ/LmlzQTxNVGFibGU+KFwic2FwLnVpLm1kYy52YWx1ZWhlbHAuY29udGVudC5NVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IHBvcG92ZXJUYWJsZSA9IGNvbnRlbnQuZ2V0VGFibGUoKTtcblx0XHRcdHBvcG92ZXJUYWJsZT8ucmVtb3ZlRXZlbnREZWxlZ2F0ZSh0aGlzLl90YWJsZUFmdGVyUmVuZGVyRGVsZWdhdGUpO1xuXHRcdFx0cG9wb3ZlclRhYmxlPy5hZGRFdmVudERlbGVnYXRlKHRoaXMuX3RhYmxlQWZ0ZXJSZW5kZXJEZWxlZ2F0ZSwgdGhpcyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRjb25zdCBpbkNvbmRpdGlvbnM6IENvbmRpdGlvbk9iamVjdE1hcCA9IHt9O1xuXG5cdFx0Ly8gRm9yIGRlZmluZSBjb25kaXRpb25zIHZhbHVlaGVscCBpbml0aWFsIGZpbHRlciBjb25kaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHRoZSBjb250cm9sIG9mIHRoZSBkZWZpbmUgY29uZGl0aW9uc1xuXHRcdC8vIGlzIGNsb25lZCBhbmQgbm90IHRoZSBvcmlnaW5hbCBvbmUgdG8gd2hpY2ggZmllbGQgdmFsdWVoZWxwIHdhcyBhdHRhY2hlZC4gQW5kIGFzIGEgcmVzdWx0IHdlIGNhbm5vdCBnZXQgaW4gcGFyYW1ldGVyIHZhbHVlLiBGb3Igc2ltcGxpY2l0eVxuXHRcdC8vIHdlIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUgY29kZSByZWxhdGVkIHRvIGZpbHRlciBjb25kaXRpb25zLlxuXHRcdGlmIChwYXlsb2FkLmlzRGVmaW5lQ29uZGl0aW9uVmFsdWVIZWxwKSB7XG5cdFx0XHRyZXR1cm4gaW5Db25kaXRpb25zO1xuXHRcdH1cblxuXHRcdGlmICghY29udHJvbCkge1xuXHRcdFx0TG9nLmVycm9yKFwiVmFsdWVIZWxwRGVsZWdhdGU6IENvbnRyb2wgdW5kZWZpbmVkXCIpO1xuXHRcdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0XHR9XG5cblx0XHRjb25zdCBxdWFsaWZpZXIgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdO1xuXHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHF1YWxpZmllcj8udmhQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgPyBWYWx1ZUxpc3RIZWxwZXIuZ2V0SW5QYXJhbWV0ZXJzKHF1YWxpZmllci52aFBhcmFtZXRlcnMpIDogW107XG5cdFx0Y29uc3QgaW5QYXJhbWV0ZXJNYXAgPSB0aGlzLl9wYXJ0aXRpb25JblBhcmFtZXRlcnMoaW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBpc09iamVjdFBhZ2UgPSBjb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRmb3IgKGNvbnN0IGluUGFyYW1ldGVyIG9mIGluUGFyYW1ldGVyTWFwLmNvbnN0YW50KSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb24gPSB0aGlzLl9jcmVhdGVJbml0aWFsRmlsdGVyQ29uZGl0aW9uKFxuXHRcdFx0XHRpblBhcmFtZXRlci5jb25zdGFudFZhbHVlLFxuXHRcdFx0XHRpc09iamVjdFBhZ2UgPyBpblBhcmFtZXRlci5pbml0aWFsVmFsdWVJc1NpZ25pZmljYW50IDogZmFsc2UgLy8gbm8gZmlsdGVyIHdpdGggXCJlbXB0eVwiIG9uIExpc3RSZXBvcnRcblx0XHRcdCk7XG5cdFx0XHRpZiAoY29uZGl0aW9uKSB7XG5cdFx0XHRcdGluQ29uZGl0aW9uc1tpblBhcmFtZXRlci5oZWxwUGF0aF0gPSBbY29uZGl0aW9uXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuYmluZGluZy5sZW5ndGgpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2dldEluaXRpYWxGaWx0ZXJDb25kaXRpb25zRnJvbUJpbmRpbmcoaW5Db25kaXRpb25zLCBjb250cm9sLCBpblBhcmFtZXRlck1hcC5iaW5kaW5nLCBwYXlsb2FkKTtcblx0XHR9XG5cblx0XHRpZiAoaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLmxlbmd0aCkge1xuXHRcdFx0YXdhaXQgdGhpcy5fZ2V0SW5pdGlhbEZpbHRlckNvbmRpdGlvbnNGcm9tRmlsdGVyQmFyKGluQ29uZGl0aW9ucywgY29udHJvbCwgaW5QYXJhbWV0ZXJNYXAuZmlsdGVyLCBwYXlsb2FkKTtcblx0XHR9XG5cdFx0cmV0dXJuIGluQ29uZGl0aW9ucztcblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGNvbnZleSBjdXN0b20gZGF0YSBpbiBjb25kaXRpb25zLlxuXHQgKiBUaGlzIGVuYWJsZXMgYW4gYXBwbGljYXRpb24gdG8gZW5oYW5jZSBjb25kaXRpb25zIHdpdGggZGF0YSByZWxldmFudCBmb3IgY29tYmluZWQga2V5IG9yIG91dHBhcmFtZXRlciBzY2VuYXJpb3MuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgVmFsdWVIZWxwIGNvbnRlbnQgaW5zdGFuY2Vcblx0ICogQHBhcmFtIF92YWx1ZXMgRGVzY3JpcHRpb24gcGFpciBmb3IgdGhlIGNvbmRpdGlvbiB3aGljaCBpcyB0byBiZSBjcmVhdGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IE9wdGlvbmFsIGFkZGl0aW9uYWwgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPcHRpb25hbGx5IHJldHVybnMgYSBzZXJpYWxpemFibGUgb2JqZWN0IHRvIGJlIHN0b3JlZCBpbiB0aGUgY29uZGl0aW9uIHBheWxvYWQgZmllbGRcblx0ICogQHNpbmNlIDEuMTAxLjBcblx0ICovXG5cdGNyZWF0ZUNvbmRpdGlvblBheWxvYWQ6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRjb250ZW50OiBDb250ZW50LFxuXHRcdF92YWx1ZXM6IHVua25vd25bXSxcblx0XHRjb250ZXh0OiBPRGF0YVY0Q29udGV4dFxuXHQpOiBDb25kaXRpb25QYXlsb2FkTWFwIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXHRcdGNvbnN0IHF1YWxpZmllciA9IHBheWxvYWQucXVhbGlmaWVyc1twYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0sXG5cdFx0XHRlbnRyeTogQ29uZGl0aW9uUGF5bG9hZFR5cGUgPSB7fSxcblx0XHRcdGNvbmRpdGlvblBheWxvYWQ6IENvbmRpdGlvblBheWxvYWRNYXAgPSB7fTtcblx0XHRjb25zdCBjb250cm9sID0gY29udGVudC5nZXRDb250cm9sKCk7XG5cdFx0Y29uc3QgaXNNdWx0aVZhbHVlRmllbGQgPSBjb250cm9sPy5pc0EoXCJzYXAudWkubWRjLk11bHRpVmFsdWVGaWVsZFwiKTtcblxuXHRcdC8qIEVYVEVSTkFMSUQ6IHdlIGFkZCB0aGUgdmFsdWUgb2YgdGhlIEZpbHRlckZpZWxkIHRvIHRoZSBjb25kaXRpb25QYXlsb2FkICovXG5cdFx0aWYgKHBheWxvYWQuZXh0ZXJuYWxJZFBhdGggJiYgcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoKSB7XG5cdFx0XHRjb25zdCB2aEtleVByb3BlcnR5ID0gcGF5bG9hZC52YWx1ZUhlbHBLZXlQYXRoO1xuXHRcdFx0Y29uc3QgdmhLZXlWYWx1ZSA9IHF1YWxpZmllci52aEtleXMgJiYgY29udGV4dC5nZXRPYmplY3QocXVhbGlmaWVyLnZoS2V5c1swXSB8fCB2aEtleVByb3BlcnR5KTtcblx0XHRcdGVudHJ5W3BheWxvYWQucHJvcGVydHlQYXRoICsgXCJAJHVpNS5mZS5AQ29tbW9uL0V4dGVybmFsSURcIl0gPSB2aEtleVZhbHVlO1xuXHRcdFx0Y29uZGl0aW9uUGF5bG9hZFtwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllcl0gPSBbZW50cnldO1xuXHRcdH0gZWxzZSBpZiAoIXF1YWxpZmllci52aFByb3BlcnRpZXMgfHwgaXNNdWx0aVZhbHVlRmllbGQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHF1YWxpZmllci52aFByb3BlcnRpZXM/LmZvckVhY2goZnVuY3Rpb24gKHZoS2V5KSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KHZoS2V5KTtcblx0XHRcdGlmICh2YWx1ZSAhPSBudWxsKSB7XG5cdFx0XHRcdGVudHJ5W3ZoS2V5XSA9IHZhbHVlPy5sZW5ndGggPT09IDAgPyBcIlwiIDogdmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbnRyeVt2aEtleV0gPSBudWxsOyAvLyBudWxsIHZhbHVlIGlzIGFsc28gdmFsaWRcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoZW50cnkpLmxlbmd0aCkge1xuXHRcdFx0LyogdmggcXVhbGlmaWVyIGFzIGtleSBmb3IgcmVsZXZhbnQgY29uZGl0aW9uICovXG5cdFx0XHRjb25kaXRpb25QYXlsb2FkW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXSA9IFtlbnRyeV07XG5cdFx0fVxuXHRcdHJldHVybiBjb25kaXRpb25QYXlsb2FkO1xuXHR9LFxuXG5cblx0bW9kaWZ5U2VsZWN0aW9uQmVoYXZpb3VyOiBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRlbnQ6IE1UYWJsZSwgY2hhbmdlOiBTZWxlY3Rpb25DaGFuZ2UpOiAgU2VsZWN0aW9uQ2hhbmdle1xuXHRcdGNvbnN0IGNvbmRpdGlvbnMgPSBjaGFuZ2UuY29uZGl0aW9ucztcblx0XHRjb25zdCBvbGRDb25kaXRpb25zID0gY29udGVudC5nZXRDb25kaXRpb25zKCk7XG5cdFx0Ly8gUHJldmVudCBkZS1zZWxlY3QgaW4gZGlhbG9nIHNjZW5hcmlvc1xuXHRcdGlmICgoY29udGVudD8uZ2V0UGFyZW50KCkgYXMgdW5rbm93biBhcyBWYWx1ZUhlbHBEaWFsb2cpPy5pc1F1aWNrU2VsZWN0QWN0aXZlPy4oKSAmJiAhY29uZGl0aW9ucy5sZW5ndGggJiYgb2xkQ29uZGl0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGNoYW5nZS5jb25kaXRpb25zID0gb2xkQ29uZGl0aW9ucztcblx0XHR9XG5cdFx0cmV0dXJuIGNoYW5nZTtcblx0fSxcblxuXHQvKipcblx0ICogUHJvdmlkZXMgdGhlIHBvc3NpYmlsaXR5IHRvIGN1c3RvbWl6ZSBzZWxlY3Rpb25zIGluICdTZWxlY3QgZnJvbSBsaXN0JyBzY2VuYXJpb3MuXG5cdCAqIEJ5IGRlZmF1bHQsIG9ubHkgY29uZGl0aW9uIGtleXMgYXJlIGNvbnNpZGVyZWQuIFRoaXMgbWF5IGJlIGV4dGVuZGVkIHdpdGggcGF5bG9hZCBkZXBlbmRlbnQgZmlsdGVycy5cblx0ICogQHBhcmFtIHZhbHVlSGVscCBUaGUgPGNvZGU+VmFsdWVIZWxwPC9jb2RlPiBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGVudCBWYWx1ZUhlbHAgY29udGVudCBpbnN0YW5jZVxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IG9mIHRoZSBzZWxlY3RlZCBpdGVtXG5cdCAqIEBwYXJhbSBjb25kaXRpb25zIEN1cnJlbnQgY29uZGl0aW9uc1xuXHQgKiBAcmV0dXJucyBDb25kaXRpb25zIG9yIFtdXG5cdCAqL1xuXHRmaW5kQ29uZGl0aW9uc0ZvckNvbnRleHQ6IGZ1bmN0aW9uIChcblx0XHR2YWx1ZUhlbHA6IFZhbHVlSGVscCxcblx0XHRjb250ZW50OiBGaWx0ZXJhYmxlTGlzdENvbnRlbnQsXG5cdFx0Y29udGV4dDogT0RhdGFWNENvbnRleHQsXG5cdFx0Y29uZGl0aW9uczogQ29uZGl0aW9uT2JqZWN0W11cblx0KSB7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHQvKiBEbyBub3QgY29uc2lkZXIgXCJOb3RWYWxpZGF0ZWRcIiBjb25kaXRpb25zICovXG5cdFx0Y29uZGl0aW9ucyA9IGNvbmRpdGlvbnMuZmlsdGVyKChjb25kaXRpb24pID0+IGNvbmRpdGlvbi52YWxpZGF0ZWQgPT09IENvbmRpdGlvblZhbGlkYXRlZC5WYWxpZGF0ZWQpO1xuXG5cdFx0Y29uc3QgdmhLZXlzID0gcGF5bG9hZC5xdWFsaWZpZXJzW3BheWxvYWQudmFsdWVIZWxwUXVhbGlmaWVyXT8udmhLZXlzIHx8IFtdO1xuXHRcdGNvbnN0IGtleVBhdGggPSBjb250ZW50LmdldEtleVBhdGgoKTtcblx0XHRjb25zdCB2YWx1ZUhlbHBRdWFsaWZpZXIgPSBwYXlsb2FkLnZhbHVlSGVscFF1YWxpZmllciB8fCBcIlwiO1xuXHRcdGNvbnN0IGZpbmRDb25kaXRpb24gPSAoY29uZGl0aW9uUGF5bG9hZE1hcDogQ29uZGl0aW9uUGF5bG9hZE1hcCwgdmFsdWU6IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsKTogYm9vbGVhbiA9PiB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25TZWxlY3RlZFJvdyA9IGNvbmRpdGlvblBheWxvYWRNYXA/Llt2YWx1ZUhlbHBRdWFsaWZpZXJdPy5bMF0gfHwge307XG5cdFx0XHRpZiAodmhLZXlzLmxlbmd0aCA9PT0gMSB8fCBwYXlsb2FkPy51c2VNdWx0aVZhbHVlRmllbGQgfHwgIWNvbmRpdGlvblBheWxvYWRNYXApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQ/LmdldE9iamVjdChrZXlQYXRoKSA9PT0gdmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBjb250ZXh0S2V5cyA9IE9iamVjdC5rZXlzKGNvbnRleHQuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHRyZXR1cm4gdmhLZXlzLmV2ZXJ5KGZ1bmN0aW9uICh2aEtleSkge1xuXHRcdFx0XHRcdHJldHVybiAhY29udGV4dEtleXMuaW5jbHVkZXModmhLZXkpIHx8IGNvbnRleHQ/LmdldE9iamVjdCh2aEtleSkgPT09IGNvbmRpdGlvblNlbGVjdGVkUm93W3ZoS2V5XTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRjb25zdCBzZWxlY3RlZENvbmRpdGlvbiA9IGNvbmRpdGlvbnMuZmluZChmdW5jdGlvbiAoY29uZGl0aW9uKSB7XG5cdFx0XHRjb25zdCBjb25kaXRpb25QYXlsb2FkTWFwID0gY29uZGl0aW9uLnBheWxvYWQgYXMgQ29uZGl0aW9uUGF5bG9hZE1hcDtcblx0XHRcdGlmIChjb250ZXh0Py5nZXRPYmplY3Qoa2V5UGF0aCkgPT09IGNvbmRpdGlvblBheWxvYWRNYXA/Llt2YWx1ZUhlbHBRdWFsaWZpZXJdPy5bMF0/LltrZXlQYXRoXSkge1xuXHRcdFx0XHRyZXR1cm4gZmluZENvbmRpdGlvbihjb25kaXRpb25QYXlsb2FkTWFwLCBjb25kaXRpb25QYXlsb2FkTWFwPy5bdmFsdWVIZWxwUXVhbGlmaWVyXT8uWzBdPy5ba2V5UGF0aF0pO1xuXHRcdFx0fSBlbHNlIGlmIChjb250ZXh0Py5nZXRPYmplY3Qoa2V5UGF0aCkgPT09IGNvbmRpdGlvbj8udmFsdWVzWzBdKSB7XG5cdFx0XHRcdHJldHVybiBmaW5kQ29uZGl0aW9uKGNvbmRpdGlvblBheWxvYWRNYXAsIGNvbmRpdGlvbj8udmFsdWVzWzBdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBzZWxlY3RlZENvbmRpdGlvbiA/IFtzZWxlY3RlZENvbmRpdGlvbl0gOiBbXTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlcyBjb250ZXh0cyBmb3IgYWRkaXRpb25hbCB2YWx1ZXMgYW5kIHJlc3VtZXMgdGhlIGxpc3QgYmluZGluZy5cblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gYWRkaXRpb25hbFZhbHVlcyBBcnJheSBvZiBBZGRpdGlvbmFsVmFsdWVzXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3RQcm9wZXJ0eSBWYWx1ZUxpc3RQcm9wZXJ0eSBvZiB0aGUgcGF5bG9hZFxuXHQgKiBAcGFyYW0gZmllbGQgQ29udHJvbCBjb25uZWN0ZWQgdG8gdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc29ydGVycyBTb3J0ZXJzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZ1xuXHQgKi9cblx0X3VwZGF0ZUJpbmRpbmdXaXRoVHJhbnNpZW50Q29udGV4dHM6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyxcblx0XHRhZGRpdGlvbmFsVmFsdWVzOiBBZGRpdGlvbmFsVmFsdWVUeXBlW10sXG5cdFx0dmFsdWVMaXN0UHJvcGVydHk6IHN0cmluZyxcblx0XHRmaWVsZDogRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZCxcblx0XHRzb3J0ZXJzOiBTb3J0ZXJUeXBlW10sXG5cdFx0dGFibGU6IFRhYmxlXG5cdCkge1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLl91cGRhdGVCaW5kaW5nQXR0cmlidXRlcyhsaXN0QmluZGluZywgYmluZGluZ0luZm8sIHNvcnRlcnMpO1xuXG5cdFx0XHRjb25zdCB7IHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsIHJlY2VudFZhbHVlc0NvbnRleHREYXRhLCBvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSB9ID1cblx0XHRcdFx0YXdhaXQgdGhpcy5fZ2V0UmVsZXZhbnRBZGRpdGlvbmFsVmFsdWVDb250ZXh0RGF0YShcblx0XHRcdFx0XHRhZGRpdGlvbmFsVmFsdWVzLFxuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGJpbmRpbmdJbmZvLFxuXHRcdFx0XHRcdHBheWxvYWQsXG5cdFx0XHRcdFx0dmFsdWVMaXN0UHJvcGVydHksXG5cdFx0XHRcdFx0ZmllbGQsXG5cdFx0XHRcdFx0c29ydGVycyxcblx0XHRcdFx0XHR0YWJsZVxuXHRcdFx0XHQpO1xuXG5cdFx0XHQvLyBubyBncm91cGluZyBzaG91bGQgYmUgc2hvd24gaW4gdGhlIHN1Z2dlc3Rpb24gbGlzdCBpZiB0aGUgc2VhcmNoIHJlc3VsdCBvbmx5IGNvbnRhaW5zIHZhbHVlcyBmcm9tIHRoZSAnT3RoZXJzJyBncm91cFxuXHRcdFx0aWYgKHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEubGVuZ3RoID09PSAwICYmIHJlY2VudFZhbHVlc0NvbnRleHREYXRhLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRsaXN0QmluZGluZy5zb3J0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwYXlsb2FkPy5oaXN0b3J5Py5lbmFibGVkKSB7XG5cdFx0XHRcdHBheWxvYWQuaGlzdG9yeS5oYXNSZWxldmFudERhdGEgPSByZWNlbnRWYWx1ZXNDb250ZXh0RGF0YS5sZW5ndGggIT09IDA7XG5cdFx0XHR9XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBOb3cgd2UgbWFrZSBzdXJlIHRvIHJlc2V0IHRoZSBsaXN0YmluZGluZywgYmVmb3JlIHRoZSB0cmFuc2llbnQgY29udGV4dHMgYXJlIGNyZWF0ZWRcblx0XHRcdFx0YXdhaXQgbGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoaWxlIGNsZWFyaW5nIHRoZSBsaXN0IGJpbmRpbmc6ICR7ZXJyb3J9YCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBhZGQgdHJhbnNpZW50IGNvbnRleHQgdG8gbGlzdCBiaW5kaW5nIGFmdGVyIGJhY2tlbmQgcXVlcnkgaXMgZG9uZVxuXHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLmNyZWF0ZVRyYW5zaWVudENvbnRleHRzRm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEoXG5cdFx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0bGlzdEJpbmRpbmdcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdC8vRG8gbm90aGluZyBhcyB3ZSBrbm93IHRoYXQgcmVzZXQgY2hhbmdlcyB3b3VsZCB0aHJvdyBhbiBlcnJvciBpbiBjb25zb2xlIGFuZCB0aGlzIHdpbGwgcGlsZSB1cCBhIGxvdCBvZiBjb25zb2xlIGVycm9yc1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIE1ldGhvZCB0byBjaGFuZ2UgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHZhbHVlIGhlbHAsIHN1Y2ggYXMgc29ydCwgZmlsdGVyLCBwYXJhbWV0ZXJzIGV0Yy5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKiBAcGFyYW0gc29ydGVycyBTb3J0ZXJzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZ1xuXHQgKi9cblx0X3VwZGF0ZUJpbmRpbmdBdHRyaWJ1dGVzOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0YmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvLFxuXHRcdHNvcnRlcnM6IFNvcnRlclR5cGVbXVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCByb290QmluZGluZyA9IGxpc3RCaW5kaW5nLmdldFJvb3RCaW5kaW5nKCkgfHwgbGlzdEJpbmRpbmc7XG5cdFx0aWYgKCFyb290QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRyb290QmluZGluZy5zdXNwZW5kKCk7XG5cdFx0fVxuXHRcdC8vc29ydCBhbmQgZmlsdGVyIHZhbHVlIGhlbHAgYmluZGluZyB0byBtYWtlIHN1cmUgd2UgcmVuZGVyIG90aGVycyBncm91cFxuXHRcdGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5zb3J0QW5kRmlsdGVyTGlzdEJpbmRpbmcobGlzdEJpbmRpbmcsIHNvcnRlcnMpO1xuXHRcdGlmIChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRsaXN0QmluZGluZy5jaGFuZ2VQYXJhbWV0ZXJzKGJpbmRpbmdJbmZvLnBhcmFtZXRlcnMpO1xuXHRcdH1cblx0XHQvL3Jlc3VtZSB0aGUgbGlzdCBiaW5kaW5nIGFuZCB0aGVuIHJlc2V0IHRoZSBjaGFuZ2VzXG5cdFx0YXdhaXQgYWRkaXRpb25hbFZhbHVlSGVscGVyLnJlc3VtZVZhbHVlTGlzdEJpbmRpbmdBbmRSZXNldENoYW5nZXMobGlzdEJpbmRpbmcpO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCBsaXN0IG9mIGFsbCB0eXBlcyBvZiBhZGRpdGlvbmFsIHZhbHVlIGNvbnRleHQgZGF0YSAocmVjb21tZW5kYXRpb24sIHJlY2VudGx5IHVzZWQgYW5kIG90aGVycykgdG8gYmUgdXNlZC5cblx0ICogQHBhcmFtIGFkZGl0aW9uYWxWYWx1ZXMgQXJyYXkgb2YgQWRkaXRpb25hbFZhbHVlc1xuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgTGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBiaW5kaW5nSW5mbyBUaGUgYmluZGluZyBpbmZvIG9iamVjdCB0byBiZSB1c2VkIHRvIGJpbmQgdGhlIGxpc3QgdG8gdGhlIG1vZGVsXG5cdCAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZm9yIGRlbGVnYXRlXG5cdCAqIEBwYXJhbSB2YWx1ZUxpc3RQcm9wZXJ0eSBWYWx1ZUxpc3RQcm9wZXJ0eSBvZiB0aGUgcGF5bG9hZFxuXHQgKiBAcGFyYW0gZmllbGQgQ29udHJvbCBjb25uZWN0ZWQgdG8gdmFsdWUgaGVscFxuXHQgKiBAcGFyYW0gc29ydGVycyBTb3J0ZXJzIG9mIHRoZSB2YWx1ZSBoZWxwIGxpc3QgYmluZGluZ1xuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2hpY2ggY29udGFpbnMgcmVjb21tZW5kYXRpb25zLCByZWNlbnRseSB1c2VkLCBhbmQgb3RoZXJzIGNvbnRleHQgZGF0YS5cblx0ICovXG5cdF9nZXRSZWxldmFudEFkZGl0aW9uYWxWYWx1ZUNvbnRleHREYXRhOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0YWRkaXRpb25hbFZhbHVlczogQWRkaXRpb25hbFZhbHVlVHlwZVtdLFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGJpbmRpbmdJbmZvOiBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyxcblx0XHRwYXlsb2FkOiBWYWx1ZUhlbHBQYXlsb2FkLFxuXHRcdHZhbHVlTGlzdFByb3BlcnR5OiBzdHJpbmcsXG5cdFx0ZmllbGQ6IEZpbHRlckZpZWxkIHwgTXVsdGlWYWx1ZUZpZWxkIHwgRmllbGQsXG5cdFx0c29ydGVyczogU29ydGVyVHlwZVtdLFxuXHRcdHRhYmxlOiBUYWJsZVxuXHQpOiBQcm9taXNlPHtcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhOiBGaWVsZERhdGFUeXBlW107XG5cdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXTtcblx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YTogRmllbGREYXRhVHlwZVtdO1xuXHR9PiB7XG5cdFx0bGV0IHsgcmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSwgb3RoZXJzVmFsdWVzQ29udGV4dERhdGEgfSA9IGF3YWl0IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5yZXF1ZXN0Rm9yQWRkaXRpb25hbFZhbHVlQ29udGV4dERhdGEoXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVzLFxuXHRcdFx0bGlzdEJpbmRpbmcsXG5cdFx0XHRiaW5kaW5nSW5mbyxcblx0XHRcdHBheWxvYWQsXG5cdFx0XHRzb3J0ZXJzLFxuXHRcdFx0dGFibGVcblx0XHQpO1xuXG5cdFx0Ly8gYXBwbHkgc2VhcmNoIGFuZCBmaWx0ZXJzIHRvIGFkZGl0aW9uYWwgdmFsdWVzIGNvbnRleHQgZGF0YVxuXHRcdGNvbnN0IHZhbHVlSGVscEtleXMgPSBwYXlsb2FkLnF1YWxpZmllcnNbcGF5bG9hZC52YWx1ZUhlbHBRdWFsaWZpZXJdLnZoS2V5cyB8fCBbXTtcblx0XHRyZWNvbW1lbmRhdGlvblZhbHVlc0NvbnRleHREYXRhID0gYWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YShcblx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRhZGRpdGlvbmFsVmFsdWVzWzBdPy52YWx1ZXMsXG5cdFx0XHR2YWx1ZUxpc3RQcm9wZXJ0eVxuXHRcdCk7XG5cblx0XHRsZXQgcmVjZW50VmFsdWVzQ29udGV4dERhdGE6IEZpZWxkRGF0YVR5cGVbXSA9IFtdO1xuXHRcdGlmICghcGF5bG9hZC5pc1ZhbHVlTGlzdFdpdGhGaXhlZFZhbHVlcykge1xuXHRcdFx0Ly8gbm8gaGlzdG9yeSBmb3IgdmFsdWVzIGxpc3RzIHdpdGggZml4ZWQgdmFsdWVzICh0aGV5IGFyZSB1c3VhbGx5IHNob3J0KVxuXHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEgPSBhd2FpdCB0aGlzLl9nZXRIaXN0b3J5RGF0YShwYXlsb2FkLCBmaWVsZCk7XG5cdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSA9IGFkZGl0aW9uYWxWYWx1ZUhlbHBlci5nZXRSZWxldmFudFJlY2VudFZhbHVlc0NvbnRleHREYXRhKFxuXHRcdFx0XHRvdGhlcnNWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdFx0cmVjZW50VmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRcdHZhbHVlSGVscEtleXMsXG5cdFx0XHRcdChiaW5kaW5nSW5mby5wYXJhbWV0ZXJzIGFzIEJpbmRpbmdJbmZvUGFyYW1ldGVycykuJHNlYXJjaD8ucmVwbGFjZUFsbCgnXCInLCBcIlwiKSxcblx0XHRcdFx0YmluZGluZ0luZm9cblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGEgPSBhZGRpdGlvbmFsVmFsdWVIZWxwZXIuZ2V0UmVsZXZhbnRPdGhlcnNWYWx1ZXNDb250ZXh0RGF0YShcblx0XHRcdHJlY29tbWVuZGF0aW9uVmFsdWVzQ29udGV4dERhdGEsXG5cdFx0XHRyZWNlbnRWYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdG90aGVyc1ZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0dmFsdWVIZWxwS2V5c1xuXHRcdCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVjb21tZW5kYXRpb25WYWx1ZXNDb250ZXh0RGF0YSxcblx0XHRcdHJlY2VudFZhbHVlc0NvbnRleHREYXRhLFxuXHRcdFx0b3RoZXJzVmFsdWVzQ29udGV4dERhdGFcblx0XHR9O1xuXHR9LFxuXHQvKipcblx0ICogRXhlY3V0ZXMgYSBmaWx0ZXIgaW4gYSA8Y29kZT5MaXN0QmluZGluZzwvY29kZT4gYW5kIHJlc3VtZXMgaXQsIGlmIHN1c3BlbmRlZC5cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIExpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gYmluZGluZ0luZm8gVGhlIGJpbmRpbmcgaW5mbyBvYmplY3QgdG8gYmUgdXNlZCB0byBiaW5kIHRoZSBsaXN0IHRvIHRoZSBtb2RlbFxuXHQgKi9cblx0X3VwZGF0ZUJpbmRpbmc6IGZ1bmN0aW9uIChsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgYmluZGluZ0luZm86IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvKSB7XG5cdFx0Y29uc3Qgcm9vdEJpbmRpbmcgPSBsaXN0QmluZGluZy5nZXRSb290QmluZGluZygpIHx8IGxpc3RCaW5kaW5nO1xuXHRcdGlmICghcm9vdEJpbmRpbmcuaXNTdXNwZW5kZWQoKSkge1xuXHRcdFx0cm9vdEJpbmRpbmcuc3VzcGVuZCgpO1xuXHRcdH1cblx0XHRpZiAoYmluZGluZ0luZm8ucGFyYW1ldGVycykge1xuXHRcdFx0bGlzdEJpbmRpbmcuY2hhbmdlUGFyYW1ldGVycyhiaW5kaW5nSW5mby5wYXJhbWV0ZXJzKTtcblx0XHR9XG5cdFx0bGlzdEJpbmRpbmcuZmlsdGVyKGJpbmRpbmdJbmZvLmZpbHRlcnMsIEZpbHRlclR5cGUuQXBwbGljYXRpb24pO1xuXHRcdGxpc3RCaW5kaW5nLnNvcnQoYmluZGluZ0luZm8uc29ydGVyKTtcblxuXHRcdGlmIChyb290QmluZGluZy5pc1N1c3BlbmRlZCgpKSB7XG5cdFx0XHRyb290QmluZGluZy5yZXN1bWUoKTtcblx0XHRcdHJvb3RCaW5kaW5nLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0fSxcblx0LyoqXG5cdCAqIFJldHVybnMgYW4gYm9vbGVhbiB2YWx1ZSBpZiBhZGRpdGlvbmFsdmFsdWVzIGV4aXN0cyB3aGljaCB3aWxsIGNvbnRhaW4gZGlmZmVyZW50IGdyb3VwcyBsaWtlIHJlY29tbWVuZGF0aW9ucy5cblx0ICogQHBhcmFtIGNvbnRlbnQgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHBhcmFtIGNoZWNrUmVjb21tZW5kYXRpb25zIERlZmluZXMgaWYgd2Ugc2hhbGwgY2hlY2sgZm9yIHJlY29tbWVuZGF0aW9uc1xuXHQgKiBAcmV0dXJucyBCb29sZWFuIHZhbHVlXG5cdCAqL1xuXHRfY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHM6IGFzeW5jIGZ1bmN0aW9uIChjb250ZW50OiBNVGFibGUsIHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQsIGNoZWNrUmVjb21tZW5kYXRpb25zID0gdHJ1ZSkge1xuXHRcdC8vIEZvciBkZWZpbmUgY29uZGl0aW9ucyB2YWx1ZWhlbHAgcmVjb21tZW5kYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgXCJpbnRlcm5hbFwiIG1vZGVsIGlzIG5vdCBhdmFpbGFibGUuXG5cdFx0aWYgKHBheWxvYWQuaXNEZWZpbmVDb25kaXRpb25WYWx1ZUhlbHApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRjb25zdCByZWNvbW1lbmRhdGlvblZhbHVlcyA9IGNoZWNrUmVjb21tZW5kYXRpb25zID8gdGhpcy5nZXRSZWxldmFudFJlY29tbWVuZGF0aW9ucyhjb250ZW50LCBwYXlsb2FkKSA6IFtdO1xuXHRcdGlmIChyZWNvbW1lbmRhdGlvblZhbHVlcz8ubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9pZiB0aGVyZSBhcmUgcmVsZXZhbnQgcmVjb21tZW5kYXRpb25zIHRoZW4gcmV0dXJuIHRydWVcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChwYXlsb2FkLmhpc3Rvcnk/LmVuYWJsZWQpIHtcblx0XHRcdC8vIG5vdyBjaGVjayBmb3IgcmVjZW50IHZhbHVlc1xuXHRcdFx0aWYgKHBheWxvYWQuaGlzdG9yeS5oYXNSZWxldmFudERhdGEgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gcGF5bG9hZC5oaXN0b3J5Lmhhc1JlbGV2YW50RGF0YTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlY2VudFZhbHVlcyA9IGF3YWl0IHRoaXMuX2dldEhpc3RvcnlEYXRhKHBheWxvYWQsIGNvbnRlbnQuZ2V0Q29udHJvbCgpKTtcblx0XHRcdGlmIChyZWNlbnRWYWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRcdC8vaWYgdGhlcmUgYXJlIHJlY2VudGx5IGVudGVyZWQgdmFsdWVzIHJldHVybiB0cnVlXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHJlbGV2YW50IHJlY29tbWVuZGF0aW9ucy5cblx0ICogQHBhcmFtIGNvbnRlbnQgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICogQHBhcmFtIHBheWxvYWQgUGF5bG9hZCBmb3IgZGVsZWdhdGVcblx0ICogQHJldHVybnMgUmVsZXZhbnQgcmVjb21tZW5kYXRpb25zXG5cdCAqL1xuXHRnZXRSZWxldmFudFJlY29tbWVuZGF0aW9ucyhjb250ZW50OiBNVGFibGUsIHBheWxvYWQ6IFZhbHVlSGVscFBheWxvYWQpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcblx0XHRsZXQgdmFsdWVzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG5cdFx0Y29uc3QgaXNGaWx0ZXJGaWVsZE9yTXVsdGlWYWx1ZWRGaWVsZCA9XG5cdFx0XHRjb250ZW50LmdldENvbnRyb2woKS5pc0EoXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpIHx8IGNvbnRlbnQuZ2V0Q29udHJvbCgpLmlzQShcInNhcC51aS5tZGMuTXVsdGlWYWx1ZUZpZWxkXCIpO1xuXG5cdFx0aWYgKCFpc0ZpbHRlckZpZWxkT3JNdWx0aVZhbHVlZEZpZWxkKSB7XG5cdFx0XHRjb25zdCBjb250ZW50TW9kZWwgPSBjb250ZW50LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCAmIHsgZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWw6IEZ1bmN0aW9uIH07XG5cdFx0XHRjb25zdCBsb2NhbEFubm90YXRpb25Nb2RlbCA9IGNvbnRlbnRNb2RlbC5nZXRMb2NhbEFubm90YXRpb25Nb2RlbCAmJiBjb250ZW50TW9kZWwuZ2V0TG9jYWxBbm5vdGF0aW9uTW9kZWwoKTtcblx0XHRcdGlmIChsb2NhbEFubm90YXRpb25Nb2RlbCkge1xuXHRcdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dFBhdGggPSBjb250ZW50LmdldENvbnRyb2woKS5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCk7XG5cdFx0XHRcdGNvbnN0IGZpZWxkUGF0aCA9IGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKT8uZ2V0UGF0aCgpO1xuXHRcdFx0XHR2YWx1ZXMgPSBsb2NhbEFubm90YXRpb25Nb2RlbC5nZXRPYmplY3QoYCR7YmluZGluZ0NvbnRleHRQYXRofS8ke2ZpZWxkUGF0aH1AJHVpNS5mZS5yZWNvbW1lbmRhdGlvbnMudHlwZUFoZWFkVmFsdWVzYCkgPz8gW107XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgaW5wdXRWYWx1ZXMgPSAoY29udGVudC5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbCkuZ2V0UHJvcGVydHkoXCIvcmVjb21tZW5kYXRpb25zRGF0YVwiKSB8fCB7fTtcblx0XHRcdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBjb250ZW50LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdHZhbHVlcyA9XG5cdFx0XHRcdFx0YWRkaXRpb25hbFZhbHVlSGVscGVyLmdldFJlbGV2YW50UmVjb21tZW5kYXRpb25zKFxuXHRcdFx0XHRcdFx0aW5wdXRWYWx1ZXMsXG5cdFx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dCxcblx0XHRcdFx0XHRcdHBheWxvYWQucHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0Y29udGVudC5nZXRDb250cm9sKCkuZ2V0QmluZGluZyhcInZhbHVlXCIpPy5nZXRQYXRoKClcblx0XHRcdFx0XHQpIHx8IFtdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWVzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSB3aGljaCB3aWxsIHRlbGwgd2hldGhlciB0eXBlYWhlYWQgc2hvdWxkIGJlIG9wZW5lZCBvciBub3QuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRlbnQgRmlsdGVyYWJsZSBMaXN0IENvbnRlbnRcblx0ICogQHJldHVybnMgQm9vbGVhbiB2YWx1ZSB3aGV0aGVyIHRvIHNob3cgdHlwZWFoZWFkIG9yIG5vdFxuXHQgKi9cblx0dHlwZUFoZWFkRm9yRmlsdGVyYWJsZUNvbnRlbnQ6IGFzeW5jIGZ1bmN0aW9uICh2YWx1ZUhlbHA6IFZhbHVlSGVscCwgY29udGVudDogTURDUG9wb3Zlcikge1xuXHRcdGxldCBzaG93SXQgPSB0cnVlO1xuXHRcdGNvbnN0IHR5cGVBaGVhZENvbnRlbnQgPSBjb250ZW50Py5nZXRDb250ZW50KClbMF0gYXMgTVRhYmxlO1xuXHRcdGNvbnN0IGZpbHRlclZhbHVlID0gdmFsdWVIZWxwPy5nZXRGaWx0ZXJWYWx1ZSgpO1xuXHRcdGNvbnN0IGZpZWxkID0gdHlwZUFoZWFkQ29udGVudC5nZXRDb250cm9sKCkgYXMgRmlsdGVyRmllbGQgfCBNdWx0aVZhbHVlRmllbGQgfCBGaWVsZDtcblx0XHRjb25zdCBwYXlsb2FkID0gdmFsdWVIZWxwLmdldFBheWxvYWQoKSBhcyBWYWx1ZUhlbHBQYXlsb2FkO1xuXG5cdFx0aWYgKGZpZWxkLmlzQTxGaWx0ZXJGaWVsZD4oXCJzYXAudWkubWRjLkZpbHRlckZpZWxkXCIpIHx8IGZpZWxkLmlzQTxNdWx0aVZhbHVlRmllbGQ+KFwic2FwLnVpLm1kYy5NdWx0aVZhbHVlRmllbGRcIikpIHtcblx0XHRcdGlmICghZmlsdGVyVmFsdWUpIHtcblx0XHRcdFx0Ly8gYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJlY29tbWVuZGF0aW9uIFVYIHdlIGRvbid0IGNoZWNrIGZvciByZWNvbW1lbmRhdGlvbnMgYnV0IHJlY2VudGx5IGVudGVyZWQgdmFsdWVzIG9ubHlcblx0XHRcdFx0c2hvd0l0ID0gYXdhaXQgdGhpcy5fY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHModHlwZUFoZWFkQ29udGVudCwgcGF5bG9hZCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBmaWVsZFZhbHVlID0gZmllbGQuZ2V0VmFsdWUoKTtcblx0XHRcdGNvbnN0IGZpZWxkVGV4dFZhbHVlID0gZmllbGQuZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHRpZiAoZmllbGRWYWx1ZSB8fCBmaWVsZFRleHRWYWx1ZSkge1xuXHRcdFx0XHQvLyB2YWx1ZWhlbHAgaGFkIHNvbWUgdmFsdWUsIGJ1dCB1c2VyIGNsZWFyZWQgdGhlIHZhbHVlXG5cdFx0XHRcdC8vIGluIHN1Y2ggY2FzZSB3ZSBnZXQgaW5wdXQgdmFsdWUgYXMgJycgYW5kIHdlIHdpbGwgcmV0dXJuIGZhbHNlXG5cdFx0XHRcdC8vTm90ZTogSW4gU0RzIHVzZWNhc2Ugd2Ugd2FudGVkIHRvIG9wZW4gdGhlIHR5cGVBaGVhZCBpZiB0aGVyZSBhcmUgcmVjb21tZW5kYXRpb25zIGFuZCB2YWx1ZSBpcyBibGFuaywgdGhleSBzaG91bGQgcGFzcyB1cyBhIGZsYWcgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHRoaXMgYWNjb3JkaW5nbHlcblx0XHRcdFx0Y29uc3QgaXNEaWdpdFNlcXVlbmNlID1cblx0XHRcdFx0XHQoZmllbGQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKS5nZXRPYmplY3QoYCR7cGF5bG9hZC5wcm9wZXJ0eVBhdGh9JHtBbm5vdGF0aW9uSXNEaWdpdFNlcXVlbmNlfWApID8/XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHRcdGlmIChmaWVsZC5oYXNQZW5kaW5nVXNlcklucHV0KCkgfHwgdGhpcy5faXNFbXB0eURpZ2l0U2VxdWVuY2UoZmllbGRWYWx1ZSwgaXNEaWdpdFNlcXVlbmNlKSkge1xuXHRcdFx0XHRcdHNob3dJdCA9IGZpbHRlclZhbHVlICE9PSBcIlwiIHx8IChhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkKSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gY2hlY2sgcmVjZW50bHkgdXNlZCBvbmx5XG5cdFx0XHRcdFx0c2hvd0l0ID0gYXdhaXQgdGhpcy5fY2hlY2tJZkFkZGl0aW9uYWxWYWx1ZXNFeGlzdHModHlwZUFoZWFkQ29udGVudCwgcGF5bG9hZCwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKCFmaWx0ZXJWYWx1ZSkge1xuXHRcdFx0XHRzaG93SXQgPSBhd2FpdCB0aGlzLl9jaGVja0lmQWRkaXRpb25hbFZhbHVlc0V4aXN0cyh0eXBlQWhlYWRDb250ZW50LCBwYXlsb2FkKTtcblx0XHRcdFx0Ly8gZWxzZTogdGhlIHVzZXIgdHlwZXMsIHdlIHNoYWxsIGFsd2F5cyBzaG93IHRoZSBvdGhlciB2YWx1ZXNcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNob3dJdDtcblx0fSxcblxuXHRjb25kaXRpb25Gb3JSZXF1ZXN0U2hvd0NvbnRhaW5lcjogYXN5bmMgZnVuY3Rpb24gKHZhbHVlSGVscDogVmFsdWVIZWxwLCBjb250ZW50OiBNRENQb3BvdmVyKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHBhcmVudENvbnRyb2wgPSB2YWx1ZUhlbHAuZ2V0Q29udHJvbCgpO1xuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wgJiYgcGFyZW50Q29udHJvbD8uaXNBPEZpbHRlckZpZWxkPihcInNhcC51aS5tZGMuRmlsdGVyRmllbGRcIikpIHtcblx0XHRcdFx0Y29uc3QgZmllbGRJZCA9IHBhcmVudENvbnRyb2wuZ2V0Q29udGVudCgpPy5nZXRJZCgpO1xuXHRcdFx0XHRjb25zdCBpc1Zpc3VhbEZpbHRlciA9IGZpZWxkSWQgPyBmaWVsZElkLmluY2x1ZGVzKFwiVmlzdWFsRmlsdGVyXCIpIDogZmFsc2U7XG5cdFx0XHRcdC8vVmlzdWFsIEZpbHRlciBjb250YWluaW5nIHZhbHVlSGVscCBzaG91bGQgbm90IG9wZW4gb24gZm9jdXMgZm9yIHJlY2VudGx5IHNlbGVjdGVkIHZhbHVlcyBvIHIgcmVjb21tZW5kYXRpb25zXG5cdFx0XHRcdGlmIChpc1Zpc3VhbEZpbHRlcikge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB2YWx1ZUhlbHBUYWJsZSA9IGNvbnRlbnQ/LmdldENvbnRlbnQoKVswXSBhcyBNVGFibGU7XG5cdFx0XHRsZXQgY29udHJvbDogVUk1RWxlbWVudCB8IERpYWxvZyB8IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGdldFBhcmVudERpYWxvZyA9IGZ1bmN0aW9uIChpbm5lckNvbnRlbnQ6IFVJNUVsZW1lbnQpOiBEaWFsb2cgfCB1bmRlZmluZWQge1xuXHRcdFx0XHRjb250cm9sID0gaW5uZXJDb250ZW50Py5nZXRQYXJlbnQoKSBhcyBVSTVFbGVtZW50O1xuXHRcdFx0XHRpZiAoY29udHJvbCAmJiBjb250cm9sLmlzQTxEaWFsb2c+KFwic2FwLm0uRGlhbG9nXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRyb2w7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29udHJvbCA9PT0gdW5kZWZpbmVkIHx8IGNvbnRyb2wgPT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBnZXRQYXJlbnREaWFsb2coY29udHJvbCk7XG5cdFx0XHR9O1xuXHRcdFx0Y29udHJvbCA9IGdldFBhcmVudERpYWxvZyhjb250ZW50KTtcblx0XHRcdGlmIChcblx0XHRcdFx0Y29udHJvbCAmJlxuXHRcdFx0XHRjb250cm9sLmRhdGEoXCJmZV9Jbml0aWFsVHlwZUFoZWFkRm9jdXNEb25lXCIpID09PSBudWxsICYmXG5cdFx0XHRcdGNvbnRlbnQuZ2V0Q29udHJvbCgpLmdldERvbVJlZigpPy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpWzBdLmlkID09PSAoY29udHJvbCBhcyBEaWFsb2cpLmdldEluaXRpYWxGb2N1cygpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udHJvbC5kYXRhKFwiZmVfSW5pdGlhbFR5cGVBaGVhZEZvY3VzRG9uZVwiLCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcGF5bG9hZCA9IHZhbHVlSGVscC5nZXRQYXlsb2FkKCkgYXMgVmFsdWVIZWxwUGF5bG9hZDtcblx0XHRcdFx0cGF5bG9hZC5oaXN0b3J5ID0gcGF5bG9hZC5oaXN0b3J5IHx8IHt9O1xuXHRcdFx0XHRwYXlsb2FkLmhpc3RvcnkuaGFzUmVsZXZhbnREYXRhID0gdW5kZWZpbmVkOyAvLyBuZWVkcyB0byBiZSBpbml0aWFsaXplXG5cdFx0XHRcdHBheWxvYWQuaGlzdG9yeS5lbmFibGVkID0gcGF5bG9hZC5oaXN0b3J5LmVuYWJsZWQgPz8gVmFsdWVMaXN0SGVscGVyLmNoZWNrSGlzdG9yeUVuYWJsZWQodmFsdWVIZWxwLCBwYXlsb2FkKTtcblx0XHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMuX2NoZWNrSWZBZGRpdGlvbmFsVmFsdWVzRXhpc3RzKHZhbHVlSGVscFRhYmxlLCBwYXlsb2FkKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0TG9nLmVycm9yKGVycm9yIGFzIHN0cmluZyk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGJvb2xlYW4gdmFsdWUgZGV0ZXJtaW5pbmcgaWYgcmVxdWVzdFNob3dDb250YWluZXIgc2hhbGwgb3BlbiB0aGUgcG9wb3ZlciBvciBub3QuXG5cdCAqIEBwYXJhbSB2YWx1ZUhlbHAgVGhlIDxjb2RlPlZhbHVlSGVscDwvY29kZT4gaW5zdGFuY2Vcblx0ICogQHBhcmFtIGNvbnRhaW5lciBGaWx0ZXJhYmxlIExpc3QgQ29udGVudFxuXHQgKiBAcGFyYW0gcmVxdWVzdFNob3dDb250YWluZXJSZWFzb24gRW51bSBkZWZpbmluZyB0aGUgcmVhc29uIGZvciBwb3NzaWJsZSB0cmlnZ2VyXG5cdCAqIEByZXR1cm5zIEJvb2xlYW4gdmFsdWVcblx0ICovXG5cdHJlcXVlc3RTaG93Q29udGFpbmVyOiBhc3luYyBmdW5jdGlvbiAodmFsdWVIZWxwOiBWYWx1ZUhlbHAsIGNvbnRhaW5lcjogTURDUG9wb3ZlciwgcmVxdWVzdFNob3dDb250YWluZXJSZWFzb246IHN0cmluZykge1xuXHRcdC8vIEVuc3VyZSB0aGUgdmFsdWUgaGVscCBwb3BvdmVyIG9wZW5zIGZvciB0eXBpbmcsIGZpbHRlciwgdGFwIGV2ZW50cyBhbmQgdGFiIG5hdmlnYXRpb25cblx0XHRpZiAoW1JlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLlRhYiwgUmVxdWVzdFNob3dDb250YWluZXJSZWFzb24uVGFwXS5pbmNsdWRlcyhyZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbikpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbmRpdGlvbkZvclJlcXVlc3RTaG93Q29udGFpbmVyKHZhbHVlSGVscCwgY29udGFpbmVyKTtcblx0XHR9IGVsc2UgaWYgKFtSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbi5UeXBpbmcsIFJlcXVlc3RTaG93Q29udGFpbmVyUmVhc29uLkZpbHRlcl0uaW5jbHVkZXMocmVxdWVzdFNob3dDb250YWluZXJSZWFzb24pKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50eXBlQWhlYWRGb3JGaWx0ZXJhYmxlQ29udGVudCh2YWx1ZUhlbHAsIGNvbnRhaW5lcik7XG5cdFx0fVxuXHRcdHJldHVybiBSZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbi5WYWx1ZUhlbHBSZXF1ZXN0ID09PSByZXF1ZXN0U2hvd0NvbnRhaW5lclJlYXNvbjtcblx0fVxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztFQW9EQSxNQUFNQSx1QkFBdUIsR0FBRyxrQ0FBa0M7RUFDbEUsTUFBTUMseUJBQXlCLEdBQUcsaURBQWlEO0VBQUMsT0E0QnJFQyxNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRUMsaUJBQWlCLEVBQUU7SUFDbkRDLFVBQVUsRUFBRSxDQUFDO0lBQ2JDLHlCQUF5QixFQUFFLElBQUlDLE9BQU8sQ0FBd0IsQ0FBQztJQUUvRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNDQyxpQkFBaUIsRUFBRSxTQUFBQSxDQUFVQyxTQUFvQixFQUFFQyxPQUE4QixFQUFFQyxZQUE4QixFQUFFO01BQ2xILE9BQU8sQ0FBQyxDQUFDRCxPQUFPLENBQUNFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDQ0MsaUJBQWlCLEVBQUUsU0FBQUEsQ0FBVUosU0FB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