@sapui5/sap.fe.core 1.136.1 → 1.138.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +76 -28
- package/src/sap/fe/core/ActionRuntime.ts +106 -30
- package/src/sap/fe/core/AppComponent.js +11 -1
- package/src/sap/fe/core/AppComponent.ts +10 -0
- package/src/sap/fe/core/AppStateHandler.js +9 -2
- package/src/sap/fe/core/AppStateHandler.ts +8 -2
- package/src/sap/fe/core/CommonUtils.js +15 -3
- package/src/sap/fe/core/CommonUtils.ts +13 -2
- package/src/sap/fe/core/PageController.controller.js +10 -0
- package/src/sap/fe/core/PageController.controller.ts +3 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -4
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +3 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +2 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -12
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -16
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +27 -41
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +27 -41
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +2 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +2 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +1 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +4 -4
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +22 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +20 -5
- package/src/sap/fe/core/controllerextensions/Paginator.ts +19 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -2
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +2 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +1 -0
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.js +9 -5
- package/src/sap/fe/core/controllerextensions/dialog/ODataStrictDialog.tsx +8 -3
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +4 -2
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -2
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +178 -125
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +222 -174
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +5 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -3
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +39 -5
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +51 -11
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +16 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +17 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +88 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +106 -7
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.js +16 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationMessage.ts +15 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +25 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +24 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +11 -8
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +13 -10
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +7 -4
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +7 -3
- package/src/sap/fe/core/controls/DataWatcher.js +2 -2
- package/src/sap/fe/core/controls/DataWatcher.tsx +1 -1
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +11 -6
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +13 -9
- package/src/sap/fe/core/controls/inlineEditFlow/InlineEditExitDialog.js +144 -0
- package/src/sap/fe/core/controls/inlineEditFlow/{BeforeNavigationDialog.tsx → InlineEditExitDialog.tsx} +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +3 -2
- package/src/sap/fe/core/converters/MetaModelConverter.ts +12 -4
- package/src/sap/fe/core/converters/controls/Common/Action.js +42 -5
- package/src/sap/fe/core/converters/controls/Common/Action.ts +42 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +4 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +2 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +46 -13
- package/src/sap/fe/core/converters/controls/Common/Table.ts +50 -11
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +11 -10
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +13 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +2 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +2 -1
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js +9 -9
- package/src/sap/fe/core/helpers/DeleteHelper.ts +8 -9
- package/src/sap/fe/core/helpers/FPMHelper.js +2 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.js +4 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +8 -4
- package/src/sap/fe/core/helpers/PasteHelper.js +2 -2
- package/src/sap/fe/core/helpers/PasteHelper.ts +1 -1
- package/src/sap/fe/core/library.js +33 -4
- package/src/sap/fe/core/library.ts +33 -2
- package/src/sap/fe/core/messagebundle.properties +18 -2
- package/src/sap/fe/core/messagebundle_ar.properties +3 -2
- package/src/sap/fe/core/messagebundle_bg.properties +2 -1
- package/src/sap/fe/core/messagebundle_ca.properties +2 -1
- package/src/sap/fe/core/messagebundle_cnr.properties +2 -1
- package/src/sap/fe/core/messagebundle_cs.properties +4 -3
- package/src/sap/fe/core/messagebundle_cy.properties +2 -1
- package/src/sap/fe/core/messagebundle_da.properties +2 -1
- package/src/sap/fe/core/messagebundle_de.properties +8 -7
- package/src/sap/fe/core/messagebundle_el.properties +2 -1
- package/src/sap/fe/core/messagebundle_en.properties +2 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +2 -1
- package/src/sap/fe/core/messagebundle_es.properties +5 -4
- package/src/sap/fe/core/messagebundle_es_MX.properties +2 -1
- package/src/sap/fe/core/messagebundle_et.properties +2 -1
- package/src/sap/fe/core/messagebundle_fi.properties +2 -1
- package/src/sap/fe/core/messagebundle_fr.properties +2 -1
- package/src/sap/fe/core/messagebundle_fr_CA.properties +2 -1
- package/src/sap/fe/core/messagebundle_hi.properties +2 -1
- package/src/sap/fe/core/messagebundle_hr.properties +2 -1
- package/src/sap/fe/core/messagebundle_hu.properties +2 -1
- package/src/sap/fe/core/messagebundle_id.properties +2 -1
- package/src/sap/fe/core/messagebundle_it.properties +2 -1
- package/src/sap/fe/core/messagebundle_iw.properties +2 -1
- package/src/sap/fe/core/messagebundle_ja.properties +3 -2
- package/src/sap/fe/core/messagebundle_kk.properties +2 -1
- package/src/sap/fe/core/messagebundle_ko.properties +2 -1
- package/src/sap/fe/core/messagebundle_lt.properties +2 -1
- package/src/sap/fe/core/messagebundle_lv.properties +2 -1
- package/src/sap/fe/core/messagebundle_mk.properties +2 -1
- package/src/sap/fe/core/messagebundle_ms.properties +2 -1
- package/src/sap/fe/core/messagebundle_nl.properties +2 -1
- package/src/sap/fe/core/messagebundle_no.properties +3 -2
- package/src/sap/fe/core/messagebundle_pl.properties +2 -1
- package/src/sap/fe/core/messagebundle_pt.properties +2 -1
- package/src/sap/fe/core/messagebundle_pt_PT.properties +2 -1
- package/src/sap/fe/core/messagebundle_ro.properties +2 -1
- package/src/sap/fe/core/messagebundle_ru.properties +2 -1
- package/src/sap/fe/core/messagebundle_sh.properties +2 -1
- package/src/sap/fe/core/messagebundle_sk.properties +2 -1
- package/src/sap/fe/core/messagebundle_sl.properties +2 -1
- package/src/sap/fe/core/messagebundle_sr.properties +2 -1
- package/src/sap/fe/core/messagebundle_sv.properties +2 -1
- package/src/sap/fe/core/messagebundle_th.properties +2 -1
- package/src/sap/fe/core/messagebundle_tr.properties +2 -1
- package/src/sap/fe/core/messagebundle_uk.properties +2 -1
- package/src/sap/fe/core/messagebundle_vi.properties +2 -1
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js +6 -6
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +5 -5
- package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -0
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +8 -2
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +7 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +75 -90
- package/src/sap/fe/core/templating/EntitySetHelper.ts +92 -118
- package/src/sap/fe/core/templating/UIFormatters.js +3 -3
- package/src/sap/fe/core/templating/UIFormatters.ts +1 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +0 -81
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +0 -126
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +0 -10
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +0 -2
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +0 -68
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +0 -52
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +0 -144
|
@@ -10,17 +10,13 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
10
10
|
var isEntitySet = TypeGuards.isEntitySet;
|
|
11
11
|
/**
|
|
12
12
|
* Reads all FilterRestrictions and SortRestrictions of the main and child entities and their dedicated navigation restrictions.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
2.2.1 Retrieve the direct restrictions configured on the child entity displayed in the table or on the root entity.
|
|
21
|
-
2.2.2 If a navigation property restriction is defined on the main entity, it takes precedence over the direct restrictions from 2.2.1.
|
|
22
|
-
2.2.3 NavigationRestrictions on the target (child) entity set are added to the list of restrictions.
|
|
23
|
-
* @param entitySet Entity set to be analyzed
|
|
13
|
+
1. For containment scenario:
|
|
14
|
+
1.1. For LR, Navigation restrictions are evaluated first, followed by the restrictions on the root entity. If Navigation property restriction and a direct restriction exist, both are considered.
|
|
15
|
+
1.2 For the OP, Restrictions are only calculated on the root entity, as there are no child entities. The same approach described in point 1.1 is applied.
|
|
16
|
+
2. For a non containment scenario:
|
|
17
|
+
2.1 The same logic described in point 1.1 applies.
|
|
18
|
+
2.2 For the OP, the direct restrictions configured for the OP are considered along with the navigation restrictions on the target (child) entity displayed.
|
|
19
|
+
* @param entitySet Entity set to be analyzed (target or parent entity set).
|
|
24
20
|
* @param targetEntitySet The target entity set, if available. Not used in the case of containment.
|
|
25
21
|
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
26
22
|
* @returns Array containing the property names of all non-filterable and non-sortable properties
|
|
@@ -30,27 +26,19 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
30
26
|
nonSortableProperties: getSortRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath),
|
|
31
27
|
nonFilterableProperties: getFilterRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath)
|
|
32
28
|
};
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
if (!restrictionsFromNavigationRestrictions.nonSortableProperties.length) {
|
|
43
|
-
restrictionsFromNavigationRestrictions.nonSortableProperties = getDirectSortRestrictionsRecursively(entitySet, targetEntitySet, parentNavigationPath);
|
|
44
|
-
}
|
|
45
|
-
if (!restrictionsFromNavigationRestrictions.nonFilterableProperties.length) {
|
|
46
|
-
restrictionsFromNavigationRestrictions.nonFilterableProperties = getDirectFilterRestrictionsRecursively(entitySet, targetEntitySet, parentNavigationPath);
|
|
47
|
-
}
|
|
48
|
-
return restrictionsFromNavigationRestrictions;
|
|
29
|
+
const directRestrictions = {
|
|
30
|
+
nonSortableProperties: getDirectSortRestrictions(entitySet, targetEntitySet, parentNavigationPath),
|
|
31
|
+
nonFilterableProperties: getDirectFilterRestrictions(entitySet, targetEntitySet, parentNavigationPath)
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
nonSortableProperties: Array.from(new Set([...restrictionsFromNavigationRestrictions.nonSortableProperties, ...directRestrictions.nonSortableProperties])),
|
|
35
|
+
nonFilterableProperties: Array.from(new Set([...restrictionsFromNavigationRestrictions.nonFilterableProperties, ...directRestrictions.nonFilterableProperties]))
|
|
36
|
+
};
|
|
49
37
|
};
|
|
50
38
|
|
|
51
39
|
/**
|
|
52
40
|
* Gets all SortRestrictions and FilterRestrictions for a given context.
|
|
53
|
-
* This function verifies whether we are in a containment scenario.
|
|
41
|
+
* This function verifies whether we are in a containment scenario.
|
|
54
42
|
* @param converterContext The converter context.
|
|
55
43
|
* @returns Object containing all property names of restrictions separated by sortable and filterable capabilities.
|
|
56
44
|
*/
|
|
@@ -67,20 +55,9 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
67
55
|
} = getTargetEntitySetInfo(dataModelObjectPath);
|
|
68
56
|
if (isEntitySet(targetEntitySet)) {
|
|
69
57
|
// Get the restrictions on the target navigation entity set
|
|
70
|
-
|
|
71
|
-
if (parentEntitySet && isEntitySet(parentEntitySet)) {
|
|
72
|
-
// Get the restrictions from the NavigationRestrictions / Restrictions on the parent entity set
|
|
73
|
-
// It's takes precedence over the restrictions on the target entity set
|
|
74
|
-
const parentPropertiesRestrictions = getPropertiesRestrictionsBasedOnEntities(parentEntitySet, targetEntitySet, parentNavigationPath);
|
|
75
|
-
if (parentPropertiesRestrictions.nonSortableProperties.length) {
|
|
76
|
-
propertiesRestrictions.nonSortableProperties = parentPropertiesRestrictions.nonSortableProperties;
|
|
77
|
-
}
|
|
78
|
-
if (parentPropertiesRestrictions.nonFilterableProperties.length) {
|
|
79
|
-
propertiesRestrictions.nonFilterableProperties = parentPropertiesRestrictions.nonFilterableProperties;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
58
|
+
return getPropertiesRestrictionsBasedOnEntities(targetEntitySet);
|
|
82
59
|
} else if (parentEntitySet && isEntitySet(parentEntitySet)) {
|
|
83
|
-
// Find the restrictions on the parent entity set, this applies
|
|
60
|
+
// Find the restrictions on the parent entity set, this applies for containment as there isn't an entity set available on the OP
|
|
84
61
|
return getPropertiesRestrictionsBasedOnEntities(parentEntitySet, undefined, parentNavigationPath);
|
|
85
62
|
}
|
|
86
63
|
return propertiesRestrictions;
|
|
@@ -106,21 +83,11 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
106
83
|
const navigationProperty = navigationRestriction.NavigationProperty.$target;
|
|
107
84
|
if (navigationProperty) {
|
|
108
85
|
// add all properties of the navigation property to the nonSortableProperties
|
|
109
|
-
|
|
110
|
-
sortRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => property.name));
|
|
111
|
-
} else {
|
|
112
|
-
sortRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`));
|
|
113
|
-
}
|
|
86
|
+
sortRestrictionsFromNavigationRestrictions.push(...getAllPropertiesOfNavigationProperty(navigationProperty, navigationRestriction, parentNavigationPath));
|
|
114
87
|
}
|
|
115
88
|
} else {
|
|
116
89
|
const nonSortableNavigationProperties = navigationRestriction?.SortRestrictions?.NonSortableProperties?.map(property => {
|
|
117
|
-
|
|
118
|
-
if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
|
|
119
|
-
return property.$target?.name;
|
|
120
|
-
} else {
|
|
121
|
-
// leave the property path unchanged (it is relative to the annotation target!)
|
|
122
|
-
return property.value;
|
|
123
|
-
}
|
|
90
|
+
return getRestrictedPropertyRelativePath(property, targetEntitySet, parentNavigationPath);
|
|
124
91
|
});
|
|
125
92
|
if (nonSortableNavigationProperties?.length) {
|
|
126
93
|
sortRestrictionsFromNavigationRestrictions.push(...nonSortableNavigationProperties);
|
|
@@ -137,12 +104,8 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
137
104
|
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
138
105
|
* @returns Array containing the property names of all non-sortable properties.
|
|
139
106
|
*/
|
|
140
|
-
function
|
|
107
|
+
function getDirectSortRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
|
|
141
108
|
const sortRestrictionsOnEntitySet = [];
|
|
142
|
-
if (targetEntitySet) {
|
|
143
|
-
// if the targetEntitySet from a navigation is available, get the direct restriction on the targetEntitySet (child entity set)
|
|
144
|
-
return getDirectSortRestrictionsRecursively(targetEntitySet, undefined, parentNavigationPath);
|
|
145
|
-
}
|
|
146
109
|
if (entitySet.annotations.Capabilities?.SortRestrictions?.Sortable === false) {
|
|
147
110
|
// add all properties of the entity set to the nonSortableProperties
|
|
148
111
|
sortRestrictionsOnEntitySet.push(...entitySet.entityType.entityProperties.map(property => property.name));
|
|
@@ -153,11 +116,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
153
116
|
// skip the non sortable property if it doesn't belong to the parent navigation path in case of containment
|
|
154
117
|
return;
|
|
155
118
|
}
|
|
156
|
-
|
|
157
|
-
nonSortableProperties.push(property.$target?.name);
|
|
158
|
-
} else {
|
|
159
|
-
nonSortableProperties.push(property.value);
|
|
160
|
-
}
|
|
119
|
+
nonSortableProperties.push(getRestrictedPropertyRelativePath(property, targetEntitySet, parentNavigationPath));
|
|
161
120
|
});
|
|
162
121
|
if (nonSortableProperties?.length) {
|
|
163
122
|
sortRestrictionsOnEntitySet.push(...nonSortableProperties);
|
|
@@ -176,8 +135,9 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
176
135
|
function getFilterRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
|
|
177
136
|
const filterRestrictionsFromNavigationRestrictions = [];
|
|
178
137
|
entitySet.annotations.Capabilities?.NavigationRestrictions?.RestrictedProperties?.forEach(navigationRestriction => {
|
|
179
|
-
//
|
|
180
|
-
if
|
|
138
|
+
// Get the filter restrictions of the related navigation path
|
|
139
|
+
// The navigationRestriction is also relevant if it contains the parent navigation path
|
|
140
|
+
if (parentNavigationPath && !navigationRestriction?.NavigationProperty?.value.includes(parentNavigationPath)) {
|
|
181
141
|
return;
|
|
182
142
|
}
|
|
183
143
|
if (navigationRestriction?.FilterRestrictions?.Filterable === false) {
|
|
@@ -185,21 +145,11 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
185
145
|
const navigationProperty = navigationRestriction.NavigationProperty.$target;
|
|
186
146
|
if (navigationProperty) {
|
|
187
147
|
// add all properties of the navigation property to the nonFilterableProperties
|
|
188
|
-
|
|
189
|
-
filterRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => property.name));
|
|
190
|
-
} else {
|
|
191
|
-
filterRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`));
|
|
192
|
-
}
|
|
148
|
+
filterRestrictionsFromNavigationRestrictions.push(...getAllPropertiesOfNavigationProperty(navigationProperty, navigationRestriction, parentNavigationPath));
|
|
193
149
|
}
|
|
194
150
|
} else {
|
|
195
151
|
const nonFilterableNavigationProperties = navigationRestriction?.FilterRestrictions?.NonFilterableProperties?.map(property => {
|
|
196
|
-
|
|
197
|
-
if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
|
|
198
|
-
return property.$target?.name;
|
|
199
|
-
} else {
|
|
200
|
-
// leave the property path unchanged (it is relative to the annotation target!)
|
|
201
|
-
return property.value;
|
|
202
|
-
}
|
|
152
|
+
return getRestrictedPropertyRelativePath(property, targetEntitySet, parentNavigationPath);
|
|
203
153
|
});
|
|
204
154
|
if (nonFilterableNavigationProperties?.length) {
|
|
205
155
|
filterRestrictionsFromNavigationRestrictions.push(...nonFilterableNavigationProperties);
|
|
@@ -209,6 +159,49 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
209
159
|
return filterRestrictionsFromNavigationRestrictions;
|
|
210
160
|
}
|
|
211
161
|
|
|
162
|
+
/**
|
|
163
|
+
* Gets all properties of a navigation property based on the navigation restriction and parent navigation path.
|
|
164
|
+
* @param navigationProperty The navigation property to be analyzed.
|
|
165
|
+
* @param navigationRestriction The navigation restriction to be applied.
|
|
166
|
+
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
167
|
+
* @returns The array of property names of the navigation property.
|
|
168
|
+
*/
|
|
169
|
+
function getAllPropertiesOfNavigationProperty(navigationProperty, navigationRestriction, parentNavigationPath) {
|
|
170
|
+
if (parentNavigationPath) {
|
|
171
|
+
// for containment scenario only
|
|
172
|
+
if (navigationRestriction?.NavigationProperty?.value !== navigationProperty.name) {
|
|
173
|
+
// in case the target entity set is a child entity set (OP), we need to get the properties based on OP target entity set
|
|
174
|
+
const navigationPathBasedOnParent = navigationRestriction?.NavigationProperty?.value.replace(`${parentNavigationPath}/`, "");
|
|
175
|
+
return navigationProperty.targetType.entityProperties.map(property => `${navigationPathBasedOnParent}/${property.name}`);
|
|
176
|
+
} else {
|
|
177
|
+
return navigationProperty.targetType.entityProperties.map(property => property.name);
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
return navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Gets the relative path of the property restricted based on the target entity set and parent navigation path.
|
|
186
|
+
* @param property The property to be analyzed.
|
|
187
|
+
* @param targetEntitySet The target entity set, if available. Not present in the case of containment.
|
|
188
|
+
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
189
|
+
* @returns The relative path of the restricted property.
|
|
190
|
+
*/
|
|
191
|
+
function getRestrictedPropertyRelativePath(property, targetEntitySet, parentNavigationPath) {
|
|
192
|
+
if (parentNavigationPath && property.value.includes(parentNavigationPath)) {
|
|
193
|
+
// if the parentNavigationPath is available, we need to check if the property belongs to the parent navigation path
|
|
194
|
+
// we need to get the property path based on target entity for the child entity set (OP)
|
|
195
|
+
return property.value.replace(`${parentNavigationPath}/`, "");
|
|
196
|
+
} else if (targetEntitySet && property.$target?.name) {
|
|
197
|
+
// we need the property name from the navigation restriction definition when the targetEntitySet is available and it's not a containment scenario
|
|
198
|
+
return property.$target?.name;
|
|
199
|
+
} else {
|
|
200
|
+
// leave the property path unchanged (it is relative to the annotation target!)
|
|
201
|
+
return property.value;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
212
205
|
/**
|
|
213
206
|
* Gets the filter restrictions directly from the entity set.
|
|
214
207
|
* @param entitySet Entity set to be analyzed.
|
|
@@ -216,27 +209,19 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
216
209
|
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
217
210
|
* @returns Array containing the property names of all non-filterable properties.
|
|
218
211
|
*/
|
|
219
|
-
function
|
|
212
|
+
function getDirectFilterRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
|
|
220
213
|
const filterRestrictionsOnEntitySet = [];
|
|
221
|
-
if (targetEntitySet && parentNavigationPath) {
|
|
222
|
-
// if the targetEntitySet from a navigation is available, get the direct restriction on the targetEntitySet (child entity set)
|
|
223
|
-
return getDirectFilterRestrictionsRecursively(targetEntitySet, undefined, parentNavigationPath);
|
|
224
|
-
}
|
|
225
214
|
if (entitySet.annotations.Capabilities?.FilterRestrictions?.Filterable === false) {
|
|
226
215
|
// add all properties of the entity set to the nonFilterableProperties
|
|
227
216
|
filterRestrictionsOnEntitySet.push(...entitySet.entityType.entityProperties.map(property => property.name));
|
|
228
217
|
} else {
|
|
229
218
|
const nonFilterableProperties = [];
|
|
230
|
-
entitySet.annotations.Capabilities?.FilterRestrictions?.NonFilterableProperties?.forEach(
|
|
231
|
-
if (parentNavigationPath && !
|
|
219
|
+
entitySet.annotations.Capabilities?.FilterRestrictions?.NonFilterableProperties?.forEach(propertyPath => {
|
|
220
|
+
if (parentNavigationPath && !propertyPath.value.includes(parentNavigationPath)) {
|
|
232
221
|
// skip the non filterable property if it doesn't belong to the parent navigation path in case of containment
|
|
233
222
|
return;
|
|
234
223
|
}
|
|
235
|
-
|
|
236
|
-
nonFilterableProperties.push(property.$target?.name);
|
|
237
|
-
} else {
|
|
238
|
-
nonFilterableProperties.push(property.value);
|
|
239
|
-
}
|
|
224
|
+
nonFilterableProperties.push(getRestrictedPropertyRelativePath(propertyPath, targetEntitySet, parentNavigationPath));
|
|
240
225
|
});
|
|
241
226
|
if (nonFilterableProperties?.length) {
|
|
242
227
|
filterRestrictionsOnEntitySet.push(...nonFilterableProperties);
|
|
@@ -246,4 +231,4 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], funct
|
|
|
246
231
|
}
|
|
247
232
|
return _exports;
|
|
248
233
|
}, false);
|
|
249
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zQmFzZWRPbkVudGl0aWVzIiwiZW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwicGFyZW50TmF2aWdhdGlvblBhdGgiLCJyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsImdldFNvcnRSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJkaXJlY3RTb3J0UmVzdHJpY3Rpb25zIiwiZ2V0RGlyZWN0U29ydFJlc3RyaWN0aW9uc1JlY3Vyc2l2ZWx5IiwidW5kZWZpbmVkIiwiZGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zIiwiZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zUmVjdXJzaXZlbHkiLCJBcnJheSIsImZyb20iLCJTZXQiLCJsZW5ndGgiLCJnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMiLCJjb252ZXJ0ZXJDb250ZXh0IiwicHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwicGFyZW50RW50aXR5U2V0IiwiZ2V0VGFyZ2V0RW50aXR5U2V0SW5mbyIsImlzRW50aXR5U2V0IiwicGFyZW50UHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsIl9leHBvcnRzIiwic29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiYW5ub3RhdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJmb3JFYWNoIiwibmF2aWdhdGlvblJlc3RyaWN0aW9uIiwiTmF2aWdhdGlvblByb3BlcnR5IiwidmFsdWUiLCJTb3J0UmVzdHJpY3Rpb25zIiwiU29ydGFibGUiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCIkdGFyZ2V0IiwicHVzaCIsInRhcmdldFR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwibWFwIiwicHJvcGVydHkiLCJuYW1lIiwibm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsIk5vblNvcnRhYmxlUHJvcGVydGllcyIsInNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldCIsImVudGl0eVR5cGUiLCJpbmNsdWRlcyIsImZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVudGl0eVNldEhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBpc0VudGl0eVNldCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IGdldFRhcmdldEVudGl0eVNldEluZm8gfSBmcm9tIFwiLi9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IHtcblx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhbGwgRmlsdGVyUmVzdHJpY3Rpb25zIGFuZCBTb3J0UmVzdHJpY3Rpb25zIG9mIHRoZSBtYWluIGFuZCBjaGlsZCBlbnRpdGllcyBhbmQgdGhlaXIgZGVkaWNhdGVkIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuXHQxLiBGb3IgY29udGFpbm1lbnQgc2NlbmFyaW86XG5cdCAgIDEuMS4gRm9yIExSLCBOYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucyBhcmUgZXZhbHVhdGVkIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSByb290IGVudGl0eS4gSWYgYm90aCBhIG5hdmlnYXRpb24gcHJvcGVydHkgcmVzdHJpY3Rpb24gYW5kIGEgZGlyZWN0IHJlc3RyaWN0aW9uIGV4aXN0LCB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBpcyB0aGUgbW9zdCBwcmVjaXNlIGRlZmluaXRpb24gYW5kIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGlyZWN0IHJlc3RyaWN0aW9uLlxuXHQgICAxLjIgRm9yIHRoZSBPUCwgUmVzdHJpY3Rpb25zIGFyZSBvbmx5IGNhbGN1bGF0ZWQgb24gdGhlIHJvb3QgZW50aXR5LCBhcyB0aGVyZSBhcmUgbm8gY2hpbGQgZW50aXRpZXMuIFRoZSBzYW1lIGFwcHJvYWNoIGRlc2NyaWJlZCBpbiBwb2ludCAxLjEgaXMgYXBwbGllZC5cbiBcblx0Mi4gRm9yIGEgbm9uIGNvbnRhaW5tZW50IHNjZW5hcmlvOlxuXHQgICAyLjEgVGhlIHNhbWUgbG9naWMgZGVzY3JpYmVkIGluIHBvaW50IDEuMSBhcHBsaWVzLlxuXHQgICAyLjIgRm9yIHRoZSBPUFxuXHRcdFx0Mi4yLjEgUmV0cmlldmUgdGhlIGRpcmVjdCByZXN0cmljdGlvbnMgY29uZmlndXJlZCBvbiB0aGUgY2hpbGQgZW50aXR5IGRpc3BsYXllZCBpbiB0aGUgdGFibGUgb3Igb24gdGhlIHJvb3QgZW50aXR5LlxuXHRcdFx0Mi4yLjIgSWYgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IHJlc3RyaWN0aW9uIGlzIGRlZmluZWQgb24gdGhlIG1haW4gZW50aXR5LCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGRpcmVjdCByZXN0cmljdGlvbnMgZnJvbSAyLjIuMS5cblx0XHRcdDIuMi4zIE5hdmlnYXRpb25SZXN0cmljdGlvbnMgb24gdGhlIHRhcmdldCAoY2hpbGQpIGVudGl0eSBzZXQgYXJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZFxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIGFuZCBub24tc29ydGFibGUgcHJvcGVydGllc1xuICovXG5jb25zdCBnZXRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zQmFzZWRPbkVudGl0aWVzID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlTZXQ6IEVudGl0eVNldCxcblx0dGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0LFxuXHRwYXJlbnROYXZpZ2F0aW9uUGF0aD86IHN0cmluZ1xuKTogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSB7XG5cdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXRTb3J0UmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKSxcblx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKVxuXHR9O1xuXHRpZiAoIXRhcmdldEVudGl0eVNldCkge1xuXHRcdC8vIGlmIHRoZSB0YXJnZXRFbnRpdHlTZXQgaXMgbm90IGF2YWlsYWJsZSwgd2UgbmVlZCB0byBnZXQgYWxsIHRoZSBsaXN0IG9mIHJlc2N0cmljdGlvbnMgZnJvbSB0aGUgcm9vdCBlbnRpdHlTZXQsIHRoaXMgYXBwbGllcyBmb3Igb24gdGhlIGxpc3QgcmVwb3J0XG5cdFx0Y29uc3QgZGlyZWN0U29ydFJlc3RyaWN0aW9ucyA9IGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnNSZWN1cnNpdmVseShlbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHRcdGNvbnN0IGRpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyA9IGdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9uc1JlY3Vyc2l2ZWx5KGVudGl0eVNldCwgdW5kZWZpbmVkLCBwYXJlbnROYXZpZ2F0aW9uUGF0aCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5vblNvcnRhYmxlUHJvcGVydGllczogQXJyYXkuZnJvbShcblx0XHRcdFx0bmV3IFNldChbLi4ucmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMubm9uU29ydGFibGVQcm9wZXJ0aWVzLCAuLi5kaXJlY3RTb3J0UmVzdHJpY3Rpb25zXSlcblx0XHRcdCksXG5cdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogQXJyYXkuZnJvbShcblx0XHRcdFx0bmV3IFNldChbLi4ucmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMsIC4uLmRpcmVjdEZpbHRlclJlc3RyaWN0aW9uc10pXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxuXHRpZiAoIXJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLm5vblNvcnRhYmxlUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5ub25Tb3J0YWJsZVByb3BlcnRpZXMgPSBnZXREaXJlY3RTb3J0UmVzdHJpY3Rpb25zUmVjdXJzaXZlbHkoXG5cdFx0XHRlbnRpdHlTZXQsXG5cdFx0XHR0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRwYXJlbnROYXZpZ2F0aW9uUGF0aFxuXHRcdCk7XG5cdH1cblx0aWYgKCFyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcyA9IGdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9uc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0ZW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5U2V0LFxuXHRcdFx0cGFyZW50TmF2aWdhdGlvblBhdGhcblx0XHQpO1xuXHR9XG5cdHJldHVybiByZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcbn07XG5cbi8qKlxuICogR2V0cyBhbGwgU29ydFJlc3RyaWN0aW9ucyBhbmQgRmlsdGVyUmVzdHJpY3Rpb25zIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKiBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHdoZXRoZXIgd2UgYXJlIGluIGEgY29udGFpbm1lbnQgc2NlbmFyaW8uIEluIGEgbm9uIGNvbnRhaW5tZW50IHNjZW5hcmlvIGl0IGRldGVybWluZXMgaWYgd2UgYXJlIGluIGEgTGlzdCBSZXBvcnQgb3IgYW4gT2JqZWN0IFBhZ2UuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBhbGwgcHJvcGVydHkgbmFtZXMgb2YgcmVzdHJpY3Rpb25zIHNlcGFyYXRlZCBieSBzb3J0YWJsZSBhbmQgZmlsdGVyYWJsZSBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyB7XG5cdGxldCBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zOiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSB7IG5vblNvcnRhYmxlUHJvcGVydGllczogW10sIG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBbXSB9O1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHsgcGFyZW50RW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoIH0gPSBnZXRUYXJnZXRFbnRpdHlTZXRJbmZvKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRpZiAoaXNFbnRpdHlTZXQodGFyZ2V0RW50aXR5U2V0KSkge1xuXHRcdC8vIEdldCB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSB0YXJnZXQgbmF2aWdhdGlvbiBlbnRpdHkgc2V0XG5cdFx0cHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGdldFByb3BlcnRpZXNSZXN0cmljdGlvbnNCYXNlZE9uRW50aXRpZXModGFyZ2V0RW50aXR5U2V0KTtcblx0XHRpZiAocGFyZW50RW50aXR5U2V0ICYmIGlzRW50aXR5U2V0KHBhcmVudEVudGl0eVNldCkpIHtcblx0XHRcdC8vIEdldCB0aGUgcmVzdHJpY3Rpb25zIGZyb20gdGhlIE5hdmlnYXRpb25SZXN0cmljdGlvbnMgLyBSZXN0cmljdGlvbnMgb24gdGhlIHBhcmVudCBlbnRpdHkgc2V0XG5cdFx0XHQvLyBJdCdzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSB0YXJnZXQgZW50aXR5IHNldFxuXHRcdFx0Y29uc3QgcGFyZW50UHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGdldFByb3BlcnRpZXNSZXN0cmljdGlvbnNCYXNlZE9uRW50aXRpZXMoXG5cdFx0XHRcdHBhcmVudEVudGl0eVNldCxcblx0XHRcdFx0dGFyZ2V0RW50aXR5U2V0LFxuXHRcdFx0XHRwYXJlbnROYXZpZ2F0aW9uUGF0aFxuXHRcdFx0KTtcblx0XHRcdGlmIChwYXJlbnRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vblNvcnRhYmxlUHJvcGVydGllcy5sZW5ndGgpIHtcblx0XHRcdFx0cHJvcGVydGllc1Jlc3RyaWN0aW9ucy5ub25Tb3J0YWJsZVByb3BlcnRpZXMgPSBwYXJlbnRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vblNvcnRhYmxlUHJvcGVydGllcztcblx0XHRcdH1cblx0XHRcdGlmIChwYXJlbnRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0XHRwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID0gcGFyZW50UHJvcGVydGllc1Jlc3RyaWN0aW9ucy5ub25GaWx0ZXJhYmxlUHJvcGVydGllcztcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAocGFyZW50RW50aXR5U2V0ICYmIGlzRW50aXR5U2V0KHBhcmVudEVudGl0eVNldCkpIHtcblx0XHQvLyBGaW5kIHRoZSByZXN0cmljdGlvbnMgb24gdGhlIHBhcmVudCBlbnRpdHkgc2V0LCB0aGlzIGFwcGxpZXMgYWxzbyBmb3IgY29udGFpbm1lbnQgYXMgdGhlcmUgaXNuJ3QgYW4gZW50aXR5IHNldCBvbiB0aGUgT1Bcblx0XHRyZXR1cm4gZ2V0UHJvcGVydGllc1Jlc3RyaWN0aW9uc0Jhc2VkT25FbnRpdGllcyhwYXJlbnRFbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHR9XG5cdHJldHVybiBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzb3J0IHJlc3RyaWN0aW9ucyBmcm9tIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1zb3J0YWJsZSBwcm9wZXJ0aWVzIGZyb20gbmF2aWdhdGlvbiByZXN0cmljdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gaWYgY29udGFpbm1lbnQgZW5hYmxlZCBnZXQgb25seSB0aGUgc29ydCByZXN0cmljdGlvbnMgb2YgdGhlIHJlbGF0ZWQgbmF2aWdhdGlvbiBwYXRoXG5cdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoICYmIHBhcmVudE5hdmlnYXRpb25QYXRoICE9PSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/Lk5hdmlnYXRpb25Qcm9wZXJ0eT8udmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uU29ydGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG5hdmlnYXRpb25SZXN0cmljdGlvbi5OYXZpZ2F0aW9uUHJvcGVydHkuJHRhcmdldDtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25Tb3J0YWJsZVByb3BlcnRpZXNcblx0XHRcdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHQuLi5uYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzb3J0UmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdC4uLm5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gYCR7bmF2aWdhdGlvblByb3BlcnR5Lm5hbWV9LyR7cHJvcGVydHkubmFtZX1gKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgbm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBkZWZpbml0aW9uIHdoZW4gdGhlIHRhcmdldEVudGl0eVNldCBpcyBhdmFpbGFibGVcblx0XHRcdFx0aWYgKCh0YXJnZXRFbnRpdHlTZXQgfHwgcGFyZW50TmF2aWdhdGlvblBhdGgpICYmIHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHkuJHRhcmdldD8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBsZWF2ZSB0aGUgcHJvcGVydHkgcGF0aCB1bmNoYW5nZWQgKGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldCEpXG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goLi4ubm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzb3J0IHJlc3RyaWN0aW9ucyBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0LlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLXNvcnRhYmxlIHByb3BlcnRpZXMuXG4gKi9cbmZ1bmN0aW9uIGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnNSZWN1cnNpdmVseShlbnRpdHlTZXQ6IEVudGl0eVNldCwgdGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0LCBwYXJlbnROYXZpZ2F0aW9uUGF0aD86IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc09uRW50aXR5U2V0OiBzdHJpbmdbXSA9IFtdO1xuXHRpZiAodGFyZ2V0RW50aXR5U2V0KSB7XG5cdFx0Ly8gaWYgdGhlIHRhcmdldEVudGl0eVNldCBmcm9tIGEgbmF2aWdhdGlvbiBpcyBhdmFpbGFibGUsIGdldCB0aGUgZGlyZWN0IHJlc3RyaWN0aW9uIG9uIHRoZSB0YXJnZXRFbnRpdHlTZXQgKGNoaWxkIGVudGl0eSBzZXQpXG5cdFx0cmV0dXJuIGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnNSZWN1cnNpdmVseSh0YXJnZXRFbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHR9XG5cdGlmIChlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5Tb3J0UmVzdHJpY3Rpb25zPy5Tb3J0YWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXQgdG8gdGhlIG5vblNvcnRhYmxlUHJvcGVydGllc1xuXHRcdHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLmVudGl0eVNldC5lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG5vblNvcnRhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5Tb3J0UmVzdHJpY3Rpb25zPy5Ob25Tb3J0YWJsZVByb3BlcnRpZXM/LmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGggJiYgIXByb3BlcnR5LnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHQvLyBza2lwIHRoZSBub24gc29ydGFibGUgcHJvcGVydHkgaWYgaXQgZG9lc24ndCBiZWxvbmcgdG8gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGggaW4gY2FzZSBvZiBjb250YWlubWVudFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoKHRhcmdldEVudGl0eVNldCB8fCBwYXJlbnROYXZpZ2F0aW9uUGF0aCkgJiYgcHJvcGVydHkuJHRhcmdldD8ubmFtZSkge1xuXHRcdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eS4kdGFyZ2V0Py5uYW1lKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5LnZhbHVlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAobm9uU29ydGFibGVQcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLm5vblNvcnRhYmxlUHJvcGVydGllcyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBzb3J0UmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBmcm9tIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIHByb3BlcnRpZXMgZnJvbSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoXG5cdGVudGl0eVNldDogRW50aXR5U2V0LFxuXHR0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsXG5cdHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gaWYgY29udGFpbm1lbnQgZW5hYmxlZCBnZXQgb25seSB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBvZiB0aGUgcmVsYXRlZCBuYXZpZ2F0aW9uIHBhdGhcblx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGggJiYgcGFyZW50TmF2aWdhdGlvblBhdGggIT09IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uTmF2aWdhdGlvblByb3BlcnR5Py52YWx1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAobmF2aWdhdGlvblJlc3RyaWN0aW9uPy5GaWx0ZXJSZXN0cmljdGlvbnM/LkZpbHRlcmFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG5hdmlnYXRpb25SZXN0cmljdGlvbi5OYXZpZ2F0aW9uUHJvcGVydHkuJHRhcmdldDtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25GaWx0ZXJhYmxlUHJvcGVydGllc1xuXHRcdFx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGgpIHtcblx0XHRcdFx0XHRmaWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5wdXNoKFxuXHRcdFx0XHRcdFx0Li4ubmF2aWdhdGlvblByb3BlcnR5LnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdC4uLm5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gYCR7bmF2aWdhdGlvblByb3BlcnR5Lm5hbWV9LyR7cHJvcGVydHkubmFtZX1gKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgbm9uRmlsdGVyYWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzID0gbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5GaWx0ZXJSZXN0cmljdGlvbnM/Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5tYXAoXG5cdFx0XHRcdChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdC8vIHdlIG5lZWQgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBkZWZpbml0aW9uIHdoZW4gdGhlIHRhcmdldEVudGl0eVNldCBpcyBhdmFpbGFibGUgYW5kIGl0J3Mgbm90IGEgY29udGFpbm1lbnQgc2NlbmFyaW9cblx0XHRcdFx0XHRpZiAoKHRhcmdldEVudGl0eVNldCB8fCBwYXJlbnROYXZpZ2F0aW9uUGF0aCkgJiYgcHJvcGVydHkuJHRhcmdldD8ubmFtZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWU7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIGxlYXZlIHRoZSBwcm9wZXJ0eSBwYXRoIHVuY2hhbmdlZCAoaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGFubm90YXRpb24gdGFyZ2V0ISlcblx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eS52YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0XHRpZiAobm9uRmlsdGVyYWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaCguLi5ub25GaWx0ZXJhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBmaWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIGRpcmVjdGx5IGZyb20gdGhlIGVudGl0eSBzZXQuXG4gKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eSBzZXQgdG8gYmUgYW5hbHl6ZWQuXG4gKiBAcGFyYW0gdGFyZ2V0RW50aXR5U2V0IFRoZSB0YXJnZXQgZW50aXR5IHNldCwgaWYgYXZhaWxhYmxlLiBOb3QgdXNlZCBpbiB0aGUgY2FzZSBvZiBjb250YWlubWVudC5cbiAqIEBwYXJhbSBwYXJlbnROYXZpZ2F0aW9uUGF0aCBUaGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCwgc3BlY2lmaWMgZm9yIGNvbnRhaW5tZW50IHNjZW5hcmlvIHRvIGdldCB0aGUgY29ycmVjdCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aC5cbiAqIEByZXR1cm5zIEFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5IG5hbWVzIG9mIGFsbCBub24tZmlsdGVyYWJsZSBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBnZXREaXJlY3RGaWx0ZXJSZXN0cmljdGlvbnNSZWN1cnNpdmVseShcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ6IHN0cmluZ1tdID0gW107XG5cdGlmICh0YXJnZXRFbnRpdHlTZXQgJiYgcGFyZW50TmF2aWdhdGlvblBhdGgpIHtcblx0XHQvLyBpZiB0aGUgdGFyZ2V0RW50aXR5U2V0IGZyb20gYSBuYXZpZ2F0aW9uIGlzIGF2YWlsYWJsZSwgZ2V0IHRoZSBkaXJlY3QgcmVzdHJpY3Rpb24gb24gdGhlIHRhcmdldEVudGl0eVNldCAoY2hpbGQgZW50aXR5IHNldClcblx0XHRyZXR1cm4gZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zUmVjdXJzaXZlbHkodGFyZ2V0RW50aXR5U2V0LCB1bmRlZmluZWQsIHBhcmVudE5hdmlnYXRpb25QYXRoKTtcblx0fVxuXHRpZiAoZW50aXR5U2V0LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uRmlsdGVyUmVzdHJpY3Rpb25zPy5GaWx0ZXJhYmxlID09PSBmYWxzZSkge1xuXHRcdC8vIGFkZCBhbGwgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHNldCB0byB0aGUgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcblx0XHRmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLmVudGl0eVNldC5lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uTm9uRmlsdGVyYWJsZVByb3BlcnRpZXM/LmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGggJiYgIXByb3BlcnR5LnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHQvLyBza2lwIHRoZSBub24gZmlsdGVyYWJsZSBwcm9wZXJ0eSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCBpbiBjYXNlIG9mIGNvbnRhaW5tZW50XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICgodGFyZ2V0RW50aXR5U2V0IHx8IHBhcmVudE5hdmlnYXRpb25QYXRoKSAmJiBwcm9wZXJ0eS4kdGFyZ2V0Py5uYW1lKSB7XG5cdFx0XHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkuJHRhcmdldD8ubmFtZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5LnZhbHVlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAobm9uRmlsdGVyYWJsZVByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQucHVzaCguLi5ub25GaWx0ZXJhYmxlUHJvcGVydGllcyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztFQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNQSx3Q0FBd0MsR0FBRyxTQUFBQSxDQUNoREMsU0FBb0IsRUFDcEJDLGVBQTJCLEVBQzNCQyxvQkFBNkIsRUFDRjtJQUMzQixNQUFNQyxzQ0FBc0MsR0FBRztNQUM5Q0MscUJBQXFCLEVBQUVDLDZDQUE2QyxDQUFDTCxTQUFTLEVBQUVDLGVBQWUsRUFBRUMsb0JBQW9CLENBQUM7TUFDdEhJLHVCQUF1QixFQUFFQywrQ0FBK0MsQ0FBQ1AsU0FBUyxFQUFFQyxlQUFlLEVBQUVDLG9CQUFvQjtJQUMxSCxDQUFDO0lBQ0QsSUFBSSxDQUFDRCxlQUFlLEVBQUU7TUFDckI7TUFDQSxNQUFNTyxzQkFB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
|
|
234
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zQmFzZWRPbkVudGl0aWVzIiwiZW50aXR5U2V0IiwidGFyZ2V0RW50aXR5U2V0IiwicGFyZW50TmF2aWdhdGlvblBhdGgiLCJyZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsImdldFNvcnRSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJkaXJlY3RSZXN0cmljdGlvbnMiLCJnZXREaXJlY3RTb3J0UmVzdHJpY3Rpb25zIiwiZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwiY29udmVydGVyQ29udGV4dCIsInByb3BlcnRpZXNSZXN0cmljdGlvbnMiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInBhcmVudEVudGl0eVNldCIsImdldFRhcmdldEVudGl0eVNldEluZm8iLCJpc0VudGl0eVNldCIsInVuZGVmaW5lZCIsIl9leHBvcnRzIiwic29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiYW5ub3RhdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiUmVzdHJpY3RlZFByb3BlcnRpZXMiLCJmb3JFYWNoIiwibmF2aWdhdGlvblJlc3RyaWN0aW9uIiwiTmF2aWdhdGlvblByb3BlcnR5IiwidmFsdWUiLCJTb3J0UmVzdHJpY3Rpb25zIiwiU29ydGFibGUiLCJuYXZpZ2F0aW9uUHJvcGVydHkiLCIkdGFyZ2V0IiwicHVzaCIsImdldEFsbFByb3BlcnRpZXNPZk5hdmlnYXRpb25Qcm9wZXJ0eSIsIm5vblNvcnRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMiLCJOb25Tb3J0YWJsZVByb3BlcnRpZXMiLCJtYXAiLCJwcm9wZXJ0eSIsImdldFJlc3RyaWN0ZWRQcm9wZXJ0eVJlbGF0aXZlUGF0aCIsImxlbmd0aCIsInNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldCIsImVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwibmFtZSIsImluY2x1ZGVzIiwiZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJGaWx0ZXJhYmxlIiwibm9uRmlsdGVyYWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJuYXZpZ2F0aW9uUGF0aEJhc2VkT25QYXJlbnQiLCJyZXBsYWNlIiwidGFyZ2V0VHlwZSIsImZpbHRlclJlc3RyaWN0aW9uc09uRW50aXR5U2V0IiwicHJvcGVydHlQYXRoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFbnRpdHlTZXRIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQsIE5hdmlnYXRpb25Qcm9wZXJ0eSwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IE5hdmlnYXRpb25Qcm9wZXJ0eVJlc3RyaWN0aW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9DYXBhYmlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyBnZXRUYXJnZXRFbnRpdHlTZXRJbmZvIH0gZnJvbSBcIi4vRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSB7XG5cdG5vblNvcnRhYmxlUHJvcGVydGllczogc3RyaW5nW107XG5cdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogUmVhZHMgYWxsIEZpbHRlclJlc3RyaWN0aW9ucyBhbmQgU29ydFJlc3RyaWN0aW9ucyBvZiB0aGUgbWFpbiBhbmQgY2hpbGQgZW50aXRpZXMgYW5kIHRoZWlyIGRlZGljYXRlZCBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbjEuIEZvciBjb250YWlubWVudCBzY2VuYXJpbzpcbiAgIDEuMS4gRm9yIExSLCBOYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucyBhcmUgZXZhbHVhdGVkIGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSByb290IGVudGl0eS4gSWYgTmF2aWdhdGlvbiBwcm9wZXJ0eSByZXN0cmljdGlvbiBhbmQgYSBkaXJlY3QgcmVzdHJpY3Rpb24gZXhpc3QsIGJvdGggYXJlIGNvbnNpZGVyZWQuXG4gICAxLjIgRm9yIHRoZSBPUCwgUmVzdHJpY3Rpb25zIGFyZSBvbmx5IGNhbGN1bGF0ZWQgb24gdGhlIHJvb3QgZW50aXR5LCBhcyB0aGVyZSBhcmUgbm8gY2hpbGQgZW50aXRpZXMuIFRoZSBzYW1lIGFwcHJvYWNoIGRlc2NyaWJlZCBpbiBwb2ludCAxLjEgaXMgYXBwbGllZC5cbjIuIEZvciBhIG5vbiBjb250YWlubWVudCBzY2VuYXJpbzpcbiAgIDIuMSBUaGUgc2FtZSBsb2dpYyBkZXNjcmliZWQgaW4gcG9pbnQgMS4xIGFwcGxpZXMuXG4gICAyLjIgRm9yIHRoZSBPUCwgdGhlIGRpcmVjdCByZXN0cmljdGlvbnMgY29uZmlndXJlZCBmb3IgdGhlIE9QIGFyZSBjb25zaWRlcmVkIGFsb25nIHdpdGggdGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zIG9uIHRoZSB0YXJnZXQgKGNoaWxkKSBlbnRpdHkgZGlzcGxheWVkLlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkICh0YXJnZXQgb3IgcGFyZW50IGVudGl0eSBzZXQpLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIGFuZCBub24tc29ydGFibGUgcHJvcGVydGllc1xuICovXG5jb25zdCBnZXRQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zQmFzZWRPbkVudGl0aWVzID0gZnVuY3Rpb24gKFxuXHRlbnRpdHlTZXQ6IEVudGl0eVNldCxcblx0dGFyZ2V0RW50aXR5U2V0PzogRW50aXR5U2V0LFxuXHRwYXJlbnROYXZpZ2F0aW9uUGF0aD86IHN0cmluZ1xuKTogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIHtcblx0Y29uc3QgcmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSB7XG5cdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXRTb3J0UmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKSxcblx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKVxuXHR9O1xuXHRjb25zdCBkaXJlY3RSZXN0cmljdGlvbnMgPSB7XG5cdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXREaXJlY3RTb3J0UmVzdHJpY3Rpb25zKGVudGl0eVNldCwgdGFyZ2V0RW50aXR5U2V0LCBwYXJlbnROYXZpZ2F0aW9uUGF0aCksXG5cdFx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IGdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyhlbnRpdHlTZXQsIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGgpXG5cdH07XG5cdHJldHVybiB7XG5cdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKFxuXHRcdFx0bmV3IFNldChbLi4ucmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMubm9uU29ydGFibGVQcm9wZXJ0aWVzLCAuLi5kaXJlY3RSZXN0cmljdGlvbnMubm9uU29ydGFibGVQcm9wZXJ0aWVzXSlcblx0XHQpLFxuXHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKFxuXHRcdFx0bmV3IFNldChbLi4ucmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMsIC4uLmRpcmVjdFJlc3RyaWN0aW9ucy5ub25GaWx0ZXJhYmxlUHJvcGVydGllc10pXG5cdFx0KVxuXHR9O1xufTtcblxuLyoqXG4gKiBHZXRzIGFsbCBTb3J0UmVzdHJpY3Rpb25zIGFuZCBGaWx0ZXJSZXN0cmljdGlvbnMgZm9yIGEgZ2l2ZW4gY29udGV4dC5cbiAqIFRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgd2hldGhlciB3ZSBhcmUgaW4gYSBjb250YWlubWVudCBzY2VuYXJpby5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGFsbCBwcm9wZXJ0eSBuYW1lcyBvZiByZXN0cmljdGlvbnMgc2VwYXJhdGVkIGJ5IHNvcnRhYmxlIGFuZCBmaWx0ZXJhYmxlIGNhcGFiaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGZ1bmN0aW9uIChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIHtcblx0bGV0IHByb3BlcnRpZXNSZXN0cmljdGlvbnM6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IHsgbm9uU29ydGFibGVQcm9wZXJ0aWVzOiBbXSwgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IFtdIH07XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Y29uc3QgeyBwYXJlbnRFbnRpdHlTZXQsIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGggfSA9IGdldFRhcmdldEVudGl0eVNldEluZm8oZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdGlmIChpc0VudGl0eVNldCh0YXJnZXRFbnRpdHlTZXQpKSB7XG5cdFx0Ly8gR2V0IHRoZSByZXN0cmljdGlvbnMgb24gdGhlIHRhcmdldCBuYXZpZ2F0aW9uIGVudGl0eSBzZXRcblx0XHRyZXR1cm4gZ2V0UHJvcGVydGllc1Jlc3RyaWN0aW9uc0Jhc2VkT25FbnRpdGllcyh0YXJnZXRFbnRpdHlTZXQpO1xuXHR9IGVsc2UgaWYgKHBhcmVudEVudGl0eVNldCAmJiBpc0VudGl0eVNldChwYXJlbnRFbnRpdHlTZXQpKSB7XG5cdFx0Ly8gRmluZCB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSBwYXJlbnQgZW50aXR5IHNldCwgdGhpcyBhcHBsaWVzIGZvciBjb250YWlubWVudCBhcyB0aGVyZSBpc24ndCBhbiBlbnRpdHkgc2V0IGF2YWlsYWJsZSBvbiB0aGUgT1Bcblx0XHRyZXR1cm4gZ2V0UHJvcGVydGllc1Jlc3RyaWN0aW9uc0Jhc2VkT25FbnRpdGllcyhwYXJlbnRFbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHR9XG5cdHJldHVybiBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzb3J0IHJlc3RyaWN0aW9ucyBmcm9tIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1zb3J0YWJsZSBwcm9wZXJ0aWVzIGZyb20gbmF2aWdhdGlvbiByZXN0cmljdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGdldFNvcnRSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gaWYgY29udGFpbm1lbnQgZW5hYmxlZCBnZXQgb25seSB0aGUgc29ydCByZXN0cmljdGlvbnMgb2YgdGhlIHJlbGF0ZWQgbmF2aWdhdGlvbiBwYXRoXG5cdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoICYmIHBhcmVudE5hdmlnYXRpb25QYXRoICE9PSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/Lk5hdmlnYXRpb25Qcm9wZXJ0eT8udmFsdWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uU29ydGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG5hdmlnYXRpb25SZXN0cmljdGlvbi5OYXZpZ2F0aW9uUHJvcGVydHkuJHRhcmdldDtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25Tb3J0YWJsZVByb3BlcnRpZXNcblx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0Li4uZ2V0QWxsUHJvcGVydGllc09mTmF2aWdhdGlvblByb3BlcnR5KG5hdmlnYXRpb25Qcm9wZXJ0eSwgbmF2aWdhdGlvblJlc3RyaWN0aW9uLCBwYXJlbnROYXZpZ2F0aW9uUGF0aClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgbm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdHJldHVybiBnZXRSZXN0cmljdGVkUHJvcGVydHlSZWxhdGl2ZVBhdGgocHJvcGVydHksIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHRcdFx0fSk7XG5cdFx0XHRpZiAobm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5wdXNoKC4uLm5vblNvcnRhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzb3J0UmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc29ydCByZXN0cmljdGlvbnMgZGlyZWN0bHkgZnJvbSB0aGUgZW50aXR5IHNldC5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1zb3J0YWJsZSBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBnZXREaXJlY3RTb3J0UmVzdHJpY3Rpb25zKGVudGl0eVNldDogRW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBzb3J0UmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ6IHN0cmluZ1tdID0gW107XG5cdGlmIChlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5Tb3J0UmVzdHJpY3Rpb25zPy5Tb3J0YWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXQgdG8gdGhlIG5vblNvcnRhYmxlUHJvcGVydGllc1xuXHRcdHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLmVudGl0eVNldC5lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG5vblNvcnRhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5Tb3J0UmVzdHJpY3Rpb25zPy5Ob25Tb3J0YWJsZVByb3BlcnRpZXM/LmZvckVhY2goKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRpZiAocGFyZW50TmF2aWdhdGlvblBhdGggJiYgIXByb3BlcnR5LnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHQvLyBza2lwIHRoZSBub24gc29ydGFibGUgcHJvcGVydHkgaWYgaXQgZG9lc24ndCBiZWxvbmcgdG8gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGggaW4gY2FzZSBvZiBjb250YWlubWVudFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChnZXRSZXN0cmljdGVkUHJvcGVydHlSZWxhdGl2ZVBhdGgocHJvcGVydHksIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGgpKTtcblx0XHR9KTtcblx0XHRpZiAobm9uU29ydGFibGVQcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLm5vblNvcnRhYmxlUHJvcGVydGllcyk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBzb3J0UmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBmcm9tIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuIE5vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGNvbnRhaW5tZW50LlxuICogQHBhcmFtIHBhcmVudE5hdmlnYXRpb25QYXRoIFRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLCBzcGVjaWZpYyBmb3IgY29udGFpbm1lbnQgc2NlbmFyaW8gdG8gZ2V0IHRoZSBjb3JyZWN0IHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIHByb3BlcnRpZXMgZnJvbSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZ2V0RmlsdGVyUmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoXG5cdGVudGl0eVNldDogRW50aXR5U2V0LFxuXHR0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsXG5cdHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gR2V0IHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIG9mIHRoZSByZWxhdGVkIG5hdmlnYXRpb24gcGF0aFxuXHRcdC8vIFRoZSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24gaXMgYWxzbyByZWxldmFudCBpZiBpdCBjb250YWlucyB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aFxuXHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiAhbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAobmF2aWdhdGlvblJlc3RyaWN0aW9uPy5GaWx0ZXJSZXN0cmljdGlvbnM/LkZpbHRlcmFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IG5hdmlnYXRpb25SZXN0cmljdGlvbi5OYXZpZ2F0aW9uUHJvcGVydHkuJHRhcmdldDtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25GaWx0ZXJhYmxlUHJvcGVydGllc1xuXHRcdFx0XHRmaWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5wdXNoKFxuXHRcdFx0XHRcdC4uLmdldEFsbFByb3BlcnRpZXNPZk5hdmlnYXRpb25Qcm9wZXJ0eShuYXZpZ2F0aW9uUHJvcGVydHksIG5hdmlnYXRpb25SZXN0cmljdGlvbiwgcGFyZW50TmF2aWdhdGlvblBhdGgpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uRmlsdGVyUmVzdHJpY3Rpb25zPy5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcz8ubWFwKFxuXHRcdFx0XHQocHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gZ2V0UmVzdHJpY3RlZFByb3BlcnR5UmVsYXRpdmVQYXRoKHByb3BlcnR5LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdGlmIChub25GaWx0ZXJhYmxlTmF2aWdhdGlvblByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRmaWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucy5wdXNoKC4uLm5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zO1xufVxuXG4vKipcbiAqIEdldHMgYWxsIHByb3BlcnRpZXMgb2YgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9uIGFuZCBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoLlxuICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eSBUaGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSB0byBiZSBhbmFseXplZC5cbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24gVGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb24gdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBwYXJlbnROYXZpZ2F0aW9uUGF0aCBUaGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCwgc3BlY2lmaWMgZm9yIGNvbnRhaW5tZW50IHNjZW5hcmlvIHRvIGdldCB0aGUgY29ycmVjdCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsUHJvcGVydGllc09mTmF2aWdhdGlvblByb3BlcnR5KFxuXHRuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0bmF2aWdhdGlvblJlc3RyaWN0aW9uPzogTmF2aWdhdGlvblByb3BlcnR5UmVzdHJpY3Rpb24sXG5cdHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCkge1xuXHRcdC8vIGZvciBjb250YWlubWVudCBzY2VuYXJpbyBvbmx5XG5cdFx0aWYgKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uTmF2aWdhdGlvblByb3BlcnR5Py52YWx1ZSAhPT0gbmF2aWdhdGlvblByb3BlcnR5Lm5hbWUpIHtcblx0XHRcdC8vIGluIGNhc2UgdGhlIHRhcmdldCBlbnRpdHkgc2V0IGlzIGEgY2hpbGQgZW50aXR5IHNldCAoT1ApLCB3ZSBuZWVkIHRvIGdldCB0aGUgcHJvcGVydGllcyBiYXNlZCBvbiBPUCB0YXJnZXQgZW50aXR5IHNldFxuXHRcdFx0Y29uc3QgbmF2aWdhdGlvblBhdGhCYXNlZE9uUGFyZW50ID0gbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlLnJlcGxhY2UoYCR7cGFyZW50TmF2aWdhdGlvblBhdGh9L2AsIFwiXCIpO1xuXHRcdFx0cmV0dXJuIG5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gYCR7bmF2aWdhdGlvblBhdGhCYXNlZE9uUGFyZW50fS8ke3Byb3BlcnR5Lm5hbWV9YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBuYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbmF2aWdhdGlvblByb3BlcnR5LnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBgJHtuYXZpZ2F0aW9uUHJvcGVydHkubmFtZX0vJHtwcm9wZXJ0eS5uYW1lfWApO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcHJvcGVydHkgcmVzdHJpY3RlZCBiYXNlZCBvbiB0aGUgdGFyZ2V0IGVudGl0eSBzZXQgYW5kIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHByZXNlbnQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzdHJpY3RlZCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzdHJpY3RlZFByb3BlcnR5UmVsYXRpdmVQYXRoKFxuXHRwcm9wZXJ0eTogUHJvcGVydHlQYXRoLFxuXHR0YXJnZXRFbnRpdHlTZXQ6IEVudGl0eVNldCB8IHVuZGVmaW5lZCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiBwcm9wZXJ0eS52YWx1ZS5pbmNsdWRlcyhwYXJlbnROYXZpZ2F0aW9uUGF0aCkpIHtcblx0XHQvLyBpZiB0aGUgcGFyZW50TmF2aWdhdGlvblBhdGggaXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBwcm9wZXJ0eSBiZWxvbmdzIHRvIHRoZSBwYXJlbnQgbmF2aWdhdGlvbiBwYXRoXG5cdFx0Ly8gd2UgbmVlZCB0byBnZXQgdGhlIHByb3BlcnR5IHBhdGggYmFzZWQgb24gdGFyZ2V0IGVudGl0eSBmb3IgdGhlIGNoaWxkIGVudGl0eSBzZXQgKE9QKVxuXHRcdHJldHVybiBwcm9wZXJ0eS52YWx1ZS5yZXBsYWNlKGAke3BhcmVudE5hdmlnYXRpb25QYXRofS9gLCBcIlwiKTtcblx0fSBlbHNlIGlmICh0YXJnZXRFbnRpdHlTZXQgJiYgcHJvcGVydHkuJHRhcmdldD8ubmFtZSkge1xuXHRcdC8vIHdlIG5lZWQgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBkZWZpbml0aW9uIHdoZW4gdGhlIHRhcmdldEVudGl0eVNldCBpcyBhdmFpbGFibGUgYW5kIGl0J3Mgbm90IGEgY29udGFpbm1lbnQgc2NlbmFyaW9cblx0XHRyZXR1cm4gcHJvcGVydHkuJHRhcmdldD8ubmFtZTtcblx0fSBlbHNlIHtcblx0XHQvLyBsZWF2ZSB0aGUgcHJvcGVydHkgcGF0aCB1bmNoYW5nZWQgKGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldCEpXG5cdFx0cmV0dXJuIHByb3BlcnR5LnZhbHVlO1xuXHR9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0LlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLWZpbHRlcmFibGUgcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zKGVudGl0eVNldDogRW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldDogc3RyaW5nW10gPSBbXTtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uRmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXQgdG8gdGhlIG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXG5cdFx0ZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQucHVzaCguLi5lbnRpdHlTZXQuZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBub25GaWx0ZXJhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJSZXN0cmljdGlvbnM/Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5mb3JFYWNoKChwcm9wZXJ0eVBhdGgpID0+IHtcblx0XHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiAhcHJvcGVydHlQYXRoLnZhbHVlLmluY2x1ZGVzKHBhcmVudE5hdmlnYXRpb25QYXRoKSkge1xuXHRcdFx0XHQvLyBza2lwIHRoZSBub24gZmlsdGVyYWJsZSBwcm9wZXJ0eSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCBpbiBjYXNlIG9mIGNvbnRhaW5tZW50XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLnB1c2goZ2V0UmVzdHJpY3RlZFByb3BlcnR5UmVsYXRpdmVQYXRoKHByb3BlcnR5UGF0aCwgdGFyZ2V0RW50aXR5U2V0LCBwYXJlbnROYXZpZ2F0aW9uUGF0aCkpO1xuXHRcdH0pO1xuXHRcdGlmIChub25GaWx0ZXJhYmxlUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0XHRmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldC5wdXNoKC4uLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZpbHRlclJlc3RyaWN0aW9uc09uRW50aXR5U2V0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0VBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxNQUFNQSx3Q0FBd0MsR0FBRyxTQUFBQSxDQUNoREMsU0FBb0IsRUFDcEJDLGVBQTJCLEVBQzNCQyxvQkFBNkIsRUFDRjtJQUMzQixNQUFNQyxzQ0FBc0MsR0FBRztNQUM5Q0MscUJBQXFCLEVBQUVDLDZDQUE2QyxDQUFDTCxTQUFTLEVB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b0JBQW9CLElBQUl3QyxRQUFRLENBQUNWLEtBQUssQ0FBQ2lCLFFBQVEsQ0FBQy9DLG9CQUFvQixDQUFDLEVBQUU7TUFDMUU7TUFDQTtNQUNBLE9BQU93QyxRQUFRLENBQUNWLEtBQUssQ0FBQ3dCLE9BQU8sQ0FBQyxHQUFHdEQsb0JBQW9CLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDOUQsQ0FBQyxNQUFNLElBQUlELGVBQWUsSUFBSXlDLFFBQVEsQ0FBQ04sT0FBTyxFQUFFWSxJQUFJLEVBQUU7TUFDckQ7TUFDQSxPQUFPTixRQUFRLENBQUNOLE9BQU8sRUFBRVksSUFBSTtJQUM5QixDQUFDLE1BQU07TUFDTjtNQUNBLE9BQU9OLFFBQVEsQ0FBQ1YsS0FBSztJQUN0QjtFQUNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBU3RCLDJCQUEyQkEsQ0FBQ1YsU0FBb0IsRUFBRUMsZUFBMkIsRUFBRUMsb0JBQTZCLEVBQVk7SUFDaEksTUFBTXdELDZCQUF1QyxHQUFHLEVBQUU7SUFDbEQsSUFBSTFELFNBQVMsQ0FBQ3lCLFdBQVcsQ0FBQ0MsWUFBWSxFQUFFeUIsa0JBQWtCLEVBQUVDLFVBQVUsS0FBSyxLQUFLLEVBQUU7TUFDakY7TUFDQU0sNkJBQTZCLENBQUNyQixJQUFJLENBQUMsR0FBR3JDLFNBQVMsQ0FBQzhDLFVBQVUsQ0FBQ0MsZ0JBQWdCLENBQUNOLEdBQUcsQ0FBRUMsUUFBUSxJQUFLQSxRQUFRLENBQUNNLElBQUksQ0FBQyxDQUFDO0lBQzlHLENBQUMsTUFBTTtNQUNOLE1BQU0xQyx1QkFBaUMsR0FBRyxFQUFFO01BQzVDTixTQUFTLENBQUN5QixXQUFXLENBQUNDLFlBQVksRUFBRXlCLGtCQUFrQixFQUFFRyx1QkFBdUIsRUFBRXpCLE9BQU8sQ0FBRThCLFlBQVksSUFBSztRQUMxRyxJQUFJekQsb0JBQW9CLElBQUksQ0FBQ3lELFlBQVksQ0FBQzNCLEtBQUssQ0FBQ2lCLFFBQVEsQ0FBQy9DLG9CQUFvQixDQUFDLEVBQUU7VUFDL0U7VUFDQTtRQUNEO1FBQ0FJLHVCQUF1QixDQUFDK0IsSUFBSSxDQUFDTSxpQ0FBaUMsQ0FBQ2dCLFlBQVksRUFBRTFELGVBQWUsRUFBRUMsb0JBQW9CLENBQUMsQ0FBQztNQUNySCxDQUFDLENBQUM7TUFDRixJQUFJSSx1QkFBdUIsRUFBRXNDLE1BQU0sRUFBRTtRQUNwQ2MsNkJBQTZCLENBQUNyQixJQUFJLENBQUMsR0FBRy9CLHVCQUF1QixDQUFDO01BQy9EO0lBQ0Q7SUFDQSxPQUFPb0QsNkJBQTZCO0VBQ3JDO0VBQUMsT0FBQW5DLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|