@sapui5/sap.fe.core 1.97.0 → 1.98.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 +4 -4
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +1 -1
- package/src/sap/fe/core/AppComponent.js +4 -2
- package/src/sap/fe/core/AppStateHandler.js +2 -2
- package/src/sap/fe/core/BaseController.js +1 -1
- package/src/sap/fe/core/BusyLocker.js +1 -1
- package/src/sap/fe/core/CommonUtils.js +36 -16
- package/src/sap/fe/core/ExtensionAPI.js +14 -6
- package/src/sap/fe/core/PageController.js +9 -3
- package/src/sap/fe/core/RouterProxy.js +27 -11
- package/src/sap/fe/core/Synchronization.js +1 -1
- package/src/sap/fe/core/TemplateComponent.js +14 -5
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/TransactionHelper.js +125 -40
- package/src/sap/fe/core/actions/draft.js +50 -23
- package/src/sap/fe/core/actions/messageHandling.js +12 -9
- package/src/sap/fe/core/actions/nonDraft.js +1 -1
- package/src/sap/fe/core/actions/operations.js +13 -9
- package/src/sap/fe/core/actions/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +197 -71
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +10 -3
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +20 -18
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +40 -9
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +114 -25
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +112 -24
- package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +6 -2
- package/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
- package/src/sap/fe/core/controllerextensions/Paginator.js +35 -8
- package/src/sap/fe/core/controllerextensions/Placeholder.js +6 -3
- package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +20 -7
- package/src/sap/fe/core/controllerextensions/SideEffects.js +7 -7
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +6 -5
- package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +1 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
- package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
- package/src/sap/fe/core/controls/FilterBar.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
- package/src/sap/fe/core/converters/ConverterContext.js +13 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +3 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
- package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
- package/src/sap/fe/core/converters/MetaModelConverter.js +62 -4
- package/src/sap/fe/core/converters/MetaModelConverter.ts +60 -4
- package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
- package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +18 -10
- package/src/sap/fe/core/converters/controls/Common/Action.js +10 -1
- package/src/sap/fe/core/converters/controls/Common/Action.ts +6 -0
- package/src/sap/fe/core/converters/controls/Common/Form.js +17 -9
- package/src/sap/fe/core/converters/controls/Common/Form.ts +9 -3
- package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
- package/src/sap/fe/core/converters/controls/Common/Table.js +172 -284
- package/src/sap/fe/core/converters/controls/Common/Table.ts +228 -348
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +14 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +26 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
- 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/designtime/AppComponent.designtime.js +9 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
- package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
- package/src/sap/fe/core/fpm/Component.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
- package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
- package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -1
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +2 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/library.js +28 -2
- package/src/sap/fe/core/library.support.js +10 -4
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
- package/src/sap/fe/core/messagebundle.properties +40 -5
- package/src/sap/fe/core/messagebundle_ar.properties +24 -2
- package/src/sap/fe/core/messagebundle_bg.properties +24 -2
- package/src/sap/fe/core/messagebundle_ca.properties +24 -2
- package/src/sap/fe/core/messagebundle_cs.properties +25 -3
- package/src/sap/fe/core/messagebundle_cy.properties +24 -2
- package/src/sap/fe/core/messagebundle_da.properties +24 -2
- package/src/sap/fe/core/messagebundle_de.properties +24 -2
- package/src/sap/fe/core/messagebundle_el.properties +24 -2
- package/src/sap/fe/core/messagebundle_en.properties +23 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +23 -1
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -1
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +24 -2
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +24 -2
- package/src/sap/fe/core/messagebundle_es.properties +24 -2
- package/src/sap/fe/core/messagebundle_es_MX.properties +24 -2
- package/src/sap/fe/core/messagebundle_et.properties +24 -2
- package/src/sap/fe/core/messagebundle_fi.properties +25 -3
- package/src/sap/fe/core/messagebundle_fr.properties +25 -3
- package/src/sap/fe/core/messagebundle_fr_CA.properties +24 -2
- package/src/sap/fe/core/messagebundle_hi.properties +24 -2
- package/src/sap/fe/core/messagebundle_hr.properties +24 -2
- package/src/sap/fe/core/messagebundle_hu.properties +25 -3
- package/src/sap/fe/core/messagebundle_id.properties +26 -4
- package/src/sap/fe/core/messagebundle_it.properties +24 -2
- package/src/sap/fe/core/messagebundle_iw.properties +24 -2
- package/src/sap/fe/core/messagebundle_ja.properties +24 -2
- package/src/sap/fe/core/messagebundle_kk.properties +24 -2
- package/src/sap/fe/core/messagebundle_ko.properties +24 -2
- package/src/sap/fe/core/messagebundle_lt.properties +24 -2
- package/src/sap/fe/core/messagebundle_lv.properties +24 -2
- package/src/sap/fe/core/messagebundle_ms.properties +24 -2
- package/src/sap/fe/core/messagebundle_nl.properties +24 -2
- package/src/sap/fe/core/messagebundle_no.properties +24 -2
- package/src/sap/fe/core/messagebundle_pl.properties +24 -2
- package/src/sap/fe/core/messagebundle_pt.properties +25 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +24 -2
- package/src/sap/fe/core/messagebundle_ro.properties +24 -2
- package/src/sap/fe/core/messagebundle_ru.properties +24 -2
- package/src/sap/fe/core/messagebundle_sh.properties +24 -2
- package/src/sap/fe/core/messagebundle_sk.properties +24 -2
- package/src/sap/fe/core/messagebundle_sl.properties +24 -2
- package/src/sap/fe/core/messagebundle_sv.properties +25 -3
- package/src/sap/fe/core/messagebundle_th.properties +24 -2
- package/src/sap/fe/core/messagebundle_tr.properties +24 -2
- package/src/sap/fe/core/messagebundle_uk.properties +24 -2
- package/src/sap/fe/core/messagebundle_vi.properties +24 -2
- package/src/sap/fe/core/messagebundle_zh_CN.properties +24 -2
- package/src/sap/fe/core/messagebundle_zh_TW.properties +24 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
- package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +94 -347
- package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
- package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +13 -4
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +10 -48
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +14 -46
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
- package/src/sap/fe/core/templating/FilterHelper.js +10 -7
- package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
- package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
- package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
- package/src/sap/fe/core/templating/UIFormatters.js +15 -110
- package/src/sap/fe/core/templating/UIFormatters.ts +6 -73
- package/src/sap/fe/core/controls/filterbar.d.js +0 -8
- package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
|
@@ -25,7 +25,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
25
25
|
|
|
26
26
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
27
27
|
|
|
28
|
-
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
|
|
28
|
+
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
|
|
29
29
|
|
|
30
30
|
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
31
31
|
|
|
@@ -265,13 +265,15 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
265
265
|
var sBaseEntityType = this.getEntityTypeFromContext(oContext);
|
|
266
266
|
|
|
267
267
|
if (sBaseEntityType) {
|
|
268
|
+
var sNavigationPath = sNavigationProperty + "/";
|
|
268
269
|
var aSideEffects = this.getODataEntitySideEffects(sBaseEntityType);
|
|
269
270
|
var aTargets = [];
|
|
270
271
|
Object.keys(aSideEffects).filter( // Keep relevant SideEffects
|
|
271
272
|
function (sAnnotationName) {
|
|
272
273
|
var oSideEffects = aSideEffects[sAnnotationName];
|
|
273
274
|
return (oSideEffects.SourceProperties || []).some(function (oPropertyPath) {
|
|
274
|
-
|
|
275
|
+
var sPropertyPath = oPropertyPath.value;
|
|
276
|
+
return sPropertyPath.startsWith(sNavigationPath) && sPropertyPath.replace(sNavigationPath, "").indexOf("/") === -1;
|
|
275
277
|
}) || (oSideEffects.SourceEntities || []).some(function (oNavigationPropertyPath) {
|
|
276
278
|
return oNavigationPropertyPath.value === sNavigationProperty;
|
|
277
279
|
});
|
|
@@ -536,7 +538,7 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
536
538
|
mTarget = mTarget.map(function (mProperty) {
|
|
537
539
|
var bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
|
|
538
540
|
|
|
539
|
-
var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^" + sBindingParameterName + "
|
|
541
|
+
var sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(new RegExp("^" + sBindingParameterName + "/?"), "");
|
|
540
542
|
return bNavigationPropertyPath ? {
|
|
541
543
|
$NavigationPropertyPath: sValue
|
|
542
544
|
} : sValue;
|
|
@@ -563,7 +565,8 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
563
565
|
value: function _removeDuplicateTargets(aTargets) {
|
|
564
566
|
return aTargets.filter(function (mTarget, iIndex, aTargets) {
|
|
565
567
|
return aTargets.findIndex(function (mSearchTarget) {
|
|
566
|
-
return mSearchTarget === mTarget ||
|
|
568
|
+
return mSearchTarget === mTarget || // PropertyPath
|
|
569
|
+
mTarget.$NavigationPropertyPath && mSearchTarget.$NavigationPropertyPath === mTarget.$NavigationPropertyPath // NavigationPropertyPath
|
|
567
570
|
;
|
|
568
571
|
}) === iIndex;
|
|
569
572
|
});
|
|
@@ -728,4 +731,4 @@ sap.ui.define(["sap/ui/core/service/ServiceFactory", "sap/ui/core/service/Servic
|
|
|
728
731
|
|
|
729
732
|
return SideEffectsServiceFactory;
|
|
730
733
|
}, false);
|
|
731
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiX29TaWRlRWZmZWN0c1R5cGUiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImNvbnRyb2wiLCJfYkluaXRpYWxpemVkIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNFbnRpdHlUeXBlIiwib1NpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJvQ29udHJvbFNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzIiwic1RyaWdnZXJBY3Rpb24iLCJvQ29udGV4dCIsInNHcm91cElkIiwib1RyaWdnZXJBY3Rpb24iLCJnZXRNb2RlbCIsImJpbmRDb250ZXh0IiwiZXhlY3V0ZSIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJfb0NhcGFiaWxpdGllcyIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsInNFbnRpdHlUeXBlTmFtZSIsInNBY3Rpb25OYW1lIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwidW5kZWZpbmVkIiwib0NhcGFiaWxpdGllcyIsIm9Db252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZvckVhY2giLCJlbnRpdHlUeXBlIiwiX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwic0NvbnRyb2xJZCIsIk9iamVjdCIsImtleXMiLCJhUGF0aEV4cHJlc3Npb25zIiwiX2xvZ1JlcXVlc3QiLCJvUHJvbWlzZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImUiLCJyZWplY3QiLCJzTmF2aWdhdGlvblByb3BlcnR5Iiwic0Jhc2VFbnRpdHlUeXBlIiwiYVNpZGVFZmZlY3RzIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImFUYXJnZXRzIiwiZmlsdGVyIiwic0Fubm90YXRpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwiU291cmNlUHJvcGVydGllcyIsInNvbWUiLCJvUHJvcGVydHlQYXRoIiwidmFsdWUiLCJpbmRleE9mIiwiU291cmNlRW50aXRpZXMiLCJvTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsInB1c2giLCJfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImxlbmd0aCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtRW50aXR5VHlwZSIsImFJbml0aWFsUHJvcGVydGllcyIsImFFbnRpdGllc1JlcXVlc3RlZCIsIm1hcCIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImFEZXJpdmVkUHJvcGVydGllcyIsInNQcm9wZXJ0eVBhdGgiLCJiSXNTdGFyUHJvcGVydHkiLCJlbmRzV2l0aCIsInNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJzUmVsYXRpdmVQYXRoIiwicmVzb2x2ZVBhdGgiLCJhVGFyZ2V0RW50aXR5UHJvcGVydGllcyIsImVudGl0eVByb3BlcnRpZXMiLCJ0YXJnZXRUeXBlIiwicHJvcGVydGllcyIsIm1Qcm9wZXJ0eSIsIm5hdmlnYXRpb25QYXRoIiwicHJvcGVydHkiLCJmaW5kIiwibmFtZSIsInNwbGl0IiwicG9wIiwiaW5mbyIsIm1Qcm9wZXJ0eUluZm8iLCJzVGFyZ2V0VGV4dFBhdGgiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIlRleHQiLCJwYXRoIiwic1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkiLCJzQmluZGluZ1BhcmFtZXRlciIsIm9FbnRpdHlUeXBlIiwib1RlbXBTaWRlRWZmZWN0cyIsIl9yZW1vdmVCaW5kaW5nUGFyYW1ldGVyIiwiX2NvbnZlcnRUYXJnZXRzRm9ybWF0IiwiX3JlcGxhY2VSZWZlcmVuY2VkUHJvcGVydGllcyIsIl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzIiwicmVkdWNlIiwiYVRhcmdldFByb3BlcnRpZXMiLCJ2VGFyZ2V0Iiwic1RhcmdldCIsInR5cGUiLCJtVGFyZ2V0RW50aXR5Iiwib1NvdXJjZSIsImF1dGhvcml6ZWRUeXBlcyIsIl90eXBlIiwic291cmNlRW50aXR5VHlwZSIsIm1Db21tb25Bbm5vdGF0aW9uIiwibUJpbmRpbmdQYXJhbWV0ZXIiLCJwYXJhbWV0ZXJzIiwibVBhcmFtZXRlciIsIiRUeXBlIiwiX2NvbnZlcnRTaWRlRWZmZWN0cyIsInNUYXJnZXRQYXRocyIsInNQYXRocyIsImRlYnVnIiwic0JpbmRpbmdQYXJhbWV0ZXJOYW1lIiwiYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJzVmFsdWUiLCJyZXBsYWNlIiwiUmVnRXhwIiwiaUluZGV4IiwiZmluZEluZGV4IiwibVNlYXJjaFRhcmdldCIsImJTaWRlRWZmZWN0c0NoYW5nZWQiLCJhRW50aXRpZXMiLCJtTmF2aWdhdGlvbiIsImFQcm9wZXJ0aWVzIiwiYlRhcmdldENoYW5nZWQiLCJpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCIsInNOYXZpZ2F0aW9uUGF0aCIsIm9UYXJnZXQiLCJpbmNsdWRlcyIsImFBY3Rpb25zIiwib0FjdGlvbiIsInRyaWdnZXJBY3Rpb25zIiwicGF0aEV4cHJlc3Npb25zIiwiX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZSIsIm9FbnRpdHlTaWRlRWZmZWN0cyIsIlNlcnZpY2UiLCJTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5Iiwib1NlcnZpY2VDb250ZXh0IiwiU2lkZUVmZmVjdHNTZXJ2aWNlU2VydmljZSIsIlNlcnZpY2VGYWN0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QUdBLGVBQU91RyxrQkFBUDtBQUNBOzs7YUFFRCx3QkFBb0I7QUFDbkIsZUFBTyxJQUFQO0FBQ0E7Ozs7SUF6a0IrQkMsTzs7TUE0a0IzQkMseUI7Ozs7Ozs7Ozs7Ozs7YUFDTCx3QkFBZUMsZUFBZixFQUFxRTtBQUNwRSxZQUFNQyx5QkFBeUIsR0FBRyxJQUFJM0ssa0JBQUosQ0FBdUIwSyxlQUF2QixDQUFsQztBQUNBLGVBQU9DLHlCQUF5QixDQUFDcEssV0FBakM7QUFDQTs7OztJQUpzQ3FLLGM7O1NBT3pCSCx5QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VydmljZUZhY3RvcnksIFNlcnZpY2UsIFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2VcIjtcbmltcG9ydCB7IENvbnZlcnRlck91dHB1dCwgRW50aXR5VHlwZSwgTmF2aWdhdGlvblByb3BlcnR5LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBPRGF0YU1ldGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcywgUXVhbGlmaWVkTmFtZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9Db21tb25cIjtcbmltcG9ydCB7IEFjdGlvbiwgTmF2aWdhdGlvblByb3BlcnR5UGF0aCwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwic2FwL2Jhc2VcIjtcblxudHlwZSBTaWRlRWZmZWN0c1NldHRpbmdzID0ge307XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlID0ge1xuXHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogc3RyaW5nO1xufTtcbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXQgPSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgfCBzdHJpbmc7XG5cbnR5cGUgU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdO1xufTtcblxudHlwZSBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0VGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdFRhcmdldEVudGl0aWVzOiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW107XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufTtcblxudHlwZSBCYXNlU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbn0gJiBTaWRlRWZmZWN0c1RhcmdldFR5cGU7XG5cbnR5cGUgQWN0aW9uU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W107XG5cdHRyaWdnZXJBY3Rpb25zPzogUXVhbGlmaWVkTmFtZVtdO1xufTtcblxuZXhwb3J0IHR5cGUgQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IFBhcnRpYWw8QmFzZVNpZGVFZmZlY3RzVHlwZT4gJiB7XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xuXHRTb3VyY2VQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0c291cmNlQ29udHJvbElkOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IEJhc2VTaWRlRWZmZWN0c1R5cGUgJiB7XG5cdFNvdXJjZVByb3BlcnRpZXM/OiBQcm9wZXJ0eVBhdGhbXTtcblx0U291cmNlRW50aXRpZXM/OiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW107XG5cdFRyaWdnZXJBY3Rpb24/OiBRdWFsaWZpZWROYW1lO1xufTtcblxuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUeXBlID0gQ29udHJvbFNpZGVFZmZlY3RzVHlwZSB8IE9EYXRhU2lkZUVmZmVjdHNUeXBlO1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPjtcbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNBY3Rpb25EaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPjtcblxudHlwZSBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5ID0ge1xuXHRvRGF0YToge1xuXHRcdGVudGl0aWVzOiB7XG5cdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0XHRhY3Rpb25zOiB7XG5cdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuXHRcdH07XG5cdH07XG5cdGNvbnRyb2w6IHtcblx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPjtcblx0fTtcbn07XG5cbnR5cGUgRXh0cmFjdG9yUHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0eTogUHJvcGVydHk7XG5cdG5hdmlnYXRpb25QYXRoPzogc3RyaW5nO1xufTtcblxuY2xhc3MgU2lkZUVmZmVjdHNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGluaXRQcm9taXNlITogUHJvbWlzZTxhbnk+O1xuXHRfb1NpZGVFZmZlY3RzVHlwZSE6IFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnk7XG5cdF9vQ2FwYWJpbGl0aWVzITogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQ7XG5cdF9iSW5pdGlhbGl6ZWQhOiBCb29sZWFuO1xuXHQvLyAhOiBtZWFucyB0aGF0IHdlIGtub3cgaXQgd2lsbCBiZSBhc3NpZ25lZCBiZWZvcmUgdXNhZ2Vcblx0aW5pdCgpIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRcdFx0b0RhdGE6IHtcblx0XHRcdFx0ZW50aXRpZXM6IHt9LFxuXHRcdFx0XHRhY3Rpb25zOiB7fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2w6IHt9XG5cdFx0fTtcblx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmluaXRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sXG5cdCAqIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gaXMgYWRkZWQgYnkgYSBjb250cm9sIHRvIGtlZXAgZGF0YSB1cCB0byBkYXRlXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGdldCBsaW1pdGVkIHNjb3BlIGNvbXBhcmVkIHdpdGggU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgc2VydmljZTpcblx0ICogLSBPbmx5IG9uZSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgY29tYmluYXRpb24gZW50aXR5IHR5cGUgLSBjb250cm9sIElkXG5cdCAqIC0gT25seSBTaWRlRWZmZWN0cyBzb3VyY2UgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgdXNlZCB0byB0cmlnZ2VyIFNpZGVFZmZlY3RzXG5cdCAqXG5cdCAqIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3Q6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHRpZiAob1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbFNpZGVFZmZlY3Q6IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRcdC4uLm9TaWRlRWZmZWN0LFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IHNFbnRpdHlUeXBlICsgXCIvU2lkZUVmZmVjdHNGb3JDb250cm9sL1wiICsgb1NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgbUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyA9IHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV0gfHwge307XG5cdFx0XHRtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzW29Db250cm9sU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRdID0gb0NvbnRyb2xTaWRlRWZmZWN0O1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXSA9IG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIFNpZGVFZmZlY3RzIGFjdGlvbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzVHJpZ2dlckFjdGlvbiBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNHcm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIGV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb246IFN0cmluZywgb0NvbnRleHQ6IENvbnRleHQsIHNHcm91cElkPzogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1RyaWdnZXJBY3Rpb246IGFueSA9IG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoc1RyaWdnZXJBY3Rpb24gKyBcIiguLi4pXCIsIG9Db250ZXh0KTtcblx0XHRvVHJpZ2dlckFjdGlvbi5leGVjdXRlKHNHcm91cElkIHx8IChvQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IENvbnZlcnRlZCBPRGF0YSBtZXRhTW9kZWxcblx0ICovXG5cdHB1YmxpYyBnZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTogQ29udmVydGVyT3V0cHV0IHtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG9Db21wb25lbnQgPSBvQ29udGV4dC5zY29wZU9iamVjdCBhcyBhbnk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyhvTWV0YU1vZGVsLCB0aGlzLl9vQ2FwYWJpbGl0aWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBlbnRpdHkgdHlwZSBvZiBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZCB9IEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0OiBDb250ZXh0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IChvTWV0YU1vZGVsIGFzIGFueSkuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdHNFbnRpdHlUeXBlID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc01ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBzRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzRW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuZW50aXRpZXNbc0VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZTogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQpOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQge1xuXHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRpZiAoc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuYWN0aW9uc1tzRW50aXR5VHlwZV0/LltzQWN0aW9uTmFtZV07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0gb0NhcGFiaWxpdGllcyBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXNcblx0ICovXG5cdHB1YmxpYyBpbml0aWFsaXplU2lkZUVmZmVjdHMob0NhcGFiaWxpdGllcz86IEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKTogdm9pZCB7XG5cdFx0dGhpcy5fb0NhcGFiaWxpdGllcyA9IG9DYXBhYmlsaXRpZXM7XG5cdFx0aWYgKCF0aGlzLl9iSW5pdGlhbGl6ZWQpIHtcblx0XHRcdGNvbnN0IG9Db252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0b0NvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKGVudGl0eVR5cGUgPT4ge1xuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMuX3JldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7IC8vIG9ubHkgYm91bmQgYWN0aW9ucyBhcmUgYW5hbHl6ZWQgc2luY2UgdW5ib3VuZCBvbmVzIGRvbid0IGdldCBTaWRlRWZmZWN0c1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLl9iSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sKS5mb3JFYWNoKHNFbnRpdHlUeXBlID0+IHtcblx0XHRcdGlmICh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdW3NDb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFQYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzR3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXHRcdHRoaXMuX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9ucywgb0NvbnRleHQpO1xuXHRcdGxldCBvUHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRcdC8qKlxuXHRcdCAqIENvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzIGVpdGhlciByZXR1cm5zIGEgcHJvbWlzZSBvciB0aHJvd3MgYSBuZXcgZXJyb3IuIFRoaXMgcmV0dXJuIGlzIGNhdWdodCBpZiBhbiBlcnJvciBpcyB0aHJvd25cblx0XHQgKiB0byBhdm9pZCBicmVha2luZyB0aGUgcHJvbWlzZSBjaGFpbi5cblx0XHQgKi9cblx0XHR0cnkge1xuXHRcdFx0b1Byb21pc2UgPSAob0NvbnRleHQgYXMgYW55KS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVBhdGhFeHByZXNzaW9ucywgc0dyb3VwSWQpIGFzIFByb21pc2U8YW55Pjtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVqZWN0KGUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eVxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc05hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShzTmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0aWYgKHNCYXNlRW50aXR5VHlwZSkge1xuXHRcdFx0Y29uc3QgYVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNCYXNlRW50aXR5VHlwZSk7XG5cdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblx0XHRcdE9iamVjdC5rZXlzKGFTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0c0Fubm90YXRpb25OYW1lID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlQYXRoID0+IG9Qcm9wZXJ0eVBhdGgudmFsdWUuaW5kZXhPZihzTmF2aWdhdGlvblByb3BlcnR5KSA+IC0xXG5cdFx0XHRcdFx0XHRcdCkgfHxcblx0XHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0cy5Tb3VyY2VFbnRpdGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PiBvTmF2aWdhdGlvblByb3BlcnR5UGF0aC52YWx1ZSA9PT0gc05hdmlnYXRpb25Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuZm9yRWFjaChzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24pIHtcblx0XHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUFjdGlvbihvU2lkZUVmZmVjdHMuVHJpZ2dlckFjdGlvbiwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQoKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcyBhcyBhbnlbXSkgfHwgW10pXG5cdFx0XHRcdFx0XHQuY29uY2F0KChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pXG5cdFx0XHRcdFx0XHQuZm9yRWFjaChtVGFyZ2V0ID0+IGFUYXJnZXRzLnB1c2gobVRhcmdldCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGUgcHJvcGVydGllc1xuXHRcdFx0YVRhcmdldHMgPSB0aGlzLl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzKTtcblx0XHRcdGlmIChhVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQpLmNhdGNoKG9FcnJvciA9PlxuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBTaWRlRWZmZWN0cyBmb3IgTmF2aWdhdGlvbiBQcm9wZXJ0eSBcIiArIHNOYXZpZ2F0aW9uUHJvcGVydHksIG9FcnJvcilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGNvbnRyb2xzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBOYW1lXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHB1YmxpYyBnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoc0VudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZU5hbWVdIHx8IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgdGhlIHRleHQgcHJvcGVydGllcyByZXF1aXJlZCBmb3IgU2lkZUVmZmVjdHNcblx0ICogSWYgYSBwcm9wZXJ0eSBoYXMgYW4gYXNzb2NpYXRlZCB0ZXh0IHRoZW4gdGhpcyB0ZXh0IG5lZWRzIHRvIGJlIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiB3aXRoIGFkZGVkIHRleHQgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBfYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvU2lkZUVmZmVjdDogQmFzZVNpZGVFZmZlY3RzVHlwZSwgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBhSW5pdGlhbFByb3BlcnRpZXM6IHN0cmluZ1tdID0gKG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgfHwgW10pIGFzIHN0cmluZ1tdLFxuXHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0bGV0IGFEZXJpdmVkUHJvcGVydGllczogRXh0cmFjdG9yUHJvcGVydHlJbmZvW10gPSBbXTtcblxuXHRcdGFJbml0aWFsUHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoICsgXCIvXCIgOiBcIlwiLFxuXHRcdFx0XHRtVGFyZ2V0OiBhbnkgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgbUVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdC8vIG1UYXJnZXQgY2FuIGJlIGFuIGVudGl0eSB0eXBlLCBuYXZpZ2F0aW9uUHJvcGVydHkgb3Igb3IgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRjb25zdCBhVGFyZ2V0RW50aXR5UHJvcGVydGllczogUHJvcGVydHlbXSA9XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgRW50aXR5VHlwZSkuZW50aXR5UHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdChtVGFyZ2V0IGFzIFByb3BlcnR5KS50YXJnZXRUeXBlPy5wcm9wZXJ0aWVzIHx8XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgTmF2aWdhdGlvblByb3BlcnR5KS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXM7XG5cdFx0XHRcdGlmIChhVGFyZ2V0RW50aXR5UHJvcGVydGllcykge1xuXHRcdFx0XHRcdGlmIChiSXNTdGFyUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGlmIChhVGFyZ2V0RW50aXR5UHJvcGVydGllcykge1xuXHRcdFx0XHRcdFx0XHQvLyBBZGQgYWxsIHJlcXVpcmVkIHByb3BlcnRpZXMgYmVoaW5kIHRoZSAqXG5cdFx0XHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5wdXNoKHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0XHRcdFx0YURlcml2ZWRQcm9wZXJ0aWVzID0gYURlcml2ZWRQcm9wZXJ0aWVzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0XHRhVGFyZ2V0RW50aXR5UHJvcGVydGllcy5tYXAobVByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eTogbVByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGFEZXJpdmVkUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0cHJvcGVydHk6IGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzLmZpbmQoXG5cdFx0XHRcdFx0XHRcdFx0bVByb3BlcnR5ID0+IG1Qcm9wZXJ0eS5uYW1lID09PSBzUHJvcGVydHlQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKVxuXHRcdFx0XHRcdFx0XHQpIGFzIFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aDogc1JlbGF0aXZlUGF0aFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5pbmZvKFwiU2lkZUVmZmVjdHMgLSBUaGUgZW50aXR5IHR5cGUgYXNzb2NpYXRlZCB0byBwcm9wZXJ0eSBwYXRoIFwiICsgc1Byb3BlcnR5UGF0aCArIFwiIGNhbm5vdCBiZSByZXNvbHZlZFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0TG9nLmluZm8oXCJTaWRlRWZmZWN0cyAtIFRoZSBwcm9wZXJ0eSBwYXRoIFwiICsgc1Byb3BlcnR5UGF0aCArIFwiIGNhbm5vdCBiZSByZXNvbHZlZFwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFEZXJpdmVkUHJvcGVydGllcy5mb3JFYWNoKG1Qcm9wZXJ0eUluZm8gPT4ge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eUluZm8ucHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3Qgc1RhcmdldFRleHRQYXRoID0gKG1Qcm9wZXJ0eUluZm8ucHJvcGVydHkuYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dCBhcyBhbnkpPy5wYXRoLFxuXHRcdFx0XHRcdHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5ID0gbVByb3BlcnR5SW5mby5uYXZpZ2F0aW9uUGF0aCArIHNUYXJnZXRUZXh0UGF0aDtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIFRoZSBwcm9wZXJ0eSBUZXh0IG11c3QgYmUgYWRkZWQgb25seSBpZiB0aGUgcHJvcGVydHkgaXNcblx0XHRcdFx0ICogLSBub3QgcGFydCBvZiBhIHN0YXIgcHJvcGVydHkgKC5pLmUgJyonIG9yICduYXZpZ2F0aW9uLyonKSBvciBhIHRhcmdldGVkIEVudGl0eVxuXHRcdFx0XHQgKiAtIG5vdCBpbmNsdWRlIGludG8gdGhlIGluaXRpYWwgdGFyZ2V0ZWQgcHJvcGVydGllcyBvZiBTaWRlRWZmZWN0c1xuXHRcdFx0XHQgKiAgSW5kZWVkIGluIHRoZSB0d28gbGlzdGVkIGNhc2VzLCB0aGUgcHJvcGVydHkgY29udGFpbmluZyB0ZXh0IHdpbGwgYmUvaXMgcmVxdWVzdGVkIGJ5IGluaXRpYWwgU2lkZUVmZmVjdHMgY29uZmlndXJhdGlvbi5cblx0XHRcdFx0ICovXG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHNUYXJnZXRUZXh0UGF0aCAmJlxuXHRcdFx0XHRcdGFFbnRpdGllc1JlcXVlc3RlZC5pbmRleE9mKHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5LnN1YnN0cmluZygwLCBzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eS5sYXN0SW5kZXhPZihcIi9cIikpKSA9PT1cblx0XHRcdFx0XHRcdC0xICYmXG5cdFx0XHRcdFx0YUluaXRpYWxQcm9wZXJ0aWVzLmluZGV4T2Yoc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkpID09PSAtMVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzLnB1c2goc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb1NpZGVFZmZlY3Q7XG5cdH1cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQmluZGluZ1BhcmFtZXRlciBOYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0U2lkZUVmZmVjdHMoXG5cdFx0b1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHwgQmFzZUFubm90YXRpb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0c0VudGl0eVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHRzQmluZGluZ1BhcmFtZXRlcj86IHN0cmluZ1xuXHQpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgbUVudGl0eVR5cGUgPSAodGhpcy5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVR5cGVzLmZpbmQob0VudGl0eVR5cGUgPT4ge1xuXHRcdFx0cmV0dXJuIG9FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gc0VudGl0eVR5cGU7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb1RlbXBTaWRlRWZmZWN0cyA9IHRoaXMuX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIodGhpcy5fY29udmVydFRhcmdldHNGb3JtYXQob1NpZGVFZmZlY3RzKSwgc0JpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdHJldHVybiBtRW50aXR5VHlwZVxuXHRcdFx0PyB0aGlzLl9yZXBsYWNlUmVmZXJlbmNlZFByb3BlcnRpZXModGhpcy5fYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvVGVtcFNpZGVFZmZlY3RzLCBtRW50aXR5VHlwZSksIG1FbnRpdHlUeXBlKVxuXHRcdFx0OiBvVGVtcFNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRhcmdldHMgKFRhcmdldEVudGl0aWVzIGFuZCBUYXJnZXRQcm9wZXJ0aWVzKSB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogIC0gVGFyZ2V0UHJvcGVydGllcyBhcyBhcnJheSBvZiBzdHJpbmdcblx0ICogIC0gVGFyZ2V0RW50aXRpZXMgYXMgYXJyYXkgb2Ygb2JqZWN0IHdpdGggcHJvcGVydHkgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHJldHVybnMge29iamVjdH0gQ29udmVydGVkIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9jb252ZXJ0VGFyZ2V0c0Zvcm1hdChvU2lkZUVmZmVjdHM6IEJhc2VTaWRlRWZmZWN0c1R5cGUgfCBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGNvbnN0IFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pLnJlZHVjZShmdW5jdGlvbihhVGFyZ2V0UHJvcGVydGllcywgdlRhcmdldCkge1xuXHRcdFx0XHRjb25zdCBzVGFyZ2V0ID0gKHR5cGVvZiB2VGFyZ2V0ID09PSBcInN0cmluZ1wiICYmIHZUYXJnZXQpIHx8ICh2VGFyZ2V0LnR5cGUgPT09IFwiUHJvcGVydHlQYXRoXCIgJiYgdlRhcmdldC52YWx1ZSk7XG5cdFx0XHRcdGlmIChzVGFyZ2V0KSB7XG5cdFx0XHRcdFx0YVRhcmdldFByb3BlcnRpZXMucHVzaChzVGFyZ2V0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgVGFyZ2V0UHJvcGVydGllcyBmb3IgU2lkZUVmZmVjdHNcIiArIG9TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBhVGFyZ2V0UHJvcGVydGllcztcblx0XHRcdH0sIFtdKSxcblx0XHRcdFRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGVbXSA9ICgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSkubWFwKG1UYXJnZXRFbnRpdHkgPT4ge1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogIFNpZGVFZmZlY3RzIHRoYXQgY29tZXMgZnJvbSBTQVAgRkUgZ2V0IFRhcmdldEVudGl0aWVzIHdpdGggJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggd2hlcmVhc1xuXHRcdFx0XHQgKiAgb25lcyBjb21pbmcgZnJvbSB0aGUgY29udmVydGVkIE9EYXRhIG1vZGVsIGdldHMgYSBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGZvcm1hdFxuXHRcdFx0XHQgKlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0cmV0dXJuIHsgXCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aFwiOiBtVGFyZ2V0RW50aXR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIHx8IG1UYXJnZXRFbnRpdHkudmFsdWUgfHwgXCJcIiB9O1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIHsgLi4ub1NpZGVFZmZlY3RzLCAuLi57IFRhcmdldFByb3BlcnRpZXMsIFRhcmdldEVudGl0aWVzIH0gfTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYW4gZW50aXR5IHR5cGUgb3IgYWN0aW9uIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU291cmNlIEVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBBcnJheSBvZiBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKG9Tb3VyY2U6IGFueSk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10ge1xuXHRcdGNvbnN0IGFTaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSA9IFtdO1xuXHRcdGNvbnN0IGF1dGhvcml6ZWRUeXBlcyA9IFtcIkVudGl0eVR5cGVcIiwgXCJBY3Rpb25cIl07XG5cdFx0aWYgKG9Tb3VyY2UuX3R5cGUgJiYgYXV0aG9yaXplZFR5cGVzLmluZGV4T2Yob1NvdXJjZS5fdHlwZSkgPiAtMSkge1xuXHRcdFx0Y29uc3QgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQgPSBvU291cmNlLl90eXBlID09PSBcIkVudGl0eVR5cGVcIiA/IG9Tb3VyY2UgOiBvU291cmNlLnNvdXJjZUVudGl0eVR5cGU7XG5cdFx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3QgbUNvbW1vbkFubm90YXRpb246IGFueSA9IG9Tb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbiB8fCB7fTtcblx0XHRcdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXIgPSAoKG9Tb3VyY2UgYXMgQWN0aW9uKS5wYXJhbWV0ZXJzIHx8IFtdKS5maW5kKFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXIgPT4gbVBhcmFtZXRlci50eXBlID09PSAobUVudGl0eVR5cGUgfHwgb1NvdXJjZSkuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGFyYW1ldGVyID0gbUJpbmRpbmdQYXJhbWV0ZXIgPyBtQmluZGluZ1BhcmFtZXRlci5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCIvXCIpWzFdIDogXCJcIjtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbW1vbkFubm90YXRpb24pXG5cdFx0XHRcdFx0LmZpbHRlcihzQW5ub3RhdGlvbk5hbWUgPT4gbUNvbW1vbkFubm90YXRpb25bc0Fubm90YXRpb25OYW1lXS4kVHlwZSA9PT0gQ29tbW9uQW5ub3RhdGlvblR5cGVzLlNpZGVFZmZlY3RzVHlwZSlcblx0XHRcdFx0XHQuZm9yRWFjaChzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0YVNpZGVFZmZlY3RzLnB1c2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2NvbnZlcnRTaWRlRWZmZWN0cyhtQ29tbW9uQW5ub3RhdGlvbltzQW5ub3RhdGlvbk5hbWVdLCBtRW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIHNCaW5kaW5nUGFyYW1ldGVyKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGFTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIFNpZGVFZmZlY3RzIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhUGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgX2xvZ1JlcXVlc3QoYVBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgb0NvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBzVGFyZ2V0UGF0aHMgPSBhUGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbihzUGF0aHMsIG1UYXJnZXQpIHtcblx0XHRcdHJldHVybiBzUGF0aHMgKyBcIlxcblxcdFxcdFwiICsgKChtVGFyZ2V0IGFzIFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldCB8fCBcIlwiKTtcblx0XHR9LCBcIlwiKTtcblx0XHRMb2cuZGVidWcoXCJTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkgKyBcIlxcblxcdFByb3BlcnR5IHBhdGhzIDpcIiArIHNUYXJnZXRQYXRocyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBuYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyIG9uIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIob1NpZGVFZmZlY3RzOiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBzQmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRpZiAoc0JpbmRpbmdQYXJhbWV0ZXJOYW1lKSB7XG5cdFx0XHRjb25zdCBhVGFyZ2V0cyA9IFtcIlRhcmdldFByb3BlcnRpZXNcIiwgXCJUYXJnZXRFbnRpdGllc1wiXTtcblx0XHRcdGFUYXJnZXRzLmZvckVhY2goc1RhcmdldCA9PiB7XG5cdFx0XHRcdGxldCBtVGFyZ2V0ID0gKG9TaWRlRWZmZWN0cyBhcyBhbnkpW3NUYXJnZXRdO1xuXHRcdFx0XHRpZiAobVRhcmdldCkge1xuXHRcdFx0XHRcdG1UYXJnZXQgPSBtVGFyZ2V0Lm1hcCgobVByb3BlcnR5OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID0gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoICE9PSB1bmRlZmluZWQ7IC8vIE5lZWQgdG8gdGVzdCB3aXRoIHVuZGVmaW5lZCBzaW5jZSAgbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIGNvdWxkIGJlIFwiXCIgKGVtcHR5IHN0cmluZylcblx0XHRcdFx0XHRcdGNvbnN0IHNWYWx1ZSA9IChiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IG1Qcm9wZXJ0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA6IG1Qcm9wZXJ0eSkucmVwbGFjZShcblx0XHRcdFx0XHRcdFx0bmV3IFJlZ0V4cChcIl5cIiArIHNCaW5kaW5nUGFyYW1ldGVyTmFtZSArIFwiPy5cIiksXG5cdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPyB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzVmFsdWUgfSA6IHNWYWx1ZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHQob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF0gPSBtVGFyZ2V0O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUYXJnZXRzIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHJldHVybnMge0FycmF5fSBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSk6IFNpZGVFZmZlY3RzVGFyZ2V0W10ge1xuXHRcdHJldHVybiBhVGFyZ2V0cy5maWx0ZXIoXG5cdFx0XHQobVRhcmdldDogYW55LCBpSW5kZXgsIGFUYXJnZXRzKSA9PlxuXHRcdFx0XHRhVGFyZ2V0cy5maW5kSW5kZXgoKG1TZWFyY2hUYXJnZXQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRtU2VhcmNoVGFyZ2V0ID09PSBtVGFyZ2V0IHx8IC8vIFByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdFx0KG1UYXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggJiYgbVNlYXJjaFRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgLy8gTmF2aWdhdGlvblByb3BlcnR5UGF0aFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pID09PSBpSW5kZXhcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIFRhcmdldFByb3BlcnRpZXMgaGF2aW5nIHJlZmVyZW5jZSB0byBTb3VyY2UgUHJvcGVydGllcyBmb3IgYSBTaWRlRWZmZWN0c1xuXHQgKiBJZiBhIFNpZGVFZmZlY3RzIFNvdXJjZSBQcm9wZXJ0eSBpcyBhbiBuYXZpZ2F0aW9uIGVudGl0eSByZWZlcmVuY2UsIHRoZSBTaWRlRWZmZWN0cyBUYXJnZXQgUHJvcGVydGllcyBjYW5ub3QgYmUgYSBwcm9wZXJ0eSBvZiB0aGlzIG5hdmlnYXRpb24gZW50aXR5LlxuXHQgKiBJbmRlZWQgdGhpcyBjb25maWd1cmF0aW9uIGxlYWRzIHRvIGVycm9yIGludG8gdGhlIE9EYXRhIFY0IE1vZGVsIHNpbmNlIHJlc3BvbnNlIGNhbm5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSB0aGlzIHdvdWxkIG1lYW4gdGhhdCB3ZSBtZXJnZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcgdGFyZ2V0IGludG8gdGhlIG9sZCB0YXJnZXQgb2YgdGhlIG5hdmlnYXRpb24gcHJvcGVydHkuXG5cdCAqIEluIG9yZGVyIHRvIHJlcXVlc3QgbmV3IHZhbHVlIG9mIHRoZXNlIHRhcmdldCBwcm9wZXJ0aWVzIHRoZSBTaWRlRWZmZWN0cyB3aWxsIHJlcXVlc3QgZm9yIHRoZSBlbnRpcmUgRW50aXR5IGluc3RlYWQgb2YganVzdCBhIHNldCBvZiBwcm9wZXJ0aWVzLlxuXHQgKiBGb3IgdGhlIGZpcnN0IHZlcnNpb24sIHdlIHJlbW92ZSBhbGwgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFuZCByZXBsYWNlIHRoZW0gYnkgdGFyZ2V0RW50aXRpZXMuIFRoaXMgY2hhbmdlIGNvdWxkIGJlIGltcHJvdmVkIGluIG5leHQgdmVyc2lvbi5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdCBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSAgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiB3aXRob3V0IHJlZmVyZW5jZWQgdGFyZ2V0IHByb3BlcnRpZXNcblx0ICovXG5cdHByaXZhdGUgX3JlcGxhY2VSZWZlcmVuY2VkUHJvcGVydGllcyhvU2lkZUVmZmVjdDogQmFzZVNpZGVFZmZlY3RzVHlwZSwgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRsZXQgYlNpZGVFZmZlY3RzQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRcdGNvbnN0IGFFbnRpdGllczogc3RyaW5nW10gPVxuXHRcdFx0XHQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLm1hcChtTmF2aWdhdGlvbiA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG1OYXZpZ2F0aW9uLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoO1xuXHRcdFx0XHR9KSB8fCBbXSxcblx0XHRcdGFQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0b1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0bGV0IGJUYXJnZXRDaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRjb25zdCBpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCA9IHNQcm9wZXJ0eVBhdGgubGFzdEluZGV4T2YoXCIvXCIpO1xuXHRcdFx0aWYgKGlMYXN0UGF0aFNlcGFyYXRvckluZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBpTGFzdFBhdGhTZXBhcmF0b3JJbmRleCk7XG5cdFx0XHRcdGNvbnN0IG9UYXJnZXQgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblBhdGgpO1xuXHRcdFx0XHRpZiAob1RhcmdldCAmJiBvVGFyZ2V0Ll90eXBlID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdFx0Ly9UZXN0IGlmIGl0J3Mgbm90IGEgcHJvcGVydHkgYm91bmQgb24gY29tcGxleFR5cGUgKF9Db21wbGV4VHlwZS9NeVByb3BlcnR5KVxuXHRcdFx0XHRcdGJTaWRlRWZmZWN0c0NoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGJUYXJnZXRDaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRpZiAoIWFFbnRpdGllcy5pbmNsdWRlcyhzTmF2aWdhdGlvblBhdGgpKSB7XG5cdFx0XHRcdFx0XHRhRW50aXRpZXMucHVzaChzTmF2aWdhdGlvblBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFiVGFyZ2V0Q2hhbmdlZCkge1xuXHRcdFx0XHRhUHJvcGVydGllcy5wdXNoKHNQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKGJTaWRlRWZmZWN0c0NoYW5nZWQpIHtcblx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgPSBhUHJvcGVydGllcztcblx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzID0gYUVudGl0aWVzLm1hcChzTmF2aWdhdGlvblBhdGggPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzTmF2aWdhdGlvblBhdGhcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBvU2lkZUVmZmVjdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIGFjdGlvbiB0eXBlIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgb24gYWN0aW9uc1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSBfcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IG9TaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdGNvbnN0IGFBY3Rpb25zID0gbUVudGl0eVR5cGUuYWN0aW9ucztcblx0XHRpZiAoYUFjdGlvbnMpIHtcblx0XHRcdE9iamVjdC5rZXlzKGFBY3Rpb25zKS5mb3JFYWNoKHNBY3Rpb25OYW1lID0+IHtcblx0XHRcdFx0Y29uc3Qgb0FjdGlvbiA9IG1FbnRpdHlUeXBlLmFjdGlvbnNbc0FjdGlvbk5hbWVdO1xuXHRcdFx0XHRjb25zdCB0cmlnZ2VyQWN0aW9uczogU3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXHRcdFx0XHRsZXQgYVRhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0W10gPSBbXTtcblxuXHRcdFx0XHR0aGlzLl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob0FjdGlvbikuZm9yRWFjaChvU2lkZUVmZmVjdCA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc1RyaWdnZXJBY3Rpb24gPSBvU2lkZUVmZmVjdC5UcmlnZ2VyQWN0aW9uO1xuXHRcdFx0XHRcdGFUYXJnZXRzID0gYVRhcmdldHMuY29uY2F0KG9TaWRlRWZmZWN0LlRhcmdldEVudGl0aWVzIHx8IFtdKS5jb25jYXQoKG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKTtcblx0XHRcdFx0XHRpZiAoc1RyaWdnZXJBY3Rpb24gJiYgdHJpZ2dlckFjdGlvbnMuaW5kZXhPZihzVHJpZ2dlckFjdGlvbikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9ucy5wdXNoKHNUcmlnZ2VyQWN0aW9uKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRwYXRoRXhwcmVzc2lvbnMgPSB0aGlzLl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzKTtcblx0XHRcdFx0b1NpZGVFZmZlY3RzW3NBY3Rpb25OYW1lXSA9IHsgcGF0aEV4cHJlc3Npb25zLCB0cmlnZ2VyQWN0aW9ucyB9O1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBlbnRpdHkgdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMobUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IG9FbnRpdHlTaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0dGhpcy5fZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKG1FbnRpdHlUeXBlKS5mb3JFYWNoKG9TaWRlRWZmZWN0cyA9PiB7XG5cdFx0XHRvRW50aXR5U2lkZUVmZmVjdHNbb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBvU2lkZUVmZmVjdHM7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG9FbnRpdHlTaWRlRWZmZWN0cztcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8U2lkZUVmZmVjdHNTZXR0aW5ncz4pIHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRQcm9taXNlO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXX0=
|
|
734
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwibmFtZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlIiwiX29TaWRlRWZmZWN0c1R5cGUiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImNvbnRyb2wiLCJfYkluaXRpYWxpemVkIiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNFbnRpdHlUeXBlIiwib1NpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJvQ29udHJvbFNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzIiwic1RyaWdnZXJBY3Rpb24iLCJvQ29udGV4dCIsInNHcm91cElkIiwib1RyaWdnZXJBY3Rpb24iLCJnZXRNb2RlbCIsImJpbmRDb250ZXh0IiwiZXhlY3V0ZSIsImdldEJpbmRpbmciLCJnZXRVcGRhdGVHcm91cElkIiwiZ2V0Q29udGV4dCIsIm9Db21wb25lbnQiLCJzY29wZU9iamVjdCIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJfb0NhcGFiaWxpdGllcyIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsInNFbnRpdHlUeXBlTmFtZSIsInNBY3Rpb25OYW1lIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwidW5kZWZpbmVkIiwib0NhcGFiaWxpdGllcyIsIm9Db252ZXJ0ZWRNZXRhTW9kZWwiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZvckVhY2giLCJlbnRpdHlUeXBlIiwiX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIl9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzIiwic0NvbnRyb2xJZCIsIk9iamVjdCIsImtleXMiLCJhUGF0aEV4cHJlc3Npb25zIiwiX2xvZ1JlcXVlc3QiLCJvUHJvbWlzZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImUiLCJyZWplY3QiLCJzTmF2aWdhdGlvblByb3BlcnR5Iiwic0Jhc2VFbnRpdHlUeXBlIiwic05hdmlnYXRpb25QYXRoIiwiYVNpZGVFZmZlY3RzIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImFUYXJnZXRzIiwiZmlsdGVyIiwic0Fubm90YXRpb25OYW1lIiwib1NpZGVFZmZlY3RzIiwiU291cmNlUHJvcGVydGllcyIsInNvbWUiLCJvUHJvcGVydHlQYXRoIiwic1Byb3BlcnR5UGF0aCIsInZhbHVlIiwic3RhcnRzV2l0aCIsInJlcGxhY2UiLCJpbmRleE9mIiwiU291cmNlRW50aXRpZXMiLCJvTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwibVRhcmdldCIsInB1c2giLCJfcmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImxlbmd0aCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtRW50aXR5VHlwZSIsImFJbml0aWFsUHJvcGVydGllcyIsImFFbnRpdGllc1JlcXVlc3RlZCIsIm1hcCIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImFEZXJpdmVkUHJvcGVydGllcyIsImJJc1N0YXJQcm9wZXJ0eSIsImVuZHNXaXRoIiwic05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInNSZWxhdGl2ZVBhdGgiLCJyZXNvbHZlUGF0aCIsImFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzIiwiZW50aXR5UHJvcGVydGllcyIsInRhcmdldFR5cGUiLCJwcm9wZXJ0aWVzIiwibVByb3BlcnR5IiwibmF2aWdhdGlvblBhdGgiLCJwcm9wZXJ0eSIsImZpbmQiLCJuYW1lIiwic3BsaXQiLCJwb3AiLCJpbmZvIiwibVByb3BlcnR5SW5mbyIsInNUYXJnZXRUZXh0UGF0aCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiVGV4dCIsInBhdGgiLCJzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSIsInNCaW5kaW5nUGFyYW1ldGVyIiwib0VudGl0eVR5cGUiLCJvVGVtcFNpZGVFZmZlY3RzIiwiX3JlbW92ZUJpbmRpbmdQYXJhbWV0ZXIiLCJfY29udmVydFRhcmdldHNGb3JtYXQiLCJfcmVwbGFjZVJlZmVyZW5jZWRQcm9wZXJ0aWVzIiwiX2FkZFJlcXVpcmVkVGV4dFByb3BlcnRpZXMiLCJyZWR1Y2UiLCJhVGFyZ2V0UHJvcGVydGllcyIsInZUYXJnZXQiLCJzVGFyZ2V0IiwidHlwZSIsIm1UYXJnZXRFbnRpdHkiLCJvU291cmNlIiwiYXV0aG9yaXplZFR5cGVzIiwiX3R5cGUiLCJzb3VyY2VFbnRpdHlUeXBlIiwibUNvbW1vbkFubm90YXRpb24iLCJtQmluZGluZ1BhcmFtZXRlciIsInBhcmFtZXRlcnMiLCJtUGFyYW1ldGVyIiwiJFR5cGUiLCJfY29udmVydFNpZGVFZmZlY3RzIiwic1RhcmdldFBhdGhzIiwic1BhdGhzIiwiZGVidWciLCJzQmluZGluZ1BhcmFtZXRlck5hbWUiLCJiTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInNWYWx1ZSIsIlJlZ0V4cCIsImlJbmRleCIsImZpbmRJbmRleCIsIm1TZWFyY2hUYXJnZXQiLCJiU2lkZUVmZmVjdHNDaGFuZ2VkIiwiYUVudGl0aWVzIiwibU5hdmlnYXRpb24iLCJhUHJvcGVydGllcyIsImJUYXJnZXRDaGFuZ2VkIiwiaUxhc3RQYXRoU2VwYXJhdG9ySW5kZXgiLCJvVGFyZ2V0IiwiaW5jbHVkZXMiLCJhQWN0aW9ucyIsIm9BY3Rpb24iLCJ0cmlnZ2VyQWN0aW9ucyIsInBhdGhFeHByZXNzaW9ucyIsIl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJvRW50aXR5U2lkZUVmZmVjdHMiLCJTZXJ2aWNlIiwiU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeSIsIm9TZXJ2aWNlQ29udGV4dCIsIlNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2Ui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d0IsV0FBeEMsRUFBdUc7QUFDdEcsWUFBTStFLGtCQUF3RCxHQUFHLEVBQWpFOztBQUNBLGFBQUtELHlCQUFMLENBQStCOUUsV0FBL0IsRUFBNEM3QyxPQUE1QyxDQUFvRCxVQUFBcUIsWUFBWSxFQUFJO0FBQ25FdUcsVUFBQUEsa0JBQWtCLENBQUN2RyxZQUFZLENBQUNuRCxrQkFBZCxDQUFsQixHQUFzRG1ELFlBQXREO0FBQ0EsU0FGRDs7QUFHQSxlQUFPdUcsa0JBQVA7QUFDQTs7O2FBRUQsd0JBQW9CO0FBQ25CLGVBQU8sSUFBUDtBQUNBOzs7O0lBOWtCK0JDLE87O01BaWxCM0JDLHlCOzs7Ozs7Ozs7Ozs7O2FBQ0wsd0JBQWVDLGVBQWYsRUFBcUU7QUFDcEUsWUFBTUMseUJBQXlCLEdBQUcsSUFBSTVLLGtCQUFKLENBQXVCMkssZUFBdkIsQ0FBbEM7QUFDQSxlQUFPQyx5QkFBeUIsQ0FBQ3JLLFdBQWpDO0FBQ0E7Ozs7SUFKc0NzSyxjOztTQU96QkgseUIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlcnZpY2VGYWN0b3J5LCBTZXJ2aWNlLCBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb21wbGV4VHlwZSwgQ29udmVydGVyT3V0cHV0LCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7IENvbnRleHQsIE9EYXRhTWV0YU1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgQ29tbW9uQW5ub3RhdGlvblR5cGVzLCBRdWFsaWZpZWROYW1lIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NvbW1vblwiO1xuaW1wb3J0IHsgQWN0aW9uLCBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7IExvZyB9IGZyb20gXCJzYXAvYmFzZVwiO1xuXG50eXBlIFNpZGVFZmZlY3RzU2V0dGluZ3MgPSB7fTtcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUgPSB7XG5cdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG59O1xudHlwZSBTaWRlRWZmZWN0c1RhcmdldCA9IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZSB8IHN0cmluZztcblxudHlwZSBTaWRlRWZmZWN0c1RhcmdldFR5cGUgPSB7XG5cdFRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRUYXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlW107XG59O1xuXG50eXBlIEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRUYXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0VGFyZ2V0RW50aXRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXTtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIEJhc2VTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nO1xufSAmIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZTtcblxudHlwZSBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXTtcblx0dHJpZ2dlckFjdGlvbnM/OiBRdWFsaWZpZWROYW1lW107XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0gUGFydGlhbDxCYXNlU2lkZUVmZmVjdHNUeXBlPiAmIHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cdFNvdXJjZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRzb3VyY2VDb250cm9sSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gQmFzZVNpZGVFZmZlY3RzVHlwZSAmIHtcblx0U291cmNlUHJvcGVydGllcz86IFByb3BlcnR5UGF0aFtdO1xuXHRTb3VyY2VFbnRpdGllcz86IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXTtcblx0VHJpZ2dlckFjdGlvbj86IFF1YWxpZmllZE5hbWU7XG59O1xuXG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c1R5cGUgPSBDb250cm9sU2lkZUVmZmVjdHNUeXBlIHwgT0RhdGFTaWRlRWZmZWN0c1R5cGU7XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0FjdGlvbkRpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgQ29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXG50eXBlIFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnkgPSB7XG5cdG9EYXRhOiB7XG5cdFx0ZW50aXRpZXM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHRcdGFjdGlvbnM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIEFjdGlvblNpZGVFZmZlY3RzVHlwZT47XG5cdFx0fTtcblx0fTtcblx0Y29udHJvbDoge1xuXHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXHR9O1xufTtcblxudHlwZSBFeHRyYWN0b3JQcm9wZXJ0eUluZm8gPSB7XG5cdHByb3BlcnR5OiBQcm9wZXJ0eTtcblx0bmF2aWdhdGlvblBhdGg/OiBzdHJpbmc7XG59O1xuXG5jbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFNpZGVFZmZlY3RzU2V0dGluZ3M+IHtcblx0aW5pdFByb21pc2UhOiBQcm9taXNlPGFueT47XG5cdF9vU2lkZUVmZmVjdHNUeXBlITogU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeTtcblx0X29DYXBhYmlsaXRpZXMhOiBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB8IHVuZGVmaW5lZDtcblx0X2JJbml0aWFsaXplZCE6IEJvb2xlYW47XG5cdC8vICE6IG1lYW5zIHRoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGFzc2lnbmVkIGJlZm9yZSB1c2FnZVxuXHRpbml0KCkge1xuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRvRGF0YToge1xuXHRcdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRcdGFjdGlvbnM6IHt9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbDoge31cblx0XHR9O1xuXHRcdHRoaXMuX2JJbml0aWFsaXplZCA9IGZhbHNlO1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFNpZGVFZmZlY3RzIGNvbnRyb2xcblx0ICogU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBpcyBhZGRlZCBieSBhIGNvbnRyb2wgdG8ga2VlcCBkYXRhIHVwIHRvIGRhdGVcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgZ2V0IGxpbWl0ZWQgc2NvcGUgY29tcGFyZWQgd2l0aCBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlOlxuXHQgKiAtIE9ubHkgb25lIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gY2FuIGJlIGRlZmluZWQgZm9yIHRoZSBjb21iaW5hdGlvbiBlbnRpdHkgdHlwZSAtIGNvbnRyb2wgSWRcblx0ICogLSBPbmx5IFNpZGVFZmZlY3RzIHNvdXJjZSBwcm9wZXJ0aWVzIGFyZSByZWNvZ25pemVkIGFuZCB1c2VkIHRvIHRyaWdnZXIgU2lkZUVmZmVjdHNcblx0ICpcblx0ICogRW5zdXJlIHRoZSBzb3VyY2VDb250cm9sSWQgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBTQVBVSTUgY29udHJvbCBJRC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdDogT21pdDxDb250cm9sU2lkZUVmZmVjdHNUeXBlLCBcImZ1bGx5UXVhbGlmaWVkTmFtZVwiPik6IHZvaWQge1xuXHRcdGlmIChvU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWQpIHtcblx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdDogQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdFx0Li4ub1NpZGVFZmZlY3QsXG5cdFx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogc0VudGl0eVR5cGUgKyBcIi9TaWRlRWZmZWN0c0ZvckNvbnRyb2wvXCIgKyBvU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRcblx0XHRcdH07XG5cdFx0XHRjb25zdCBtRW50aXR5Q29udHJvbFNpZGVFZmZlY3RzID0gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5jb250cm9sW3NFbnRpdHlUeXBlXSB8fCB7fTtcblx0XHRcdG1FbnRpdHlDb250cm9sU2lkZUVmZmVjdHNbb0NvbnRyb2xTaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZF0gPSBvQ29udHJvbFNpZGVFZmZlY3Q7XG5cdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2xbc0VudGl0eVR5cGVdID0gbUVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cztcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgU2lkZUVmZmVjdHMgYWN0aW9uLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNUcmlnZ2VyQWN0aW9uIE5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0dyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqL1xuXHRwdWJsaWMgZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbjogU3RyaW5nLCBvQ29udGV4dDogQ29udGV4dCwgc0dyb3VwSWQ/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBvVHJpZ2dlckFjdGlvbjogYW55ID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChzVHJpZ2dlckFjdGlvbiArIFwiKC4uLilcIiwgb0NvbnRleHQpO1xuXHRcdG9UcmlnZ2VyQWN0aW9uLmV4ZWN1dGUoc0dyb3VwSWQgfHwgKG9Db250ZXh0IGFzIGFueSkuZ2V0QmluZGluZygpLmdldFVwZGF0ZUdyb3VwSWQoKSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBjb252ZXJ0ZWQgT0RhdGEgbWV0YU1vZGVsLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gQ29udmVydGVkIE9EYXRhIG1ldGFNb2RlbFxuXHQgKi9cblx0cHVibGljIGdldENvbnZlcnRlZE1ldGFNb2RlbCgpOiBDb252ZXJ0ZXJPdXRwdXQge1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0IGFzIGFueTtcblx0XHRjb25zdCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG9Db21wb25lbnQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRyZXR1cm4gY29udmVydFR5cGVzKG9NZXRhTW9kZWwsIHRoaXMuX29DYXBhYmlsaXRpZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGVudGl0eSB0eXBlIG9mIGEgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldEVudGl0eVR5cGVGcm9tQ29udGV4dFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkIH0gRW50aXR5IFR5cGVcblx0ICovXG5cdHB1YmxpYyBnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0c01ldGFQYXRoID0gKG9NZXRhTW9kZWwgYXMgYW55KS5nZXRNZXRhUGF0aChvQ29udGV4dC5nZXRQYXRoKCkpLFxuXHRcdFx0c0VudGl0eVR5cGUgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGgpW1wiJFR5cGVcIl07XG5cdFx0cmV0dXJuIHNFbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGVOYW1lIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHB1YmxpYyBnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKHNFbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5lbnRpdGllc1tzRW50aXR5VHlwZU5hbWVdIHx8IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCk6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoaXMuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGlmIChzRW50aXR5VHlwZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fb1NpZGVFZmZlY3RzVHlwZS5vRGF0YS5hY3Rpb25zW3NFbnRpdHlUeXBlXT8uW3NBY3Rpb25OYW1lXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIGRpY3Rpb25hcnkgZm9yIHRoZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSBvQ2FwYWJpbGl0aWVzIFRoZSBjdXJyZW50IGNhcGFiaWxpdGllc1xuXHQgKi9cblx0cHVibGljIGluaXRpYWxpemVTaWRlRWZmZWN0cyhvQ2FwYWJpbGl0aWVzPzogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMpOiB2b2lkIHtcblx0XHR0aGlzLl9vQ2FwYWJpbGl0aWVzID0gb0NhcGFiaWxpdGllcztcblx0XHRpZiAoIXRoaXMuX2JJbml0aWFsaXplZCkge1xuXHRcdFx0Y29uc3Qgb0NvbnZlcnRlZE1ldGFNb2RlbCA9IHRoaXMuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk7XG5cdFx0XHRvQ29udmVydGVkTWV0YU1vZGVsLmVudGl0eVR5cGVzLmZvckVhY2goZW50aXR5VHlwZSA9PiB7XG5cdFx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1R5cGUub0RhdGEuZW50aXRpZXNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gdGhpcy5fcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpO1xuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLm9EYXRhLmFjdGlvbnNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gdGhpcy5fcmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhlbnRpdHlUeXBlKTsgLy8gb25seSBib3VuZCBhY3Rpb25zIGFyZSBhbmFseXplZCBzaW5jZSB1bmJvdW5kIG9uZXMgZG9uJ3QgZ2V0IFNpZGVFZmZlY3RzXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuX2JJbml0aWFsaXplZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBjb250cm9sLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNDb250cm9sSWQgQ29udHJvbCBJZFxuXHQgKi9cblx0cHVibGljIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhzQ29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRPYmplY3Qua2V5cyh0aGlzLl9vU2lkZUVmZmVjdHNUeXBlLmNvbnRyb2wpLmZvckVhY2goc0VudGl0eVR5cGUgPT4ge1xuXHRcdFx0aWYgKHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV1bc0NvbnRyb2xJZF0pIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZV1bc0NvbnRyb2xJZF07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtBcnJheX0gYVBhdGhFeHByZXNzaW9ucyBUYXJnZXRzIG9mIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNHcm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdCAqL1xuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzKGFQYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10sIG9Db250ZXh0OiBDb250ZXh0LCBzR3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG5cdFx0dGhpcy5fbG9nUmVxdWVzdChhUGF0aEV4cHJlc3Npb25zLCBvQ29udGV4dCk7XG5cdFx0bGV0IG9Qcm9taXNlOiBQcm9taXNlPGFueT47XG5cdFx0LyoqXG5cdFx0ICogQ29udGV4dC5yZXF1ZXN0U2lkZUVmZmVjdHMgZWl0aGVyIHJldHVybnMgYSBwcm9taXNlIG9yIHRocm93cyBhIG5ldyBlcnJvci4gVGhpcyByZXR1cm4gaXMgY2F1Z2h0IGlmIGFuIGVycm9yIGlzIHRocm93blxuXHRcdCAqIHRvIGF2b2lkIGJyZWFraW5nIHRoZSBwcm9taXNlIGNoYWluLlxuXHRcdCAqL1xuXHRcdHRyeSB7XG5cdFx0XHRvUHJvbWlzZSA9IChvQ29udGV4dCBhcyBhbnkpLnJlcXVlc3RTaWRlRWZmZWN0cyhhUGF0aEV4cHJlc3Npb25zLCBzR3JvdXBJZCkgYXMgUHJvbWlzZTxhbnk+O1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5yZWplY3QoZSk7XG5cdFx0fVxuXHRcdHJldHVybiBvUHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIGZvciBhIG5hdmlnYXRpb24gcHJvcGVydHkgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzTmF2aWdhdGlvblByb3BlcnR5IE5hdmlnYXRpb24gcHJvcGVydHlcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KHNOYXZpZ2F0aW9uUHJvcGVydHk6IHN0cmluZywgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHNCYXNlRW50aXR5VHlwZSA9IHRoaXMuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRpZiAoc0Jhc2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCBzTmF2aWdhdGlvblBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5ICsgXCIvXCI7XG5cdFx0XHRjb25zdCBhU2lkZUVmZmVjdHMgPSB0aGlzLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoc0Jhc2VFbnRpdHlUeXBlKTtcblx0XHRcdGxldCBhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXHRcdFx0T2JqZWN0LmtleXMoYVNpZGVFZmZlY3RzKVxuXHRcdFx0XHQuZmlsdGVyKFxuXHRcdFx0XHRcdC8vIEtlZXAgcmVsZXZhbnQgU2lkZUVmZmVjdHNcblx0XHRcdFx0XHRzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IGFTaWRlRWZmZWN0c1tzQW5ub3RhdGlvbk5hbWVdO1xuXHRcdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0cy5Tb3VyY2VQcm9wZXJ0aWVzIHx8IFtdKS5zb21lKG9Qcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBvUHJvcGVydHlQYXRoLnZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdFx0XHRzUHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoc05hdmlnYXRpb25QYXRoKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5UGF0aC5yZXBsYWNlKHNOYXZpZ2F0aW9uUGF0aCwgXCJcIikuaW5kZXhPZihcIi9cIikgPT09IC0xXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSkgfHxcblx0XHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0cy5Tb3VyY2VFbnRpdGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PiBvTmF2aWdhdGlvblByb3BlcnR5UGF0aC52YWx1ZSA9PT0gc05hdmlnYXRpb25Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuZm9yRWFjaChzQW5ub3RhdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBhU2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAob1NpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24pIHtcblx0XHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUFjdGlvbihvU2lkZUVmZmVjdHMuVHJpZ2dlckFjdGlvbiwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQoKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcyBhcyBhbnlbXSkgfHwgW10pXG5cdFx0XHRcdFx0XHQuY29uY2F0KChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pXG5cdFx0XHRcdFx0XHQuZm9yRWFjaChtVGFyZ2V0ID0+IGFUYXJnZXRzLnB1c2gobVRhcmdldCkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGUgcHJvcGVydGllc1xuXHRcdFx0YVRhcmdldHMgPSB0aGlzLl9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzKTtcblx0XHRcdGlmIChhVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQpLmNhdGNoKG9FcnJvciA9PlxuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBTaWRlRWZmZWN0cyBmb3IgTmF2aWdhdGlvbiBQcm9wZXJ0eSBcIiArIHNOYXZpZ2F0aW9uUHJvcGVydHksIG9FcnJvcilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGNvbnRyb2xzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBOYW1lXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHB1YmxpYyBnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoc0VudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuX29TaWRlRWZmZWN0c1R5cGUuY29udHJvbFtzRW50aXR5VHlwZU5hbWVdIHx8IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgdGhlIHRleHQgcHJvcGVydGllcyByZXF1aXJlZCBmb3IgU2lkZUVmZmVjdHNcblx0ICogSWYgYSBwcm9wZXJ0eSBoYXMgYW4gYXNzb2NpYXRlZCB0ZXh0IHRoZW4gdGhpcyB0ZXh0IG5lZWRzIHRvIGJlIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiB3aXRoIGFkZGVkIHRleHQgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBfYWRkUmVxdWlyZWRUZXh0UHJvcGVydGllcyhvU2lkZUVmZmVjdDogQmFzZVNpZGVFZmZlY3RzVHlwZSwgbUVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBCYXNlU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBhSW5pdGlhbFByb3BlcnRpZXM6IHN0cmluZ1tdID0gKG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMgfHwgW10pIGFzIHN0cmluZ1tdLFxuXHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkOiBzdHJpbmdbXSA9IChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG5hdmlnYXRpb24gPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0bGV0IGFEZXJpdmVkUHJvcGVydGllczogRXh0cmFjdG9yUHJvcGVydHlJbmZvW10gPSBbXTtcblxuXHRcdGFJbml0aWFsUHJvcGVydGllcy5mb3JFYWNoKHNQcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0Y29uc3QgYklzU3RhclByb3BlcnR5ID0gc1Byb3BlcnR5UGF0aC5lbmRzV2l0aChcIipcIiksIC8vIENhbiBiZSAnKicgb3IgJy4uLi9uYXZQcm9wLyonXG5cdFx0XHRcdHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgPSBzUHJvcGVydHlQYXRoLnN1YnN0cmluZygwLCBzUHJvcGVydHlQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSksXG5cdFx0XHRcdHNSZWxhdGl2ZVBhdGggPSBzTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHNOYXZpZ2F0aW9uUHJvcGVydHlQYXRoICsgXCIvXCIgOiBcIlwiLFxuXHRcdFx0XHRtVGFyZ2V0OiBhbnkgPSBtRW50aXR5VHlwZS5yZXNvbHZlUGF0aChzTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfHwgbUVudGl0eVR5cGU7XG5cblx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdC8vIG1UYXJnZXQgY2FuIGJlIGFuIGVudGl0eSB0eXBlLCBuYXZpZ2F0aW9uUHJvcGVydHkgb3Igb3IgYSBjb21wbGV4VHlwZVxuXHRcdFx0XHRjb25zdCBhVGFyZ2V0RW50aXR5UHJvcGVydGllczogUHJvcGVydHlbXSA9XG5cdFx0XHRcdFx0KG1UYXJnZXQgYXMgRW50aXR5VHlwZSkuZW50aXR5UHJvcGVydGllcyB8fFxuXHRcdFx0XHRcdCgobVRhcmdldCBhcyBQcm9wZXJ0eSkudGFyZ2V0VHlwZSBhcyBDb21wbGV4VHlwZSk/LnByb3BlcnRpZXMgfHxcblx0XHRcdFx0XHQobVRhcmdldCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpLnRhcmdldFR5cGUuZW50aXR5UHJvcGVydGllcztcblx0XHRcdFx0aWYgKGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0aWYgKGJJc1N0YXJQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0aWYgKGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEFkZCBhbGwgcmVxdWlyZWQgcHJvcGVydGllcyBiZWhpbmQgdGhlICpcblx0XHRcdFx0XHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkLnB1c2goc05hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdFx0XHRcdFx0XHRhRGVyaXZlZFByb3BlcnRpZXMgPSBhRGVyaXZlZFByb3BlcnRpZXMuY29uY2F0KFxuXHRcdFx0XHRcdFx0XHRcdGFUYXJnZXRFbnRpdHlQcm9wZXJ0aWVzLm1hcChtUHJvcGVydHkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bmF2aWdhdGlvblBhdGg6IHNSZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5OiBtUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0YURlcml2ZWRQcm9wZXJ0aWVzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eTogYVRhcmdldEVudGl0eVByb3BlcnRpZXMuZmluZChcblx0XHRcdFx0XHRcdFx0XHRtUHJvcGVydHkgPT4gbVByb3BlcnR5Lm5hbWUgPT09IHNQcm9wZXJ0eVBhdGguc3BsaXQoXCIvXCIpLnBvcCgpXG5cdFx0XHRcdFx0XHRcdCkgYXMgUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoOiBzUmVsYXRpdmVQYXRoXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TG9nLmluZm8oXCJTaWRlRWZmZWN0cyAtIFRoZSBlbnRpdHkgdHlwZSBhc3NvY2lhdGVkIHRvIHByb3BlcnR5IHBhdGggXCIgKyBzUHJvcGVydHlQYXRoICsgXCIgY2Fubm90IGJlIHJlc29sdmVkXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRMb2cuaW5mbyhcIlNpZGVFZmZlY3RzIC0gVGhlIHByb3BlcnR5IHBhdGggXCIgKyBzUHJvcGVydHlQYXRoICsgXCIgY2Fubm90IGJlIHJlc29sdmVkXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YURlcml2ZWRQcm9wZXJ0aWVzLmZvckVhY2gobVByb3BlcnR5SW5mbyA9PiB7XG5cdFx0XHRpZiAobVByb3BlcnR5SW5mby5wcm9wZXJ0eSkge1xuXHRcdFx0XHRjb25zdCBzVGFyZ2V0VGV4dFBhdGggPSAobVByb3BlcnR5SW5mby5wcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0IGFzIGFueSk/LnBhdGgsXG5cdFx0XHRcdFx0c1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkgPSBtUHJvcGVydHlJbmZvLm5hdmlnYXRpb25QYXRoICsgc1RhcmdldFRleHRQYXRoO1xuXHRcdFx0XHQvKipcblx0XHRcdFx0ICogVGhlIHByb3BlcnR5IFRleHQgbXVzdCBiZSBhZGRlZCBvbmx5IGlmIHRoZSBwcm9wZXJ0eSBpc1xuXHRcdFx0XHQgKiAtIG5vdCBwYXJ0IG9mIGEgc3RhciBwcm9wZXJ0eSAoLmkuZSAnKicgb3IgJ25hdmlnYXRpb24vKicpIG9yIGEgdGFyZ2V0ZWQgRW50aXR5XG5cdFx0XHRcdCAqIC0gbm90IGluY2x1ZGUgaW50byB0aGUgaW5pdGlhbCB0YXJnZXRlZCBwcm9wZXJ0aWVzIG9mIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqICBJbmRlZWQgaW4gdGhlIHR3byBsaXN0ZWQgY2FzZXMsIHRoZSBwcm9wZXJ0eSBjb250YWluaW5nIHRleHQgd2lsbCBiZS9pcyByZXF1ZXN0ZWQgYnkgaW5pdGlhbCBTaWRlRWZmZWN0cyBjb25maWd1cmF0aW9uLlxuXHRcdFx0XHQgKi9cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0c1RhcmdldFRleHRQYXRoICYmXG5cdFx0XHRcdFx0YUVudGl0aWVzUmVxdWVzdGVkLmluZGV4T2Yoc1RleHRQYXRoRnJvbUluaXRpYWxFbnRpdHkuc3Vic3RyaW5nKDAsIHNUZXh0UGF0aEZyb21Jbml0aWFsRW50aXR5Lmxhc3RJbmRleE9mKFwiL1wiKSkpID09PVxuXHRcdFx0XHRcdFx0LTEgJiZcblx0XHRcdFx0XHRhSW5pdGlhbFByb3BlcnRpZXMuaW5kZXhPZihzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSkgPT09IC0xXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdG9TaWRlRWZmZWN0LlRhcmdldFByb3BlcnRpZXMucHVzaChzVGV4dFBhdGhGcm9tSW5pdGlhbEVudGl0eSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBvU2lkZUVmZmVjdDtcblx0fVxuXHQvKipcblx0ICogQ29udmVydHMgU2lkZUVmZmVjdHMgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIENvbnZlcnRzIFNpZGVFZmZlY3RzIHRhcmdldHMgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIFJlbW92ZXMgYmluZGluZyBwYXJhbWV0ZXIgZnJvbSBTaWRlRWZmZWN0cyB0YXJnZXRzIHByb3BlcnRpZXNcblx0ICogIC0gQWRkcyB0aGUgdGV4dCBwcm9wZXJ0aWVzXG5cdCAqICAtIFJlcGxhY2VzIFRhcmdldFByb3BlcnRpZXMgaGF2aW5nIHJlZmVyZW5jZSB0byBTb3VyY2UgUHJvcGVydGllcyBmb3IgYSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNCaW5kaW5nUGFyYW1ldGVyIE5hbWUgb2YgdGhlIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgX2NvbnZlcnRTaWRlRWZmZWN0cyhcblx0XHRvU2lkZUVmZmVjdHM6IEJhc2VTaWRlRWZmZWN0c1R5cGUgfCBCYXNlQW5ub3RhdGlvblNpZGVFZmZlY3RzVHlwZSxcblx0XHRzRW50aXR5VHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdHNCaW5kaW5nUGFyYW1ldGVyPzogc3RyaW5nXG5cdCk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9ICh0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpIGFzIENvbnZlcnRlck91dHB1dCkuZW50aXR5VHlwZXMuZmluZChvRW50aXR5VHlwZSA9PiB7XG5cdFx0XHRyZXR1cm4gb0VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lID09PSBzRW50aXR5VHlwZTtcblx0XHR9KTtcblx0XHRjb25zdCBvVGVtcFNpZGVFZmZlY3RzID0gdGhpcy5fcmVtb3ZlQmluZGluZ1BhcmFtZXRlcih0aGlzLl9jb252ZXJ0VGFyZ2V0c0Zvcm1hdChvU2lkZUVmZmVjdHMpLCBzQmluZGluZ1BhcmFtZXRlcik7XG5cdFx0cmV0dXJuIG1FbnRpdHlUeXBlXG5cdFx0XHQ/IHRoaXMuX3JlcGxhY2VSZWZlcmVuY2VkUHJvcGVydGllcyh0aGlzLl9hZGRSZXF1aXJlZFRleHRQcm9wZXJ0aWVzKG9UZW1wU2lkZUVmZmVjdHMsIG1FbnRpdHlUeXBlKSwgbUVudGl0eVR5cGUpXG5cdFx0XHQ6IG9UZW1wU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgU2lkZUVmZmVjdHMgdGFyZ2V0cyAoVGFyZ2V0RW50aXRpZXMgYW5kIFRhcmdldFByb3BlcnRpZXMpIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBUYXJnZXRQcm9wZXJ0aWVzIGFzIGFycmF5IG9mIHN0cmluZ1xuXHQgKiAgLSBUYXJnZXRFbnRpdGllcyBhcyBhcnJheSBvZiBvYmplY3Qgd2l0aCBwcm9wZXJ0eSAkTmF2aWdhdGlvblByb3BlcnR5UGF0aC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb252ZXJ0ZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2NvbnZlcnRUYXJnZXRzRm9ybWF0KG9TaWRlRWZmZWN0czogQmFzZVNpZGVFZmZlY3RzVHlwZSB8IEJhc2VBbm5vdGF0aW9uU2lkZUVmZmVjdHNUeXBlKTogQmFzZVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgVGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSkucmVkdWNlKGZ1bmN0aW9uKGFUYXJnZXRQcm9wZXJ0aWVzLCB2VGFyZ2V0KSB7XG5cdFx0XHRcdGNvbnN0IHNUYXJnZXQgPSAodHlwZW9mIHZUYXJnZXQgPT09IFwic3RyaW5nXCIgJiYgdlRhcmdldCkgfHwgKHZUYXJnZXQudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIiAmJiB2VGFyZ2V0LnZhbHVlKTtcblx0XHRcdFx0aWYgKHNUYXJnZXQpIHtcblx0XHRcdFx0XHRhVGFyZ2V0UHJvcGVydGllcy5wdXNoKHNUYXJnZXQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIlNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBUYXJnZXRQcm9wZXJ0aWVzIGZvciBTaWRlRWZmZWN0c1wiICsgb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGFUYXJnZXRQcm9wZXJ0aWVzO1xuXHRcdFx0fSwgW10pLFxuXHRcdFx0VGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5tYXAobVRhcmdldEVudGl0eSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiAgU2lkZUVmZmVjdHMgdGhhdCBjb21lcyBmcm9tIFNBUCBGRSBnZXQgVGFyZ2V0RW50aXRpZXMgd2l0aCAkTmF2aWdhdGlvblByb3BlcnR5UGF0aCB3aGVyZWFzXG5cdFx0XHRcdCAqICBvbmVzIGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZWQgT0RhdGEgbW9kZWwgZ2V0cyBhIE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggZm9ybWF0XG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHRyZXR1cm4geyBcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCI6IG1UYXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggfHwgbVRhcmdldEVudGl0eS52YWx1ZSB8fCBcIlwiIH07XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4geyAuLi5vU2lkZUVmZmVjdHMsIC4uLnsgVGFyZ2V0UHJvcGVydGllcywgVGFyZ2V0RW50aXRpZXMgfSB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGggZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uob1NvdXJjZTogYW55KTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0Y29uc3QgYVNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Y29uc3QgYXV0aG9yaXplZFR5cGVzID0gW1wiRW50aXR5VHlwZVwiLCBcIkFjdGlvblwiXTtcblx0XHRpZiAob1NvdXJjZS5fdHlwZSAmJiBhdXRob3JpemVkVHlwZXMuaW5kZXhPZihvU291cmNlLl90eXBlKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IG9Tb3VyY2UuX3R5cGUgPT09IFwiRW50aXR5VHlwZVwiID8gb1NvdXJjZSA6IG9Tb3VyY2Uuc291cmNlRW50aXR5VHlwZTtcblx0XHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0XHRjb25zdCBtQ29tbW9uQW5ub3RhdGlvbjogYW55ID0gb1NvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlciA9ICgob1NvdXJjZSBhcyBBY3Rpb24pLnBhcmFtZXRlcnMgfHwgW10pLmZpbmQoXG5cdFx0XHRcdFx0bVBhcmFtZXRlciA9PiBtUGFyYW1ldGVyLnR5cGUgPT09IChtRW50aXR5VHlwZSB8fCBvU291cmNlKS5mdWxseVF1YWxpZmllZE5hbWVcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXJhbWV0ZXIgPSBtQmluZGluZ1BhcmFtZXRlciA/IG1CaW5kaW5nUGFyYW1ldGVyLmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIi9cIilbMV0gOiBcIlwiO1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29tbW9uQW5ub3RhdGlvbilcblx0XHRcdFx0XHQuZmlsdGVyKHNBbm5vdGF0aW9uTmFtZSA9PiBtQ29tbW9uQW5ub3RhdGlvbltzQW5ub3RhdGlvbk5hbWVdLiRUeXBlID09PSBDb21tb25Bbm5vdGF0aW9uVHlwZXMuU2lkZUVmZmVjdHNUeXBlKVxuXHRcdFx0XHRcdC5mb3JFYWNoKHNBbm5vdGF0aW9uTmFtZSA9PiB7XG5cdFx0XHRcdFx0XHRhU2lkZUVmZmVjdHMucHVzaChcblx0XHRcdFx0XHRcdFx0dGhpcy5fY29udmVydFNpZGVFZmZlY3RzKG1Db21tb25Bbm5vdGF0aW9uW3NBbm5vdGF0aW9uTmFtZV0sIG1FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgc0JpbmRpbmdQYXJhbWV0ZXIpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYVNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvZ3MgU2lkZUVmZmVjdHMgcmVxdWVzdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFQYXRoRXhwcmVzc2lvbnMgU2lkZUVmZmVjdHMgdGFyZ2V0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBfbG9nUmVxdWVzdChhUGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdLCBvQ29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IHNUYXJnZXRQYXRocyA9IGFQYXRoRXhwcmVzc2lvbnMucmVkdWNlKGZ1bmN0aW9uKHNQYXRocywgbVRhcmdldCkge1xuXHRcdFx0cmV0dXJuIHNQYXRocyArIFwiXFxuXFx0XFx0XCIgKyAoKG1UYXJnZXQgYXMgU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlKS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCB8fCBtVGFyZ2V0IHx8IFwiXCIpO1xuXHRcdH0sIFwiXCIpO1xuXHRcdExvZy5kZWJ1ZyhcIlNpZGVFZmZlY3RzIC0gUmVxdWVzdDpcXG5cXHRDb250ZXh0IHBhdGggOiBcIiArIG9Db250ZXh0LmdldFBhdGgoKSArIFwiXFxuXFx0UHJvcGVydHkgcGF0aHMgOlwiICsgc1RhcmdldFBhdGhzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIG5hbWUgb2YgYmluZGluZyBwYXJhbWV0ZXIgb24gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0JpbmRpbmdQYXJhbWV0ZXJOYW1lIE5hbWUgb2YgYmluZGluZyBwYXJhbWV0ZXJcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBfcmVtb3ZlQmluZGluZ1BhcmFtZXRlcihvU2lkZUVmZmVjdHM6IEJhc2VTaWRlRWZmZWN0c1R5cGUsIHNCaW5kaW5nUGFyYW1ldGVyTmFtZT86IHN0cmluZyk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGlmIChzQmluZGluZ1BhcmFtZXRlck5hbWUpIHtcblx0XHRcdGNvbnN0IGFUYXJnZXRzID0gW1wiVGFyZ2V0UHJvcGVydGllc1wiLCBcIlRhcmdldEVudGl0aWVzXCJdO1xuXHRcdFx0YVRhcmdldHMuZm9yRWFjaChzVGFyZ2V0ID0+IHtcblx0XHRcdFx0bGV0IG1UYXJnZXQgPSAob1NpZGVFZmZlY3RzIGFzIGFueSlbc1RhcmdldF07XG5cdFx0XHRcdGlmIChtVGFyZ2V0KSB7XG5cdFx0XHRcdFx0bVRhcmdldCA9IG1UYXJnZXQubWFwKChtUHJvcGVydHk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgYk5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPSBtUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggIT09IHVuZGVmaW5lZDsgLy8gTmVlZCB0byB0ZXN0IHdpdGggdW5kZWZpbmVkIHNpbmNlICBtUHJvcGVydHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggY291bGQgYmUgXCJcIiAoZW1wdHkgc3RyaW5nKVxuXHRcdFx0XHRcdFx0Y29uc3Qgc1ZhbHVlID0gKGJOYXZpZ2F0aW9uUHJvcGVydHlQYXRoID8gbVByb3BlcnR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIDogbVByb3BlcnR5KS5yZXBsYWNlKFxuXHRcdFx0XHRcdFx0XHRuZXcgUmVnRXhwKFwiXlwiICsgc0JpbmRpbmdQYXJhbWV0ZXJOYW1lICsgXCIvP1wiKSxcblx0XHRcdFx0XHRcdFx0XCJcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybiBiTmF2aWdhdGlvblByb3BlcnR5UGF0aCA/IHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNWYWx1ZSB9IDogc1ZhbHVlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdChvU2lkZUVmZmVjdHMgYXMgYW55KVtzVGFyZ2V0XSA9IG1UYXJnZXQ7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgZHVwbGljYXRlcyBpbiBTaWRlRWZmZWN0cyB0YXJnZXRzLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtBcnJheX0gYVRhcmdldHMgU2lkZUVmZmVjdHMgdGFyZ2V0c1xuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFNpZGVFZmZlY3RzIHRhcmdldHMgd2l0aG91dCBkdXBsaWNhdGVzXG5cdCAqL1xuXHRwcml2YXRlIF9yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGFUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdKTogU2lkZUVmZmVjdHNUYXJnZXRbXSB7XG5cdFx0cmV0dXJuIGFUYXJnZXRzLmZpbHRlcihcblx0XHRcdChtVGFyZ2V0OiBhbnksIGlJbmRleCwgYVRhcmdldHMpID0+XG5cdFx0XHRcdGFUYXJnZXRzLmZpbmRJbmRleCgobVNlYXJjaFRhcmdldDogYW55KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdG1TZWFyY2hUYXJnZXQgPT09IG1UYXJnZXQgfHwgLy8gUHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHQobVRhcmdldC4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCAmJiBtU2VhcmNoVGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoID09PSBtVGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSAvLyBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSkgPT09IGlJbmRleFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVwbGFjZXMgVGFyZ2V0UHJvcGVydGllcyBoYXZpbmcgcmVmZXJlbmNlIHRvIFNvdXJjZSBQcm9wZXJ0aWVzIGZvciBhIFNpZGVFZmZlY3RzXG5cdCAqIElmIGEgU2lkZUVmZmVjdHMgU291cmNlIFByb3BlcnR5IGlzIGFuIG5hdmlnYXRpb24gZW50aXR5IHJlZmVyZW5jZSwgdGhlIFNpZGVFZmZlY3RzIFRhcmdldCBQcm9wZXJ0aWVzIGNhbm5vdCBiZSBhIHByb3BlcnR5IG9mIHRoaXMgbmF2aWdhdGlvbiBlbnRpdHkuXG5cdCAqIEluZGVlZCB0aGlzIGNvbmZpZ3VyYXRpb24gbGVhZHMgdG8gZXJyb3IgaW50byB0aGUgT0RhdGEgVjQgTW9kZWwgc2luY2UgcmVzcG9uc2UgY2Fubm90IGJlIHByb2Nlc3NlZCBiZWNhdXNlIHRoaXMgd291bGQgbWVhbiB0aGF0IHdlIG1lcmdlIHByb3BlcnRpZXMgb2YgdGhlIG5ldyB0YXJnZXQgaW50byB0aGUgb2xkIHRhcmdldCBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eS5cblx0ICogSW4gb3JkZXIgdG8gcmVxdWVzdCBuZXcgdmFsdWUgb2YgdGhlc2UgdGFyZ2V0IHByb3BlcnRpZXMgdGhlIFNpZGVFZmZlY3RzIHdpbGwgcmVxdWVzdCBmb3IgdGhlIGVudGlyZSBFbnRpdHkgaW5zdGVhZCBvZiBqdXN0IGEgc2V0IG9mIHByb3BlcnRpZXMuXG5cdCAqIEZvciB0aGUgZmlyc3QgdmVyc2lvbiwgd2UgcmVtb3ZlIGFsbCBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYW5kIHJlcGxhY2UgdGhlbSBieSB0YXJnZXRFbnRpdGllcy4gVGhpcyBjaGFuZ2UgY291bGQgYmUgaW1wcm92ZWQgaW4gbmV4dCB2ZXJzaW9uLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlICBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIHdpdGhvdXQgcmVmZXJlbmNlZCB0YXJnZXQgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBfcmVwbGFjZVJlZmVyZW5jZWRQcm9wZXJ0aWVzKG9TaWRlRWZmZWN0OiBCYXNlU2lkZUVmZmVjdHNUeXBlLCBtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IEJhc2VTaWRlRWZmZWN0c1R5cGUge1xuXHRcdGxldCBiU2lkZUVmZmVjdHNDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG5cdFx0Y29uc3QgYUVudGl0aWVzOiBzdHJpbmdbXSA9XG5cdFx0XHRcdChvU2lkZUVmZmVjdC5UYXJnZXRFbnRpdGllcyB8fCBbXSkubWFwKG1OYXZpZ2F0aW9uID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbU5hdmlnYXRpb24uJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg7XG5cdFx0XHRcdH0pIHx8IFtdLFxuXHRcdFx0YVByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cblx0XHRvU2lkZUVmZmVjdC5UYXJnZXRQcm9wZXJ0aWVzLmZvckVhY2goc1Byb3BlcnR5UGF0aCA9PiB7XG5cdFx0XHRsZXQgYlRhcmdldENoYW5nZWQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IGlMYXN0UGF0aFNlcGFyYXRvckluZGV4ID0gc1Byb3BlcnR5UGF0aC5sYXN0SW5kZXhPZihcIi9cIik7XG5cdFx0XHRpZiAoaUxhc3RQYXRoU2VwYXJhdG9ySW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IHNQcm9wZXJ0eVBhdGguc3Vic3RyaW5nKDAsIGlMYXN0UGF0aFNlcGFyYXRvckluZGV4KTtcblx0XHRcdFx0Y29uc3Qgb1RhcmdldCA9IG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNOYXZpZ2F0aW9uUGF0aCk7XG5cdFx0XHRcdGlmIChvVGFyZ2V0ICYmIG9UYXJnZXQuX3R5cGUgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0XHQvL1Rlc3QgaWYgaXQncyBub3QgYSBwcm9wZXJ0eSBib3VuZCBvbiBjb21wbGV4VHlwZSAoX0NvbXBsZXhUeXBlL015UHJvcGVydHkpXG5cdFx0XHRcdFx0YlNpZGVFZmZlY3RzQ2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0YlRhcmdldENoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGlmICghYUVudGl0aWVzLmluY2x1ZGVzKHNOYXZpZ2F0aW9uUGF0aCkpIHtcblx0XHRcdFx0XHRcdGFFbnRpdGllcy5wdXNoKHNOYXZpZ2F0aW9uUGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWJUYXJnZXRDaGFuZ2VkKSB7XG5cdFx0XHRcdGFQcm9wZXJ0aWVzLnB1c2goc1Byb3BlcnR5UGF0aCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAoYlNpZGVFZmZlY3RzQ2hhbmdlZCkge1xuXHRcdFx0b1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcyA9IGFQcm9wZXJ0aWVzO1xuXHRcdFx0b1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgPSBhRW50aXRpZXMubWFwKHNOYXZpZ2F0aW9uUGF0aCA9PiB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHNOYXZpZ2F0aW9uUGF0aFxuXHRcdFx0XHR9O1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgYWN0aW9uIHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyBvbiBhY3Rpb25zXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIF9yZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3Qgb1NpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+ID0ge307XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBtRW50aXR5VHlwZS5hY3Rpb25zO1xuXHRcdGlmIChhQWN0aW9ucykge1xuXHRcdFx0T2JqZWN0LmtleXMoYUFjdGlvbnMpLmZvckVhY2goc0FjdGlvbk5hbWUgPT4ge1xuXHRcdFx0XHRjb25zdCBvQWN0aW9uID0gbUVudGl0eVR5cGUuYWN0aW9uc1tzQWN0aW9uTmFtZV07XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJBY3Rpb25zOiBTdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRsZXQgcGF0aEV4cHJlc3Npb25zOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRcdGxldCBhVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXG5cdFx0XHRcdHRoaXMuX2dldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShvQWN0aW9uKS5mb3JFYWNoKG9TaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0XHRjb25zdCBzVHJpZ2dlckFjdGlvbiA9IG9TaWRlRWZmZWN0LlRyaWdnZXJBY3Rpb247XG5cdFx0XHRcdFx0YVRhcmdldHMgPSBhVGFyZ2V0cy5jb25jYXQob1NpZGVFZmZlY3QuVGFyZ2V0RW50aXRpZXMgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3QuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pO1xuXHRcdFx0XHRcdGlmIChzVHJpZ2dlckFjdGlvbiAmJiB0cmlnZ2VyQWN0aW9ucy5pbmRleE9mKHNUcmlnZ2VyQWN0aW9uKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25zLnB1c2goc1RyaWdnZXJBY3Rpb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHBhdGhFeHByZXNzaW9ucyA9IHRoaXMuX3JlbW92ZUR1cGxpY2F0ZVRhcmdldHMoYVRhcmdldHMpO1xuXHRcdFx0XHRvU2lkZUVmZmVjdHNbc0FjdGlvbk5hbWVdID0geyBwYXRoRXhwcmVzc2lvbnMsIHRyaWdnZXJBY3Rpb25zIH07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIG9TaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzIGVudGl0eSB0eXBlIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHNcblx0ICogcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGhcblx0ICogZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEVudGl0eSB0eXBlIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHByaXZhdGUgX3JldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhtRW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3Qgb0VudGl0eVNpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4gPSB7fTtcblx0XHR0aGlzLl9nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UobUVudGl0eVR5cGUpLmZvckVhY2gob1NpZGVFZmZlY3RzID0+IHtcblx0XHRcdG9FbnRpdHlTaWRlRWZmZWN0c1tvU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSA9IG9TaWRlRWZmZWN0cztcblx0XHR9KTtcblx0XHRyZXR1cm4gb0VudGl0eVNpZGVFZmZlY3RzO1xuXHR9XG5cblx0Z2V0SW50ZXJmYWNlKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cblxuY2xhc3MgU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeSBleHRlbmRzIFNlcnZpY2VGYWN0b3J5PFNpZGVFZmZlY3RzU2V0dGluZ3M+IHtcblx0Y3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0OiBTZXJ2aWNlQ29udGV4dDxTaWRlRWZmZWN0c1NldHRpbmdzPikge1xuXHRcdGNvbnN0IFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UgPSBuZXcgU2lkZUVmZmVjdHNTZXJ2aWNlKG9TZXJ2aWNlQ29udGV4dCk7XG5cdFx0cmV0dXJuIFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UuaW5pdFByb21pc2U7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ServiceFactory, Service, ServiceContext } from "sap/ui/core/service";
|
|
2
|
-
import { ConverterOutput, EntityType, NavigationProperty, Property } from "@sap-ux/annotation-converter";
|
|
2
|
+
import { ComplexType, ConverterOutput, EntityType, NavigationProperty, Property } from "@sap-ux/annotation-converter";
|
|
3
3
|
import { Context, ODataMetaModel } from "sap/ui/model/odata/v4";
|
|
4
4
|
import { convertTypes, EnvironmentCapabilities } from "sap/fe/core/converters/MetaModelConverter";
|
|
5
5
|
import { CommonAnnotationTypes, QualifiedName } from "@sap-ux/vocabularies-types/dist/generated/Common";
|
|
@@ -259,6 +259,7 @@ class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
259
259
|
public requestSideEffectsForNavigationProperty(sNavigationProperty: string, oContext: Context): Promise<any> {
|
|
260
260
|
const sBaseEntityType = this.getEntityTypeFromContext(oContext);
|
|
261
261
|
if (sBaseEntityType) {
|
|
262
|
+
const sNavigationPath = sNavigationProperty + "/";
|
|
262
263
|
const aSideEffects = this.getODataEntitySideEffects(sBaseEntityType);
|
|
263
264
|
let aTargets: SideEffectsTarget[] = [];
|
|
264
265
|
Object.keys(aSideEffects)
|
|
@@ -267,9 +268,13 @@ class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
267
268
|
sAnnotationName => {
|
|
268
269
|
const oSideEffects: ODataSideEffectsType = aSideEffects[sAnnotationName];
|
|
269
270
|
return (
|
|
270
|
-
(oSideEffects.SourceProperties || []).some(
|
|
271
|
-
|
|
272
|
-
|
|
271
|
+
(oSideEffects.SourceProperties || []).some(oPropertyPath => {
|
|
272
|
+
const sPropertyPath = oPropertyPath.value;
|
|
273
|
+
return (
|
|
274
|
+
sPropertyPath.startsWith(sNavigationPath) &&
|
|
275
|
+
sPropertyPath.replace(sNavigationPath, "").indexOf("/") === -1
|
|
276
|
+
);
|
|
277
|
+
}) ||
|
|
273
278
|
(oSideEffects.SourceEntities || []).some(
|
|
274
279
|
oNavigationPropertyPath => oNavigationPropertyPath.value === sNavigationProperty
|
|
275
280
|
)
|
|
@@ -333,7 +338,7 @@ class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
333
338
|
// mTarget can be an entity type, navigationProperty or or a complexType
|
|
334
339
|
const aTargetEntityProperties: Property[] =
|
|
335
340
|
(mTarget as EntityType).entityProperties ||
|
|
336
|
-
(mTarget as Property).targetType?.properties ||
|
|
341
|
+
((mTarget as Property).targetType as ComplexType)?.properties ||
|
|
337
342
|
(mTarget as NavigationProperty).targetType.entityProperties;
|
|
338
343
|
if (aTargetEntityProperties) {
|
|
339
344
|
if (bIsStarProperty) {
|
|
@@ -514,7 +519,7 @@ class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
514
519
|
mTarget = mTarget.map((mProperty: any) => {
|
|
515
520
|
const bNavigationPropertyPath = mProperty.$NavigationPropertyPath !== undefined; // Need to test with undefined since mProperty.$NavigationPropertyPath could be "" (empty string)
|
|
516
521
|
const sValue = (bNavigationPropertyPath ? mProperty.$NavigationPropertyPath : mProperty).replace(
|
|
517
|
-
new RegExp("^" + sBindingParameterName + "
|
|
522
|
+
new RegExp("^" + sBindingParameterName + "/?"),
|
|
518
523
|
""
|
|
519
524
|
);
|
|
520
525
|
return bNavigationPropertyPath ? { $NavigationPropertyPath: sValue } : sValue;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* SAPUI5
|
|
3
|
-
* (c) Copyright 2009-
|
|
3
|
+
* (c) Copyright 2009-2022 SAP SE. All rights reserved.
|
|
4
4
|
*/
|
|
5
5
|
sap.ui.define(
|
|
6
6
|
[
|
|
@@ -17,7 +17,8 @@ sap.ui.define(
|
|
|
17
17
|
"sap/fe/core/helpers/DynamicAnnotationPathHelper",
|
|
18
18
|
"sap/ui/core/cache/CacheManager",
|
|
19
19
|
"sap/ui/VersionInfo",
|
|
20
|
-
"sap/ui/Device"
|
|
20
|
+
"sap/ui/Device",
|
|
21
|
+
"sap/base/util/UriParameters"
|
|
21
22
|
],
|
|
22
23
|
function(
|
|
23
24
|
Service,
|
|
@@ -33,7 +34,8 @@ sap.ui.define(
|
|
|
33
34
|
DynamicAnnotationPathHelper,
|
|
34
35
|
CacheManager,
|
|
35
36
|
VersionInfo,
|
|
36
|
-
Device
|
|
37
|
+
Device,
|
|
38
|
+
UriParameters
|
|
37
39
|
) {
|
|
38
40
|
"use strict";
|
|
39
41
|
|
|
@@ -363,7 +365,8 @@ sap.ui.define(
|
|
|
363
365
|
contentDensities: oManifestContent["sap.ui5"].contentDensities,
|
|
364
366
|
resourceBundle: oResourceModel.__bundle,
|
|
365
367
|
fullContextPath: sFullContextPath,
|
|
366
|
-
isDesktop: Device.system.desktop
|
|
368
|
+
isDesktop: Device.system.desktop,
|
|
369
|
+
isPhone: Device.system.phone
|
|
367
370
|
};
|
|
368
371
|
|
|
369
372
|
if (oComponent.getViewData) {
|
|
@@ -373,6 +376,12 @@ sap.ui.define(
|
|
|
373
376
|
var oShellServices = oAppComponent.getShellServices();
|
|
374
377
|
mViewData.converterType = sConverterType;
|
|
375
378
|
mViewData.shellContentDensity = oShellServices.getContentDensity();
|
|
379
|
+
mViewData.useNewLazyLoading =
|
|
380
|
+
UriParameters.fromQuery(window.location.search).get("sap-fe-xx-lazyloadingtest") === "true";
|
|
381
|
+
mViewData.retrieveTextFromValueList =
|
|
382
|
+
oManifestContent["sap.fe"] && oManifestContent["sap.fe"].form
|
|
383
|
+
? oManifestContent["sap.fe"].form.retrieveTextFromValueList
|
|
384
|
+
: undefined;
|
|
376
385
|
oViewDataModel = new JSONModel(mViewData);
|
|
377
386
|
if (mViewData && mViewData.controlConfiguration) {
|
|
378
387
|
Object.keys(mViewData.controlConfiguration).forEach(function(sAnnotationPath) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* SAPUI5
|
|
3
|
-
* (c) Copyright 2009-
|
|
3
|
+
* (c) Copyright 2009-2022 SAP SE. All rights reserved.
|
|
4
4
|
*/
|
|
5
5
|
sap.ui.define(["sap/ui/core/mvc/Controller", "sap/fe/core/controllerextensions/InternalRouting"], function(Controller, InternalRouting) {
|
|
6
6
|
"use strict";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/fe/core/support/CommonHelper", "sap/fe/core/converters/helpers/IssueManager"], function (CommonHelper, IssueManager) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _exports = {};
|
|
9
|
+
var IssueCategory = IssueManager.IssueCategory;
|
|
10
|
+
var Audiences = CommonHelper.Audiences;
|
|
11
|
+
var getIssueByCategory = CommonHelper.getIssueByCategory;
|
|
12
|
+
var Categories = CommonHelper.Categories;
|
|
13
|
+
|
|
14
|
+
var oInvalidAnnotationColumnKey = {
|
|
15
|
+
id: "invalidAnnotationColumnKey",
|
|
16
|
+
title: "AnnotationColumnKey: Invalid Key",
|
|
17
|
+
minversion: "1.98",
|
|
18
|
+
audiences: [Audiences.Application],
|
|
19
|
+
categories: [Categories.Usage],
|
|
20
|
+
description: "The key of the annotation column is needed as a valid identifier in the application manifest.",
|
|
21
|
+
resolution: "A column key set in the application manifest must correspond to an existing annotation column.",
|
|
22
|
+
resolutionurls: [{
|
|
23
|
+
"text": "InvalidAnnotationColumnKey",
|
|
24
|
+
"href": "https://ui5.sap.com/#/topic/d525522c1bf54672ae4e02d66b38e60c"
|
|
25
|
+
}],
|
|
26
|
+
check: function (oIssueManager, oCoreFacade) {
|
|
27
|
+
getIssueByCategory(oIssueManager, oCoreFacade, IssueCategory.Manifest, "InvalidKey");
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
function getRules() {
|
|
32
|
+
return [oInvalidAnnotationColumnKey];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
_exports.getRules = getRules;
|
|
36
|
+
return _exports;
|
|
37
|
+
}, false);
|
|
38
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkludmFsaWRBbm5vdGF0aW9uQ29sdW1uS2V5LnN1cHBvcnQudHMiXSwibmFtZXMiOlsib0ludmFsaWRBbm5vdGF0aW9uQ29sdW1uS2V5IiwiaWQiLCJ0aXRsZSIsIm1pbnZlcnNpb24iLCJhdWRpZW5jZXMiLCJBdWRpZW5jZXMiLCJBcHBsaWNhdGlvbiIsImNhdGVnb3JpZXMiLCJDYXRlZ29yaWVzIiwiVXNhZ2UiLCJkZXNjcmlwdGlvbiIsInJlc29sdXRpb24iLCJyZXNvbHV0aW9udXJscyIsImNoZWNrIiwib0lzc3VlTWFuYWdlciIsIm9Db3JlRmFjYWRlIiwiZ2V0SXNzdWVCeUNhdGVnb3J5IiwiSXNzdWVDYXRlZ29yeSIsIk1hbmlmZXN0IiwiZ2V0UnVsZXMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFBQSxNQUFNQSwyQkFBMkIsR0FBRztBQUNuQ0MsSUFBQUEsRUFBRSxFQUFFLDRCQUQrQjtBQUVuQ0MsSUFBQUEsS0FBSyxFQUFFLGtDQUY0QjtBQUduQ0MsSUFBQUEsVUFBVSxFQUFFLE1BSHVCO0FBSW5DQyxJQUFBQSxTQUFTLEVBQUUsQ0FBQ0MsU0FBUyxDQUFDQyxXQUFYLENBSndCO0FBS25DQyxJQUFBQSxVQUFVLEVBQUUsQ0FBQ0MsVUFBVSxDQUFDQyxLQUFaLENBTHVCO0FBTW5DQyxJQUFBQSxXQUFXLEVBQUUsK0ZBTnNCO0FBT25DQyxJQUFBQSxVQUFVLEVBQUUsZ0dBUHVCO0FBUW5DQyxJQUFBQSxjQUFjLEVBQUUsQ0FBQztBQUFFLGNBQVEsNEJBQVY7QUFBd0MsY0FBUTtBQUFoRCxLQUFELENBUm1CO0FBU25DQyxJQUFBQSxLQUFLLEVBQUUsVUFBU0MsYUFBVCxFQUE2QkMsV0FBN0IsRUFBK0Q7QUFDckVDLE1BQUFBLGtCQUFrQixDQUFDRixhQUFELEVBQWdCQyxXQUFoQixFQUE2QkUsYUFBYSxDQUFDQyxRQUEzQyxFQUFxRCxZQUFyRCxDQUFsQjtBQUNBO0FBWGtDLEdBQXBDOztBQWFPLFdBQVNDLFFBQVQsR0FBb0I7QUFDMUIsV0FBTyxDQUFDbkIsMkJBQUQsQ0FBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYXRlZ29yaWVzLCBnZXRJc3N1ZUJ5Q2F0ZWdvcnksIEF1ZGllbmNlcyB9IGZyb20gXCJzYXAvZmUvY29yZS9zdXBwb3J0L0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5jb25zdCBvSW52YWxpZEFubm90YXRpb25Db2x1bW5LZXkgPSB7XG5cdGlkOiBcImludmFsaWRBbm5vdGF0aW9uQ29sdW1uS2V5XCIsXG5cdHRpdGxlOiBcIkFubm90YXRpb25Db2x1bW5LZXk6IEludmFsaWQgS2V5XCIsXG5cdG1pbnZlcnNpb246IFwiMS45OFwiLFxuXHRhdWRpZW5jZXM6IFtBdWRpZW5jZXMuQXBwbGljYXRpb25dLFxuXHRjYXRlZ29yaWVzOiBbQ2F0ZWdvcmllcy5Vc2FnZV0sXG5cdGRlc2NyaXB0aW9uOiBcIlRoZSBrZXkgb2YgdGhlIGFubm90YXRpb24gY29sdW1uIGlzIG5lZWRlZCBhcyBhIHZhbGlkIGlkZW50aWZpZXIgaW4gdGhlIGFwcGxpY2F0aW9uIG1hbmlmZXN0LlwiLFxuXHRyZXNvbHV0aW9uOiBcIkEgY29sdW1uIGtleSBzZXQgaW4gdGhlIGFwcGxpY2F0aW9uIG1hbmlmZXN0IG11c3QgY29ycmVzcG9uZCB0byBhbiBleGlzdGluZyBhbm5vdGF0aW9uIGNvbHVtbi5cIixcblx0cmVzb2x1dGlvbnVybHM6IFt7IFwidGV4dFwiOiBcIkludmFsaWRBbm5vdGF0aW9uQ29sdW1uS2V5XCIsIFwiaHJlZlwiOiBcImh0dHBzOi8vdWk1LnNhcC5jb20vIy90b3BpYy9kNTI1NTIyYzFiZjU0NjcyYWU0ZTAyZDY2YjM4ZTYwY1wiIH1dLFxuXHRjaGVjazogZnVuY3Rpb24ob0lzc3VlTWFuYWdlcjogYW55LCBvQ29yZUZhY2FkZTogYW55IC8qb1Njb3BlOiBhbnkqLykge1xuXHRcdGdldElzc3VlQnlDYXRlZ29yeShvSXNzdWVNYW5hZ2VyLCBvQ29yZUZhY2FkZSwgSXNzdWVDYXRlZ29yeS5NYW5pZmVzdCwgXCJJbnZhbGlkS2V5XCIpO1xuXHR9XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bGVzKCkge1xuXHRyZXR1cm4gW29JbnZhbGlkQW5ub3RhdGlvbkNvbHVtbktleV07XG59XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Categories, getIssueByCategory, Audiences } from "sap/fe/core/support/CommonHelper";
|
|
2
|
+
import { IssueCategory } from "sap/fe/core/converters/helpers/IssueManager";
|
|
3
|
+
const oInvalidAnnotationColumnKey = {
|
|
4
|
+
id: "invalidAnnotationColumnKey",
|
|
5
|
+
title: "AnnotationColumnKey: Invalid Key",
|
|
6
|
+
minversion: "1.98",
|
|
7
|
+
audiences: [Audiences.Application],
|
|
8
|
+
categories: [Categories.Usage],
|
|
9
|
+
description: "The key of the annotation column is needed as a valid identifier in the application manifest.",
|
|
10
|
+
resolution: "A column key set in the application manifest must correspond to an existing annotation column.",
|
|
11
|
+
resolutionurls: [{ "text": "InvalidAnnotationColumnKey", "href": "https://ui5.sap.com/#/topic/d525522c1bf54672ae4e02d66b38e60c" }],
|
|
12
|
+
check: function(oIssueManager: any, oCoreFacade: any /*oScope: any*/) {
|
|
13
|
+
getIssueByCategory(oIssueManager, oCoreFacade, IssueCategory.Manifest, "InvalidKey");
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
export function getRules() {
|
|
17
|
+
return [oInvalidAnnotationColumnKey];
|
|
18
|
+
}
|