@sapui5/sap.fe.templates 1.112.0 → 1.114.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 (107) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/manifest.json +1 -1
  4. package/src/sap/fe/templates/ListReport/ExtensionAPI-dbg.js +3 -1
  5. package/src/sap/fe/templates/ListReport/ExtensionAPI.js.map +1 -1
  6. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +2 -0
  7. package/src/sap/fe/templates/ListReport/ListReport.view.xml +1 -1
  8. package/src/sap/fe/templates/ListReport/ListReportController-dbg.controller.js +23 -14
  9. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1 -1
  10. package/src/sap/fe/templates/ListReport/ListReportController.controller.js.map +1 -1
  11. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +24 -11
  12. package/src/sap/fe/templates/ListReport/ListReportTemplating-dbg.js +7 -7
  13. package/src/sap/fe/templates/ListReport/ListReportTemplating.js.map +1 -1
  14. package/src/sap/fe/templates/ListReport/ListReportTemplating.ts +8 -6
  15. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl-dbg.js +3 -3
  16. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +1 -1
  17. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js.map +1 -1
  18. package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.ts +1 -2
  19. package/src/sap/fe/templates/ListReport/manifest.json +1 -1
  20. package/src/sap/fe/templates/ListReport/overrides/ViewState-dbg.js +14 -39
  21. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +1 -1
  22. package/src/sap/fe/templates/ListReport/overrides/ViewState.js.map +1 -1
  23. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +14 -42
  24. package/src/sap/fe/templates/ListReport/view/fragments/MacroChart.fragment.xml +1 -1
  25. package/src/sap/fe/templates/ObjectPage/Component-dbg.js +2 -2
  26. package/src/sap/fe/templates/ObjectPage/Component.js +1 -1
  27. package/src/sap/fe/templates/ObjectPage/Component.js.map +1 -1
  28. package/src/sap/fe/templates/ObjectPage/Component.ts +1 -1
  29. package/src/sap/fe/templates/ObjectPage/ExtensionAPI-dbg.js +21 -6
  30. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +1 -1
  31. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js.map +1 -1
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +21 -9
  33. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +5 -1
  34. package/src/sap/fe/templates/ObjectPage/ObjectPageController-dbg.controller.js +149 -87
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1 -1
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js.map +1 -1
  37. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +166 -95
  38. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating-dbg.js +12 -1
  39. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +1 -1
  40. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js.map +1 -1
  41. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +11 -0
  42. package/src/sap/fe/templates/ObjectPage/manifest.json +1 -1
  43. package/src/sap/fe/templates/ObjectPage/overrides/Share-dbg.js +7 -2
  44. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +1 -1
  45. package/src/sap/fe/templates/ObjectPage/overrides/Share.js.map +1 -1
  46. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +5 -1
  47. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +3 -1
  48. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.block-dbg.js +7 -6
  49. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.block.js +1 -1
  50. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.block.js.map +1 -1
  51. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.block.tsx +8 -7
  52. package/src/sap/fe/templates/ObjectPage/view/fragments/MacroChart.fragment.xml +1 -1
  53. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +93 -45
  54. package/src/sap/fe/templates/library-dbg.js +1 -1
  55. package/src/sap/fe/templates/library-preload.js +20 -20
  56. package/src/sap/fe/templates/library-preload.js.map +1 -1
  57. package/src/sap/fe/templates/library.js +1 -1
  58. package/src/sap/fe/templates/manifest.json +1 -1
  59. package/src/sap/fe/templates/messagebundle.properties +6 -0
  60. package/src/sap/fe/templates/messagebundle_ar.properties +2 -0
  61. package/src/sap/fe/templates/messagebundle_bg.properties +3 -1
  62. package/src/sap/fe/templates/messagebundle_ca.properties +2 -0
  63. package/src/sap/fe/templates/messagebundle_cs.properties +2 -0
  64. package/src/sap/fe/templates/messagebundle_cy.properties +2 -0
  65. package/src/sap/fe/templates/messagebundle_da.properties +2 -0
  66. package/src/sap/fe/templates/messagebundle_de.properties +4 -2
  67. package/src/sap/fe/templates/messagebundle_el.properties +2 -0
  68. package/src/sap/fe/templates/messagebundle_en.properties +2 -2
  69. package/src/sap/fe/templates/messagebundle_en_GB.properties +3 -1
  70. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +2 -0
  71. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +2 -0
  72. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +2 -0
  73. package/src/sap/fe/templates/messagebundle_es.properties +2 -0
  74. package/src/sap/fe/templates/messagebundle_es_MX.properties +2 -0
  75. package/src/sap/fe/templates/messagebundle_et.properties +2 -0
  76. package/src/sap/fe/templates/messagebundle_fi.properties +2 -0
  77. package/src/sap/fe/templates/messagebundle_fr.properties +2 -0
  78. package/src/sap/fe/templates/messagebundle_fr_CA.properties +3 -1
  79. package/src/sap/fe/templates/messagebundle_hi.properties +3 -1
  80. package/src/sap/fe/templates/messagebundle_hr.properties +2 -0
  81. package/src/sap/fe/templates/messagebundle_hu.properties +2 -0
  82. package/src/sap/fe/templates/messagebundle_id.properties +3 -1
  83. package/src/sap/fe/templates/messagebundle_it.properties +2 -0
  84. package/src/sap/fe/templates/messagebundle_iw.properties +2 -0
  85. package/src/sap/fe/templates/messagebundle_ja.properties +2 -0
  86. package/src/sap/fe/templates/messagebundle_kk.properties +2 -0
  87. package/src/sap/fe/templates/messagebundle_ko.properties +3 -1
  88. package/src/sap/fe/templates/messagebundle_lt.properties +2 -0
  89. package/src/sap/fe/templates/messagebundle_lv.properties +3 -1
  90. package/src/sap/fe/templates/messagebundle_ms.properties +2 -0
  91. package/src/sap/fe/templates/messagebundle_nl.properties +2 -0
  92. package/src/sap/fe/templates/messagebundle_no.properties +2 -0
  93. package/src/sap/fe/templates/messagebundle_pl.properties +3 -1
  94. package/src/sap/fe/templates/messagebundle_pt.properties +2 -0
  95. package/src/sap/fe/templates/messagebundle_pt_PT.properties +2 -0
  96. package/src/sap/fe/templates/messagebundle_ro.properties +3 -1
  97. package/src/sap/fe/templates/messagebundle_ru.properties +3 -1
  98. package/src/sap/fe/templates/messagebundle_sh.properties +2 -0
  99. package/src/sap/fe/templates/messagebundle_sk.properties +2 -0
  100. package/src/sap/fe/templates/messagebundle_sl.properties +2 -0
  101. package/src/sap/fe/templates/messagebundle_sv.properties +3 -1
  102. package/src/sap/fe/templates/messagebundle_th.properties +2 -0
  103. package/src/sap/fe/templates/messagebundle_tr.properties +2 -0
  104. package/src/sap/fe/templates/messagebundle_uk.properties +2 -0
  105. package/src/sap/fe/templates/messagebundle_vi.properties +2 -0
  106. package/src/sap/fe/templates/messagebundle_zh_CN.properties +3 -1
  107. package/src/sap/fe/templates/messagebundle_zh_TW.properties +3 -1
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2023 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/Manage", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/MessageHandler", "sap/fe/core/controllerextensions/PageReady", "sap/fe/core/controllerextensions/Paginator", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/PageController", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/table/TableHelper", "sap/fe/macros/table/Utils", "sap/fe/navigation/SelectionVariant", "sap/fe/templates/ObjectPage/ExtensionAPI", "sap/fe/templates/TableScroller", "sap/m/InstanceManager", "sap/m/Link", "sap/m/MessageBox", "sap/ui/core/Core", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding", "./overrides/IntentBasedNavigation", "./overrides/InternalRouting", "./overrides/MessageHandler", "./overrides/Paginator", "./overrides/Share", "./overrides/ViewState"], function (Log, merge, ActionRuntime, CommonUtils, BusyLocker, ActivitySync, Manage, draft, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, MassEdit, MessageHandler, PageReady, Paginator, Placeholder, Share, ViewState, ClassSupport, ModelHelper, ResourceModelHelper, PageController, CommonHelper, DelegateUtil, TableHelper, TableUtils, SelectionVariant, ExtensionAPI, TableScroller, InstanceManager, Link, MessageBox, Core, OverrideExecution, ODataListBinding, IntentBasedNavigationOverride, InternalRoutingOverride, MessageHandlerOverride, PaginatorOverride, ShareOverrides, ViewStateOverrides) {
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/Manage", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/MessageHandler", "sap/fe/core/controllerextensions/PageReady", "sap/fe/core/controllerextensions/Paginator", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/library", "sap/fe/core/PageController", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/table/TableHelper", "sap/fe/macros/table/Utils", "sap/fe/navigation/SelectionVariant", "sap/fe/templates/ObjectPage/ExtensionAPI", "sap/fe/templates/TableScroller", "sap/m/InstanceManager", "sap/m/Link", "sap/m/MessageBox", "sap/ui/core/Core", "sap/ui/core/message/Message", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding", "./overrides/IntentBasedNavigation", "./overrides/InternalRouting", "./overrides/MessageHandler", "./overrides/Paginator", "./overrides/Share", "./overrides/ViewState"], function (Log, merge, ActionRuntime, CommonUtils, BusyLocker, ActivitySync, Manage, draft, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, MassEdit, MessageHandler, PageReady, Paginator, Placeholder, Share, ViewState, ClassSupport, ModelHelper, ResourceModelHelper, FELibrary, PageController, CommonHelper, DelegateUtil, TableHelper, TableUtils, SelectionVariant, ExtensionAPI, TableScroller, InstanceManager, Link, MessageBox, Core, Message, OverrideExecution, ODataListBinding, IntentBasedNavigationOverride, InternalRoutingOverride, MessageHandlerOverride, PaginatorOverride, ShareOverrides, ViewStateOverrides) {
6
6
  "use strict";
7
7
 
8
8
  var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10;
@@ -23,6 +23,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
23
23
  function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
24
24
  function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
25
25
  function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
26
+ const ProgrammingModel = FELibrary.ProgrammingModel;
26
27
  let ObjectPageController = (_dec = defineUI5Class("sap.fe.templates.ObjectPage.ObjectPageController"), _dec2 = usingExtension(Placeholder), _dec3 = usingExtension(Share.override(ShareOverrides)), _dec4 = usingExtension(InternalRouting.override(InternalRoutingOverride)), _dec5 = usingExtension(Paginator.override(PaginatorOverride)), _dec6 = usingExtension(MessageHandler.override(MessageHandlerOverride)), _dec7 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec8 = usingExtension(InternalIntentBasedNavigation.override({
27
28
  getNavigationMode: function () {
28
29
  const bIsStickyEditMode = this.getView().getController().getStickyEditMode && this.getView().getController().getStickyEditMode();
@@ -87,6 +88,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
87
88
  }
88
89
  },
89
90
  onTableContextChange(oEvent) {
91
+ var _fastCreationRow$_oIn;
90
92
  const oSource = oEvent.getSource();
91
93
  let oTable;
92
94
  this._findTables().some(function (_oTable) {
@@ -96,6 +98,22 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
96
98
  }
97
99
  return false;
98
100
  });
101
+
102
+ // set correct binding context for fast creation row
103
+ const fastCreationRow = oTable.getCreationRow();
104
+ if (fastCreationRow && !((_fastCreationRow$_oIn = fastCreationRow._oInnerCreationRow) !== null && _fastCreationRow$_oIn !== void 0 && _fastCreationRow$_oIn.getBindingContext())) {
105
+ const tableBinding = this._getTableBinding(oTable);
106
+ if (!tableBinding) {
107
+ Log.error(`Expected binding missing for table: ${oTable.getId()}`);
108
+ return;
109
+ }
110
+ if (tableBinding.getContext()) {
111
+ const objectPage = this._getObjectPageLayoutControl();
112
+ const bindingContext = objectPage.getBindingContext();
113
+ const model = bindingContext.getModel();
114
+ TableHelper.enableFastCreationRow(fastCreationRow, tableBinding.getPath(), tableBinding.getContext(), model, oTable.getModel("ui").getProperty("/isEditable"));
115
+ }
116
+ }
99
117
  const oCurrentActionPromise = this.editFlow.getCurrentActionPromise();
100
118
  if (oCurrentActionPromise) {
101
119
  let aTableContexts;
@@ -333,16 +351,69 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
333
351
  _proto._fnShowOPMessage = function _fnShowOPMessage() {
334
352
  const extensionAPI = this.getExtensionAPI();
335
353
  const view = this.getView();
354
+ const internalContext = view === null || view === void 0 ? void 0 : view.getBindingContext("internal");
355
+ const stripVisible = internalContext === null || internalContext === void 0 ? void 0 : internalContext.getProperty("OPMessageStripVisibility");
336
356
  const messages = this.messageButton.oMessagePopover.getItems().map(item => item.getBindingContext("message").getObject()).filter(message => {
337
357
  var _view$getBindingConte;
338
358
  return message.getTargets()[0] === ((_view$getBindingConte = view.getBindingContext()) === null || _view$getBindingConte === void 0 ? void 0 : _view$getBindingConte.getPath());
339
359
  });
340
- if (extensionAPI) {
360
+ if (extensionAPI && !(messages.length === 0 && stripVisible)) {
341
361
  extensionAPI.showMessages(messages);
342
362
  }
343
363
  };
344
364
  _proto._getTableBinding = function _getTableBinding(oTable) {
345
365
  return oTable && oTable.getRowBinding();
366
+ }
367
+
368
+ /**
369
+ * Find the last visible subsection and add the sapUxAPObjectPageSubSectionFitContainer CSS class if it contains only a GridTable or a TreeTable.
370
+ *
371
+ * @param subSections The sub sections to look for
372
+ * @private
373
+ */;
374
+ _proto.checkSectionsForNonResponsiveTable = function checkSectionsForNonResponsiveTable(subSections) {
375
+ const changeClassForTables = (event, lastVisibleSubSection) => {
376
+ var _this$searchTableInBl;
377
+ const blocks = [...lastVisibleSubSection.getBlocks(), ...lastVisibleSubSection.getMoreBlocks()];
378
+ const tableType = blocks.length === 1 && ((_this$searchTableInBl = this.searchTableInBlock(blocks[0])) === null || _this$searchTableInBl === void 0 ? void 0 : _this$searchTableInBl.getType());
379
+ if (tableType && (tableType !== null && tableType !== void 0 && tableType.isA("sap.ui.mdc.table.GridTableType") || tableType !== null && tableType !== void 0 && tableType.isA("sap.ui.mdc.table.TreeTableType"))) {
380
+ //In case there is only a single table in a subSection we fit that to the whole page so that the scrollbar comes only on table and not on page
381
+ lastVisibleSubSection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
382
+ lastVisibleSubSection.detachEvent("modelContextChange", changeClassForTables, this);
383
+ }
384
+ };
385
+ for (let subSectionIndex = subSections.length - 1; subSectionIndex >= 0; subSectionIndex--) {
386
+ if (subSections[subSectionIndex].getVisible()) {
387
+ const lastVisibleSubSection = subSections[subSectionIndex];
388
+ // We need to attach this event in order to manage the Object Page Lazy Loading mechanism
389
+ lastVisibleSubSection.attachEvent("modelContextChange", lastVisibleSubSection, changeClassForTables, this);
390
+ break;
391
+ }
392
+ }
393
+ }
394
+
395
+ /**
396
+ * Find a table in blocks of section.
397
+ *
398
+ * @param block One sub section block
399
+ * @returns Table if exists
400
+ */;
401
+ _proto.searchTableInBlock = function searchTableInBlock(block) {
402
+ const control = block.content;
403
+ let tableAPI;
404
+ if (block.isA("sap.fe.templates.ObjectPage.controls.SubSectionBlock")) {
405
+ // The table may currently be shown in a full screen dialog, we can then get the reference to the TableAPI
406
+ // control from the custom data of the place holder panel
407
+ if (control.isA("sap.m.Panel") && control.data("FullScreenTablePlaceHolder")) {
408
+ tableAPI = control.data("tableAPIreference");
409
+ } else if (control.isA("sap.fe.macros.table.TableAPI")) {
410
+ tableAPI = control;
411
+ }
412
+ if (tableAPI) {
413
+ return tableAPI.content;
414
+ }
415
+ }
416
+ return undefined;
346
417
  };
347
418
  _proto.onBeforeRendering = function onBeforeRendering() {
348
419
  var _this$oView$oViewData;
@@ -352,6 +423,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
352
423
  CommonHelper.setMetaModel(this.getAppComponent().getMetaModel());
353
424
  }
354
425
  };
426
+ _proto.onAfterRendering = function onAfterRendering() {
427
+ let subSections;
428
+ if (this._getObjectPageLayoutControl().getUseIconTabBar()) {
429
+ const sections = this._getObjectPageLayoutControl().getSections();
430
+ for (const section of sections) {
431
+ subSections = section.getSubSections();
432
+ this.checkSectionsForNonResponsiveTable(subSections);
433
+ }
434
+ } else {
435
+ subSections = this._getAllSubSections();
436
+ this.checkSectionsForNonResponsiveTable(subSections);
437
+ }
438
+ };
355
439
  _proto._onBeforeBinding = function _onBeforeBinding(oContext, mParameters) {
356
440
  // TODO: we should check how this comes together with the transaction helper, same to the change in the afterBinding
357
441
  const aTables = this._findTables(),
@@ -554,14 +638,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
554
638
 
555
639
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
556
640
  ;
557
- _proto._onAfterBinding = function _onAfterBinding(oBindingContext, mParameters) {
641
+ _proto._onAfterBinding = function _onAfterBinding(inputBindingContext, mParameters) {
558
642
  const oObjectPage = this._getObjectPageLayoutControl();
559
643
  const aTables = this._findTables();
560
644
  this._sideEffects.clearFieldGroupsValidity();
561
645
 
562
646
  // TODO: this is only a temp solution as long as the model fix the cache issue and we use this additional
563
647
  // binding with ownRequest
564
- oBindingContext = oObjectPage.getBindingContext();
648
+ const bindingContext = oObjectPage.getBindingContext();
565
649
  let aIBNActions = [];
566
650
  oObjectPage.getSections().forEach(function (oSection) {
567
651
  oSection.getSubSections().forEach(function (oSubSection) {
@@ -577,29 +661,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
577
661
 
578
662
  aTables.forEach(function (oTable) {
579
663
  const oInternalModelContext = oTable.getBindingContext("internal");
580
- oInternalModelContext.setProperty("creationRowFieldValidity", {});
581
- oInternalModelContext.setProperty("creationRowCustomValidity", {});
582
- aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
583
- // temporary workaround for BCP: 2080218004
584
- // Need to fix with BLI: FIORITECHP1-15274
585
- // only for edit mode, we clear the table cache
586
- // Workaround starts here!!
587
- const oTableRowBinding = oTable.getRowBinding();
588
- if (oTableRowBinding) {
589
- if (ModelHelper.isStickySessionSupported(oTableRowBinding.getModel().getMetaModel())) {
590
- // apply for both edit and display mode in sticky
591
- oTableRowBinding.removeCachesAndMessages("");
664
+ if (oInternalModelContext) {
665
+ oInternalModelContext.setProperty("creationRowFieldValidity", {});
666
+ oInternalModelContext.setProperty("creationRowCustomValidity", {});
667
+ aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
668
+
669
+ // temporary workaround for BCP: 2080218004
670
+ // Need to fix with BLI: FIORITECHP1-15274
671
+ // only for edit mode, we clear the table cache
672
+ // Workaround starts here!!
673
+ const oTableRowBinding = oTable.getRowBinding();
674
+ if (oTableRowBinding) {
675
+ if (ModelHelper.isStickySessionSupported(oTableRowBinding.getModel().getMetaModel())) {
676
+ // apply for both edit and display mode in sticky
677
+ oTableRowBinding.removeCachesAndMessages("");
678
+ }
592
679
  }
593
- }
594
- // Workaround ends here!!
680
+ // Workaround ends here!!
595
681
 
596
- // Update 'enabled' property of DataFieldForAction buttons on table toolbar
597
- // The same is also performed on Table selectionChange event
598
- const oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
599
- aSelectedContexts = oTable.getSelectedContexts();
600
- ActionRuntime.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts, "table");
601
- // Clear the selection in the table, need to be fixed and review with BLI: FIORITECHP1-24318
602
- oTable.clearSelection();
682
+ // Clear the selection in the table and update action enablement accordingly
683
+ // Will to be fixed with BLI: FIORITECHP1-24318
684
+ const oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap")));
685
+ ActionRuntime.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, [], "table");
686
+ oTable.clearSelection();
687
+ }
603
688
  });
604
689
  CommonUtils.getSemanticTargetsFromPageModel(this, "_pageModel");
605
690
  //Retrieve Object Page header actions from Object Page title control
@@ -635,11 +720,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
635
720
  oBinding.attachChange(fnHandleChange);
636
721
  }
637
722
  };
638
- if (oBindingContext) {
639
- oModel = oBindingContext.getModel();
723
+ if (bindingContext) {
724
+ oModel = bindingContext.getModel();
640
725
 
641
726
  // Compute Edit Mode
642
- oFinalUIState = this.editFlow.computeEditMode(oBindingContext);
727
+ oFinalUIState = this.editFlow.computeEditMode(bindingContext);
643
728
  if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel())) {
644
729
  oFinalUIState.then(() => {
645
730
  if (this.getView().getModel("ui").getProperty("/isEditable")) {
@@ -655,11 +740,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
655
740
  this._updateRelatedApps();
656
741
 
657
742
  //Attach the patch sent and patch completed event to the object page binding so that we can react
658
- const oBinding = oBindingContext.getBinding && oBindingContext.getBinding() || oBindingContext;
743
+ const oBinding = bindingContext.getBinding && bindingContext.getBinding() || bindingContext;
659
744
 
660
745
  // Attach the event handler only once to the same binding
661
746
  if (this.currentBinding !== oBinding) {
662
- oBinding.attachEvent("patchSent", this.editFlow.handlePatchSent, this);
747
+ oBinding.attachEvent("patchSent", {}, this.editFlow.handlePatchSent, this);
663
748
  this.currentBinding = oBinding;
664
749
  }
665
750
  aTables.forEach(function (oTable) {
@@ -675,6 +760,34 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
675
760
  //To Compute the Edit Binding of the subObject page using root object page, create a context for draft root and update the edit button in sub OP using the context
676
761
  ActionRuntime.updateEditButtonVisibilityAndEnablement(this.getView());
677
762
  }
763
+ this.displayCollaborationMessage(mParameters === null || mParameters === void 0 ? void 0 : mParameters.redirectedToNonDraft);
764
+ }
765
+
766
+ /**
767
+ * Show a message strip if a redirection to a non-draft element has been done.
768
+ * Remove the message strip in case we navigate to another object page.
769
+ *
770
+ * @param entityName Name of the Entity to be displayed in the message
771
+ * @private
772
+ */;
773
+ _proto.displayCollaborationMessage = function displayCollaborationMessage(entityName) {
774
+ var _this$getView;
775
+ const internalBindingContext = (_this$getView = this.getView()) === null || _this$getView === void 0 ? void 0 : _this$getView.getBindingContext("internal");
776
+ const resourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
777
+ if (entityName) {
778
+ const message = new Message({
779
+ message: resourceBundle.getText("REROUTED_NAVIGATION_TO_SAVED_VERSION", [entityName]),
780
+ type: "Information"
781
+ });
782
+ this.getExtensionAPI().showMessages([message]);
783
+ } else {
784
+ var _internalBindingConte;
785
+ const messageToCompare = resourceBundle.getText("REROUTED_NAVIGATION_TO_SAVED_VERSION", ["{0}"]);
786
+ const lengthUntilVariable = messageToCompare.search("{");
787
+ if ((internalBindingContext === null || internalBindingContext === void 0 ? void 0 : (_internalBindingConte = internalBindingContext.getProperty("OPMessageStripText")) === null || _internalBindingConte === void 0 ? void 0 : _internalBindingConte.substring(0, lengthUntilVariable)) === messageToCompare.substring(0, lengthUntilVariable)) {
788
+ this.getExtensionAPI().showMessages([]);
789
+ }
790
+ }
678
791
  };
679
792
  _proto.onPageReady = function onPageReady(mParameters) {
680
793
  const setFocus = () => {
@@ -822,49 +935,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
822
935
  return this.editFlow.editDocument.apply(this.editFlow, [oContext]).finally(function () {
823
936
  BusyLocker.unlock(oModel);
824
937
  });
825
- }
826
-
827
- /**
828
- * Gets the context of the DraftRoot path.
829
- * If a view has been created with the draft Root Path, this method returns its bindingContext.
830
- * Where no view is found a new created context is returned.
831
- * The new created context request the key of the entity in order to get the Etag of this entity.
832
- *
833
- * @function
834
- * @name getDraftRootPath
835
- * @returns Returns a Promise
836
- */;
837
- _proto.getDraftRootContext = async function getDraftRootContext() {
838
- const view = this.getView();
839
- const context = view.getBindingContext();
840
- if (context) {
841
- const draftRootContextPath = ModelHelper.getDraftRootPath(context);
842
- let simpleDraftRootContext;
843
- if (draftRootContextPath) {
844
- var _this$getAppComponent, _simpleDraftRootConte;
845
- // Check if a view matches with the draft root path
846
- const existingBindingContextOnPage = (_this$getAppComponent = this.getAppComponent().getRootViewController().getInstancedViews().find(pageView => {
847
- var _pageView$getBindingC;
848
- return ((_pageView$getBindingC = pageView.getBindingContext()) === null || _pageView$getBindingC === void 0 ? void 0 : _pageView$getBindingC.getPath()) === draftRootContextPath;
849
- })) === null || _this$getAppComponent === void 0 ? void 0 : _this$getAppComponent.getBindingContext();
850
- if (existingBindingContextOnPage) {
851
- return existingBindingContextOnPage;
852
- }
853
- const internalModel = view.getModel("internal");
854
- simpleDraftRootContext = internalModel.getProperty("/simpleDraftRootContext");
855
- if (((_simpleDraftRootConte = simpleDraftRootContext) === null || _simpleDraftRootConte === void 0 ? void 0 : _simpleDraftRootConte.getPath()) === draftRootContextPath) {
856
- return simpleDraftRootContext;
857
- }
858
- const model = context.getModel();
859
- simpleDraftRootContext = model.bindContext(draftRootContextPath).getBoundContext();
860
- await CommonUtils.waitForContextRequested(simpleDraftRootContext);
861
- // Store this new created context to use it on the next iterations
862
- internalModel.setProperty("/simpleDraftRootContext", simpleDraftRootContext);
863
- return simpleDraftRootContext;
864
- }
865
- return undefined;
866
- }
867
- return undefined;
868
938
  };
869
939
  _proto._validateDocument = async function _validateDocument() {
870
940
  const appComponent = this.getAppComponent();
@@ -879,7 +949,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
879
949
  await this.editFlow.syncTask();
880
950
  return Promise.all(globalSideEffects.map(sideEffects => this._sideEffects.requestSideEffects(sideEffects, context)));
881
951
  }
882
- const draftRootContext = await this.getDraftRootContext();
952
+ const draftRootContext = await CommonUtils.createRootContext(ProgrammingModel.Draft, this.getView(), appComponent);
883
953
  //Execute the draftValidation if there is no globalSideEffects (ignore ETags in collaboration draft)
884
954
  if (draftRootContext) {
885
955
  await this.editFlow.syncTask();
@@ -954,13 +1024,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
954
1024
  };
955
1025
  _proto._updateRelatedApps = function _updateRelatedApps() {
956
1026
  const oObjectPage = this._getObjectPageLayoutControl();
957
- if (CommonUtils.resolveStringtoBoolean(oObjectPage.data("showRelatedApps"))) {
1027
+ const showRelatedApps = oObjectPage.data("showRelatedApps");
1028
+ if (showRelatedApps === "true" || showRelatedApps === true) {
958
1029
  const appComponent = CommonUtils.getAppComponent(this.getView());
959
1030
  CommonUtils.updateRelatedAppsDetails(oObjectPage, appComponent);
960
1031
  }
961
1032
  };
962
1033
  _proto._findControlInSubSection = function _findControlInSubSection(aParentElement, aSubsection, aControls, bIsChart) {
963
- const aSubSectionTables = [];
964
1034
  for (let element = 0; element < aParentElement.length; element++) {
965
1035
  let oElement = aParentElement[element].getContent instanceof Function && aParentElement[element].getContent();
966
1036
  if (bIsChart) {
@@ -992,10 +1062,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
992
1062
  }
993
1063
  if (oElement && oElement.isA && oElement.isA("sap.ui.mdc.Table")) {
994
1064
  aControls.push(oElement);
995
- aSubSectionTables.push({
996
- table: oElement,
997
- gridTable: oElement.getType().isA("sap.ui.mdc.table.GridTableType")
998
- });
999
1065
  }
1000
1066
  if (oElement && oElement.isA && oElement.isA("sap.fe.macros.chart.ChartAPI")) {
1001
1067
  oElement = oElement.getContent instanceof Function && oElement.getContent();
@@ -1007,10 +1073,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1007
1073
  aControls.push(oElement);
1008
1074
  }
1009
1075
  }
1010
- if (aSubSectionTables.length === 1 && aParentElement.length === 1 && aSubSectionTables[0].gridTable && !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")) {
1011
- //In case there is only a single table in a section we fit that to the whole page so that the scrollbar comes only on table and not on page
1012
- aSubsection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
1013
- }
1014
1076
  };
1015
1077
  _proto._getAllSubSections = function _getAllSubSections() {
1016
1078
  const oObjectPage = this._getObjectPageLayoutControl();
@@ -1141,9 +1203,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1141
1203
  entitySet: sMetaPathPage
1142
1204
  });
1143
1205
  // Adding Page Context to selection variant
1144
- aPageAttributes = CommonUtils.removeSensitiveData(aPageAttributes, oMetaModel);
1206
+ aPageAttributes = this._intentBasedNavigation.removeSensitiveData(aPageAttributes, sMetaPathPage);
1145
1207
  const oPageLevelSV = CommonUtils.addPageContextToSelectionVariant(new SelectionVariant(), aPageAttributes, this.getView());
1146
- aAttributes = CommonUtils.removeSensitiveData(aAttributes, oMetaModel);
1208
+ aAttributes = this._intentBasedNavigation.removeSensitiveData(aAttributes, sMetaPathPage);
1147
1209
  return {
1148
1210
  selectionVariant: oPageLevelSV,
1149
1211
  attributes: aAttributes
@@ -1358,4 +1420,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
1358
1420
  }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype)), _class2)) || _class);
1359
1421
  return ObjectPageController;
1360
1422
  }, false);
1361
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3RQYWdlQ29udHJvbGxlciIsImRlZmluZVVJNUNsYXNzIiwidXNpbmdFeHRlbnNpb24iLCJQbGFjZWhvbGRlciIsIlNoYXJlIiwib3ZlcnJpZGUiLCJTaGFyZU92ZXJyaWRlcyIsIkludGVybmFsUm91dGluZyIsIkludGVybmFsUm91dGluZ092ZXJyaWRlIiwiUGFnaW5hdG9yIiwiUGFnaW5hdG9yT3ZlcnJpZGUiLCJNZXNzYWdlSGFuZGxlciIsIk1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUiLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIkludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbk1vZGUiLCJiSXNTdGlja3lFZGl0TW9kZSIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiZ2V0U3RpY2t5RWRpdE1vZGUiLCJ1bmRlZmluZWQiLCJWaWV3U3RhdGUiLCJWaWV3U3RhdGVPdmVycmlkZXMiLCJQYWdlUmVhZHkiLCJpc0NvbnRleHRFeHBlY3RlZCIsIk1hc3NFZGl0IiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImhhbmRsZXJzIiwib25QcmltYXJ5QWN0aW9uIiwib0NvbnRyb2xsZXIiLCJvVmlldyIsIm9Db250ZXh0Iiwic0FjdGlvbk5hbWUiLCJtUGFyYW1ldGVycyIsIm1Db25kaXRpb25zIiwiaVZpZXdMZXZlbCIsImdldFZpZXdEYXRhIiwidmlld0xldmVsIiwib09iamVjdFBhZ2UiLCJfZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2wiLCJwb3NpdGl2ZUFjdGlvblZpc2libGUiLCJwb3NpdGl2ZUFjdGlvbkVuYWJsZWQiLCJvbkNhbGxBY3Rpb24iLCJlZGl0QWN0aW9uVmlzaWJsZSIsImVkaXRBY3Rpb25FbmFibGVkIiwiX2VkaXREb2N1bWVudCIsImdldE1vZGVsIiwiZ2V0UHJvcGVydHkiLCJfc2F2ZURvY3VtZW50IiwiX2FwcGx5RG9jdW1lbnQiLCJvblRhYmxlQ29udGV4dENoYW5nZSIsIm9FdmVudCIsIm9Tb3VyY2UiLCJnZXRTb3VyY2UiLCJvVGFibGUiLCJfZmluZFRhYmxlcyIsInNvbWUiLCJfb1RhYmxlIiwiZ2V0Um93QmluZGluZyIsIm9DdXJyZW50QWN0aW9uUHJvbWlzZSIsImVkaXRGbG93IiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJhVGFibGVDb250ZXh0cyIsImdldFR5cGUiLCJnZXRNZXRhZGF0YSIsImlzQSIsImdldENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwidGhlbiIsIm9BY3Rpb25SZXNwb25zZSIsImNvbnRyb2xJZCIsInNJZCIsIm9BY3Rpb25EYXRhIiwib0RhdGEiLCJhS2V5cyIsImtleXMiLCJpTmV3SXRlbXAiLCJmaW5kIiwib1RhYmxlQ29udGV4dCIsImkiLCJvVGFibGVEYXRhIiwiZ2V0T2JqZWN0IiwiYkNvbXBhcmUiLCJldmVyeSIsInNLZXkiLCJhRGlhbG9ncyIsIkluc3RhbmNlTWFuYWdlciIsImdldE9wZW5EaWFsb2dzIiwib0RpYWxvZyIsImxlbmd0aCIsImRpYWxvZyIsImRhdGEiLCJhdHRhY2hFdmVudE9uY2UiLCJmb2N1c1JvdyIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJlcnJvciIsIm1lc3NhZ2VCdXR0b24iLCJmaXJlTW9kZWxDb250ZXh0Q2hhbmdlIiwiaW52b2tlQWN0aW9uIiwiX3Nob3dNZXNzYWdlUG9wb3ZlciIsImJpbmQiLCJvbkRhdGFQb2ludFRpdGxlUHJlc3NlZCIsIm9NYW5pZmVzdE91dGJvdW5kIiwic0NvbnRyb2xDb25maWciLCJzQ29sbGVjdGlvblBhdGgiLCJKU09OIiwicGFyc2UiLCJvVGFyZ2V0SW5mbyIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJDb21tb25VdGlscyIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNNZXRhUGF0aCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImFOYXZpZ2F0aW9uRGF0YSIsIl9nZXRDaGFydENvbnRleHREYXRhIiwiYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzIiwibWFwIiwib05hdmlnYXRpb25EYXRhIiwibWV0YVBhdGgiLCJwYXJhbWV0ZXJzIiwib1BhcmFtcyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJnZXRPdXRib3VuZFBhcmFtcyIsIk9iamVjdCIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwibmF2aWdhdGUiLCJuYXZpZ2F0aW9uQ29udGV4dHMiLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJzT3V0Ym91bmRUYXJnZXQiLCJzQ3JlYXRlUGF0aCIsIm9uTmF2aWdhdGVDaGFuZ2UiLCJnZXRFeHRlbnNpb25BUEkiLCJ1cGRhdGVBcHBTdGF0ZSIsImJTZWN0aW9uTmF2aWdhdGVkIiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwic2VjdGlvbkxheW91dCIsIm9TdWJTZWN0aW9uIiwiZ2V0UGFyYW1ldGVyIiwiX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZSIsIm9uVmFyaWFudFNlbGVjdGVkIiwib25WYXJpYW50U2F2ZWQiLCJzZXRUaW1lb3V0IiwibmF2aWdhdGVUb1N1YlNlY3Rpb24iLCJ2RGV0YWlsQ29uZmlnIiwib0RldGFpbENvbmZpZyIsImJ5SWQiLCJvU2VjdGlvbiIsInNlY3Rpb25JZCIsInN1YlNlY3Rpb25JZCIsImdldFN1YlNlY3Rpb25zIiwiZ2V0UGFyZW50IiwiZ2V0VmlzaWJsZSIsInNUaXRsZSIsImdldFJlc291cmNlTW9kZWwiLCJnZXRUZXh0IiwiZW50aXR5U2V0IiwiTWVzc2FnZUJveCIsInNjcm9sbFRvU2VjdGlvbiIsImdldElkIiwiZmlyZU5hdmlnYXRlIiwic2VjdGlvbiIsInN1YlNlY3Rpb24iLCJvblN0YXRlQ2hhbmdlIiwiY2xvc2VPUE1lc3NhZ2VTdHJpcCIsImhpZGVNZXNzYWdlIiwibUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzIiwiRXh0ZW5zaW9uQVBJIiwiZXh0ZW5zaW9uQVBJIiwib25Jbml0Iiwic2V0UHJvcGVydHkiLCJwYWdlIiwidmlzaWJpbGl0eSIsIml0ZW1zIiwiX2dldEJhdGNoR3JvdXBzRm9yVmlldyIsImdldEVuYWJsZUxhenlMb2FkaW5nIiwiYXR0YWNoRXZlbnQiLCJfaGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydCIsIm9JdGVtQmluZGluZyIsImF0dGFjaENoYW5nZSIsIl9mblNob3dPUE1lc3NhZ2UiLCJvbkV4aXQiLCJkZXN0cm95Iiwib01lc3NhZ2VQb3BvdmVyIiwiaXNPcGVuIiwiY2xvc2UiLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsImlzQ29ubmVjdGVkIiwiZGlzY29ubmVjdCIsInZpZXciLCJtZXNzYWdlcyIsImdldEl0ZW1zIiwiaXRlbSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRUYXJnZXRzIiwic2hvd01lc3NhZ2VzIiwiX2dldFRhYmxlQmluZGluZyIsIm9uQmVmb3JlUmVuZGVyaW5nIiwiUGFnZUNvbnRyb2xsZXIiLCJwcm90b3R5cGUiLCJhcHBseSIsIm9WaWV3RGF0YSIsInJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3QiLCJDb21tb25IZWxwZXIiLCJzZXRNZXRhTW9kZWwiLCJnZXRBcHBDb21wb25lbnQiLCJfb25CZWZvcmVCaW5kaW5nIiwiYVRhYmxlcyIsIm9JbnRlcm5hbE1vZGVsIiwiYUJhdGNoR3JvdXBzIiwib0Zhc3RDcmVhdGlvblJvdyIsInB1c2giLCJiRHJhZnROYXZpZ2F0aW9uIiwiX2Nsb3NlU2lkZUNvbnRlbnQiLCJvcENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJnZXRDcmVhdGlvblJvdyIsInNldEJpbmRpbmdDb250ZXh0IiwiZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uIiwiaXNGaXJzdFJlbmRlcmluZyIsImJQZXJzaXN0T1BTY3JvbGwiLCJzZXRTZWxlY3RlZFNlY3Rpb24iLCJvRGVsZWdhdGVPbkJlZm9yZSIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJhZGRFdmVudERlbGVnYXRlIiwicGFnZVJlYWR5IiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIm9CaW5kaW5nIiwibGlzdEJpbmRpbmciLCJvUGFnaW5hdG9yQ3VycmVudENvbnRleHQiLCJvQmluZGluZ1RvVXNlIiwicGFnaW5hdG9yIiwiaW5pdGlhbGl6ZSIsInNCaW5kaW5nUGF0aCIsInRlc3QiLCJzTGlzdEJpbmRpbmdQYXRoIiwicmVwbGFjZSIsIk9EYXRhTGlzdEJpbmRpbmciLCJvTW9kZWwiLCJfc2V0TGlzdEJpbmRpbmdBc3luYyIsImRldGFjaEV2ZW50IiwiYVNlY3Rpb25zIiwiZ2V0U2VjdGlvbnMiLCJiVXNlSWNvblRhYkJhciIsImdldFVzZUljb25UYWJCYXIiLCJpU2tpcCIsImJJc0luRWRpdE1vZGUiLCJiRWRpdGFibGVIZWFkZXIiLCJlZGl0YWJsZUhlYWRlckNvbnRlbnQiLCJpU2VjdGlvbiIsImFTdWJTZWN0aW9ucyIsImlTdWJTZWN0aW9uIiwiaXNWaXNpYmlsaXR5RHluYW1pYyIsInBsYWNlaG9sZGVyIiwiaXNQbGFjZWhvbGRlckVuYWJsZWQiLCJzaG93UGxhY2Vob2xkZXIiLCJvTmF2Q29udGFpbmVyIiwib0NvbnRhaW5lciIsIl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQiLCJvRmlyc3RDbGlja2FibGVFbGVtZW50IiwiYUFjdGlvbnMiLCJnZXRIZWFkZXJUaXRsZSIsImdldEFjdGlvbnMiLCJvQWN0aW9uIiwiZ2V0RW5hYmxlZCIsIl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbiIsImFCbG9ja3MiLCJnZXRCbG9ja3MiLCJibG9jayIsImFGb3JtQ29udGFpbmVycyIsImdldEZvcm1Db250YWluZXJzIiwiZ2V0Q29udGVudCIsImZvcm1Db250YWluZXIiLCJhRm9ybUVsZW1lbnRzIiwiZ2V0Rm9ybUVsZW1lbnRzIiwiZm9ybUVsZW1lbnQiLCJhRmllbGRzIiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZSIsImRlYnVnIiwib01hbmRhdG9yeUZpZWxkIiwib0ZpZWxkVG9Gb2N1cyIsImNvbnRlbnQiLCJnZXRDb250ZW50RWRpdCIsIl9nZXRGaXJzdEVkaXRhYmxlSW5wdXQiLCJmb2N1cyIsIl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdCIsIm1lc3NhZ2VIYW5kbGVyIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0IiwiaGlzdG9yeSIsImJhY2siLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiX29uQWZ0ZXJCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwiX3NpZGVFZmZlY3RzIiwiY2xlYXJGaWVsZEdyb3Vwc1ZhbGlkaXR5IiwiYUlCTkFjdGlvbnMiLCJmb3JFYWNoIiwiZ2V0SUJOQWN0aW9ucyIsIm9UYWJsZVJvd0JpbmRpbmciLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsInJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInBhcnNlQ3VzdG9tRGF0YSIsIkRlbGVnYXRlVXRpbCIsImdldEN1c3RvbURhdGEiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsImNsZWFyU2VsZWN0aW9uIiwiZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCIsIm9PYmplY3RQYWdlVGl0bGUiLCJhSUJOSGVhZGVyQWN0aW9ucyIsImNvbmNhdCIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5Iiwib0ZpbmFsVUlTdGF0ZSIsImhhbmRsZVRhYmxlTW9kaWZpY2F0aW9ucyIsImZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyIsIlRhYmxlSGVscGVyIiwiZW5hYmxlRmFzdENyZWF0aW9uUm93IiwiZ2V0Q29udGV4dCIsImZuSGFuZGxlQ2hhbmdlIiwiZGV0YWNoQ2hhbmdlIiwiY29tcHV0ZUVkaXRNb2RlIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJjb25uZWN0Iiwib0Vycm9yIiwiX3VwZGF0ZVJlbGF0ZWRBcHBzIiwiY3VycmVudEJpbmRpbmciLCJoYW5kbGVQYXRjaFNlbnQiLCJUYWJsZVV0aWxzIiwid2hlbkJvdW5kIiwiX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMiLCJ1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQiLCJvblBhZ2VSZWFkeSIsInNldEZvY3VzIiwiaXNJbkRpc3BsYXlNb2RlIiwib1NlbGVjdGVkU2VjdGlvbiIsIkNvcmUiLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJiSXNTdGlja3lNb2RlIiwib0FwcENvbXBvbmVudCIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsInZpZXdJZCIsImdldEFwcFN0YXRlSGFuZGxlciIsImFwcGx5QXBwU3RhdGUiLCJmb3JjZUZvY3VzIiwiRXJyb3IiLCJfY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbiIsIl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbiIsIm9PYmplY3RQYWdlU3VidGl0bGUiLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsInRpdGxlIiwic3VidGl0bGUiLCJpbnRlbnQiLCJpY29uIiwiX2V4ZWN1dGVIZWFkZXJTaG9ydGN1dCIsInNCdXR0b25JZCIsIm9CdXR0b24iLCJvRWxlbWVudCIsImZpcmVCdXR0b25QcmVzcyIsIl9leGVjdXRlRm9vdGVyU2hvcnRjdXQiLCJnZXRGb290ZXIiLCJnZXROYW1lIiwiX2V4ZWN1dGVUYWJTaG9ydEN1dCIsIm9FeGVjdXRpb24iLCJpU2VjdGlvbkluZGV4TWF4Iiwic0NvbW1hbmQiLCJnZXRDb21tYW5kIiwibmV3U2VjdGlvbiIsImlTZWxlY3RlZFNlY3Rpb25JbmRleCIsImluZGV4T2ZTZWN0aW9uIiwiX2dldEZvb3RlclZpc2liaWxpdHkiLCJzVmlld0lkIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwib01lc3NhZ2UiLCJ2YWxpZGF0aW9uIiwidHlwZSIsInRhcmdldCIsImluZGV4T2YiLCJvUmV0Iiwicm9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiY3VycmVudFBhZ2VWaWV3IiwiaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0VmlldyIsImdldFJvb3RDb250YWluZXIiLCJnZXRDdXJyZW50UGFnZSIsIm9NZXNzYWdlQnV0dG9uIiwiZ2V0TGVuZ3RoIiwic2V0VmlzaWJsZSIsIm9wZW5CeSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZWRpdERvY3VtZW50IiwiZmluYWxseSIsInVubG9jayIsImdldERyYWZ0Um9vdENvbnRleHQiLCJjb250ZXh0IiwiZHJhZnRSb290Q29udGV4dFBhdGgiLCJnZXREcmFmdFJvb3RQYXRoIiwic2ltcGxlRHJhZnRSb290Q29udGV4dCIsImV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInBhZ2VWaWV3IiwiaW50ZXJuYWxNb2RlbCIsIm1vZGVsIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsIl92YWxpZGF0ZURvY3VtZW50IiwiYXBwQ29tcG9uZW50IiwiY29udHJvbCIsImdldEN1cnJlbnRGb2N1c2VkQ29udHJvbElkIiwiaXNUcmFuc2llbnQiLCJzaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJlbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwiZ2xvYmFsU2lkZUVmZmVjdHMiLCJnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwic3luY1Rhc2siLCJQcm9taXNlIiwiYWxsIiwic2lkZUVmZmVjdHMiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJkcmFmdFJvb3RDb250ZXh0IiwiZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbiIsImFXYWl0Q3JlYXRlRG9jdW1lbnRzIiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJjcmVhdGlvbk1vZGUiLCJjcmVhdGlvblJvdyIsImNyZWF0ZUF0RW5kIiwiYkNyZWF0ZURvY3VtZW50IiwiYlNraXBTaWRlRWZmZWN0cyIsImNyZWF0ZURvY3VtZW50IiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJzYXZlRG9jdW1lbnQiLCJpc0xvY2tlZCIsIl9tYW5hZ2VDb2xsYWJvcmF0aW9uIiwib3Blbk1hbmFnZURpYWxvZyIsIl9zaG93Q29sbGFib3JhdGlvblVzZXJEZXRhaWxzIiwiZXZlbnQiLCJzaG93VXNlckRldGFpbHMiLCJfY2FuY2VsRG9jdW1lbnQiLCJjYW5jZWxCdXR0b24iLCJjYW5jZWxEb2N1bWVudCIsImFwcGx5RG9jdW1lbnQiLCJyZXNvbHZlU3RyaW5ndG9Cb29sZWFuIiwidXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzIiwiX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uIiwiYVBhcmVudEVsZW1lbnQiLCJhU3Vic2VjdGlvbiIsImFDb250cm9scyIsImJJc0NoYXJ0IiwiYVN1YlNlY3Rpb25UYWJsZXMiLCJlbGVtZW50IiwibUFnZ3JlZ2F0aW9ucyIsImdldEFnZ3JlZ2F0aW9uIiwiYUl0ZW1zIiwib0l0ZW0iLCJnZXRNYWluQ29udGVudCIsInRhYmxlIiwiZ3JpZFRhYmxlIiwiaGFzU3R5bGVDbGFzcyIsImFkZFN0eWxlQ2xhc3MiLCJfZ2V0QWxsU3ViU2VjdGlvbnMiLCJfZ2V0QWxsQmxvY2tzIiwiZ2V0TW9yZUJsb2NrcyIsIl9maW5kQ2hhcnRzIiwiYUNoYXJ0cyIsIm9CbG9jayIsIm9Db250ZW50Iiwic2V0U2hvd1NpZGVDb250ZW50Iiwib0NoYXJ0Q29udGV4dCIsInNDaGFydFBhdGgiLCJvQ29udGV4dERhdGEiLCJvQ2hhcnRDb250ZXh0RGF0YSIsIl9zY3JvbGxUYWJsZXNUb1JvdyIsInNSb3dQYXRoIiwiVGFibGVTY3JvbGxlciIsInNjcm9sbFRhYmxlVG9Sb3ciLCJfbWVyZ2VNdWx0aXBsZUNvbnRleHRzIiwib1BhZ2VDb250ZXh0IiwiYUxpbmVDb250ZXh0IiwiYUF0dHJpYnV0ZXMiLCJhUGFnZUF0dHJpYnV0ZXMiLCJzTWV0YVBhdGhMaW5lIiwic1BhdGhMaW5lIiwic1BhZ2VQYXRoIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aFBhZ2UiLCJvU2luZ2xlQ29udGV4dCIsIm9TdWJDaGFydENvbnRleHREYXRhIiwiY29udGV4dERhdGEiLCJyZW1vdmVTZW5zaXRpdmVEYXRhIiwib1BhZ2VMZXZlbFNWIiwiYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3Rpb25WYXJpYW50Iiwic2VsZWN0aW9uVmFyaWFudCIsImF0dHJpYnV0ZXMiLCJvQ29uZmlndXJhdGlvbnMiLCJjb250cm9sQ29uZmlndXJhdGlvbiIsImFDb25maWd1cmF0aW9ucyIsIm9Db25maWd1cmF0aW9uIiwicmVxdWVzdEdyb3VwSWQiLCJfc2V0QnJlYWRjcnVtYkxpbmtzIiwiYVByb21pc2VzIiwiYVNraXBQYXJhbWV0ZXJpemVkIiwic05ld1BhdGgiLCJhUGF0aFBhcnRzIiwic3BsaXQiLCJzUGF0aCIsInNoaWZ0Iiwic3BsaWNlIiwic1BhdGhQYXJ0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsInNQYXJhbWV0ZXJQYXRoIiwiYlJlc3VsdENvbnRleHQiLCJnZXRUaXRsZUluZm9Gcm9tUGF0aCIsInRpdGxlSGllcmFyY2h5SW5mb3MiLCJpZHgiLCJoaWVyYXJjaHlQb3NpdGlvbiIsIm9MaW5rIiwidGl0bGVIaWVyYXJjaHlJbmZvIiwiZ2V0TGlua3MiLCJMaW5rIiwic2V0VGV4dCIsInNldEhyZWYiLCJlbmNvZGVVUkkiLCJhZGRMaW5rIiwib0RhdGFQb2ludHMiLCJnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJnZXRSb3V0aW5nU2VydmljZSIsImdldE91dGJvdW5kcyIsIm9TaGVsbFNlcnZpY2VzIiwicmVxdWVzdE9iamVjdCIsImZuR2V0TGlua3MiLCJmbk9uRXJyb3IiLCJmblNldExpbmtFbmFibGVtZW50IiwiaWQiLCJhU3VwcG9ydGVkTGlua3MiLCJzTGlua0lkIiwic3VwcG9ydGVkIiwib1N1YkRhdGFQb2ludHMiLCJvUGFnZURhdGEiLCJvRGF0YVBvaW50Iiwib0xpbmtDb250ZXh0Iiwib0xpbmtEYXRhIiwib01peGVkQ29udGV4dCIsIm1lcmdlIiwib01hcHBpbmciLCJzTWFpblByb3BlcnR5Iiwic01hcHBlZFByb3BlcnR5IiwiaGFzT3duUHJvcGVydHkiLCJvTmV3TWFwcGluZyIsImlzTmF2aWdhdGlvblN1cHBvcnRlZCIsInBhcmFtcyIsImFMaW5rcyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBjb25uZWN0LCBkaXNjb25uZWN0LCBpc0Nvbm5lY3RlZCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgb3Blbk1hbmFnZURpYWxvZywgc2hvd1VzZXJEZXRhaWxzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vTWFuYWdlXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IE1hc3NFZGl0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NYXNzRWRpdFwiO1xuaW1wb3J0IE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IFBhZ2VSZWFkeSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnZVJlYWR5XCI7XG5pbXBvcnQgUGFnaW5hdG9yIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QYWdpbmF0b3JcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24sIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCJzYXAvZmUvbWFjcm9zL0RlbGVnYXRlVXRpbFwiO1xuaW1wb3J0IFRhYmxlSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1RhYmxlSGVscGVyXCI7XG5pbXBvcnQgVGFibGVVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9VdGlsc1wiO1xuaW1wb3J0IFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJIH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgRXh0ZW5zaW9uQVBJIH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCBUYWJsZVNjcm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1RhYmxlU2Nyb2xsZXJcIjtcbmltcG9ydCBJbnN0YW5jZU1hbmFnZXIgZnJvbSBcInNhcC9tL0luc3RhbmNlTWFuYWdlclwiO1xuaW1wb3J0IExpbmsgZnJvbSBcInNhcC9tL0xpbmtcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgdHlwZSBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgQnJlYWRDcnVtYnMgZnJvbSBcInNhcC91eGFwL0JyZWFkQ3J1bWJzXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VTdWJTZWN0aW9uIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlU3ViU2VjdGlvblwiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgTWVzc2FnZUhhbmRsZXJPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdpbmF0b3JPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgU2hhcmVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9WaWV3U3RhdGVcIjtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VDb250cm9sbGVyXCIpXG5jbGFzcyBPYmplY3RQYWdlQ29udHJvbGxlciBleHRlbmRzIFBhZ2VDb250cm9sbGVyIHtcblx0b1ZpZXchOiBhbnk7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFBsYWNlaG9sZGVyKVxuXHRwbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihTaGFyZS5vdmVycmlkZShTaGFyZU92ZXJyaWRlcykpXG5cdHNoYXJlITogU2hhcmU7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEludGVybmFsUm91dGluZy5vdmVycmlkZShJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSkpXG5cdF9yb3V0aW5nITogSW50ZXJuYWxSb3V0aW5nO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihQYWdpbmF0b3Iub3ZlcnJpZGUoUGFnaW5hdG9yT3ZlcnJpZGUpKVxuXHRwYWdpbmF0b3IhOiBQYWdpbmF0b3I7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKE1lc3NhZ2VIYW5kbGVyLm92ZXJyaWRlKE1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUpKVxuXHRtZXNzYWdlSGFuZGxlciE6IE1lc3NhZ2VIYW5kbGVyO1xuXG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUpKVxuXHRpbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKHtcblx0XHRcdGdldE5hdmlnYXRpb25Nb2RlOiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgYklzU3RpY2t5RWRpdE1vZGUgPVxuXHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXIpLmdldFN0aWNreUVkaXRNb2RlICYmXG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUoKTtcblx0XHRcdFx0cmV0dXJuIGJJc1N0aWNreUVkaXRNb2RlID8gXCJleHBsYWNlXCIgOiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRfaW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFZpZXdTdGF0ZS5vdmVycmlkZShWaWV3U3RhdGVPdmVycmlkZXMpKVxuXHR2aWV3U3RhdGUhOiBWaWV3U3RhdGU7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdFBhZ2VSZWFkeS5vdmVycmlkZSh7XG5cdFx0XHRpc0NvbnRleHRFeHBlY3RlZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdHBhZ2VSZWFkeSE6IFBhZ2VSZWFkeTtcblxuXHRAdXNpbmdFeHRlbnNpb24oTWFzc0VkaXQpXG5cdG1hc3NFZGl0ITogTWFzc0VkaXQ7XG5cblx0cHJpdmF0ZSBtQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXM/OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJPjtcblxuXHRwcm90ZWN0ZWQgZXh0ZW5zaW9uQVBJPzogT2JqZWN0UGFnZUV4dGVuc2lvbkFQSTtcblxuXHRwcml2YXRlIGJTZWN0aW9uTmF2aWdhdGVkPzogYm9vbGVhbjtcblxuXHRwcml2YXRlIHN3aXRjaERyYWZ0QW5kQWN0aXZlUG9wT3Zlcj86IFBvcG92ZXI7XG5cblx0cHJpdmF0ZSBjdXJyZW50QmluZGluZz86IEJpbmRpbmc7XG5cblx0cHJpdmF0ZSBtZXNzYWdlQnV0dG9uOiBhbnk7XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEV4dGVuc2lvbkFQSShzSWQ/OiBzdHJpbmcpOiBFeHRlbnNpb25BUEkge1xuXHRcdGlmIChzSWQpIHtcblx0XHRcdC8vIHRvIGFsbG93IGxvY2FsIElEIHVzYWdlIGZvciBjdXN0b20gcGFnZXMgd2UnbGwgY3JlYXRlL3JldHVybiBvd24gaW5zdGFuY2VzIGZvciBjdXN0b20gc2VjdGlvbnNcblx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzID0gdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMgfHwge307XG5cblx0XHRcdGlmICghdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSkge1xuXHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzLCBzSWQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdFx0dGhpcy5leHRlbnNpb25BUEkgPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHRcdH1cblx0fVxuXG5cdG9uSW5pdCgpIHtcblx0XHRzdXBlci5vbkluaXQoKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cblx0XHQvLyBTZXR0aW5nIGRlZmF1bHRzIG9mIGludGVybmFsIG1vZGVsIGNvbnRleHRcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJleHRlcm5hbE5hdmlnYXRpb25Db250ZXh0XCIsIHsgcGFnZTogdHJ1ZSB9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHNcIiwge1xuXHRcdFx0dmlzaWJpbGl0eTogZmFsc2UsXG5cdFx0XHRpdGVtczogbnVsbFxuXHRcdH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJiYXRjaEdyb3Vwc1wiLCB0aGlzLl9nZXRCYXRjaEdyb3Vwc0ZvclZpZXcoKSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIsIGZhbHNlKTtcblx0XHRpZiAob09iamVjdFBhZ2UuZ2V0RW5hYmxlTGF6eUxvYWRpbmcoKSkge1xuXHRcdFx0Ly9BdHRhY2hpbmcgdGhlIGV2ZW50IHRvIG1ha2UgdGhlIHN1YnNlY3Rpb24gY29udGV4dCBiaW5kaW5nIGFjdGl2ZSB3aGVuIGl0IGlzIHZpc2libGUuXG5cdFx0XHRvT2JqZWN0UGFnZS5hdHRhY2hFdmVudChcInN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnRcIiwgdGhpcy5faGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdFx0dGhpcy5tZXNzYWdlQnV0dG9uID0gdGhpcy5nZXRWaWV3KCkuYnlJZChcImZlOjpGb290ZXJCYXI6Ok1lc3NhZ2VCdXR0b25cIik7XG5cdFx0dGhpcy5tZXNzYWdlQnV0dG9uLm9JdGVtQmluZGluZy5hdHRhY2hDaGFuZ2UodGhpcy5fZm5TaG93T1BNZXNzYWdlLCB0aGlzKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwicm9vdEVkaXRFbmFibGVkXCIsIHRydWUpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJyb290RWRpdFZpc2libGVcIiwgdHJ1ZSk7XG5cdH1cblxuXHRvbkV4aXQoKSB7XG5cdFx0aWYgKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNJZCBvZiBPYmplY3Qua2V5cyh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcykpIHtcblx0XHRcdFx0aWYgKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0pIHtcblx0XHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzO1xuXHRcdH1cblx0XHRpZiAodGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXG5cdFx0Y29uc3Qgb01lc3NhZ2VQb3BvdmVyID0gdGhpcy5tZXNzYWdlQnV0dG9uID8gdGhpcy5tZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3ZlciA6IG51bGw7XG5cdFx0aWYgKG9NZXNzYWdlUG9wb3ZlciAmJiBvTWVzc2FnZVBvcG92ZXIuaXNPcGVuKCkpIHtcblx0XHRcdG9NZXNzYWdlUG9wb3Zlci5jbG9zZSgpO1xuXHRcdH1cblx0XHQvL3doZW4gZXhpdGluZyB3ZSBzZXQga2VlcEFsaXZlIGNvbnRleHQgdG8gZmFsc2Vcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRpZiAob0NvbnRleHQgJiYgb0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHR9XG5cdFx0aWYgKGlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKSkge1xuXHRcdFx0ZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7IC8vIENsZWFudXAgY29sbGFib3JhdGlvbiBjb25uZWN0aW9uIHdoZW4gbGVhdmluZyB0aGUgYXBwXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzaG93IHRoZSBtZXNzYWdlIHN0cmlwIG9uIHRoZSBvYmplY3QgcGFnZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9mblNob3dPUE1lc3NhZ2UoKSB7XG5cdFx0Y29uc3QgZXh0ZW5zaW9uQVBJID0gdGhpcy5nZXRFeHRlbnNpb25BUEkoKTtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VCdXR0b24ub01lc3NhZ2VQb3BvdmVyXG5cdFx0XHQuZ2V0SXRlbXMoKVxuXHRcdFx0Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKS5nZXRPYmplY3QoKSlcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdID09PSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdH0pO1xuXG5cdFx0aWYgKGV4dGVuc2lvbkFQSSkge1xuXHRcdFx0ZXh0ZW5zaW9uQVBJLnNob3dNZXNzYWdlcyhtZXNzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dldFRhYmxlQmluZGluZyhvVGFibGU6IGFueSkge1xuXHRcdHJldHVybiBvVGFibGUgJiYgb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0fVxuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcmluZy5hcHBseSh0aGlzKTtcblx0XHQvLyBJbiB0aGUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCBzY2VuYXJpbyB3ZSBuZWVkIHRvIGVuc3VyZSBpbiBjYXNlIG9mIHJlbG9hZC9yZWZyZXNoIHRoYXQgdGhlIG1ldGEgbW9kZWwgaW4gdGhlIG1ldGhvZGUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCBvZiB0aGUgRmllbGRSdW50aW1lIGlzIGF2YWlsYWJsZVxuXHRcdGlmICh0aGlzLm9WaWV3Lm9WaWV3RGF0YT8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCAmJiBDb21tb25IZWxwZXIuZ2V0TWV0YU1vZGVsKCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Q29tbW9uSGVscGVyLnNldE1ldGFNb2RlbCh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHR9XG5cdH1cblxuXHRfb25CZWZvcmVCaW5kaW5nKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHQvLyBUT0RPOiB3ZSBzaG91bGQgY2hlY2sgaG93IHRoaXMgY29tZXMgdG9nZXRoZXIgd2l0aCB0aGUgdHJhbnNhY3Rpb24gaGVscGVyLCBzYW1lIHRvIHRoZSBjaGFuZ2UgaW4gdGhlIGFmdGVyQmluZGluZ1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCksXG5cdFx0XHRvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0b0ludGVybmFsTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbCxcblx0XHRcdGFCYXRjaEdyb3VwcyA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImJhdGNoR3JvdXBzXCIpLFxuXHRcdFx0aVZpZXdMZXZlbCA9ICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudmlld0xldmVsO1xuXHRcdGxldCBvRmFzdENyZWF0aW9uUm93O1xuXHRcdGFCYXRjaEdyb3Vwcy5wdXNoKFwiJGF1dG9cIik7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24gIT09IHRydWUpIHtcblx0XHRcdHRoaXMuX2Nsb3NlU2lkZUNvbnRlbnQoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3BDb250ZXh0ID0gb09iamVjdFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGlmIChcblx0XHRcdG9wQ29udGV4dCAmJlxuXHRcdFx0b3BDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiZcblx0XHRcdCFhQmF0Y2hHcm91cHMuc29tZShvcENvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcy5iaW5kKG9wQ29udGV4dC5nZXRNb2RlbCgpKSlcblx0XHQpIHtcblx0XHRcdC8qIFx0SW4gY2FzZSB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGZvciB0aGUgY3JlYXRpb24gcm93IGFuZCBubyBvdGhlcnMgd2UgbmVlZCB0byByZXNldCB0aGUgY2hhbmdlc1xuXHRcdFx0XHRcdFx0XHRcdFRPRE86IHRoaXMgaXMganVzdCBhIHF1aWNrIHNvbHV0aW9uLCB0aGlzIG5lZWRzIHRvIGJlIHJld29ya2VkXG5cdFx0XHRcdFx0XHRcdFx0Ki9cblxuXHRcdFx0b3BDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cblx0XHQvLyBGb3Igbm93IHdlIGhhdmUgdG8gc2V0IHRoZSBiaW5kaW5nIGNvbnRleHQgdG8gbnVsbCBmb3IgZXZlcnkgZmFzdCBjcmVhdGlvbiByb3dcblx0XHQvLyBUT0RPOiBHZXQgcmlkIG9mIHRoaXMgY29kaW5nIG9yIG1vdmUgaXQgdG8gYW5vdGhlciBsYXllciAtIHRvIGJlIGRpc2N1c3NlZCB3aXRoIE1EQyBhbmQgbW9kZWxcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFUYWJsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdG9GYXN0Q3JlYXRpb25Sb3cgPSBhVGFibGVzW2ldLmdldENyZWF0aW9uUm93KCk7XG5cdFx0XHRpZiAob0Zhc3RDcmVhdGlvblJvdykge1xuXHRcdFx0XHRvRmFzdENyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG51bGwpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNjcm9sbCB0byBwcmVzZW50IFNlY3Rpb24gc28gdGhhdCBiaW5kaW5ncyBhcmUgZW5hYmxlZCBkdXJpbmcgbmF2aWdhdGlvbiB0aHJvdWdoIHBhZ2luYXRvciBidXR0b25zLCBhcyB0aGVyZSBpcyBubyB2aWV3IHJlcmVuZGVyaW5nL3JlYmluZFxuXHRcdGNvbnN0IGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmICghKG9PYmplY3RQYWdlIGFzIGFueSkuaXNGaXJzdFJlbmRlcmluZygpICYmICFtUGFyYW1ldGVycy5iUGVyc2lzdE9QU2Nyb2xsKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihudWxsIGFzIGFueSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRvT2JqZWN0UGFnZS5hdHRhY2hFdmVudE9uY2UoXCJtb2RlbENvbnRleHRDaGFuZ2VcIiwgZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uKTtcblxuXHRcdC8vIGlmIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE9iamVjdFBhZ2VMYXlvdXQgaXMgY2hhbmdlZCB0aGVuIHNjcm9sbCB0byBwcmVzZW50IFNlY3Rpb25cblx0XHQvLyBGSVhNRSBJcyB0aGlzIHJlYWxseSB3b3JraW5nIGFzIGludGVuZGVkID8gSW5pdGlhbGx5IHRoaXMgd2FzIG9uQmVmb3JlUmVuZGVyaW5nLCBidXQgbmV2ZXIgdHJpZ2dlcmVkIG9uQmVmb3JlUmVuZGVyaW5nIGJlY2F1c2UgaXQgd2FzIHJlZ2lzdGVyZWQgYWZ0ZXIgaXRcblx0XHRjb25zdCBvRGVsZWdhdGVPbkJlZm9yZSA9IHtcblx0XHRcdG9uQWZ0ZXJSZW5kZXJpbmc6IGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvblxuXHRcdH07XG5cdFx0b09iamVjdFBhZ2UuYWRkRXZlbnREZWxlZ2F0ZShvRGVsZWdhdGVPbkJlZm9yZSwgdGhpcyk7XG5cdFx0dGhpcy5wYWdlUmVhZHkuYXR0YWNoRXZlbnRPbmNlKFwicGFnZVJlYWR5XCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdG9PYmplY3RQYWdlLnJlbW92ZUV2ZW50RGVsZWdhdGUob0RlbGVnYXRlT25CZWZvcmUpO1xuXHRcdH0pO1xuXG5cdFx0Ly9TZXQgdGhlIEJpbmRpbmcgZm9yIFBhZ2luYXRvcnMgdXNpbmcgTGlzdEJpbmRpbmcgSURcblx0XHRpZiAoaVZpZXdMZXZlbCA+IDEpIHtcblx0XHRcdGxldCBvQmluZGluZyA9IG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmxpc3RCaW5kaW5nO1xuXHRcdFx0Y29uc3Qgb1BhZ2luYXRvckN1cnJlbnRDb250ZXh0ID0gb0ludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIik7XG5cdFx0XHRpZiAob1BhZ2luYXRvckN1cnJlbnRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nVG9Vc2UgPSBvUGFnaW5hdG9yQ3VycmVudENvbnRleHQuZ2V0QmluZGluZygpO1xuXHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKG9CaW5kaW5nVG9Vc2UsIG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dCk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChvQmluZGluZykge1xuXHRcdFx0XHRpZiAob0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKG9CaW5kaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gaWYgdGhlIGJpbmRpbmcgdHlwZSBpcyBub3QgT0RhdGFMaXN0QmluZGluZyBiZWNhdXNlIG9mIGEgZGVlcGxpbmsgbmF2aWdhdGlvbiBvciBhIHJlZnJlc2ggb2YgdGhlIHBhZ2Vcblx0XHRcdFx0XHQvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBpdFxuXHRcdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IG9CaW5kaW5nLmdldFBhdGgoKTtcblx0XHRcdFx0XHRpZiAoL1xcKFteKV0qXFwpJC8udGVzdChzQmluZGluZ1BhdGgpKSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgY3VycmVudCBiaW5kaW5nIHBhdGggZW5kcyB3aXRoICh4eHgpLCBzbyB3ZSBjcmVhdGUgdGhlIGxpc3RCaW5kaW5nIGJ5IHJlbW92aW5nICh4eHgpXG5cdFx0XHRcdFx0XHRjb25zdCBzTGlzdEJpbmRpbmdQYXRoID0gc0JpbmRpbmdQYXRoLnJlcGxhY2UoL1xcKFteKV0qXFwpJC8sIFwiXCIpO1xuXHRcdFx0XHRcdFx0b0JpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KShvQmluZGluZy5vTW9kZWwsIHNMaXN0QmluZGluZ1BhdGgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgX3NldExpc3RCaW5kaW5nQXN5bmMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChvQmluZGluZy5nZXRDb250ZXh0cygpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKG9CaW5kaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuZGV0YWNoRXZlbnQoXCJjaGFuZ2VcIiwgX3NldExpc3RCaW5kaW5nQXN5bmMpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRvQmluZGluZy5nZXRDb250ZXh0cygwKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY2hhbmdlXCIsIF9zZXRMaXN0QmluZGluZ0FzeW5jKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGN1cnJlbnQgYmluZGluZyBkb2Vzbid0IGVuZCB3aXRoICh4eHgpIC0tPiB0aGUgbGFzdCBzZWdtZW50IGlzIGEgMS0xIG5hdmlnYXRpb24sIHNvIHdlIGRvbid0IGRpc3BsYXkgdGhlIHBhZ2luYXRvclxuXHRcdFx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZSh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChvT2JqZWN0UGFnZS5nZXRFbmFibGVMYXp5TG9hZGluZygpKSB7XG5cdFx0XHRjb25zdCBhU2VjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpO1xuXHRcdFx0Y29uc3QgYlVzZUljb25UYWJCYXIgPSBvT2JqZWN0UGFnZS5nZXRVc2VJY29uVGFiQmFyKCk7XG5cdFx0XHRsZXQgaVNraXAgPSAyO1xuXHRcdFx0Y29uc3QgYklzSW5FZGl0TW9kZSA9IG9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0XHRcdGNvbnN0IGJFZGl0YWJsZUhlYWRlciA9ICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZWRpdGFibGVIZWFkZXJDb250ZW50O1xuXHRcdFx0Zm9yIChsZXQgaVNlY3Rpb24gPSAwOyBpU2VjdGlvbiA8IGFTZWN0aW9ucy5sZW5ndGg7IGlTZWN0aW9uKyspIHtcblx0XHRcdFx0Y29uc3Qgb1NlY3Rpb24gPSBhU2VjdGlvbnNbaVNlY3Rpb25dO1xuXHRcdFx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0XHRmb3IgKGxldCBpU3ViU2VjdGlvbiA9IDA7IGlTdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgaVN1YlNlY3Rpb24rKywgaVNraXAtLSkge1xuXHRcdFx0XHRcdC8vIEluIEljb25UYWJCYXIgbW9kZSBrZWVwIHRoZSBzZWNvbmQgc2VjdGlvbiBib3VuZCBpZiB0aGVyZSBpcyBhbiBlZGl0YWJsZSBoZWFkZXIgYW5kIHdlIGFyZSBzd2l0Y2hpbmcgdG8gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0aWYgKGlTa2lwIDwgMSB8fCAoYlVzZUljb25UYWJCYXIgJiYgKGlTZWN0aW9uID4gMSB8fCAoaVNlY3Rpb24gPT09IDEgJiYgIWJFZGl0YWJsZUhlYWRlciAmJiAhYklzSW5FZGl0TW9kZSkpKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBhU3ViU2VjdGlvbnNbaVN1YlNlY3Rpb25dO1xuXHRcdFx0XHRcdFx0aWYgKG9TdWJTZWN0aW9uLmRhdGEoKS5pc1Zpc2liaWxpdHlEeW5hbWljICE9PSBcInRydWVcIikge1xuXHRcdFx0XHRcdFx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dChudWxsIGFzIGFueSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMucGxhY2Vob2xkZXIuaXNQbGFjZWhvbGRlckVuYWJsZWQoKSAmJiBtUGFyYW1ldGVycy5zaG93UGxhY2Vob2xkZXIpIHtcblx0XHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRjb25zdCBvTmF2Q29udGFpbmVyID0gKG9WaWV3LmdldFBhcmVudCgpIGFzIGFueSkub0NvbnRhaW5lci5nZXRQYXJlbnQoKTtcblx0XHRcdGlmIChvTmF2Q29udGFpbmVyKSB7XG5cdFx0XHRcdG9OYXZDb250YWluZXIuc2hvd1BsYWNlaG9sZGVyKHt9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlOiBhbnkpIHtcblx0XHRsZXQgb0ZpcnN0Q2xpY2thYmxlRWxlbWVudDtcblx0XHRjb25zdCBhQWN0aW9ucyA9IG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkgJiYgb09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKS5nZXRBY3Rpb25zKCk7XG5cdFx0aWYgKGFBY3Rpb25zICYmIGFBY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0b0ZpcnN0Q2xpY2thYmxlRWxlbWVudCA9IGFBY3Rpb25zLmZpbmQoZnVuY3Rpb24gKG9BY3Rpb246IGFueSkge1xuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIGxlZnQgYWxpZ25tZW50IG9mIHRoZSBEcmFmdCBzd2l0Y2ggYW5kIHRoZSBjb2xsYWJvcmF0aXZlIGRyYWZ0IGF2YXRhciBjb250cm9sc1xuXHRcdFx0XHQvLyB0aGVyZSBpcyBhIFRvb2xiYXJTcGFjZXIgaW4gdGhlIGFjdGlvbnMgYWdncmVnYXRpb24gd2hpY2ggd2UgbmVlZCB0byBleGNsdWRlIGhlcmUhXG5cdFx0XHRcdC8vIER1ZSB0byB0aGUgQUNDIHJlcG9ydCwgd2UgYWxzbyBuZWVkIG5vdCB0byBjaGVjayBmb3IgdGhlIEludmlzaWJsZVRleHQgZWxlbWVudHNcblx0XHRcdFx0aWYgKG9BY3Rpb24uaXNBKFwic2FwLmZlLm1hY3Jvcy5zaGFyZS5TaGFyZUFQSVwiKSkge1xuXHRcdFx0XHRcdC8vIHNpbmNlIFNoYXJlQVBJIGRvZXMgbm90IGhhdmUgYSBkaXNhYmxlIHByb3BlcnR5XG5cdFx0XHRcdFx0Ly8gaGVuY2UgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZiBpdCBpcyBkaXNiYWxlZCBvciBub3Rcblx0XHRcdFx0XHRyZXR1cm4gb0FjdGlvbi5nZXRWaXNpYmxlKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIW9BY3Rpb24uaXNBKFwic2FwLnVpLmNvcmUuSW52aXNpYmxlVGV4dFwiKSAmJiAhb0FjdGlvbi5pc0EoXCJzYXAubS5Ub29sYmFyU3BhY2VyXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0VmlzaWJsZSgpICYmIG9BY3Rpb24uZ2V0RW5hYmxlZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9GaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdH1cblxuXHRfZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zOiBhbnkpIHtcblx0XHRpZiAoYVN1YlNlY3Rpb25zKSB7XG5cdFx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0XHRjb25zdCBhQmxvY2tzID0gYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpO1xuXG5cdFx0XHRcdGlmIChhQmxvY2tzKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgYmxvY2sgPSAwOyBibG9jayA8IGFCbG9ja3MubGVuZ3RoOyBibG9jaysrKSB7XG5cdFx0XHRcdFx0XHRsZXQgYUZvcm1Db250YWluZXJzO1xuXG5cdFx0XHRcdFx0XHRpZiAoYUJsb2Nrc1tibG9ja10uaXNBKFwic2FwLnVpLmxheW91dC5mb3JtLkZvcm1cIikpIHtcblx0XHRcdFx0XHRcdFx0YUZvcm1Db250YWluZXJzID0gYUJsb2Nrc1tibG9ja10uZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQgJiZcblx0XHRcdFx0XHRcdFx0YUJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCgpICYmXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKS5pc0EoXCJzYXAudWkubGF5b3V0LmZvcm0uRm9ybVwiKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKS5nZXRGb3JtQ29udGFpbmVycygpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoYUZvcm1Db250YWluZXJzKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db250YWluZXIgPSAwOyBmb3JtQ29udGFpbmVyIDwgYUZvcm1Db250YWluZXJzLmxlbmd0aDsgZm9ybUNvbnRhaW5lcisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUZvcm1FbGVtZW50cyA9IGFGb3JtQ29udGFpbmVyc1tmb3JtQ29udGFpbmVyXS5nZXRGb3JtRWxlbWVudHMoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoYUZvcm1FbGVtZW50cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZm9ybUVsZW1lbnQgPSAwOyBmb3JtRWxlbWVudCA8IGFGb3JtRWxlbWVudHMubGVuZ3RoOyBmb3JtRWxlbWVudCsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGaWVsZHMgPSBhRm9ybUVsZW1lbnRzW2Zvcm1FbGVtZW50XS5nZXRGaWVsZHMoKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgZmlyc3QgZmllbGQgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIElucHV0QmFzZSAoZS5nLiBjb3VsZCBiZSBhIFRleHQpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNvIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCBoYXMgYSBnZXRSZXF1aXJlZCBtZXRob2Rcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYUZpZWxkc1swXS5nZXRSZXF1aXJlZCAmJiBhRmllbGRzWzBdLmdldFJlcXVpcmVkKCkgJiYgIWFGaWVsZHNbMF0uZ2V0VmFsdWUoKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGFGaWVsZHNbMF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hlbiBzZWFyY2hpbmcgZm9yIG1hbmRhb3RyeSBlbXB0eSBmaWVsZDogJHtlcnJvcn1gKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0X3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShhU3ViU2VjdGlvbnM6IGFueSkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblxuXHRcdGNvbnN0IG9NYW5kYXRvcnlGaWVsZCA9IHRoaXMuX2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uKGFTdWJTZWN0aW9ucyk7XG5cdFx0bGV0IG9GaWVsZFRvRm9jdXM6IGFueTtcblx0XHRpZiAob01hbmRhdG9yeUZpZWxkKSB7XG5cdFx0XHRvRmllbGRUb0ZvY3VzID0gb01hbmRhdG9yeUZpZWxkLmNvbnRlbnQuZ2V0Q29udGVudEVkaXQoKVswXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IChvT2JqZWN0UGFnZSBhcyBhbnkpLl9nZXRGaXJzdEVkaXRhYmxlSW5wdXQoKSB8fCB0aGlzLl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob09iamVjdFBhZ2UpO1xuXHRcdH1cblxuXHRcdGlmIChvRmllbGRUb0ZvY3VzKSB7XG5cdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gV2Ugc2V0IHRoZSBmb2N1cyBpbiBhIHRpbWVlb3V0LCBvdGhlcndpc2UgdGhlIGZvY3VzIHNvbWV0aW1lcyBnb2VzIHRvIHRoZSBUYWJCYXJcblx0XHRcdFx0b0ZpZWxkVG9Gb2N1cy5mb2N1cygpO1xuXHRcdFx0fSwgMCk7XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWJTZWN0aW9uXCIpO1xuXHRcdG9TdWJTZWN0aW9uLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCk7XG5cdH1cblxuXHRfb25CYWNrTmF2aWdhdGlvbkluRHJhZnQob0NvbnRleHQ6IGFueSkge1xuXHRcdHRoaXMubWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0aWYgKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS5jaGVja0lmQmFja0hhc1NhbWVDb250ZXh0KCkpIHtcblx0XHRcdC8vIEJhY2sgbmF2IHdpbGwga2VlcCB0aGUgc2FtZSBjb250ZXh0IC0tPiBubyBuZWVkIHRvIGRpc3BsYXkgdGhlIGRpYWxvZ1xuXHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRyYWZ0LnByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aGlzdG9yeS5iYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdEZ1bmN0aW9uLnByb3RvdHlwZSxcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRkcmFmdC5OYXZpZ2F0aW9uVHlwZS5CYWNrTmF2aWdhdGlvblxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdF9vbkFmdGVyQmluZGluZyhvQmluZGluZ0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZmluZFRhYmxlcygpO1xuXG5cdFx0dGhpcy5fc2lkZUVmZmVjdHMuY2xlYXJGaWVsZEdyb3Vwc1ZhbGlkaXR5KCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIGlzIG9ubHkgYSB0ZW1wIHNvbHV0aW9uIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGZpeCB0aGUgY2FjaGUgaXNzdWUgYW5kIHdlIHVzZSB0aGlzIGFkZGl0aW9uYWxcblx0XHQvLyBiaW5kaW5nIHdpdGggb3duUmVxdWVzdFxuXHRcdG9CaW5kaW5nQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRsZXQgYUlCTkFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0b09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9TdWJTZWN0aW9uLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHRzIHRvIG9Gb3JtQ29udGFpbmVyOlxuXHRcdC8vIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIGludGVybmFsIGJpbmRpbmcgY29udGV4dCB0byB0aGUgWE1MIGZyYWdtZW50XG5cdFx0Ly8gKEZvcm1Db250YWluZXIuZnJhZ21lbnQueG1sKSB5ZXQgLSBpdCBpcyB1c2VkIGFscmVhZHkgZm9yIHRoZSBkYXRhLXN0cnVjdHVyZS5cblx0XHQvLyAyLiBBbm90aGVyIHByb2JsZW0gaXMsIHRoYXQgRm9ybUNvbnRhaW5lcnMgYXNzaWduZWQgdG8gYSAnTW9yZUJsb2NrJyBkb2VzIG5vdCBoYXZlIGFuXG5cdFx0Ly8gaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhdCBhbGwuXG5cblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIsIHt9KTtcblxuXHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9UYWJsZSwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0Ly8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIEJDUDogMjA4MDIxODAwNFxuXHRcdFx0Ly8gTmVlZCB0byBmaXggd2l0aCBCTEk6IEZJT1JJVEVDSFAxLTE1Mjc0XG5cdFx0XHQvLyBvbmx5IGZvciBlZGl0IG1vZGUsIHdlIGNsZWFyIHRoZSB0YWJsZSBjYWNoZVxuXHRcdFx0Ly8gV29ya2Fyb3VuZCBzdGFydHMgaGVyZSEhXG5cdFx0XHRjb25zdCBvVGFibGVSb3dCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVSb3dCaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob1RhYmxlUm93QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdC8vIGFwcGx5IGZvciBib3RoIGVkaXQgYW5kIGRpc3BsYXkgbW9kZSBpbiBzdGlja3lcblx0XHRcdFx0XHRvVGFibGVSb3dCaW5kaW5nLnJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBXb3JrYXJvdW5kIGVuZHMgaGVyZSEhXG5cblx0XHRcdC8vIFVwZGF0ZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgRGF0YUZpZWxkRm9yQWN0aW9uIGJ1dHRvbnMgb24gdGFibGUgdG9vbGJhclxuXHRcdFx0Ly8gVGhlIHNhbWUgaXMgYWxzbyBwZXJmb3JtZWQgb24gVGFibGUgc2VsZWN0aW9uQ2hhbmdlIGV2ZW50XG5cdFx0XHRjb25zdCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gSlNPTi5wYXJzZShcblx0XHRcdFx0XHRDb21tb25IZWxwZXIucGFyc2VDdXN0b21EYXRhKERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKG9UYWJsZSwgXCJvcGVyYXRpb25BdmFpbGFibGVNYXBcIikpXG5cdFx0XHRcdCksXG5cdFx0XHRcdGFTZWxlY3RlZENvbnRleHRzID0gb1RhYmxlLmdldFNlbGVjdGVkQ29udGV4dHMoKTtcblxuXHRcdFx0QWN0aW9uUnVudGltZS5zZXRBY3Rpb25FbmFibGVtZW50KG9JbnRlcm5hbE1vZGVsQ29udGV4dCwgb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCwgYVNlbGVjdGVkQ29udGV4dHMsIFwidGFibGVcIik7XG5cdFx0XHQvLyBDbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSwgbmVlZCB0byBiZSBmaXhlZCBhbmQgcmV2aWV3IHdpdGggQkxJOiBGSU9SSVRFQ0hQMS0yNDMxOFxuXHRcdFx0b1RhYmxlLmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMuZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCh0aGlzLCBcIl9wYWdlTW9kZWxcIik7XG5cdFx0Ly9SZXRyaWV2ZSBPYmplY3QgUGFnZSBoZWFkZXIgYWN0aW9ucyBmcm9tIE9iamVjdCBQYWdlIHRpdGxlIGNvbnRyb2xcblx0XHRjb25zdCBvT2JqZWN0UGFnZVRpdGxlID0gb09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKSBhcyBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlO1xuXHRcdGxldCBhSUJOSGVhZGVyQWN0aW9uczogYW55W10gPSBbXTtcblx0XHRhSUJOSGVhZGVyQWN0aW9ucyA9IENvbW1vblV0aWxzLmdldElCTkFjdGlvbnMob09iamVjdFBhZ2VUaXRsZSwgYUlCTkhlYWRlckFjdGlvbnMpO1xuXHRcdGFJQk5BY3Rpb25zID0gYUlCTkFjdGlvbnMuY29uY2F0KGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRDb21tb25VdGlscy51cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eShhSUJOQWN0aW9ucywgdGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0bGV0IG9Nb2RlbDogYW55LCBvRmluYWxVSVN0YXRlOiBhbnk7XG5cblx0XHQvLyB0aGlzIHNob3VsZCBub3QgYmUgbmVlZGVkIGF0IHRoZSBhbGxcblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1RhYmxlXG5cdFx0ICovXG5cdFx0Y29uc3QgaGFuZGxlVGFibGVNb2RpZmljYXRpb25zID0gKG9UYWJsZTogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBvQmluZGluZyA9IHRoaXMuX2dldFRhYmxlQmluZGluZyhvVGFibGUpLFxuXHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0VGFibGVIZWxwZXIuZW5hYmxlRmFzdENyZWF0aW9uUm93KFxuXHRcdFx0XHRcdFx0b1RhYmxlLmdldENyZWF0aW9uUm93KCksXG5cdFx0XHRcdFx0XHRvQmluZGluZy5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHRvQmluZGluZy5nZXRDb250ZXh0KCksXG5cdFx0XHRcdFx0XHRvTW9kZWwsXG5cdFx0XHRcdFx0XHRvRmluYWxVSVN0YXRlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fTtcblxuXHRcdFx0aWYgKCFvQmluZGluZykge1xuXHRcdFx0XHRMb2cuZXJyb3IoYEV4cGVjdGVkIGJpbmRpbmcgbWlzc2luZyBmb3IgdGFibGU6ICR7b1RhYmxlLmdldElkKCl9YCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9CaW5kaW5nLm9Db250ZXh0KSB7XG5cdFx0XHRcdGZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZm5IYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKG9CaW5kaW5nLm9Db250ZXh0KSB7XG5cdFx0XHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmRldGFjaENoYW5nZShmbkhhbmRsZUNoYW5nZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRvQmluZGluZy5hdHRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRvTW9kZWwgPSBvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKTtcblxuXHRcdFx0Ly8gQ29tcHV0ZSBFZGl0IE1vZGVcblx0XHRcdG9GaW5hbFVJU3RhdGUgPSB0aGlzLmVkaXRGbG93LmNvbXB1dGVFZGl0TW9kZShvQmluZGluZ0NvbnRleHQpO1xuXG5cdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQob01vZGVsLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRvRmluYWxVSVN0YXRlXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSkge1xuXHRcdFx0XHRcdFx0XHRjb25uZWN0KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdFx0XHRcdGRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpOyAvLyBDbGVhbnVwIGNvbGxhYm9yYXRpb24gY29ubmVjdGlvbiBpbiBjYXNlIHdlIHN3aXRjaCB0byBhbm90aGVyIGVsZW1lbnQgKGUuZy4gaW4gRkNMKVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgdGhlIGZpbmFsIFVJIFN0YXRlXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyB1cGRhdGUgcmVsYXRlZCBhcHBzXG5cdFx0XHR0aGlzLl91cGRhdGVSZWxhdGVkQXBwcygpO1xuXG5cdFx0XHQvL0F0dGFjaCB0aGUgcGF0Y2ggc2VudCBhbmQgcGF0Y2ggY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0XHRjb25zdCBvQmluZGluZyA9IChvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZyAmJiBvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKSB8fCBvQmluZGluZ0NvbnRleHQ7XG5cblx0XHRcdC8vIEF0dGFjaCB0aGUgZXZlbnQgaGFuZGxlciBvbmx5IG9uY2UgdG8gdGhlIHNhbWUgYmluZGluZ1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudEJpbmRpbmcgIT09IG9CaW5kaW5nKSB7XG5cdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwicGF0Y2hTZW50XCIsIHRoaXMuZWRpdEZsb3cuaGFuZGxlUGF0Y2hTZW50LCB0aGlzKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50QmluZGluZyA9IG9CaW5kaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRcdC8vIGFjY2VzcyBiaW5kaW5nIG9ubHkgYWZ0ZXIgdGFibGUgaXMgYm91bmRcblx0XHRcdFx0VGFibGVVdGlscy53aGVuQm91bmQob1RhYmxlKVxuXHRcdFx0XHRcdC50aGVuKGhhbmRsZVRhYmxlTW9kaWZpY2F0aW9ucylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdGFibGUgdG8gYmUgYm91bmRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYmluZGluZyBpcyByZWFkeSBoZW5jZSBjYWxsaW5nIGl0IGluIG9uQWZ0ZXJCaW5kaW5nXG5cdFx0XHQob09iamVjdFBhZ2UgYXMgYW55KS5fdHJpZ2dlclZpc2libGVTdWJTZWN0aW9uc0V2ZW50cygpO1xuXG5cdFx0XHQvL1RvIENvbXB1dGUgdGhlIEVkaXQgQmluZGluZyBvZiB0aGUgc3ViT2JqZWN0IHBhZ2UgdXNpbmcgcm9vdCBvYmplY3QgcGFnZSwgY3JlYXRlIGEgY29udGV4dCBmb3IgZHJhZnQgcm9vdCBhbmQgdXBkYXRlIHRoZSBlZGl0IGJ1dHRvbiBpbiBzdWIgT1AgdXNpbmcgdGhlIGNvbnRleHRcblx0XHRcdEFjdGlvblJ1bnRpbWUudXBkYXRlRWRpdEJ1dHRvblZpc2liaWxpdHlBbmRFbmFibGVtZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUGFnZVJlYWR5KG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBzZXRGb2N1cyA9ICgpID0+IHtcblx0XHRcdC8vIFNldCB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IGFjdGlvbiBidXR0b24sIG9yIHRvIHRoZSBmaXJzdCBlZGl0YWJsZSBpbnB1dCBpZiBpbiBlZGl0YWJsZSBtb2RlXG5cdFx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBpc0luRGlzcGxheU1vZGUgPSAhb09iamVjdFBhZ2UuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXG5cdFx0XHRpZiAoaXNJbkRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSB0aGlzLl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob09iamVjdFBhZ2UpO1xuXHRcdFx0XHRpZiAob0ZpcnN0Q2xpY2thYmxlRWxlbWVudCkge1xuXHRcdFx0XHRcdG9GaXJzdENsaWNrYWJsZUVsZW1lbnQuZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdGVkU2VjdGlvbjogYW55ID0gQ29yZS5ieUlkKG9PYmplY3RQYWdlLmdldFNlbGVjdGVkU2VjdGlvbigpKTtcblx0XHRcdFx0aWYgKG9TZWxlY3RlZFNlY3Rpb24pIHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVGb2N1c0luRWRpdE1vZGUob1NlbGVjdGVkU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Ly8gQXBwbHkgYXBwIHN0YXRlIG9ubHkgYWZ0ZXIgdGhlIHBhZ2UgaXMgcmVhZHkgd2l0aCB0aGUgZmlyc3Qgc2VjdGlvbiBzZWxlY3RlZFxuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdC8vU2hvdyBwb3B1cCB3aGlsZSBuYXZpZ2F0aW5nIGJhY2sgZnJvbSBvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGRyYWZ0XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCgob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0aWYgKCFiSXNTdGlja3lNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigoKSA9PiB0aGlzLl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdChvQmluZGluZ0NvbnRleHQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3Qgdmlld0lkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHQuZ2V0QXBwU3RhdGVIYW5kbGVyKClcblx0XHRcdC5hcHBseUFwcFN0YXRlKHZpZXdJZCwgdGhpcy5nZXRWaWV3KCkpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5mb3JjZUZvY3VzKSB7XG5cdFx0XHRcdFx0c2V0Rm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoRXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyB0aGUgZm9jdXNcIiwgRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiLCBmYWxzZSk7XG5cdFx0dGhpcy5fY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBzdGF0dXMgb2YgZWRpdCBtb2RlIGZvciBzdGlja3kgc2Vzc2lvblxuXHQgKi9cblx0Z2V0U3RpY2t5RWRpdE1vZGUoKSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQgJiYgKHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0bGV0IGJJc1N0aWNreUVkaXRNb2RlID0gZmFsc2U7XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRpZiAoYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRiSXNTdGlja3lFZGl0TW9kZSA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGJJc1N0aWNreUVkaXRNb2RlO1xuXHR9XG5cblx0X2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBPYmplY3RQYWdlTGF5b3V0O1xuXHR9XG5cblx0X2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZVN1YnRpdGxlID0gb09iamVjdFBhZ2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoZnVuY3Rpb24gKG9DdXN0b21EYXRhOiBhbnkpIHtcblx0XHRcdHJldHVybiBvQ3VzdG9tRGF0YS5nZXRLZXkoKSA9PT0gXCJPYmplY3RQYWdlU3VidGl0bGVcIjtcblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGl0bGU6IG9PYmplY3RQYWdlLmRhdGEoXCJPYmplY3RQYWdlVGl0bGVcIikgfHwgXCJcIixcblx0XHRcdHN1YnRpdGxlOiBvT2JqZWN0UGFnZVN1YnRpdGxlICYmIG9PYmplY3RQYWdlU3VidGl0bGUuZ2V0VmFsdWUoKSxcblx0XHRcdGludGVudDogXCJcIixcblx0XHRcdGljb246IFwiXCJcblx0XHR9O1xuXHR9XG5cblx0X2V4ZWN1dGVIZWFkZXJTaG9ydGN1dChzSWQ6IGFueSkge1xuXHRcdGNvbnN0IHNCdXR0b25JZCA9IGAke3RoaXMuZ2V0VmlldygpLmdldElkKCl9LS0ke3NJZH1gLFxuXHRcdFx0b0J1dHRvbiA9ICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldEhlYWRlclRpdGxlKCkgYXMgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSlcblx0XHRcdFx0LmdldEFjdGlvbnMoKVxuXHRcdFx0XHQuZmluZChmdW5jdGlvbiAob0VsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvRWxlbWVudC5nZXRJZCgpID09PSBzQnV0dG9uSWQ7XG5cdFx0XHRcdH0pO1xuXHRcdGlmIChvQnV0dG9uKSB7XG5cdFx0XHRDb21tb25VdGlscy5maXJlQnV0dG9uUHJlc3Mob0J1dHRvbik7XG5cdFx0fVxuXHR9XG5cblx0X2V4ZWN1dGVGb290ZXJTaG9ydGN1dChzSWQ6IGFueSkge1xuXHRcdGNvbnN0IHNCdXR0b25JZCA9IGAke3RoaXMuZ2V0VmlldygpLmdldElkKCl9LS0ke3NJZH1gLFxuXHRcdFx0b0J1dHRvbiA9ICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldEZvb3RlcigpIGFzIGFueSkuZ2V0Q29udGVudCgpLmZpbmQoZnVuY3Rpb24gKG9FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9FbGVtZW50LmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC5tLkJ1dHRvblwiICYmIG9FbGVtZW50LmdldElkKCkgPT09IHNCdXR0b25JZDtcblx0XHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLmZpcmVCdXR0b25QcmVzcyhvQnV0dG9uKTtcblx0fVxuXG5cdF9leGVjdXRlVGFiU2hvcnRDdXQob0V4ZWN1dGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLFxuXHRcdFx0YVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKSxcblx0XHRcdGlTZWN0aW9uSW5kZXhNYXggPSBhU2VjdGlvbnMubGVuZ3RoIC0gMSxcblx0XHRcdHNDb21tYW5kID0gb0V4ZWN1dGlvbi5vU291cmNlLmdldENvbW1hbmQoKTtcblx0XHRsZXQgbmV3U2VjdGlvbixcblx0XHRcdGlTZWxlY3RlZFNlY3Rpb25JbmRleCA9IG9PYmplY3RQYWdlLmluZGV4T2ZTZWN0aW9uKHRoaXMuYnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSkgYXMgT2JqZWN0UGFnZVNlY3Rpb24pO1xuXHRcdGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggIT09IC0xICYmIGlTZWN0aW9uSW5kZXhNYXggPiAwKSB7XG5cdFx0XHRpZiAoc0NvbW1hbmQgPT09IFwiTmV4dFRhYlwiKSB7XG5cdFx0XHRcdGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggPD0gaVNlY3Rpb25JbmRleE1heCAtIDEpIHtcblx0XHRcdFx0XHRuZXdTZWN0aW9uID0gYVNlY3Rpb25zWysraVNlbGVjdGVkU2VjdGlvbkluZGV4XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggIT09IDApIHtcblx0XHRcdFx0Ly8gUHJldmlvdXNUYWJcblx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1stLWlTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChuZXdTZWN0aW9uKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihuZXdTZWN0aW9uKTtcblx0XHRcdFx0bmV3U2VjdGlvbi5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9nZXRGb290ZXJWaXNpYmlsaXR5KCkge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIsIGZhbHNlKTtcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRNZXNzYWdlTWFuYWdlcigpXG5cdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdGlmIChvTWVzc2FnZS52YWxpZGF0aW9uICYmIG9NZXNzYWdlLnR5cGUgPT09IFwiRXJyb3JcIiAmJiBvTWVzc2FnZS50YXJnZXQuaW5kZXhPZihzVmlld0lkKSA+IC0xKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdF9zaG93TWVzc2FnZVBvcG92ZXIoZXJyPzogYW55LCBvUmV0PzogYW55KSB7XG5cdFx0aWYgKGVycikge1xuXHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0fVxuXHRcdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlVmlldyA9IHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0PyByb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0VmlldygpXG5cdFx0XHQ6ICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250YWluZXIoKSBhcyBhbnkpLmdldEN1cnJlbnRQYWdlKCk7XG5cdFx0aWYgKCFjdXJyZW50UGFnZVZpZXcuaXNBKFwic2FwLm0uTWVzc2FnZVBhZ2VcIikpIHtcblx0XHRcdGNvbnN0IG9NZXNzYWdlQnV0dG9uID0gdGhpcy5tZXNzYWdlQnV0dG9uLFxuXHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIgPSBvTWVzc2FnZUJ1dHRvbi5vTWVzc2FnZVBvcG92ZXIsXG5cdFx0XHRcdG9JdGVtQmluZGluZyA9IG9NZXNzYWdlUG9wb3Zlci5nZXRCaW5kaW5nKFwiaXRlbXNcIik7XG5cblx0XHRcdGlmIChvSXRlbUJpbmRpbmcuZ2V0TGVuZ3RoKCkgPiAwICYmICFvTWVzc2FnZVBvcG92ZXIuaXNPcGVuKCkpIHtcblx0XHRcdFx0b01lc3NhZ2VCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdFx0Ly8gd29ya2Fyb3VuZCB0byBlbnN1cmUgdGhhdCBvTWVzc2FnZUJ1dHRvbiBpcyByZW5kZXJlZCB3aGVuIG9wZW5CeSBpcyBjYWxsZWRcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b01lc3NhZ2VQb3BvdmVyLm9wZW5CeShvTWVzc2FnZUJ1dHRvbik7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1JldDtcblx0fVxuXG5cdF9lZGl0RG9jdW1lbnQob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIik7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Nb2RlbCk7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuZWRpdERvY3VtZW50LmFwcGx5KHRoaXMuZWRpdEZsb3csIFtvQ29udGV4dF0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob01vZGVsKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBjb250ZXh0IG9mIHRoZSBEcmFmdFJvb3QgcGF0aC5cblx0ICogSWYgYSB2aWV3IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgZHJhZnQgUm9vdCBQYXRoLCB0aGlzIG1ldGhvZCByZXR1cm5zIGl0cyBiaW5kaW5nQ29udGV4dC5cblx0ICogV2hlcmUgbm8gdmlldyBpcyBmb3VuZCBhIG5ldyBjcmVhdGVkIGNvbnRleHQgaXMgcmV0dXJuZWQuXG5cdCAqIFRoZSBuZXcgY3JlYXRlZCBjb250ZXh0IHJlcXVlc3QgdGhlIGtleSBvZiB0aGUgZW50aXR5IGluIG9yZGVyIHRvIGdldCB0aGUgRXRhZyBvZiB0aGlzIGVudGl0eS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldERyYWZ0Um9vdFBhdGhcblx0ICogQHJldHVybnMgUmV0dXJucyBhIFByb21pc2Vcblx0ICovXG5cdGFzeW5jIGdldERyYWZ0Um9vdENvbnRleHQoKTogUHJvbWlzZTxDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0Y29uc3QgZHJhZnRSb290Q29udGV4dFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKGNvbnRleHQpO1xuXHRcdFx0bGV0IHNpbXBsZURyYWZ0Um9vdENvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRpZiAoZHJhZnRSb290Q29udGV4dFBhdGgpIHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgYSB2aWV3IG1hdGNoZXMgd2l0aCB0aGUgZHJhZnQgcm9vdCBwYXRoXG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFJvb3RWaWV3Q29udHJvbGxlcigpXG5cdFx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0XHQuZmluZCgocGFnZVZpZXc6IFZpZXcpID0+IHBhZ2VWaWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKSA9PT0gZHJhZnRSb290Q29udGV4dFBhdGgpXG5cdFx0XHRcdFx0Py5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdGlmIChleGlzdGluZ0JpbmRpbmdDb250ZXh0T25QYWdlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRcdHNpbXBsZURyYWZ0Um9vdENvbnRleHQgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3NpbXBsZURyYWZ0Um9vdENvbnRleHRcIik7XG5cdFx0XHRcdGlmIChzaW1wbGVEcmFmdFJvb3RDb250ZXh0Py5nZXRQYXRoKCkgPT09IGRyYWZ0Um9vdENvbnRleHRQYXRoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNpbXBsZURyYWZ0Um9vdENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRcdHNpbXBsZURyYWZ0Um9vdENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChkcmFmdFJvb3RDb250ZXh0UGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGF3YWl0IENvbW1vblV0aWxzLndhaXRGb3JDb250ZXh0UmVxdWVzdGVkKHNpbXBsZURyYWZ0Um9vdENvbnRleHQpO1xuXHRcdFx0XHQvLyBTdG9yZSB0aGlzIG5ldyBjcmVhdGVkIGNvbnRleHQgdG8gdXNlIGl0IG9uIHRoZSBuZXh0IGl0ZXJhdGlvbnNcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zaW1wbGVEcmFmdFJvb3RDb250ZXh0XCIsIHNpbXBsZURyYWZ0Um9vdENvbnRleHQpO1xuXHRcdFx0XHRyZXR1cm4gc2ltcGxlRHJhZnRSb290Q29udGV4dDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRhc3luYyBfdmFsaWRhdGVEb2N1bWVudCgpOiBQcm9taXNlPHZvaWQgfCBhbnlbXSB8IE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IGNvbnRyb2wgPSBDb3JlLmJ5SWQoQ29yZS5nZXRDdXJyZW50Rm9jdXNlZENvbnRyb2xJZCgpKTtcblx0XHRjb25zdCBjb250ZXh0ID0gY29udHJvbD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRcdGlmIChjb250ZXh0ICYmICFjb250ZXh0LmlzVHJhbnNpZW50KCkpIHtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzU2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSBzaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHQpO1xuXHRcdFx0Y29uc3QgZ2xvYmFsU2lkZUVmZmVjdHMgPSBlbnRpdHlUeXBlID8gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEdsb2JhbE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZSkgOiBbXTtcblx0XHRcdC8vIElmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBnbG9iYWwgU2lkZUVmZmVjdHMgZm9yIHRoZSByZWxhdGVkIGVudGl0eSwgZXhlY3V0ZSBpdC90aGVtXG5cdFx0XHRpZiAoZ2xvYmFsU2lkZUVmZmVjdHMubGVuZ3RoKSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGdsb2JhbFNpZGVFZmZlY3RzLm1hcCgoc2lkZUVmZmVjdHMpID0+IHRoaXMuX3NpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cywgY29udGV4dCkpKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGRyYWZ0Um9vdENvbnRleHQgPSBhd2FpdCB0aGlzLmdldERyYWZ0Um9vdENvbnRleHQoKTtcblx0XHRcdC8vRXhlY3V0ZSB0aGUgZHJhZnRWYWxpZGF0aW9uIGlmIHRoZXJlIGlzIG5vIGdsb2JhbFNpZGVFZmZlY3RzIChpZ25vcmUgRVRhZ3MgaW4gY29sbGFib3JhdGlvbiBkcmFmdClcblx0XHRcdGlmIChkcmFmdFJvb3RDb250ZXh0KSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdFx0cmV0dXJuIGRyYWZ0LmV4ZWN1dGVEcmFmdFZhbGlkYXRpb24oZHJhZnRSb290Q29udGV4dCwgYXBwQ29tcG9uZW50LCBpc0Nvbm5lY3RlZCh0aGlzLmdldFZpZXcoKSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgX3NhdmVEb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSxcblx0XHRcdGFXYWl0Q3JlYXRlRG9jdW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdC8vIGluZGljYXRlcyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm93IGluIHRoZSBPUFxuXHRcdGxldCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IGZhbHNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTW9kZWwpO1xuXHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5mb3JFYWNoKChvVGFibGU6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcob1RhYmxlKTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogb1RhYmxlLmRhdGEoXCJjcmVhdGlvbk1vZGVcIiksXG5cdFx0XHRcdGNyZWF0aW9uUm93OiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKSxcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IG9UYWJsZS5kYXRhKFwiY3JlYXRlQXRFbmRcIikgPT09IFwidHJ1ZVwiXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgYkNyZWF0ZURvY3VtZW50ID1cblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSAmJlxuXHRcdFx0XHRPYmplY3Qua2V5cyhtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpKS5sZW5ndGggPiAxO1xuXHRcdFx0aWYgKGJDcmVhdGVEb2N1bWVudCkge1xuXHRcdFx0XHQvLyB0aGUgYlNraXBTaWRlRWZmZWN0cyBpcyBhIHBhcmFtZXRlciBjcmVhdGVkIHdoZW4gd2UgY2xpY2sgdGhlIHNhdmUga2V5LiBJZiB3ZSBwcmVzcyB0aGlzIGtleVxuXHRcdFx0XHQvLyB3ZSBkb24ndCBleGVjdXRlIHRoZSBoYW5kbGVTaWRlRWZmZWN0cyBmdW5jaXRvbiB0byBhdm9pZCBiYXRjaCByZWR1bmRhbmN5XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJTa2lwU2lkZUVmZmVjdHMgPSB0cnVlO1xuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IHRydWU7XG5cdFx0XHRcdGFXYWl0Q3JlYXRlRG9jdW1lbnRzLnB1c2goXG5cdFx0XHRcdFx0dGhpcy5lZGl0Rmxvdy5jcmVhdGVEb2N1bWVudChvQmluZGluZywgbVBhcmFtZXRlcnMpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYUJpbmRpbmdzID0gYXdhaXQgUHJvbWlzZS5hbGwoYVdhaXRDcmVhdGVEb2N1bWVudHMpO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yOiBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YmluZGluZ3M6IGFCaW5kaW5nc1xuXHRcdFx0fTtcblx0XHRcdC8vIFdlIG5lZWQgdG8gZWl0aGVyIHJlamVjdCBvciByZXNvbHZlIGEgcHJvbWlzZSBoZXJlIGFuZCByZXR1cm4gaXQgc2luY2UgdGhpcyBzYXZlXG5cdFx0XHQvLyBmdW5jdGlvbiBpcyBub3Qgb25seSBjYWxsZWQgd2hlbiBwcmVzc2luZyB0aGUgc2F2ZSBidXR0b24gaW4gdGhlIGZvb3RlciwgYnV0IGFsc29cblx0XHRcdC8vIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBjcmVhdGUgb3Igc2F2ZSBpbiBhIGRhdGFsb3NzIHBvcHVwLlxuXHRcdFx0Ly8gVGhlIGxvZ2ljIG9mIHRoZSBkYXRhbG9zcyBwb3B1cCBuZWVkcyB0byBkZXRlY3QgaWYgdGhlIHNhdmUgaGFkIGVycm9ycyBvciBub3QgaW4gb3JkZXJcblx0XHRcdC8vIHRvIGRlY2lkZSBpZiB0aGUgc3Vic2VxdWVudCBhY3Rpb24gLSBsaWtlIGEgYmFjayBuYXZpZ2F0aW9uIC0gaGFzIHRvIGJlIGV4ZWN1dGVkIG9yIG5vdC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc2F2ZURvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdC8vIElmIHRoZSBzYXZlRG9jdW1lbnQgaW4gZWRpdEZsb3cgcmV0dXJucyBlcnJvcnMgd2UgbmVlZFxuXHRcdFx0XHQvLyB0byBzaG93IHRoZSBtZXNzYWdlIHBvcG92ZXIgaGVyZSBhbmQgZW5zdXJlIHRoYXQgdGhlXG5cdFx0XHRcdC8vIGRhdGFsb3NzIGxvZ2ljIGRvZXMgbm90IHBlcmZvcm0gdGhlIGZvbGxvdyB1cCBmdW5jdGlvblxuXHRcdFx0XHQvLyBsaWtlIGUuZy4gYSBiYWNrIG5hdmlnYXRpb24gaGVuY2Ugd2UgcmV0dXJuIGEgcHJvbWlzZSBhbmQgcmVqZWN0IGl0XG5cdFx0XHRcdHRoaXMuX3Nob3dNZXNzYWdlUG9wb3ZlcihlcnJvcik7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTW9kZWwpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Nb2RlbCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X21hbmFnZUNvbGxhYm9yYXRpb24oKSB7XG5cdFx0b3Blbk1hbmFnZURpYWxvZyh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRfc2hvd0NvbGxhYm9yYXRpb25Vc2VyRGV0YWlscyhldmVudDogYW55KSB7XG5cdFx0c2hvd1VzZXJEZXRhaWxzKGV2ZW50LCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRfY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uKTsgLy90byBnZXQgdGhlIHJlZmVyZW5jZSBvZiB0aGUgY2FuY2VsIGJ1dHRvbiBmcm9tIGNvbW1hbmQgZXhlY3V0aW9uXG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdF9hcHBseURvY3VtZW50KG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvdy5hcHBseURvY3VtZW50KG9Db250ZXh0KS5jYXRjaCgoKSA9PiB0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoKSk7XG5cdH1cblxuXHRfdXBkYXRlUmVsYXRlZEFwcHMoKSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGlmIChDb21tb25VdGlscy5yZXNvbHZlU3RyaW5ndG9Cb29sZWFuKG9PYmplY3RQYWdlLmRhdGEoXCJzaG93UmVsYXRlZEFwcHNcIikpKSB7XG5cdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0Q29tbW9uVXRpbHMudXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzKG9PYmplY3RQYWdlLCBhcHBDb21wb25lbnQpO1xuXHRcdH1cblx0fVxuXG5cdF9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhUGFyZW50RWxlbWVudDogYW55LCBhU3Vic2VjdGlvbjogYW55LCBhQ29udHJvbHM6IGFueSwgYklzQ2hhcnQ/OiBib29sZWFuKSB7XG5cdFx0Y29uc3QgYVN1YlNlY3Rpb25UYWJsZXMgPSBbXTtcblx0XHRmb3IgKGxldCBlbGVtZW50ID0gMDsgZWxlbWVudCA8IGFQYXJlbnRFbGVtZW50Lmxlbmd0aDsgZWxlbWVudCsrKSB7XG5cdFx0XHRsZXQgb0VsZW1lbnQgPSBhUGFyZW50RWxlbWVudFtlbGVtZW50XS5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgYVBhcmVudEVsZW1lbnRbZWxlbWVudF0uZ2V0Q29udGVudCgpO1xuXHRcdFx0aWYgKGJJc0NoYXJ0KSB7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5tQWdncmVnYXRpb25zICYmIG9FbGVtZW50LmdldEFnZ3JlZ2F0aW9uKFwiaXRlbXNcIikpIHtcblx0XHRcdFx0XHRjb25zdCBhSXRlbXMgPSBvRWxlbWVudC5nZXRBZ2dyZWdhdGlvbihcIml0ZW1zXCIpO1xuXHRcdFx0XHRcdGFJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChvSXRlbTogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAob0l0ZW0uaXNBKFwic2FwLmZlLm1hY3Jvcy5jaGFydC5DaGFydEFQSVwiKSkge1xuXHRcdFx0XHRcdFx0XHRvRWxlbWVudCA9IG9JdGVtO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC51aS5sYXlvdXQuRHluYW1pY1NpZGVDb250ZW50XCIpKSB7XG5cdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnQuZ2V0TWFpbkNvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvRWxlbWVudC5nZXRNYWluQ29udGVudCgpO1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIFRoZSB0YWJsZSBtYXkgY3VycmVudGx5IGJlIHNob3duIGluIGEgZnVsbCBzY3JlZW4gZGlhbG9nLCB3ZSBjYW4gdGhlbiBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgVGFibGVBUElcblx0XHRcdC8vIGNvbnRyb2wgZnJvbSB0aGUgY3VzdG9tIGRhdGEgb2YgdGhlIHBsYWNlIGhvbGRlciBwYW5lbFxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAubS5QYW5lbFwiKSAmJiBvRWxlbWVudC5kYXRhKFwiRnVsbFNjcmVlblRhYmxlUGxhY2VIb2xkZXJcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5kYXRhKFwidGFibGVBUElyZWZlcmVuY2VcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC5mZS5tYWNyb3MudGFibGUuVGFibGVBUElcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0VsZW1lbnQuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRhQ29udHJvbHMucHVzaChvRWxlbWVudCk7XG5cdFx0XHRcdGFTdWJTZWN0aW9uVGFibGVzLnB1c2goe1xuXHRcdFx0XHRcdHRhYmxlOiBvRWxlbWVudCxcblx0XHRcdFx0XHRncmlkVGFibGU6IG9FbGVtZW50LmdldFR5cGUoKS5pc0EoXCJzYXAudWkubWRjLnRhYmxlLkdyaWRUYWJsZVR5cGVcIilcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC5mZS5tYWNyb3MuY2hhcnQuQ2hhcnRBUElcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0VsZW1lbnQuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLnVpLm1kYy5DaGFydFwiKSkge1xuXHRcdFx0XHRhQ29udHJvbHMucHVzaChvRWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0YVN1YlNlY3Rpb25UYWJsZXMubGVuZ3RoID09PSAxICYmXG5cdFx0XHRhUGFyZW50RWxlbWVudC5sZW5ndGggPT09IDEgJiZcblx0XHRcdGFTdWJTZWN0aW9uVGFibGVzWzBdLmdyaWRUYWJsZSAmJlxuXHRcdFx0IWFTdWJzZWN0aW9uLmhhc1N0eWxlQ2xhc3MoXCJzYXBVeEFQT2JqZWN0UGFnZVN1YlNlY3Rpb25GaXRDb250YWluZXJcIilcblx0XHQpIHtcblx0XHRcdC8vSW4gY2FzZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRhYmxlIGluIGEgc2VjdGlvbiB3ZSBmaXQgdGhhdCB0byB0aGUgd2hvbGUgcGFnZSBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgY29tZXMgb25seSBvbiB0YWJsZSBhbmQgbm90IG9uIHBhZ2Vcblx0XHRcdGFTdWJzZWN0aW9uLmFkZFN0eWxlQ2xhc3MoXCJzYXBVeEFQT2JqZWN0UGFnZVN1YlNlY3Rpb25GaXRDb250YWluZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldEFsbFN1YlNlY3Rpb25zKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRsZXQgYVN1YlNlY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1NlY3Rpb246IGFueSkge1xuXHRcdFx0YVN1YlNlY3Rpb25zID0gYVN1YlNlY3Rpb25zLmNvbmNhdChvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYVN1YlNlY3Rpb25zO1xuXHR9XG5cblx0X2dldEFsbEJsb2NrcygpIHtcblx0XHRsZXQgYUJsb2NrczogYW55W10gPSBbXTtcblx0XHR0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdGFCbG9ja3MgPSBhQmxvY2tzLmNvbmNhdChvU3ViU2VjdGlvbi5nZXRCbG9ja3MoKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFCbG9ja3M7XG5cdH1cblxuXHRfZmluZFRhYmxlcygpIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGFUYWJsZXM6IGFueVtdID0gW107XG5cdFx0Zm9yIChsZXQgc3ViU2VjdGlvbiA9IDA7IHN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBzdWJTZWN0aW9uKyspIHtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhVGFibGVzKTtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRNb3JlQmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYVRhYmxlcyk7XG5cdFx0fVxuXHRcdHJldHVybiBhVGFibGVzO1xuXHR9XG5cblx0X2ZpbmRDaGFydHMoKSB7XG5cdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKTtcblx0XHRjb25zdCBhQ2hhcnRzOiBhbnlbXSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb24gPSAwOyBzdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgc3ViU2VjdGlvbisrKSB7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0QmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYUNoYXJ0cywgdHJ1ZSk7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFDaGFydHMsIHRydWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNoYXJ0cztcblx0fVxuXG5cdF9jbG9zZVNpZGVDb250ZW50KCkge1xuXHRcdHRoaXMuX2dldEFsbEJsb2NrcygpLmZvckVhY2goZnVuY3Rpb24gKG9CbG9jazogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udGVudCA9IG9CbG9jay5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0Jsb2NrLmdldENvbnRlbnQoKTtcblx0XHRcdGlmIChvQ29udGVudCAmJiBvQ29udGVudC5pc0EgJiYgb0NvbnRlbnQuaXNBKFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0aWYgKG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRlbnQuc2V0U2hvd1NpZGVDb250ZW50KGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYXJ0IENvbnRleHQgaXMgcmVzb2x2ZWQgZm9yIDE6biBtaWNyb2NoYXJ0cy5cblx0ICpcblx0ICogQHBhcmFtIG9DaGFydENvbnRleHQgVGhlIENvbnRleHQgb2YgdGhlIE1pY3JvQ2hhcnRcblx0ICogQHBhcmFtIHNDaGFydFBhdGggVGhlIGNvbGxlY3Rpb25QYXRoIG9mIHRoZSB0aGUgY2hhcnRcblx0ICogQHJldHVybnMgQXJyYXkgb2YgQXR0cmlidXRlcyBvZiB0aGUgY2hhcnQgQ29udGV4dFxuXHQgKi9cblx0X2dldENoYXJ0Q29udGV4dERhdGEob0NoYXJ0Q29udGV4dDogYW55LCBzQ2hhcnRQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ2hhcnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBvQ2hhcnRDb250ZXh0RGF0YSA9IFtvQ29udGV4dERhdGFdO1xuXHRcdGlmIChvQ2hhcnRDb250ZXh0ICYmIHNDaGFydFBhdGgpIHtcblx0XHRcdGlmIChvQ29udGV4dERhdGFbc0NoYXJ0UGF0aF0pIHtcblx0XHRcdFx0b0NoYXJ0Q29udGV4dERhdGEgPSBvQ29udGV4dERhdGFbc0NoYXJ0UGF0aF07XG5cdFx0XHRcdGRlbGV0ZSBvQ29udGV4dERhdGFbc0NoYXJ0UGF0aF07XG5cdFx0XHRcdG9DaGFydENvbnRleHREYXRhLnB1c2gob0NvbnRleHREYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9DaGFydENvbnRleHREYXRhO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNjcm9sbCB0aGUgdGFibGVzIHRvIHRoZSByb3cgd2l0aCB0aGUgc1BhdGhcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyI19zY3JvbGxUYWJsZXNUb1Jvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Jvd1BhdGggJ3NQYXRoIG9mIHRoZSB0YWJsZSByb3cnXG5cdCAqL1xuXG5cdF9zY3JvbGxUYWJsZXNUb1JvdyhzUm93UGF0aDogc3RyaW5nKSB7XG5cdFx0aWYgKHRoaXMuX2ZpbmRUYWJsZXMgJiYgdGhpcy5fZmluZFRhYmxlcygpLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFUYWJsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0VGFibGVTY3JvbGxlci5zY3JvbGxUYWJsZVRvUm93KGFUYWJsZXNbaV0sIHNSb3dQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIG1lcmdlIHNlbGVjdGVkIGNvbnRleHRzIGFuZCBmaWx0ZXJzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX21lcmdlTXVsdGlwbGVDb250ZXh0c1xuXHQgKiBAcGFyYW0gb1BhZ2VDb250ZXh0IFBhZ2UgY29udGV4dFxuXHQgKiBAcGFyYW0gYUxpbmVDb250ZXh0IFNlbGVjdGVkIENvbnRleHRzXG5cdCAqIEBwYXJhbSBzQ2hhcnRQYXRoIENvbGxlY3Rpb24gbmFtZSBvZiB0aGUgY2hhcnRcblx0ICogQHJldHVybnMgU2VsZWN0aW9uIFZhcmlhbnQgT2JqZWN0XG5cdCAqL1xuXHRfbWVyZ2VNdWx0aXBsZUNvbnRleHRzKG9QYWdlQ29udGV4dDogQ29udGV4dCwgYUxpbmVDb250ZXh0OiBhbnlbXSwgc0NoYXJ0UGF0aDogc3RyaW5nKSB7XG5cdFx0bGV0IGFBdHRyaWJ1dGVzOiBhbnlbXSA9IFtdLFxuXHRcdFx0YVBhZ2VBdHRyaWJ1dGVzID0gW10sXG5cdFx0XHRvQ29udGV4dCxcblx0XHRcdHNNZXRhUGF0aExpbmU6IHN0cmluZyxcblx0XHRcdHNQYXRoTGluZTtcblxuXHRcdGNvbnN0IHNQYWdlUGF0aCA9IG9QYWdlQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9QYWdlQ29udGV4dCAmJiBvUGFnZUNvbnRleHQuZ2V0TW9kZWwoKSAmJiBvUGFnZUNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzTWV0YVBhdGhQYWdlID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYWdlUGF0aCkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdC8vIEdldCBzaW5nbGUgbGluZSBjb250ZXh0IGlmIG5lY2Vzc2FyeVxuXHRcdGlmIChhTGluZUNvbnRleHQgJiYgYUxpbmVDb250ZXh0Lmxlbmd0aCkge1xuXHRcdFx0b0NvbnRleHQgPSBhTGluZUNvbnRleHRbMF07XG5cdFx0XHRzUGF0aExpbmUgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRzTWV0YVBhdGhMaW5lID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoTGluZSkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdFx0YUxpbmVDb250ZXh0LmZvckVhY2goKG9TaW5nbGVDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNDaGFydFBhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBvQ2hhcnRDb250ZXh0RGF0YSA9IHRoaXMuX2dldENoYXJ0Q29udGV4dERhdGEob1NpbmdsZUNvbnRleHQsIHNDaGFydFBhdGgpO1xuXHRcdFx0XHRcdGlmIChvQ2hhcnRDb250ZXh0RGF0YSkge1xuXHRcdFx0XHRcdFx0YUF0dHJpYnV0ZXMgPSBvQ2hhcnRDb250ZXh0RGF0YS5tYXAoZnVuY3Rpb24gKG9TdWJDaGFydENvbnRleHREYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YTogb1N1YkNoYXJ0Q29udGV4dERhdGEsXG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBgJHtzTWV0YVBhdGhQYWdlfS8ke3NDaGFydFBhdGh9YFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFBdHRyaWJ1dGVzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29udGV4dERhdGE6IG9TaW5nbGVDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhMaW5lXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhUGFnZUF0dHJpYnV0ZXMucHVzaCh7XG5cdFx0XHRjb250ZXh0RGF0YTogb1BhZ2VDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhQYWdlXG5cdFx0fSk7XG5cdFx0Ly8gQWRkaW5nIFBhZ2UgQ29udGV4dCB0byBzZWxlY3Rpb24gdmFyaWFudFxuXHRcdGFQYWdlQXR0cmlidXRlcyA9IENvbW1vblV0aWxzLnJlbW92ZVNlbnNpdGl2ZURhdGEoYVBhZ2VBdHRyaWJ1dGVzLCBvTWV0YU1vZGVsKTtcblx0XHRjb25zdCBvUGFnZUxldmVsU1YgPSBDb21tb25VdGlscy5hZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudChuZXcgU2VsZWN0aW9uVmFyaWFudCgpLCBhUGFnZUF0dHJpYnV0ZXMsIHRoaXMuZ2V0VmlldygpKTtcblx0XHRhQXR0cmlidXRlcyA9IENvbW1vblV0aWxzLnJlbW92ZVNlbnNpdGl2ZURhdGEoYUF0dHJpYnV0ZXMsIG9NZXRhTW9kZWwpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50OiBvUGFnZUxldmVsU1YsXG5cdFx0XHRhdHRyaWJ1dGVzOiBhQXR0cmlidXRlc1xuXHRcdH07XG5cdH1cblxuXHRfZ2V0QmF0Y2hHcm91cHNGb3JWaWV3KCkge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55LFxuXHRcdFx0b0NvbmZpZ3VyYXRpb25zID0gb1ZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRcdFx0YUNvbmZpZ3VyYXRpb25zID0gb0NvbmZpZ3VyYXRpb25zICYmIE9iamVjdC5rZXlzKG9Db25maWd1cmF0aW9ucyksXG5cdFx0XHRhQmF0Y2hHcm91cHMgPSBbXCIkYXV0by5IZXJvZXNcIiwgXCIkYXV0by5EZWNvcmF0aW9uXCIsIFwiJGF1dG8uV29ya2Vyc1wiXTtcblxuXHRcdGlmIChhQ29uZmlndXJhdGlvbnMgJiYgYUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdGFDb25maWd1cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSBvQ29uZmlndXJhdGlvbnNbc0tleV07XG5cdFx0XHRcdGlmIChvQ29uZmlndXJhdGlvbi5yZXF1ZXN0R3JvdXBJZCA9PT0gXCJMb25nUnVubmVyc1wiKSB7XG5cdFx0XHRcdFx0YUJhdGNoR3JvdXBzLnB1c2goXCIkYXV0by5Mb25nUnVubmVyc1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBhQmF0Y2hHcm91cHM7XG5cdH1cblxuXHQvKlxuXHQgKiBSZXNldCBCcmVhZGNydW1iIGxpbmtzXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge3NhcC5tLkJyZWFkY3J1bWJzfSBbb1NvdXJjZV0gcGFyZW50IGNvbnRyb2xcblx0ICogQGRlc2NyaXB0aW9uIFVzZWQgd2hlbiBjb250ZXh0IG9mIHRoZSBvYmplY3QgcGFnZSBjaGFuZ2VzLlxuXHQgKiAgICAgICAgICAgICAgVGhpcyBldmVudCBjYWxsYmFjayBpcyBhdHRhY2hlZCB0byBtb2RlbENvbnRleHRDaGFuZ2Vcblx0ICogICAgICAgICAgICAgIGV2ZW50IG9mIHRoZSBCcmVhZGNydW1iIGNvbnRyb2wgdG8gY2F0Y2ggY29udGV4dCBjaGFuZ2UuXG5cdCAqICAgICAgICAgICAgICBUaGVuIGVsZW1lbnQgYmluZGluZyBhbmQgaHJlZnMgYXJlIHVwZGF0ZWQgZm9yIGVhY2ggbGluay5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBleHBlcmltZW50YWxcblx0ICovXG5cdGFzeW5jIF9zZXRCcmVhZGNydW1iTGlua3Mob1NvdXJjZTogQnJlYWRDcnVtYnMpIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0YVByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcblx0XHRcdGFTa2lwUGFyYW1ldGVyaXplZDogYW55W10gPSBbXSxcblx0XHRcdHNOZXdQYXRoID0gb0NvbnRleHQ/LmdldFBhdGgoKSxcblx0XHRcdGFQYXRoUGFydHMgPSBzTmV3UGF0aD8uc3BsaXQoXCIvXCIpID8/IFtdLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQgJiYgb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc1BhdGggPSBcIlwiO1xuXHRcdHRyeSB7XG5cdFx0XHRhUGF0aFBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRhUGF0aFBhcnRzLnNwbGljZSgtMSwgMSk7XG5cdFx0XHRhUGF0aFBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHNQYXRoUGFydDogYW55KSB7XG5cdFx0XHRcdHNQYXRoICs9IGAvJHtzUGF0aFBhcnR9YDtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IG9BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRcdGNvbnN0IHNQYXJhbWV0ZXJQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0XHRcdGNvbnN0IGJSZXN1bHRDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhcmFtZXRlclBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dGApO1xuXHRcdFx0XHRpZiAoYlJlc3VsdENvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBXZSBkb250IG5lZWQgdG8gY3JlYXRlIGEgYnJlYWRjcnVtYiBmb3IgUGFyYW1ldGVyIHBhdGhcblx0XHRcdFx0XHRhU2tpcFBhcmFtZXRlcml6ZWQucHVzaCgxKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YVNraXBQYXJhbWV0ZXJpemVkLnB1c2goMCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YVByb21pc2VzLnB1c2gob1Jvb3RWaWV3Q29udHJvbGxlci5nZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aCkpO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCB0aXRsZUhpZXJhcmNoeUluZm9zOiBhbnlbXSA9IGF3YWl0IFByb21pc2UuYWxsKGFQcm9taXNlcyk7XG5cdFx0XHRsZXQgaWR4LCBoaWVyYXJjaHlQb3NpdGlvbiwgb0xpbms7XG5cdFx0XHRmb3IgKGNvbnN0IHRpdGxlSGllcmFyY2h5SW5mbyBvZiB0aXRsZUhpZXJhcmNoeUluZm9zKSB7XG5cdFx0XHRcdGhpZXJhcmNoeVBvc2l0aW9uID0gdGl0bGVIaWVyYXJjaHlJbmZvcy5pbmRleE9mKHRpdGxlSGllcmFyY2h5SW5mbyk7XG5cdFx0XHRcdGlkeCA9IGhpZXJhcmNoeVBvc2l0aW9uIC0gYVNraXBQYXJhbWV0ZXJpemVkW2hpZXJhcmNoeVBvc2l0aW9uXTtcblx0XHRcdFx0b0xpbmsgPSBvU291cmNlLmdldExpbmtzKClbaWR4XSA/IG9Tb3VyY2UuZ2V0TGlua3MoKVtpZHhdIDogbmV3IExpbmsoKTtcblx0XHRcdFx0Ly9zQ3VycmVudEVudGl0eSBpcyBhIGZhbGxiYWNrIHZhbHVlIGluIGNhc2Ugb2YgZW1wdHkgdGl0bGVcblx0XHRcdFx0b0xpbmsuc2V0VGV4dCh0aXRsZUhpZXJhcmNoeUluZm8uc3VidGl0bGUgfHwgdGl0bGVIaWVyYXJjaHlJbmZvLnRpdGxlKTtcblx0XHRcdFx0Ly9XZSBhcHBseSBhbiBhZGRpdGlvbmFsIGVuY29kZVVSSSBpbiBjYXNlIG9mIHNwZWNpYWwgY2hhcmFjdGVycyAoaWUgXCIvXCIpIHVzZWQgaW4gdGhlIHVybCB0aHJvdWdoIHRoZSBzZW1hbnRpYyBrZXlzXG5cdFx0XHRcdG9MaW5rLnNldEhyZWYoZW5jb2RlVVJJKHRpdGxlSGllcmFyY2h5SW5mby5pbnRlbnQpKTtcblx0XHRcdFx0aWYgKCFvU291cmNlLmdldExpbmtzKClbaWR4XSkge1xuXHRcdFx0XHRcdG9Tb3VyY2UuYWRkTGluayhvTGluayk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzZXR0aW5nIHRoZSBicmVhZGNydW1iIGxpbmtzOlwiICsgZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdF9jaGVja0RhdGFQb2ludFRpdGxlRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKCkge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBvRGF0YVBvaW50cyA9IENvbW1vblV0aWxzLmdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbihcblx0XHRcdG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0T3V0Ym91bmRzKClcblx0XHQpO1xuXHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VzID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0Y29uc3Qgb1BhZ2VDb250ZXh0ID0gb1ZpZXcgJiYgKG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaXNIZWFkZXJEUExpbmtWaXNpYmxlXCIsIHt9KTtcblx0XHRpZiAob1BhZ2VDb250ZXh0KSB7XG5cdFx0XHRvUGFnZUNvbnRleHRcblx0XHRcdFx0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGE6IGFueSkge1xuXHRcdFx0XHRcdGZuR2V0TGlua3Mob0RhdGFQb2ludHMsIG9EYXRhKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb0Vycm9yXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZm5PbkVycm9yKG9FcnJvcjogYW55KSB7XG5cdFx0XHRMb2cuZXJyb3Iob0Vycm9yKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmblNldExpbmtFbmFibGVtZW50KGlkOiBzdHJpbmcsIGFTdXBwb3J0ZWRMaW5rczogYW55KSB7XG5cdFx0XHRjb25zdCBzTGlua0lkID0gaWQ7XG5cdFx0XHQvLyBwcm9jZXNzIHZpYWJsZSBsaW5rcyBmcm9tIGdldExpbmtzIGZvciBhbGwgZGF0YXBvaW50cyBoYXZpbmcgb3V0Ym91bmRcblx0XHRcdGlmIChhU3VwcG9ydGVkTGlua3MgJiYgYVN1cHBvcnRlZExpbmtzLmxlbmd0aCA9PT0gMSAmJiBhU3VwcG9ydGVkTGlua3NbMF0uc3VwcG9ydGVkKSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgaXNIZWFkZXJEUExpbmtWaXNpYmxlLyR7c0xpbmtJZH1gLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1N1YkRhdGFQb2ludHNcblx0XHQgKiBAcGFyYW0gb1BhZ2VEYXRhXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZm5HZXRMaW5rcyhvU3ViRGF0YVBvaW50czogYW55LCBvUGFnZURhdGE6IGFueSkge1xuXHRcdFx0Zm9yIChjb25zdCBzSWQgaW4gb1N1YkRhdGFQb2ludHMpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGFQb2ludCA9IG9TdWJEYXRhUG9pbnRzW3NJZF07XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXM6IGFueSA9IHt9O1xuXHRcdFx0XHRjb25zdCBvTGluayA9IG9WaWV3LmJ5SWQoc0lkKTtcblx0XHRcdFx0aWYgKCFvTGluaykge1xuXHRcdFx0XHRcdC8vIGZvciBkYXRhIHBvaW50cyBjb25maWd1cmVkIGluIGFwcCBkZXNjcmlwdG9yIGJ1dCBub3QgYW5ub3RhdGVkIGluIHRoZSBoZWFkZXJcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBvTGlua0NvbnRleHQgPSBvTGluay5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBvTGlua0RhdGE6IGFueSA9IG9MaW5rQ29udGV4dCAmJiBvTGlua0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGxldCBvTWl4ZWRDb250ZXh0OiBhbnkgPSBtZXJnZSh7fSwgb1BhZ2VEYXRhLCBvTGlua0RhdGEpO1xuXHRcdFx0XHQvLyBwcm9jZXNzIHNlbWFudGljIG9iamVjdCBtYXBwaW5nc1xuXHRcdFx0XHRpZiAob0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmc7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIGluIGFTZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9NYXBwaW5nID0gYVNlbWFudGljT2JqZWN0TWFwcGluZ1tpdGVtXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYWluUHJvcGVydHkgPSBvTWFwcGluZ1tcIkxvY2FsUHJvcGVydHlcIl1bXCIkUHJvcGVydHlQYXRoXCJdO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc01hcHBlZFByb3BlcnR5ID0gb01hcHBpbmdbXCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCJdO1xuXHRcdFx0XHRcdFx0aWYgKHNNYWluUHJvcGVydHkgIT09IHNNYXBwZWRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob01peGVkQ29udGV4dC5oYXNPd25Qcm9wZXJ0eShzTWFpblByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdNYXBwaW5nOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRvTmV3TWFwcGluZ1tzTWFwcGVkUHJvcGVydHldID0gb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0XHRvTWl4ZWRDb250ZXh0ID0gbWVyZ2Uoe30sIG9NaXhlZENvbnRleHQsIG9OZXdNYXBwaW5nKTtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzS2V5IGluIG9NaXhlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdGlmIChzS2V5LmluZGV4T2YoXCJfXCIpICE9PSAwICYmIHNLZXkuaW5kZXhPZihcIm9kYXRhLmNvbnRleHRcIikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdG9QYXJhbXNbc0tleV0gPSBvTWl4ZWRDb250ZXh0W3NLZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyB2YWxpZGF0ZSBpZiBhIGxpbmsgbXVzdCBiZSByZW5kZXJlZFxuXHRcdFx0XHRvU2hlbGxTZXJ2aWNlc1xuXHRcdFx0XHRcdC5pc05hdmlnYXRpb25TdXBwb3J0ZWQoW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0XHRhY3Rpb246IG9EYXRhUG9pbnQuYWN0aW9uXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHBhcmFtczogb1BhcmFtc1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0pXG5cdFx0XHRcdFx0LnRoZW4oKGFMaW5rcykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuU2V0TGlua0VuYWJsZW1lbnQoc0lkLCBhTGlua3MpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZuT25FcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aGFuZGxlcnMgPSB7XG5cdFx0LyoqXG5cdFx0ICogSW52b2tlcyB0aGUgcGFnZSBwcmltYXJ5IGFjdGlvbiBvbiBwcmVzcyBvZiBDdHJsK0VudGVyLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBwYWdlIGNvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gb1ZpZXdcblx0XHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyBjYWxsZWRcblx0XHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbiwgZWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgY2FsbGVkXG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5tb2RlbF0gTWFuZGF0b3J5IGZvciBhbiB1bmJvdW5kIGFjdGlvbjsgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWxcblx0XHQgKiBAcGFyYW0gW21Db25kaXRpb25zXSBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvblZpc2libGVdIFRoZSB2aXNpYmlsaXR5IG9mIHNlbWF0aWMgcG9zaXRpdmUgYWN0aW9uXG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvbkVuYWJsZWRdIFRoZSBlbmFibGVtZW50IG9mIHNlbWFudGljIHBvc2l0aXZlIGFjdGlvblxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnMuZWRpdEFjdGlvblZpc2libGVdIFRoZSBFZGl0IGJ1dHRvbiB2aXNpYmlsaXR5XG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5lZGl0QWN0aW9uRW5hYmxlZF0gVGhlIGVuYWJsZW1lbnQgb2YgRWRpdCBidXR0b25cblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvblByaW1hcnlBY3Rpb24oXG5cdFx0XHRvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsXG5cdFx0XHRvVmlldzogVmlldyxcblx0XHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRcdG1QYXJhbWV0ZXJzOiB1bmtub3duLFxuXHRcdFx0bUNvbmRpdGlvbnM6IHtcblx0XHRcdFx0cG9zaXRpdmVBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cdFx0XHRcdGVkaXRBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRlZGl0QWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcblx0XHRcdH1cblx0XHQpIHtcblx0XHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSAob0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS52aWV3TGV2ZWwsXG5cdFx0XHRcdG9PYmplY3RQYWdlID0gb0NvbnRyb2xsZXIuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRpZiAobUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25WaXNpYmxlKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5oYW5kbGVycy5vbkNhbGxBY3Rpb24ob1ZpZXcsIHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobUNvbmRpdGlvbnMuZWRpdEFjdGlvblZpc2libGUpIHtcblx0XHRcdFx0aWYgKG1Db25kaXRpb25zLmVkaXRBY3Rpb25FbmFibGVkKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaVZpZXdMZXZlbCA9PT0gMSAmJiBvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX3NhdmVEb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSkge1xuXHRcdFx0XHRvQ29udHJvbGxlci5fYXBwbHlEb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdG9uVGFibGVDb250ZXh0Q2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1NvdXJjZSA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdGxldCBvVGFibGU6IGFueTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5zb21lKGZ1bmN0aW9uIChfb1RhYmxlOiBhbnkpIHtcblx0XHRcdFx0aWYgKF9vVGFibGUuZ2V0Um93QmluZGluZygpID09PSBvU291cmNlKSB7XG5cdFx0XHRcdFx0b1RhYmxlID0gX29UYWJsZTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3Qgb0N1cnJlbnRBY3Rpb25Qcm9taXNlID0gdGhpcy5lZGl0Rmxvdy5nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uUHJvbWlzZSkge1xuXHRcdFx0XHRsZXQgYVRhYmxlQ29udGV4dHM6IGFueTtcblx0XHRcdFx0aWYgKG9UYWJsZS5nZXRUeXBlKCkuZ2V0TWV0YWRhdGEoKS5pc0EoXCJzYXAudWkubWRjLnRhYmxlLkdyaWRUYWJsZVR5cGVcIikpIHtcblx0XHRcdFx0XHRhVGFibGVDb250ZXh0cyA9IG9Tb3VyY2UuZ2V0Q29udGV4dHMoMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMgPSBvU291cmNlLmdldEN1cnJlbnRDb250ZXh0cygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vaWYgY29udGV4dHMgYXJlIG5vdCBmdWxseSBsb2FkZWQgdGhlIGdldGNvbnRleHRzIGZ1bmN0aW9uIGFib3ZlIHdpbGwgdHJpZ2dlciBhIG5ldyBjaGFuZ2UgZXZlbnQgY2FsbFxuXHRcdFx0XHRpZiAoIWFUYWJsZUNvbnRleHRzWzBdKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uUHJvbWlzZVxuXHRcdFx0XHRcdC50aGVuKChvQWN0aW9uUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKCFvQWN0aW9uUmVzcG9uc2UgfHwgb0FjdGlvblJlc3BvbnNlLmNvbnRyb2xJZCAhPT0gb1RhYmxlLnNJZCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBvQWN0aW9uRGF0YSA9IG9BY3Rpb25SZXNwb25zZS5vRGF0YTtcblx0XHRcdFx0XHRcdGNvbnN0IGFLZXlzID0gb0FjdGlvblJlc3BvbnNlLmtleXM7XG5cdFx0XHRcdFx0XHRsZXQgaU5ld0l0ZW1wID0gLTE7XG5cdFx0XHRcdFx0XHRhVGFibGVDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvVGFibGVDb250ZXh0OiBhbnksIGk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvVGFibGVEYXRhID0gb1RhYmxlQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYkNvbXBhcmUgPSBhS2V5cy5ldmVyeShmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9UYWJsZURhdGFbc0tleV0gPT09IG9BY3Rpb25EYXRhW3NLZXldO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0aWYgKGJDb21wYXJlKSB7XG5cdFx0XHRcdFx0XHRcdFx0aU5ld0l0ZW1wID0gaTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYkNvbXBhcmU7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGlmIChpTmV3SXRlbXAgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFEaWFsb2dzID0gSW5zdGFuY2VNYW5hZ2VyLmdldE9wZW5EaWFsb2dzKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2cgPVxuXHRcdFx0XHRcdFx0XHRcdGFEaWFsb2dzLmxlbmd0aCA+IDAgPyBhRGlhbG9ncy5maW5kKChkaWFsb2cpID0+IGRpYWxvZy5kYXRhKFwiRnVsbFNjcmVlbkRpYWxvZ1wiKSAhPT0gdHJ1ZSkgOiBudWxsO1xuXHRcdFx0XHRcdFx0XHRpZiAob0RpYWxvZykge1xuXHRcdFx0XHRcdFx0XHRcdC8vIGJ5IGRlc2lnbiwgYSBzYXAubS5kaWFsb2cgc2V0IHRoZSBmb2N1cyB0byB0aGUgcHJldmlvdXMgZm9jdXNlZCBlbGVtZW50IHdoZW4gY2xvc2luZy5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBzaG91bGQgd2FpdCBmb3IgdGhlIGRpYWxvZyB0byBiZSBjbG9zZSBiZWZvcmUgdG8gZm9jdXMgYW5vdGhlciBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5hdHRhY2hFdmVudE9uY2UoXCJhZnRlckNsb3NlXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9UYWJsZS5mb2N1c1JvdyhpTmV3SXRlbXAsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG9UYWJsZS5mb2N1c1JvdyhpTmV3SXRlbXAsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoaXMuZWRpdEZsb3cuZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgQW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNjcm9sbGluZyB0byB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtOiAke2Vycn1gKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdC8vIGZpcmUgTW9kZWxDb250ZXh0Q2hhbmdlIG9uIHRoZSBtZXNzYWdlIGJ1dHRvbiB3aGVuZXZlciB0aGUgdGFibGUgY29udGV4dCBjaGFuZ2VzXG5cdFx0XHR0aGlzLm1lc3NhZ2VCdXR0b24uZmlyZU1vZGVsQ29udGV4dENoYW5nZSgpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBJbnZva2VzIGFuIGFjdGlvbiAtIGJvdW5kL3VuYm91bmQgYW5kIHNldHMgdGhlIHBhZ2UgZGlydHkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gb1ZpZXdcblx0XHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbiwgZWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgY2FsbGVkXG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5tb2RlbF0gTWFuZGF0b3J5IGZvciBhbiB1bmJvdW5kIGFjdGlvbjsgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWxcblx0XHQgKiBAcmV0dXJucyBUaGUgYWN0aW9uIHByb21pc2Vcblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvbkNhbGxBY3Rpb24ob1ZpZXc6IGFueSwgc0FjdGlvbk5hbWU6IHN0cmluZywgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0Lmludm9rZUFjdGlvbihzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdC50aGVuKG9Db250cm9sbGVyLl9zaG93TWVzc2FnZVBvcG92ZXIuYmluZChvQ29udHJvbGxlciwgdW5kZWZpbmVkKSlcblx0XHRcdFx0LmNhdGNoKG9Db250cm9sbGVyLl9zaG93TWVzc2FnZVBvcG92ZXIuYmluZChvQ29udHJvbGxlcikpO1xuXHRcdH0sXG5cdFx0b25EYXRhUG9pbnRUaXRsZVByZXNzZWQob0NvbnRyb2xsZXI6IGFueSwgb1NvdXJjZTogYW55LCBvTWFuaWZlc3RPdXRib3VuZDogYW55LCBzQ29udHJvbENvbmZpZzogYW55LCBzQ29sbGVjdGlvblBhdGg6IGFueSkge1xuXHRcdFx0b01hbmlmZXN0T3V0Ym91bmQgPSB0eXBlb2Ygb01hbmlmZXN0T3V0Ym91bmQgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKG9NYW5pZmVzdE91dGJvdW5kKSA6IG9NYW5pZmVzdE91dGJvdW5kO1xuXHRcdFx0Y29uc3Qgb1RhcmdldEluZm8gPSBvTWFuaWZlc3RPdXRib3VuZFtzQ29udHJvbENvbmZpZ10sXG5cdFx0XHRcdGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob1RhcmdldEluZm8pLFxuXHRcdFx0XHRvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0XG5cdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YVBhdGgob0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0bGV0IGFOYXZpZ2F0aW9uRGF0YSA9IG9Db250cm9sbGVyLl9nZXRDaGFydENvbnRleHREYXRhKG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQsIHNDb2xsZWN0aW9uUGF0aCk7XG5cdFx0XHRsZXQgYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzO1xuXG5cdFx0XHRhTmF2aWdhdGlvbkRhdGEgPSBhTmF2aWdhdGlvbkRhdGEubWFwKGZ1bmN0aW9uIChvTmF2aWdhdGlvbkRhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGRhdGE6IG9OYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRtZXRhUGF0aDogc01ldGFQYXRoICsgKHNDb2xsZWN0aW9uUGF0aCA/IGAvJHtzQ29sbGVjdGlvblBhdGh9YCA6IFwiXCIpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHRcdGlmIChvVGFyZ2V0SW5mbyAmJiBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzICYmIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24uZ2V0T3V0Ym91bmRQYXJhbXMob1RhcmdldEluZm8ucGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvUGFyYW1zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1BhcmFtcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9UYXJnZXRJbmZvICYmIG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0ICYmIG9UYXJnZXRJbmZvLmFjdGlvbikge1xuXHRcdFx0XHRvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0LCBvVGFyZ2V0SW5mby5hY3Rpb24sIHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IGFOYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGFTZW1hbnRpY09iamVjdE1hcHBpbmcsXG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSB0YXJnZXQgYXBwXG5cdFx0ICogQHBhcmFtIHNDcmVhdGVQYXRoIENyZWF0ZSBwYXRoIHdoZW4gdGhlIGNoZXZyb24gaXMgY3JlYXRlZC5cblx0XHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkICg/Pz8gbWF5YmUgb25seSBvbmNlIGZpbmlzaGVkPylcblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQ6IHN0cmluZywgb0NvbnRleHQ6IGFueSwgc0NyZWF0ZVBhdGg6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQsIG9Db250ZXh0LCBzQ3JlYXRlUGF0aCk7XG5cdFx0fSxcblxuXHRcdG9uTmF2aWdhdGVDaGFuZ2UodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHQvL3dpbGwgYmUgY2FsbGVkIGFsd2F5cyB3aGVuIHdlIGNsaWNrIG9uIGEgc2VjdGlvbiB0YWJcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdHRoaXMuYlNlY3Rpb25OYXZpZ2F0ZWQgPSB0cnVlO1xuXG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgJiZcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5zZWN0aW9uTGF5b3V0ID09PSBcIlRhYnNcIiAmJlxuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiKSA9PT0gZmFsc2Vcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWJTZWN0aW9uXCIpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVGb2N1c0luRWRpdE1vZGUoW29TdWJTZWN0aW9uXSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTZWxlY3RlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTYXZlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHQvL1RPRE86IFNob3VsZCByZW1vdmUgdGhpcyBzZXRUaW1lT3V0IG9uY2UgVmFyaWFudCBNYW5hZ2VtZW50IHByb3ZpZGVzIGFuIGFwaSB0byBmZXRjaCB0aGUgY3VycmVudCB2YXJpYW50IGtleSBvbiBzYXZlXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fSwgMjAwMCk7XG5cdFx0fSxcblx0XHRuYXZpZ2F0ZVRvU3ViU2VjdGlvbjogZnVuY3Rpb24gKG9Db250cm9sbGVyOiBPYmplY3RQYWdlQ29udHJvbGxlciwgdkRldGFpbENvbmZpZzogYW55KSB7XG5cdFx0XHRjb25zdCBvRGV0YWlsQ29uZmlnID0gdHlwZW9mIHZEZXRhaWxDb25maWcgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKHZEZXRhaWxDb25maWcpIDogdkRldGFpbENvbmZpZztcblx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBPYmplY3RQYWdlTGF5b3V0O1xuXHRcdFx0bGV0IG9TZWN0aW9uO1xuXHRcdFx0bGV0IG9TdWJTZWN0aW9uO1xuXHRcdFx0aWYgKG9EZXRhaWxDb25maWcuc2VjdGlvbklkKSB7XG5cdFx0XHRcdG9TZWN0aW9uID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmJ5SWQob0RldGFpbENvbmZpZy5zZWN0aW9uSWQpIGFzIE9iamVjdFBhZ2VTZWN0aW9uO1xuXHRcdFx0XHRvU3ViU2VjdGlvbiA9IChcblx0XHRcdFx0XHRvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZFxuXHRcdFx0XHRcdFx0PyBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZClcblx0XHRcdFx0XHRcdDogb1NlY3Rpb24gJiYgb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKSAmJiBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpWzBdXG5cdFx0XHRcdCkgYXMgT2JqZWN0UGFnZVN1YlNlY3Rpb247XG5cdFx0XHR9IGVsc2UgaWYgKG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkKSB7XG5cdFx0XHRcdG9TdWJTZWN0aW9uID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmJ5SWQob0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWQpIGFzIE9iamVjdFBhZ2VTdWJTZWN0aW9uO1xuXHRcdFx0XHRvU2VjdGlvbiA9IG9TdWJTZWN0aW9uICYmIChvU3ViU2VjdGlvbi5nZXRQYXJlbnQoKSBhcyBPYmplY3RQYWdlU2VjdGlvbik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIW9TZWN0aW9uIHx8ICFvU3ViU2VjdGlvbiB8fCAhb1NlY3Rpb24uZ2V0VmlzaWJsZSgpIHx8ICFvU3ViU2VjdGlvbi5nZXRWaXNpYmxlKCkpIHtcblx0XHRcdFx0Y29uc3Qgc1RpdGxlID0gZ2V0UmVzb3VyY2VNb2RlbChvQ29udHJvbGxlcikuZ2V0VGV4dChcblx0XHRcdFx0XHRcIkNfUk9VVElOR19OQVZJR0FUSU9OX0RJU0FCTEVEX1RJVExFXCIsXG5cdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVudGl0eVNldFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRMb2cuZXJyb3Ioc1RpdGxlKTtcblx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzVGl0bGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2Nyb2xsVG9TZWN0aW9uKG9TdWJTZWN0aW9uLmdldElkKCkpO1xuXHRcdFx0XHQvLyB0cmlnZ2VyIGlhcHAgc3RhdGUgY2hhbmdlXG5cdFx0XHRcdG9PYmplY3RQYWdlLmZpcmVOYXZpZ2F0ZSh7XG5cdFx0XHRcdFx0c2VjdGlvbjogb1NlY3Rpb24sXG5cdFx0XHRcdFx0c3ViU2VjdGlvbjogb1N1YlNlY3Rpb25cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdG9uU3RhdGVDaGFuZ2UodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpIHtcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9LFxuXHRcdGNsb3NlT1BNZXNzYWdlU3RyaXA6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS5oaWRlTWVzc2FnZSgpO1xuXHRc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
1423
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQcm9ncmFtbWluZ01vZGVsIiwiRkVMaWJyYXJ5IiwiT2JqZWN0UGFnZUNvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiUGxhY2Vob2xkZXIiLCJTaGFyZSIsIm92ZXJyaWRlIiwiU2hhcmVPdmVycmlkZXMiLCJJbnRlcm5hbFJvdXRpbmciLCJJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSIsIlBhZ2luYXRvciIsIlBhZ2luYXRvck92ZXJyaWRlIiwiTWVzc2FnZUhhbmRsZXIiLCJNZXNzYWdlSGFuZGxlck92ZXJyaWRlIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUiLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb25Nb2RlIiwiYklzU3RpY2t5RWRpdE1vZGUiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFN0aWNreUVkaXRNb2RlIiwidW5kZWZpbmVkIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiUGFnZVJlYWR5IiwiaXNDb250ZXh0RXhwZWN0ZWQiLCJNYXNzRWRpdCIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJoYW5kbGVycyIsIm9uUHJpbWFyeUFjdGlvbiIsIm9Db250cm9sbGVyIiwib1ZpZXciLCJvQ29udGV4dCIsInNBY3Rpb25OYW1lIiwibVBhcmFtZXRlcnMiLCJtQ29uZGl0aW9ucyIsImlWaWV3TGV2ZWwiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsIm9PYmplY3RQYWdlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwicG9zaXRpdmVBY3Rpb25WaXNpYmxlIiwicG9zaXRpdmVBY3Rpb25FbmFibGVkIiwib25DYWxsQWN0aW9uIiwiZWRpdEFjdGlvblZpc2libGUiLCJlZGl0QWN0aW9uRW5hYmxlZCIsIl9lZGl0RG9jdW1lbnQiLCJnZXRNb2RlbCIsImdldFByb3BlcnR5IiwiX3NhdmVEb2N1bWVudCIsIl9hcHBseURvY3VtZW50Iiwib25UYWJsZUNvbnRleHRDaGFuZ2UiLCJvRXZlbnQiLCJvU291cmNlIiwiZ2V0U291cmNlIiwib1RhYmxlIiwiX2ZpbmRUYWJsZXMiLCJzb21lIiwiX29UYWJsZSIsImdldFJvd0JpbmRpbmciLCJmYXN0Q3JlYXRpb25Sb3ciLCJnZXRDcmVhdGlvblJvdyIsIl9vSW5uZXJDcmVhdGlvblJvdyIsImdldEJpbmRpbmdDb250ZXh0IiwidGFibGVCaW5kaW5nIiwiX2dldFRhYmxlQmluZGluZyIsIkxvZyIsImVycm9yIiwiZ2V0SWQiLCJnZXRDb250ZXh0Iiwib2JqZWN0UGFnZSIsImJpbmRpbmdDb250ZXh0IiwibW9kZWwiLCJUYWJsZUhlbHBlciIsImVuYWJsZUZhc3RDcmVhdGlvblJvdyIsImdldFBhdGgiLCJvQ3VycmVudEFjdGlvblByb21pc2UiLCJlZGl0RmxvdyIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiYVRhYmxlQ29udGV4dHMiLCJnZXRUeXBlIiwiZ2V0TWV0YWRhdGEiLCJpc0EiLCJnZXRDb250ZXh0cyIsImdldEN1cnJlbnRDb250ZXh0cyIsInRoZW4iLCJvQWN0aW9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJzSWQiLCJvQWN0aW9uRGF0YSIsIm9EYXRhIiwiYUtleXMiLCJrZXlzIiwiaU5ld0l0ZW1wIiwiZmluZCIsIm9UYWJsZUNvbnRleHQiLCJpIiwib1RhYmxlRGF0YSIsImdldE9iamVjdCIsImJDb21wYXJlIiwiZXZlcnkiLCJzS2V5IiwiYURpYWxvZ3MiLCJJbnN0YW5jZU1hbmFnZXIiLCJnZXRPcGVuRGlhbG9ncyIsIm9EaWFsb2ciLCJsZW5ndGgiLCJkaWFsb2ciLCJkYXRhIiwiYXR0YWNoRXZlbnRPbmNlIiwiZm9jdXNSb3ciLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImNhdGNoIiwiZXJyIiwibWVzc2FnZUJ1dHRvbiIsImZpcmVNb2RlbENvbnRleHRDaGFuZ2UiLCJpbnZva2VBY3Rpb24iLCJfc2hvd01lc3NhZ2VQb3BvdmVyIiwiYmluZCIsIm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29udHJvbENvbmZpZyIsInNDb2xsZWN0aW9uUGF0aCIsIkpTT04iLCJwYXJzZSIsIm9UYXJnZXRJbmZvIiwiYVNlbWFudGljT2JqZWN0TWFwcGluZyIsIkNvbW1vblV0aWxzIiwiZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nIiwib0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCIsInNNZXRhUGF0aCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiYU5hdmlnYXRpb25EYXRhIiwiX2dldENoYXJ0Q29udGV4dERhdGEiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJtYXAiLCJvTmF2aWdhdGlvbkRhdGEiLCJtZXRhUGF0aCIsInBhcmFtZXRlcnMiLCJvUGFyYW1zIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE91dGJvdW5kUGFyYW1zIiwiT2JqZWN0Iiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJuYXZpZ2F0ZSIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInNPdXRib3VuZFRhcmdldCIsInNDcmVhdGVQYXRoIiwib25OYXZpZ2F0ZUNoYW5nZSIsImdldEV4dGVuc2lvbkFQSSIsInVwZGF0ZUFwcFN0YXRlIiwiYlNlY3Rpb25OYXZpZ2F0ZWQiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJzZWN0aW9uTGF5b3V0Iiwib1N1YlNlY3Rpb24iLCJnZXRQYXJhbWV0ZXIiLCJfdXBkYXRlRm9jdXNJbkVkaXRNb2RlIiwib25WYXJpYW50U2VsZWN0ZWQiLCJvblZhcmlhbnRTYXZlZCIsInNldFRpbWVvdXQiLCJuYXZpZ2F0ZVRvU3ViU2VjdGlvbiIsInZEZXRhaWxDb25maWciLCJvRGV0YWlsQ29uZmlnIiwiYnlJZCIsIm9TZWN0aW9uIiwic2VjdGlvbklkIiwic3ViU2VjdGlvbklkIiwiZ2V0U3ViU2VjdGlvbnMiLCJnZXRQYXJlbnQiLCJnZXRWaXNpYmxlIiwic1RpdGxlIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImdldFRleHQiLCJlbnRpdHlTZXQiLCJNZXNzYWdlQm94Iiwic2Nyb2xsVG9TZWN0aW9uIiwiZmlyZU5hdmlnYXRlIiwic2VjdGlvbiIsInN1YlNlY3Rpb24iLCJvblN0YXRlQ2hhbmdlIiwiY2xvc2VPUE1lc3NhZ2VTdHJpcCIsImhpZGVNZXNzYWdlIiwibUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzIiwiRXh0ZW5zaW9uQVBJIiwiZXh0ZW5zaW9uQVBJIiwib25Jbml0Iiwic2V0UHJvcGVydHkiLCJwYWdlIiwidmlzaWJpbGl0eSIsIml0ZW1zIiwiX2dldEJhdGNoR3JvdXBzRm9yVmlldyIsImdldEVuYWJsZUxhenlMb2FkaW5nIiwiYXR0YWNoRXZlbnQiLCJfaGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydCIsIm9JdGVtQmluZGluZyIsImF0dGFjaENoYW5nZSIsIl9mblNob3dPUE1lc3NhZ2UiLCJvbkV4aXQiLCJkZXN0cm95Iiwib01lc3NhZ2VQb3BvdmVyIiwiaXNPcGVuIiwiY2xvc2UiLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsImlzQ29ubmVjdGVkIiwiZGlzY29ubmVjdCIsInZpZXciLCJpbnRlcm5hbENvbnRleHQiLCJzdHJpcFZpc2libGUiLCJtZXNzYWdlcyIsImdldEl0ZW1zIiwiaXRlbSIsImZpbHRlciIsIm1lc3NhZ2UiLCJnZXRUYXJnZXRzIiwic2hvd01lc3NhZ2VzIiwiY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZSIsInN1YlNlY3Rpb25zIiwiY2hhbmdlQ2xhc3NGb3JUYWJsZXMiLCJldmVudCIsImxhc3RWaXNpYmxlU3ViU2VjdGlvbiIsImJsb2NrcyIsImdldEJsb2NrcyIsImdldE1vcmVCbG9ja3MiLCJ0YWJsZVR5cGUiLCJzZWFyY2hUYWJsZUluQmxvY2siLCJhZGRTdHlsZUNsYXNzIiwiZGV0YWNoRXZlbnQiLCJzdWJTZWN0aW9uSW5kZXgiLCJibG9jayIsImNvbnRyb2wiLCJjb250ZW50IiwidGFibGVBUEkiLCJvbkJlZm9yZVJlbmRlcmluZyIsIlBhZ2VDb250cm9sbGVyIiwicHJvdG90eXBlIiwiYXBwbHkiLCJvVmlld0RhdGEiLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiQ29tbW9uSGVscGVyIiwic2V0TWV0YU1vZGVsIiwiZ2V0QXBwQ29tcG9uZW50Iiwib25BZnRlclJlbmRlcmluZyIsImdldFVzZUljb25UYWJCYXIiLCJzZWN0aW9ucyIsImdldFNlY3Rpb25zIiwiX2dldEFsbFN1YlNlY3Rpb25zIiwiX29uQmVmb3JlQmluZGluZyIsImFUYWJsZXMiLCJvSW50ZXJuYWxNb2RlbCIsImFCYXRjaEdyb3VwcyIsIm9GYXN0Q3JlYXRpb25Sb3ciLCJwdXNoIiwiYkRyYWZ0TmF2aWdhdGlvbiIsIl9jbG9zZVNpZGVDb250ZW50Iiwib3BDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwic2V0QmluZGluZ0NvbnRleHQiLCJmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24iLCJpc0ZpcnN0UmVuZGVyaW5nIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNldFNlbGVjdGVkU2VjdGlvbiIsIm9EZWxlZ2F0ZU9uQmVmb3JlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsInBhZ2VSZWFkeSIsInJlbW92ZUV2ZW50RGVsZWdhdGUiLCJvQmluZGluZyIsImxpc3RCaW5kaW5nIiwib1BhZ2luYXRvckN1cnJlbnRDb250ZXh0Iiwib0JpbmRpbmdUb1VzZSIsInBhZ2luYXRvciIsImluaXRpYWxpemUiLCJzQmluZGluZ1BhdGgiLCJ0ZXN0Iiwic0xpc3RCaW5kaW5nUGF0aCIsInJlcGxhY2UiLCJPRGF0YUxpc3RCaW5kaW5nIiwib01vZGVsIiwiX3NldExpc3RCaW5kaW5nQXN5bmMiLCJhU2VjdGlvbnMiLCJiVXNlSWNvblRhYkJhciIsImlTa2lwIiwiYklzSW5FZGl0TW9kZSIsImJFZGl0YWJsZUhlYWRlciIsImVkaXRhYmxlSGVhZGVyQ29udGVudCIsImlTZWN0aW9uIiwiYVN1YlNlY3Rpb25zIiwiaVN1YlNlY3Rpb24iLCJpc1Zpc2liaWxpdHlEeW5hbWljIiwicGxhY2Vob2xkZXIiLCJpc1BsYWNlaG9sZGVyRW5hYmxlZCIsInNob3dQbGFjZWhvbGRlciIsIm9OYXZDb250YWluZXIiLCJvQ29udGFpbmVyIiwiX2dldEZpcnN0Q2xpY2thYmxlRWxlbWVudCIsIm9GaXJzdENsaWNrYWJsZUVsZW1lbnQiLCJhQWN0aW9ucyIsImdldEhlYWRlclRpdGxlIiwiZ2V0QWN0aW9ucyIsIm9BY3Rpb24iLCJnZXRFbmFibGVkIiwiX2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uIiwiYUJsb2NrcyIsImFGb3JtQ29udGFpbmVycyIsImdldEZvcm1Db250YWluZXJzIiwiZ2V0Q29udGVudCIsImZvcm1Db250YWluZXIiLCJhRm9ybUVsZW1lbnRzIiwiZ2V0Rm9ybUVsZW1lbnRzIiwiZm9ybUVsZW1lbnQiLCJhRmllbGRzIiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZSIsImRlYnVnIiwib01hbmRhdG9yeUZpZWxkIiwib0ZpZWxkVG9Gb2N1cyIsImdldENvbnRlbnRFZGl0IiwiX2dldEZpcnN0RWRpdGFibGVJbnB1dCIsImZvY3VzIiwiX29uQmFja05hdmlnYXRpb25JbkRyYWZ0IiwibWVzc2FnZUhhbmRsZXIiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJnZXRSb3V0ZXJQcm94eSIsImNoZWNrSWZCYWNrSGFzU2FtZUNvbnRleHQiLCJoaXN0b3J5IiwiYmFjayIsImRyYWZ0IiwicHJvY2Vzc0RhdGFMb3NzT3JEcmFmdERpc2NhcmRDb25maXJtYXRpb24iLCJGdW5jdGlvbiIsIk5hdmlnYXRpb25UeXBlIiwiQmFja05hdmlnYXRpb24iLCJfb25BZnRlckJpbmRpbmciLCJpbnB1dEJpbmRpbmdDb250ZXh0IiwiX3NpZGVFZmZlY3RzIiwiY2xlYXJGaWVsZEdyb3Vwc1ZhbGlkaXR5IiwiYUlCTkFjdGlvbnMiLCJmb3JFYWNoIiwiZ2V0SUJOQWN0aW9ucyIsIm9UYWJsZVJvd0JpbmRpbmciLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsInJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInBhcnNlQ3VzdG9tRGF0YSIsIkRlbGVnYXRlVXRpbCIsImdldEN1c3RvbURhdGEiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsImNsZWFyU2VsZWN0aW9uIiwiZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCIsIm9PYmplY3RQYWdlVGl0bGUiLCJhSUJOSGVhZGVyQWN0aW9ucyIsImNvbmNhdCIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5Iiwib0ZpbmFsVUlTdGF0ZSIsImhhbmRsZVRhYmxlTW9kaWZpY2F0aW9ucyIsImZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyIsImZuSGFuZGxlQ2hhbmdlIiwiZGV0YWNoQ2hhbmdlIiwiY29tcHV0ZUVkaXRNb2RlIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJjb25uZWN0Iiwib0Vycm9yIiwiX3VwZGF0ZVJlbGF0ZWRBcHBzIiwiY3VycmVudEJpbmRpbmciLCJoYW5kbGVQYXRjaFNlbnQiLCJUYWJsZVV0aWxzIiwid2hlbkJvdW5kIiwiX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMiLCJ1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQiLCJkaXNwbGF5Q29sbGFib3JhdGlvbk1lc3NhZ2UiLCJyZWRpcmVjdGVkVG9Ob25EcmFmdCIsImVudGl0eU5hbWUiLCJpbnRlcm5hbEJpbmRpbmdDb250ZXh0IiwicmVzb3VyY2VCdW5kbGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiTWVzc2FnZSIsInR5cGUiLCJtZXNzYWdlVG9Db21wYXJlIiwibGVuZ3RoVW50aWxWYXJpYWJsZSIsInNlYXJjaCIsInN1YnN0cmluZyIsIm9uUGFnZVJlYWR5Iiwic2V0Rm9jdXMiLCJpc0luRGlzcGxheU1vZGUiLCJvU2VsZWN0ZWRTZWN0aW9uIiwiZ2V0U2VsZWN0ZWRTZWN0aW9uIiwib0JpbmRpbmdDb250ZXh0IiwiYklzU3RpY2t5TW9kZSIsIm9BcHBDb21wb25lbnQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJ2aWV3SWQiLCJnZXRBcHBTdGF0ZUhhbmRsZXIiLCJhcHBseUFwcFN0YXRlIiwiZm9yY2VGb2N1cyIsIkVycm9yIiwiX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJvT2JqZWN0UGFnZVN1YnRpdGxlIiwib0N1c3RvbURhdGEiLCJnZXRLZXkiLCJ0aXRsZSIsInN1YnRpdGxlIiwiaW50ZW50IiwiaWNvbiIsIl9leGVjdXRlSGVhZGVyU2hvcnRjdXQiLCJzQnV0dG9uSWQiLCJvQnV0dG9uIiwib0VsZW1lbnQiLCJmaXJlQnV0dG9uUHJlc3MiLCJfZXhlY3V0ZUZvb3RlclNob3J0Y3V0IiwiZ2V0Rm9vdGVyIiwiZ2V0TmFtZSIsIl9leGVjdXRlVGFiU2hvcnRDdXQiLCJvRXhlY3V0aW9uIiwiaVNlY3Rpb25JbmRleE1heCIsInNDb21tYW5kIiwiZ2V0Q29tbWFuZCIsIm5ld1NlY3Rpb24iLCJpU2VsZWN0ZWRTZWN0aW9uSW5kZXgiLCJpbmRleE9mU2VjdGlvbiIsIl9nZXRGb290ZXJWaXNpYmlsaXR5Iiwic1ZpZXdJZCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsIm9NZXNzYWdlIiwidmFsaWRhdGlvbiIsInRhcmdldCIsImluZGV4T2YiLCJvUmV0Iiwicm9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiY3VycmVudFBhZ2VWaWV3IiwiaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0VmlldyIsImdldFJvb3RDb250YWluZXIiLCJnZXRDdXJyZW50UGFnZSIsIm9NZXNzYWdlQnV0dG9uIiwiZ2V0TGVuZ3RoIiwic2V0VmlzaWJsZSIsIm9wZW5CeSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZWRpdERvY3VtZW50IiwiZmluYWxseSIsInVubG9jayIsIl92YWxpZGF0ZURvY3VtZW50IiwiYXBwQ29tcG9uZW50IiwiZ2V0Q3VycmVudEZvY3VzZWRDb250cm9sSWQiLCJjb250ZXh0IiwiaXNUcmFuc2llbnQiLCJzaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJlbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwiZ2xvYmFsU2lkZUVmZmVjdHMiLCJnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwic3luY1Rhc2siLCJQcm9taXNlIiwiYWxsIiwic2lkZUVmZmVjdHMiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJkcmFmdFJvb3RDb250ZXh0IiwiY3JlYXRlUm9vdENvbnRleHQiLCJEcmFmdCIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJhV2FpdENyZWF0ZURvY3VtZW50cyIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiY3JlYXRpb25Nb2RlIiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVBdEVuZCIsImJDcmVhdGVEb2N1bWVudCIsImJTa2lwU2lkZUVmZmVjdHMiLCJjcmVhdGVEb2N1bWVudCIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwic2F2ZURvY3VtZW50IiwiaXNMb2NrZWQiLCJfbWFuYWdlQ29sbGFib3JhdGlvbiIsIm9wZW5NYW5hZ2VEaWFsb2ciLCJfc2hvd0NvbGxhYm9yYXRpb25Vc2VyRGV0YWlscyIsInNob3dVc2VyRGV0YWlscyIsIl9jYW5jZWxEb2N1bWVudCIsImNhbmNlbEJ1dHRvbiIsImNhbmNlbERvY3VtZW50IiwiYXBwbHlEb2N1bWVudCIsInNob3dSZWxhdGVkQXBwcyIsInVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsIl9maW5kQ29udHJvbEluU3ViU2VjdGlvbiIsImFQYXJlbnRFbGVtZW50IiwiYVN1YnNlY3Rpb24iLCJhQ29udHJvbHMiLCJiSXNDaGFydCIsImVsZW1lbnQiLCJtQWdncmVnYXRpb25zIiwiZ2V0QWdncmVnYXRpb24iLCJhSXRlbXMiLCJvSXRlbSIsImdldE1haW5Db250ZW50IiwiX2dldEFsbEJsb2NrcyIsIl9maW5kQ2hhcnRzIiwiYUNoYXJ0cyIsIm9CbG9jayIsIm9Db250ZW50Iiwic2V0U2hvd1NpZGVDb250ZW50Iiwib0NoYXJ0Q29udGV4dCIsInNDaGFydFBhdGgiLCJvQ29udGV4dERhdGEiLCJvQ2hhcnRDb250ZXh0RGF0YSIsIl9zY3JvbGxUYWJsZXNUb1JvdyIsInNSb3dQYXRoIiwiVGFibGVTY3JvbGxlciIsInNjcm9sbFRhYmxlVG9Sb3ciLCJfbWVyZ2VNdWx0aXBsZUNvbnRleHRzIiwib1BhZ2VDb250ZXh0IiwiYUxpbmVDb250ZXh0IiwiYUF0dHJpYnV0ZXMiLCJhUGFnZUF0dHJpYnV0ZXMiLCJzTWV0YVBhdGhMaW5lIiwic1BhdGhMaW5lIiwic1BhZ2VQYXRoIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aFBhZ2UiLCJvU2luZ2xlQ29udGV4dCIsIm9TdWJDaGFydENvbnRleHREYXRhIiwiY29udGV4dERhdGEiLCJyZW1vdmVTZW5zaXRpdmVEYXRhIiwib1BhZ2VMZXZlbFNWIiwiYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3Rpb25WYXJpYW50Iiwic2VsZWN0aW9uVmFyaWFudCIsImF0dHJpYnV0ZXMiLCJvQ29uZmlndXJhdGlvbnMiLCJjb250cm9sQ29uZmlndXJhdGlvbiIsImFDb25maWd1cmF0aW9ucyIsIm9Db25maWd1cmF0aW9uIiwicmVxdWVzdEdyb3VwSWQiLCJfc2V0QnJlYWRjcnVtYkxpbmtzIiwiYVByb21pc2VzIiwiYVNraXBQYXJhbWV0ZXJpemVkIiwic05ld1BhdGgiLCJhUGF0aFBhcnRzIiwic3BsaXQiLCJzUGF0aCIsInNoaWZ0Iiwic3BsaWNlIiwic1BhdGhQYXJ0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsInNQYXJhbWV0ZXJQYXRoIiwiYlJlc3VsdENvbnRleHQiLCJnZXRUaXRsZUluZm9Gcm9tUGF0aCIsInRpdGxlSGllcmFyY2h5SW5mb3MiLCJpZHgiLCJoaWVyYXJjaHlQb3NpdGlvbiIsIm9MaW5rIiwidGl0bGVIaWVyYXJjaHlJbmZvIiwiZ2V0TGlua3MiLCJMaW5rIiwic2V0VGV4dCIsInNldEhyZWYiLCJlbmNvZGVVUkkiLCJhZGRMaW5rIiwib0RhdGFQb2ludHMiLCJnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJnZXRSb3V0aW5nU2VydmljZSIsImdldE91dGJvdW5kcyIsIm9TaGVsbFNlcnZpY2VzIiwicmVxdWVzdE9iamVjdCIsImZuR2V0TGlua3MiLCJmbk9uRXJyb3IiLCJmblNldExpbmtFbmFibGVtZW50IiwiaWQiLCJhU3VwcG9ydGVkTGlua3MiLCJzTGlua0lkIiwic3VwcG9ydGVkIiwib1N1YkRhdGFQb2ludHMiLCJvUGFnZURhdGEiLCJvRGF0YVBvaW50Iiwib0xpbmtDb250ZXh0Iiwib0xpbmtEYXRhIiwib01peGVkQ29udGV4dCIsIm1lcmdlIiwib01hcHBpbmciLCJzTWFpblByb3BlcnR5Iiwic01hcHBlZFByb3BlcnR5IiwiaGFzT3duUHJvcGVydHkiLCJvTmV3TWFwcGluZyIsImlzTmF2aWdhdGlvblN1cHBvcnRlZCIsInBhcmFtcyIsImFMaW5rcyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBjb25uZWN0LCBkaXNjb25uZWN0LCBpc0Nvbm5lY3RlZCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgb3Blbk1hbmFnZURpYWxvZywgc2hvd1VzZXJEZXRhaWxzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vTWFuYWdlXCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmcgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IE1hc3NFZGl0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NYXNzRWRpdFwiO1xuaW1wb3J0IE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IFBhZ2VSZWFkeSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnZVJlYWR5XCI7XG5pbXBvcnQgUGFnaW5hdG9yIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QYWdpbmF0b3JcIjtcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGxhY2Vob2xkZXJcIjtcbmltcG9ydCBTaGFyZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1ZpZXdTdGF0ZVwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24sIHVzaW5nRXh0ZW5zaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDb21tb25IZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvQ29tbW9uSGVscGVyXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCJzYXAvZmUvbWFjcm9zL0RlbGVnYXRlVXRpbFwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBUYWJsZUhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUhlbHBlclwiO1xuaW1wb3J0IFRhYmxlVXRpbHMgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVXRpbHNcIjtcbmltcG9ydCBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgdHlwZSBTdWJTZWN0aW9uQmxvY2sgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9jb250cm9scy9TdWJTZWN0aW9uQmxvY2tcIjtcbmltcG9ydCB0eXBlIHsgZGVmYXVsdCBhcyBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJIH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgRXh0ZW5zaW9uQVBJIH0gZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvT2JqZWN0UGFnZS9FeHRlbnNpb25BUElcIjtcbmltcG9ydCBUYWJsZVNjcm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1RhYmxlU2Nyb2xsZXJcIjtcbmltcG9ydCBJbnN0YW5jZU1hbmFnZXIgZnJvbSBcInNhcC9tL0luc3RhbmNlTWFuYWdlclwiO1xuaW1wb3J0IExpbmsgZnJvbSBcInNhcC9tL0xpbmtcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgdHlwZSBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhQ29udGV4dEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBCcmVhZENydW1icyBmcm9tIFwic2FwL3V4YXAvQnJlYWRDcnVtYnNcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGUgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGVcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VMYXlvdXQgZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VMYXlvdXRcIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VTZWN0aW9uIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlU2VjdGlvblwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZVN1YlNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTdWJTZWN0aW9uXCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0ludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsUm91dGluZ092ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IFBhZ2luYXRvck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9QYWdpbmF0b3JcIjtcbmltcG9ydCBTaGFyZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1ZpZXdTdGF0ZVwiO1xuXG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWw7XG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXJcIilcbmNsYXNzIE9iamVjdFBhZ2VDb250cm9sbGVyIGV4dGVuZHMgUGFnZUNvbnRyb2xsZXIge1xuXHRvVmlldyE6IGFueTtcblxuXHRAdXNpbmdFeHRlbnNpb24oUGxhY2Vob2xkZXIpXG5cdHBsYWNlaG9sZGVyITogUGxhY2Vob2xkZXI7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFNoYXJlLm92ZXJyaWRlKFNoYXJlT3ZlcnJpZGVzKSlcblx0c2hhcmUhOiBTaGFyZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oSW50ZXJuYWxSb3V0aW5nLm92ZXJyaWRlKEludGVybmFsUm91dGluZ092ZXJyaWRlKSlcblx0X3JvdXRpbmchOiBJbnRlcm5hbFJvdXRpbmc7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKFBhZ2luYXRvci5vdmVycmlkZShQYWdpbmF0b3JPdmVycmlkZSkpXG5cdHBhZ2luYXRvciE6IFBhZ2luYXRvcjtcblxuXHRAdXNpbmdFeHRlbnNpb24oTWVzc2FnZUhhbmRsZXIub3ZlcnJpZGUoTWVzc2FnZUhhbmRsZXJPdmVycmlkZSkpXG5cdG1lc3NhZ2VIYW5kbGVyITogTWVzc2FnZUhhbmRsZXI7XG5cblx0QHVzaW5nRXh0ZW5zaW9uKEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZShJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSkpXG5cdGludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVudEJhc2VkTmF2aWdhdGlvbjtcblxuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0TmF2aWdhdGlvbk1vZGU6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRjb25zdCBiSXNTdGlja3lFZGl0TW9kZSA9XG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUgJiZcblx0XHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5nZXRTdGlja3lFZGl0TW9kZSgpO1xuXHRcdFx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGUgPyBcImV4cGxhY2VcIiA6IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblxuXHRAdXNpbmdFeHRlbnNpb24oVmlld1N0YXRlLm92ZXJyaWRlKFZpZXdTdGF0ZU92ZXJyaWRlcykpXG5cdHZpZXdTdGF0ZSE6IFZpZXdTdGF0ZTtcblxuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0UGFnZVJlYWR5Lm92ZXJyaWRlKHtcblx0XHRcdGlzQ29udGV4dEV4cGVjdGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0cGFnZVJlYWR5ITogUGFnZVJlYWR5O1xuXG5cdEB1c2luZ0V4dGVuc2lvbihNYXNzRWRpdClcblx0bWFzc0VkaXQhOiBNYXNzRWRpdDtcblxuXHRwcml2YXRlIG1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcz86IFJlY29yZDxzdHJpbmcsIE9iamVjdFBhZ2VFeHRlbnNpb25BUEk+O1xuXG5cdHByb3RlY3RlZCBleHRlbnNpb25BUEk/OiBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJO1xuXG5cdHByaXZhdGUgYlNlY3Rpb25OYXZpZ2F0ZWQ/OiBib29sZWFuO1xuXG5cdHByaXZhdGUgc3dpdGNoRHJhZnRBbmRBY3RpdmVQb3BPdmVyPzogUG9wb3ZlcjtcblxuXHRwcml2YXRlIGN1cnJlbnRCaW5kaW5nPzogQmluZGluZztcblxuXHRwcml2YXRlIG1lc3NhZ2VCdXR0b246IGFueTtcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0RXh0ZW5zaW9uQVBJKHNJZD86IHN0cmluZyk6IEV4dGVuc2lvbkFQSSB7XG5cdFx0aWYgKHNJZCkge1xuXHRcdFx0Ly8gdG8gYWxsb3cgbG9jYWwgSUQgdXNhZ2UgZm9yIGN1c3RvbSBwYWdlcyB3ZSdsbCBjcmVhdGUvcmV0dXJuIG93biBpbnN0YW5jZXMgZm9yIGN1c3RvbSBzZWN0aW9uc1xuXHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMgPSB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyB8fCB7fTtcblxuXHRcdFx0aWYgKCF0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdKSB7XG5cdFx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0gPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMsIHNJZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCF0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0XHR0aGlzLmV4dGVuc2lvbkFQSSA9IG5ldyBFeHRlbnNpb25BUEkodGhpcyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25BUEk7XG5cdFx0fVxuXHR9XG5cblx0b25Jbml0KCkge1xuXHRcdHN1cGVyLm9uSW5pdCgpO1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblxuXHRcdC8vIFNldHRpbmcgZGVmYXVsdHMgb2YgaW50ZXJuYWwgbW9kZWwgY29udGV4dFxuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImV4dGVybmFsTmF2aWdhdGlvbkNvbnRleHRcIiwgeyBwYWdlOiB0cnVlIH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJyZWxhdGVkQXBwc1wiLCB7XG5cdFx0XHR2aXNpYmlsaXR5OiBmYWxzZSxcblx0XHRcdGl0ZW1zOiBudWxsXG5cdFx0fSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImJhdGNoR3JvdXBzXCIsIHRoaXMuX2dldEJhdGNoR3JvdXBzRm9yVmlldygpKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgZmFsc2UpO1xuXHRcdGlmIChvT2JqZWN0UGFnZS5nZXRFbmFibGVMYXp5TG9hZGluZygpKSB7XG5cdFx0XHQvL0F0dGFjaGluZyB0aGUgZXZlbnQgdG8gbWFrZSB0aGUgc3Vic2VjdGlvbiBjb250ZXh0IGJpbmRpbmcgYWN0aXZlIHdoZW4gaXQgaXMgdmlzaWJsZS5cblx0XHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50KFwic3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydFwiLCB0aGlzLl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0LmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHR0aGlzLm1lc3NhZ2VCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OkZvb3RlckJhcjo6TWVzc2FnZUJ1dHRvblwiKTtcblx0XHR0aGlzLm1lc3NhZ2VCdXR0b24ub0l0ZW1CaW5kaW5nLmF0dGFjaENoYW5nZSh0aGlzLl9mblNob3dPUE1lc3NhZ2UsIHRoaXMpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJyb290RWRpdEVuYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcInJvb3RFZGl0VmlzaWJsZVwiLCB0cnVlKTtcblx0fVxuXG5cdG9uRXhpdCgpIHtcblx0XHRpZiAodGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMpIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIG9mIE9iamVjdC5rZXlzKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzKSkge1xuXHRcdFx0XHRpZiAodGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSkge1xuXHRcdFx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0uZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRkZWxldGUgdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXM7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0dGhpcy5leHRlbnNpb25BUEkuZGVzdHJveSgpO1xuXHRcdH1cblx0XHRkZWxldGUgdGhpcy5leHRlbnNpb25BUEk7XG5cblx0XHRjb25zdCBvTWVzc2FnZVBvcG92ZXIgPSB0aGlzLm1lc3NhZ2VCdXR0b24gPyB0aGlzLm1lc3NhZ2VCdXR0b24ub01lc3NhZ2VQb3BvdmVyIDogbnVsbDtcblx0XHRpZiAob01lc3NhZ2VQb3BvdmVyICYmIG9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0b01lc3NhZ2VQb3BvdmVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdC8vd2hlbiBleGl0aW5nIHdlIHNldCBrZWVwQWxpdmUgY29udGV4dCB0byBmYWxzZVxuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdH1cblx0XHRpZiAoaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRkaXNjb25uZWN0KHRoaXMuZ2V0VmlldygpKTsgLy8gQ2xlYW51cCBjb2xsYWJvcmF0aW9uIGNvbm5lY3Rpb24gd2hlbiBsZWF2aW5nIHRoZSBhcHBcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHNob3cgdGhlIG1lc3NhZ2Ugc3RyaXAgb24gdGhlIG9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2ZuU2hvd09QTWVzc2FnZSgpIHtcblx0XHRjb25zdCBleHRlbnNpb25BUEkgPSB0aGlzLmdldEV4dGVuc2lvbkFQSSgpO1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBpbnRlcm5hbENvbnRleHQgPSB2aWV3Py5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdGNvbnN0IHN0cmlwVmlzaWJsZSA9IGludGVybmFsQ29udGV4dD8uZ2V0UHJvcGVydHkoXCJPUE1lc3NhZ2VTdHJpcFZpc2liaWxpdHlcIik7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VCdXR0b24ub01lc3NhZ2VQb3BvdmVyXG5cdFx0XHQuZ2V0SXRlbXMoKVxuXHRcdFx0Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKS5nZXRPYmplY3QoKSlcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdID09PSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdH0pO1xuXG5cdFx0aWYgKGV4dGVuc2lvbkFQSSAmJiAhKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCAmJiBzdHJpcFZpc2libGUpKSB7XG5cdFx0XHRleHRlbnNpb25BUEkuc2hvd01lc3NhZ2VzKG1lc3NhZ2VzKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0VGFibGVCaW5kaW5nKG9UYWJsZTogYW55KSB7XG5cdFx0cmV0dXJuIG9UYWJsZSAmJiBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmQgdGhlIGxhc3QgdmlzaWJsZSBzdWJzZWN0aW9uIGFuZCBhZGQgdGhlIHNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lciBDU1MgY2xhc3MgaWYgaXQgY29udGFpbnMgb25seSBhIEdyaWRUYWJsZSBvciBhIFRyZWVUYWJsZS5cblx0ICpcblx0ICogQHBhcmFtIHN1YlNlY3Rpb25zIFRoZSBzdWIgc2VjdGlvbnMgdG8gbG9vayBmb3Jcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZShzdWJTZWN0aW9uczogT2JqZWN0UGFnZVN1YlNlY3Rpb25bXSkge1xuXHRcdGNvbnN0IGNoYW5nZUNsYXNzRm9yVGFibGVzID0gKGV2ZW50OiBFdmVudCwgbGFzdFZpc2libGVTdWJTZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbikgPT4ge1xuXHRcdFx0Y29uc3QgYmxvY2tzID0gWy4uLmxhc3RWaXNpYmxlU3ViU2VjdGlvbi5nZXRCbG9ja3MoKSwgLi4ubGFzdFZpc2libGVTdWJTZWN0aW9uLmdldE1vcmVCbG9ja3MoKV07XG5cdFx0XHRjb25zdCB0YWJsZVR5cGUgPSBibG9ja3MubGVuZ3RoID09PSAxICYmIHRoaXMuc2VhcmNoVGFibGVJbkJsb2NrKGJsb2Nrc1swXSBhcyBTdWJTZWN0aW9uQmxvY2spPy5nZXRUeXBlKCk7XG5cdFx0XHRpZiAodGFibGVUeXBlICYmICh0YWJsZVR5cGU/LmlzQShcInNhcC51aS5tZGMudGFibGUuR3JpZFRhYmxlVHlwZVwiKSB8fCB0YWJsZVR5cGU/LmlzQShcInNhcC51aS5tZGMudGFibGUuVHJlZVRhYmxlVHlwZVwiKSkpIHtcblx0XHRcdFx0Ly9JbiBjYXNlIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGFibGUgaW4gYSBzdWJTZWN0aW9uIHdlIGZpdCB0aGF0IHRvIHRoZSB3aG9sZSBwYWdlIHNvIHRoYXQgdGhlIHNjcm9sbGJhciBjb21lcyBvbmx5IG9uIHRhYmxlIGFuZCBub3Qgb24gcGFnZVxuXHRcdFx0XHRsYXN0VmlzaWJsZVN1YlNlY3Rpb24uYWRkU3R5bGVDbGFzcyhcInNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lclwiKTtcblx0XHRcdFx0bGFzdFZpc2libGVTdWJTZWN0aW9uLmRldGFjaEV2ZW50KFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIGNoYW5nZUNsYXNzRm9yVGFibGVzLCB0aGlzKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb25JbmRleCA9IHN1YlNlY3Rpb25zLmxlbmd0aCAtIDE7IHN1YlNlY3Rpb25JbmRleCA+PSAwOyBzdWJTZWN0aW9uSW5kZXgtLSkge1xuXHRcdFx0aWYgKHN1YlNlY3Rpb25zW3N1YlNlY3Rpb25JbmRleF0uZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdGNvbnN0IGxhc3RWaXNpYmxlU3ViU2VjdGlvbiA9IHN1YlNlY3Rpb25zW3N1YlNlY3Rpb25JbmRleF07XG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gYXR0YWNoIHRoaXMgZXZlbnQgaW4gb3JkZXIgdG8gbWFuYWdlIHRoZSBPYmplY3QgUGFnZSBMYXp5IExvYWRpbmcgbWVjaGFuaXNtXG5cdFx0XHRcdGxhc3RWaXNpYmxlU3ViU2VjdGlvbi5hdHRhY2hFdmVudChcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBsYXN0VmlzaWJsZVN1YlNlY3Rpb24sIGNoYW5nZUNsYXNzRm9yVGFibGVzLCB0aGlzKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmQgYSB0YWJsZSBpbiBibG9ja3Mgb2Ygc2VjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGJsb2NrIE9uZSBzdWIgc2VjdGlvbiBibG9ja1xuXHQgKiBAcmV0dXJucyBUYWJsZSBpZiBleGlzdHNcblx0ICovXG5cdHByaXZhdGUgc2VhcmNoVGFibGVJbkJsb2NrKGJsb2NrOiBTdWJTZWN0aW9uQmxvY2spIHtcblx0XHRjb25zdCBjb250cm9sID0gYmxvY2suY29udGVudDtcblx0XHRsZXQgdGFibGVBUEk6IFRhYmxlQVBJIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChibG9jay5pc0EoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuY29udHJvbHMuU3ViU2VjdGlvbkJsb2NrXCIpKSB7XG5cdFx0XHQvLyBUaGUgdGFibGUgbWF5IGN1cnJlbnRseSBiZSBzaG93biBpbiBhIGZ1bGwgc2NyZWVuIGRpYWxvZywgd2UgY2FuIHRoZW4gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIFRhYmxlQVBJXG5cdFx0XHQvLyBjb250cm9sIGZyb20gdGhlIGN1c3RvbSBkYXRhIG9mIHRoZSBwbGFjZSBob2xkZXIgcGFuZWxcblx0XHRcdGlmIChjb250cm9sLmlzQShcInNhcC5tLlBhbmVsXCIpICYmIGNvbnRyb2wuZGF0YShcIkZ1bGxTY3JlZW5UYWJsZVBsYWNlSG9sZGVyXCIpKSB7XG5cdFx0XHRcdHRhYmxlQVBJID0gY29udHJvbC5kYXRhKFwidGFibGVBUElyZWZlcmVuY2VcIik7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wuaXNBKFwic2FwLmZlLm1hY3Jvcy50YWJsZS5UYWJsZUFQSVwiKSkge1xuXHRcdFx0XHR0YWJsZUFQSSA9IGNvbnRyb2wgYXMgVGFibGVBUEk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGFibGVBUEkpIHtcblx0XHRcdFx0cmV0dXJuIHRhYmxlQVBJLmNvbnRlbnQgYXMgVGFibGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblx0b25CZWZvcmVSZW5kZXJpbmcoKSB7XG5cdFx0UGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLm9uQmVmb3JlUmVuZGVyaW5nLmFwcGx5KHRoaXMpO1xuXHRcdC8vIEluIHRoZSByZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IHNjZW5hcmlvIHdlIG5lZWQgdG8gZW5zdXJlIGluIGNhc2Ugb2YgcmVsb2FkL3JlZnJlc2ggdGhhdCB0aGUgbWV0YSBtb2RlbCBpbiB0aGUgbWV0aG9kZSByZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IG9mIHRoZSBGaWVsZFJ1bnRpbWUgaXMgYXZhaWxhYmxlXG5cdFx0aWYgKHRoaXMub1ZpZXcub1ZpZXdEYXRhPy5yZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0ICYmIENvbW1vbkhlbHBlci5nZXRNZXRhTW9kZWwoKSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRDb21tb25IZWxwZXIuc2V0TWV0YU1vZGVsKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdH1cblx0fVxuXG5cdG9uQWZ0ZXJSZW5kZXJpbmcoKSB7XG5cdFx0bGV0IHN1YlNlY3Rpb25zOiBPYmplY3RQYWdlU3ViU2VjdGlvbltdO1xuXHRcdGlmICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldFVzZUljb25UYWJCYXIoKSkge1xuXHRcdFx0Y29uc3Qgc2VjdGlvbnMgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldFNlY3Rpb25zKCk7XG5cdFx0XHRmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcblx0XHRcdFx0c3ViU2VjdGlvbnMgPSBzZWN0aW9uLmdldFN1YlNlY3Rpb25zKCk7XG5cdFx0XHRcdHRoaXMuY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZShzdWJTZWN0aW9ucyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN1YlNlY3Rpb25zID0gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKTtcblx0XHRcdHRoaXMuY2hlY2tTZWN0aW9uc0Zvck5vblJlc3BvbnNpdmVUYWJsZShzdWJTZWN0aW9ucyk7XG5cdFx0fVxuXHR9XG5cblx0X29uQmVmb3JlQmluZGluZyhvQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Ly8gVE9ETzogd2Ugc2hvdWxkIGNoZWNrIGhvdyB0aGlzIGNvbWVzIHRvZ2V0aGVyIHdpdGggdGhlIHRyYW5zYWN0aW9uIGhlbHBlciwgc2FtZSB0byB0aGUgY2hhbmdlIGluIHRoZSBhZnRlckJpbmRpbmdcblx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZmluZFRhYmxlcygpLFxuXHRcdFx0b09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLFxuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCxcblx0XHRcdG9JbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWwsXG5cdFx0XHRhQmF0Y2hHcm91cHMgPSBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJiYXRjaEdyb3Vwc1wiKSxcblx0XHRcdGlWaWV3TGV2ZWwgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnZpZXdMZXZlbDtcblx0XHRsZXQgb0Zhc3RDcmVhdGlvblJvdztcblx0XHRhQmF0Y2hHcm91cHMucHVzaChcIiRhdXRvXCIpO1xuXHRcdGlmIChtUGFyYW1ldGVycy5iRHJhZnROYXZpZ2F0aW9uICE9PSB0cnVlKSB7XG5cdFx0XHR0aGlzLl9jbG9zZVNpZGVDb250ZW50KCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9wQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRpZiAoXG5cdFx0XHRvcENvbnRleHQgJiZcblx0XHRcdG9wQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpICYmXG5cdFx0XHQhYUJhdGNoR3JvdXBzLnNvbWUob3BDb250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMuYmluZChvcENvbnRleHQuZ2V0TW9kZWwoKSkpXG5cdFx0KSB7XG5cdFx0XHQvKiBcdEluIGNhc2UgdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBmb3IgdGhlIGNyZWF0aW9uIHJvdyBhbmQgbm8gb3RoZXJzIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNoYW5nZXNcblx0XHRcdFx0XHRcdFx0XHRUT0RPOiB0aGlzIGlzIGp1c3QgYSBxdWljayBzb2x1dGlvbiwgdGhpcyBuZWVkcyB0byBiZSByZXdvcmtlZFxuXHRcdFx0XHRcdFx0XHRcdCovXG5cblx0XHRcdG9wQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yIG5vdyB3ZSBoYXZlIHRvIHNldCB0aGUgYmluZGluZyBjb250ZXh0IHRvIG51bGwgZm9yIGV2ZXJ5IGZhc3QgY3JlYXRpb24gcm93XG5cdFx0Ly8gVE9ETzogR2V0IHJpZCBvZiB0aGlzIGNvZGluZyBvciBtb3ZlIGl0IHRvIGFub3RoZXIgbGF5ZXIgLSB0byBiZSBkaXNjdXNzZWQgd2l0aCBNREMgYW5kIG1vZGVsXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhVGFibGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvRmFzdENyZWF0aW9uUm93ID0gYVRhYmxlc1tpXS5nZXRDcmVhdGlvblJvdygpO1xuXHRcdFx0aWYgKG9GYXN0Q3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0b0Zhc3RDcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChudWxsKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTY3JvbGwgdG8gcHJlc2VudCBTZWN0aW9uIHNvIHRoYXQgYmluZGluZ3MgYXJlIGVuYWJsZWQgZHVyaW5nIG5hdmlnYXRpb24gdGhyb3VnaCBwYWdpbmF0b3IgYnV0dG9ucywgYXMgdGhlcmUgaXMgbm8gdmlldyByZXJlbmRlcmluZy9yZWJpbmRcblx0XHRjb25zdCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoIShvT2JqZWN0UGFnZSBhcyBhbnkpLmlzRmlyc3RSZW5kZXJpbmcoKSAmJiAhbVBhcmFtZXRlcnMuYlBlcnNpc3RPUFNjcm9sbCkge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zZXRTZWxlY3RlZFNlY3Rpb24obnVsbCBhcyBhbnkpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0b09iamVjdFBhZ2UuYXR0YWNoRXZlbnRPbmNlKFwibW9kZWxDb250ZXh0Q2hhbmdlXCIsIGZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbik7XG5cblx0XHQvLyBpZiB0aGUgc3RydWN0dXJlIG9mIHRoZSBPYmplY3RQYWdlTGF5b3V0IGlzIGNoYW5nZWQgdGhlbiBzY3JvbGwgdG8gcHJlc2VudCBTZWN0aW9uXG5cdFx0Ly8gRklYTUUgSXMgdGhpcyByZWFsbHkgd29ya2luZyBhcyBpbnRlbmRlZCA/IEluaXRpYWxseSB0aGlzIHdhcyBvbkJlZm9yZVJlbmRlcmluZywgYnV0IG5ldmVyIHRyaWdnZXJlZCBvbkJlZm9yZVJlbmRlcmluZyBiZWNhdXNlIGl0IHdhcyByZWdpc3RlcmVkIGFmdGVyIGl0XG5cdFx0Y29uc3Qgb0RlbGVnYXRlT25CZWZvcmUgPSB7XG5cdFx0XHRvbkFmdGVyUmVuZGVyaW5nOiBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb25cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmFkZEV2ZW50RGVsZWdhdGUob0RlbGVnYXRlT25CZWZvcmUsIHRoaXMpO1xuXHRcdHRoaXMucGFnZVJlYWR5LmF0dGFjaEV2ZW50T25jZShcInBhZ2VSZWFkeVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRvT2JqZWN0UGFnZS5yZW1vdmVFdmVudERlbGVnYXRlKG9EZWxlZ2F0ZU9uQmVmb3JlKTtcblx0XHR9KTtcblxuXHRcdC8vU2V0IHRoZSBCaW5kaW5nIGZvciBQYWdpbmF0b3JzIHVzaW5nIExpc3RCaW5kaW5nIElEXG5cdFx0aWYgKGlWaWV3TGV2ZWwgPiAxKSB7XG5cdFx0XHRsZXQgb0JpbmRpbmcgPSBtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5saXN0QmluZGluZztcblx0XHRcdGNvbnN0IG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dCA9IG9JbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3BhZ2luYXRvckN1cnJlbnRDb250ZXh0XCIpO1xuXHRcdFx0aWYgKG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBvQmluZGluZ1RvVXNlID0gb1BhZ2luYXRvckN1cnJlbnRDb250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShvQmluZGluZ1RvVXNlLCBvUGFnaW5hdG9yQ3VycmVudENvbnRleHQpO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiLCBudWxsKTtcblx0XHRcdH0gZWxzZSBpZiAob0JpbmRpbmcpIHtcblx0XHRcdFx0aWYgKG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShvQmluZGluZywgb0NvbnRleHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGlmIHRoZSBiaW5kaW5nIHR5cGUgaXMgbm90IE9EYXRhTGlzdEJpbmRpbmcgYmVjYXVzZSBvZiBhIGRlZXBsaW5rIG5hdmlnYXRpb24gb3IgYSByZWZyZXNoIG9mIHRoZSBwYWdlXG5cdFx0XHRcdFx0Ly8gd2UgbmVlZCB0byBjcmVhdGUgaXRcblx0XHRcdFx0XHRjb25zdCBzQmluZGluZ1BhdGggPSBvQmluZGluZy5nZXRQYXRoKCk7XG5cdFx0XHRcdFx0aWYgKC9cXChbXildKlxcKSQvLnRlc3Qoc0JpbmRpbmdQYXRoKSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGN1cnJlbnQgYmluZGluZyBwYXRoIGVuZHMgd2l0aCAoeHh4KSwgc28gd2UgY3JlYXRlIHRoZSBsaXN0QmluZGluZyBieSByZW1vdmluZyAoeHh4KVxuXHRcdFx0XHRcdFx0Y29uc3Qgc0xpc3RCaW5kaW5nUGF0aCA9IHNCaW5kaW5nUGF0aC5yZXBsYWNlKC9cXChbXildKlxcKSQvLCBcIlwiKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkob0JpbmRpbmcub01vZGVsLCBzTGlzdEJpbmRpbmdQYXRoKTtcblx0XHRcdFx0XHRcdGNvbnN0IF9zZXRMaXN0QmluZGluZ0FzeW5jID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAob0JpbmRpbmcuZ2V0Q29udGV4dHMoKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZShvQmluZGluZywgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmRldGFjaEV2ZW50KFwiY2hhbmdlXCIsIF9zZXRMaXN0QmluZGluZ0FzeW5jKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZ2V0Q29udGV4dHMoMCk7XG5cdFx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudChcImNoYW5nZVwiLCBfc2V0TGlzdEJpbmRpbmdBc3luYyk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBjdXJyZW50IGJpbmRpbmcgZG9lc24ndCBlbmQgd2l0aCAoeHh4KSAtLT4gdGhlIGxhc3Qgc2VnbWVudCBpcyBhIDEtMSBuYXZpZ2F0aW9uLCBzbyB3ZSBkb24ndCBkaXNwbGF5IHRoZSBwYWdpbmF0b3Jcblx0XHRcdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUodW5kZWZpbmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAob09iamVjdFBhZ2UuZ2V0RW5hYmxlTGF6eUxvYWRpbmcoKSkge1xuXHRcdFx0Y29uc3QgYVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKTtcblx0XHRcdGNvbnN0IGJVc2VJY29uVGFiQmFyID0gb09iamVjdFBhZ2UuZ2V0VXNlSWNvblRhYkJhcigpO1xuXHRcdFx0bGV0IGlTa2lwID0gMjtcblx0XHRcdGNvbnN0IGJJc0luRWRpdE1vZGUgPSBvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdFx0XHRjb25zdCBiRWRpdGFibGVIZWFkZXIgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVkaXRhYmxlSGVhZGVyQ29udGVudDtcblx0XHRcdGZvciAobGV0IGlTZWN0aW9uID0gMDsgaVNlY3Rpb24gPCBhU2VjdGlvbnMubGVuZ3RoOyBpU2VjdGlvbisrKSB7XG5cdFx0XHRcdGNvbnN0IG9TZWN0aW9uID0gYVNlY3Rpb25zW2lTZWN0aW9uXTtcblx0XHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdFx0Zm9yIChsZXQgaVN1YlNlY3Rpb24gPSAwOyBpU3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IGlTdWJTZWN0aW9uKyssIGlTa2lwLS0pIHtcblx0XHRcdFx0XHQvLyBJbiBJY29uVGFiQmFyIG1vZGUga2VlcCB0aGUgc2Vjb25kIHNlY3Rpb24gYm91bmQgaWYgdGhlcmUgaXMgYW4gZWRpdGFibGUgaGVhZGVyIGFuZCB3ZSBhcmUgc3dpdGNoaW5nIHRvIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdGlmIChpU2tpcCA8IDEgfHwgKGJVc2VJY29uVGFiQmFyICYmIChpU2VjdGlvbiA+IDEgfHwgKGlTZWN0aW9uID09PSAxICYmICFiRWRpdGFibGVIZWFkZXIgJiYgIWJJc0luRWRpdE1vZGUpKSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gYVN1YlNlY3Rpb25zW2lTdWJTZWN0aW9uXTtcblx0XHRcdFx0XHRcdGlmIChvU3ViU2VjdGlvbi5kYXRhKCkuaXNWaXNpYmlsaXR5RHluYW1pYyAhPT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyLmlzUGxhY2Vob2xkZXJFbmFibGVkKCkgJiYgbVBhcmFtZXRlcnMuc2hvd1BsYWNlaG9sZGVyKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3Qgb05hdkNvbnRhaW5lciA9IChvVmlldy5nZXRQYXJlbnQoKSBhcyBhbnkpLm9Db250YWluZXIuZ2V0UGFyZW50KCk7XG5cdFx0XHRpZiAob05hdkNvbnRhaW5lcikge1xuXHRcdFx0XHRvTmF2Q29udGFpbmVyLnNob3dQbGFjZWhvbGRlcih7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZTogYW55KSB7XG5cdFx0bGV0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpICYmIG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkuZ2V0QWN0aW9ucygpO1xuXHRcdGlmIChhQWN0aW9ucyAmJiBhQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSBhQWN0aW9ucy5maW5kKGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0Ly8gRHVlIHRvIHRoZSBsZWZ0IGFsaWdubWVudCBvZiB0aGUgRHJhZnQgc3dpdGNoIGFuZCB0aGUgY29sbGFib3JhdGl2ZSBkcmFmdCBhdmF0YXIgY29udHJvbHNcblx0XHRcdFx0Ly8gdGhlcmUgaXMgYSBUb29sYmFyU3BhY2VyIGluIHRoZSBhY3Rpb25zIGFnZ3JlZ2F0aW9uIHdoaWNoIHdlIG5lZWQgdG8gZXhjbHVkZSBoZXJlIVxuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIEFDQyByZXBvcnQsIHdlIGFsc28gbmVlZCBub3QgdG8gY2hlY2sgZm9yIHRoZSBJbnZpc2libGVUZXh0IGVsZW1lbnRzXG5cdFx0XHRcdGlmIChvQWN0aW9uLmlzQShcInNhcC5mZS5tYWNyb3Muc2hhcmUuU2hhcmVBUElcIikpIHtcblx0XHRcdFx0XHQvLyBzaW5jZSBTaGFyZUFQSSBkb2VzIG5vdCBoYXZlIGEgZGlzYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHRcdC8vIGhlbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgZGlzYmFsZWQgb3Igbm90XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0VmlzaWJsZSgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFvQWN0aW9uLmlzQShcInNhcC51aS5jb3JlLkludmlzaWJsZVRleHRcIikgJiYgIW9BY3Rpb24uaXNBKFwic2FwLm0uVG9vbGJhclNwYWNlclwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldFZpc2libGUoKSAmJiBvQWN0aW9uLmdldEVuYWJsZWQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvRmlyc3RDbGlja2FibGVFbGVtZW50O1xuXHR9XG5cblx0X2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uKGFTdWJTZWN0aW9uczogYW55KSB7XG5cdFx0aWYgKGFTdWJTZWN0aW9ucykge1xuXHRcdFx0Zm9yIChsZXQgc3ViU2VjdGlvbiA9IDA7IHN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBzdWJTZWN0aW9uKyspIHtcblx0XHRcdFx0Y29uc3QgYUJsb2NrcyA9IGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKTtcblxuXHRcdFx0XHRpZiAoYUJsb2Nrcykge1xuXHRcdFx0XHRcdGZvciAobGV0IGJsb2NrID0gMDsgYmxvY2sgPCBhQmxvY2tzLmxlbmd0aDsgYmxvY2srKykge1xuXHRcdFx0XHRcdFx0bGV0IGFGb3JtQ29udGFpbmVycztcblxuXHRcdFx0XHRcdFx0aWYgKGFCbG9ja3NbYmxvY2tdLmlzQShcInNhcC51aS5sYXlvdXQuZm9ybS5Gb3JtXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IGFCbG9ja3NbYmxvY2tdLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50ICYmXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKSAmJlxuXHRcdFx0XHRcdFx0XHRhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50KCkuaXNBKFwic2FwLnVpLmxheW91dC5mb3JtLkZvcm1cIilcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSBhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50KCkuZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGFGb3JtQ29udGFpbmVycykge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29udGFpbmVyID0gMDsgZm9ybUNvbnRhaW5lciA8IGFGb3JtQ29udGFpbmVycy5sZW5ndGg7IGZvcm1Db250YWluZXIrKykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGb3JtRWxlbWVudHMgPSBhRm9ybUNvbnRhaW5lcnNbZm9ybUNvbnRhaW5lcl0uZ2V0Rm9ybUVsZW1lbnRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFGb3JtRWxlbWVudHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGZvcm1FbGVtZW50ID0gMDsgZm9ybUVsZW1lbnQgPCBhRm9ybUVsZW1lbnRzLmxlbmd0aDsgZm9ybUVsZW1lbnQrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhRmllbGRzID0gYUZvcm1FbGVtZW50c1tmb3JtRWxlbWVudF0uZ2V0RmllbGRzKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGZpcnN0IGZpZWxkIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBJbnB1dEJhc2UgKGUuZy4gY291bGQgYmUgYSBUZXh0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTbyB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaGFzIGEgZ2V0UmVxdWlyZWQgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFGaWVsZHNbMF0uZ2V0UmVxdWlyZWQgJiYgYUZpZWxkc1swXS5nZXRSZXF1aXJlZCgpICYmICFhRmllbGRzWzBdLmdldFZhbHVlKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBhRmllbGRzWzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoZW4gc2VhcmNoaW5nIGZvciBtYW5kYW90cnkgZW1wdHkgZmllbGQ6ICR7ZXJyb3J9YCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdF91cGRhdGVGb2N1c0luRWRpdE1vZGUoYVN1YlNlY3Rpb25zOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cblx0XHRjb25zdCBvTWFuZGF0b3J5RmllbGQgPSB0aGlzLl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbihhU3ViU2VjdGlvbnMpO1xuXHRcdGxldCBvRmllbGRUb0ZvY3VzOiBhbnk7XG5cdFx0aWYgKG9NYW5kYXRvcnlGaWVsZCkge1xuXHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IG9NYW5kYXRvcnlGaWVsZC5jb250ZW50LmdldENvbnRlbnRFZGl0KClbMF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWVsZFRvRm9jdXMgPSAob09iamVjdFBhZ2UgYXMgYW55KS5fZ2V0Rmlyc3RFZGl0YWJsZUlucHV0KCkgfHwgdGhpcy5fZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlKTtcblx0XHR9XG5cblx0XHRpZiAob0ZpZWxkVG9Gb2N1cykge1xuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIFdlIHNldCB0aGUgZm9jdXMgaW4gYSB0aW1lZW91dCwgb3RoZXJ3aXNlIHRoZSBmb2N1cyBzb21ldGltZXMgZ29lcyB0byB0aGUgVGFiQmFyXG5cdFx0XHRcdG9GaWVsZFRvRm9jdXMuZm9jdXMoKTtcblx0XHRcdH0sIDApO1xuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0KG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JbkRyYWZ0KG9Db250ZXh0OiBhbnkpIHtcblx0XHR0aGlzLm1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGlmICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCgpKSB7XG5cdFx0XHQvLyBCYWNrIG5hdiB3aWxsIGtlZXAgdGhlIHNhbWUgY29udGV4dCAtLT4gbm8gbmVlZCB0byBkaXNwbGF5IHRoZSBkaWFsb2dcblx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfb25BZnRlckJpbmRpbmcoaW5wdXRCaW5kaW5nQ29udGV4dDogYW55LCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCk7XG5cblx0XHR0aGlzLl9zaWRlRWZmZWN0cy5jbGVhckZpZWxkR3JvdXBzVmFsaWRpdHkoKTtcblxuXHRcdC8vIFRPRE86IHRoaXMgaXMgb25seSBhIHRlbXAgc29sdXRpb24gYXMgbG9uZyBhcyB0aGUgbW9kZWwgZml4IHRoZSBjYWNoZSBpc3N1ZSBhbmQgd2UgdXNlIHRoaXMgYWRkaXRpb25hbFxuXHRcdC8vIGJpbmRpbmcgd2l0aCBvd25SZXF1ZXN0XG5cdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cblx0XHRsZXQgYUlCTkFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0b09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9TdWJTZWN0aW9uLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHRzIHRvIG9Gb3JtQ29udGFpbmVyOlxuXHRcdC8vIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIGludGVybmFsIGJpbmRpbmcgY29udGV4dCB0byB0aGUgWE1MIGZyYWdtZW50XG5cdFx0Ly8gKEZvcm1Db250YWluZXIuZnJhZ21lbnQueG1sKSB5ZXQgLSBpdCBpcyB1c2VkIGFscmVhZHkgZm9yIHRoZSBkYXRhLXN0cnVjdHVyZS5cblx0XHQvLyAyLiBBbm90aGVyIHByb2JsZW0gaXMsIHRoYXQgRm9ybUNvbnRhaW5lcnMgYXNzaWduZWQgdG8gYSAnTW9yZUJsb2NrJyBkb2VzIG5vdCBoYXZlIGFuXG5cdFx0Ly8gaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhdCBhbGwuXG5cblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdGlmIChvSW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dGaWVsZFZhbGlkaXR5XCIsIHt9KTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiLCB7fSk7XG5cblx0XHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9UYWJsZSwgYUlCTkFjdGlvbnMpO1xuXG5cdFx0XHRcdC8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBCQ1A6IDIwODAyMTgwMDRcblx0XHRcdFx0Ly8gTmVlZCB0byBmaXggd2l0aCBCTEk6IEZJT1JJVEVDSFAxLTE1Mjc0XG5cdFx0XHRcdC8vIG9ubHkgZm9yIGVkaXQgbW9kZSwgd2UgY2xlYXIgdGhlIHRhYmxlIGNhY2hlXG5cdFx0XHRcdC8vIFdvcmthcm91bmQgc3RhcnRzIGhlcmUhIVxuXHRcdFx0XHRjb25zdCBvVGFibGVSb3dCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0aWYgKG9UYWJsZVJvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9UYWJsZVJvd0JpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0XHRcdC8vIGFwcGx5IGZvciBib3RoIGVkaXQgYW5kIGRpc3BsYXkgbW9kZSBpbiBzdGlja3lcblx0XHRcdFx0XHRcdG9UYWJsZVJvd0JpbmRpbmcucmVtb3ZlQ2FjaGVzQW5kTWVzc2FnZXMoXCJcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFdvcmthcm91bmQgZW5kcyBoZXJlISFcblxuXHRcdFx0XHQvLyBDbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhbmQgdXBkYXRlIGFjdGlvbiBlbmFibGVtZW50IGFjY29yZGluZ2x5XG5cdFx0XHRcdC8vIFdpbGwgdG8gYmUgZml4ZWQgd2l0aCBCTEk6IEZJT1JJVEVDSFAxLTI0MzE4XG5cdFx0XHRcdGNvbnN0IG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAgPSBKU09OLnBhcnNlKFxuXHRcdFx0XHRcdENvbW1vbkhlbHBlci5wYXJzZUN1c3RvbURhdGEoRGVsZWdhdGVVdGlsLmdldEN1c3RvbURhdGEob1RhYmxlLCBcIm9wZXJhdGlvbkF2YWlsYWJsZU1hcFwiKSlcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBbXSwgXCJ0YWJsZVwiKTtcblxuXHRcdFx0XHRvVGFibGUuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRDb21tb25VdGlscy5nZXRTZW1hbnRpY1RhcmdldHNGcm9tUGFnZU1vZGVsKHRoaXMsIFwiX3BhZ2VNb2RlbFwiKTtcblx0XHQvL1JldHJpZXZlIE9iamVjdCBQYWdlIGhlYWRlciBhY3Rpb25zIGZyb20gT2JqZWN0IFBhZ2UgdGl0bGUgY29udHJvbFxuXHRcdGNvbnN0IG9PYmplY3RQYWdlVGl0bGUgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpIGFzIE9iamVjdFBhZ2VEeW5hbWljSGVhZGVyVGl0bGU7XG5cdFx0bGV0IGFJQk5IZWFkZXJBY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdGFJQk5IZWFkZXJBY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0SUJOQWN0aW9ucyhvT2JqZWN0UGFnZVRpdGxlLCBhSUJOSGVhZGVyQWN0aW9ucyk7XG5cdFx0YUlCTkFjdGlvbnMgPSBhSUJOQWN0aW9ucy5jb25jYXQoYUlCTkhlYWRlckFjdGlvbnMpO1xuXHRcdENvbW1vblV0aWxzLnVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5KGFJQk5BY3Rpb25zLCB0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRsZXQgb01vZGVsOiBhbnksIG9GaW5hbFVJU3RhdGU6IGFueTtcblxuXHRcdC8vIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXQgdGhlIGFsbFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKi9cblx0XHRjb25zdCBoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMgPSAob1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gdGhpcy5fZ2V0VGFibGVCaW5kaW5nKG9UYWJsZSksXG5cdFx0XHRcdGZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRUYWJsZUhlbHBlci5lbmFibGVGYXN0Q3JlYXRpb25Sb3coXG5cdFx0XHRcdFx0XHRvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKSxcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmdldENvbnRleHQoKSxcblx0XHRcdFx0XHRcdG9Nb2RlbCxcblx0XHRcdFx0XHRcdG9GaW5hbFVJU3RhdGVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRpZiAoIW9CaW5kaW5nKSB7XG5cdFx0XHRcdExvZy5lcnJvcihgRXhwZWN0ZWQgYmluZGluZyBtaXNzaW5nIGZvciB0YWJsZTogJHtvVGFibGUuZ2V0SWQoKX1gKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0JpbmRpbmcub0NvbnRleHQpIHtcblx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBmbkhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRpZiAob0JpbmRpbmcub0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdGZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cygpO1xuXHRcdFx0XHRcdFx0b0JpbmRpbmcuZGV0YWNoQ2hhbmdlKGZuSGFuZGxlQ2hhbmdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdG9CaW5kaW5nLmF0dGFjaENoYW5nZShmbkhhbmRsZUNoYW5nZSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmIChiaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0b01vZGVsID0gYmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKTtcblxuXHRcdFx0Ly8gQ29tcHV0ZSBFZGl0IE1vZGVcblx0XHRcdG9GaW5hbFVJU3RhdGUgPSB0aGlzLmVkaXRGbG93LmNvbXB1dGVFZGl0TW9kZShiaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdG9GaW5hbFVJU3RhdGVcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpc0Nvbm5lY3RlZCh0aGlzLmdldFZpZXcoKSkpIHtcblx0XHRcdFx0XHRcdFx0ZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7IC8vIENsZWFudXAgY29sbGFib3JhdGlvbiBjb25uZWN0aW9uIGluIGNhc2Ugd2Ugc3dpdGNoIHRvIGFub3RoZXIgZWxlbWVudCAoZS5nLiBpbiBGQ0wpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZmluYWwgVUkgU3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdC8vIHVwZGF0ZSByZWxhdGVkIGFwcHNcblx0XHRcdHRoaXMuX3VwZGF0ZVJlbGF0ZWRBcHBzKCk7XG5cblx0XHRcdC8vQXR0YWNoIHRoZSBwYXRjaCBzZW50IGFuZCBwYXRjaCBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gKGJpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcgJiYgYmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpKSB8fCBiaW5kaW5nQ29udGV4dDtcblxuXHRcdFx0Ly8gQXR0YWNoIHRoZSBldmVudCBoYW5kbGVyIG9ubHkgb25jZSB0byB0aGUgc2FtZSBiaW5kaW5nXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50QmluZGluZyAhPT0gb0JpbmRpbmcpIHtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJwYXRjaFNlbnRcIiwge30sIHRoaXMuZWRpdEZsb3cuaGFuZGxlUGF0Y2hTZW50LCB0aGlzKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50QmluZGluZyA9IG9CaW5kaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRcdC8vIGFjY2VzcyBiaW5kaW5nIG9ubHkgYWZ0ZXIgdGFibGUgaXMgYm91bmRcblx0XHRcdFx0VGFibGVVdGlscy53aGVuQm91bmQob1RhYmxlKVxuXHRcdFx0XHRcdC50aGVuKGhhbmRsZVRhYmxlTW9kaWZpY2F0aW9ucylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdGFibGUgdG8gYmUgYm91bmRcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYmluZGluZyBpcyByZWFkeSBoZW5jZSBjYWxsaW5nIGl0IGluIG9uQWZ0ZXJCaW5kaW5nXG5cdFx0XHQob09iamVjdFBhZ2UgYXMgYW55KS5fdHJpZ2dlclZpc2libGVTdWJTZWN0aW9uc0V2ZW50cygpO1xuXG5cdFx0XHQvL1RvIENvbXB1dGUgdGhlIEVkaXQgQmluZGluZyBvZiB0aGUgc3ViT2JqZWN0IHBhZ2UgdXNpbmcgcm9vdCBvYmplY3QgcGFnZSwgY3JlYXRlIGEgY29udGV4dCBmb3IgZHJhZnQgcm9vdCBhbmQgdXBkYXRlIHRoZSBlZGl0IGJ1dHRvbiBpbiBzdWIgT1AgdXNpbmcgdGhlIGNvbnRleHRcblx0XHRcdEFjdGlvblJ1bnRpbWUudXBkYXRlRWRpdEJ1dHRvblZpc2liaWxpdHlBbmRFbmFibGVtZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHR9XG5cdFx0dGhpcy5kaXNwbGF5Q29sbGFib3JhdGlvbk1lc3NhZ2UobVBhcmFtZXRlcnM/LnJlZGlyZWN0ZWRUb05vbkRyYWZ0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG93IGEgbWVzc2FnZSBzdHJpcCBpZiBhIHJlZGlyZWN0aW9uIHRvIGEgbm9uLWRyYWZ0IGVsZW1lbnQgaGFzIGJlZW4gZG9uZS5cblx0ICogUmVtb3ZlIHRoZSBtZXNzYWdlIHN0cmlwIGluIGNhc2Ugd2UgbmF2aWdhdGUgdG8gYW5vdGhlciBvYmplY3QgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eU5hbWUgTmFtZSBvZiB0aGUgRW50aXR5IHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbWVzc2FnZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZGlzcGxheUNvbGxhYm9yYXRpb25NZXNzYWdlKGVudGl0eU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGludGVybmFsQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRjb25zdCByZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0aWYgKGVudGl0eU5hbWUpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdG1lc3NhZ2U6IHJlc291cmNlQnVuZGxlLmdldFRleHQoXCJSRVJPVVRFRF9OQVZJR0FUSU9OX1RPX1NBVkVEX1ZFUlNJT05cIiwgW2VudGl0eU5hbWVdKSxcblx0XHRcdFx0dHlwZTogXCJJbmZvcm1hdGlvblwiXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkuc2hvd01lc3NhZ2VzKFttZXNzYWdlXSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2VUb0NvbXBhcmUgPSByZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiUkVST1VURURfTkFWSUdBVElPTl9UT19TQVZFRF9WRVJTSU9OXCIsIFtcInswfVwiXSk7XG5cdFx0XHRjb25zdCBsZW5ndGhVbnRpbFZhcmlhYmxlID0gbWVzc2FnZVRvQ29tcGFyZS5zZWFyY2goXCJ7XCIpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpbnRlcm5hbEJpbmRpbmdDb250ZXh0Py5nZXRQcm9wZXJ0eShcIk9QTWVzc2FnZVN0cmlwVGV4dFwiKT8uc3Vic3RyaW5nKDAsIGxlbmd0aFVudGlsVmFyaWFibGUpID09PVxuXHRcdFx0XHRtZXNzYWdlVG9Db21wYXJlLnN1YnN0cmluZygwLCBsZW5ndGhVbnRpbFZhcmlhYmxlKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkuc2hvd01lc3NhZ2VzKFtdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUGFnZVJlYWR5KG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBzZXRGb2N1cyA9ICgpID0+IHtcblx0XHRcdC8vIFNldCB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IGFjdGlvbiBidXR0b24sIG9yIHRvIHRoZSBmaXJzdCBlZGl0YWJsZSBpbnB1dCBpZiBpbiBlZGl0YWJsZSBtb2RlXG5cdFx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBpc0luRGlzcGxheU1vZGUgPSAhb09iamVjdFBhZ2UuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXG5cdFx0XHRpZiAoaXNJbkRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSB0aGlzLl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob09iamVjdFBhZ2UpO1xuXHRcdFx0XHRpZiAob0ZpcnN0Q2xpY2thYmxlRWxlbWVudCkge1xuXHRcdFx0XHRcdG9GaXJzdENsaWNrYWJsZUVsZW1lbnQuZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdGVkU2VjdGlvbjogYW55ID0gQ29yZS5ieUlkKG9PYmplY3RQYWdlLmdldFNlbGVjdGVkU2VjdGlvbigpKTtcblx0XHRcdFx0aWYgKG9TZWxlY3RlZFNlY3Rpb24pIHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVGb2N1c0luRWRpdE1vZGUob1NlbGVjdGVkU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Ly8gQXBwbHkgYXBwIHN0YXRlIG9ubHkgYWZ0ZXIgdGhlIHBhZ2UgaXMgcmVhZHkgd2l0aCB0aGUgZmlyc3Qgc2VjdGlvbiBzZWxlY3RlZFxuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdC8vU2hvdyBwb3B1cCB3aGlsZSBuYXZpZ2F0aW5nIGJhY2sgZnJvbSBvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGRyYWZ0XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCgob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0aWYgKCFiSXNTdGlja3lNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigoKSA9PiB0aGlzLl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdChvQmluZGluZ0NvbnRleHQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3Qgdmlld0lkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHQuZ2V0QXBwU3RhdGVIYW5kbGVyKClcblx0XHRcdC5hcHBseUFwcFN0YXRlKHZpZXdJZCwgdGhpcy5nZXRWaWV3KCkpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5mb3JjZUZvY3VzKSB7XG5cdFx0XHRcdFx0c2V0Rm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoRXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyB0aGUgZm9jdXNcIiwgRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiLCBmYWxzZSk7XG5cdFx0dGhpcy5fY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBzdGF0dXMgb2YgZWRpdCBtb2RlIGZvciBzdGlja3kgc2Vzc2lvblxuXHQgKi9cblx0Z2V0U3RpY2t5RWRpdE1vZGUoKSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQgJiYgKHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0bGV0IGJJc1N0aWNreUVkaXRNb2RlID0gZmFsc2U7XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRpZiAoYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRiSXNTdGlja3lFZGl0TW9kZSA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGJJc1N0aWNreUVkaXRNb2RlO1xuXHR9XG5cblx0X2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBPYmplY3RQYWdlTGF5b3V0O1xuXHR9XG5cblx0X2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZVN1YnRpdGxlID0gb09iamVjdFBhZ2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoZnVuY3Rpb24gKG9DdXN0b21EYXRhOiBhbnkpIHtcblx0XHRcdHJldHVybiBvQ3VzdG9tRGF0YS5nZXRLZXkoKSA9PT0gXCJPYmplY3RQYWdlU3VidGl0bGVcIjtcblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGl0bGU6IG9PYmplY3RQYWdlLmRhdGEoXCJPYmplY3RQYWdlVGl0bGVcIikgfHwgXCJcIixcblx0XHRcdHN1YnRpdGxlOiBvT2JqZWN0UGFnZVN1YnRpdGxlICYmIG9PYmplY3RQYWdlU3VidGl0bGUuZ2V0VmFsdWUoKSxcblx0XHRcdGludGVudDogXCJcIixcblx0XHRcdGljb246IFwiXCJcblx0XHR9O1xuXHR9XG5cblx0X2V4ZWN1dGVIZWFkZXJTaG9ydGN1dChzSWQ6IGFueSkge1xuXHRcdGNvbnN0IHNCdXR0b25JZCA9IGAke3RoaXMuZ2V0VmlldygpLmdldElkKCl9LS0ke3NJZH1gLFxuXHRcdFx0b0J1dHRvbiA9ICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldEhlYWRlclRpdGxlKCkgYXMgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSlcblx0XHRcdFx0LmdldEFjdGlvbnMoKVxuXHRcdFx0XHQuZmluZChmdW5jdGlvbiAob0VsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvRWxlbWVudC5nZXRJZCgpID09PSBzQnV0dG9uSWQ7XG5cdFx0XHRcdH0pO1xuXHRcdGlmIChvQnV0dG9uKSB7XG5cdFx0XHRDb21tb25VdGlscy5maXJlQnV0dG9uUHJlc3Mob0J1dHRvbik7XG5cdFx0fVxuXHR9XG5cblx0X2V4ZWN1dGVGb290ZXJTaG9ydGN1dChzSWQ6IGFueSkge1xuXHRcdGNvbnN0IHNCdXR0b25JZCA9IGAke3RoaXMuZ2V0VmlldygpLmdldElkKCl9LS0ke3NJZH1gLFxuXHRcdFx0b0J1dHRvbiA9ICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldEZvb3RlcigpIGFzIGFueSkuZ2V0Q29udGVudCgpLmZpbmQoZnVuY3Rpb24gKG9FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9FbGVtZW50LmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC5tLkJ1dHRvblwiICYmIG9FbGVtZW50LmdldElkKCkgPT09IHNCdXR0b25JZDtcblx0XHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLmZpcmVCdXR0b25QcmVzcyhvQnV0dG9uKTtcblx0fVxuXG5cdF9leGVjdXRlVGFiU2hvcnRDdXQob0V4ZWN1dGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLFxuXHRcdFx0YVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKSxcblx0XHRcdGlTZWN0aW9uSW5kZXhNYXggPSBhU2VjdGlvbnMubGVuZ3RoIC0gMSxcblx0XHRcdHNDb21tYW5kID0gb0V4ZWN1dGlvbi5vU291cmNlLmdldENvbW1hbmQoKTtcblx0XHRsZXQgbmV3U2VjdGlvbixcblx0XHRcdGlTZWxlY3RlZFNlY3Rpb25JbmRleCA9IG9PYmplY3RQYWdlLmluZGV4T2ZTZWN0aW9uKHRoaXMuYnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSkgYXMgT2JqZWN0UGFnZVNlY3Rpb24pO1xuXHRcdGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggIT09IC0xICYmIGlTZWN0aW9uSW5kZXhNYXggPiAwKSB7XG5cdFx0XHRpZiAoc0NvbW1hbmQgPT09IFwiTmV4dFRhYlwiKSB7XG5cdFx0XHRcdGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggPD0gaVNlY3Rpb25JbmRleE1heCAtIDEpIHtcblx0XHRcdFx0XHRuZXdTZWN0aW9uID0gYVNlY3Rpb25zWysraVNlbGVjdGVkU2VjdGlvbkluZGV4XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggIT09IDApIHtcblx0XHRcdFx0Ly8gUHJldmlvdXNUYWJcblx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1stLWlTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChuZXdTZWN0aW9uKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihuZXdTZWN0aW9uKTtcblx0XHRcdFx0bmV3U2VjdGlvbi5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9nZXRGb290ZXJWaXNpYmlsaXR5KCkge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIsIGZhbHNlKTtcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRNZXNzYWdlTWFuYWdlcigpXG5cdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdGlmIChvTWVzc2FnZS52YWxpZGF0aW9uICYmIG9NZXNzYWdlLnR5cGUgPT09IFwiRXJyb3JcIiAmJiBvTWVzc2FnZS50YXJnZXQuaW5kZXhPZihzVmlld0lkKSA+IC0xKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdF9zaG93TWVzc2FnZVBvcG92ZXIoZXJyPzogYW55LCBvUmV0PzogYW55KSB7XG5cdFx0aWYgKGVycikge1xuXHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0fVxuXHRcdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlVmlldyA9IHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0PyByb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0VmlldygpXG5cdFx0XHQ6ICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250YWluZXIoKSBhcyBhbnkpLmdldEN1cnJlbnRQYWdlKCk7XG5cdFx0aWYgKCFjdXJyZW50UGFnZVZpZXcuaXNBKFwic2FwLm0uTWVzc2FnZVBhZ2VcIikpIHtcblx0XHRcdGNvbnN0IG9NZXNzYWdlQnV0dG9uID0gdGhpcy5tZXNzYWdlQnV0dG9uLFxuXHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIgPSBvTWVzc2FnZUJ1dHRvbi5vTWVzc2FnZVBvcG92ZXIsXG5cdFx0XHRcdG9JdGVtQmluZGluZyA9IG9NZXNzYWdlUG9wb3Zlci5nZXRCaW5kaW5nKFwiaXRlbXNcIik7XG5cblx0XHRcdGlmIChvSXRlbUJpbmRpbmcuZ2V0TGVuZ3RoKCkgPiAwICYmICFvTWVzc2FnZVBvcG92ZXIuaXNPcGVuKCkpIHtcblx0XHRcdFx0b01lc3NhZ2VCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdFx0Ly8gd29ya2Fyb3VuZCB0byBlbnN1cmUgdGhhdCBvTWVzc2FnZUJ1dHRvbiBpcyByZW5kZXJlZCB3aGVuIG9wZW5CeSBpcyBjYWxsZWRcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b01lc3NhZ2VQb3BvdmVyLm9wZW5CeShvTWVzc2FnZUJ1dHRvbik7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1JldDtcblx0fVxuXG5cdF9lZGl0RG9jdW1lbnQob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIik7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Nb2RlbCk7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuZWRpdERvY3VtZW50LmFwcGx5KHRoaXMuZWRpdEZsb3csIFtvQ29udGV4dF0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob01vZGVsKTtcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIF92YWxpZGF0ZURvY3VtZW50KCk6IFByb21pc2U8dm9pZCB8IGFueVtdIHwgT0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0Y29uc3QgY29udHJvbCA9IENvcmUuYnlJZChDb3JlLmdldEN1cnJlbnRGb2N1c2VkQ29udHJvbElkKCkpO1xuXHRcdGNvbnN0IGNvbnRleHQgPSBjb250cm9sPy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKGNvbnRleHQgJiYgIWNvbnRleHQuaXNUcmFuc2llbnQoKSkge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNTZXJ2aWNlID0gYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdFx0Y29uc3QgZW50aXR5VHlwZSA9IHNpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0XHRjb25zdCBnbG9iYWxTaWRlRWZmZWN0cyA9IGVudGl0eVR5cGUgPyBzaWRlRWZmZWN0c1NlcnZpY2UuZ2V0R2xvYmFsT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKSA6IFtdO1xuXHRcdFx0Ly8gSWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGdsb2JhbCBTaWRlRWZmZWN0cyBmb3IgdGhlIHJlbGF0ZWQgZW50aXR5LCBleGVjdXRlIGl0L3RoZW1cblx0XHRcdGlmIChnbG9iYWxTaWRlRWZmZWN0cy5sZW5ndGgpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5lZGl0Rmxvdy5zeW5jVGFzaygpO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoZ2xvYmFsU2lkZUVmZmVjdHMubWFwKChzaWRlRWZmZWN0cykgPT4gdGhpcy5fc2lkZUVmZmVjdHMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzLCBjb250ZXh0KSkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZHJhZnRSb290Q29udGV4dCA9IChhd2FpdCBDb21tb25VdGlscy5jcmVhdGVSb290Q29udGV4dChQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCB0aGlzLmdldFZpZXcoKSwgYXBwQ29tcG9uZW50KSkgYXMgQ29udGV4dDtcblx0XHRcdC8vRXhlY3V0ZSB0aGUgZHJhZnRWYWxpZGF0aW9uIGlmIHRoZXJlIGlzIG5vIGdsb2JhbFNpZGVFZmZlY3RzIChpZ25vcmUgRVRhZ3MgaW4gY29sbGFib3JhdGlvbiBkcmFmdClcblx0XHRcdGlmIChkcmFmdFJvb3RDb250ZXh0KSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdFx0cmV0dXJuIGRyYWZ0LmV4ZWN1dGVEcmFmdFZhbGlkYXRpb24oZHJhZnRSb290Q29udGV4dCwgYXBwQ29tcG9uZW50LCBpc0Nvbm5lY3RlZCh0aGlzLmdldFZpZXcoKSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgX3NhdmVEb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSxcblx0XHRcdGFXYWl0Q3JlYXRlRG9jdW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdC8vIGluZGljYXRlcyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm93IGluIHRoZSBPUFxuXHRcdGxldCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IGZhbHNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTW9kZWwpO1xuXHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5mb3JFYWNoKChvVGFibGU6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcob1RhYmxlKTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogb1RhYmxlLmRhdGEoXCJjcmVhdGlvbk1vZGVcIiksXG5cdFx0XHRcdGNyZWF0aW9uUm93OiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKSxcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IG9UYWJsZS5kYXRhKFwiY3JlYXRlQXRFbmRcIikgPT09IFwidHJ1ZVwiXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgYkNyZWF0ZURvY3VtZW50ID1cblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSAmJlxuXHRcdFx0XHRPYmplY3Qua2V5cyhtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpKS5sZW5ndGggPiAxO1xuXHRcdFx0aWYgKGJDcmVhdGVEb2N1bWVudCkge1xuXHRcdFx0XHQvLyB0aGUgYlNraXBTaWRlRWZmZWN0cyBpcyBhIHBhcmFtZXRlciBjcmVhdGVkIHdoZW4gd2UgY2xpY2sgdGhlIHNhdmUga2V5LiBJZiB3ZSBwcmVzcyB0aGlzIGtleVxuXHRcdFx0XHQvLyB3ZSBkb24ndCBleGVjdXRlIHRoZSBoYW5kbGVTaWRlRWZmZWN0cyBmdW5jaXRvbiB0byBhdm9pZCBiYXRjaCByZWR1bmRhbmN5XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJTa2lwU2lkZUVmZmVjdHMgPSB0cnVlO1xuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IHRydWU7XG5cdFx0XHRcdGFXYWl0Q3JlYXRlRG9jdW1lbnRzLnB1c2goXG5cdFx0XHRcdFx0dGhpcy5lZGl0Rmxvdy5jcmVhdGVEb2N1bWVudChvQmluZGluZywgbVBhcmFtZXRlcnMpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYUJpbmRpbmdzID0gYXdhaXQgUHJvbWlzZS5hbGwoYVdhaXRDcmVhdGVEb2N1bWVudHMpO1xuXHRcdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yOiBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YmluZGluZ3M6IGFCaW5kaW5nc1xuXHRcdFx0fTtcblx0XHRcdC8vIFdlIG5lZWQgdG8gZWl0aGVyIHJlamVjdCBvciByZXNvbHZlIGEgcHJvbWlzZSBoZXJlIGFuZCByZXR1cm4gaXQgc2luY2UgdGhpcyBzYXZlXG5cdFx0XHQvLyBmdW5jdGlvbiBpcyBub3Qgb25seSBjYWxsZWQgd2hlbiBwcmVzc2luZyB0aGUgc2F2ZSBidXR0b24gaW4gdGhlIGZvb3RlciwgYnV0IGFsc29cblx0XHRcdC8vIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBjcmVhdGUgb3Igc2F2ZSBpbiBhIGRhdGFsb3NzIHBvcHVwLlxuXHRcdFx0Ly8gVGhlIGxvZ2ljIG9mIHRoZSBkYXRhbG9zcyBwb3B1cCBuZWVkcyB0byBkZXRlY3QgaWYgdGhlIHNhdmUgaGFkIGVycm9ycyBvciBub3QgaW4gb3JkZXJcblx0XHRcdC8vIHRvIGRlY2lkZSBpZiB0aGUgc3Vic2VxdWVudCBhY3Rpb24gLSBsaWtlIGEgYmFjayBuYXZpZ2F0aW9uIC0gaGFzIHRvIGJlIGV4ZWN1dGVkIG9yIG5vdC5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZWRpdEZsb3cuc2F2ZURvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdC8vIElmIHRoZSBzYXZlRG9jdW1lbnQgaW4gZWRpdEZsb3cgcmV0dXJucyBlcnJvcnMgd2UgbmVlZFxuXHRcdFx0XHQvLyB0byBzaG93IHRoZSBtZXNzYWdlIHBvcG92ZXIgaGVyZSBhbmQgZW5zdXJlIHRoYXQgdGhlXG5cdFx0XHRcdC8vIGRhdGFsb3NzIGxvZ2ljIGRvZXMgbm90IHBlcmZvcm0gdGhlIGZvbGxvdyB1cCBmdW5jdGlvblxuXHRcdFx0XHQvLyBsaWtlIGUuZy4gYSBiYWNrIG5hdmlnYXRpb24gaGVuY2Ugd2UgcmV0dXJuIGEgcHJvbWlzZSBhbmQgcmVqZWN0IGl0XG5cdFx0XHRcdHRoaXMuX3Nob3dNZXNzYWdlUG9wb3ZlcihlcnJvcik7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTW9kZWwpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Nb2RlbCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X21hbmFnZUNvbGxhYm9yYXRpb24oKSB7XG5cdFx0b3Blbk1hbmFnZURpYWxvZyh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRfc2hvd0NvbGxhYm9yYXRpb25Vc2VyRGV0YWlscyhldmVudDogYW55KSB7XG5cdFx0c2hvd1VzZXJEZXRhaWxzKGV2ZW50LCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRfY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uKTsgLy90byBnZXQgdGhlIHJlZmVyZW5jZSBvZiB0aGUgY2FuY2VsIGJ1dHRvbiBmcm9tIGNvbW1hbmQgZXhlY3V0aW9uXG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuY2FuY2VsRG9jdW1lbnQob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0fVxuXG5cdF9hcHBseURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuYXBwbHlEb2N1bWVudChvQ29udGV4dCkuY2F0Y2goKCkgPT4gdGhpcy5fc2hvd01lc3NhZ2VQb3BvdmVyKCkpO1xuXHR9XG5cblx0X3VwZGF0ZVJlbGF0ZWRBcHBzKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBzaG93UmVsYXRlZEFwcHMgPSBvT2JqZWN0UGFnZS5kYXRhKFwic2hvd1JlbGF0ZWRBcHBzXCIpO1xuXHRcdGlmIChzaG93UmVsYXRlZEFwcHMgPT09IFwidHJ1ZVwiIHx8IHNob3dSZWxhdGVkQXBwcyA9PT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdENvbW1vblV0aWxzLnVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyhvT2JqZWN0UGFnZSwgYXBwQ29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHRfZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVBhcmVudEVsZW1lbnQ6IGFueSwgYVN1YnNlY3Rpb246IGFueSwgYUNvbnRyb2xzOiBhbnksIGJJc0NoYXJ0PzogYm9vbGVhbikge1xuXHRcdGZvciAobGV0IGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgYVBhcmVudEVsZW1lbnQubGVuZ3RoOyBlbGVtZW50KyspIHtcblx0XHRcdGxldCBvRWxlbWVudCA9IGFQYXJlbnRFbGVtZW50W2VsZW1lbnRdLmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBhUGFyZW50RWxlbWVudFtlbGVtZW50XS5nZXRDb250ZW50KCk7XG5cdFx0XHRpZiAoYklzQ2hhcnQpIHtcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50Lm1BZ2dyZWdhdGlvbnMgJiYgb0VsZW1lbnQuZ2V0QWdncmVnYXRpb24oXCJpdGVtc1wiKSkge1xuXHRcdFx0XHRcdGNvbnN0IGFJdGVtcyA9IG9FbGVtZW50LmdldEFnZ3JlZ2F0aW9uKFwiaXRlbXNcIik7XG5cdFx0XHRcdFx0YUl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKG9JdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChvSXRlbS5pc0EoXCJzYXAuZmUubWFjcm9zLmNoYXJ0LkNoYXJ0QVBJXCIpKSB7XG5cdFx0XHRcdFx0XHRcdG9FbGVtZW50ID0gb0l0ZW07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5nZXRNYWluQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9FbGVtZW50LmdldE1haW5Db250ZW50KCk7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudFswXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gVGhlIHRhYmxlIG1heSBjdXJyZW50bHkgYmUgc2hvd24gaW4gYSBmdWxsIHNjcmVlbiBkaWFsb2csIHdlIGNhbiB0aGVuIGdldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBUYWJsZUFQSVxuXHRcdFx0Ly8gY29udHJvbCBmcm9tIHRoZSBjdXN0b20gZGF0YSBvZiB0aGUgcGxhY2UgaG9sZGVyIHBhbmVsXG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC5tLlBhbmVsXCIpICYmIG9FbGVtZW50LmRhdGEoXCJGdWxsU2NyZWVuVGFibGVQbGFjZUhvbGRlclwiKSkge1xuXHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmRhdGEoXCJ0YWJsZUFQSXJlZmVyZW5jZVwiKTtcblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLmZlLm1hY3Jvcy50YWJsZS5UYWJsZUFQSVwiKSkge1xuXHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvRWxlbWVudC5nZXRDb250ZW50KCk7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudFswXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdGFDb250cm9scy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLmZlLm1hY3Jvcy5jaGFydC5DaGFydEFQSVwiKSkge1xuXHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvRWxlbWVudC5nZXRDb250ZW50KCk7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudFswXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLkNoYXJ0XCIpKSB7XG5cdFx0XHRcdGFDb250cm9scy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0QWxsU3ViU2VjdGlvbnMoKSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGxldCBhU3ViU2VjdGlvbnM6IGFueVtdID0gW107XG5cdFx0b09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRhU3ViU2VjdGlvbnMgPSBhU3ViU2VjdGlvbnMuY29uY2F0KG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBhU3ViU2VjdGlvbnM7XG5cdH1cblxuXHRfZ2V0QWxsQmxvY2tzKCkge1xuXHRcdGxldCBhQmxvY2tzOiBhbnlbXSA9IFtdO1xuXHRcdHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IGFueSkge1xuXHRcdFx0YUJsb2NrcyA9IGFCbG9ja3MuY29uY2F0KG9TdWJTZWN0aW9uLmdldEJsb2NrcygpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYUJsb2Nrcztcblx0fVxuXG5cdF9maW5kVGFibGVzKCkge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYVRhYmxlczogYW55W10gPSBbXTtcblx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFUYWJsZXMpO1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldE1vcmVCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhVGFibGVzKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFUYWJsZXM7XG5cdH1cblxuXHRfZmluZENoYXJ0cygpIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGFDaGFydHM6IGFueVtdID0gW107XG5cdFx0Zm9yIChsZXQgc3ViU2VjdGlvbiA9IDA7IHN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBzdWJTZWN0aW9uKyspIHtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhQ2hhcnRzLCB0cnVlKTtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRNb3JlQmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYUNoYXJ0cywgdHJ1ZSk7XG5cdFx0fVxuXHRcdHJldHVybiBhQ2hhcnRzO1xuXHR9XG5cblx0X2Nsb3NlU2lkZUNvbnRlbnQoKSB7XG5cdFx0dGhpcy5fZ2V0QWxsQmxvY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAob0Jsb2NrOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250ZW50ID0gb0Jsb2NrLmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvQmxvY2suZ2V0Q29udGVudCgpO1xuXHRcdFx0aWYgKG9Db250ZW50ICYmIG9Db250ZW50LmlzQSAmJiBvQ29udGVudC5pc0EoXCJzYXAudWkubGF5b3V0LkR5bmFtaWNTaWRlQ29udGVudFwiKSkge1xuXHRcdFx0XHRpZiAob0NvbnRlbnQuc2V0U2hvd1NpZGVDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRvQ29udGVudC5zZXRTaG93U2lkZUNvbnRlbnQoZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhcnQgQ29udGV4dCBpcyByZXNvbHZlZCBmb3IgMTpuIG1pY3JvY2hhcnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NoYXJ0Q29udGV4dCBUaGUgQ29udGV4dCBvZiB0aGUgTWljcm9DaGFydFxuXHQgKiBAcGFyYW0gc0NoYXJ0UGF0aCBUaGUgY29sbGVjdGlvblBhdGggb2YgdGhlIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBBdHRyaWJ1dGVzIG9mIHRoZSBjaGFydCBDb250ZXh0XG5cdCAqL1xuXHRfZ2V0Q2hhcnRDb250ZXh0RGF0YShvQ2hhcnRDb250ZXh0OiBhbnksIHNDaGFydFBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9DaGFydENvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IG9DaGFydENvbnRleHREYXRhID0gW29Db250ZXh0RGF0YV07XG5cdFx0aWYgKG9DaGFydENvbnRleHQgJiYgc0NoYXJ0UGF0aCkge1xuXHRcdFx0aWYgKG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXSkge1xuXHRcdFx0XHRvQ2hhcnRDb250ZXh0RGF0YSA9IG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXTtcblx0XHRcdFx0ZGVsZXRlIG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXTtcblx0XHRcdFx0b0NoYXJ0Q29udGV4dERhdGEucHVzaChvQ29udGV4dERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb0NoYXJ0Q29udGV4dERhdGE7XG5cdH1cblxuXHQvKipcblx0ICogU2Nyb2xsIHRoZSB0YWJsZXMgdG8gdGhlIHJvdyB3aXRoIHRoZSBzUGF0aFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VDb250cm9sbGVyLmNvbnRyb2xsZXIjX3Njcm9sbFRhYmxlc1RvUm93XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUm93UGF0aCAnc1BhdGggb2YgdGhlIHRhYmxlIHJvdydcblx0ICovXG5cblx0X3Njcm9sbFRhYmxlc1RvUm93KHNSb3dQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAodGhpcy5fZmluZFRhYmxlcyAmJiB0aGlzLl9maW5kVGFibGVzKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVRhYmxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRUYWJsZVNjcm9sbGVyLnNjcm9sbFRhYmxlVG9Sb3coYVRhYmxlc1tpXSwgc1Jvd1BhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gbWVyZ2Ugc2VsZWN0ZWQgY29udGV4dHMgYW5kIGZpbHRlcnMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfbWVyZ2VNdWx0aXBsZUNvbnRleHRzXG5cdCAqIEBwYXJhbSBvUGFnZUNvbnRleHQgUGFnZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBhTGluZUNvbnRleHQgU2VsZWN0ZWQgQ29udGV4dHNcblx0ICogQHBhcmFtIHNDaGFydFBhdGggQ29sbGVjdGlvbiBuYW1lIG9mIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyBTZWxlY3Rpb24gVmFyaWFudCBPYmplY3Rcblx0ICovXG5cdF9tZXJnZU11bHRpcGxlQ29udGV4dHMob1BhZ2VDb250ZXh0OiBDb250ZXh0LCBhTGluZUNvbnRleHQ6IGFueVtdLCBzQ2hhcnRQYXRoOiBzdHJpbmcpIHtcblx0XHRsZXQgYUF0dHJpYnV0ZXM6IGFueVtdID0gW10sXG5cdFx0XHRhUGFnZUF0dHJpYnV0ZXMgPSBbXSxcblx0XHRcdG9Db250ZXh0LFxuXHRcdFx0c01ldGFQYXRoTGluZTogc3RyaW5nLFxuXHRcdFx0c1BhdGhMaW5lO1xuXG5cdFx0Y29uc3Qgc1BhZ2VQYXRoID0gb1BhZ2VDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1BhZ2VDb250ZXh0ICYmIG9QYWdlQ29udGV4dC5nZXRNb2RlbCgpICYmIG9QYWdlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aFBhZ2UgPSBvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhZ2VQYXRoKS5yZXBsYWNlKC9eXFwvKi8sIFwiXCIpO1xuXG5cdFx0Ly8gR2V0IHNpbmdsZSBsaW5lIGNvbnRleHQgaWYgbmVjZXNzYXJ5XG5cdFx0aWYgKGFMaW5lQ29udGV4dCAmJiBhTGluZUNvbnRleHQubGVuZ3RoKSB7XG5cdFx0XHRvQ29udGV4dCA9IGFMaW5lQ29udGV4dFswXTtcblx0XHRcdHNQYXRoTGluZSA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdHNNZXRhUGF0aExpbmUgPSBvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGhMaW5lKS5yZXBsYWNlKC9eXFwvKi8sIFwiXCIpO1xuXG5cdFx0XHRhTGluZUNvbnRleHQuZm9yRWFjaCgob1NpbmdsZUNvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoc0NoYXJ0UGF0aCkge1xuXHRcdFx0XHRcdGNvbnN0IG9DaGFydENvbnRleHREYXRhID0gdGhpcy5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvU2luZ2xlQ29udGV4dCwgc0NoYXJ0UGF0aCk7XG5cdFx0XHRcdFx0aWYgKG9DaGFydENvbnRleHREYXRhKSB7XG5cdFx0XHRcdFx0XHRhQXR0cmlidXRlcyA9IG9DaGFydENvbnRleHREYXRhLm1hcChmdW5jdGlvbiAob1N1YkNoYXJ0Q29udGV4dERhdGE6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhOiBvU3ViQ2hhcnRDb250ZXh0RGF0YSxcblx0XHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGAke3NNZXRhUGF0aFBhZ2V9LyR7c0NoYXJ0UGF0aH1gXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUF0dHJpYnV0ZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb250ZXh0RGF0YTogb1NpbmdsZUNvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNNZXRhUGF0aExpbmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGFQYWdlQXR0cmlidXRlcy5wdXNoKHtcblx0XHRcdGNvbnRleHREYXRhOiBvUGFnZUNvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRlbnRpdHlTZXQ6IHNNZXRhUGF0aFBhZ2Vcblx0XHR9KTtcblx0XHQvLyBBZGRpbmcgUGFnZSBDb250ZXh0IHRvIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0YVBhZ2VBdHRyaWJ1dGVzID0gdGhpcy5faW50ZW50QmFzZWROYXZpZ2F0aW9uLnJlbW92ZVNlbnNpdGl2ZURhdGEoYVBhZ2VBdHRyaWJ1dGVzLCBzTWV0YVBhdGhQYWdlKTtcblx0XHRjb25zdCBvUGFnZUxldmVsU1YgPSBDb21tb25VdGlscy5hZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudChuZXcgU2VsZWN0aW9uVmFyaWFudCgpLCBhUGFnZUF0dHJpYnV0ZXMsIHRoaXMuZ2V0VmlldygpKTtcblx0XHRhQXR0cmlidXRlcyA9IHRoaXMuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5yZW1vdmVTZW5zaXRpdmVEYXRhKGFBdHRyaWJ1dGVzLCBzTWV0YVBhdGhQYWdlKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudDogb1BhZ2VMZXZlbFNWLFxuXHRcdFx0YXR0cmlidXRlczogYUF0dHJpYnV0ZXNcblx0XHR9O1xuXHR9XG5cblx0X2dldEJhdGNoR3JvdXBzRm9yVmlldygpIHtcblx0XHRjb25zdCBvVmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSxcblx0XHRcdG9Db25maWd1cmF0aW9ucyA9IG9WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbixcblx0XHRcdGFDb25maWd1cmF0aW9ucyA9IG9Db25maWd1cmF0aW9ucyAmJiBPYmplY3Qua2V5cyhvQ29uZmlndXJhdGlvbnMpLFxuXHRcdFx0YUJhdGNoR3JvdXBzID0gW1wiJGF1dG8uSGVyb2VzXCIsIFwiJGF1dG8uRGVjb3JhdGlvblwiLCBcIiRhdXRvLldvcmtlcnNcIl07XG5cblx0XHRpZiAoYUNvbmZpZ3VyYXRpb25zICYmIGFDb25maWd1cmF0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhQ29uZmlndXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9Db25maWd1cmF0aW9uID0gb0NvbmZpZ3VyYXRpb25zW3NLZXldO1xuXHRcdFx0XHRpZiAob0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQgPT09IFwiTG9uZ1J1bm5lcnNcIikge1xuXHRcdFx0XHRcdGFCYXRjaEdyb3Vwcy5wdXNoKFwiJGF1dG8uTG9uZ1J1bm5lcnNcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUJhdGNoR3JvdXBzO1xuXHR9XG5cblx0Lypcblx0ICogUmVzZXQgQnJlYWRjcnVtYiBsaW5rc1xuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtzYXAubS5CcmVhZGNydW1ic30gW29Tb3VyY2VdIHBhcmVudCBjb250cm9sXG5cdCAqIEBkZXNjcmlwdGlvbiBVc2VkIHdoZW4gY29udGV4dCBvZiB0aGUgb2JqZWN0IHBhZ2UgY2hhbmdlcy5cblx0ICogICAgICAgICAgICAgIFRoaXMgZXZlbnQgY2FsbGJhY2sgaXMgYXR0YWNoZWQgdG8gbW9kZWxDb250ZXh0Q2hhbmdlXG5cdCAqICAgICAgICAgICAgICBldmVudCBvZiB0aGUgQnJlYWRjcnVtYiBjb250cm9sIHRvIGNhdGNoIGNvbnRleHQgY2hhbmdlLlxuXHQgKiAgICAgICAgICAgICAgVGhlbiBlbGVtZW50IGJpbmRpbmcgYW5kIGhyZWZzIGFyZSB1cGRhdGVkIGZvciBlYWNoIGxpbmsuXG5cdCAqXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZXhwZXJpbWVudGFsXG5cdCAqL1xuXHRhc3luYyBfc2V0QnJlYWRjcnVtYkxpbmtzKG9Tb3VyY2U6IEJyZWFkQ3J1bWJzKSB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdGFQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW10sXG5cdFx0XHRhU2tpcFBhcmFtZXRlcml6ZWQ6IGFueVtdID0gW10sXG5cdFx0XHRzTmV3UGF0aCA9IG9Db250ZXh0Py5nZXRQYXRoKCksXG5cdFx0XHRhUGF0aFBhcnRzID0gc05ld1BhdGg/LnNwbGl0KFwiL1wiKSA/PyBbXSxcblx0XHRcdG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50ICYmIG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0bGV0IHNQYXRoID0gXCJcIjtcblx0XHR0cnkge1xuXHRcdFx0YVBhdGhQYXJ0cy5zaGlmdCgpO1xuXHRcdFx0YVBhdGhQYXJ0cy5zcGxpY2UoLTEsIDEpO1xuXHRcdFx0YVBhdGhQYXJ0cy5mb3JFYWNoKGZ1bmN0aW9uIChzUGF0aFBhcnQ6IGFueSkge1xuXHRcdFx0XHRzUGF0aCArPSBgLyR7c1BhdGhQYXJ0fWA7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHRcdFx0XHRjb25zdCBzUGFyYW1ldGVyUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHRcdFx0XHRjb25zdCBiUmVzdWx0Q29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXJhbWV0ZXJQYXRofS9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlJlc3VsdENvbnRleHRgKTtcblx0XHRcdFx0aWYgKGJSZXN1bHRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgZG9udCBuZWVkIHRvIGNyZWF0ZSBhIGJyZWFkY3J1bWIgZm9yIFBhcmFtZXRlciBwYXRoXG5cdFx0XHRcdFx0YVNraXBQYXJhbWV0ZXJpemVkLnB1c2goMSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFTa2lwUGFyYW1ldGVyaXplZC5wdXNoKDApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFQcm9taXNlcy5wdXNoKG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0VGl0bGVJbmZvRnJvbVBhdGgoc1BhdGgpKTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgdGl0bGVIaWVyYXJjaHlJbmZvczogYW55W10gPSBhd2FpdCBQcm9taXNlLmFsbChhUHJvbWlzZXMpO1xuXHRcdFx0bGV0IGlkeCwgaGllcmFyY2h5UG9zaXRpb24sIG9MaW5rO1xuXHRcdFx0Zm9yIChjb25zdCB0aXRsZUhpZXJhcmNoeUluZm8gb2YgdGl0bGVIaWVyYXJjaHlJbmZvcykge1xuXHRcdFx0XHRoaWVyYXJjaHlQb3NpdGlvbiA9IHRpdGxlSGllcmFyY2h5SW5mb3MuaW5kZXhPZih0aXRsZUhpZXJhcmNoeUluZm8pO1xuXHRcdFx0XHRpZHggPSBoaWVyYXJjaHlQb3NpdGlvbiAtIGFTa2lwUGFyYW1ldGVyaXplZFtoaWVyYXJjaHlQb3NpdGlvbl07XG5cdFx0XHRcdG9MaW5rID0gb1NvdXJjZS5nZXRMaW5rcygpW2lkeF0gPyBvU291cmNlLmdldExpbmtzKClbaWR4XSA6IG5ldyBMaW5rKCk7XG5cdFx0XHRcdC8vc0N1cnJlbnRFbnRpdHkgaXMgYSBmYWxsYmFjayB2YWx1ZSBpbiBjYXNlIG9mIGVtcHR5IHRpdGxlXG5cdFx0XHRcdG9MaW5rLnNldFRleHQodGl0bGVIaWVyYXJjaHlJbmZvLnN1YnRpdGxlIHx8IHRpdGxlSGllcmFyY2h5SW5mby50aXRsZSk7XG5cdFx0XHRcdC8vV2UgYXBwbHkgYW4gYWRkaXRpb25hbCBlbmNvZGVVUkkgaW4gY2FzZSBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgKGllIFwiL1wiKSB1c2VkIGluIHRoZSB1cmwgdGhyb3VnaCB0aGUgc2VtYW50aWMga2V5c1xuXHRcdFx0XHRvTGluay5zZXRIcmVmKGVuY29kZVVSSSh0aXRsZUhpZXJhcmNoeUluZm8uaW50ZW50KSk7XG5cdFx0XHRcdGlmICghb1NvdXJjZS5nZXRMaW5rcygpW2lkeF0pIHtcblx0XHRcdFx0XHRvU291cmNlLmFkZExpbmsob0xpbmspO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyB0aGUgYnJlYWRjcnVtYiBsaW5rczpcIiArIGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHRfY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbigpIHtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgb0RhdGFQb2ludHMgPSBDb21tb25VdGlscy5nZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24oXG5cdFx0XHRvVmlldy5nZXRWaWV3RGF0YSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldE91dGJvdW5kcygpXG5cdFx0KTtcblx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdGNvbnN0IG9QYWdlQ29udGV4dCA9IG9WaWV3ICYmIChvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImlzSGVhZGVyRFBMaW5rVmlzaWJsZVwiLCB7fSk7XG5cdFx0aWYgKG9QYWdlQ29udGV4dCkge1xuXHRcdFx0b1BhZ2VDb250ZXh0XG5cdFx0XHRcdC5yZXF1ZXN0T2JqZWN0KClcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9EYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRmbkdldExpbmtzKG9EYXRhUG9pbnRzLCBvRGF0YSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgcmV0cmlldmUgdGhlIGxpbmtzIGZyb20gdGhlIHNoZWxsIHNlcnZpY2VcIiwgb0Vycm9yKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9FcnJvclxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuT25FcnJvcihvRXJyb3I6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKG9FcnJvcik7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZm5TZXRMaW5rRW5hYmxlbWVudChpZDogc3RyaW5nLCBhU3VwcG9ydGVkTGlua3M6IGFueSkge1xuXHRcdFx0Y29uc3Qgc0xpbmtJZCA9IGlkO1xuXHRcdFx0Ly8gcHJvY2VzcyB2aWFibGUgbGlua3MgZnJvbSBnZXRMaW5rcyBmb3IgYWxsIGRhdGFwb2ludHMgaGF2aW5nIG91dGJvdW5kXG5cdFx0XHRpZiAoYVN1cHBvcnRlZExpbmtzICYmIGFTdXBwb3J0ZWRMaW5rcy5sZW5ndGggPT09IDEgJiYgYVN1cHBvcnRlZExpbmtzWzBdLnN1cHBvcnRlZCkge1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoYGlzSGVhZGVyRFBMaW5rVmlzaWJsZS8ke3NMaW5rSWR9YCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9TdWJEYXRhUG9pbnRzXG5cdFx0ICogQHBhcmFtIG9QYWdlRGF0YVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuR2V0TGlua3Mob1N1YkRhdGFQb2ludHM6IGFueSwgb1BhZ2VEYXRhOiBhbnkpIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIGluIG9TdWJEYXRhUG9pbnRzKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhUG9pbnQgPSBvU3ViRGF0YVBvaW50c1tzSWRdO1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zOiBhbnkgPSB7fTtcblx0XHRcdFx0Y29uc3Qgb0xpbmsgPSBvVmlldy5ieUlkKHNJZCk7XG5cdFx0XHRcdGlmICghb0xpbmspIHtcblx0XHRcdFx0XHQvLyBmb3IgZGF0YSBwb2ludHMgY29uZmlndXJlZCBpbiBhcHAgZGVzY3JpcHRvciBidXQgbm90IGFubm90YXRlZCBpbiB0aGUgaGVhZGVyXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb0xpbmtDb250ZXh0ID0gb0xpbmsuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgb0xpbmtEYXRhOiBhbnkgPSBvTGlua0NvbnRleHQgJiYgb0xpbmtDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgb01peGVkQ29udGV4dDogYW55ID0gbWVyZ2Uoe30sIG9QYWdlRGF0YSwgb0xpbmtEYXRhKTtcblx0XHRcdFx0Ly8gcHJvY2VzcyBzZW1hbnRpYyBvYmplY3QgbWFwcGluZ3Ncblx0XHRcdFx0aWYgKG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0TWFwcGluZyA9IG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3RNYXBwaW5nO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBpbiBhU2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWFwcGluZyA9IGFTZW1hbnRpY09iamVjdE1hcHBpbmdbaXRlbV07XG5cdFx0XHRcdFx0XHRjb25zdCBzTWFpblByb3BlcnR5ID0gb01hcHBpbmdbXCJMb2NhbFByb3BlcnR5XCJdW1wiJFByb3BlcnR5UGF0aFwiXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYXBwZWRQcm9wZXJ0eSA9IG9NYXBwaW5nW1wiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXTtcblx0XHRcdFx0XHRcdGlmIChzTWFpblByb3BlcnR5ICE9PSBzTWFwcGVkUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9NaXhlZENvbnRleHQuaGFzT3duUHJvcGVydHkoc01haW5Qcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3TWFwcGluZzogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0b05ld01hcHBpbmdbc01hcHBlZFByb3BlcnR5XSA9IG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdFx0b01peGVkQ29udGV4dCA9IG1lcmdlKHt9LCBvTWl4ZWRDb250ZXh0LCBvTmV3TWFwcGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob01peGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgc0tleSBpbiBvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRpZiAoc0tleS5pbmRleE9mKFwiX1wiKSAhPT0gMCAmJiBzS2V5LmluZGV4T2YoXCJvZGF0YS5jb250ZXh0XCIpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRvUGFyYW1zW3NLZXldID0gb01peGVkQ29udGV4dFtzS2V5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gdmFsaWRhdGUgaWYgYSBsaW5rIG11c3QgYmUgcmVuZGVyZWRcblx0XHRcdFx0b1NoZWxsU2VydmljZXNcblx0XHRcdFx0XHQuaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0OiB7XG5cdFx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uOiBvRGF0YVBvaW50LmFjdGlvblxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRwYXJhbXM6IG9QYXJhbXNcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdKVxuXHRcdFx0XHRcdC50aGVuKChhTGlua3MpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBmblNldExpbmtFbmFibGVtZW50KHNJZCwgYUxpbmtzKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmbk9uRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGhhbmRsZXJzID0ge1xuXHRcdC8qKlxuXHRcdCAqIEludm9rZXMgdGhlIHBhZ2UgcHJpbWFyeSBhY3Rpb24gb24gcHJlc3Mgb2YgQ3RybCtFbnRlci5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgcGFnZSBjb250cm9sbGVyXG5cdFx0ICogQHBhcmFtIG9WaWV3XG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgY2FsbGVkXG5cdFx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY29udGV4dHNdIE1hbmRhdG9yeSBmb3IgYSBib3VuZCBhY3Rpb24sIGVpdGhlciBvbmUgY29udGV4dCBvciBhbiBhcnJheSB3aXRoIGNvbnRleHRzIGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIGNhbGxlZFxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb247IGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9uc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25WaXNpYmxlXSBUaGUgdmlzaWJpbGl0eSBvZiBzZW1hdGljIHBvc2l0aXZlIGFjdGlvblxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25FbmFibGVkXSBUaGUgZW5hYmxlbWVudCBvZiBzZW1hbnRpYyBwb3NpdGl2ZSBhY3Rpb25cblx0XHQgKiBAcGFyYW0gW21Db25kaXRpb25zLmVkaXRBY3Rpb25WaXNpYmxlXSBUaGUgRWRpdCBidXR0b24gdmlzaWJpbGl0eVxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnMuZWRpdEFjdGlvbkVuYWJsZWRdIFRoZSBlbmFibGVtZW50IG9mIEVkaXQgYnV0dG9uXG5cdFx0ICogQHVpNS1yZXN0cmljdGVkXG5cdFx0ICogQGZpbmFsXG5cdFx0ICovXG5cdFx0b25QcmltYXJ5QWN0aW9uKFxuXHRcdFx0b0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLFxuXHRcdFx0b1ZpZXc6IFZpZXcsXG5cdFx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcsXG5cdFx0XHRtUGFyYW1ldGVyczogdW5rbm93bixcblx0XHRcdG1Db25kaXRpb25zOiB7XG5cdFx0XHRcdHBvc2l0aXZlQWN0aW9uVmlzaWJsZTogYm9vbGVhbjtcblx0XHRcdFx0cG9zaXRpdmVBY3Rpb25FbmFibGVkOiBib29sZWFuO1xuXHRcdFx0XHRlZGl0QWN0aW9uVmlzaWJsZTogYm9vbGVhbjtcblx0XHRcdFx0ZWRpdEFjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cdFx0XHR9XG5cdFx0KSB7XG5cdFx0XHRjb25zdCBpVmlld0xldmVsID0gKG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudmlld0xldmVsLFxuXHRcdFx0XHRvT2JqZWN0UGFnZSA9IG9Db250cm9sbGVyLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0aWYgKG1Db25kaXRpb25zLnBvc2l0aXZlQWN0aW9uVmlzaWJsZSkge1xuXHRcdFx0XHRpZiAobUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25FbmFibGVkKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuaGFuZGxlcnMub25DYWxsQWN0aW9uKG9WaWV3LCBzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG1Db25kaXRpb25zLmVkaXRBY3Rpb25WaXNpYmxlKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9ucy5lZGl0QWN0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0RG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlWaWV3TGV2ZWwgPT09IDEgJiYgb09iamVjdFBhZ2UuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLl9zYXZlRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX2FwcGx5RG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRvblRhYmxlQ29udGV4dENoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRsZXQgb1RhYmxlOiBhbnk7XG5cdFx0XHR0aGlzLl9maW5kVGFibGVzKCkuc29tZShmdW5jdGlvbiAoX29UYWJsZTogYW55KSB7XG5cdFx0XHRcdGlmIChfb1RhYmxlLmdldFJvd0JpbmRpbmcoKSA9PT0gb1NvdXJjZSkge1xuXHRcdFx0XHRcdG9UYWJsZSA9IF9vVGFibGU7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIHNldCBjb3JyZWN0IGJpbmRpbmcgY29udGV4dCBmb3IgZmFzdCBjcmVhdGlvbiByb3dcblx0XHRcdGNvbnN0IGZhc3RDcmVhdGlvblJvdyA9IG9UYWJsZS5nZXRDcmVhdGlvblJvdygpO1xuXG5cdFx0XHRpZiAoZmFzdENyZWF0aW9uUm93ICYmICFmYXN0Q3JlYXRpb25Sb3cuX29Jbm5lckNyZWF0aW9uUm93Py5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdGNvbnN0IHRhYmxlQmluZGluZyA9IHRoaXMuX2dldFRhYmxlQmluZGluZyhvVGFibGUpO1xuXG5cdFx0XHRcdGlmICghdGFibGVCaW5kaW5nKSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBFeHBlY3RlZCBiaW5kaW5nIG1pc3NpbmcgZm9yIHRhYmxlOiAke29UYWJsZS5nZXRJZCgpfWApO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0YWJsZUJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRcdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSBvYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cblx0XHRcdFx0XHRUYWJsZUhlbHBlci5lbmFibGVGYXN0Q3JlYXRpb25Sb3coXG5cdFx0XHRcdFx0XHRmYXN0Q3JlYXRpb25Sb3csXG5cdFx0XHRcdFx0XHR0YWJsZUJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0dGFibGVCaW5kaW5nLmdldENvbnRleHQoKSxcblx0XHRcdFx0XHRcdG1vZGVsLFxuXHRcdFx0XHRcdFx0b1RhYmxlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgb0N1cnJlbnRBY3Rpb25Qcm9taXNlID0gdGhpcy5lZGl0Rmxvdy5nZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25Qcm9taXNlKSB7XG5cdFx0XHRcdGxldCBhVGFibGVDb250ZXh0czogYW55O1xuXHRcdFx0XHRpZiAob1RhYmxlLmdldFR5cGUoKS5nZXRNZXRhZGF0YSgpLmlzQShcInNhcC51aS5tZGMudGFibGUuR3JpZFRhYmxlVHlwZVwiKSkge1xuXHRcdFx0XHRcdGFUYWJsZUNvbnRleHRzID0gb1NvdXJjZS5nZXRDb250ZXh0cygwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhVGFibGVDb250ZXh0cyA9IG9Tb3VyY2UuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9pZiBjb250ZXh0cyBhcmUgbm90IGZ1bGx5IGxvYWRlZCB0aGUgZ2V0Y29udGV4dHMgZnVuY3Rpb24gYWJvdmUgd2lsbCB0cmlnZ2VyIGEgbmV3IGNoYW5nZSBldmVudCBjYWxsXG5cdFx0XHRcdGlmICghYVRhYmxlQ29udGV4dHNbMF0pIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25Qcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oKG9BY3Rpb25SZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoIW9BY3Rpb25SZXNwb25zZSB8fCBvQWN0aW9uUmVzcG9uc2UuY29udHJvbElkICE9PSBvVGFibGUuc0lkKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25EYXRhID0gb0FjdGlvblJlc3BvbnNlLm9EYXRhO1xuXHRcdFx0XHRcdFx0Y29uc3QgYUtleXMgPSBvQWN0aW9uUmVzcG9uc2Uua2V5cztcblx0XHRcdFx0XHRcdGxldCBpTmV3SXRlbXAgPSAtMTtcblx0XHRcdFx0XHRcdGFUYWJsZUNvbnRleHRzLmZpbmQoZnVuY3Rpb24gKG9UYWJsZUNvbnRleHQ6IGFueSwgaTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9UYWJsZURhdGEgPSBvVGFibGVDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBiQ29tcGFyZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1RhYmxlRGF0YVtzS2V5XSA9PT0gb0FjdGlvbkRhdGFbc0tleV07XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAoYkNvbXBhcmUpIHtcblx0XHRcdFx0XHRcdFx0XHRpTmV3SXRlbXAgPSBpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBiQ29tcGFyZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0aWYgKGlOZXdJdGVtcCAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYURpYWxvZ3MgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0T3BlbkRpYWxvZ3MoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9XG5cdFx0XHRcdFx0XHRcdFx0YURpYWxvZ3MubGVuZ3RoID4gMCA/IGFEaWFsb2dzLmZpbmQoKGRpYWxvZykgPT4gZGlhbG9nLmRhdGEoXCJGdWxsU2NyZWVuRGlhbG9nXCIpICE9PSB0cnVlKSA6IG51bGw7XG5cdFx0XHRcdFx0XHRcdGlmIChvRGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gYnkgZGVzaWduLCBhIHNhcC5tLmRpYWxvZyBzZXQgdGhlIGZvY3VzIHRvIHRoZSBwcmV2aW91cyBmb2N1c2VkIGVsZW1lbnQgd2hlbiBjbG9zaW5nLlxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIHNob3VsZCB3YWl0IGZvciB0aGUgZGlhbG9nIHRvIGJlIGNsb3NlIGJlZm9yZSB0byBmb2N1cyBhbm90aGVyIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmF0dGFjaEV2ZW50T25jZShcImFmdGVyQ2xvc2VcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1RhYmxlLmZvY3VzUm93KGlOZXdJdGVtcCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RhYmxlLmZvY3VzUm93KGlOZXdJdGVtcCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy5lZGl0Rmxvdy5kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBBbiBlcnJvciBvY2N1cnMgd2hpbGUgc2Nyb2xsaW5nIHRvIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW06ICR7ZXJyfWApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gZmlyZSBNb2RlbENvbnRleHRDaGFuZ2Ugb24gdGhlIG1lc3NhZ2UgYnV0dG9uIHdoZW5ldmVyIHRoZSB0YWJsZSBjb250ZXh0IGNoYW5nZXNcblx0XHRcdHRoaXMubWVzc2FnZUJ1dHRvbi5maXJlTW9kZWxDb250ZXh0Q2hhbmdlKCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEludm9rZXMgYW4gYWN0aW9uIC0gYm91bmQvdW5ib3VuZCBhbmQgc2V0cyB0aGUgcGFnZSBkaXJ0eS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvVmlld1xuXHRcdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmNvbnRleHRzXSBNYW5kYXRvcnkgZm9yIGEgYm91bmQgYWN0aW9uLCBlaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyBjYWxsZWRcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOyBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHRcdCAqIEByZXR1cm5zIFRoZSBhY3Rpb24gcHJvbWlzZVxuXHRcdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHRcdCAqIEBmaW5hbFxuXHRcdCAqL1xuXHRcdG9uQ2FsbEFjdGlvbihvVmlldzogYW55LCBzQWN0aW9uTmFtZTogc3RyaW5nLCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5lZGl0Rmxvd1xuXHRcdFx0XHQuaW52b2tlQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycylcblx0XHRcdFx0LnRoZW4ob0NvbnRyb2xsZXIuX3Nob3dNZXNzYWdlUG9wb3Zlci5iaW5kKG9Db250cm9sbGVyLCB1bmRlZmluZWQpKVxuXHRcdFx0XHQuY2F0Y2gob0NvbnRyb2xsZXIuX3Nob3dNZXNzYWdlUG9wb3Zlci5iaW5kKG9Db250cm9sbGVyKSk7XG5cdFx0fSxcblx0XHRvbkRhdGFQb2ludFRpdGxlUHJlc3NlZChvQ29udHJvbGxlcjogYW55LCBvU291cmNlOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb250cm9sQ29uZmlnOiBhbnksIHNDb2xsZWN0aW9uUGF0aDogYW55KSB7XG5cdFx0XHRvTWFuaWZlc3RPdXRib3VuZCA9IHR5cGVvZiBvTWFuaWZlc3RPdXRib3VuZCA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uob01hbmlmZXN0T3V0Ym91bmQpIDogb01hbmlmZXN0T3V0Ym91bmQ7XG5cdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9NYW5pZmVzdE91dGJvdW5kW3NDb250cm9sQ29uZmlnXSxcblx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZyA9IENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0TWFwcGluZyhvVGFyZ2V0SW5mbyksXG5cdFx0XHRcdG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHRcblx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhUGF0aChvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRsZXQgYU5hdmlnYXRpb25EYXRhID0gb0NvbnRyb2xsZXIuX2dldENoYXJ0Q29udGV4dERhdGEob0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCwgc0NvbGxlY3Rpb25QYXRoKTtcblx0XHRcdGxldCBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cblx0XHRcdGFOYXZpZ2F0aW9uRGF0YSA9IGFOYXZpZ2F0aW9uRGF0YS5tYXAoZnVuY3Rpb24gKG9OYXZpZ2F0aW9uRGF0YTogYW55KSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZGF0YTogb05hdmlnYXRpb25EYXRhLFxuXHRcdFx0XHRcdG1ldGFQYXRoOiBzTWV0YVBhdGggKyAoc0NvbGxlY3Rpb25QYXRoID8gYC8ke3NDb2xsZWN0aW9uUGF0aH1gIDogXCJcIilcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKG9UYXJnZXRJbmZvICYmIG9UYXJnZXRJbmZvLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0Y29uc3Qgb1BhcmFtcyA9IG9UYXJnZXRJbmZvLnBhcmFtZXRlcnMgJiYgb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5nZXRPdXRib3VuZFBhcmFtcyhvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9QYXJhbXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvUGFyYW1zO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob1RhcmdldEluZm8gJiYgb1RhcmdldEluZm8uc2VtYW50aWNPYmplY3QgJiYgb1RhcmdldEluZm8uYWN0aW9uKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGUob1RhcmdldEluZm8uc2VtYW50aWNPYmplY3QsIG9UYXJnZXRJbmZvLmFjdGlvbiwge1xuXHRcdFx0XHRcdG5hdmlnYXRpb25Db250ZXh0czogYU5hdmlnYXRpb25EYXRhLFxuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogYVNlbWFudGljT2JqZWN0TWFwcGluZyxcblx0XHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVyc1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIFRyaWdnZXJzIGFuIG91dGJvdW5kIG5hdmlnYXRpb24gd2hlbiBhIHVzZXIgY2hvb3NlcyB0aGUgY2hldnJvbi5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvQ29udHJvbGxlclxuXHRcdCAqIEBwYXJhbSBzT3V0Ym91bmRUYXJnZXQgTmFtZSBvZiB0aGUgb3V0Ym91bmQgdGFyZ2V0IChuZWVkcyB0byBiZSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdClcblx0XHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHRhcmdldCBhcHBcblx0XHQgKiBAcGFyYW0gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHRcdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWQgKD8/PyBtYXliZSBvbmx5IG9uY2UgZmluaXNoZWQ/KVxuXHRcdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHRcdCAqIEBmaW5hbFxuXHRcdCAqL1xuXHRcdG9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldDogc3RyaW5nLCBvQ29udGV4dDogYW55LCBzQ3JlYXRlUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldCwgb0NvbnRleHQsIHNDcmVhdGVQYXRoKTtcblx0XHR9LFxuXG5cdFx0b25OYXZpZ2F0ZUNoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdC8vd2lsbCBiZSBjYWxsZWQgYWx3YXlzIHdoZW4gd2UgY2xpY2sgb24gYSBzZWN0aW9uIHRhYlxuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0dGhpcy5iU2VjdGlvbk5hdmlnYXRlZCA9IHRydWU7XG5cblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSAmJlxuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnNlY3Rpb25MYXlvdXQgPT09IFwiVGFic1wiICYmXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIpID09PSBmYWxzZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1YlNlY3Rpb25cIik7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbb1N1YlNlY3Rpb25dKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVmFyaWFudFNlbGVjdGVkOiBmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpIHtcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9LFxuXHRcdG9uVmFyaWFudFNhdmVkOiBmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpIHtcblx0XHRcdC8vVE9ETzogU2hvdWxkIHJlbW92ZSB0aGlzIHNldFRpbWVPdXQgb25jZSBWYXJpYW50IE1hbmFnZW1lbnQgcHJvdmlkZXMgYW4gYXBpIHRvIGZldGNoIHRoZSBjdXJyZW50IHZhcmlhbnQga2V5IG9uIHNhdmVcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0XHR9LCAyMDAwKTtcblx0XHR9LFxuXHRcdG5hdmlnYXRlVG9TdWJTZWN0aW9uOiBmdW5jdGlvbiAob0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLCB2RGV0YWlsQ29uZmlnOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxDb25maWcgPSB0eXBlb2YgdkRldGFpbENvbmZpZyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UodkRldGFpbENvbmZpZykgOiB2RGV0YWlsQ29uZmlnO1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdFx0XHRsZXQgb1NlY3Rpb247XG5cdFx0XHRsZXQgb1N1YlNlY3Rpb247XG5cdFx0XHRpZiAob0RldGFpbENvbmZpZy5zZWN0aW9uSWQpIHtcblx0XHRcdFx0b1NlY3Rpb24gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnNlY3Rpb25JZCkgYXMgT2JqZWN0UGFnZVNlY3Rpb247XG5cdFx0XHRcdG9TdWJTZWN0aW9uID0gKFxuXHRcdFx0XHRcdG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkXG5cdFx0XHRcdFx0XHQ/IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkKVxuXHRcdFx0XHRcdFx0OiBvU2VjdGlvbiAmJiBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpICYmIG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKClbMF1cblx0XHRcdFx0KSBhcyBPYmplY3RQYWdlU3ViU2VjdGlvbjtcblx0XHRcdH0gZWxzZSBpZiAob0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWQpIHtcblx0XHRcdFx0b1N1YlNlY3Rpb24gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZCkgYXMgT2JqZWN0UGFnZVN1YlNlY3Rpb247XG5cdFx0XHRcdG9TZWN0aW9uID0gb1N1YlNlY3Rpb24gJiYgKG9TdWJTZWN0aW9uLmdldFBhcmVudCgpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRcdH1cblx0XHRcdGlmICghb1NlY3Rpb24gfHwgIW9TdWJTZWN0aW9uIHx8ICFvU2VjdGlvbi5nZXRWaXNpYmxlKCkgfHwgIW9TdWJTZWN0aW9uLmdldFZpc2libGUoKSkge1xuXHRcdFx0XHRjb25zdCBzVGl0bGUgPSBnZXRSZXNvdXJjZU1vZGVsKG9Db250cm9sbGVyKS5nZXRUZXh0KFxuXHRcdFx0XHRcdFwiQ19ST1VUSU5HX05BVklHQVRJT05fRElTQUJMRURfVElUTEVcIixcblx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0KG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0XG5cdFx0XHRcdCk7XG5cdFx0XHRcdExvZy5lcnJvcihzVGl0bGUpO1xuXHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNUaXRsZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zY3JvbGxUb1NlY3Rpb24ob1N1YlNlY3Rpb24uZ2V0SWQoKSk7XG5cdFx0XHRcdC8vIHRyaWdnZXIgaWFwcCBzdGF0ZSBjaGFuZ2Vcblx0XHRcdFx0b09iamVjdFBhZ2UuZmlyZU5hdmlnYXRlKHtcblx0XHRcdFx0XHRzZWN0aW9uOiBvU2VjdGlvbixcblx0XHRcdFx0XHRzdWJTZWN0aW9uOiBvU3ViU2VjdGlvblxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0b25TdGF0ZUNoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0Y2xvc2VPUE1lc3NhZ2VTdHJpcDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLmhpZGVNZXNzYWdlKCk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3RQYWdlQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTZEQSxNQUFNQSxnQkFBZ0IsR0FBR0MsU0FBUyxDQUFDRCxnQkFBZ0I7RUFBQyxJ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