@sapui5/sap.fe.core 1.98.0 → 1.99.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.
- package/package.json +3 -2
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +377 -405
- package/src/sap/fe/core/AnnotationHelper.ts +385 -0
- package/src/sap/fe/core/AppComponent.js +3 -2
- package/src/sap/fe/core/AppStateHandler.js +229 -181
- package/src/sap/fe/core/AppStateHandler.ts +171 -0
- package/src/sap/fe/core/BaseController.js +3 -2
- package/src/sap/fe/core/BusyLocker.js +105 -121
- package/src/sap/fe/core/BusyLocker.ts +98 -0
- package/src/sap/fe/core/CommonUtils.js +2073 -2399
- package/src/sap/fe/core/CommonUtils.ts +2078 -0
- package/src/sap/fe/core/ExtensionAPI.js +3 -2
- package/src/sap/fe/core/PageController.js +84 -125
- package/src/sap/fe/core/PageController.ts +101 -0
- package/src/sap/fe/core/RouterProxy.js +986 -823
- package/src/sap/fe/core/RouterProxy.ts +838 -0
- package/src/sap/fe/core/Synchronization.js +51 -35
- package/src/sap/fe/core/Synchronization.ts +29 -0
- package/src/sap/fe/core/TemplateComponent.js +173 -164
- package/src/sap/fe/core/TemplateComponent.ts +166 -0
- package/src/sap/fe/core/TemplateModel.js +97 -54
- package/src/sap/fe/core/TemplateModel.ts +63 -0
- package/src/sap/fe/core/TransactionHelper.js +1576 -1664
- package/src/sap/fe/core/TransactionHelper.ts +1706 -0
- package/src/sap/fe/core/actions/draft.js +559 -608
- package/src/sap/fe/core/actions/draft.ts +593 -0
- package/src/sap/fe/core/actions/messageHandling.js +545 -514
- package/src/sap/fe/core/actions/messageHandling.ts +532 -0
- package/src/sap/fe/core/actions/nonDraft.js +17 -19
- package/src/sap/fe/core/actions/nonDraft.ts +12 -0
- package/src/sap/fe/core/actions/operations.js +1074 -1215
- package/src/sap/fe/core/actions/operations.ts +1162 -0
- package/src/sap/fe/core/actions/sticky.js +102 -105
- package/src/sap/fe/core/actions/sticky.ts +102 -0
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.js +54 -211
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +279 -11
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -6
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +47 -45
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -3
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +29 -26
- package/src/sap/fe/core/controllerextensions/MassEdit.js +101 -8
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +17 -8
- package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
- package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
- package/src/sap/fe/core/controllerextensions/Paginator.js +3 -2
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -2
- package/src/sap/fe/core/controllerextensions/Routing.js +9 -4
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
- package/src/sap/fe/core/controllerextensions/Share.js +3 -2
- package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +18 -18
- package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
- package/src/sap/fe/core/controls/CommandExecution.js +3 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -2
- package/src/sap/fe/core/controls/FieldWrapper.js +11 -22
- package/src/sap/fe/core/controls/FilterBar.js +3 -2
- package/src/sap/fe/core/controls/FormElementWrapper.js +3 -2
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +3 -2
- package/src/sap/fe/core/converters/ConverterContext.js +2 -2
- package/src/sap/fe/core/converters/ConverterContext.ts +4 -3
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +1 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +39 -26
- package/src/sap/fe/core/converters/ManifestWrapper.ts +9 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +11 -8
- package/src/sap/fe/core/converters/MetaModelConverter.ts +16 -16
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +17 -13
- package/src/sap/fe/core/converters/controls/Common/Action.js +2 -2
- package/src/sap/fe/core/converters/controls/Common/Action.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +4 -2
- package/src/sap/fe/core/converters/controls/Common/Form.ts +16 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +250 -146
- package/src/sap/fe/core/converters/controls/Common/Table.ts +300 -167
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +115 -56
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +120 -74
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +467 -32
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +483 -54
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
- package/src/sap/fe/core/converters/helpers/Aggregation.js +13 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
- package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
- package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.ts +7 -6
- package/src/sap/fe/core/fpm/Component.js +3 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +2 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +7 -4
- package/src/sap/fe/core/helpers/BindingExpression.js +314 -355
- package/src/sap/fe/core/helpers/BindingExpression.ts +317 -391
- package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
- package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
- package/src/sap/fe/core/helpers/EditState.js +81 -84
- package/src/sap/fe/core/helpers/EditState.ts +81 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
- package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -4
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
- package/src/sap/fe/core/helpers/MassEditHelper.js +27 -18
- package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
- package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
- package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
- package/src/sap/fe/core/library.js +4 -3
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +1 -1
- package/src/sap/fe/core/messagebundle.properties +23 -10
- package/src/sap/fe/core/messagebundle_ar.properties +9 -0
- package/src/sap/fe/core/messagebundle_bg.properties +9 -0
- package/src/sap/fe/core/messagebundle_ca.properties +9 -0
- package/src/sap/fe/core/messagebundle_cs.properties +10 -1
- package/src/sap/fe/core/messagebundle_cy.properties +9 -0
- package/src/sap/fe/core/messagebundle_da.properties +9 -0
- package/src/sap/fe/core/messagebundle_de.properties +9 -0
- package/src/sap/fe/core/messagebundle_el.properties +9 -0
- package/src/sap/fe/core/messagebundle_en.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +9 -0
- package/src/sap/fe/core/messagebundle_es.properties +9 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +9 -0
- package/src/sap/fe/core/messagebundle_et.properties +9 -0
- package/src/sap/fe/core/messagebundle_fi.properties +9 -0
- package/src/sap/fe/core/messagebundle_fr.properties +13 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +15 -6
- package/src/sap/fe/core/messagebundle_hi.properties +15 -6
- package/src/sap/fe/core/messagebundle_hr.properties +15 -6
- package/src/sap/fe/core/messagebundle_hu.properties +9 -0
- package/src/sap/fe/core/messagebundle_id.properties +10 -1
- package/src/sap/fe/core/messagebundle_it.properties +9 -0
- package/src/sap/fe/core/messagebundle_iw.properties +9 -0
- package/src/sap/fe/core/messagebundle_ja.properties +9 -0
- package/src/sap/fe/core/messagebundle_kk.properties +15 -6
- package/src/sap/fe/core/messagebundle_ko.properties +9 -0
- package/src/sap/fe/core/messagebundle_lt.properties +9 -0
- package/src/sap/fe/core/messagebundle_lv.properties +15 -6
- package/src/sap/fe/core/messagebundle_ms.properties +14 -5
- package/src/sap/fe/core/messagebundle_nl.properties +9 -0
- package/src/sap/fe/core/messagebundle_no.properties +9 -0
- package/src/sap/fe/core/messagebundle_pl.properties +9 -0
- package/src/sap/fe/core/messagebundle_pt.properties +9 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +9 -0
- package/src/sap/fe/core/messagebundle_ro.properties +9 -0
- package/src/sap/fe/core/messagebundle_ru.properties +9 -0
- package/src/sap/fe/core/messagebundle_sh.properties +11 -2
- package/src/sap/fe/core/messagebundle_sk.properties +9 -0
- package/src/sap/fe/core/messagebundle_sl.properties +15 -6
- package/src/sap/fe/core/messagebundle_sv.properties +9 -0
- package/src/sap/fe/core/messagebundle_th.properties +9 -0
- package/src/sap/fe/core/messagebundle_tr.properties +9 -0
- package/src/sap/fe/core/messagebundle_uk.properties +9 -0
- package/src/sap/fe/core/messagebundle_vi.properties +9 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +9 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +15 -6
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
- package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -899
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +15 -10
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +35 -81
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +46 -94
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -487
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +138 -72
- package/src/sap/fe/core/templating/FilterHelper.ts +139 -71
- package/src/sap/fe/core/templating/UIFormatters.js +31 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +33 -2
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +4 -6
- package/ui5.yaml +0 -3
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common/Table", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/controls/ListReport/VisualFilters", "sap/fe/core/helpers/BindingExpression", "../Common/DataVisualization", "sap/fe/core/converters/helpers/Key", "sap/fe/core/converters/helpers/IssueManager"], function (ManifestSettings, Table, ConfigurableObject, VisualFilters, BindingExpression, DataVisualization, Key, IssueManager) {
|
|
5
|
+
sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common/Table", "sap/fe/core/converters/helpers/ConfigurableObject", "sap/fe/core/converters/controls/ListReport/VisualFilters", "sap/fe/core/helpers/BindingExpression", "../Common/DataVisualization", "sap/fe/core/converters/helpers/Key", "sap/fe/core/converters/helpers/IssueManager", "sap/fe/core/templating/PropertyHelper"], function (ManifestSettings, Table, ConfigurableObject, VisualFilters, BindingExpression, DataVisualization, Key, IssueManager, PropertyHelper) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
9
|
+
var hasValueHelp = PropertyHelper.hasValueHelp;
|
|
9
10
|
var IssueCategory = IssueManager.IssueCategory;
|
|
10
11
|
var IssueSeverity = IssueManager.IssueSeverity;
|
|
11
12
|
var IssueType = IssueManager.IssueType;
|
|
@@ -16,9 +17,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
16
17
|
var getVisualFilters = VisualFilters.getVisualFilters;
|
|
17
18
|
var Placement = ConfigurableObject.Placement;
|
|
18
19
|
var insertCustomElements = ConfigurableObject.insertCustomElements;
|
|
20
|
+
var getTypeConfig = Table.getTypeConfig;
|
|
19
21
|
var isFilteringCaseSensitive = Table.isFilteringCaseSensitive;
|
|
20
22
|
var getSelectionVariantConfiguration = Table.getSelectionVariantConfiguration;
|
|
21
|
-
var TemplateType = ManifestSettings.TemplateType;
|
|
22
23
|
var AvailabilityType = ManifestSettings.AvailabilityType;
|
|
23
24
|
|
|
24
25
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
@@ -87,9 +88,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
87
88
|
var tableFilters = visualization.control.filters;
|
|
88
89
|
var tableSVConfigs = [];
|
|
89
90
|
|
|
90
|
-
for (var
|
|
91
|
-
if (Array.isArray(tableFilters[
|
|
92
|
-
var paths = tableFilters[
|
|
91
|
+
for (var _key in tableFilters) {
|
|
92
|
+
if (Array.isArray(tableFilters[_key].paths)) {
|
|
93
|
+
var paths = tableFilters[_key].paths;
|
|
93
94
|
paths.forEach(function (path) {
|
|
94
95
|
if (path && path.annotationPath && selectionVariantPaths.indexOf(path.annotationPath) === -1) {
|
|
95
96
|
selectionVariantPaths.push(path.annotationPath);
|
|
@@ -160,6 +161,67 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
160
161
|
return undefined;
|
|
161
162
|
};
|
|
162
163
|
|
|
164
|
+
function getModelType(sType) {
|
|
165
|
+
var mDefaultTypeForEdmType = {
|
|
166
|
+
"Edm.Boolean": {
|
|
167
|
+
modelType: "Bool"
|
|
168
|
+
},
|
|
169
|
+
"Edm.Byte": {
|
|
170
|
+
modelType: "Int"
|
|
171
|
+
},
|
|
172
|
+
"Edm.Date": {
|
|
173
|
+
modelType: "Date"
|
|
174
|
+
},
|
|
175
|
+
"Edm.DateTime": {
|
|
176
|
+
modelType: "Date"
|
|
177
|
+
},
|
|
178
|
+
"Edm.DateTimeOffset": {
|
|
179
|
+
modelType: "DateTimeOffset"
|
|
180
|
+
},
|
|
181
|
+
"Edm.Decimal": {
|
|
182
|
+
modelType: "Decimal"
|
|
183
|
+
},
|
|
184
|
+
"Edm.Double": {
|
|
185
|
+
modelType: "Float"
|
|
186
|
+
},
|
|
187
|
+
"Edm.Float": {
|
|
188
|
+
modelType: "Float"
|
|
189
|
+
},
|
|
190
|
+
"Edm.Guid": {
|
|
191
|
+
modelType: "Guid"
|
|
192
|
+
},
|
|
193
|
+
"Edm.Int16": {
|
|
194
|
+
modelType: "Int"
|
|
195
|
+
},
|
|
196
|
+
"Edm.Int32": {
|
|
197
|
+
modelType: "Int"
|
|
198
|
+
},
|
|
199
|
+
"Edm.Int64": {
|
|
200
|
+
modelType: "Int"
|
|
201
|
+
},
|
|
202
|
+
"Edm.SByte": {
|
|
203
|
+
modelType: "Int"
|
|
204
|
+
},
|
|
205
|
+
"Edm.Single": {
|
|
206
|
+
modelType: "Float"
|
|
207
|
+
},
|
|
208
|
+
"Edm.String": {
|
|
209
|
+
modelType: "String"
|
|
210
|
+
},
|
|
211
|
+
"Edm.Time": {
|
|
212
|
+
modelType: "TimeOfDay"
|
|
213
|
+
},
|
|
214
|
+
"Edm.TimeOfDay": {
|
|
215
|
+
modelType: "TimeOfDay"
|
|
216
|
+
},
|
|
217
|
+
"Edm.Stream": {//no corresponding modelType - ignore for filtering
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
return sType && sType in mDefaultTypeForEdmType && mDefaultTypeForEdmType[sType].modelType;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
_exports.getModelType = getModelType;
|
|
224
|
+
|
|
163
225
|
var _getSelectionFields = function (entityType, navigationPath, properties, includeHidden, converterContext) {
|
|
164
226
|
var selectionFieldMap = {};
|
|
165
227
|
|
|
@@ -219,7 +281,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
219
281
|
}
|
|
220
282
|
|
|
221
283
|
if (!filterField) {
|
|
222
|
-
|
|
284
|
+
var _converterContext$get;
|
|
285
|
+
|
|
286
|
+
(_converterContext$get = converterContext.getDiagnostics()) === null || _converterContext$get === void 0 ? void 0 : _converterContext$get.addIssue(IssueCategory.Annotation, IssueSeverity.High, IssueType.MISSING_SELECTIONFIELD);
|
|
223
287
|
} // defined SelectionFields are available by default
|
|
224
288
|
|
|
225
289
|
|
|
@@ -305,24 +369,25 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
305
369
|
* Determines if the FilterBar search field is hidden or not.
|
|
306
370
|
*
|
|
307
371
|
* @param {TableVisualization[]} listReportTables The list report tables
|
|
372
|
+
* @param {ChartVisualization[]} charts The ALP charts
|
|
308
373
|
* @param {ConverterContext} converterContext The converter context
|
|
309
374
|
* @returns {boolean} The information if the FilterBar search field is hidden or not
|
|
310
375
|
*/
|
|
311
376
|
|
|
312
377
|
|
|
313
|
-
var getFilterBarhideBasicSearch = function (listReportTables, converterContext) {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
//
|
|
318
|
-
|
|
378
|
+
var getFilterBarhideBasicSearch = function (listReportTables, charts, converterContext) {
|
|
379
|
+
// Check if charts allow search
|
|
380
|
+
var noSearchInCharts = charts.length === 0 || charts.every(function (chart) {
|
|
381
|
+
return !chart.applySupported.enableSearch;
|
|
382
|
+
}); // Check if all tables are analytical and none of them allow for search
|
|
319
383
|
|
|
384
|
+
var noSearchInTables = listReportTables.length === 0 || listReportTables.every(function (table) {
|
|
385
|
+
return table.enableAnalytics && !table.enableAnalyticsSearch;
|
|
386
|
+
});
|
|
320
387
|
var contextPath = converterContext.getContextPath();
|
|
321
388
|
|
|
322
|
-
if (contextPath &&
|
|
323
|
-
return
|
|
324
|
-
return visualization.enableAnalytics && !visualization.enableAnalyticsSearch;
|
|
325
|
-
});
|
|
389
|
+
if (contextPath && noSearchInCharts && noSearchInTables) {
|
|
390
|
+
return true;
|
|
326
391
|
} else {
|
|
327
392
|
return false;
|
|
328
393
|
}
|
|
@@ -378,6 +443,241 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
378
443
|
var getFilterField = function (propertyPath, converterContext, entityType) {
|
|
379
444
|
return _getFilterField({}, propertyPath, converterContext, entityType);
|
|
380
445
|
};
|
|
446
|
+
|
|
447
|
+
_exports.getFilterField = getFilterField;
|
|
448
|
+
|
|
449
|
+
var getFilterRestrictions = function (oFilterRestrictionsAnnotation, sRestriction) {
|
|
450
|
+
if (sRestriction === "RequiredProperties" || sRestriction === "NonFilterableProperties") {
|
|
451
|
+
var aProps = [];
|
|
452
|
+
|
|
453
|
+
if (oFilterRestrictionsAnnotation && oFilterRestrictionsAnnotation[sRestriction]) {
|
|
454
|
+
aProps = oFilterRestrictionsAnnotation[sRestriction].map(function (oProperty) {
|
|
455
|
+
return oProperty.$PropertyPath || oProperty.value;
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
return aProps;
|
|
460
|
+
} else if (sRestriction === "FilterAllowedExpressions") {
|
|
461
|
+
var mAllowedExpressions = {};
|
|
462
|
+
|
|
463
|
+
if (oFilterRestrictionsAnnotation && oFilterRestrictionsAnnotation.FilterExpressionRestrictions) {
|
|
464
|
+
oFilterRestrictionsAnnotation.FilterExpressionRestrictions.forEach(function (oProperty) {
|
|
465
|
+
//SingleValue | MultiValue | SingleRange | MultiRange | SearchExpression | MultiRangeOrSearchExpression
|
|
466
|
+
if (mAllowedExpressions[oProperty.Property.value]) {
|
|
467
|
+
mAllowedExpressions[oProperty.Property.value].push(oProperty.AllowedExpressions);
|
|
468
|
+
} else {
|
|
469
|
+
mAllowedExpressions[oProperty.Property.value] = [oProperty.AllowedExpressions];
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
return mAllowedExpressions;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return oFilterRestrictionsAnnotation;
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
_exports.getFilterRestrictions = getFilterRestrictions;
|
|
481
|
+
|
|
482
|
+
var getSearchFilterPropertyInfo = function () {
|
|
483
|
+
return {
|
|
484
|
+
name: "$search",
|
|
485
|
+
path: "$search",
|
|
486
|
+
dataType: "Edm.String",
|
|
487
|
+
maxConditions: 1
|
|
488
|
+
};
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
var getEditStateFilterPropertyInfo = function () {
|
|
492
|
+
return {
|
|
493
|
+
name: "$editState",
|
|
494
|
+
path: "$editState",
|
|
495
|
+
groupLabel: "",
|
|
496
|
+
group: "",
|
|
497
|
+
dataType: "Edm.String",
|
|
498
|
+
tooltip: null,
|
|
499
|
+
hiddenFilter: false
|
|
500
|
+
};
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
var getSearchRestrictions = function (converterContext) {
|
|
504
|
+
var _converterContext$get2, _converterContext$get3, _converterContext$get4;
|
|
505
|
+
|
|
506
|
+
return (_converterContext$get2 = converterContext.getEntitySet()) === null || _converterContext$get2 === void 0 ? void 0 : (_converterContext$get3 = _converterContext$get2.annotations) === null || _converterContext$get3 === void 0 ? void 0 : (_converterContext$get4 = _converterContext$get3.Capabilities) === null || _converterContext$get4 === void 0 ? void 0 : _converterContext$get4.SearchRestrictions;
|
|
507
|
+
};
|
|
508
|
+
|
|
509
|
+
var getNavigationRestrictions = function (converterContext, sNavigationPath) {
|
|
510
|
+
var _converterContext$get5, _converterContext$get6, _converterContext$get7;
|
|
511
|
+
|
|
512
|
+
var oNavigationRestrictions = (_converterContext$get5 = converterContext.getEntitySet()) === null || _converterContext$get5 === void 0 ? void 0 : (_converterContext$get6 = _converterContext$get5.annotations) === null || _converterContext$get6 === void 0 ? void 0 : (_converterContext$get7 = _converterContext$get6.Capabilities) === null || _converterContext$get7 === void 0 ? void 0 : _converterContext$get7.NavigationRestrictions;
|
|
513
|
+
var aRestrictedProperties = oNavigationRestrictions && oNavigationRestrictions.RestrictedProperties;
|
|
514
|
+
return aRestrictedProperties && aRestrictedProperties.find(function (oRestrictedProperty) {
|
|
515
|
+
return oRestrictedProperty && oRestrictedProperty.NavigationProperty && (oRestrictedProperty.NavigationProperty.$NavigationPropertyPath === sNavigationPath || oRestrictedProperty.NavigationProperty.value === sNavigationPath);
|
|
516
|
+
});
|
|
517
|
+
};
|
|
518
|
+
|
|
519
|
+
_exports.getNavigationRestrictions = getNavigationRestrictions;
|
|
520
|
+
|
|
521
|
+
var _fetchBasicPropertyInfo = function (oFilterFieldInfo) {
|
|
522
|
+
return {
|
|
523
|
+
key: oFilterFieldInfo.key,
|
|
524
|
+
annotationPath: oFilterFieldInfo.annotationPath,
|
|
525
|
+
conditionPath: oFilterFieldInfo.conditionPath,
|
|
526
|
+
name: oFilterFieldInfo.conditionPath,
|
|
527
|
+
path: oFilterFieldInfo.conditionPath,
|
|
528
|
+
groupLabel: oFilterFieldInfo.groupLabel,
|
|
529
|
+
group: oFilterFieldInfo.group,
|
|
530
|
+
label: oFilterFieldInfo.label,
|
|
531
|
+
tooltip: null,
|
|
532
|
+
hiddenFilter: oFilterFieldInfo.availability === "Hidden",
|
|
533
|
+
removeFromAppState: false,
|
|
534
|
+
hasValueHelp: false,
|
|
535
|
+
display: "Value",
|
|
536
|
+
isParameter: oFilterFieldInfo.isParameter,
|
|
537
|
+
caseSensitive: oFilterFieldInfo.caseSensitive,
|
|
538
|
+
availability: oFilterFieldInfo.availability,
|
|
539
|
+
position: oFilterFieldInfo.position,
|
|
540
|
+
type: oFilterFieldInfo.type
|
|
541
|
+
};
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
var getSpecificAllowedExpression = function (aExpressions) {
|
|
545
|
+
var aAllowedExpressionsPriority = ["SingleValue", "MultiValue", "SingleRange", "MultiRange", "SearchExpression", "MultiRangeOrSearchExpression"];
|
|
546
|
+
aExpressions.sort(function (a, b) {
|
|
547
|
+
return aAllowedExpressionsPriority.indexOf(a) - aAllowedExpressionsPriority.indexOf(b);
|
|
548
|
+
});
|
|
549
|
+
return aExpressions[0];
|
|
550
|
+
};
|
|
551
|
+
|
|
552
|
+
_exports.getSpecificAllowedExpression = getSpecificAllowedExpression;
|
|
553
|
+
|
|
554
|
+
var displayMode = function (oPropertyAnnotations, oCollectionAnnotations) {
|
|
555
|
+
var _oPropertyAnnotations, _oPropertyAnnotations2, _oPropertyAnnotations3, _oPropertyAnnotations4, _oPropertyAnnotations5, _oCollectionAnnotatio;
|
|
556
|
+
|
|
557
|
+
var oTextAnnotation = oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations = oPropertyAnnotations.Common) === null || _oPropertyAnnotations === void 0 ? void 0 : _oPropertyAnnotations.Text,
|
|
558
|
+
oTextArrangmentAnnotation = oTextAnnotation && (oPropertyAnnotations && (oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations2 = oPropertyAnnotations.Common) === null || _oPropertyAnnotations2 === void 0 ? void 0 : (_oPropertyAnnotations3 = _oPropertyAnnotations2.Text) === null || _oPropertyAnnotations3 === void 0 ? void 0 : (_oPropertyAnnotations4 = _oPropertyAnnotations3.annotations) === null || _oPropertyAnnotations4 === void 0 ? void 0 : (_oPropertyAnnotations5 = _oPropertyAnnotations4.UI) === null || _oPropertyAnnotations5 === void 0 ? void 0 : _oPropertyAnnotations5.TextArrangement) || oCollectionAnnotations && (oCollectionAnnotations === null || oCollectionAnnotations === void 0 ? void 0 : (_oCollectionAnnotatio = oCollectionAnnotations.UI) === null || _oCollectionAnnotatio === void 0 ? void 0 : _oCollectionAnnotatio.TextArrangement));
|
|
559
|
+
|
|
560
|
+
if (oTextArrangmentAnnotation) {
|
|
561
|
+
if (oTextArrangmentAnnotation.valueOf() === "UI.TextArrangementType/TextOnly") {
|
|
562
|
+
return "Description";
|
|
563
|
+
} else if (oTextArrangmentAnnotation.valueOf() === "UI.TextArrangementType/TextLast") {
|
|
564
|
+
return "ValueDescription";
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
return "DescriptionValue"; //TextFirst
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
return oTextAnnotation ? "DescriptionValue" : "Value";
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
_exports.displayMode = displayMode;
|
|
574
|
+
|
|
575
|
+
var _fetchPropertyInfo = function (converterContext, oFilterFieldInfo, oTypeConfig) {
|
|
576
|
+
var _converterContext$get8, _oPropertyAnnotations6, _oPropertyAnnotations7, _oPropertyAnnotations8, _oPropertyAnnotations9, _oPropertyAnnotations10;
|
|
577
|
+
|
|
578
|
+
var oPropertyInfo = _fetchBasicPropertyInfo(oFilterFieldInfo);
|
|
579
|
+
|
|
580
|
+
var sAnnotationPath = oFilterFieldInfo.annotationPath;
|
|
581
|
+
|
|
582
|
+
if (!sAnnotationPath) {
|
|
583
|
+
return oPropertyInfo;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
var targetPropertyObject = converterContext.getConverterContextFor(sAnnotationPath).getDataModelObjectPath().targetObject;
|
|
587
|
+
var oProperty = {
|
|
588
|
+
$MaxLength: targetPropertyObject.maxLength,
|
|
589
|
+
$Type: targetPropertyObject.type,
|
|
590
|
+
$kind: targetPropertyObject._type
|
|
591
|
+
};
|
|
592
|
+
var oPropertyAnnotations = targetPropertyObject === null || targetPropertyObject === void 0 ? void 0 : targetPropertyObject.annotations;
|
|
593
|
+
var oCollectionAnnotations = converterContext === null || converterContext === void 0 ? void 0 : (_converterContext$get8 = converterContext.getDataModelObjectPath().targetObject) === null || _converterContext$get8 === void 0 ? void 0 : _converterContext$get8.annotations;
|
|
594
|
+
var oFilterDefaultValue;
|
|
595
|
+
var oFormatOptions = oTypeConfig.formatOptions;
|
|
596
|
+
var oConstraints = oTypeConfig.constraints;
|
|
597
|
+
var bRemoveFromAppState = (oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations6 = oPropertyAnnotations.PersonalData) === null || _oPropertyAnnotations6 === void 0 ? void 0 : _oPropertyAnnotations6.IsPotentiallySensitive) || (oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : oPropertyAnnotations.ExcludeFromNavigationContext) || (oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations7 = oPropertyAnnotations.Analytics) === null || _oPropertyAnnotations7 === void 0 ? void 0 : _oPropertyAnnotations7.Measure);
|
|
598
|
+
var oFilterDefaultValueAnnotation = oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations8 = oPropertyAnnotations.Common) === null || _oPropertyAnnotations8 === void 0 ? void 0 : _oPropertyAnnotations8.FilterDefaultValue;
|
|
599
|
+
|
|
600
|
+
if (oFilterDefaultValueAnnotation) {
|
|
601
|
+
oFilterDefaultValue = oFilterDefaultValueAnnotation["$" + getModelType(oProperty.$Type)];
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
oPropertyInfo = Object.assign(oPropertyInfo, {
|
|
605
|
+
tooltip: (oPropertyAnnotations === null || oPropertyAnnotations === void 0 ? void 0 : (_oPropertyAnnotations9 = oPropertyAnnotations.Common) === null || _oPropertyAnnotations9 === void 0 ? void 0 : (_oPropertyAnnotations10 = _oPropertyAnnotations9.QuickInfo) === null || _oPropertyAnnotations10 === void 0 ? void 0 : _oPropertyAnnotations10.valueOf()) || undefined,
|
|
606
|
+
removeFromAppState: bRemoveFromAppState,
|
|
607
|
+
hasValueHelp: hasValueHelp(targetPropertyObject),
|
|
608
|
+
formatOptions: oFormatOptions,
|
|
609
|
+
constraints: oConstraints,
|
|
610
|
+
display: displayMode(oPropertyAnnotations, oCollectionAnnotations),
|
|
611
|
+
defaultFilterConditions: oFilterDefaultValue ? [{
|
|
612
|
+
fieldPath: oFilterFieldInfo.conditionPath,
|
|
613
|
+
operator: "EQ",
|
|
614
|
+
values: [oFilterDefaultValue]
|
|
615
|
+
}] : undefined
|
|
616
|
+
});
|
|
617
|
+
return oPropertyInfo;
|
|
618
|
+
};
|
|
619
|
+
|
|
620
|
+
var isMultiValue = function (oProperty) {
|
|
621
|
+
var bIsMultiValue = true; //SingleValue | MultiValue | SingleRange | MultiRange | SearchExpression | MultiRangeOrSearchExpression
|
|
622
|
+
|
|
623
|
+
switch (oProperty.filterExpression) {
|
|
624
|
+
case "SearchExpression":
|
|
625
|
+
case "SingleRange":
|
|
626
|
+
case "SingleValue":
|
|
627
|
+
bIsMultiValue = false;
|
|
628
|
+
break;
|
|
629
|
+
|
|
630
|
+
default:
|
|
631
|
+
break;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
if (oProperty.type && oProperty.type.indexOf("Boolean") > 0) {
|
|
635
|
+
bIsMultiValue = false;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
return bIsMultiValue;
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
_exports.isMultiValue = isMultiValue;
|
|
642
|
+
|
|
643
|
+
var getAnnotatedSelectionFieldData = function (converterContext) {
|
|
644
|
+
var _converterContext$get9, _entityType$annotatio3, _entityType$annotatio4;
|
|
645
|
+
|
|
646
|
+
var lrTables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
647
|
+
var annotationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
|
|
648
|
+
// Fetch all selectionVariants defined in the different visualizations and different views (multi table mode)
|
|
649
|
+
var selectionVariants = getSelectionVariants(lrTables, converterContext); // create a map of properties to be used in selection variants
|
|
650
|
+
|
|
651
|
+
var excludedFilterProperties = getExcludedFilterProperties(selectionVariants);
|
|
652
|
+
var entityType = converterContext.getEntityType(); //Filters which has to be added which is part of SV/Default annotations but not present in the SelectionFields
|
|
653
|
+
|
|
654
|
+
var annotatedSelectionFields = annotationPath && ((_converterContext$get9 = converterContext.getEntityTypeAnnotation(annotationPath)) === null || _converterContext$get9 === void 0 ? void 0 : _converterContext$get9.annotation) || ((_entityType$annotatio3 = entityType.annotations) === null || _entityType$annotatio3 === void 0 ? void 0 : (_entityType$annotatio4 = _entityType$annotatio3.UI) === null || _entityType$annotatio4 === void 0 ? void 0 : _entityType$annotatio4.SelectionFields) || []; // create a map of all potential filter fields based on...
|
|
655
|
+
|
|
656
|
+
var filterFields = _objectSpread(_objectSpread({}, _getSelectionFields(entityType, "", entityType.entityProperties, false, converterContext)), _getSelectionFieldsByPath(entityType, converterContext.getManifestWrapper().getFilterConfiguration().navigationProperties, false, converterContext));
|
|
657
|
+
|
|
658
|
+
var propertyInfoFields = (annotatedSelectionFields === null || annotatedSelectionFields === void 0 ? void 0 : annotatedSelectionFields.reduce(function (selectionFields, selectionField) {
|
|
659
|
+
var propertyPath = selectionField.value;
|
|
660
|
+
|
|
661
|
+
if (!(propertyPath in excludedFilterProperties)) {
|
|
662
|
+
var filterField = _getFilterField(filterFields, propertyPath, converterContext, entityType);
|
|
663
|
+
|
|
664
|
+
if (filterField) {
|
|
665
|
+
filterField.group = "";
|
|
666
|
+
filterField.groupLabel = "";
|
|
667
|
+
selectionFields.push(filterField);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
return selectionFields;
|
|
672
|
+
}, [])) || [];
|
|
673
|
+
return {
|
|
674
|
+
excludedFilterProperties: excludedFilterProperties,
|
|
675
|
+
entityType: entityType,
|
|
676
|
+
annotatedSelectionFields: annotatedSelectionFields,
|
|
677
|
+
filterFields: filterFields,
|
|
678
|
+
propertyInfoFields: propertyInfoFields
|
|
679
|
+
};
|
|
680
|
+
};
|
|
381
681
|
/**
|
|
382
682
|
* Retrieve the configuration for the selection fields that will be used within the filter bar
|
|
383
683
|
* This configuration takes into account annotation and the selection variants.
|
|
@@ -389,19 +689,16 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
389
689
|
*/
|
|
390
690
|
|
|
391
691
|
|
|
392
|
-
_exports.getFilterField = getFilterField;
|
|
393
|
-
|
|
394
692
|
var getSelectionFields = function (converterContext) {
|
|
395
|
-
var _entityType$
|
|
693
|
+
var _entityType$annotatio5;
|
|
396
694
|
|
|
397
695
|
var lrTables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
398
696
|
var annotationPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
|
|
399
|
-
|
|
400
|
-
var selectionVariants = getSelectionVariants(lrTables, converterContext); // create a map of properties to be used in selection variants
|
|
697
|
+
var oAnnotatedSelectionFieldData = getAnnotatedSelectionFieldData(converterContext, lrTables, annotationPath); // create a map of properties to be used in selection variants
|
|
401
698
|
|
|
402
|
-
var excludedFilterProperties =
|
|
403
|
-
var entityType =
|
|
404
|
-
var filterFacets = (_entityType$
|
|
699
|
+
var excludedFilterProperties = oAnnotatedSelectionFieldData.excludedFilterProperties;
|
|
700
|
+
var entityType = oAnnotatedSelectionFieldData.entityType;
|
|
701
|
+
var filterFacets = (_entityType$annotatio5 = entityType.annotations.UI) === null || _entityType$annotatio5 === void 0 ? void 0 : _entityType$annotatio5.FilterFacets;
|
|
405
702
|
var filterFacetMap = {};
|
|
406
703
|
var aFieldGroups = converterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.FieldGroup");
|
|
407
704
|
|
|
@@ -432,17 +729,15 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
432
729
|
} // create a map of all potential filter fields based on...
|
|
433
730
|
|
|
434
731
|
|
|
435
|
-
var filterFields =
|
|
436
|
-
|
|
732
|
+
var filterFields = oAnnotatedSelectionFieldData.filterFields; //Filters which has to be added which is part of SV/Default annotations but not present in the SelectionFields
|
|
437
733
|
|
|
438
|
-
var annotatedSelectionFields =
|
|
734
|
+
var annotatedSelectionFields = oAnnotatedSelectionFieldData.annotatedSelectionFields;
|
|
439
735
|
|
|
440
736
|
var defaultFilters = _getDefaultFilterFields(filterFields, aSelectOptions, entityType, converterContext, excludedFilterProperties, annotatedSelectionFields);
|
|
441
737
|
|
|
442
|
-
var parameterFields = _getParameterFields(converterContext);
|
|
738
|
+
var parameterFields = _getParameterFields(converterContext);
|
|
443
739
|
|
|
444
|
-
|
|
445
|
-
var allFilters = parameterFields.concat((annotatedSelectionFields === null || annotatedSelectionFields === void 0 ? void 0 : annotatedSelectionFields.reduce(function (selectionFields, selectionField) {
|
|
740
|
+
var propertyInfoFields = (annotatedSelectionFields === null || annotatedSelectionFields === void 0 ? void 0 : annotatedSelectionFields.reduce(function (selectionFields, selectionField) {
|
|
446
741
|
var propertyPath = selectionField.value;
|
|
447
742
|
|
|
448
743
|
if (!(propertyPath in excludedFilterProperties)) {
|
|
@@ -456,7 +751,9 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
456
751
|
}
|
|
457
752
|
|
|
458
753
|
return selectionFields;
|
|
459
|
-
}, [])) || []
|
|
754
|
+
}, [])) || []; // finally create final list of filter fields by adding the SelectionFields first (order matters)...
|
|
755
|
+
|
|
756
|
+
var allFilters = parameterFields.concat(propertyInfoFields) // To add the FilterField which is not part of the Selection Fields but the property is mentioned in the Selection Variant
|
|
460
757
|
.concat(defaultFilters || []) // ...and adding remaining filter fields, that are not used in a SelectionVariant (order doesn't matter)
|
|
461
758
|
.concat(Object.keys(filterFields).filter(function (propertyPath) {
|
|
462
759
|
return !(propertyPath in excludedFilterProperties);
|
|
@@ -499,6 +796,144 @@ sap.ui.define(["../../ManifestSettings", "sap/fe/core/converters/controls/Common
|
|
|
499
796
|
};
|
|
500
797
|
|
|
501
798
|
_exports.getSelectionFields = getSelectionFields;
|
|
799
|
+
|
|
800
|
+
var getPropertyInfoFields = function (converterContext) {
|
|
801
|
+
var _converterContext$get10, _converterContext$get11, _converterContext$get12, _converterContext$get13, _converterContext$get14, _converterContext$get15;
|
|
802
|
+
|
|
803
|
+
var lrTables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
804
|
+
var lrCharts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
805
|
+
var annotationPath = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
|
|
806
|
+
var oAnnotatedSelectionFieldData = getAnnotatedSelectionFieldData(converterContext, lrTables, annotationPath); //const annotatedSelectionFields: any = oAnnotatedSelectionFieldData.annotatedSelectionFields;
|
|
807
|
+
|
|
808
|
+
var selectionFieldTypes = [];
|
|
809
|
+
var isCaseSensitive = isFilteringCaseSensitive(converterContext);
|
|
810
|
+
var aTypeConfig = [];
|
|
811
|
+
|
|
812
|
+
var _fnTypeConfig = function (property) {
|
|
813
|
+
var oTypeConfig = getTypeConfig(property, undefined);
|
|
814
|
+
selectionFieldTypes.push(property === null || property === void 0 ? void 0 : property.type);
|
|
815
|
+
|
|
816
|
+
if ((property === null || property === void 0 ? void 0 : property.type) === "Edm.String" && (!oTypeConfig.constraints.nullable || oTypeConfig.constraints.nullable === true)) {
|
|
817
|
+
oTypeConfig.formatOptions.parseKeepsEmptyString = false;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
aTypeConfig.push(oTypeConfig);
|
|
821
|
+
};
|
|
822
|
+
|
|
823
|
+
var propertyInfoFields = oAnnotatedSelectionFieldData.propertyInfoFields;
|
|
824
|
+
|
|
825
|
+
var parameterFields = _getParameterFields(converterContext);
|
|
826
|
+
|
|
827
|
+
propertyInfoFields = propertyInfoFields.concat(parameterFields);
|
|
828
|
+
propertyInfoFields = insertCustomElements(propertyInfoFields, getManifestFilterFields(converterContext.getEntityType(), converterContext), {
|
|
829
|
+
"availability": "overwrite",
|
|
830
|
+
label: "overwrite",
|
|
831
|
+
type: "overwrite",
|
|
832
|
+
position: "overwrite",
|
|
833
|
+
template: "overwrite",
|
|
834
|
+
settings: "overwrite",
|
|
835
|
+
visualFilter: "overwrite"
|
|
836
|
+
});
|
|
837
|
+
propertyInfoFields.forEach(function (parameterField) {
|
|
838
|
+
if (parameterField.annotationPath) {
|
|
839
|
+
var propertyConvertyContext = converterContext.getConverterContextFor(parameterField.annotationPath);
|
|
840
|
+
var propertyTargetObject = propertyConvertyContext.getDataModelObjectPath().targetObject;
|
|
841
|
+
|
|
842
|
+
_fnTypeConfig(propertyTargetObject);
|
|
843
|
+
} else {
|
|
844
|
+
selectionFieldTypes.push("Edm.String");
|
|
845
|
+
aTypeConfig.push({});
|
|
846
|
+
}
|
|
847
|
+
});
|
|
848
|
+
var oFilterRestrictions = (_converterContext$get10 = converterContext.getEntitySet()) === null || _converterContext$get10 === void 0 ? void 0 : (_converterContext$get11 = _converterContext$get10.annotations) === null || _converterContext$get11 === void 0 ? void 0 : (_converterContext$get12 = _converterContext$get11.Capabilities) === null || _converterContext$get12 === void 0 ? void 0 : _converterContext$get12.FilterRestrictions;
|
|
849
|
+
var oRet = {};
|
|
850
|
+
oRet["RequiredProperties"] = getFilterRestrictions(oFilterRestrictions, "RequiredProperties") || [];
|
|
851
|
+
oRet["NonFilterableProperties"] = getFilterRestrictions(oFilterRestrictions, "NonFilterableProperties") || [];
|
|
852
|
+
oRet["FilterAllowedExpressions"] = getFilterRestrictions(oFilterRestrictions, "FilterAllowedExpressions") || {};
|
|
853
|
+
var sEntitySetPath = converterContext.getContextPath();
|
|
854
|
+
var aPathParts = sEntitySetPath.split("/");
|
|
855
|
+
|
|
856
|
+
if (aPathParts.length > 2) {
|
|
857
|
+
var sNavigationPath = aPathParts[aPathParts.length - 1];
|
|
858
|
+
aPathParts.splice(-1, 1);
|
|
859
|
+
var oNavigationRestrictions = getNavigationRestrictions(converterContext, sNavigationPath);
|
|
860
|
+
var oNavigationFilterRestrictions = oNavigationRestrictions && oNavigationRestrictions.FilterRestrictions;
|
|
861
|
+
oRet.RequiredProperties.concat(getFilterRestrictions(oNavigationFilterRestrictions, "RequiredProperties") || []);
|
|
862
|
+
oRet.NonFilterableProperties.concat(getFilterRestrictions(oNavigationFilterRestrictions, "NonFilterableProperties") || []);
|
|
863
|
+
oRet.FilterAllowedExpressions = _objectSpread(_objectSpread({}, getFilterRestrictions(oNavigationFilterRestrictions, "FilterAllowedExpressions") || {}), oRet.FilterAllowedExpressions);
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
var aRequiredProps = oRet.RequiredProperties;
|
|
867
|
+
var aNonFilterableProps = oRet.NonFilterableProperties;
|
|
868
|
+
var mAllowedExpressions = oRet.FilterAllowedExpressions;
|
|
869
|
+
var oPropertyInfo;
|
|
870
|
+
var aFetchedProperties = [],
|
|
871
|
+
aParameterFields = [];
|
|
872
|
+
Object.keys(propertyInfoFields).forEach(function (sFilterFieldKey) {
|
|
873
|
+
var oConvertedProperty = propertyInfoFields[sFilterFieldKey];
|
|
874
|
+
var sPropertyPath = oConvertedProperty.conditionPath.replace(/\+|\*/g, "");
|
|
875
|
+
|
|
876
|
+
if (aNonFilterableProps.indexOf(sPropertyPath) === -1) {
|
|
877
|
+
oPropertyInfo = _fetchPropertyInfo(converterContext, oConvertedProperty, aTypeConfig[sFilterFieldKey]);
|
|
878
|
+
|
|
879
|
+
if (oPropertyInfo) {
|
|
880
|
+
if (mAllowedExpressions[sPropertyPath] && mAllowedExpressions[sPropertyPath].length > 0) {
|
|
881
|
+
oPropertyInfo = Object.assign(oPropertyInfo, {
|
|
882
|
+
filterExpression: getSpecificAllowedExpression(mAllowedExpressions[sPropertyPath])
|
|
883
|
+
});
|
|
884
|
+
} else {
|
|
885
|
+
oPropertyInfo = Object.assign(oPropertyInfo, {
|
|
886
|
+
filterExpression: "auto"
|
|
887
|
+
});
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
oPropertyInfo = Object.assign(oPropertyInfo, {
|
|
891
|
+
maxConditions: !oPropertyInfo.isParameter && isMultiValue(oPropertyInfo) ? -1 : 1,
|
|
892
|
+
required: oPropertyInfo.isParameter || aRequiredProps.indexOf(sPropertyPath) >= 0,
|
|
893
|
+
caseSensitive: isCaseSensitive,
|
|
894
|
+
visible: oConvertedProperty.availability === "Default",
|
|
895
|
+
dataType: selectionFieldTypes[sFilterFieldKey] //label: getLocalizedText(oConvertedProperty.label)
|
|
896
|
+
|
|
897
|
+
});
|
|
898
|
+
aFetchedProperties.push(oPropertyInfo);
|
|
899
|
+
|
|
900
|
+
if (oPropertyInfo.isParameter) {
|
|
901
|
+
aParameterFields.push(sPropertyPath);
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
if ((_converterContext$get13 = converterContext.getDataModelObjectPath().targetObject) !== null && _converterContext$get13 !== void 0 && (_converterContext$get14 = _converterContext$get13.annotations) !== null && _converterContext$get14 !== void 0 && (_converterContext$get15 = _converterContext$get14.Common) !== null && _converterContext$get15 !== void 0 && _converterContext$get15.DraftRoot) {
|
|
908
|
+
aFetchedProperties.push(getEditStateFilterPropertyInfo());
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
if (sEntitySetPath && getFilterBarhideBasicSearch(lrTables, lrCharts, converterContext) !== true) {
|
|
912
|
+
var searchRestrictions = getSearchRestrictions(converterContext);
|
|
913
|
+
|
|
914
|
+
if (!searchRestrictions || searchRestrictions !== null && searchRestrictions !== void 0 && searchRestrictions.Searchable) {
|
|
915
|
+
aFetchedProperties.push(getSearchFilterPropertyInfo());
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
aFetchedProperties.sort(function (a, b) {
|
|
920
|
+
if (a.groupLabel === undefined || a.groupLabel === null) {
|
|
921
|
+
return -1;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
if (b.groupLabel === undefined || b.groupLabel === null) {
|
|
925
|
+
return 1;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
return a.groupLabel.localeCompare(b.groupLabel);
|
|
929
|
+
});
|
|
930
|
+
var sFetchProperties = JSON.stringify(aFetchedProperties);
|
|
931
|
+
sFetchProperties = sFetchProperties.replace(/\{/g, "\\{");
|
|
932
|
+
sFetchProperties = sFetchProperties.replace(/\}/g, "\\}");
|
|
933
|
+
return sFetchProperties;
|
|
934
|
+
};
|
|
935
|
+
|
|
936
|
+
_exports.getPropertyInfoFields = getPropertyInfoFields;
|
|
502
937
|
return _exports;
|
|
503
938
|
}, false);
|
|
504
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJmaWx0ZXJGaWVsZFR5cGUiLCJnZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzIiwiZmllbGRHcm91cCIsImZpbHRlckZhY2V0TWFwIiwiRGF0YSIsImZvckVhY2giLCJkYXRhRmllbGQiLCIkVHlwZSIsIlZhbHVlIiwicGF0aCIsImdyb3VwIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZ3JvdXBMYWJlbCIsImNvbXBpbGVCaW5kaW5nIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJMYWJlbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwicXVhbGlmaWVyIiwiZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzIiwic2VsZWN0aW9uVmFyaWFudHMiLCJyZWR1Y2UiLCJwcmV2aW91c1ZhbHVlIiwic2VsZWN0aW9uVmFyaWFudCIsInByb3BlcnR5TmFtZXMiLCJwcm9wZXJ0eU5hbWUiLCJjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbCIsImxpc3RSZXBvcnRUYWJsZXMiLCJjb250ZXh0UGF0aCIsImxlbmd0aCIsImV2ZXJ5IiwidmlzdWFsaXphdGlvbiIsImVuYWJsZUFuYWx5dGljcyIsImFubm90YXRpb24iLCJjb2xsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uVmFyaWFudHMiLCJsclRhYmxlVmlzdWFsaXphdGlvbnMiLCJjb252ZXJ0ZXJDb250ZXh0Iiwic2VsZWN0aW9uVmFyaWFudFBhdGhzIiwibWFwIiwidGFibGVGaWx0ZXJzIiwiY29udHJvbCIsImZpbHRlcnMiLCJ0YWJsZVNWQ29uZmlncyIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsInBhdGhzIiwiYW5ub3RhdGlvblBhdGgiLCJpbmRleE9mIiwicHVzaCIsInNlbGVjdGlvblZhcmlhbnRDb25maWciLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInN2Q29uZmlncyIsImNvbmNhdCIsIl9nZXRDb25kaXRpb25QYXRoIiwiZW50aXR5VHlwZSIsInByb3BlcnR5UGF0aCIsInBhcnRzIiwic3BsaXQiLCJwYXJ0aWFsUGF0aCIsInBhcnQiLCJzaGlmdCIsInByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJfdHlwZSIsImlzQ29sbGVjdGlvbiIsIl9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJpbmNsdWRlSGlkZGVuIiwidW5kZWZpbmVkIiwidGFyZ2V0VHlwZSIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsInRhcmdldEVudGl0eVR5cGUiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsIktleUhlbHBlciIsImdldFNlbGVjdGlvbkZpZWxkS2V5RnJvbVBhdGgiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwiY29uZGl0aW9uUGF0aCIsImF2YWlsYWJpbGl0eSIsIkhpZGRlbkZpbHRlciIsIkF2YWlsYWJpbGl0eVR5cGUiLCJBZGFwdGF0aW9uIiwibGFiZWwiLCJuYW1lIiwiX2dldFNlbGVjdGlvbkZpZWxkcyIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydGllcyIsInNlbGVjdGlvbkZpZWxkTWFwIiwiZnVsbFBhdGgiLCJzZWxlY3Rpb25GaWVsZCIsIl9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgiLCJwcm9wZXJ0eVBhdGhzIiwic2VsZWN0aW9uRmllbGRzIiwibG9jYWxTZWxlY3Rpb25GaWVsZHMiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJzcGxpY2UiLCJqb2luIiwiX2dldEZpbHRlckZpZWxkIiwiZmlsdGVyRmllbGRzIiwiZmlsdGVyRmllbGQiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiSGlnaCIsIklzc3VlVHlwZSIsIk1JU1NJTkdfU0VMRUNUSU9ORklFTEQiLCJEZWZhdWx0IiwiaXNQYXJhbWV0ZXIiLCJSZXN1bHRDb250ZXh0IiwiX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMiLCJhU2VsZWN0T3B0aW9ucyIsImV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsImFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyIsIlVJU2VsZWN0aW9uRmllbGRzIiwiU2VsZWN0aW9uRmllbGQiLCJ2YWx1ZSIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsInNQcm9wZXJ0eVBhdGgiLCJGaWx0ZXJGaWVsZCIsImRlZmF1bHRGaWx0ZXJWYWx1ZSIsIkZpbHRlckRlZmF1bHRWYWx1ZSIsIlByb3BlcnR5UGF0aCIsIl9nZXRQYXJhbWV0ZXJGaWVsZHMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJzdGFydGluZ0VudGl0eVNldCIsImlzUGFyYW1ldGVyaXplZCIsInBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwicGFyYW1ldGVyRmllbGRzIiwiZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsImdldFRlbXBsYXRlVHlwZSIsIlRlbXBsYXRlVHlwZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImdldENvbnRleHRQYXRoIiwiZW5hYmxlQW5hbHl0aWNzU2VhcmNoIiwiZ2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMiLCJmYkNvbmZpZyIsImdldEZpbHRlckNvbmZpZ3VyYXRpb24iLCJkZWZpbmVkRmlsdGVyRmllbGRzIiwiT2JqZWN0Iiwia2V5cyIsImdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkiLCJzS2V5IiwidHlwZSIsIlNsb3QiLCJ2aXN1YWxGaWx0ZXIiLCJnZXRWaXN1YWxGaWx0ZXJzIiwidGVtcGxhdGUiLCJwb3NpdGlvbiIsInBsYWNlbWVudCIsIlBsYWNlbWVudCIsIkFmdGVyIiwic2V0dGluZ3MiLCJnZXRGaWx0ZXJGaWVsZCIsImdldFNlbGVjdGlvbkZpZWxkcyIsImxyVGFibGVzIiwiZ2V0RW50aXR5VHlwZSIsImZpbHRlckZhY2V0cyIsIkZpbHRlckZhY2V0cyIsImFGaWVsZEdyb3VwcyIsImdldEFubm90YXRpb25zQnlUZXJtIiwiaSIsImZpbHRlckZhY2V0IiwiVGFyZ2V0IiwiJHRhcmdldCIsIklEIiwidG9TdHJpbmciLCJnZXRTZWxlY3Rpb25WYXJpYW50IiwiU2VsZWN0T3B0aW9ucyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJTZWxlY3Rpb25GaWVsZHMiLCJkZWZhdWx0RmlsdGVycyIsImFsbEZpbHRlcnMiLCJmaWx0ZXIiLCJhc3NpZ24iLCJzQ29udGV4dFBhdGgiLCJhZ2dyZWdhdGVzIiwiYWdncmVnYXRhYmxlUHJvcGVydGllcyIsImFnZ3JlZ2F0ZUtleSIsInJlbGF0aXZlUGF0aCIsImluc2VydEN1c3RvbUVsZW1lbnRzIiwiaXNDYXNlU2Vuc2l0aXZlIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiY2FzZVNlbnNpdGl2ZSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUEyQ0tBLGU7O2FBQUFBLGU7QUFBQUEsSUFBQUEsZTtBQUFBQSxJQUFBQSxlO0tBQUFBLGUsS0FBQUEsZTs7QUFPTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFTQyx5QkFBVCxDQUFtQ0MsVUFBbkMsRUFBNEc7QUFDM0csUUFBTUMsY0FBMkMsR0FBRyxFQUFwRDtBQUNBRCxJQUFBQSxVQUFVLENBQUNFLElBQVgsQ0FBZ0JDLE9BQWhCLENBQXdCLFVBQUNDLFNBQUQsRUFBdUM7QUFDOUQsVUFBSUEsU0FBUyxDQUFDQyxLQUFWLEtBQW9CLHNDQUF4QixFQUFnRTtBQUFBOztBQUMvREosUUFBQUEsY0FBYyxDQUFDRyxTQUFTLENBQUNFLEtBQVYsQ0FBZ0JDLElBQWpCLENBQWQsR0FBdUM7QUFDdENDLFVBQUFBLEtBQUssRUFBRVIsVUFBVSxDQUFDUyxrQkFEb0I7QUFF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aEIsQ0FBd0IsVUFBQWtHLFdBQVcsRUFBSTtBQUN0Q0EsTUFBQUEsV0FBVyxDQUFDNEYsYUFBWixHQUE0QkYsZUFBNUI7QUFDQSxLQUZEO0FBSUEsV0FBT2xHLGVBQVA7QUFDQSxHQS9ITSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QXZhaWxhYmlsaXR5VHlwZSxcblx0RmlsdGVyRmllbGRNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG5cdEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbixcblx0RmlsdGVyU2V0dGluZ3MsXG5cdFRlbXBsYXRlVHlwZVxufSBmcm9tIFwiLi4vLi4vTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uVGVybSwgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcywgRGF0YUZpZWxkVHlwZXMsIFJlZmVyZW5jZUZhY2V0VHlwZXMsIFVJQW5ub3RhdGlvblRlcm1zIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbixcblx0U2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb24sXG5cdFRhYmxlVmlzdWFsaXphdGlvbixcblx0aXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlXG59IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgQ29uZmlndXJhYmxlT2JqZWN0LCBDdXN0b21FbGVtZW50LCBpbnNlcnRDdXN0b21FbGVtZW50cywgUGxhY2VtZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Db25maWd1cmFibGVPYmplY3RcIjtcbmltcG9ydCB7IGdldFZpc3VhbEZpbHRlcnMsIFZpc3VhbEZpbHRlcnMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9MaXN0UmVwb3J0L1Zpc3VhbEZpbHRlcnNcIjtcbmltcG9ydCB7IFNlbGVjdE9wdGlvblR5cGUsIEZpZWxkR3JvdXBUeXBlLCBGaWVsZEdyb3VwIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBhbm5vdGF0aW9uRXhwcmVzc2lvbiwgY29tcGlsZUJpbmRpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuLi9Db21tb24vRGF0YVZpc3VhbGl6YXRpb25cIjtcbmltcG9ydCB7IEtleUhlbHBlciB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvS2V5XCI7XG5pbXBvcnQgeyBJc3N1ZVR5cGUsIElzc3VlU2V2ZXJpdHksIElzc3VlQ2F0ZWdvcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvRWRtXCI7XG5cbmV4cG9ydCB0eXBlIEZpbHRlckZpZWxkID0gQ29uZmlndXJhYmxlT2JqZWN0ICYge1xuXHR0eXBlPzogc3RyaW5nO1xuXHRjb25kaXRpb25QYXRoOiBzdHJpbmc7XG5cdGF2YWlsYWJpbGl0eTogQXZhaWxhYmlsaXR5VHlwZTtcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0bGFiZWw/OiBzdHJpbmc7XG5cdHRlbXBsYXRlPzogc3RyaW5nO1xuXHRncm91cD86IHN0cmluZztcblx0Z3JvdXBMYWJlbD86IHN0cmluZztcblx0c2V0dGluZ3M/OiBGaWx0ZXJTZXR0aW5ncztcblx0aXNQYXJhbWV0ZXI/OiBib29sZWFuO1xuXHR2aXN1YWxGaWx0ZXI/OiBWaXN1YWxGaWx0ZXJzO1xuXHRjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmlsdGVyR3JvdXAgPSB7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xufTtcblxuZW51bSBmaWx0ZXJGaWVsZFR5cGUge1xuXHREZWZhdWx0ID0gXCJEZWZhdWx0XCIsXG5cdFNsb3QgPSBcIlNsb3RcIlxufVxuXG5leHBvcnQgdHlwZSBDdXN0b21FbGVtZW50RmlsdGVyRmllbGQgPSBDdXN0b21FbGVtZW50PEZpbHRlckZpZWxkPjtcblxuLyoqXG4gKiBFbnRlciBhbGwgRGF0YUZpZWxkcyBvZiBhIGdpdmVuIEZpZWxkR3JvdXAgaW50byB0aGUgZmlsdGVyRmFjZXRNYXAuXG4gKlxuICogQHBhcmFtIHtBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT59IGZpZWxkR3JvdXBcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD59IFRoZSBtYXAgb2YgZmFjZXRzIGZvciB0aGUgZ2l2ZW4gRmllbGRHcm91cFxuICovXG5mdW5jdGlvbiBnZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzKGZpZWxkR3JvdXA6IEFubm90YXRpb25UZXJtPEZpZWxkR3JvdXBUeXBlPik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiB7XG5cdGNvbnN0IGZpbHRlckZhY2V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4gPSB7fTtcblx0ZmllbGRHcm91cC5EYXRhLmZvckVhY2goKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdGlmIChkYXRhRmllbGQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkXCIpIHtcblx0XHRcdGZpbHRlckZhY2V0TWFwW2RhdGFGaWVsZC5WYWx1ZS5wYXRoXSA9IHtcblx0XHRcdFx0Z3JvdXA6IGZpZWxkR3JvdXAuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRncm91cExhYmVsOlxuXHRcdFx0XHRcdGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24oZmllbGRHcm91cC5MYWJlbCB8fCBmaWVsZEdyb3VwLmFubm90YXRpb25zPy5Db21tb24/LkxhYmVsIHx8IGZpZWxkR3JvdXAucXVhbGlmaWVyKVxuXHRcdFx0XHRcdCkgfHwgZmllbGRHcm91cC5xdWFsaWZpZXJcblx0XHRcdH07XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGZpbHRlckZhY2V0TWFwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGNsdWRlZEZpbHRlclByb3BlcnRpZXMoc2VsZWN0aW9uVmFyaWFudHM6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10pOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB7XG5cdHJldHVybiBzZWxlY3Rpb25WYXJpYW50cy5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+LCBzZWxlY3Rpb25WYXJpYW50KSA9PiB7XG5cdFx0c2VsZWN0aW9uVmFyaWFudC5wcm9wZXJ0eU5hbWVzLmZvckVhY2gocHJvcGVydHlOYW1lID0+IHtcblx0XHRcdHByZXZpb3VzVmFsdWVbcHJvcGVydHlOYW1lXSA9IHRydWU7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdH0sIHt9KTtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGF0IGFsbCB0aGUgdGFibGVzIGZvciBhIGRlZGljYXRlZCBlbnRpdHkgc2V0IGFyZSBjb25maWd1cmVkIGFzIGFuYWx5dGljYWwgdGFibGUuXG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsaXN0UmVwb3J0VGFibGVzIExpc3QgcmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHRQYXRoXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gSXMgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBoaWRkZW4gb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxpc3RSZXBvcnRUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdLCBjb250ZXh0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdGlmIChjb250ZXh0UGF0aCAmJiBsaXN0UmVwb3J0VGFibGVzLmxlbmd0aCA+IDApIHtcblx0XHRyZXR1cm4gbGlzdFJlcG9ydFRhYmxlcy5ldmVyeSh2aXN1YWxpemF0aW9uID0+IHtcblx0XHRcdHJldHVybiB2aXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljcyAmJiBjb250ZXh0UGF0aCA9PT0gdmlzdWFsaXphdGlvbi5hbm5vdGF0aW9uLmNvbGxlY3Rpb247XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb25WYXJpYW50cyhcblx0bHJUYWJsZVZpc3VhbGl6YXRpb25zOiBUYWJsZVZpc3VhbGl6YXRpb25bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSB7XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0cmV0dXJuIGxyVGFibGVWaXN1YWxpemF0aW9uc1xuXHRcdC5tYXAodmlzdWFsaXphdGlvbiA9PiB7XG5cdFx0XHRjb25zdCB0YWJsZUZpbHRlcnMgPSB2aXN1YWxpemF0aW9uLmNvbnRyb2wuZmlsdGVycztcblx0XHRcdGNvbnN0IHRhYmxlU1ZDb25maWdzOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiB0YWJsZUZpbHRlcnMpIHtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodGFibGVGaWx0ZXJzW2tleV0ucGF0aHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGF0aHMgPSB0YWJsZUZpbHRlcnNba2V5XS5wYXRocztcblx0XHRcdFx0XHRwYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHBhdGggJiYgcGF0aC5hbm5vdGF0aW9uUGF0aCAmJiBzZWxlY3Rpb25WYXJpYW50UGF0aHMuaW5kZXhPZihwYXRoLmFubm90YXRpb25QYXRoKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudFBhdGhzLnB1c2gocGF0aC5hbm5vdGF0aW9uUGF0aCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNlbGVjdGlvblZhcmlhbnRDb25maWcgPSBnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbihwYXRoLmFubm90YXRpb25QYXRoLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdFx0XHRcdFx0aWYgKHNlbGVjdGlvblZhcmlhbnRDb25maWcpIHtcblx0XHRcdFx0XHRcdFx0XHR0YWJsZVNWQ29uZmlncy5wdXNoKHNlbGVjdGlvblZhcmlhbnRDb25maWcpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0YWJsZVNWQ29uZmlncztcblx0XHR9KVxuXHRcdC5yZWR1Y2UoKHN2Q29uZmlncywgc2VsZWN0aW9uVmFyaWFudCkgPT4gc3ZDb25maWdzLmNvbmNhdChzZWxlY3Rpb25WYXJpYW50KSwgW10pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvbmRpdGlvbiBwYXRoIHJlcXVpcmVkIGZvciB0aGUgY29uZGl0aW9uIG1vZGVsLiBJdCBsb29rcyBhcyBmb2xsb3dzOlxuICogPDE6Ti1Qcm9wZXJ0eU5hbWU+KlxcLzwxOjEtUHJvcGVydHlOYW1lPi88UHJvcGVydHlOYW1lPi5cbiAqXG4gKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgcm9vdCBFbnRpdHlUeXBlXG4gKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRhcmdldCBwcm9wZXJ0eVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBjb25kaXRpb24gcGF0aFxuICovXG5jb25zdCBfZ2V0Q29uZGl0aW9uUGF0aCA9IGZ1bmN0aW9uKGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIHByb3BlcnR5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0Y29uc3QgcGFydHMgPSBwcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpO1xuXHRsZXQgcGFydGlhbFBhdGg7XG5cdGxldCBrZXkgPSBcIlwiO1xuXHR3aGlsZSAocGFydHMubGVuZ3RoKSB7XG5cdFx0bGV0IHBhcnQgPSBwYXJ0cy5zaGlmdCgpIGFzIHN0cmluZztcblx0XHRwYXJ0aWFsUGF0aCA9IHBhcnRpYWxQYXRoID8gcGFydGlhbFBhdGggKyBcIi9cIiArIHBhcnQgOiBwYXJ0O1xuXHRcdGNvbnN0IHByb3BlcnR5OiBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocGFydGlhbFBhdGgpO1xuXHRcdGlmIChwcm9wZXJ0eS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJiBwcm9wZXJ0eS5pc0NvbGxlY3Rpb24pIHtcblx0XHRcdHBhcnQgKz0gXCIqXCI7XG5cdFx0fVxuXHRcdGtleSA9IGtleSA/IGtleSArIFwiL1wiICsgcGFydCA6IHBhcnQ7XG5cdH1cblx0cmV0dXJuIGtleTtcbn07XG5cbmNvbnN0IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZCA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eTogUHJvcGVydHksXG5cdGZ1bGxQcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHQvLyBpZ25vcmUgY29tcGxleCBwcm9wZXJ0eSB0eXBlcyBhbmQgaGlkZGVuIGFubm90YXRlZCBvbmVzXG5cdGlmIChcblx0XHRwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkICYmXG5cdFx0cHJvcGVydHkudGFyZ2V0VHlwZSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0KGluY2x1ZGVIaWRkZW4gfHwgcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSAhPT0gdHJ1ZSlcblx0KSB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbkVudGl0eVR5cGUocHJvcGVydHkpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRrZXk6IEtleUhlbHBlci5nZXRTZWxlY3Rpb25GaWVsZEtleUZyb21QYXRoKGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YW5ub3RhdGlvblBhdGg6IGNvbnZlcnRlckNvbnRleHQuZ2V0QWJzb2x1dGVBbm5vdGF0aW9uUGF0aChmdWxsUHJvcGVydHlQYXRoKSxcblx0XHRcdGNvbmRpdGlvblBhdGg6IF9nZXRDb25kaXRpb25QYXRoKGVudGl0eVR5cGUsIGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0YXZhaWxhYmlsaXR5OlxuXHRcdFx0XHRwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbkZpbHRlcj8udmFsdWVPZigpID09PSB0cnVlID8gQXZhaWxhYmlsaXR5VHlwZS5IaWRkZW4gOiBBdmFpbGFiaWxpdHlUeXBlLkFkYXB0YXRpb24sXG5cdFx0XHRsYWJlbDogY29tcGlsZUJpbmRpbmcoYW5ub3RhdGlvbkV4cHJlc3Npb24ocHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHByb3BlcnR5Lm5hbWUpKSxcblx0XHRcdGdyb3VwOiB0YXJnZXRFbnRpdHlUeXBlLm5hbWUsXG5cdFx0XHRncm91cExhYmVsOiBjb21waWxlQmluZGluZyhcblx0XHRcdFx0YW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0RW50aXR5VHlwZT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWw/LnZhbHVlT2YoKSB8fCB0YXJnZXRFbnRpdHlUeXBlLm5hbWUpXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aDogc3RyaW5nLFxuXHRwcm9wZXJ0aWVzOiBBcnJheTxQcm9wZXJ0eT4gfCB1bmRlZmluZWQsXG5cdGluY2x1ZGVIaWRkZW46IGJvb2xlYW4sXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiB7XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkTWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnRpZXMpIHtcblx0XHRwcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0Y29uc3QgZnVsbFBhdGg6IHN0cmluZyA9IChuYXZpZ2F0aW9uUGF0aCA/IG5hdmlnYXRpb25QYXRoICsgXCIvXCIgOiBcIlwiKSArIHByb3BlcnR5UGF0aDtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIHByb3BlcnR5LCBmdWxsUGF0aCwgaW5jbHVkZUhpZGRlbiwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHRpZiAoc2VsZWN0aW9uRmllbGQpIHtcblx0XHRcdFx0c2VsZWN0aW9uRmllbGRNYXBbZnVsbFBhdGhdID0gc2VsZWN0aW9uRmllbGQ7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkTWFwO1xufTtcblxuY29uc3QgX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aCA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRwcm9wZXJ0eVBhdGhzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4ge1xuXHRsZXQgc2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4gPSB7fTtcblx0aWYgKHByb3BlcnR5UGF0aHMpIHtcblx0XHRwcm9wZXJ0eVBhdGhzLmZvckVhY2goKHByb3BlcnR5UGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0XHRsZXQgbG9jYWxTZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPjtcblxuXHRcdFx0Y29uc3QgcHJvcGVydHk6IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwcm9wZXJ0eVBhdGgpO1xuXHRcdFx0aWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHByb3BlcnR5Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdC8vIGhhbmRsZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcyxcblx0XHRcdFx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkudGFyZ2V0VHlwZSAhPT0gdW5kZWZpbmVkICYmIHByb3BlcnR5LnRhcmdldFR5cGUuX3R5cGUgPT09IFwiQ29tcGxleFR5cGVcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgQ29tcGxleFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRsb2NhbFNlbGVjdGlvbkZpZWxkcyA9IF9nZXRTZWxlY3Rpb25GaWVsZHMoXG5cdFx0XHRcdFx0ZW50aXR5VHlwZSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGluY2x1ZGVIaWRkZW4sXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGggPSBwcm9wZXJ0eVBhdGguaW5jbHVkZXMoXCIvXCIpXG5cdFx0XHRcdFx0PyBwcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0XHRcdFx0XHQuc3BsaWNlKDAsIDEpXG5cdFx0XHRcdFx0XHRcdC5qb2luKFwiL1wiKVxuXHRcdFx0XHRcdDogXCJcIjtcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKGVudGl0eVR5cGUsIG5hdmlnYXRpb25QYXRoLCBbcHJvcGVydHldLCBpbmNsdWRlSGlkZGVuLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0aW9uRmllbGRzID0ge1xuXHRcdFx0XHQuLi5zZWxlY3Rpb25GaWVsZHMsXG5cdFx0XHRcdC4uLmxvY2FsU2VsZWN0aW9uRmllbGRzXG5cdFx0XHR9O1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5jb25zdCBfZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sXG5cdHByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlXG4pOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCB7XG5cdGxldCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXTtcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZGVsZXRlIGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdO1xuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZpZWxkID0gX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkKGVudGl0eVR5cGUsIGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKSwgcHJvcGVydHlQYXRoLCB0cnVlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0fVxuXHRpZiAoIWZpbHRlckZpZWxkKSB7XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXREaWFnbm9zdGljcygpLmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5IaWdoLCBJc3N1ZVR5cGUuTUlTU0lOR19TRUxFQ1RJT05GSUVMRCk7XG5cdH1cblx0Ly8gZGVmaW5lZCBTZWxlY3Rpb25GaWVsZHMgYXJlIGF2YWlsYWJsZSBieSBkZWZhdWx0XG5cdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdGZpbHRlckZpZWxkLmF2YWlsYWJpbGl0eSA9IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdDtcblx0XHRmaWx0ZXJGaWVsZC5pc1BhcmFtZXRlciA9ICEhZW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZDtcbn07XG5cbmNvbnN0IF9nZXREZWZhdWx0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24oXG5cdGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRhU2VsZWN0T3B0aW9uczogYW55W10sXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sXG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkczogUHJvcGVydHlQYXRoW11cbik6IEZpbHRlckZpZWxkW10ge1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10gPSBbXTtcblx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRjb25zdCBwcm9wZXJ0aWVzID0gZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzO1xuXHQvLyBVc2luZyBlbnRpdHlUeXBlIGluc3RlYWQgb2YgZW50aXR5U2V0XG5cdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8uZm9yRWFjaChTZWxlY3Rpb25GaWVsZCA9PiB7XG5cdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0fSk7XG5cdGlmIChhU2VsZWN0T3B0aW9ucyAmJiBhU2VsZWN0T3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0YVNlbGVjdE9wdGlvbnM/LmZvckVhY2goKHNlbGVjdE9wdGlvbjogU2VsZWN0T3B0aW9uVHlwZSkgPT4ge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlOYW1lOiBhbnkgPSBzZWxlY3RPcHRpb24uUHJvcGVydHlOYW1lO1xuXHRcdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHlOYW1lLnZhbHVlO1xuXHRcdFx0Y29uc3QgVUlTZWxlY3Rpb25GaWVsZHM6IGFueSA9IHt9O1xuXHRcdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKFNlbGVjdGlvbkZpZWxkID0+IHtcblx0XHRcdFx0VUlTZWxlY3Rpb25GaWVsZHNbU2VsZWN0aW9uRmllbGQudmFsdWVdID0gdHJ1ZTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKCEoc1Byb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGlmICghKHNQcm9wZXJ0eVBhdGggaW4gVUlTZWxlY3Rpb25GaWVsZHMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgRmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgc1Byb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAocHJvcGVydGllcykge1xuXHRcdHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IFByb3BlcnR5KSA9PiB7XG5cdFx0XHRjb25zdCBkZWZhdWx0RmlsdGVyVmFsdWUgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWx0ZXJEZWZhdWx0VmFsdWU7XG5cdFx0XHRjb25zdCBQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5uYW1lO1xuXHRcdFx0aWYgKCEoUHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0aWYgKGRlZmF1bHRGaWx0ZXJWYWx1ZSAmJiAhKFByb3BlcnR5UGF0aCBpbiBVSVNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRmllbGQoZmlsdGVyRmllbGRzLCBQcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChGaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uRmllbGRzLnB1c2goRmlsdGVyRmllbGQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgcGFyYW1ldGVyIGZpbHRlciBmaWVsZHMgaW4gY2FzZSBvZiBhIHBhcmFtZXRlcml6ZWQgc2VydmljZS5cbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge0ZpbHRlckZpZWxkW119IEFuIGFycmF5IG9mIHBhcmFtZXRlciBmaWx0ZXJmaWVsZHNcbiAqL1xuZnVuY3Rpb24gX2dldFBhcmFtZXRlckZpZWxkcyhjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogRmlsdGVyRmllbGRbXSB7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Y29uc3QgcGFyYW1ldGVyRW50aXR5VHlwZSA9IGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0Y29uc3QgaXNQYXJhbWV0ZXJpemVkID0gISFwYXJhbWV0ZXJFbnRpdHlUeXBlLmFubm90YXRpb25zPy5Db21tb24/LlJlc3VsdENvbnRleHQ7XG5cdGNvbnN0IHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQgPVxuXHRcdGlzUGFyYW1ldGVyaXplZCAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoXCIvXCIgKyBkYXRhTW9kZWxPYmplY3RQYXRoLnN0YXJ0aW5nRW50aXR5U2V0Lm5hbWUpO1xuXG5cdGNvbnN0IHBhcmFtZXRlckZpZWxkcyA9IChwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0XG5cdFx0PyBwYXJhbWV0ZXJFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKGZ1bmN0aW9uKHByb3BlcnR5KSB7XG5cdFx0XHRcdHJldHVybiBfZ2V0RmlsdGVyRmllbGQoe30gYXMgUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LCBwcm9wZXJ0eS5uYW1lLCBwYXJhbWV0ZXJDb252ZXJ0ZXJDb250ZXh0LCBwYXJhbWV0ZXJFbnRpdHlUeXBlKTtcblx0XHQgIH0pXG5cdFx0OiBbXSkgYXMgRmlsdGVyRmllbGRbXTtcblxuXHRyZXR1cm4gcGFyYW1ldGVyRmllbGRzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaXMgaGlkZGVuIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsaXN0UmVwb3J0VGFibGVzIFRoZSBsaXN0IHJlcG9ydCB0YWJsZXNcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgaW5mb3JtYXRpb24gaWYgdGhlIEZpbHRlckJhciBzZWFyY2ggZmllbGQgaXMgaGlkZGVuIG9yIG5vdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoID0gZnVuY3Rpb24obGlzdFJlcG9ydFRhYmxlczogVGFibGVWaXN1YWxpemF0aW9uW10sIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0aWYgKFxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucygpIHx8XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIElmIGFsbCB0YWJsZXMgYXJlIGFuYWx5dGljYWwgYW5kIG5vbmUgb2YgdGhlbSBhbGxvdyBmb3Igc2VhcmNoXG5cdC8vIHRoZW4gdGhlIHNlYXJjaCBmaWVsZCBtdXN0IGJlIGhpZGRlblxuXHRjb25zdCBjb250ZXh0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTtcblx0aWYgKGNvbnRleHRQYXRoICYmIGxpc3RSZXBvcnRUYWJsZXMubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBsaXN0UmVwb3J0VGFibGVzLmV2ZXJ5KHZpc3VhbGl6YXRpb24gPT4ge1xuXHRcdFx0cmV0dXJuIHZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzICYmICF2aXN1YWxpemF0aW9uLmVuYWJsZUFuYWx5dGljc1NlYXJjaDtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGZpbHRlciBmaWVsZHMgZnJvbSB0aGUgbWFuaWZlc3QuXG4gKlxuICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGN1cnJlbnQgZW50aXR5VHlwZVxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPn0gVGhlIGZpbHRlciBmaWVsZHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1hbmlmZXN0RmlsdGVyRmllbGRzID0gZnVuY3Rpb24oXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHRcbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4ge1xuXHRjb25zdCBmYkNvbmZpZzogRmlsdGVyTWFuaWZlc3RDb25maWd1cmF0aW9uID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRGaWx0ZXJDb25maWd1cmF0aW9uKCk7XG5cdGNvbnN0IGRlZmluZWRGaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkTWFuaWZlc3RDb25maWd1cmF0aW9uPiA9IGZiQ29uZmlnPy5maWx0ZXJGaWVsZHMgfHwge307XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0gX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRlbnRpdHlUeXBlLFxuXHRcdE9iamVjdC5rZXlzKGRlZmluZWRGaWx0ZXJGaWVsZHMpLm1hcChrZXkgPT4gS2V5SGVscGVyLmdldFBhdGhGcm9tU2VsZWN0aW9uRmllbGRLZXkoa2V5KSksXG5cdFx0dHJ1ZSxcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdCk7XG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgQ3VzdG9tRWxlbWVudEZpbHRlckZpZWxkPiA9IHt9O1xuXG5cdGZvciAoY29uc3Qgc0tleSBpbiBkZWZpbmVkRmlsdGVyRmllbGRzKSB7XG5cdFx0Y29uc3QgZmlsdGVyRmllbGQgPSBkZWZpbmVkRmlsdGVyRmllbGRzW3NLZXldO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KHNLZXkpO1xuXHRcdGNvbnN0IHNlbGVjdGlvbkZpZWxkID0gc2VsZWN0aW9uRmllbGRzW3Byb3BlcnR5TmFtZV07XG5cdFx0Y29uc3QgdHlwZSA9IGZpbHRlckZpZWxkLnR5cGUgPT09IFwiU2xvdFwiID8gZmlsdGVyRmllbGRUeXBlLlNsb3QgOiBmaWx0ZXJGaWVsZFR5cGUuRGVmYXVsdDtcblx0XHRjb25zdCB2aXN1YWxGaWx0ZXIgPVxuXHRcdFx0ZmlsdGVyRmllbGQgJiYgZmlsdGVyRmllbGQ/LnZpc3VhbEZpbHRlclxuXHRcdFx0XHQ/IGdldFZpc3VhbEZpbHRlcnMoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCwgc0tleSwgZGVmaW5lZEZpbHRlckZpZWxkcylcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0ZmlsdGVyRmllbGRzW3NLZXldID0ge1xuXHRcdFx0a2V5OiBzS2V5LFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGFubm90YXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uYW5ub3RhdGlvblBhdGgsXG5cdFx0XHRjb25kaXRpb25QYXRoOiBzZWxlY3Rpb25GaWVsZD8uY29uZGl0aW9uUGF0aCB8fCBwcm9wZXJ0eU5hbWUsXG5cdFx0XHR0ZW1wbGF0ZTogZmlsdGVyRmllbGQudGVtcGxhdGUsXG5cdFx0XHRsYWJlbDogZmlsdGVyRmllbGQubGFiZWwsXG5cdFx0XHRwb3NpdGlvbjogZmlsdGVyRmllbGQucG9zaXRpb24gfHwgeyBwbGFjZW1lbnQ6IFBsYWNlbWVudC5BZnRlciB9LFxuXHRcdFx0YXZhaWxhYmlsaXR5OiBmaWx0ZXJGaWVsZC5hdmFpbGFiaWxpdHkgfHwgQXZhaWxhYmlsaXR5VHlwZS5EZWZhdWx0LFxuXHRcdFx0c2V0dGluZ3M6IGZpbHRlckZpZWxkLnNldHRpbmdzLFxuXHRcdFx0dmlzdWFsRmlsdGVyOiB2aXN1YWxGaWx0ZXJcblx0XHR9O1xuXHR9XG5cdHJldHVybiBmaWx0ZXJGaWVsZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsdGVyRmllbGQgPSBmdW5jdGlvbihwcm9wZXJ0eVBhdGg6IHN0cmluZywgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xuXHRyZXR1cm4gX2dldEZpbHRlckZpZWxkKHt9LCBwcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlbGVjdGlvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aGluIHRoZSBmaWx0ZXIgYmFyXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gdGFrZXMgaW50byBhY2NvdW50IGFubm90YXRpb24gYW5kIHRoZSBzZWxlY3Rpb24gdmFyaWFudHMuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsclRhYmxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGFubm90YXRpb25QYXRoXG4gKiBAcmV0dXJucyB7RmlsdGVyU2VsZWN0aW9uRmllbGRbXX0gQW4gYXJyYXkgb2Ygc2VsZWN0aW9uIGZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0aW9uRmllbGRzID0gZnVuY3Rpb24oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGxyVGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSA9IFtdLFxuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nID0gXCJcIlxuKTogRmlsdGVyRmllbGRbXSB7XG5cdC8vIEZldGNoIGFsbCBzZWxlY3Rpb25WYXJpYW50cyBkZWZpbmVkIGluIHRoZSBkaWZmZXJlbnQgdmlzdWFsaXphdGlvbnMgYW5kIGRpZmZlcmVudCB2aWV3cyAobXVsdGkgdGFibGUgbW9kZSlcblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudHM6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10gPSBnZXRTZWxlY3Rpb25WYXJpYW50cyhsclRhYmxlcywgY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBpbiBzZWxlY3Rpb24gdmFyaWFudHNcblx0Y29uc3QgZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IGdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyhzZWxlY3Rpb25WYXJpYW50cyk7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0Y29uc3QgZmlsdGVyRmFjZXRzID0gZW50aXR5VHlwZS5hbm5vdGF0aW9ucy5VST8uRmlsdGVyRmFjZXRzO1xuXHRsZXQgZmlsdGVyRmFjZXRNYXA6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiA9IHt9O1xuXG5cdGNvbnN0IGFGaWVsZEdyb3VwcyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0QW5ub3RhdGlvbnNCeVRlcm0oXCJVSVwiLCBVSUFubm90YXRpb25UZXJtcy5GaWVsZEdyb3VwKTtcblxuXHRpZiAoZmlsdGVyRmFjZXRzID09PSB1bmRlZmluZWQgfHwgZmlsdGVyRmFjZXRzLmxlbmd0aCA8IDApIHtcblx0XHRmb3IgKGNvbnN0IGkgaW4gYUZpZWxkR3JvdXBzKSB7XG5cdFx0XHRmaWx0ZXJGYWNldE1hcCA9IHtcblx0XHRcdFx0Li4uZmlsdGVyRmFjZXRNYXAsXG5cdFx0XHRcdC4uLmdldEZpZWxkR3JvdXBGaWx0ZXJHcm91cHMoYUZpZWxkR3JvdXBzW2ldIGFzIEFubm90YXRpb25UZXJtPEZpZWxkR3JvdXBUeXBlPilcblx0XHRcdH07XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZpbHRlckZhY2V0TWFwID0gZmlsdGVyRmFjZXRzLnJlZHVjZSgocHJldmlvdXNWYWx1ZTogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+LCBmaWx0ZXJGYWNldDogUmVmZXJlbmNlRmFjZXRUeXBlcykgPT4ge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAoZmlsdGVyRmFjZXQuVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRwcmV2aW91c1ZhbHVlWygoZmlsdGVyRmFjZXQuVGFyZ2V0LiR0YXJnZXQgYXMgRmllbGRHcm91cCkuRGF0YVtpXSBhcyBEYXRhRmllbGRUeXBlcykuVmFsdWUucGF0aF0gPSB7XG5cdFx0XHRcdFx0Z3JvdXA6IGZpbHRlckZhY2V0Py5JRD8udG9TdHJpbmcoKSxcblx0XHRcdFx0XHRncm91cExhYmVsOiBmaWx0ZXJGYWNldD8uTGFiZWw/LnRvU3RyaW5nKClcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwcmV2aW91c1ZhbHVlO1xuXHRcdH0sIHt9KTtcblx0fVxuXG5cdGxldCBhU2VsZWN0T3B0aW9uczogYW55W10gPSBbXTtcblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudCA9IGdldFNlbGVjdGlvblZhcmlhbnQoZW50aXR5VHlwZSwgY29udmVydGVyQ29udGV4dCk7XG5cdGlmIChzZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0YVNlbGVjdE9wdGlvbnMgPSBzZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnM7XG5cdH1cblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgYWxsIHBvdGVudGlhbCBmaWx0ZXIgZmllbGRzIGJhc2VkIG9uLi4uXG5cdGNvbnN0IGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge1xuXHRcdC8vIC4uLm5vbiBoaWRkZW4gcHJvcGVydGllcyBvZiB0aGUgZW50aXR5XG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkcyhlbnRpdHlUeXBlLCBcIlwiLCBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMsIGZhbHNlLCBjb252ZXJ0ZXJDb250ZXh0KSxcblx0XHQvLyAuLi5hZGRpdGlvbmFsIG1hbmlmZXN0IGRlZmluZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0Li4uX2dldFNlbGVjdGlvbkZpZWxkc0J5UGF0aChcblx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEZpbHRlckNvbmZpZ3VyYXRpb24oKS5uYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRcdGZhbHNlLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdClcblx0fTtcblxuXHQvL0ZpbHRlcnMgd2hpY2ggaGFzIHRvIGJlIGFkZGVkIHdoaWNoIGlzIHBhcnQgb2YgU1YvRGVmYXVsdCBhbm5vdGF0aW9ucyBidXQgbm90IHByZXNlbnQgaW4gdGhlIFNlbGVjdGlvbkZpZWxkc1xuXHRjb25zdCBhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMgPSAoKGFubm90YXRpb25QYXRoICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24oYW5ub3RhdGlvblBhdGgpPy5hbm5vdGF0aW9uKSB8fFxuXHRcdGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5TZWxlY3Rpb25GaWVsZHMgfHxcblx0XHRbXSkgYXMgUHJvcGVydHlQYXRoW107XG5cdGNvbnN0IGRlZmF1bHRGaWx0ZXJzID0gX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMoXG5cdFx0ZmlsdGVyRmllbGRzLFxuXHRcdGFTZWxlY3RPcHRpb25zLFxuXHRcdGVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRleGNsdWRlZEZpbHRlclByb3BlcnRpZXMsXG5cdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzXG5cdCk7XG5cdGNvbnN0IHBhcmFtZXRlckZpZWxkcyA9IF9nZXRQYXJhbWV0ZXJGaWVsZHMoY29udmVydGVyQ29udGV4dCk7XG5cblx0Ly8gZmluYWxseSBjcmVhdGUgZmluYWwgbGlzdCBvZiBmaWx0ZXIgZmllbGRzIGJ5IGFkZGluZyB0aGUgU2VsZWN0aW9uRmllbGRzIGZpcnN0IChvcmRlciBtYXR0ZXJzKS4uLlxuXHRsZXQgYWxsRmlsdGVycyA9IHBhcmFtZXRlckZpZWxkc1xuXHRcdC5jb25jYXQoXG5cdFx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LnJlZHVjZSgoc2VsZWN0aW9uRmllbGRzOiBGaWx0ZXJGaWVsZFtdLCBzZWxlY3Rpb25GaWVsZCkgPT4ge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBzZWxlY3Rpb25GaWVsZC52YWx1ZTtcblx0XHRcdFx0aWYgKCEocHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0XHRjb25zdCBmaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRmllbGQoZmlsdGVyRmllbGRzLCBwcm9wZXJ0eVBhdGgsIGNvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdFx0ZmlsdGVyRmllbGQuZ3JvdXAgPSBcIlwiO1xuXHRcdFx0XHRcdFx0ZmlsdGVyRmllbGQuZ3JvdXBMYWJlbCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChmaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG5cdFx0XHR9LCBbXSkgfHwgW11cblx0XHQpXG5cdFx0Ly8gVG8gYWRkIHRoZSBGaWx0ZXJGaWVsZCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUgU2VsZWN0aW9uIEZpZWxkcyBidXQgdGhlIHByb3BlcnR5IGlzIG1lbnRpb25lZCBpbiB0aGUgU2VsZWN0aW9uIFZhcmlhbnRcblx0XHQuY29uY2F0KGRlZmF1bHRGaWx0ZXJzIHx8IFtdKVxuXHRcdC8vIC4uLmFuZCBhZGRpbmcgcmVtYWluaW5nIGZpbHRlciBmaWVsZHMsIHRoYXQgYXJlIG5vdCB1c2VkIGluIGEgU2VsZWN0aW9uVmFyaWFudCAob3JkZXIgZG9lc24ndCBtYXR0ZXIpXG5cdFx0LmNvbmNhdChcblx0XHRcdE9iamVjdC5rZXlzKGZpbHRlckZpZWxkcylcblx0XHRcdFx0LmZpbHRlcihwcm9wZXJ0eVBhdGggPT4gIShwcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSlcblx0XHRcdFx0Lm1hcChwcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKGZpbHRlckZpZWxkc1twcm9wZXJ0eVBhdGhdLCBmaWx0ZXJGYWNldE1hcFtwcm9wZXJ0eVBhdGhdKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRjb25zdCBzQ29udGV4dFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCk7XG5cblx0Ly9pZiBhbGwgdGFibGVzIGFyZSBhbmFseXRpY2FsIHRhYmxlcyBcImFnZ3JlZ2F0YWJsZVwiIHByb3BlcnRpZXMgbXVzdCBiZSBleGNsdWRlZFxuXHRpZiAoY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwobHJUYWJsZXMsIHNDb250ZXh0UGF0aCkpIHtcblx0XHQvLyBDdXJyZW50bHkgYWxsIGFncmVnYXRlcyBhcmUgcm9vdCBlbnRpdHkgcHJvcGVydGllcyAobm8gcHJvcGVydGllcyBjb21pbmcgZnJvbSBuYXZpZ2F0aW9uKSBhbmQgYWxsXG5cdFx0Ly8gdGFibGVzIHdpdGggc2FtZSBlbnRpdHlTZXQgZ2V0cyBzYW1lIGFnZ3JlYWd0ZSBjb25maWd1cmF0aW9uIHRoYXQncyB3aHkgd2UgY2FuIHVzZSBmaXJzdCB0YWJsZSBpbnRvXG5cdFx0Ly8gTFIgdG8gZ2V0IGFnZ3JlZ2F0ZXMgKHdpdGhvdXQgY3VycmVuY3kvdW5pdCBwcm9wZXJ0aWVzIHNpbmNlIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIGZpbHRlciB0aGVtKS5cblx0XHRjb25zdCBhZ2dyZWdhdGVzID0gbHJUYWJsZXNbMF0uYWdncmVnYXRlcztcblx0XHRpZiAoYWdncmVnYXRlcykge1xuXHRcdFx0Y29uc3QgYWdncmVnYXRhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhhZ2dyZWdhdGVzKS5tYXAoYWdncmVnYXRlS2V5ID0+IGFnZ3JlZ2F0ZXNbYWdncmVnYXRlS2V5XS5yZWxhdGl2ZVBhdGgpO1xuXHRcdFx0YWxsRmlsdGVycyA9IGFsbEZpbHRlcnMuZmlsdGVyKGZpbHRlckZpZWxkID0+IHtcblx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0YWJsZVByb3BlcnRpZXMuaW5kZXhPZihmaWx0ZXJGaWVsZC5rZXkpID09PSAtMTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkcyA9IGluc2VydEN1c3RvbUVsZW1lbnRzKGFsbEZpbHRlcnMsIGdldE1hbmlmZXN0RmlsdGVyRmllbGRzKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpLCB7XG5cdFx0XCJhdmFpbGFiaWxpdHlcIjogXCJvdmVyd3JpdGVcIixcblx0XHRsYWJlbDogXCJvdmVyd3JpdGVcIixcblx0XHR0eXBlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHBvc2l0aW9uOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHRlbXBsYXRlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHNldHRpbmdzOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdHZpc3VhbEZpbHRlcjogXCJvdmVyd3JpdGVcIlxuXHR9KTtcblxuXHQvLyBBZGQgY2FzZVNlbnNpdGl2ZSBwcm9wZXJ0eSB0byBhbGwgc2VsZWN0aW9uIGZpZWxkcy5cblx0Y29uc3QgaXNDYXNlU2Vuc2l0aXZlID0gaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlKGNvbnZlcnRlckNvbnRleHQpO1xuXHRzZWxlY3Rpb25GaWVsZHMuZm9yRWFjaChmaWx0ZXJGaWVsZCA9PiB7XG5cdFx0ZmlsdGVyRmllbGQuY2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTtcblx0fSk7XG5cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcbn07XG4iXX0=
|
|
939
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZpbHRlckJhci50cyJdLCJuYW1lcyI6WyJmaWx0ZXJGaWVsZFR5cGUiLCJnZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzIiwiZmllbGRHcm91cCIsImZpbHRlckZhY2V0TWFwIiwiRGF0YSIsImZvckVhY2giLCJkYXRhRmllbGQiLCIkVHlwZSIsIlZhbHVlIiwicGF0aCIsImdyb3VwIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZ3JvdXBMYWJlbCIsImNvbXBpbGVCaW5kaW5nIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCJMYWJlbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwicXVhbGlmaWVyIiwiZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzIiwic2VsZWN0aW9uVmFyaWFudHMiLCJyZWR1Y2UiLCJwcmV2aW91c1ZhbHVlIiwic2VsZWN0aW9uVmFyaWFudCIsInByb3BlcnR5TmFtZXMiLCJwcm9wZXJ0eU5hbWUiLCJjaGVja0FsbFRhYmxlRm9yRW50aXR5U2V0QXJlQW5hbHl0aWNhbCIsImxpc3RSZXBvcnRUYWJsZXMiLCJjb250ZXh0UGF0aCIsImxlbmd0aCIsImV2ZXJ5IiwidmlzdWFsaXphdGlvbiIsImVuYWJsZUFuYWx5dGljcyIsImFubm90YXRpb24iLCJjb2xsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uVmFyaWFudHMiLCJsclRhYmxlVmlzdWFsaXphdGlvbnMiLCJjb252ZXJ0ZXJDb250ZXh0Iiwic2VsZWN0aW9uVmFyaWFudFBhdGhzIiwibWFwIiwidGFibGVGaWx0ZXJzIiwiY29udHJvbCIsImZpbHRlcnMiLCJ0YWJsZVNWQ29uZmlncyIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsInBhdGhzIiwiYW5ub3RhdGlvblBhdGgiLCJpbmRleE9mIiwicHVzaCIsInNlbGVjdGlvblZhcmlhbnRDb25maWciLCJnZXRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbiIsInN2Q29uZmlncyIsImNvbmNhdCIsIl9nZXRDb25kaXRpb25QYXRoIiwiZW50aXR5VHlwZSIsInByb3BlcnR5UGF0aCIsInBhcnRzIiwic3BsaXQiLCJwYXJ0aWFsUGF0aCIsInBhcnQiLCJzaGlmdCIsInByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJfdHlwZSIsImlzQ29sbGVjdGlvbiIsIl9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZCIsImZ1bGxQcm9wZXJ0eVBhdGgiLCJpbmNsdWRlSGlkZGVuIiwidW5kZWZpbmVkIiwidGFyZ2V0VHlwZSIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsInRhcmdldEVudGl0eVR5cGUiLCJnZXRBbm5vdGF0aW9uRW50aXR5VHlwZSIsIktleUhlbHBlciIsImdldFNlbGVjdGlvbkZpZWxkS2V5RnJvbVBhdGgiLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwiY29uZGl0aW9uUGF0aCIsImF2YWlsYWJpbGl0eSIsIkhpZGRlbkZpbHRlciIsIkF2YWlsYWJpbGl0eVR5cGUiLCJBZGFwdGF0aW9uIiwibGFiZWwiLCJuYW1lIiwiZ2V0TW9kZWxUeXBlIiwic1R5cGUiLCJtRGVmYXVsdFR5cGVGb3JFZG1UeXBlIiwibW9kZWxUeXBlIiwiX2dldFNlbGVjdGlvbkZpZWxkcyIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydGllcyIsInNlbGVjdGlvbkZpZWxkTWFwIiwiZnVsbFBhdGgiLCJzZWxlY3Rpb25GaWVsZCIsIl9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgiLCJwcm9wZXJ0eVBhdGhzIiwic2VsZWN0aW9uRmllbGRzIiwibG9jYWxTZWxlY3Rpb25GaWVsZHMiLCJlbnRpdHlQcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJzcGxpY2UiLCJqb2luIiwiX2dldEZpbHRlckZpZWxkIiwiZmlsdGVyRmllbGRzIiwiZmlsdGVyRmllbGQiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiSGlnaCIsIklzc3VlVHlwZSIsIk1JU1NJTkdfU0VMRUNUSU9ORklFTEQiLCJEZWZhdWx0IiwiaXNQYXJhbWV0ZXIiLCJSZXN1bHRDb250ZXh0IiwiX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMiLCJhU2VsZWN0T3B0aW9ucyIsImV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyIsImFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyIsIlVJU2VsZWN0aW9uRmllbGRzIiwiU2VsZWN0aW9uRmllbGQiLCJ2YWx1ZSIsInNlbGVjdE9wdGlvbiIsIlByb3BlcnR5TmFtZSIsInNQcm9wZXJ0eVBhdGgiLCJGaWx0ZXJGaWVsZCIsImRlZmF1bHRGaWx0ZXJWYWx1ZSIsIkZpbHRlckRlZmF1bHRWYWx1ZSIsIlByb3BlcnR5UGF0aCIsIl9nZXRQYXJhbWV0ZXJGaWVsZHMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmFtZXRlckVudGl0eVR5cGUiLCJzdGFydGluZ0VudGl0eVNldCIsImlzUGFyYW1ldGVyaXplZCIsInBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwicGFyYW1ldGVyRmllbGRzIiwiZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoIiwiY2hhcnRzIiwibm9TZWFyY2hJbkNoYXJ0cyIsImNoYXJ0IiwiYXBwbHlTdXBwb3J0ZWQiLCJlbmFibGVTZWFyY2giLCJub1NlYXJjaEluVGFibGVzIiwidGFibGUiLCJlbmFibGVBbmFseXRpY3NTZWFyY2giLCJnZXRDb250ZXh0UGF0aCIsImdldE1hbmlmZXN0RmlsdGVyRmllbGRzIiwiZmJDb25maWciLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRGaWx0ZXJDb25maWd1cmF0aW9uIiwiZGVmaW5lZEZpbHRlckZpZWxkcyIsIk9iamVjdCIsImtleXMiLCJnZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5Iiwic0tleSIsInR5cGUiLCJTbG90IiwidmlzdWFsRmlsdGVyIiwiZ2V0VmlzdWFsRmlsdGVycyIsInRlbXBsYXRlIiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJQbGFjZW1lbnQiLCJBZnRlciIsInNldHRpbmdzIiwiZ2V0RmlsdGVyRmllbGQiLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnMiLCJvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiIsInNSZXN0cmljdGlvbiIsImFQcm9wcyIsIm9Qcm9wZXJ0eSIsIiRQcm9wZXJ0eVBhdGgiLCJtQWxsb3dlZEV4cHJlc3Npb25zIiwiRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucyIsIlByb3BlcnR5IiwiQWxsb3dlZEV4cHJlc3Npb25zIiwiZ2V0U2VhcmNoRmlsdGVyUHJvcGVydHlJbmZvIiwiZGF0YVR5cGUiLCJtYXhDb25kaXRpb25zIiwiZ2V0RWRpdFN0YXRlRmlsdGVyUHJvcGVydHlJbmZvIiwidG9vbHRpcCIsImhpZGRlbkZpbHRlciIsImdldFNlYXJjaFJlc3RyaWN0aW9ucyIsImdldEVudGl0eVNldCIsIkNhcGFiaWxpdGllcyIsIlNlYXJjaFJlc3RyaWN0aW9ucyIsImdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJzTmF2aWdhdGlvblBhdGgiLCJvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIk5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJhUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZpbmQiLCJvUmVzdHJpY3RlZFByb3BlcnR5IiwiTmF2aWdhdGlvblByb3BlcnR5IiwiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJfZmV0Y2hCYXNpY1Byb3BlcnR5SW5mbyIsIm9GaWx0ZXJGaWVsZEluZm8iLCJyZW1vdmVGcm9tQXBwU3RhdGUiLCJoYXNWYWx1ZUhlbHAiLCJkaXNwbGF5IiwiY2FzZVNlbnNpdGl2ZSIsImdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24iLCJhRXhwcmVzc2lvbnMiLCJhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkiLCJzb3J0IiwiYSIsImIiLCJkaXNwbGF5TW9kZSIsIm9Qcm9wZXJ0eUFubm90YXRpb25zIiwib0NvbGxlY3Rpb25Bbm5vdGF0aW9ucyIsIm9UZXh0QW5ub3RhdGlvbiIsIlRleHQiLCJvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uIiwiVGV4dEFycmFuZ2VtZW50IiwiX2ZldGNoUHJvcGVydHlJbmZvIiwib1R5cGVDb25maWciLCJvUHJvcGVydHlJbmZvIiwic0Fubm90YXRpb25QYXRoIiwidGFyZ2V0UHJvcGVydHlPYmplY3QiLCJ0YXJnZXRPYmplY3QiLCIkTWF4TGVuZ3RoIiwibWF4TGVuZ3RoIiwiJGtpbmQiLCJvRmlsdGVyRGVmYXVsdFZhbHVlIiwib0Zvcm1hdE9wdGlvbnMiLCJmb3JtYXRPcHRpb25zIiwib0NvbnN0cmFpbnRzIiwiY29uc3RyYWludHMiLCJiUmVtb3ZlRnJvbUFwcFN0YXRlIiwiUGVyc29uYWxEYXRhIiwiSXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsIkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHQiLCJBbmFseXRpY3MiLCJNZWFzdXJlIiwib0ZpbHRlckRlZmF1bHRWYWx1ZUFubm90YXRpb24iLCJhc3NpZ24iLCJRdWlja0luZm8iLCJkZWZhdWx0RmlsdGVyQ29uZGl0aW9ucyIsImZpZWxkUGF0aCIsIm9wZXJhdG9yIiwidmFsdWVzIiwiaXNNdWx0aVZhbHVlIiwiYklzTXVsdGlWYWx1ZSIsImZpbHRlckV4cHJlc3Npb24iLCJnZXRBbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEiLCJsclRhYmxlcyIsImdldEVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlQW5ub3RhdGlvbiIsIlNlbGVjdGlvbkZpZWxkcyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwicHJvcGVydHlJbmZvRmllbGRzIiwiZ2V0U2VsZWN0aW9uRmllbGRzIiwib0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YSIsImZpbHRlckZhY2V0cyIsIkZpbHRlckZhY2V0cyIsImFGaWVsZEdyb3VwcyIsImdldEFubm90YXRpb25zQnlUZXJtIiwiaSIsImZpbHRlckZhY2V0IiwiVGFyZ2V0IiwiJHRhcmdldCIsIklEIiwidG9TdHJpbmciLCJnZXRTZWxlY3Rpb25WYXJpYW50IiwiU2VsZWN0T3B0aW9ucyIsImRlZmF1bHRGaWx0ZXJzIiwiYWxsRmlsdGVycyIsImZpbHRlciIsInNDb250ZXh0UGF0aCIsImFnZ3JlZ2F0ZXMiLCJhZ2dyZWdhdGFibGVQcm9wZXJ0aWVzIiwiYWdncmVnYXRlS2V5IiwicmVsYXRpdmVQYXRoIiwiaW5zZXJ0Q3VzdG9tRWxlbWVudHMiLCJpc0Nhc2VTZW5zaXRpdmUiLCJpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUiLCJnZXRQcm9wZXJ0eUluZm9GaWVsZHMiLCJsckNoYXJ0cyIsInNlbGVjdGlvbkZpZWxkVHlwZXMiLCJhVHlwZUNvbmZpZyIsIl9mblR5cGVDb25maWciLCJnZXRUeXBlQ29uZmlnIiwibnVsbGFibGUiLCJwYXJzZUtlZXBzRW1wdHlTdHJpbmciLCJwYXJhbWV0ZXJGaWVsZCIsInByb3BlcnR5Q29udmVydHlDb250ZXh0IiwicHJvcGVydHlUYXJnZXRPYmplY3QiLCJvRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwib1JldCIsInNFbnRpdHlTZXRQYXRoIiwiYVBhdGhQYXJ0cyIsIm9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zIiwiUmVxdWlyZWRQcm9wZXJ0aWVzIiwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJGaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnMiLCJhUmVxdWlyZWRQcm9wcyIsImFOb25GaWx0ZXJhYmxlUHJvcHMiLCJhRmV0Y2hlZFByb3BlcnRpZXMiLCJhUGFyYW1ldGVyRmllbGRzIiwic0ZpbHRlckZpZWxkS2V5Iiwib0NvbnZlcnRlZFByb3BlcnR5IiwicmVwbGFjZSIsInJlcXVpcmVkIiwidmlzaWJsZSIsIkRyYWZ0Um9vdCIsInNlYXJjaFJlc3RyaWN0aW9ucyIsIlNlYXJjaGFibGUiLCJsb2NhbGVDb21wYXJlIiwic0ZldGNoUHJvcGVydGllcyIsIkpTT04iLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7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cUIsQ0FBQ3ZKLGdCQUFELENBQWhEOztBQUNBLFVBQUksQ0FBQ29SLGtCQUFELElBQXVCQSxrQkFBdkIsYUFBdUJBLGtCQUF2QixlQUF1QkEsa0JBQWtCLENBQUVDLFVBQS9DLEVBQTJEO0FBQzFEVCxRQUFBQSxrQkFBa0IsQ0FBQy9QLElBQW5CLENBQXdCb0ksMkJBQTJCLEVBQW5EO0FBQ0E7QUFDRDs7QUFFRDJILElBQUFBLGtCQUFrQixDQUFDOUYsSUFBbkIsQ0FBd0IsVUFBU0MsQ0FBVCxFQUFpQkMsQ0FBakIsRUFBeUI7QUFDaEQsVUFBSUQsQ0FBQyxDQUFDeE0sVUFBRixLQUFpQjBELFNBQWpCLElBQThCOEksQ0FBQyxDQUFDeE0sVUFBRixLQUFpQixJQUFuRCxFQUF5RDtBQUN4RCxlQUFPLENBQUMsQ0FBUjtBQUNBOztBQUNELFVBQUl5TSxDQUFDLENBQUN6TSxVQUFGLEtBQWlCMEQsU0FBakIsSUFBOEIrSSxDQUFDLENBQUN6TSxVQUFGLEtBQWlCLElBQW5ELEVBQXlEO0FBQ3hELGVBQU8sQ0FBUDtBQUNBOztBQUNELGFBQU93TSxDQUFDLENBQUN4TSxVQUFGLENBQWErUyxhQUFiLENBQTJCdEcsQ0FBQyxDQUFDek0sVUFBN0IsQ0FBUDtBQUNBLEtBUkQ7QUFVQSxRQUFJZ1QsZ0JBQWdCLEdBQUdDLElBQUksQ0FBQ0MsU0FBTCxDQUFlYixrQkFBZixDQUF2QjtBQUNBVyxJQUFBQSxnQkFBZ0IsR0FBR0EsZ0JBQWdCLENBQUNQLE9BQWpCLENBQXlCLEtBQXpCLEVBQWdDLEtBQWhDLENBQW5CO0FBQ0FPLElBQUFBLGdCQUFnQixHQUFHQSxnQkFBZ0IsQ0FBQ1AsT0FBakIsQ0FBeUIsS0FBekIsRUFBZ0MsS0FBaEMsQ0FBbkI7QUFFQSxXQUFPTyxnQkFBUDtBQUNBLEdBdklNIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdmFpbGFiaWxpdHlUeXBlLCBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbiwgRmlsdGVyTWFuaWZlc3RDb25maWd1cmF0aW9uLCBGaWx0ZXJTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IEFubm90YXRpb25UZXJtLCBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLCBEYXRhRmllbGRUeXBlcywgUmVmZXJlbmNlRmFjZXRUeXBlcywgVUlBbm5vdGF0aW9uVGVybXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7XG5cdGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uLFxuXHRTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbixcblx0VGFibGVWaXN1YWxpemF0aW9uLFxuXHRpc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUsXG5cdGdldFR5cGVDb25maWdcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgeyBDaGFydFZpc3VhbGl6YXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQ2hhcnRcIjtcbmltcG9ydCB7IENvbmZpZ3VyYWJsZU9iamVjdCwgQ3VzdG9tRWxlbWVudCwgaW5zZXJ0Q3VzdG9tRWxlbWVudHMsIFBsYWNlbWVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQ29uZmlndXJhYmxlT2JqZWN0XCI7XG5pbXBvcnQgeyBnZXRWaXN1YWxGaWx0ZXJzLCBWaXN1YWxGaWx0ZXJzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9WaXN1YWxGaWx0ZXJzXCI7XG5pbXBvcnQgeyBTZWxlY3RPcHRpb25UeXBlLCBGaWVsZEdyb3VwVHlwZSwgRmllbGRHcm91cCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9VSVwiO1xuaW1wb3J0IHsgYW5ub3RhdGlvbkV4cHJlc3Npb24sIGNvbXBpbGVCaW5kaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IGdldFNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwiLi4vQ29tbW9uL0RhdGFWaXN1YWxpemF0aW9uXCI7XG5pbXBvcnQgeyBLZXlIZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0tleVwiO1xuaW1wb3J0IHsgSXNzdWVUeXBlLCBJc3N1ZVNldmVyaXR5LCBJc3N1ZUNhdGVnb3J5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L0VkbVwiO1xuaW1wb3J0IHsgaGFzVmFsdWVIZWxwIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcblxuZXhwb3J0IHR5cGUgRmlsdGVyRmllbGQgPSBDb25maWd1cmFibGVPYmplY3QgJiB7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdGNvbmRpdGlvblBhdGg6IHN0cmluZztcblx0YXZhaWxhYmlsaXR5OiBBdmFpbGFiaWxpdHlUeXBlO1xuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRsYWJlbD86IHN0cmluZztcblx0dGVtcGxhdGU/OiBzdHJpbmc7XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRncm91cExhYmVsPzogc3RyaW5nO1xuXHRzZXR0aW5ncz86IEZpbHRlclNldHRpbmdzO1xuXHRpc1BhcmFtZXRlcj86IGJvb2xlYW47XG5cdHZpc3VhbEZpbHRlcj86IFZpc3VhbEZpbHRlcnM7XG5cdGNhc2VTZW5zaXRpdmU/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWx0ZXJHcm91cCA9IHtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGdyb3VwTGFiZWw/OiBzdHJpbmc7XG59O1xuXG5lbnVtIGZpbHRlckZpZWxkVHlwZSB7XG5cdERlZmF1bHQgPSBcIkRlZmF1bHRcIixcblx0U2xvdCA9IFwiU2xvdFwiXG59XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZCA9IEN1c3RvbUVsZW1lbnQ8RmlsdGVyRmllbGQ+O1xuXG4vKipcbiAqIEVudGVyIGFsbCBEYXRhRmllbGRzIG9mIGEgZ2l2ZW4gRmllbGRHcm91cCBpbnRvIHRoZSBmaWx0ZXJGYWNldE1hcC5cbiAqXG4gKiBAcGFyYW0ge0Fubm90YXRpb25UZXJtPEZpZWxkR3JvdXBUeXBlPn0gZmllbGRHcm91cFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPn0gVGhlIG1hcCBvZiBmYWNldHMgZm9yIHRoZSBnaXZlbiBGaWVsZEdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdldEZpZWxkR3JvdXBGaWx0ZXJHcm91cHMoZmllbGRHcm91cDogQW5ub3RhdGlvblRlcm08RmllbGRHcm91cFR5cGU+KTogUmVjb3JkPHN0cmluZywgRmlsdGVyR3JvdXA+IHtcblx0Y29uc3QgZmlsdGVyRmFjZXRNYXA6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiA9IHt9O1xuXHRmaWVsZEdyb3VwLkRhdGEuZm9yRWFjaCgoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKSA9PiB7XG5cdFx0aWYgKGRhdGFGaWVsZC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5EYXRhRmllbGRcIikge1xuXHRcdFx0ZmlsdGVyRmFjZXRNYXBbZGF0YUZpZWxkLlZhbHVlLnBhdGhdID0ge1xuXHRcdFx0XHRncm91cDogZmllbGRHcm91cC5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdGdyb3VwTGFiZWw6XG5cdFx0XHRcdFx0Y29tcGlsZUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbihmaWVsZEdyb3VwLkxhYmVsIHx8IGZpZWxkR3JvdXAuYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWwgfHwgZmllbGRHcm91cC5xdWFsaWZpZXIpXG5cdFx0XHRcdFx0KSB8fCBmaWVsZEdyb3VwLnF1YWxpZmllclxuXHRcdFx0fTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZmlsdGVyRmFjZXRNYXA7XG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcyhzZWxlY3Rpb25WYXJpYW50czogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcblx0cmV0dXJuIHNlbGVjdGlvblZhcmlhbnRzLnJlZHVjZSgocHJldmlvdXNWYWx1ZTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4sIHNlbGVjdGlvblZhcmlhbnQpID0+IHtcblx0XHRzZWxlY3Rpb25WYXJpYW50LnByb3BlcnR5TmFtZXMuZm9yRWFjaChwcm9wZXJ0eU5hbWUgPT4ge1xuXHRcdFx0cHJldmlvdXNWYWx1ZVtwcm9wZXJ0eU5hbWVdID0gdHJ1ZTtcblx0XHR9KTtcblx0XHRyZXR1cm4gcHJldmlvdXNWYWx1ZTtcblx0fSwge30pO1xufVxuXG4vKipcbiAqIENoZWNrIHRoYXQgYWxsIHRoZSB0YWJsZXMgZm9yIGEgZGVkaWNhdGVkIGVudGl0eSBzZXQgYXJlIGNvbmZpZ3VyZWQgYXMgYW5hbHl0aWNhbCB0YWJsZS5cbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxpc3RSZXBvcnRUYWJsZXMgTGlzdCByZXBvcnQgdGFibGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGV4dFBhdGhcbiAqIEByZXR1cm5zIHtib29sZWFufSBJcyBGaWx0ZXJCYXIgc2VhcmNoIGZpZWxkIGhpZGRlbiBvciBub3RcbiAqL1xuZnVuY3Rpb24gY2hlY2tBbGxUYWJsZUZvckVudGl0eVNldEFyZUFuYWx5dGljYWwobGlzdFJlcG9ydFRhYmxlczogVGFibGVWaXN1YWxpemF0aW9uW10sIGNvbnRleHRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0aWYgKGNvbnRleHRQYXRoICYmIGxpc3RSZXBvcnRUYWJsZXMubGVuZ3RoID4gMCkge1xuXHRcdHJldHVybiBsaXN0UmVwb3J0VGFibGVzLmV2ZXJ5KHZpc3VhbGl6YXRpb24gPT4ge1xuXHRcdFx0cmV0dXJuIHZpc3VhbGl6YXRpb24uZW5hYmxlQW5hbHl0aWNzICYmIGNvbnRleHRQYXRoID09PSB2aXN1YWxpemF0aW9uLmFubm90YXRpb24uY29sbGVjdGlvbjtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvblZhcmlhbnRzKFxuXHRsclRhYmxlVmlzdWFsaXphdGlvbnM6IFRhYmxlVmlzdWFsaXphdGlvbltdLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBTZWxlY3Rpb25WYXJpYW50Q29uZmlndXJhdGlvbltdIHtcblx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXHRyZXR1cm4gbHJUYWJsZVZpc3VhbGl6YXRpb25zXG5cdFx0Lm1hcCh2aXN1YWxpemF0aW9uID0+IHtcblx0XHRcdGNvbnN0IHRhYmxlRmlsdGVycyA9IHZpc3VhbGl6YXRpb24uY29udHJvbC5maWx0ZXJzO1xuXHRcdFx0Y29uc3QgdGFibGVTVkNvbmZpZ3M6IFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uW10gPSBbXTtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIHRhYmxlRmlsdGVycykge1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh0YWJsZUZpbHRlcnNba2V5XS5wYXRocykpIHtcblx0XHRcdFx0XHRjb25zdCBwYXRocyA9IHRhYmxlRmlsdGVyc1trZXldLnBhdGhzO1xuXHRcdFx0XHRcdHBhdGhzLmZvckVhY2gocGF0aCA9PiB7XG5cdFx0XHRcdFx0XHRpZiAocGF0aCAmJiBwYXRoLmFubm90YXRpb25QYXRoICYmIHNlbGVjdGlvblZhcmlhbnRQYXRocy5pbmRleE9mKHBhdGguYW5ub3RhdGlvblBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRzZWxlY3Rpb25WYXJpYW50UGF0aHMucHVzaChwYXRoLmFubm90YXRpb25QYXRoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VsZWN0aW9uVmFyaWFudENvbmZpZyA9IGdldFNlbGVjdGlvblZhcmlhbnRDb25maWd1cmF0aW9uKHBhdGguYW5ub3RhdGlvblBhdGgsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRpZiAoc2VsZWN0aW9uVmFyaWFudENvbmZpZykge1xuXHRcdFx0XHRcdFx0XHRcdHRhYmxlU1ZDb25maWdzLnB1c2goc2VsZWN0aW9uVmFyaWFudENvbmZpZyk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRhYmxlU1ZDb25maWdzO1xuXHRcdH0pXG5cdFx0LnJlZHVjZSgoc3ZDb25maWdzLCBzZWxlY3Rpb25WYXJpYW50KSA9PiBzdkNvbmZpZ3MuY29uY2F0KHNlbGVjdGlvblZhcmlhbnQpLCBbXSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29uZGl0aW9uIHBhdGggcmVxdWlyZWQgZm9yIHRoZSBjb25kaXRpb24gbW9kZWwuIEl0IGxvb2tzIGFzIGZvbGxvd3M6XG4gKiA8MTpOLVByb3BlcnR5TmFtZT4qXFwvPDE6MS1Qcm9wZXJ0eU5hbWU+LzxQcm9wZXJ0eU5hbWU+LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSByb290IEVudGl0eVR5cGVcbiAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgdGFyZ2V0IHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGNvbmRpdGlvbiBwYXRoXG4gKi9cbmNvbnN0IF9nZXRDb25kaXRpb25QYXRoID0gZnVuY3Rpb24oZW50aXR5VHlwZTogRW50aXR5VHlwZSwgcHJvcGVydHlQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBwYXJ0cyA9IHByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdGxldCBwYXJ0aWFsUGF0aDtcblx0bGV0IGtleSA9IFwiXCI7XG5cdHdoaWxlIChwYXJ0cy5sZW5ndGgpIHtcblx0XHRsZXQgcGFydCA9IHBhcnRzLnNoaWZ0KCkgYXMgc3RyaW5nO1xuXHRcdHBhcnRpYWxQYXRoID0gcGFydGlhbFBhdGggPyBwYXJ0aWFsUGF0aCArIFwiL1wiICsgcGFydCA6IHBhcnQ7XG5cdFx0Y29uc3QgcHJvcGVydHk6IFByb3BlcnR5IHwgTmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5VHlwZS5yZXNvbHZlUGF0aChwYXJ0aWFsUGF0aCk7XG5cdFx0aWYgKHByb3BlcnR5Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmIHByb3BlcnR5LmlzQ29sbGVjdGlvbikge1xuXHRcdFx0cGFydCArPSBcIipcIjtcblx0XHR9XG5cdFx0a2V5ID0ga2V5ID8ga2V5ICsgXCIvXCIgKyBwYXJ0IDogcGFydDtcblx0fVxuXHRyZXR1cm4ga2V5O1xufTtcblxuY29uc3QgX2NyZWF0ZUZpbHRlclNlbGVjdGlvbkZpZWxkID0gZnVuY3Rpb24oXG5cdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdHByb3BlcnR5OiBQcm9wZXJ0eSxcblx0ZnVsbFByb3BlcnR5UGF0aDogc3RyaW5nLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCB7XG5cdC8vIGlnbm9yZSBjb21wbGV4IHByb3BlcnR5IHR5cGVzIGFuZCBoaWRkZW4gYW5ub3RhdGVkIG9uZXNcblx0aWYgKFxuXHRcdHByb3BlcnR5ICE9PSB1bmRlZmluZWQgJiZcblx0XHRwcm9wZXJ0eS50YXJnZXRUeXBlID09PSB1bmRlZmluZWQgJiZcblx0XHQoaW5jbHVkZUhpZGRlbiB8fCBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbj8udmFsdWVPZigpICE9PSB0cnVlKVxuXHQpIHtcblx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gY29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uRW50aXR5VHlwZShwcm9wZXJ0eSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGtleTogS2V5SGVscGVyLmdldFNlbGVjdGlvbkZpZWxkS2V5RnJvbVBhdGgoZnVsbFByb3BlcnR5UGF0aCksXG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogY29udmVydGVyQ29udGV4dC5nZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKGZ1bGxQcm9wZXJ0eVBhdGgpLFxuXHRcdFx0Y29uZGl0aW9uUGF0aDogX2dldENvbmRpdGlvblBhdGgoZW50aXR5VHlwZSwgZnVsbFByb3BlcnR5UGF0aCksXG5cdFx0XHRhdmFpbGFiaWxpdHk6XG5cdFx0XHRcdHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uSGlkZGVuRmlsdGVyPy52YWx1ZU9mKCkgPT09IHRydWUgPyBBdmFpbGFiaWxpdHlUeXBlLkhpZGRlbiA6IEF2YWlsYWJpbGl0eVR5cGUuQWRhcHRhdGlvbixcblx0XHRcdGxhYmVsOiBjb21waWxlQmluZGluZyhhbm5vdGF0aW9uRXhwcmVzc2lvbihwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24/LkxhYmVsPy52YWx1ZU9mKCkgfHwgcHJvcGVydHkubmFtZSkpLFxuXHRcdFx0Z3JvdXA6IHRhcmdldEVudGl0eVR5cGUubmFtZSxcblx0XHRcdGdyb3VwTGFiZWw6IGNvbXBpbGVCaW5kaW5nKFxuXHRcdFx0XHRhbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRFbnRpdHlUeXBlPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbD8udmFsdWVPZigpIHx8IHRhcmdldEVudGl0eVR5cGUubmFtZSlcblx0XHRcdClcblx0XHR9O1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxUeXBlKHNUeXBlOiBhbnkpIHtcblx0dHlwZSBkZWZhdWx0TW9kZWxUeXBlID0ge1xuXHRcdFtrZXk6IHN0cmluZ106IHtcblx0XHRcdFtrZXk6IHN0cmluZ106IHN0cmluZztcblx0XHR9O1xuXHR9O1xuXHRjb25zdCBtRGVmYXVsdFR5cGVGb3JFZG1UeXBlOiBkZWZhdWx0TW9kZWxUeXBlID0ge1xuXHRcdFwiRWRtLkJvb2xlYW5cIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkJvb2xcIlxuXHRcdH0sXG5cdFx0XCJFZG0uQnl0ZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLkRhdGVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkRhdGVcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRGF0ZVRpbWVcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkRhdGVcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRGF0ZVRpbWVPZmZzZXRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkRhdGVUaW1lT2Zmc2V0XCJcblx0XHR9LFxuXHRcdFwiRWRtLkRlY2ltYWxcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkRlY2ltYWxcIlxuXHRcdH0sXG5cdFx0XCJFZG0uRG91YmxlXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJGbG9hdFwiXG5cdFx0fSxcblx0XHRcIkVkbS5GbG9hdFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRmxvYXRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uR3VpZFwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiR3VpZFwiXG5cdFx0fSxcblx0XHRcIkVkbS5JbnQxNlwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLkludDMyXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJJbnRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uSW50NjRcIjoge1xuXHRcdFx0bW9kZWxUeXBlOiBcIkludFwiXG5cdFx0fSxcblx0XHRcIkVkbS5TQnl0ZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiSW50XCJcblx0XHR9LFxuXHRcdFwiRWRtLlNpbmdsZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiRmxvYXRcIlxuXHRcdH0sXG5cdFx0XCJFZG0uU3RyaW5nXCI6IHtcblx0XHRcdG1vZGVsVHlwZTogXCJTdHJpbmdcIlxuXHRcdH0sXG5cdFx0XCJFZG0uVGltZVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiVGltZU9mRGF5XCJcblx0XHR9LFxuXHRcdFwiRWRtLlRpbWVPZkRheVwiOiB7XG5cdFx0XHRtb2RlbFR5cGU6IFwiVGltZU9mRGF5XCJcblx0XHR9LFxuXHRcdFwiRWRtLlN0cmVhbVwiOiB7XG5cdFx0XHQvL25vIGNvcnJlc3BvbmRpbmcgbW9kZWxUeXBlIC0gaWdub3JlIGZvciBmaWx0ZXJpbmdcblx0XHR9XG5cdH07XG5cdHJldHVybiBzVHlwZSAmJiBzVHlwZSBpbiBtRGVmYXVsdFR5cGVGb3JFZG1UeXBlICYmIG1EZWZhdWx0VHlwZUZvckVkbVR5cGVbc1R5cGVdLm1vZGVsVHlwZTtcbn1cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHMgPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0bmF2aWdhdGlvblBhdGg6IHN0cmluZyxcblx0cHJvcGVydGllczogQXJyYXk8UHJvcGVydHk+IHwgdW5kZWZpbmVkLFxuXHRpbmNsdWRlSGlkZGVuOiBib29sZWFuLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4ge1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZE1hcDogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aDogc3RyaW5nID0gcHJvcGVydHkubmFtZTtcblx0XHRcdGNvbnN0IGZ1bGxQYXRoOiBzdHJpbmcgPSAobmF2aWdhdGlvblBhdGggPyBuYXZpZ2F0aW9uUGF0aCArIFwiL1wiIDogXCJcIikgKyBwcm9wZXJ0eVBhdGg7XG5cdFx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZChlbnRpdHlUeXBlLCBwcm9wZXJ0eSwgZnVsbFBhdGgsIGluY2x1ZGVIaWRkZW4sIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdFx0aWYgKHNlbGVjdGlvbkZpZWxkKSB7XG5cdFx0XHRcdHNlbGVjdGlvbkZpZWxkTWFwW2Z1bGxQYXRoXSA9IHNlbGVjdGlvbkZpZWxkO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZE1hcDtcbn07XG5cbmNvbnN0IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGggPSBmdW5jdGlvbihcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0cHJvcGVydHlQYXRoczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcblx0aW5jbHVkZUhpZGRlbjogYm9vbGVhbixcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+IHtcblx0bGV0IHNlbGVjdGlvbkZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+ID0ge307XG5cdGlmIChwcm9wZXJ0eVBhdGhzKSB7XG5cdFx0cHJvcGVydHlQYXRocy5mb3JFYWNoKChwcm9wZXJ0eVBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0bGV0IGxvY2FsU2VsZWN0aW9uRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD47XG5cblx0XHRcdGNvbnN0IHByb3BlcnR5OiBQcm9wZXJ0eSB8IE5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVR5cGUucmVzb2x2ZVBhdGgocHJvcGVydHlQYXRoKTtcblx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChwcm9wZXJ0eS5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHQvLyBoYW5kbGUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhcblx0XHRcdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0XHRcdHByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRwcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aW5jbHVkZUhpZGRlbixcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LnRhcmdldFR5cGUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0eS50YXJnZXRUeXBlLl90eXBlID09PSBcIkNvbXBsZXhUeXBlXCIpIHtcblx0XHRcdFx0Ly8gaGFuZGxlIENvbXBsZXhUeXBlIHByb3BlcnRpZXNcblx0XHRcdFx0bG9jYWxTZWxlY3Rpb25GaWVsZHMgPSBfZ2V0U2VsZWN0aW9uRmllbGRzKFxuXHRcdFx0XHRcdGVudGl0eVR5cGUsXG5cdFx0XHRcdFx0cHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LnRhcmdldFR5cGUucHJvcGVydGllcyxcblx0XHRcdFx0XHRpbmNsdWRlSGlkZGVuLFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoID0gcHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKVxuXHRcdFx0XHRcdD8gcHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdC5zcGxpdChcIi9cIilcblx0XHRcdFx0XHRcdFx0LnNwbGljZSgwLCAxKVxuXHRcdFx0XHRcdFx0XHQuam9pbihcIi9cIilcblx0XHRcdFx0XHQ6IFwiXCI7XG5cdFx0XHRcdGxvY2FsU2VsZWN0aW9uRmllbGRzID0gX2dldFNlbGVjdGlvbkZpZWxkcyhlbnRpdHlUeXBlLCBuYXZpZ2F0aW9uUGF0aCwgW3Byb3BlcnR5XSwgaW5jbHVkZUhpZGRlbiwgY29udmVydGVyQ29udGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdGlvbkZpZWxkcyA9IHtcblx0XHRcdFx0Li4uc2VsZWN0aW9uRmllbGRzLFxuXHRcdFx0XHQuLi5sb2NhbFNlbGVjdGlvbkZpZWxkc1xuXHRcdFx0fTtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0aW9uRmllbGRzO1xufTtcblxuY29uc3QgX2dldEZpbHRlckZpZWxkID0gZnVuY3Rpb24oXG5cdGZpbHRlckZpZWxkczogUmVjb3JkPHN0cmluZywgRmlsdGVyRmllbGQ+LFxuXHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZVxuKTogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQge1xuXHRsZXQgZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gZmlsdGVyRmllbGRzW3Byb3BlcnR5UGF0aF07XG5cdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdGRlbGV0ZSBmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXTtcblx0fSBlbHNlIHtcblx0XHRmaWx0ZXJGaWVsZCA9IF9jcmVhdGVGaWx0ZXJTZWxlY3Rpb25GaWVsZChlbnRpdHlUeXBlLCBlbnRpdHlUeXBlLnJlc29sdmVQYXRoKHByb3BlcnR5UGF0aCksIHByb3BlcnR5UGF0aCwgdHJ1ZSwgY29udmVydGVyQ29udGV4dCk7XG5cdH1cblx0aWYgKCFmaWx0ZXJGaWVsZCkge1xuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGlhZ25vc3RpY3MoKT8uYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5LkhpZ2gsIElzc3VlVHlwZS5NSVNTSU5HX1NFTEVDVElPTkZJRUxEKTtcblx0fVxuXHQvLyBkZWZpbmVkIFNlbGVjdGlvbkZpZWxkcyBhcmUgYXZhaWxhYmxlIGJ5IGRlZmF1bHRcblx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0ZmlsdGVyRmllbGQuYXZhaWxhYmlsaXR5ID0gQXZhaWxhYmlsaXR5VHlwZS5EZWZhdWx0O1xuXHRcdGZpbHRlckZpZWxkLmlzUGFyYW1ldGVyID0gISFlbnRpdHlUeXBlLmFubm90YXRpb25zPy5Db21tb24/LlJlc3VsdENvbnRleHQ7XG5cdH1cblx0cmV0dXJuIGZpbHRlckZpZWxkO1xufTtcblxuY29uc3QgX2dldERlZmF1bHRGaWx0ZXJGaWVsZHMgPSBmdW5jdGlvbihcblx0ZmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sXG5cdGFTZWxlY3RPcHRpb25zOiBhbnlbXSxcblx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPixcblx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzOiBQcm9wZXJ0eVBhdGhbXVxuKTogRmlsdGVyRmllbGRbXSB7XG5cdGNvbnN0IHNlbGVjdGlvbkZpZWxkczogRmlsdGVyRmllbGRbXSA9IFtdO1xuXHRjb25zdCBVSVNlbGVjdGlvbkZpZWxkczogYW55ID0ge307XG5cdGNvbnN0IHByb3BlcnRpZXMgPSBlbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXM7XG5cdC8vIFVzaW5nIGVudGl0eVR5cGUgaW5zdGVhZCBvZiBlbnRpdHlTZXRcblx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5mb3JFYWNoKFNlbGVjdGlvbkZpZWxkID0+IHtcblx0XHRVSVNlbGVjdGlvbkZpZWxkc1tTZWxlY3Rpb25GaWVsZC52YWx1ZV0gPSB0cnVlO1xuXHR9KTtcblx0aWYgKGFTZWxlY3RPcHRpb25zICYmIGFTZWxlY3RPcHRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRhU2VsZWN0T3B0aW9ucz8uZm9yRWFjaCgoc2VsZWN0T3B0aW9uOiBTZWxlY3RPcHRpb25UeXBlKSA9PiB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWU6IGFueSA9IHNlbGVjdE9wdGlvbi5Qcm9wZXJ0eU5hbWU7XG5cdFx0XHRjb25zdCBzUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBwcm9wZXJ0eU5hbWUudmFsdWU7XG5cdFx0XHRjb25zdCBVSVNlbGVjdGlvbkZpZWxkczogYW55ID0ge307XG5cdFx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM/LmZvckVhY2goU2VsZWN0aW9uRmllbGQgPT4ge1xuXHRcdFx0XHRVSVNlbGVjdGlvbkZpZWxkc1tTZWxlY3Rpb25GaWVsZC52YWx1ZV0gPSB0cnVlO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAoIShzUHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0aWYgKCEoc1Byb3BlcnR5UGF0aCBpbiBVSVNlbGVjdGlvbkZpZWxkcykpIHtcblx0XHRcdFx0XHRjb25zdCBGaWx0ZXJGaWVsZDogRmlsdGVyRmllbGQgfCB1bmRlZmluZWQgPSBfZ2V0RmlsdGVyRmllbGQoZmlsdGVyRmllbGRzLCBzUHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRpZiAoRmlsdGVyRmllbGQpIHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKEZpbHRlckZpZWxkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSBlbHNlIGlmIChwcm9wZXJ0aWVzKSB7XG5cdFx0cHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IGRlZmF1bHRGaWx0ZXJWYWx1ZSA9IHByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LkZpbHRlckRlZmF1bHRWYWx1ZTtcblx0XHRcdGNvbnN0IFByb3BlcnR5UGF0aCA9IHByb3BlcnR5Lm5hbWU7XG5cdFx0XHRpZiAoIShQcm9wZXJ0eVBhdGggaW4gZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKSkge1xuXHRcdFx0XHRpZiAoZGVmYXVsdEZpbHRlclZhbHVlICYmICEoUHJvcGVydHlQYXRoIGluIFVJU2VsZWN0aW9uRmllbGRzKSkge1xuXHRcdFx0XHRcdGNvbnN0IEZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGaWVsZChmaWx0ZXJGaWVsZHMsIFByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0aWYgKEZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChGaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcbn07XG5cbi8qKlxuICogR2V0IGFsbCBwYXJhbWV0ZXIgZmlsdGVyIGZpZWxkcyBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7RmlsdGVyRmllbGRbXX0gQW4gYXJyYXkgb2YgcGFyYW1ldGVyIGZpbHRlcmZpZWxkc1xuICovXG5mdW5jdGlvbiBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBGaWx0ZXJGaWVsZFtdIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCBwYXJhbWV0ZXJFbnRpdHlUeXBlID0gZGF0YU1vZGVsT2JqZWN0UGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRjb25zdCBpc1BhcmFtZXRlcml6ZWQgPSAhIXBhcmFtZXRlckVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LkNvbW1vbj8uUmVzdWx0Q29udGV4dDtcblx0Y29uc3QgcGFyYW1ldGVyQ29udmVydGVyQ29udGV4dCA9XG5cdFx0aXNQYXJhbWV0ZXJpemVkICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihcIi9cIiArIGRhdGFNb2RlbE9iamVjdFBhdGguc3RhcnRpbmdFbnRpdHlTZXQubmFtZSk7XG5cblx0Y29uc3QgcGFyYW1ldGVyRmllbGRzID0gKHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHRcblx0XHQ/IHBhcmFtZXRlckVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoZnVuY3Rpb24ocHJvcGVydHkpIHtcblx0XHRcdFx0cmV0dXJuIF9nZXRGaWx0ZXJGaWVsZCh7fSBhcyBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZD4sIHByb3BlcnR5Lm5hbWUsIHBhcmFtZXRlckNvbnZlcnRlckNvbnRleHQsIHBhcmFtZXRlckVudGl0eVR5cGUpO1xuXHRcdCAgfSlcblx0XHQ6IFtdKSBhcyBGaWx0ZXJGaWVsZFtdO1xuXG5cdHJldHVybiBwYXJhbWV0ZXJGaWVsZHM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgRmlsdGVyQmFyIHNlYXJjaCBmaWVsZCBpcyBoaWRkZW4gb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7VGFibGVWaXN1YWxpemF0aW9uW119IGxpc3RSZXBvcnRUYWJsZXMgVGhlIGxpc3QgcmVwb3J0IHRhYmxlc1xuICogQHBhcmFtIHtDaGFydFZpc3VhbGl6YXRpb25bXX0gY2hhcnRzIFRoZSBBTFAgY2hhcnRzXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVGhlIGluZm9ybWF0aW9uIGlmIHRoZSBGaWx0ZXJCYXIgc2VhcmNoIGZpZWxkIGlzIGhpZGRlbiBvciBub3RcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZpbHRlckJhcmhpZGVCYXNpY1NlYXJjaCA9IGZ1bmN0aW9uKFxuXHRsaXN0UmVwb3J0VGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSxcblx0Y2hhcnRzOiBDaGFydFZpc3VhbGl6YXRpb25bXSxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dFxuKTogYm9vbGVhbiB7XG5cdC8vIENoZWNrIGlmIGNoYXJ0cyBhbGxvdyBzZWFyY2hcblx0Y29uc3Qgbm9TZWFyY2hJbkNoYXJ0cyA9IGNoYXJ0cy5sZW5ndGggPT09IDAgfHwgY2hhcnRzLmV2ZXJ5KGNoYXJ0ID0+ICFjaGFydC5hcHBseVN1cHBvcnRlZC5lbmFibGVTZWFyY2gpO1xuXG5cdC8vIENoZWNrIGlmIGFsbCB0YWJsZXMgYXJlIGFuYWx5dGljYWwgYW5kIG5vbmUgb2YgdGhlbSBhbGxvdyBmb3Igc2VhcmNoXG5cdGNvbnN0IG5vU2VhcmNoSW5UYWJsZXMgPVxuXHRcdGxpc3RSZXBvcnRUYWJsZXMubGVuZ3RoID09PSAwIHx8IGxpc3RSZXBvcnRUYWJsZXMuZXZlcnkodGFibGUgPT4gdGFibGUuZW5hYmxlQW5hbHl0aWNzICYmICF0YWJsZS5lbmFibGVBbmFseXRpY3NTZWFyY2gpO1xuXG5cdGNvbnN0IGNvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRpZiAoY29udGV4dFBhdGggJiYgbm9TZWFyY2hJbkNoYXJ0cyAmJiBub1NlYXJjaEluVGFibGVzKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBmaWx0ZXIgZmllbGRzIGZyb20gdGhlIG1hbmlmZXN0LlxuICpcbiAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBjdXJyZW50IGVudGl0eVR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD59IFRoZSBmaWx0ZXIgZmllbGRzIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0XG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21FbGVtZW50RmlsdGVyRmllbGQ+IHtcblx0Y29uc3QgZmJDb25maWc6IEZpbHRlck1hbmlmZXN0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuZ2V0RmlsdGVyQ29uZmlndXJhdGlvbigpO1xuXHRjb25zdCBkZWZpbmVkRmlsdGVyRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJGaWVsZE1hbmlmZXN0Q29uZmlndXJhdGlvbj4gPSBmYkNvbmZpZz8uZmlsdGVyRmllbGRzIHx8IHt9O1xuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IF9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgoXG5cdFx0ZW50aXR5VHlwZSxcblx0XHRPYmplY3Qua2V5cyhkZWZpbmVkRmlsdGVyRmllbGRzKS5tYXAoa2V5ID0+IEtleUhlbHBlci5nZXRQYXRoRnJvbVNlbGVjdGlvbkZpZWxkS2V5KGtleSkpLFxuXHRcdHRydWUsXG5cdFx0Y29udmVydGVyQ29udGV4dFxuXHQpO1xuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRGaWx0ZXJGaWVsZD4gPSB7fTtcblxuXHRmb3IgKGNvbnN0IHNLZXkgaW4gZGVmaW5lZEZpbHRlckZpZWxkcykge1xuXHRcdGNvbnN0IGZpbHRlckZpZWxkID0gZGVmaW5lZEZpbHRlckZpZWxkc1tzS2V5XTtcblx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBLZXlIZWxwZXIuZ2V0UGF0aEZyb21TZWxlY3Rpb25GaWVsZEtleShzS2V5KTtcblx0XHRjb25zdCBzZWxlY3Rpb25GaWVsZCA9IHNlbGVjdGlvbkZpZWxkc1twcm9wZXJ0eU5hbWVdO1xuXHRcdGNvbnN0IHR5cGUgPSBmaWx0ZXJGaWVsZC50eXBlID09PSBcIlNsb3RcIiA/IGZpbHRlckZpZWxkVHlwZS5TbG90IDogZmlsdGVyRmllbGRUeXBlLkRlZmF1bHQ7XG5cdFx0Y29uc3QgdmlzdWFsRmlsdGVyID1cblx0XHRcdGZpbHRlckZpZWxkICYmIGZpbHRlckZpZWxkPy52aXN1YWxGaWx0ZXJcblx0XHRcdFx0PyBnZXRWaXN1YWxGaWx0ZXJzKGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQsIHNLZXksIGRlZmluZWRGaWx0ZXJGaWVsZHMpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGZpbHRlckZpZWxkc1tzS2V5XSA9IHtcblx0XHRcdGtleTogc0tleSxcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRhbm5vdGF0aW9uUGF0aDogc2VsZWN0aW9uRmllbGQ/LmFubm90YXRpb25QYXRoLFxuXHRcdFx0Y29uZGl0aW9uUGF0aDogc2VsZWN0aW9uRmllbGQ/LmNvbmRpdGlvblBhdGggfHwgcHJvcGVydHlOYW1lLFxuXHRcdFx0dGVtcGxhdGU6IGZpbHRlckZpZWxkLnRlbXBsYXRlLFxuXHRcdFx0bGFiZWw6IGZpbHRlckZpZWxkLmxhYmVsLFxuXHRcdFx0cG9zaXRpb246IGZpbHRlckZpZWxkLnBvc2l0aW9uIHx8IHsgcGxhY2VtZW50OiBQbGFjZW1lbnQuQWZ0ZXIgfSxcblx0XHRcdGF2YWlsYWJpbGl0eTogZmlsdGVyRmllbGQuYXZhaWxhYmlsaXR5IHx8IEF2YWlsYWJpbGl0eVR5cGUuRGVmYXVsdCxcblx0XHRcdHNldHRpbmdzOiBmaWx0ZXJGaWVsZC5zZXR0aW5ncyxcblx0XHRcdHZpc3VhbEZpbHRlcjogdmlzdWFsRmlsdGVyXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gZmlsdGVyRmllbGRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbHRlckZpZWxkID0gZnVuY3Rpb24ocHJvcGVydHlQYXRoOiBzdHJpbmcsIGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcblx0cmV0dXJuIF9nZXRGaWx0ZXJGaWVsZCh7fSwgcHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWx0ZXJSZXN0cmljdGlvbnMgPSBmdW5jdGlvbihvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbjogYW55LCBzUmVzdHJpY3Rpb246IGFueSkge1xuXHRpZiAoc1Jlc3RyaWN0aW9uID09PSBcIlJlcXVpcmVkUHJvcGVydGllc1wiIHx8IHNSZXN0cmljdGlvbiA9PT0gXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiKSB7XG5cdFx0bGV0IGFQcm9wcyA9IFtdO1xuXHRcdGlmIChvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbiAmJiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb25dKSB7XG5cdFx0XHRhUHJvcHMgPSBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbltzUmVzdHJpY3Rpb25dLm1hcChmdW5jdGlvbihvUHJvcGVydHk6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5LiRQcm9wZXJ0eVBhdGggfHwgb1Byb3BlcnR5LnZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBhUHJvcHM7XG5cdH0gZWxzZSBpZiAoc1Jlc3RyaWN0aW9uID09PSBcIkZpbHRlckFsbG93ZWRFeHByZXNzaW9uc1wiKSB7XG5cdFx0Y29uc3QgbUFsbG93ZWRFeHByZXNzaW9ucyA9IHt9IGFzIGFueTtcblx0XHRpZiAob0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24gJiYgb0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucykge1xuXHRcdFx0b0ZpbHRlclJlc3RyaWN0aW9uc0Fubm90YXRpb24uRmlsdGVyRXhwcmVzc2lvblJlc3RyaWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0XHRcdC8vU2luZ2xlVmFsdWUgfCBNdWx0aVZhbHVlIHwgU2luZ2xlUmFuZ2UgfCBNdWx0aVJhbmdlIHwgU2VhcmNoRXhwcmVzc2lvbiB8IE11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cblx0XHRcdFx0aWYgKG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LnZhbHVlXSkge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LnZhbHVlXS5wdXNoKG9Qcm9wZXJ0eS5BbGxvd2VkRXhwcmVzc2lvbnMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1BbGxvd2VkRXhwcmVzc2lvbnNbb1Byb3BlcnR5LlByb3BlcnR5LnZhbHVlXSA9IFtvUHJvcGVydHkuQWxsb3dlZEV4cHJlc3Npb25zXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBtQWxsb3dlZEV4cHJlc3Npb25zO1xuXHR9XG5cdHJldHVybiBvRmlsdGVyUmVzdHJpY3Rpb25zQW5ub3RhdGlvbjtcbn07XG5cbmNvbnN0IGdldFNlYXJjaEZpbHRlclByb3BlcnR5SW5mbyA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4ge1xuXHRcdG5hbWU6IFwiJHNlYXJjaFwiLFxuXHRcdHBhdGg6IFwiJHNlYXJjaFwiLFxuXHRcdGRhdGFUeXBlOiBcIkVkbS5TdHJpbmdcIixcblx0XHRtYXhDb25kaXRpb25zOiAxXG5cdH07XG59O1xuXG5jb25zdCBnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8gPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHtcblx0XHRuYW1lOiBcIiRlZGl0U3RhdGVcIixcblx0XHRwYXRoOiBcIiRlZGl0U3RhdGVcIixcblx0XHRncm91cExhYmVsOiBcIlwiLFxuXHRcdGdyb3VwOiBcIlwiLFxuXHRcdGRhdGFUeXBlOiBcIkVkbS5TdHJpbmdcIixcblx0XHR0b29sdGlwOiBudWxsLFxuXHRcdGhpZGRlbkZpbHRlcjogZmFsc2Vcblx0fTtcbn07XG5cbmNvbnN0IGdldFNlYXJjaFJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpIHtcblx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/LlNlYXJjaFJlc3RyaWN0aW9ucztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXROYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgc05hdmlnYXRpb25QYXRoOiBzdHJpbmcpIHtcblx0Y29uc3Qgb05hdmlnYXRpb25SZXN0cmljdGlvbnM6IGFueSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk/LmFubm90YXRpb25zPy5DYXBhYmlsaXRpZXM/Lk5hdmlnYXRpb25SZXN0cmljdGlvbnM7XG5cdGNvbnN0IGFSZXN0cmljdGVkUHJvcGVydGllcyA9IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zICYmIG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLlJlc3RyaWN0ZWRQcm9wZXJ0aWVzO1xuXHRyZXR1cm4gKFxuXHRcdGFSZXN0cmljdGVkUHJvcGVydGllcyAmJlxuXHRcdGFSZXN0cmljdGVkUHJvcGVydGllcy5maW5kKGZ1bmN0aW9uKG9SZXN0cmljdGVkUHJvcGVydHk6IGFueSkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0b1Jlc3RyaWN0ZWRQcm9wZXJ0eSAmJlxuXHRcdFx0XHRvUmVzdHJpY3RlZFByb3BlcnR5Lk5hdmlnYXRpb25Qcm9wZXJ0eSAmJlxuXHRcdFx0XHQob1Jlc3RyaWN0ZWRQcm9wZXJ0eS5OYXZpZ2F0aW9uUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT09IHNOYXZpZ2F0aW9uUGF0aCB8fFxuXHRcdFx0XHRcdG9SZXN0cmljdGVkUHJvcGVydHkuTmF2aWdhdGlvblByb3BlcnR5LnZhbHVlID09PSBzTmF2aWdhdGlvblBhdGgpXG5cdFx0XHQpO1xuXHRcdH0pXG5cdCk7XG59O1xuXG5jb25zdCBfZmV0Y2hCYXNpY1Byb3BlcnR5SW5mbyA9IGZ1bmN0aW9uKG9GaWx0ZXJGaWVsZEluZm86IGFueSkge1xuXHRyZXR1cm4ge1xuXHRcdGtleTogb0ZpbHRlckZpZWxkSW5mby5rZXksXG5cdFx0YW5ub3RhdGlvblBhdGg6IG9GaWx0ZXJGaWVsZEluZm8uYW5ub3RhdGlvblBhdGgsXG5cdFx0Y29uZGl0aW9uUGF0aDogb0ZpbHRlckZpZWxkSW5mby5jb25kaXRpb25QYXRoLFxuXHRcdG5hbWU6IG9GaWx0ZXJGaWVsZEluZm8uY29uZGl0aW9uUGF0aCxcblx0XHRwYXRoOiBvRmlsdGVyRmllbGRJbmZvLmNvbmRpdGlvblBhdGgsXG5cdFx0Z3JvdXBMYWJlbDogb0ZpbHRlckZpZWxkSW5mby5ncm91cExhYmVsLFxuXHRcdGdyb3VwOiBvRmlsdGVyRmllbGRJbmZvLmdyb3VwLFxuXHRcdGxhYmVsOiBvRmlsdGVyRmllbGRJbmZvLmxhYmVsLFxuXHRcdHRvb2x0aXA6IG51bGwsXG5cdFx0aGlkZGVuRmlsdGVyOiBvRmlsdGVyRmllbGRJbmZvLmF2YWlsYWJpbGl0eSA9PT0gXCJIaWRkZW5cIixcblx0XHRyZW1vdmVGcm9tQXBwU3RhdGU6IGZhbHNlLFxuXHRcdGhhc1ZhbHVlSGVscDogZmFsc2UsXG5cdFx0ZGlzcGxheTogXCJWYWx1ZVwiLFxuXHRcdGlzUGFyYW1ldGVyOiBvRmlsdGVyRmllbGRJbmZvLmlzUGFyYW1ldGVyLFxuXHRcdGNhc2VTZW5zaXRpdmU6IG9GaWx0ZXJGaWVsZEluZm8uY2FzZVNlbnNpdGl2ZSxcblx0XHRhdmFpbGFiaWxpdHk6IG9GaWx0ZXJGaWVsZEluZm8uYXZhaWxhYmlsaXR5LFxuXHRcdHBvc2l0aW9uOiBvRmlsdGVyRmllbGRJbmZvLnBvc2l0aW9uLFxuXHRcdHR5cGU6IG9GaWx0ZXJGaWVsZEluZm8udHlwZVxuXHR9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNwZWNpZmljQWxsb3dlZEV4cHJlc3Npb24gPSBmdW5jdGlvbihhRXhwcmVzc2lvbnM6IGFueSkge1xuXHRjb25zdCBhQWxsb3dlZEV4cHJlc3Npb25zUHJpb3JpdHkgPSBbXG5cdFx0XCJTaW5nbGVWYWx1ZVwiLFxuXHRcdFwiTXVsdGlWYWx1ZVwiLFxuXHRcdFwiU2luZ2xlUmFuZ2VcIixcblx0XHRcIk11bHRpUmFuZ2VcIixcblx0XHRcIlNlYXJjaEV4cHJlc3Npb25cIixcblx0XHRcIk11bHRpUmFuZ2VPclNlYXJjaEV4cHJlc3Npb25cIlxuXHRdO1xuXG5cdGFFeHByZXNzaW9ucy5zb3J0KGZ1bmN0aW9uKGE6IGFueSwgYjogYW55KSB7XG5cdFx0cmV0dXJuIGFBbGxvd2VkRXhwcmVzc2lvbnNQcmlvcml0eS5pbmRleE9mKGEpIC0gYUFsbG93ZWRFeHByZXNzaW9uc1ByaW9yaXR5LmluZGV4T2YoYik7XG5cdH0pO1xuXG5cdHJldHVybiBhRXhwcmVzc2lvbnNbMF07XG59O1xuXG5leHBvcnQgY29uc3QgZGlzcGxheU1vZGUgPSBmdW5jdGlvbihvUHJvcGVydHlBbm5vdGF0aW9uczogYW55LCBvQ29sbGVjdGlvbkFubm90YXRpb25zOiBhbnkpIHtcblx0Y29uc3Qgb1RleHRBbm5vdGF0aW9uID0gb1Byb3BlcnR5QW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCxcblx0XHRvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uID1cblx0XHRcdG9UZXh0QW5ub3RhdGlvbiAmJlxuXHRcdFx0KChvUHJvcGVydHlBbm5vdGF0aW9ucyAmJiBvUHJvcGVydHlBbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0Py5hbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkgfHxcblx0XHRcdFx0KG9Db2xsZWN0aW9uQW5ub3RhdGlvbnMgJiYgb0NvbGxlY3Rpb25Bbm5vdGF0aW9ucz8uVUk/LlRleHRBcnJhbmdlbWVudCkpO1xuXG5cdGlmIChvVGV4dEFycmFuZ21lbnRBbm5vdGF0aW9uKSB7XG5cdFx0aWYgKG9UZXh0QXJyYW5nbWVudEFubm90YXRpb24udmFsdWVPZigpID09PSBcIlVJLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dE9ubHlcIikge1xuXHRcdFx0cmV0dXJuIFwiRGVzY3JpcHRpb25cIjtcblx0XHR9IGVsc2UgaWYgKG9UZXh0QXJyYW5nbWVudEFubm90YXRpb24udmFsdWVPZigpID09PSBcIlVJLlRleHRBcnJhbmdlbWVudFR5cGUvVGV4dExhc3RcIikge1xuXHRcdFx0cmV0dXJuIFwiVmFsdWVEZXNjcmlwdGlvblwiO1xuXHRcdH1cblx0XHRyZXR1cm4gXCJEZXNjcmlwdGlvblZhbHVlXCI7IC8vVGV4dEZpcnN0XG5cdH1cblx0cmV0dXJuIG9UZXh0QW5ub3RhdGlvbiA/IFwiRGVzY3JpcHRpb25WYWx1ZVwiIDogXCJWYWx1ZVwiO1xufTtcblxuY29uc3QgX2ZldGNoUHJvcGVydHlJbmZvID0gZnVuY3Rpb24oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgb0ZpbHRlckZpZWxkSW5mbzogYW55LCBvVHlwZUNvbmZpZzogYW55KSB7XG5cdGxldCBvUHJvcGVydHlJbmZvID0gX2ZldGNoQmFzaWNQcm9wZXJ0eUluZm8ob0ZpbHRlckZpZWxkSW5mbyk7XG5cdGNvbnN0IHNBbm5vdGF0aW9uUGF0aCA9IG9GaWx0ZXJGaWVsZEluZm8uYW5ub3RhdGlvblBhdGg7XG5cblx0aWYgKCFzQW5ub3RhdGlvblBhdGgpIHtcblx0XHRyZXR1cm4gb1Byb3BlcnR5SW5mbztcblx0fVxuXHRjb25zdCB0YXJnZXRQcm9wZXJ0eU9iamVjdCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihzQW5ub3RhdGlvblBhdGgpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKS50YXJnZXRPYmplY3Q7XG5cdGNvbnN0IG9Qcm9wZXJ0eSA9IHtcblx0XHQkTWF4TGVuZ3RoOiB0YXJnZXRQcm9wZXJ0eU9iamVjdC5tYXhMZW5ndGgsXG5cdFx0JFR5cGU6IHRhcmdldFByb3BlcnR5T2JqZWN0LnR5cGUsXG5cdFx0JGtpbmQ6IHRhcmdldFByb3BlcnR5T2JqZWN0Ll90eXBlXG5cdH07XG5cdGNvbnN0IG9Qcm9wZXJ0eUFubm90YXRpb25zID0gdGFyZ2V0UHJvcGVydHlPYmplY3Q/LmFubm90YXRpb25zO1xuXHRjb25zdCBvQ29sbGVjdGlvbkFubm90YXRpb25zID0gY29udmVydGVyQ29udGV4dD8uZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uYW5ub3RhdGlvbnM7XG5cblx0bGV0IG9GaWx0ZXJEZWZhdWx0VmFsdWU7XG5cdGNvbnN0IG9Gb3JtYXRPcHRpb25zID0gb1R5cGVDb25maWcuZm9ybWF0T3B0aW9ucztcblx0Y29uc3Qgb0NvbnN0cmFpbnRzID0gb1R5cGVDb25maWcuY29uc3RyYWludHM7XG5cdGNvbnN0IGJSZW1vdmVGcm9tQXBwU3RhdGUgPVxuXHRcdG9Qcm9wZXJ0eUFubm90YXRpb25zPy5QZXJzb25hbERhdGE/LklzUG90ZW50aWFsbHlTZW5zaXRpdmUgfHxcblx0XHRvUHJvcGVydHlBbm5vdGF0aW9ucz8uRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dCB8fFxuXHRcdG9Qcm9wZXJ0eUFubm90YXRpb25zPy5BbmFseXRpY3M/Lk1lYXN1cmU7XG5cblx0Y29uc3Qgb0ZpbHRlckRlZmF1bHRWYWx1ZUFubm90YXRpb24gPSBvUHJvcGVydHlBbm5vdGF0aW9ucz8uQ29tbW9uPy5GaWx0ZXJEZWZhdWx0VmFsdWU7XG5cdGlmIChvRmlsdGVyRGVmYXVsdFZhbHVlQW5ub3RhdGlvbikge1xuXHRcdG9GaWx0ZXJEZWZhdWx0VmFsdWUgPSBvRmlsdGVyRGVmYXVsdFZhbHVlQW5ub3RhdGlvbltcIiRcIiArIGdldE1vZGVsVHlwZShvUHJvcGVydHkuJFR5cGUpXTtcblx0fVxuXHRvUHJvcGVydHlJbmZvID0gT2JqZWN0LmFzc2lnbihvUHJvcGVydHlJbmZvLCB7XG5cdFx0dG9vbHRpcDogb1Byb3BlcnR5QW5ub3RhdGlvbnM/LkNvbW1vbj8uUXVpY2tJbmZvPy52YWx1ZU9mKCkgfHwgdW5kZWZpbmVkLFxuXHRcdHJlbW92ZUZyb21BcHBTdGF0ZTogYlJlbW92ZUZyb21BcHBTdGF0ZSxcblx0XHRoYXNWYWx1ZUhlbHA6IGhhc1ZhbHVlSGVscCh0YXJnZXRQcm9wZXJ0eU9iamVjdCksXG5cdFx0Zm9ybWF0T3B0aW9uczogb0Zvcm1hdE9wdGlvbnMsXG5cdFx0Y29uc3RyYWludHM6IG9Db25zdHJhaW50cyxcblx0XHRkaXNwbGF5OiBkaXNwbGF5TW9kZShvUHJvcGVydHlBbm5vdGF0aW9ucywgb0NvbGxlY3Rpb25Bbm5vdGF0aW9ucyksXG5cdFx0ZGVmYXVsdEZpbHRlckNvbmRpdGlvbnM6IG9GaWx0ZXJEZWZhdWx0VmFsdWVcblx0XHRcdD8gW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGZpZWxkUGF0aDogb0ZpbHRlckZpZWxkSW5mby5jb25kaXRpb25QYXRoLFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IFwiRVFcIixcblx0XHRcdFx0XHRcdHZhbHVlczogW29GaWx0ZXJEZWZhdWx0VmFsdWVdXG5cdFx0XHRcdFx0fVxuXHRcdFx0ICBdXG5cdFx0XHQ6IHVuZGVmaW5lZFxuXHR9KTtcblx0cmV0dXJuIG9Qcm9wZXJ0eUluZm87XG59O1xuXG5leHBvcnQgY29uc3QgaXNNdWx0aVZhbHVlID0gZnVuY3Rpb24ob1Byb3BlcnR5OiBhbnkpIHtcblx0bGV0IGJJc011bHRpVmFsdWUgPSB0cnVlO1xuXHQvL1NpbmdsZVZhbHVlIHwgTXVsdGlWYWx1ZSB8IFNpbmdsZVJhbmdlIHwgTXVsdGlSYW5nZSB8IFNlYXJjaEV4cHJlc3Npb24gfCBNdWx0aVJhbmdlT3JTZWFyY2hFeHByZXNzaW9uXG5cdHN3aXRjaCAob1Byb3BlcnR5LmZpbHRlckV4cHJlc3Npb24pIHtcblx0XHRjYXNlIFwiU2VhcmNoRXhwcmVzc2lvblwiOlxuXHRcdGNhc2UgXCJTaW5nbGVSYW5nZVwiOlxuXHRcdGNhc2UgXCJTaW5nbGVWYWx1ZVwiOlxuXHRcdFx0YklzTXVsdGlWYWx1ZSA9IGZhbHNlO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGJyZWFrO1xuXHR9XG5cdGlmIChvUHJvcGVydHkudHlwZSAmJiBvUHJvcGVydHkudHlwZS5pbmRleE9mKFwiQm9vbGVhblwiKSA+IDApIHtcblx0XHRiSXNNdWx0aVZhbHVlID0gZmFsc2U7XG5cdH1cblx0cmV0dXJuIGJJc011bHRpVmFsdWU7XG59O1xuXG5jb25zdCBnZXRBbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEgPSBmdW5jdGlvbihcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0bHJUYWJsZXM6IFRhYmxlVmlzdWFsaXphdGlvbltdID0gW10sXG5cdGFubm90YXRpb25QYXRoOiBzdHJpbmcgPSBcIlwiXG4pIHtcblx0Ly8gRmV0Y2ggYWxsIHNlbGVjdGlvblZhcmlhbnRzIGRlZmluZWQgaW4gdGhlIGRpZmZlcmVudCB2aXN1YWxpemF0aW9ucyBhbmQgZGlmZmVyZW50IHZpZXdzIChtdWx0aSB0YWJsZSBtb2RlKVxuXHRjb25zdCBzZWxlY3Rpb25WYXJpYW50czogU2VsZWN0aW9uVmFyaWFudENvbmZpZ3VyYXRpb25bXSA9IGdldFNlbGVjdGlvblZhcmlhbnRzKGxyVGFibGVzLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGluIHNlbGVjdGlvbiB2YXJpYW50c1xuXHRjb25zdCBleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0gZ2V0RXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzKHNlbGVjdGlvblZhcmlhbnRzKTtcblx0Y29uc3QgZW50aXR5VHlwZSA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpO1xuXHQvL0ZpbHRlcnMgd2hpY2ggaGFzIHRvIGJlIGFkZGVkIHdoaWNoIGlzIHBhcnQgb2YgU1YvRGVmYXVsdCBhbm5vdGF0aW9ucyBidXQgbm90IHByZXNlbnQgaW4gdGhlIFNlbGVjdGlvbkZpZWxkc1xuXHRjb25zdCBhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHMgPSAoKGFubm90YXRpb25QYXRoICYmIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZUFubm90YXRpb24oYW5ub3RhdGlvblBhdGgpPy5hbm5vdGF0aW9uKSB8fFxuXHRcdGVudGl0eVR5cGUuYW5ub3RhdGlvbnM/LlVJPy5TZWxlY3Rpb25GaWVsZHMgfHxcblx0XHRbXSkgYXMgUHJvcGVydHlQYXRoW107XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIGFsbCBwb3RlbnRpYWwgZmlsdGVyIGZpZWxkcyBiYXNlZCBvbi4uLlxuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IHtcblx0XHQvLyAuLi5ub24gaGlkZGVuIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eVxuXHRcdC4uLl9nZXRTZWxlY3Rpb25GaWVsZHMoZW50aXR5VHlwZSwgXCJcIiwgZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLCBmYWxzZSwgY29udmVydGVyQ29udGV4dCksXG5cdFx0Ly8gLi4uYWRkaXRpb25hbCBtYW5pZmVzdCBkZWZpbmVkIG5hdmlnYXRpb24gcHJvcGVydGllc1xuXHRcdC4uLl9nZXRTZWxlY3Rpb25GaWVsZHNCeVBhdGgoXG5cdFx0XHRlbnRpdHlUeXBlLFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRGaWx0ZXJDb25maWd1cmF0aW9uKCkubmF2aWdhdGlvblByb3BlcnRpZXMsXG5cdFx0XHRmYWxzZSxcblx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHQpXG5cdH07XG5cblx0Y29uc3QgcHJvcGVydHlJbmZvRmllbGRzOiBhbnkgPVxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcz8ucmVkdWNlKChzZWxlY3Rpb25GaWVsZHM6IEZpbHRlckZpZWxkW10sIHNlbGVjdGlvbkZpZWxkKSA9PiB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVBhdGggPSBzZWxlY3Rpb25GaWVsZC52YWx1ZTtcblx0XHRcdGlmICghKHByb3BlcnR5UGF0aCBpbiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMpKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlckZpZWxkOiBGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCA9IF9nZXRGaWx0ZXJGaWVsZChmaWx0ZXJGaWVsZHMsIHByb3BlcnR5UGF0aCwgY29udmVydGVyQ29udGV4dCwgZW50aXR5VHlwZSk7XG5cdFx0XHRcdGlmIChmaWx0ZXJGaWVsZCkge1xuXHRcdFx0XHRcdGZpbHRlckZpZWxkLmdyb3VwID0gXCJcIjtcblx0XHRcdFx0XHRmaWx0ZXJGaWVsZC5ncm91cExhYmVsID0gXCJcIjtcblx0XHRcdFx0XHRzZWxlY3Rpb25GaWVsZHMucHVzaChmaWx0ZXJGaWVsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG5cdFx0fSwgW10pIHx8IFtdO1xuXG5cdHJldHVybiB7XG5cdFx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzOiBleGNsdWRlZEZpbHRlclByb3BlcnRpZXMsXG5cdFx0ZW50aXR5VHlwZTogZW50aXR5VHlwZSxcblx0XHRhbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZHM6IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyxcblx0XHRmaWx0ZXJGaWVsZHM6IGZpbHRlckZpZWxkcyxcblx0XHRwcm9wZXJ0eUluZm9GaWVsZHM6IHByb3BlcnR5SW5mb0ZpZWxkc1xuXHR9O1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlbGVjdGlvbiBmaWVsZHMgdGhhdCB3aWxsIGJlIHVzZWQgd2l0aGluIHRoZSBmaWx0ZXIgYmFyXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gdGFrZXMgaW50byBhY2NvdW50IGFubm90YXRpb24gYW5kIHRoZSBzZWxlY3Rpb24gdmFyaWFudHMuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1RhYmxlVmlzdWFsaXphdGlvbltdfSBsclRhYmxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGFubm90YXRpb25QYXRoXG4gKiBAcmV0dXJucyB7RmlsdGVyU2VsZWN0aW9uRmllbGRbXX0gQW4gYXJyYXkgb2Ygc2VsZWN0aW9uIGZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgZ2V0U2VsZWN0aW9uRmllbGRzID0gZnVuY3Rpb24oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGxyVGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSA9IFtdLFxuXHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nID0gXCJcIlxuKTogRmlsdGVyRmllbGRbXSB7XG5cdGNvbnN0IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEgPSBnZXRBbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEoY29udmVydGVyQ29udGV4dCwgbHJUYWJsZXMsIGFubm90YXRpb25QYXRoKTtcblxuXHQvLyBjcmVhdGUgYSBtYXAgb2YgcHJvcGVydGllcyB0byBiZSB1c2VkIGluIHNlbGVjdGlvbiB2YXJpYW50c1xuXHRjb25zdCBleGNsdWRlZEZpbHRlclByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0gb0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5leGNsdWRlZEZpbHRlclByb3BlcnRpZXM7XG5cdGNvbnN0IGVudGl0eVR5cGUgPSBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLmVudGl0eVR5cGU7XG5cdGNvbnN0IGZpbHRlckZhY2V0cyA9IGVudGl0eVR5cGUuYW5ub3RhdGlvbnMuVUk/LkZpbHRlckZhY2V0cztcblx0bGV0IGZpbHRlckZhY2V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBGaWx0ZXJHcm91cD4gPSB7fTtcblxuXHRjb25zdCBhRmllbGRHcm91cHMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiVUlcIiwgVUlBbm5vdGF0aW9uVGVybXMuRmllbGRHcm91cCk7XG5cblx0aWYgKGZpbHRlckZhY2V0cyA9PT0gdW5kZWZpbmVkIHx8IGZpbHRlckZhY2V0cy5sZW5ndGggPCAwKSB7XG5cdFx0Zm9yIChjb25zdCBpIGluIGFGaWVsZEdyb3Vwcykge1xuXHRcdFx0ZmlsdGVyRmFjZXRNYXAgPSB7XG5cdFx0XHRcdC4uLmZpbHRlckZhY2V0TWFwLFxuXHRcdFx0XHQuLi5nZXRGaWVsZEdyb3VwRmlsdGVyR3JvdXBzKGFGaWVsZEdyb3Vwc1tpXSBhcyBBbm5vdGF0aW9uVGVybTxGaWVsZEdyb3VwVHlwZT4pXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmaWx0ZXJGYWNldE1hcCA9IGZpbHRlckZhY2V0cy5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IFJlY29yZDxzdHJpbmcsIEZpbHRlckdyb3VwPiwgZmlsdGVyRmFjZXQ6IFJlZmVyZW5jZUZhY2V0VHlwZXMpID0+IHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgKGZpbHRlckZhY2V0LlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cHJldmlvdXNWYWx1ZVsoKGZpbHRlckZhY2V0LlRhcmdldC4kdGFyZ2V0IGFzIEZpZWxkR3JvdXApLkRhdGFbaV0gYXMgRGF0YUZpZWxkVHlwZXMpLlZhbHVlLnBhdGhdID0ge1xuXHRcdFx0XHRcdGdyb3VwOiBmaWx0ZXJGYWNldD8uSUQ/LnRvU3RyaW5nKCksXG5cdFx0XHRcdFx0Z3JvdXBMYWJlbDogZmlsdGVyRmFjZXQ/LkxhYmVsPy50b1N0cmluZygpXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcHJldmlvdXNWYWx1ZTtcblx0XHR9LCB7fSk7XG5cdH1cblxuXHRsZXQgYVNlbGVjdE9wdGlvbnM6IGFueVtdID0gW107XG5cdGNvbnN0IHNlbGVjdGlvblZhcmlhbnQgPSBnZXRTZWxlY3Rpb25WYXJpYW50KGVudGl0eVR5cGUsIGNvbnZlcnRlckNvbnRleHQpO1xuXHRpZiAoc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdGFTZWxlY3RPcHRpb25zID0gc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zO1xuXHR9XG5cblx0Ly8gY3JlYXRlIGEgbWFwIG9mIGFsbCBwb3RlbnRpYWwgZmlsdGVyIGZpZWxkcyBiYXNlZCBvbi4uLlxuXHRjb25zdCBmaWx0ZXJGaWVsZHM6IFJlY29yZDxzdHJpbmcsIEZpbHRlckZpZWxkPiA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuZmlsdGVyRmllbGRzO1xuXG5cdC8vRmlsdGVycyB3aGljaCBoYXMgdG8gYmUgYWRkZWQgd2hpY2ggaXMgcGFydCBvZiBTVi9EZWZhdWx0IGFubm90YXRpb25zIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgU2VsZWN0aW9uRmllbGRzXG5cdGNvbnN0IGFubm90YXRlZFNlbGVjdGlvbkZpZWxkcyA9IG9Bbm5vdGF0ZWRTZWxlY3Rpb25GaWVsZERhdGEuYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzO1xuXHRjb25zdCBkZWZhdWx0RmlsdGVycyA9IF9nZXREZWZhdWx0RmlsdGVyRmllbGRzKFxuXHRcdGZpbHRlckZpZWxkcyxcblx0XHRhU2VsZWN0T3B0aW9ucyxcblx0XHRlbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0ZXhjbHVkZWRGaWx0ZXJQcm9wZXJ0aWVzLFxuXHRcdGFubm90YXRlZFNlbGVjdGlvbkZpZWxkc1xuXHQpO1xuXHRjb25zdCBwYXJhbWV0ZXJGaWVsZHMgPSBfZ2V0UGFyYW1ldGVyRmllbGRzKGNvbnZlcnRlckNvbnRleHQpO1xuXHRjb25zdCBwcm9wZXJ0eUluZm9GaWVsZHM6IGFueSA9XG5cdFx0YW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzPy5yZWR1Y2UoKHNlbGVjdGlvbkZpZWxkczogRmlsdGVyRmllbGRbXSwgc2VsZWN0aW9uRmllbGQpID0+IHtcblx0XHRcdGNvbnN0IHByb3BlcnR5UGF0aCA9IHNlbGVjdGlvbkZpZWxkLnZhbHVlO1xuXHRcdFx0aWYgKCEocHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyRmllbGQ6IEZpbHRlckZpZWxkIHwgdW5kZWZpbmVkID0gX2dldEZpbHRlckZpZWxkKGZpbHRlckZpZWxkcywgcHJvcGVydHlQYXRoLCBjb252ZXJ0ZXJDb250ZXh0LCBlbnRpdHlUeXBlKTtcblx0XHRcdFx0aWYgKGZpbHRlckZpZWxkKSB7XG5cdFx0XHRcdFx0ZmlsdGVyRmllbGQuZ3JvdXAgPSBcIlwiO1xuXHRcdFx0XHRcdGZpbHRlckZpZWxkLmdyb3VwTGFiZWwgPSBcIlwiO1xuXHRcdFx0XHRcdHNlbGVjdGlvbkZpZWxkcy5wdXNoKGZpbHRlckZpZWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHNlbGVjdGlvbkZpZWxkcztcblx0XHR9LCBbXSkgfHwgW107XG5cblx0Ly8gZmluYWxseSBjcmVhdGUgZmluYWwgbGlzdCBvZiBmaWx0ZXIgZmllbGRzIGJ5IGFkZGluZyB0aGUgU2VsZWN0aW9uRmllbGRzIGZpcnN0IChvcmRlciBtYXR0ZXJzKS4uLlxuXHRsZXQgYWxsRmlsdGVycyA9IHBhcmFtZXRlckZpZWxkc1xuXHRcdC5jb25jYXQocHJvcGVydHlJbmZvRmllbGRzKVxuXHRcdC8vIFRvIGFkZCB0aGUgRmlsdGVyRmllbGQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlIFNlbGVjdGlvbiBGaWVsZHMgYnV0IHRoZSBwcm9wZXJ0eSBpcyBtZW50aW9uZWQgaW4gdGhlIFNlbGVjdGlvbiBWYXJpYW50XG5cdFx0LmNvbmNhdChkZWZhdWx0RmlsdGVycyB8fCBbXSlcblx0XHQvLyAuLi5hbmQgYWRkaW5nIHJlbWFpbmluZyBmaWx0ZXIgZmllbGRzLCB0aGF0IGFyZSBub3QgdXNlZCBpbiBhIFNlbGVjdGlvblZhcmlhbnQgKG9yZGVyIGRvZXNuJ3QgbWF0dGVyKVxuXHRcdC5jb25jYXQoXG5cdFx0XHRPYmplY3Qua2V5cyhmaWx0ZXJGaWVsZHMpXG5cdFx0XHRcdC5maWx0ZXIocHJvcGVydHlQYXRoID0+ICEocHJvcGVydHlQYXRoIGluIGV4Y2x1ZGVkRmlsdGVyUHJvcGVydGllcykpXG5cdFx0XHRcdC5tYXAocHJvcGVydHlQYXRoID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihmaWx0ZXJGaWVsZHNbcHJvcGVydHlQYXRoXSwgZmlsdGVyRmFjZXRNYXBbcHJvcGVydHlQYXRoXSk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblx0Y29uc3Qgc0NvbnRleHRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXG5cdC8vaWYgYWxsIHRhYmxlcyBhcmUgYW5hbHl0aWNhbCB0YWJsZXMgXCJhZ2dyZWdhdGFibGVcIiBwcm9wZXJ0aWVzIG11c3QgYmUgZXhjbHVkZWRcblx0aWYgKGNoZWNrQWxsVGFibGVGb3JFbnRpdHlTZXRBcmVBbmFseXRpY2FsKGxyVGFibGVzLCBzQ29udGV4dFBhdGgpKSB7XG5cdFx0Ly8gQ3VycmVudGx5IGFsbCBhZ3JlZ2F0ZXMgYXJlIHJvb3QgZW50aXR5IHByb3BlcnRpZXMgKG5vIHByb3BlcnRpZXMgY29taW5nIGZyb20gbmF2aWdhdGlvbikgYW5kIGFsbFxuXHRcdC8vIHRhYmxlcyB3aXRoIHNhbWUgZW50aXR5U2V0IGdldHMgc2FtZSBhZ2dyZWFndGUgY29uZmlndXJhdGlvbiB0aGF0J3Mgd2h5IHdlIGNhbiB1c2UgZmlyc3QgdGFibGUgaW50b1xuXHRcdC8vIExSIHRvIGdldCBhZ2dyZWdhdGVzICh3aXRob3V0IGN1cnJlbmN5L3VuaXQgcHJvcGVydGllcyBzaW5jZSB3ZSBleHBlY3QgdG8gYmUgYWJsZSB0byBmaWx0ZXIgdGhlbSkuXG5cdFx0Y29uc3QgYWdncmVnYXRlcyA9IGxyVGFibGVzWzBdLmFnZ3JlZ2F0ZXM7XG5cdFx0aWYgKGFnZ3JlZ2F0ZXMpIHtcblx0XHRcdGNvbnN0IGFnZ3JlZ2F0YWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMoYWdncmVnYXRlcykubWFwKGFnZ3JlZ2F0ZUtleSA9PiBhZ2dyZWdhdGVzW2FnZ3JlZ2F0ZUtleV0ucmVsYXRpdmVQYXRoKTtcblx0XHRcdGFsbEZpbHRlcnMgPSBhbGxGaWx0ZXJzLmZpbHRlcihmaWx0ZXJGaWVsZCA9PiB7XG5cdFx0XHRcdHJldHVybiBhZ2dyZWdhdGFibGVQcm9wZXJ0aWVzLmluZGV4T2YoZmlsdGVyRmllbGQua2V5KSA9PT0gLTE7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBzZWxlY3Rpb25GaWVsZHMgPSBpbnNlcnRDdXN0b21FbGVtZW50cyhhbGxGaWx0ZXJzLCBnZXRNYW5pZmVzdEZpbHRlckZpZWxkcyhlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KSwge1xuXHRcdFwiYXZhaWxhYmlsaXR5XCI6IFwib3ZlcndyaXRlXCIsXG5cdFx0bGFiZWw6IFwib3ZlcndyaXRlXCIsXG5cdFx0dHlwZTogXCJvdmVyd3JpdGVcIixcblx0XHRwb3NpdGlvbjogXCJvdmVyd3JpdGVcIixcblx0XHR0ZW1wbGF0ZTogXCJvdmVyd3JpdGVcIixcblx0XHRzZXR0aW5nczogXCJvdmVyd3JpdGVcIixcblx0XHR2aXN1YWxGaWx0ZXI6IFwib3ZlcndyaXRlXCJcblx0fSk7XG5cblx0Ly8gQWRkIGNhc2VTZW5zaXRpdmUgcHJvcGVydHkgdG8gYWxsIHNlbGVjdGlvbiBmaWVsZHMuXG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0c2VsZWN0aW9uRmllbGRzLmZvckVhY2goZmlsdGVyRmllbGQgPT4ge1xuXHRcdGZpbHRlckZpZWxkLmNhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7XG5cdH0pO1xuXG5cdHJldHVybiBzZWxlY3Rpb25GaWVsZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHJvcGVydHlJbmZvRmllbGRzID0gZnVuY3Rpb24oXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGxyVGFibGVzOiBUYWJsZVZpc3VhbGl6YXRpb25bXSA9IFtdLFxuXHRsckNoYXJ0czogQ2hhcnRWaXN1YWxpemF0aW9uW10gPSBbXSxcblx0YW5ub3RhdGlvblBhdGg6IHN0cmluZyA9IFwiXCJcbikge1xuXHRjb25zdCBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhID0gZ2V0QW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhKGNvbnZlcnRlckNvbnRleHQsIGxyVGFibGVzLCBhbm5vdGF0aW9uUGF0aCk7XG5cdC8vY29uc3QgYW5ub3RhdGVkU2VsZWN0aW9uRmllbGRzOiBhbnkgPSBvQW5ub3RhdGVkU2VsZWN0aW9uRmllbGREYXRhLmFubm90YXRlZFNlbGVjdGlvbkZpZWxkcztcblx0Y29uc3Qgc2VsZWN0aW9uRmllbGRUeXBlczogYW55ID0gW107XG5cdGNvbnN0IGlzQ2FzZVNlbnNpdGl2ZSA9IGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZShjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYVR5cGVDb25maWc6IGFueSA9IFtdO1xuXHRjb25zdCBfZm5UeXBlQ29uZmlnID0gZnVuY3Rpb24ocHJvcGVydHk6IFByb3BlcnR5KSB7XG5cdFx0Y29uc3Qgb1R5cGVDb25maWcgPSBnZXRUeXBlQ29uZmlnKHByb3BlcnR5LCB1bmRlZmluZWQpO1xuXHRcdHNlbGVjdGlvbkZpZWxkVHlwZXMucHVzaChwcm9wZXJ0eT8udHlwZSk7XG5cdFx0aWYgKHByb3BlcnR5Py50eXBlID09PSBcIkVkbS5TdHJpbmdcIiAmJiAoIW9UeXBlQ29uZmlnLmNvbnN0cmFpbnRzLm51bGxhYmxlIHx8IG9UeXBlQ29uZmlnLmNvbnN0cmFpbnRzLm51bGxhYmxlID09PSB0cnVlKSkge1xuXHRcdFx0b1R5cGVDb25maWcuZm9ybWF0T3B0aW9ucy5wYXJzZUtlZXBzRW1wdHlTdHJpbmcgPSBmYWxzZTtcblx0XHR9XG5cdFx0YVR5cGVDb25maWcucHVzaChvVHlwZUNvbmZpZyk7XG5cdH07XG5cblx0bGV0IHByb3BlcnR5SW5mb0ZpZWxkczogYW55ID0gb0Fubm90YXRlZFNlbGVjdGlvbkZpZWxkRGF0YS5wcm9wZXJ0eUluZm9GaWVsZHM7XG5cdGNvbnN0IHBhcmFtZXRlckZpZWxkcyA9IF9nZXRQYXJhbWV0ZXJGaWVsZHMoY29udmVydGVyQ29udGV4dCk7XG5cdHByb3BlcnR5SW5mb0ZpZWxkcyA9IHByb3BlcnR5SW5mb0ZpZWxkcy5jb25jYXQocGFyYW1ldGVyRmllbGRzKTtcblxuXHRwcm9wZXJ0eUluZm9GaWVsZHMgPSBpbnNlcnRDdXN0b21FbGVtZW50cyhcblx0XHRwcm9wZXJ0eUluZm9GaWVsZHMsXG5cdFx0Z2V0TWFuaWZlc3RGaWx0ZXJGaWVsZHMoY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlUeXBlKCksIGNvbnZlcnRlckNvbnRleHQpLFxuXHRcdHtcblx0XHRcdFwiYXZhaWxhYmlsaXR5XCI6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRsYWJlbDogXCJvdmVyd3JpdGVcIixcblx0XHRcdHR5cGU6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHRwb3NpdGlvbjogXCJvdmVyd3JpdGVcIixcblx0XHRcdHRlbXBsYXRlOiBcIm92ZXJ3cml0ZVwiLFxuXHRcdFx0c2V0dGluZ3M6IFwib3ZlcndyaXRlXCIsXG5cdFx0XHR2aXN1YWxGaWx0ZXI6IFwib3ZlcndyaXRlXCJcblx0XHR9XG5cdCk7XG5cblx0cHJvcGVydHlJbmZvRmllbGRzLmZvckVhY2goZnVuY3Rpb24ocGFyYW1ldGVyRmllbGQ6IGFueSkge1xuXHRcdGlmIChwYXJhbWV0ZXJGaWVsZC5hbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlDb252ZXJ0eUNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IocGFyYW1ldGVyRmllbGQuYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlUYXJnZXRPYmplY3QgPSBwcm9wZXJ0eUNvbnZlcnR5Q29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0O1xuXHRcdFx0X2ZuVHlwZUNvbmZpZyhwcm9wZXJ0eVRhcmdldE9iamVjdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNlbGVjdGlvbkZpZWxkVHlwZXMucHVzaChcIkVkbS5TdHJpbmdcIik7XG5cdFx0XHRhVHlwZUNvbmZpZy5wdXNoKHt9KTtcblx0XHR9XG5cdH0pO1xuXG5cdGNvbnN0IG9GaWx0ZXJSZXN0cmljdGlvbnMgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldCgpPy5hbm5vdGF0aW9ucz8uQ2FwYWJpbGl0aWVzPy5GaWx0ZXJSZXN0cmljdGlvbnM7XG5cdGNvbnN0IG9SZXQgPSB7fSBhcyBhbnk7XG5cdG9SZXRbXCJSZXF1aXJlZFByb3BlcnRpZXNcIl0gPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnMob0ZpbHRlclJlc3RyaWN0aW9ucywgXCJSZXF1aXJlZFByb3BlcnRpZXNcIikgfHwgW107XG5cdG9SZXRbXCJOb25GaWx0ZXJhYmxlUHJvcGVydGllc1wiXSA9IGdldEZpbHRlclJlc3RyaWN0aW9ucyhvRmlsdGVyUmVzdHJpY3Rpb25zLCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdO1xuXHRvUmV0W1wiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCJdID0gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9GaWx0ZXJSZXN0cmljdGlvbnMsIFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCIpIHx8IHt9O1xuXG5cdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb250ZXh0UGF0aCgpO1xuXHRjb25zdCBhUGF0aFBhcnRzID0gc0VudGl0eVNldFBhdGguc3BsaXQoXCIvXCIpO1xuXHRpZiAoYVBhdGhQYXJ0cy5sZW5ndGggPiAyKSB7XG5cdFx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gYVBhdGhQYXJ0c1thUGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuXHRcdGFQYXRoUGFydHMuc3BsaWNlKC0xLCAxKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvblJlc3RyaWN0aW9ucyA9IGdldE5hdmlnYXRpb25SZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCwgc05hdmlnYXRpb25QYXRoKTtcblx0XHRjb25zdCBvTmF2aWdhdGlvbkZpbHRlclJlc3RyaWN0aW9ucyA9IG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zICYmIG9OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLkZpbHRlclJlc3RyaWN0aW9ucztcblx0XHRvUmV0LlJlcXVpcmVkUHJvcGVydGllcy5jb25jYXQoZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zLCBcIlJlcXVpcmVkUHJvcGVydGllc1wiKSB8fCBbXSk7XG5cdFx0b1JldC5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcy5jb25jYXQoZ2V0RmlsdGVyUmVzdHJpY3Rpb25zKG9OYXZpZ2F0aW9uRmlsdGVyUmVzdHJpY3Rpb25zLCBcIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXCIpIHx8IFtdKTtcblx0XHRvUmV0LkZpbHRlckFsbG93ZWRFeHByZXNzaW9ucyA9IHtcblx0XHRcdC4uLihnZXRGaWx0ZXJSZXN0cmljdGlvbnMob05hdmlnYXRpb25GaWx0ZXJSZXN0cmljdGlvbnMsIFwiRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXCIpIHx8IHt9KSxcblx0XHRcdC4uLm9SZXQuRmlsdGVyQWxsb3dlZEV4cHJlc3Npb25zXG5cdFx0fTtcblx0fVxuXG5cdGNvbnN0IGFSZXF1aXJlZFByb3BzID0gb1JldC5SZXF1aXJlZFByb3BlcnRpZXM7XG5cdGNvbnN0IGFOb25GaWx0ZXJhYmxlUHJvcHMgPSBvUmV0Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzO1xuXHRjb25zdCBtQWxsb3dlZEV4cHJlc3Npb25zID0gb1JldC5GaWx0ZXJBbGxvd2VkRXhwcmVzc2lvbnM7XG5cdGxldCBvUHJvcGVydHlJbmZvO1xuXHRjb25zdCBhRmV0Y2hlZFByb3BlcnRpZXM6IGFueSA9IFtdLFxuXHRcdGFQYXJhbWV0ZXJGaWVsZHMgPSBbXTtcblx0T2JqZWN0LmtleXMocHJvcGVydHlJbmZvRmllbGRzKS5mb3JFYWNoKGZ1bmN0aW9uKHNGaWx0ZXJGaWVsZEtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0NvbnZlcnRlZFByb3BlcnR5ID0gcHJvcGVydHlJbmZvRmllbGRzW3NGaWx0ZXJGaWVsZEtleV07XG5cdFx0Y29uc3Qgc1Byb3BlcnR5UGF0aCA9IG9Db252ZXJ0ZWRQcm9wZXJ0eS5jb25kaXRpb25QYXRoLnJlcGxhY2UoL1xcK3xcXCovZywgXCJcIik7XG5cblx0XHRpZiAoYU5vbkZpbHRlcmFibGVQcm9wcy5pbmRleE9mKHNQcm9wZXJ0eVBhdGgpID09PSAtMSkge1xuXHRcdFx0b1Byb3BlcnR5SW5mbyA9IF9mZXRjaFByb3BlcnR5SW5mbyhjb252ZXJ0ZXJDb250ZXh0LCBvQ29udmVydGVkUHJvcGVydHksIGFUeXBlQ29uZmlnW3NGaWx0ZXJGaWVsZEtleV0pO1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8pIHtcblx0XHRcdFx0aWYgKG1BbGxvd2VkRXhwcmVzc2lvbnNbc1Byb3BlcnR5UGF0aF0gJiYgbUFsbG93ZWRFeHByZXNzaW9uc1tzUHJvcGVydHlQYXRoXS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b1Byb3BlcnR5SW5mbyA9IE9iamVjdC5hc3NpZ24ob1Byb3BlcnR5SW5mbywge1xuXHRcdFx0XHRcdFx0ZmlsdGVyRXhwcmVzc2lvbjogZ2V0U3BlY2lmaWNBbGxvd2VkRXhwcmVzc2lvbihtQWxsb3dlZEV4cHJlc3Npb25zW3NQcm9wZXJ0eVBhdGhdKVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Qcm9wZXJ0eUluZm8gPSBPYmplY3QuYXNzaWduKG9Qcm9wZXJ0eUluZm8sIHtcblx0XHRcdFx0XHRcdGZpbHRlckV4cHJlc3Npb246IFwiYXV0b1wiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b1Byb3BlcnR5SW5mbyA9IE9iamVjdC5hc3NpZ24ob1Byb3BlcnR5SW5mbywge1xuXHRcdFx0XHRcdG1heENvbmRpdGlvbnM6ICFvUHJvcGVydHlJbmZvLmlzUGFyYW1ldGVyICYmIGlzTXVsdGlWYWx1ZShvUHJvcGVydHlJbmZvKSA/IC0xIDogMSxcblx0XHRcdFx0XHRyZXF1aXJlZDogb1Byb3BlcnR5SW5mby5pc1BhcmFtZXRlciB8fCBhUmVxdWlyZWRQcm9wcy5pbmRleE9mKHNQcm9wZXJ0eVBhdGgpID49IDAsXG5cdFx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogaXNDYXNlU2Vuc2l0aXZlLFxuXHRcdFx0XHRcdHZpc2libGU6IG9Db252ZXJ0ZWRQcm9wZXJ0eS5hdmFpbGFiaWxpdHkgPT09IFwiRGVmYXVsdFwiLFxuXHRcdFx0XHRcdGRhdGFUeXBlOiBzZWxlY3Rpb25GaWVsZFR5cGVzW3NGaWx0ZXJGaWVsZEtleV1cblx0XHRcdFx0XHQvL2xhYmVsOiBnZXRMb2NhbGl6ZWRUZXh0KG9Db252ZXJ0ZWRQcm9wZXJ0eS5sYWJlbClcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0YUZldGNoZWRQcm9wZXJ0aWVzLnB1c2gob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGlmIChvUHJvcGVydHlJbmZvLmlzUGFyYW1ldGVyKSB7XG5cdFx0XHRcdFx0YVBhcmFtZXRlckZpZWxkcy5wdXNoKHNQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRpZiAoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkudGFyZ2V0T2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QpIHtcblx0XHRhRmV0Y2hlZFByb3BlcnRpZXMucHVzaChnZXRFZGl0U3RhdGVGaWx0ZXJQcm9wZXJ0eUluZm8oKSk7XG5cdH1cblxuXHRpZiAoc0VudGl0eVNldFBhdGggJiYgZ2V0RmlsdGVyQmFyaGlkZUJhc2ljU2VhcmNoKGxyVGFibGVzLCBsckNoYXJ0cywgY29udmVydGVyQ29udGV4dCkgIT09IHRydWUpIHtcblx0XHRjb25zdCBzZWFyY2hSZXN0cmljdGlvbnMgPSBnZXRTZWFyY2hSZXN0cmljdGlvbnMoY29udmVydGVyQ29udGV4dCk7XG5cdFx0aWYgKCFzZWFyY2hSZXN0cmljdGlvbnMgfHwgc2VhcmNoUmVzdHJpY3Rpb25zPy5TZWFyY2hhYmxlKSB7XG5cdFx0XHRhRmV0Y2hlZFByb3BlcnRpZXMucHVzaChnZXRTZWFyY2hGaWx0ZXJQcm9wZXJ0eUluZm8oKSk7XG5cdFx0fVxuXHR9XG5cblx0YUZldGNoZWRQcm9wZXJ0aWVzLnNvcnQoZnVuY3Rpb24oYTogYW55LCBiOiBhbnkpIHtcblx0XHRpZiAoYS5ncm91cExhYmVsID09PSB1bmRlZmluZWQgfHwgYS5ncm91cExhYmVsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gLTE7XG5cdFx0fVxuXHRcdGlmIChiLmdyb3VwTGFiZWwgPT09IHVuZGVmaW5lZCB8fCBiLmdyb3VwTGFiZWwgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0XHRyZXR1cm4gYS5ncm91cExhYmVsLmxvY2FsZUNvbXBhcmUoYi5ncm91cExhYmVsKTtcblx0fSk7XG5cblx0bGV0IHNGZXRjaFByb3BlcnRpZXMgPSBKU09OLnN0cmluZ2lmeShhRmV0Y2hlZFByb3BlcnRpZXMpO1xuXHRzRmV0Y2hQcm9wZXJ0aWVzID0gc0ZldGNoUHJvcGVydGllcy5yZXBsYWNlKC9cXHsvZywgXCJcXFxce1wiKTtcblx0c0ZldGNoUHJvcGVydGllcyA9IHNGZXRjaFByb3BlcnRpZXMucmVwbGFjZSgvXFx9L2csIFwiXFxcXH1cIik7XG5cblx0cmV0dXJuIHNGZXRjaFByb3BlcnRpZXM7XG59O1xuIl19
|