@sapui5/sap.fe.core 1.98.0 → 1.99.2
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 +64 -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 +561 -608
- package/src/sap/fe/core/actions/draft.ts +595 -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 +170 -392
- 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 +52 -47
- 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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* SAPUI5
|
|
3
|
-
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
(c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
|
|
4
5
|
*/
|
|
5
6
|
sap.ui.define(
|
|
6
7
|
[
|
|
@@ -236,10 +237,10 @@ sap.ui.define(
|
|
|
236
237
|
return sCurrentEntitySetName + "/" + sDataPropertyPath;
|
|
237
238
|
}
|
|
238
239
|
};
|
|
239
|
-
var oFieldControl = FieldHelper.fieldControl(sDataPropertyPath, oInterface);
|
|
240
240
|
oPropertyInfo =
|
|
241
241
|
(oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target) ||
|
|
242
242
|
(oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target);
|
|
243
|
+
// Datafield is not included in the FieldControl calculation, needs to be implemented
|
|
243
244
|
var isReadOnlyExpression = FieldControlHelper.isReadOnlyExpression(oPropertyInfo);
|
|
244
245
|
bChartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
|
|
245
246
|
if (
|
|
@@ -248,6 +249,7 @@ sap.ui.define(
|
|
|
248
249
|
!bIsImmutable &&
|
|
249
250
|
!bIsComputed &&
|
|
250
251
|
!bChartProperty &&
|
|
252
|
+
oColumnInfo.inputType &&
|
|
251
253
|
UIFormatters.getEditableExpression(oPropertyInfo, oDataFieldConverted, oDataModelObjectPath) !== "false"
|
|
252
254
|
) {
|
|
253
255
|
oResult = {
|
|
@@ -264,7 +266,7 @@ sap.ui.define(
|
|
|
264
266
|
"isValueHelpEnabledForUnit": bValueHelpEnabledForUnit ? bValueHelpEnabledForUnit : false,
|
|
265
267
|
"propertyPathForValueHelp": sCurrentEntitySetName + "/" + sDataPropertyPath,
|
|
266
268
|
"propertyPathForValueHelpUnit": sCurrentEntitySetName + "/" + sUnitPropertyPath,
|
|
267
|
-
"isFieldRequired":
|
|
269
|
+
"isFieldRequired": UIFormatters.getRequiredExpression(oPropertyInfo, oDataFieldConverted, true),
|
|
268
270
|
"defaultSelectionPath": sDataPropertyPath
|
|
269
271
|
? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath)
|
|
270
272
|
: false,
|
|
@@ -287,6 +289,7 @@ sap.ui.define(
|
|
|
287
289
|
getInputTypeForColumn: function(oColumn) {
|
|
288
290
|
return (
|
|
289
291
|
oColumn.getTemplate().getContent &&
|
|
292
|
+
oColumn.getTemplate().getContent() &&
|
|
290
293
|
oColumn.getTemplate().getContent().getContentEdit &&
|
|
291
294
|
oColumn
|
|
292
295
|
.getTemplate()
|
|
@@ -323,19 +326,18 @@ sap.ui.define(
|
|
|
323
326
|
});
|
|
324
327
|
},
|
|
325
328
|
|
|
326
|
-
getDefaultTextsForDialog: function(oResourceBundle, iSelectedContexts,
|
|
329
|
+
getDefaultTextsForDialog: function(oResourceBundle, iSelectedContexts, oTable) {
|
|
327
330
|
// The confirm button text is "Save" for table in Display mode and "Apply" for table in edit mode. This can be later exposed if needed.
|
|
328
|
-
var
|
|
329
|
-
bEditableTable = oView && oView.getModel("ui") && (oView.getModel("ui").getProperty("/editMode") === "Editable");
|
|
331
|
+
var bDisplayMode = oTable.data("displayModePropertyBinding") === "true";
|
|
330
332
|
|
|
331
333
|
return {
|
|
332
334
|
"keepExistingPrefix": "< Keep",
|
|
333
335
|
"leaveBlankValue": "< Leave Blank >",
|
|
334
336
|
"clearFieldValue": "< Clear Values >",
|
|
335
|
-
"massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts),
|
|
336
|
-
"applyButtonText":
|
|
337
|
-
? oResourceBundle.getText("
|
|
338
|
-
: oResourceBundle.getText("
|
|
337
|
+
"massEditTitle": oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
|
|
338
|
+
"applyButtonText": bDisplayMode
|
|
339
|
+
? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT")
|
|
340
|
+
: oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
|
|
339
341
|
"cancelButtonText": oResourceBundle.getText("C_MASS_EDIT_CANCEL_BUTTON_TEXT")
|
|
340
342
|
};
|
|
341
343
|
},
|
|
@@ -380,7 +382,7 @@ sap.ui.define(
|
|
|
380
382
|
return oSelectedContext.getObject(sPropertyPath);
|
|
381
383
|
});
|
|
382
384
|
if (bValueExistsForPropertyPath) {
|
|
383
|
-
if (bPropertyRequired !== true && !bUOMField) {
|
|
385
|
+
if (bPropertyRequired !== "true" && !bUOMField) {
|
|
384
386
|
aValues.unshift({ text: oDefaultValues.clearFieldValue, key: "ClearFieldValue/" + sPropertyPath });
|
|
385
387
|
}
|
|
386
388
|
} else {
|
|
@@ -553,11 +555,18 @@ sap.ui.define(
|
|
|
553
555
|
}
|
|
554
556
|
if (oData.isPropertyReadOnly && typeof oData.isPropertyReadOnly === "boolean") {
|
|
555
557
|
aReadOnlyFieldInfo.push({ "property": oData.dataProperty, value: oData.isPropertyReadOnly, type: "Default" });
|
|
556
|
-
} else if (
|
|
558
|
+
} else if (
|
|
559
|
+
oData.isPropertyReadOnly &&
|
|
560
|
+
oData.isPropertyReadOnly.operands &&
|
|
561
|
+
oData.isPropertyReadOnly.operands[0] &&
|
|
562
|
+
oData.isPropertyReadOnly.operands[0].operand1 &&
|
|
563
|
+
oData.isPropertyReadOnly.operands[0].operand2
|
|
564
|
+
) {
|
|
565
|
+
// This needs to be refactored in accordance with the ReadOnlyExpression change
|
|
557
566
|
aReadOnlyFieldInfo.push({
|
|
558
567
|
"property": oData.dataProperty,
|
|
559
|
-
propertyPath: oData.isPropertyReadOnly.operand1.path,
|
|
560
|
-
propertyValue: oData.isPropertyReadOnly.operand2.value,
|
|
568
|
+
propertyPath: oData.isPropertyReadOnly.operands[0].operand1.path,
|
|
569
|
+
propertyValue: oData.isPropertyReadOnly.operands[0].operand2.value,
|
|
561
570
|
type: "Path"
|
|
562
571
|
});
|
|
563
572
|
}
|
|
@@ -578,8 +587,7 @@ sap.ui.define(
|
|
|
578
587
|
var sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
|
|
579
588
|
aDataArray = [],
|
|
580
589
|
oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
|
|
581
|
-
oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length,
|
|
582
|
-
oExtensionAPI = oController && oController.getExtensionAPI(),
|
|
590
|
+
oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
|
|
583
591
|
oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
|
|
584
592
|
oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues);
|
|
585
593
|
|
|
@@ -643,7 +651,8 @@ sap.ui.define(
|
|
|
643
651
|
});
|
|
644
652
|
return Promise.all(changePromise)
|
|
645
653
|
.then(function(oRes) {
|
|
646
|
-
var oListBinding = oTable.getRowBinding()
|
|
654
|
+
var oListBinding = oTable.getRowBinding(),
|
|
655
|
+
oExtensionAPI = oController && oController.getExtensionAPI();
|
|
647
656
|
return oExtensionAPI.refresh(oListBinding.getPath()).then(function() {
|
|
648
657
|
oDialog.close();
|
|
649
658
|
oDialog.destroy();
|
|
@@ -1,227 +1,231 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* SAPUI5
|
|
3
|
-
*
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define([], function() {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
}
|
|
5
|
+
sap.ui.define([], function () {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
/* This class contains helpers to be used at runtime to retrieve further information on the model */
|
|
9
|
+
var ModelHelper = {
|
|
10
|
+
/**
|
|
11
|
+
* Method to determine if the programming model is sticky.
|
|
12
|
+
*
|
|
13
|
+
* @function
|
|
14
|
+
* @name isStickySessionSupported
|
|
15
|
+
* @param {sap.ui.model.odata.v4.ODataMetaModel} oMetaModel ODataModelMetaModel to check for sticky enabled entity
|
|
16
|
+
* @returns {boolean} Returns true if sticky, else false
|
|
17
|
+
*/
|
|
18
|
+
isStickySessionSupported: function (oMetaModel) {
|
|
19
|
+
var oEntityContainer = oMetaModel.getObject("/");
|
|
20
|
+
|
|
21
|
+
for (var sEntitySet in oEntityContainer) {
|
|
22
|
+
if (oEntityContainer[sEntitySet].$kind === "EntitySet" && oMetaModel.getObject("/".concat(sEntitySet, "@com.sap.vocabularies.Session.v1.StickySessionSupported"))) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return false;
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Method to determine if the programming model is draft.
|
|
32
|
+
*
|
|
33
|
+
* @function
|
|
34
|
+
* @name isDraftSupported
|
|
35
|
+
* @param {sap.ui.model.odata.v4.MetaModel} oMetaModel ODataModelMetaModel of the context for which draft support shall be checked
|
|
36
|
+
* @param {string} sPath Path for which draft support shall be checked
|
|
37
|
+
* @returns {boolean} Returns true if draft, else false
|
|
38
|
+
*/
|
|
39
|
+
isDraftSupported: function (oMetaModel, sPath) {
|
|
40
|
+
var oMetaContext = oMetaModel.getMetaContext(sPath);
|
|
41
|
+
var sTargetEntitySet = this.getTargetEntitySet(oMetaContext),
|
|
42
|
+
oParentEntitySetContext,
|
|
43
|
+
aParts;
|
|
44
|
+
|
|
45
|
+
if (oMetaContext.getProperty && oMetaContext.getProperty() && oMetaContext.getProperty().$ContainsTarget === true) {
|
|
46
|
+
aParts = oMetaModel.getMetaPath(sPath).split("/").filter(Boolean);
|
|
47
|
+
|
|
48
|
+
if (aParts.length) {
|
|
49
|
+
for (var i = aParts.length - 1; i >= 0; i--) {
|
|
50
|
+
oParentEntitySetContext = oMetaModel.getMetaContext(oMetaModel.getMetaPath("/" + aParts[i]));
|
|
51
|
+
|
|
52
|
+
if (oParentEntitySetContext.getObject("$kind") === "EntitySet") {
|
|
53
|
+
sTargetEntitySet = this.getTargetEntitySet(oParentEntitySetContext);
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
sTargetEntitySet = this.getTargetEntitySet(oMetaContext);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
var oEntityContext = oMetaModel.getMetaContext(sTargetEntitySet);
|
|
63
|
+
|
|
64
|
+
if (oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftRoot") || oEntityContext.getObject("@com.sap.vocabularies.Common.v1.DraftNode")) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return false;
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Returns path to the target entity set via using navigation property binding.
|
|
73
|
+
*
|
|
74
|
+
* @function
|
|
75
|
+
* @name getTargetEntitySet
|
|
76
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the target entity set shall be determined
|
|
77
|
+
* @returns {string} Returns path to the target entity set
|
|
78
|
+
*/
|
|
79
|
+
getTargetEntitySet: function (oContext) {
|
|
80
|
+
var sPath = oContext.getPath();
|
|
81
|
+
|
|
82
|
+
if (oContext.getObject("$kind") === "EntitySet" || oContext.getObject("$kind") === "Action" || oContext.getObject("0/$kind") === "Action") {
|
|
83
|
+
return sPath;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
var sEntitySetPath = ModelHelper.getEntitySetPath(sPath);
|
|
87
|
+
return "/" + oContext.getObject(sEntitySetPath);
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Returns complete path to the entity set via using navigation property binding.
|
|
92
|
+
*
|
|
93
|
+
* @function
|
|
94
|
+
* @name getEntitySetPath
|
|
95
|
+
* @param {string} sPath Path for which complete entitySet path needs to be determined
|
|
96
|
+
* @returns {string} Returns complete path to the entity set
|
|
97
|
+
*/
|
|
98
|
+
getEntitySetPath: function (sPath) {
|
|
99
|
+
return "/" + sPath.split("/").filter(ModelHelper.filterOutNavPropBinding).join("/$NavigationPropertyBinding/");
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Gets the path for the items property of MultiValueField parameters.
|
|
104
|
+
*
|
|
105
|
+
* @function
|
|
106
|
+
* @name getActionParameterItemsModelPath
|
|
107
|
+
* @param {object} oParameter Action Parameter
|
|
108
|
+
* @returns {string} Returns the complete model path for the items property of MultiValueField parameters
|
|
109
|
+
*/
|
|
110
|
+
getActionParameterItemsModelPath: function (oParameter) {
|
|
111
|
+
return oParameter && oParameter.$Name ? "{path: 'mvfview>/".concat(oParameter.$Name, "'}") : undefined;
|
|
112
|
+
},
|
|
113
|
+
filterOutNavPropBinding: function (sPathPart) {
|
|
114
|
+
return sPathPart !== "" && sPathPart !== "$NavigationPropertyBinding";
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Adds a setProperty to the created binding contexts of the internal JSON model.
|
|
119
|
+
*
|
|
120
|
+
* @function
|
|
121
|
+
* @name enhanceInternalJSONModel
|
|
122
|
+
* @param {sap.ui.model.json.JSONModel} Internal JSON Model which is enhanced
|
|
123
|
+
*/
|
|
124
|
+
enhanceInternalJSONModel: function (oInternalModel) {
|
|
125
|
+
var fnBindContext = oInternalModel.bindContext;
|
|
126
|
+
|
|
127
|
+
oInternalModel.bindContext = function (sPath, oContext, mParameters) {
|
|
128
|
+
for (var _len = arguments.length, args = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
|
|
129
|
+
args[_key - 3] = arguments[_key];
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
oContext = fnBindContext.apply(this, [sPath, oContext, mParameters].concat(args));
|
|
133
|
+
var fnGetBoundContext = oContext.getBoundContext;
|
|
134
|
+
|
|
135
|
+
oContext.getBoundContext = function () {
|
|
136
|
+
for (var _len2 = arguments.length, subArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
137
|
+
subArgs[_key2] = arguments[_key2];
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
var oBoundContext = fnGetBoundContext.apply.apply(fnGetBoundContext, [this].concat(subArgs));
|
|
141
|
+
|
|
142
|
+
if (oBoundContext && !oBoundContext.setProperty) {
|
|
143
|
+
oBoundContext.setProperty = function (sSetPropPath, value) {
|
|
144
|
+
if (this.getObject() === undefined) {
|
|
145
|
+
// initialize
|
|
146
|
+
this.getModel().setProperty(this.getPath(), {});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
this.getModel().setProperty(sSetPropPath, value, this);
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return oBoundContext;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
return oContext;
|
|
157
|
+
};
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Returns whether filtering on the table is case sensitive.
|
|
162
|
+
*
|
|
163
|
+
* @param oMetaModel The instance of the meta model
|
|
164
|
+
* @returns {boolean|undefined} Returns 'false' if FilterFunctions annotation supports 'tolower', else 'true'
|
|
165
|
+
*/
|
|
166
|
+
isFilteringCaseSensitive: function (oMetaModel) {
|
|
167
|
+
if (!oMetaModel) {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
var aFilterFunctions = oMetaModel.getObject("/@Org.OData.Capabilities.V1.FilterFunctions"); // Get filter functions defined at EntityContainer and check for existence of 'tolower'
|
|
172
|
+
|
|
173
|
+
return aFilterFunctions ? aFilterFunctions.indexOf("tolower") === -1 : true;
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Get MetaPath for the context.
|
|
178
|
+
*
|
|
179
|
+
* @param {Context} oContext Context to be used
|
|
180
|
+
* @returns {string | undefined} Returns meta path for the context.
|
|
181
|
+
*/
|
|
182
|
+
getMetaPathForContext: function (oContext) {
|
|
183
|
+
var oModel = oContext.getModel(),
|
|
184
|
+
oMetaModel = oModel.getMetaModel(),
|
|
185
|
+
sPath = oContext.getPath();
|
|
186
|
+
return oMetaModel && sPath && oMetaModel.getMetaPath(sPath);
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Get MetaPath for the listbinding.
|
|
191
|
+
*
|
|
192
|
+
* @param {View} oView View of the control using listBinding
|
|
193
|
+
* @param {ODataListBinding | string} vListBinding ODataListBinding object or the binding path for a temporary list binding
|
|
194
|
+
* @returns {string | undefined} Returns meta path for the listbinding.
|
|
195
|
+
*/
|
|
196
|
+
getAbsoluteMetaPathForListBinding: function (oView, vListBinding) {
|
|
197
|
+
var oMetaModel = oView.getModel().getMetaModel();
|
|
198
|
+
var sMetaPath;
|
|
199
|
+
|
|
200
|
+
if (typeof vListBinding === "string") {
|
|
201
|
+
if (vListBinding.startsWith("/")) {
|
|
202
|
+
// absolute path
|
|
203
|
+
sMetaPath = oMetaModel.getMetaPath(vListBinding);
|
|
204
|
+
} else {
|
|
205
|
+
// relative path
|
|
206
|
+
var oBindingContext = oView.getBindingContext();
|
|
207
|
+
var sRootContextPath = oBindingContext.getPath();
|
|
208
|
+
sMetaPath = oMetaModel.getMetaPath("".concat(sRootContextPath, "/").concat(vListBinding));
|
|
209
|
+
}
|
|
210
|
+
} else {
|
|
211
|
+
// we already get a list binding use this one
|
|
212
|
+
var oBinding = vListBinding;
|
|
213
|
+
var oRootBinding = oBinding.getRootBinding();
|
|
214
|
+
|
|
215
|
+
if (oBinding === oRootBinding) {
|
|
216
|
+
// absolute path
|
|
217
|
+
sMetaPath = oMetaModel.getMetaPath(oBinding.getPath());
|
|
218
|
+
} else {
|
|
219
|
+
// relative path
|
|
220
|
+
var sRootBindingPath = oRootBinding.getPath();
|
|
221
|
+
var sRelativePath = oBinding.getPath();
|
|
222
|
+
sMetaPath = oMetaModel.getMetaPath("".concat(sRootBindingPath, "/").concat(sRelativePath));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return sMetaPath;
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
return ModelHelper;
|
|
230
|
+
}, false);
|
|
231
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1vZGVsSGVscGVyLnRzIl0sIm5hbWVzIjpbIk1vZGVsSGVscGVyIiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwib01ldGFNb2RlbCIsIm9FbnRpdHlDb250YWluZXIiLCJnZXRPYmplY3QiLCJzRW50aXR5U2V0IiwiJGtpbmQiLCJpc0RyYWZ0U3VwcG9ydGVkIiwic1BhdGgiLCJvTWV0YUNvbnRleHQiLCJnZXRNZXRhQ29udGV4dCIsInNUYXJnZXRFbnRpdHlTZXQiLCJnZXRUYXJnZXRFbnRpdHlTZXQiLCJvUGFyZW50RW50aXR5U2V0Q29udGV4dCIsImFQYXJ0cyIsImdldFByb3BlcnR5IiwiJENvbnRhaW5zVGFyZ2V0IiwiZ2V0TWV0YVBhdGgiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJsZW5ndGgiLCJpIiwib0VudGl0eUNvbnRleHQiLCJvQ29udGV4dCIsImdldFBhdGgiLCJzRW50aXR5U2V0UGF0aCIsImdldEVudGl0eVNldFBhdGgiLCJmaWx0ZXJPdXROYXZQcm9wQmluZGluZyIsImpvaW4iLCJnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aCIsIm9QYXJhbWV0ZXIiLCIkTmFtZSIsInVuZGVmaW5lZCIsInNQYXRoUGFydCIsImVuaGFuY2VJbnRlcm5hbEpTT05Nb2RlbCIsIm9JbnRlcm5hbE1vZGVsIiwiZm5CaW5kQ29udGV4dCIsImJpbmRDb250ZXh0IiwibVBhcmFtZXRlcnMiLCJhcmdzIiwiYXBwbHkiLCJmbkdldEJvdW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsInN1YkFyZ3MiLCJvQm91bmRDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJzU2V0UHJvcFBhdGgiLCJ2YWx1ZSIsImdldE1vZGVsIiwiaXNGaWx0ZXJpbmdDYXNlU2Vuc2l0aXZlIiwiYUZpbHRlckZ1bmN0aW9ucyIsImluZGV4T2YiLCJnZXRNZXRhUGF0aEZvckNvbnRleHQiLCJvTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJvVmlldyIsInZMaXN0QmluZGluZyIsInNNZXRhUGF0aCIsInN0YXJ0c1dpdGgiLCJvQmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNSb290Q29udGV4dFBhdGgiLCJvQmluZGluZyIsIm9Sb290QmluZGluZyIsImdldFJvb3RCaW5kaW5nIiwic1Jvb3RCaW5kaW5nUGF0aCIsInNSZWxhdGl2ZVBhdGgiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFGQTtBQUtBLE1BQU1BLFdBQVcsR0FBRztBQUNuQjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLHdCQUF3QixFQUFFLFVBQVNDLFVBQVQsRUFBcUM7QUFDOUQsVUFBTUMsZ0JBQWdCLEdBQUdELFVBQVUsQ0FBQ0UsU0FBWCxDQUFxQixHQUFyQixDQUF6Qjs7QUFDQSxXQUFLLElBQU1DLFVBQVgsSUFBeUJGLGdCQUF6QixFQUEyQztBQUMxQyxZQUNDQSxnQkFBZ0IsQ0FBQ0UsVUFBRCxDQUFoQixDQUE2QkMsS0FBN0IsS0FBdUMsV0FBdkMsSUFDQUosVUFBVSxDQUFDRSxTQUFYLFlBQXlCQyxVQUF6Qiw2REFGRCxFQUdFO0FBQ0QsaUJBQU8sSUFBUDtBQUNBO0FBQ0Q7O0FBQ0QsYUFBTyxLQUFQO0FBQ0EsS0FwQmtCOztBQXNCbkI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NFLElBQUFBLGdCQUFnQixFQUFFLFVBQVNMLFVBQVQsRUFBMEJNLEtBQTFCLEVBQXlDO0FBQzFELFVBQU1DLFlBQVksR0FBR1AsVUFBVSxDQUFDUSxjQUFYLENBQTBCRixLQUExQixDQUFyQjtBQUNBLFVBQUlHLGdCQUFnQixHQUFHLEtBQUtDLGtCQUFMLENBQXdCSCxZQUF4QixDQUF2QjtBQUFBLFVBQ0NJLHVCQUREO0FBQUEsVUFFQ0MsTUFGRDs7QUFJQSxVQUFJTCxZQUFZLENBQUNNLFdBQWIsSUFBNEJOLFlBQVksQ0FBQ00sV0FB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eUMsWUFBdkIsQ0FBWjtBQUNBLFNBSEQsTUFHTztBQUNOO0FBQ0EsY0FBTUcsZUFBZSxHQUFHSixLQUFLLENBQUNLLGlCQUFOLEVBQXhCO0FBQ0EsY0FBTUMsZ0JBQWdCLEdBQUdGLGVBQWUsQ0FBQ3BDLE9BQWhCLEVBQXpCO0FBQ0FrQyxVQUFBQSxTQUFTLEdBQUd6RCxVQUFVLENBQUNlLFdBQVgsV0FBMEI4QyxnQkFBMUIsY0FBOENMLFlBQTlDLEVBQVo7QUFDQTtBQUNELE9BVkQsTUFVTztBQUNOO0FBQ0EsWUFBTU0sUUFBUSxHQUFHTixZQUFqQjtBQUNBLFlBQU1PLFlBQVksR0FBR0QsUUFBUSxDQUFDRSxjQUFULEVBQXJCOztBQUNBLFlBQUlGLFFBQVEsS0FBS0MsWUFBakIsRUFBK0I7QUFDOUI7QUFDQU4sVUFBQUEsU0FBUyxHQUFHekQsVUFBVSxDQUFDZSxXQUFYLENBQXVCK0MsUUFBUSxDQUFDdkMsT0FBVCxFQUF2QixDQUFaO0FBQ0EsU0FIRCxNQUdPO0FBQ047QUFDQSxjQUFNMEMsZ0JBQWdCLEdBQUdGLFlBQVksQ0FBQ3hDLE9BQWIsRUFBekI7QUFDQSxjQUFNMkMsYUFBYSxHQUFHSixRQUFRLENBQUN2QyxPQUFULEVBQXRCO0FBQ0FrQyxVQUFBQSxTQUFTLEdBQUd6RCxVQUFVLENBQUNlLFdBQVgsV0FBMEJrRCxnQkFBMUIsY0FBOENDLGFBQTlDLEVBQVo7QUFDQTtBQUNEOztBQUNELGFBQU9ULFNBQVA7QUFDQTtBQXROa0IsR0FBcEI7U0E2TmUzRCxXIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGhlbHBlcnMgdG8gYmUgdXNlZCBhdCBydW50aW1lIHRvIHJldHJpZXZlIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gdGhlIG1vZGVsICovXG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBCYXNlQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5cbmNvbnN0IE1vZGVsSGVscGVyID0ge1xuXHQvKipcblx0ICogTWV0aG9kIHRvIGRldGVybWluZSBpZiB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgc3RpY2t5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsfSBvTWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgdG8gY2hlY2sgZm9yIHN0aWNreSBlbmFibGVkIGVudGl0eVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHN0aWNreSwgZWxzZSBmYWxzZVxuXHQgKi9cblx0aXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkOiBmdW5jdGlvbihvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCkge1xuXHRcdGNvbnN0IG9FbnRpdHlDb250YWluZXIgPSBvTWV0YU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdFx0Zm9yIChjb25zdCBzRW50aXR5U2V0IGluIG9FbnRpdHlDb250YWluZXIpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0b0VudGl0eUNvbnRhaW5lcltzRW50aXR5U2V0XS4ka2luZCA9PT0gXCJFbnRpdHlTZXRcIiAmJlxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c0VudGl0eVNldH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkYClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBpcyBkcmFmdC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGlzRHJhZnRTdXBwb3J0ZWRcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuTWV0YU1vZGVsfSBvTWV0YU1vZGVsIE9EYXRhTW9kZWxNZXRhTW9kZWwgb2YgdGhlIGNvbnRleHQgZm9yIHdoaWNoIGRyYWZ0IHN1cHBvcnQgc2hhbGwgYmUgY2hlY2tlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1BhdGggUGF0aCBmb3Igd2hpY2ggZHJhZnQgc3VwcG9ydCBzaGFsbCBiZSBjaGVja2VkXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgZHJhZnQsIGVsc2UgZmFsc2Vcblx0ICovXG5cdGlzRHJhZnRTdXBwb3J0ZWQ6IGZ1bmN0aW9uKG9NZXRhTW9kZWw6IGFueSwgc1BhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IG9NZXRhQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoc1BhdGgpO1xuXHRcdGxldCBzVGFyZ2V0RW50aXR5U2V0ID0gdGhpcy5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFDb250ZXh0KSxcblx0XHRcdG9QYXJlbnRFbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0YVBhcnRzO1xuXG5cdFx0aWYgKG9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eSAmJiBvTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoKSAmJiBvTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoKS4kQ29udGFpbnNUYXJnZXQgPT09IHRydWUpIHtcblx0XHRcdGFQYXJ0cyA9IG9NZXRhTW9kZWxcblx0XHRcdFx0LmdldE1ldGFQYXRoKHNQYXRoKVxuXHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdC5maWx0ZXIoQm9vbGVhbik7XG5cdFx0XHRpZiAoYVBhcnRzLmxlbmd0aCkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gYVBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdFx0XHRcdFx0b1BhcmVudEVudGl0eVNldENvbnRleHQgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoXCIvXCIgKyBhUGFydHNbaV0pKTtcblx0XHRcdFx0XHRpZiAob1BhcmVudEVudGl0eVNldENvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiRW50aXR5U2V0XCIpIHtcblx0XHRcdFx0XHRcdHNUYXJnZXRFbnRpdHlTZXQgPSB0aGlzLmdldFRhcmdldEVudGl0eVNldChvUGFyZW50RW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c1RhcmdldEVudGl0eVNldCA9IHRoaXMuZ2V0VGFyZ2V0RW50aXR5U2V0KG9NZXRhQ29udGV4dCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9FbnRpdHlDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChzVGFyZ2V0RW50aXR5U2V0KTtcblx0XHRpZiAoXG5cdFx0XHRvRW50aXR5Q29udGV4dC5nZXRPYmplY3QoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKSB8fFxuXHRcdFx0b0VudGl0eUNvbnRleHQuZ2V0T2JqZWN0KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVcIilcblx0XHQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgcGF0aCB0byB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgdmlhIHVzaW5nIG5hdmlnYXRpb24gcHJvcGVydHkgYmluZGluZy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldFRhcmdldEVudGl0eVNldFxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgc2hhbGwgYmUgZGV0ZXJtaW5lZFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHBhdGggdG8gdGhlIHRhcmdldCBlbnRpdHkgc2V0XG5cdCAqL1xuXHRnZXRUYXJnZXRFbnRpdHlTZXQ6IGZ1bmN0aW9uKG9Db250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0aWYgKFxuXHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KFwiJGtpbmRcIikgPT09IFwiRW50aXR5U2V0XCIgfHxcblx0XHRcdG9Db250ZXh0LmdldE9iamVjdChcIiRraW5kXCIpID09PSBcIkFjdGlvblwiIHx8XG5cdFx0XHRvQ29udGV4dC5nZXRPYmplY3QoXCIwLyRraW5kXCIpID09PSBcIkFjdGlvblwiXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gc1BhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IHNFbnRpdHlTZXRQYXRoID0gTW9kZWxIZWxwZXIuZ2V0RW50aXR5U2V0UGF0aChzUGF0aCk7XG5cdFx0cmV0dXJuIFwiL1wiICsgb0NvbnRleHQuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoKTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBjb21wbGV0ZSBwYXRoIHRvIHRoZSBlbnRpdHkgc2V0IHZpYSB1c2luZyBuYXZpZ2F0aW9uIHByb3BlcnR5IGJpbmRpbmcuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlTZXRQYXRoXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUGF0aCBQYXRoIGZvciB3aGljaCBjb21wbGV0ZSBlbnRpdHlTZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgY29tcGxldGUgcGF0aCB0byB0aGUgZW50aXR5IHNldFxuXHQgKi9cblx0Z2V0RW50aXR5U2V0UGF0aDogZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiAoXG5cdFx0XHRcIi9cIiArXG5cdFx0XHRzUGF0aFxuXHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdC5maWx0ZXIoTW9kZWxIZWxwZXIuZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmcpXG5cdFx0XHRcdC5qb2luKFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiKVxuXHRcdCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHBhdGggZm9yIHRoZSBpdGVtcyBwcm9wZXJ0eSBvZiBNdWx0aVZhbHVlRmllbGQgcGFyYW1ldGVycy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldEFjdGlvblBhcmFtZXRlckl0ZW1zTW9kZWxQYXRoXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvUGFyYW1ldGVyIEFjdGlvbiBQYXJhbWV0ZXJcblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcGxldGUgbW9kZWwgcGF0aCBmb3IgdGhlIGl0ZW1zIHByb3BlcnR5IG9mIE11bHRpVmFsdWVGaWVsZCBwYXJhbWV0ZXJzXG5cdCAqL1xuXHRnZXRBY3Rpb25QYXJhbWV0ZXJJdGVtc01vZGVsUGF0aDogZnVuY3Rpb24ob1BhcmFtZXRlcjogYW55KSB7XG5cdFx0cmV0dXJuIG9QYXJhbWV0ZXIgJiYgb1BhcmFtZXRlci4kTmFtZSA/IGB7cGF0aDogJ212ZnZpZXc+LyR7b1BhcmFtZXRlci4kTmFtZX0nfWAgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0ZmlsdGVyT3V0TmF2UHJvcEJpbmRpbmc6IGZ1bmN0aW9uKHNQYXRoUGFydDogYW55KSB7XG5cdFx0cmV0dXJuIHNQYXRoUGFydCAhPT0gXCJcIiAmJiBzUGF0aFBhcnQgIT09IFwiJE5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmdcIjtcblx0fSxcblxuXHQvKipcblx0ICogQWRkcyBhIHNldFByb3BlcnR5IHRvIHRoZSBjcmVhdGVkIGJpbmRpbmcgY29udGV4dHMgb2YgdGhlIGludGVybmFsIEpTT04gbW9kZWwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBlbmhhbmNlSW50ZXJuYWxKU09OTW9kZWxcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwuanNvbi5KU09OTW9kZWx9IEludGVybmFsIEpTT04gTW9kZWwgd2hpY2ggaXMgZW5oYW5jZWRcblx0ICovXG5cblx0ZW5oYW5jZUludGVybmFsSlNPTk1vZGVsOiBmdW5jdGlvbihvSW50ZXJuYWxNb2RlbDogYW55KSB7XG5cdFx0Y29uc3QgZm5CaW5kQ29udGV4dCA9IG9JbnRlcm5hbE1vZGVsLmJpbmRDb250ZXh0O1xuXHRcdG9JbnRlcm5hbE1vZGVsLmJpbmRDb250ZXh0ID0gZnVuY3Rpb24oc1BhdGg6IGFueSwgb0NvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSwgLi4uYXJnczogYW55W10pIHtcblx0XHRcdG9Db250ZXh0ID0gZm5CaW5kQ29udGV4dC5hcHBseSh0aGlzLCBbc1BhdGgsIG9Db250ZXh0LCBtUGFyYW1ldGVycywgLi4uYXJnc10pO1xuXHRcdFx0Y29uc3QgZm5HZXRCb3VuZENvbnRleHQgPSBvQ29udGV4dC5nZXRCb3VuZENvbnRleHQ7XG5cblx0XHRcdG9Db250ZXh0LmdldEJvdW5kQ29udGV4dCA9IGZ1bmN0aW9uKC4uLnN1YkFyZ3M6IGFueVtdKSB7XG5cdFx0XHRcdGNvbnN0IG9Cb3VuZENvbnRleHQgPSBmbkdldEJvdW5kQ29udGV4dC5hcHBseSh0aGlzLCAuLi5zdWJBcmdzKTtcblx0XHRcdFx0aWYgKG9Cb3VuZENvbnRleHQgJiYgIW9Cb3VuZENvbnRleHQuc2V0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRvQm91bmRDb250ZXh0LnNldFByb3BlcnR5ID0gZnVuY3Rpb24oc1NldFByb3BQYXRoOiBhbnksIHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLmdldE9iamVjdCgpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaW5pdGlhbGl6ZVxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldE1vZGVsKCkuc2V0UHJvcGVydHkodGhpcy5nZXRQYXRoKCksIHt9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuZ2V0TW9kZWwoKS5zZXRQcm9wZXJ0eShzU2V0UHJvcFBhdGgsIHZhbHVlLCB0aGlzKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvQm91bmRDb250ZXh0O1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBvQ29udGV4dDtcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgZmlsdGVyaW5nIG9uIHRoZSB0YWJsZSBpcyBjYXNlIHNlbnNpdGl2ZS5cblx0ICpcblx0ICogQHBhcmFtIG9NZXRhTW9kZWwgVGhlIGluc3RhbmNlIG9mIHRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIHtib29sZWFufHVuZGVmaW5lZH0gUmV0dXJucyAnZmFsc2UnIGlmIEZpbHRlckZ1bmN0aW9ucyBhbm5vdGF0aW9uIHN1cHBvcnRzICd0b2xvd2VyJywgZWxzZSAndHJ1ZSdcblx0ICovXG5cdGlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZTogZnVuY3Rpb24ob01ldGFNb2RlbDogYW55KSB7XG5cdFx0aWYgKCFvTWV0YU1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBhRmlsdGVyRnVuY3Rpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvQE9yZy5PRGF0YS5DYXBhYmlsaXRpZXMuVjEuRmlsdGVyRnVuY3Rpb25zXCIpO1xuXHRcdC8vIEdldCBmaWx0ZXIgZnVuY3Rpb25zIGRlZmluZWQgYXQgRW50aXR5Q29udGFpbmVyIGFuZCBjaGVjayBmb3IgZXhpc3RlbmNlIG9mICd0b2xvd2VyJ1xuXHRcdHJldHVybiBhRmlsdGVyRnVuY3Rpb25zID8gYUZpbHRlckZ1bmN0aW9ucy5pbmRleE9mKFwidG9sb3dlclwiKSA9PT0gLTEgOiB0cnVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0NvbnRleHR9IG9Db250ZXh0IENvbnRleHQgdG8gYmUgdXNlZFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBSZXR1cm5zIG1ldGEgcGF0aCBmb3IgdGhlIGNvbnRleHQuXG5cdCAqL1xuXHRnZXRNZXRhUGF0aEZvckNvbnRleHQ6IGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHJldHVybiBvTWV0YU1vZGVsICYmIHNQYXRoICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgTWV0YVBhdGggZm9yIHRoZSBsaXN0YmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIHtWaWV3fSBvVmlldyBWaWV3IG9mIHRoZSBjb250cm9sIHVzaW5nIGxpc3RCaW5kaW5nXG5cdCAqIEBwYXJhbSB7T0RhdGFMaXN0QmluZGluZyB8IHN0cmluZ30gdkxpc3RCaW5kaW5nIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBSZXR1cm5zIG1ldGEgcGF0aCBmb3IgdGhlIGxpc3RiaW5kaW5nLlxuXHQgKi9cblx0Z2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nOiBmdW5jdGlvbihvVmlldzogYW55LCB2TGlzdEJpbmRpbmc6IGFueSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cblx0XHRpZiAodHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHZMaXN0QmluZGluZy5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkxpc3RCaW5kaW5nKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIHJlbGF0aXZlIHBhdGhcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgc1Jvb3RDb250ZXh0UGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7c1Jvb3RDb250ZXh0UGF0aH0vJHt2TGlzdEJpbmRpbmd9YCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUm9vdEJpbmRpbmcgPSBvQmluZGluZy5nZXRSb290QmluZGluZygpO1xuXHRcdFx0aWYgKG9CaW5kaW5nID09PSBvUm9vdEJpbmRpbmcpIHtcblx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9CaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWxhdGl2ZSBwYXRoXG5cdFx0XHRcdGNvbnN0IHNSb290QmluZGluZ1BhdGggPSBvUm9vdEJpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRjb25zdCBzUmVsYXRpdmVQYXRoID0gb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3NSb290QmluZGluZ1BhdGh9LyR7c1JlbGF0aXZlUGF0aH1gKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNNZXRhUGF0aDtcblx0fVxufTtcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxNb2RlbENvbnRleHQgPSBCYXNlQ29udGV4dCAmIHtcblx0c2V0UHJvcGVydHkoc1BhdGg6IHN0cmluZywgdlZhbHVlOiBhbnkpOiB2b2lkO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTW9kZWxIZWxwZXI7XG4iXX0=
|