@sapui5/sap.fe.core 1.141.2 → 1.142.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +4 -1
- package/src/sap/fe/core/ActionRuntime.js +48 -23
- package/src/sap/fe/core/ActionRuntime.ts +61 -35
- package/src/sap/fe/core/AppComponent.js +76 -6
- package/src/sap/fe/core/AppComponent.ts +94 -8
- package/src/sap/fe/core/AppStateHandler.js +9 -8
- package/src/sap/fe/core/AppStateHandler.ts +13 -9
- package/src/sap/fe/core/BaseController.js +8 -5
- package/src/sap/fe/core/BaseController.ts +6 -1
- package/src/sap/fe/core/CommonUtils.js +4 -123
- package/src/sap/fe/core/CommonUtils.ts +3 -172
- package/src/sap/fe/core/ExtensionAPI.js +3 -10
- package/src/sap/fe/core/ExtensionAPI.ts +2 -14
- package/src/sap/fe/core/PageController.js +64 -43
- package/src/sap/fe/core/PageController.ts +62 -47
- package/src/sap/fe/core/TemplateComponent.js +20 -1
- package/src/sap/fe/core/TemplateComponent.ts +24 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +37 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +47 -31
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +4 -0
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +4 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +3 -0
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +4 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -0
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +7 -5
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +22 -2
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +82 -39
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +91 -54
- package/src/sap/fe/core/controllerextensions/EditFlow.js +25 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +27 -3
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +9 -7
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +17 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +37 -18
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +49 -17
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +30 -15
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +32 -14
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +9 -10
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +8 -9
- package/src/sap/fe/core/controllerextensions/Paginator.js +2 -2
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.js +10 -2
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +5 -1
- package/src/sap/fe/core/controllerextensions/Recommendations.js +3 -3
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +2 -2
- package/src/sap/fe/core/controllerextensions/Routing.js +9 -5
- package/src/sap/fe/core/controllerextensions/Routing.ts +7 -7
- package/src/sap/fe/core/controllerextensions/Share.js +5 -5
- package/src/sap/fe/core/controllerextensions/Share.ts +4 -4
- package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +17 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +3 -2
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +33 -11
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +45 -14
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +37 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +41 -8
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +10 -4
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +6 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +7 -7
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +6 -5
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.js +2 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/OperationParameters.ts +1 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +10 -6
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +6 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +11 -9
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +22 -9
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +9 -4
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +10 -4
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.js +31 -2
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.tsx +34 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +7 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +37 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +29 -9
- package/src/sap/fe/core/converters/ManifestWrapper.ts +29 -11
- package/src/sap/fe/core/converters/annotations/DataField.js +46 -19
- package/src/sap/fe/core/converters/annotations/DataField.ts +93 -19
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +88 -35
- package/src/sap/fe/core/converters/controls/Common/Action.js +57 -20
- package/src/sap/fe/core/converters/controls/Common/Action.ts +71 -21
- package/src/sap/fe/core/converters/controls/Common/Chart.js +13 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +20 -4
- package/src/sap/fe/core/converters/controls/Common/Form.js +18 -3
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js +89 -57
- package/src/sap/fe/core/converters/controls/Common/Table.ts +110 -56
- package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.js +243 -0
- package/src/sap/fe/core/converters/controls/Common/filter/FilterRestrictions.ts +309 -0
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +142 -58
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +172 -78
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +12 -18
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +13 -27
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +7 -16
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +6 -17
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +16 -5
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +16 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -2
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +11 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +27 -3
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +28 -1
- package/src/sap/fe/core/converters/helpers/ID.js +3 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +5 -2
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +7 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +11 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +12 -4
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +19 -8
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +18 -7
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +8 -3
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +7 -2
- package/src/sap/fe/core/formatters/FPMFormatter.js +2 -2
- package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
- package/src/sap/fe/core/fpm/Component.js +8 -1
- package/src/sap/fe/core/fpm/Component.ts +8 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +79 -25
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +91 -32
- package/src/sap/fe/core/helpers/ManifestHelper.js +6 -3
- package/src/sap/fe/core/helpers/ManifestHelper.ts +3 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.js +12 -3
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +11 -3
- package/src/sap/fe/core/helpers/ModelHelper.js +48 -9
- package/src/sap/fe/core/helpers/ModelHelper.ts +55 -10
- package/src/sap/fe/core/helpers/TypeGuards.js +12 -2
- package/src/sap/fe/core/helpers/TypeGuards.ts +10 -1
- package/src/sap/fe/core/helpers/WebSocket.js +6 -7
- package/src/sap/fe/core/helpers/WebSocket.ts +10 -6
- package/src/sap/fe/core/library.js +30 -3
- package/src/sap/fe/core/library.ts +28 -1
- package/src/sap/fe/core/messagebundle.properties +8 -1
- package/src/sap/fe/core/messagebundle_ar.properties +7 -0
- package/src/sap/fe/core/messagebundle_bg.properties +10 -3
- package/src/sap/fe/core/messagebundle_ca.properties +7 -0
- package/src/sap/fe/core/messagebundle_cnr.properties +7 -0
- package/src/sap/fe/core/messagebundle_cs.properties +7 -0
- package/src/sap/fe/core/messagebundle_cy.properties +8 -1
- package/src/sap/fe/core/messagebundle_da.properties +7 -0
- package/src/sap/fe/core/messagebundle_de.properties +7 -0
- package/src/sap/fe/core/messagebundle_el.properties +7 -0
- package/src/sap/fe/core/messagebundle_en.properties +8 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +7 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +5 -0
- package/src/sap/fe/core/messagebundle_es.properties +8 -1
- package/src/sap/fe/core/messagebundle_es_MX.properties +7 -0
- package/src/sap/fe/core/messagebundle_et.properties +7 -0
- package/src/sap/fe/core/messagebundle_fi.properties +7 -0
- package/src/sap/fe/core/messagebundle_fr.properties +16 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +7 -0
- package/src/sap/fe/core/messagebundle_hi.properties +8 -1
- package/src/sap/fe/core/messagebundle_hr.properties +7 -0
- package/src/sap/fe/core/messagebundle_hu.properties +7 -0
- package/src/sap/fe/core/messagebundle_id.properties +7 -0
- package/src/sap/fe/core/messagebundle_it.properties +7 -0
- package/src/sap/fe/core/messagebundle_iw.properties +7 -0
- package/src/sap/fe/core/messagebundle_ja.properties +8 -1
- package/src/sap/fe/core/messagebundle_kk.properties +7 -0
- package/src/sap/fe/core/messagebundle_ko.properties +7 -0
- package/src/sap/fe/core/messagebundle_lt.properties +7 -0
- package/src/sap/fe/core/messagebundle_lv.properties +7 -0
- package/src/sap/fe/core/messagebundle_mk.properties +7 -0
- package/src/sap/fe/core/messagebundle_ms.properties +7 -0
- package/src/sap/fe/core/messagebundle_nl.properties +7 -0
- package/src/sap/fe/core/messagebundle_no.properties +7 -0
- package/src/sap/fe/core/messagebundle_pl.properties +7 -0
- package/src/sap/fe/core/messagebundle_pt.properties +7 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -0
- package/src/sap/fe/core/messagebundle_ro.properties +7 -0
- package/src/sap/fe/core/messagebundle_ru.properties +7 -0
- package/src/sap/fe/core/messagebundle_sh.properties +7 -0
- package/src/sap/fe/core/messagebundle_sk.properties +7 -0
- package/src/sap/fe/core/messagebundle_sl.properties +7 -0
- package/src/sap/fe/core/messagebundle_sr.properties +7 -0
- package/src/sap/fe/core/messagebundle_sv.properties +7 -0
- package/src/sap/fe/core/messagebundle_th.properties +7 -0
- package/src/sap/fe/core/messagebundle_tr.properties +7 -0
- package/src/sap/fe/core/messagebundle_uk.properties +7 -0
- package/src/sap/fe/core/messagebundle_vi.properties +7 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +8 -1
- package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -0
- package/src/sap/fe/core/rootView/Fcl.controller.js +21 -7
- package/src/sap/fe/core/rootView/Fcl.controller.ts +28 -6
- package/src/sap/fe/core/rootView/RootViewBaseController.js +96 -88
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +106 -96
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +14 -10
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +15 -10
- package/src/sap/fe/core/services/RoutingServiceFactory.js +16 -7
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +23 -10
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +9 -7
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +13 -8
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +62 -6
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +74 -11
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +33 -15
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +31 -11
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +4 -5
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +4 -6
- package/src/sap/fe/core/templating/UIFormatters.js +17 -2
- package/src/sap/fe/core/templating/UIFormatters.ts +25 -1
- package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.js +10 -0
- package/src/sap/fe/core/types/sap.fe.core-auto-ext.d.ts +369 -0
- package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.js +9 -0
- package/src/sap/fe/core/types/sap.fe.core-manual-ext.d.ts +49 -0
- package/ui5.yaml +2 -0
|
@@ -7,6 +7,8 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
9
9
|
var isReferencePropertyStaticallyHidden = DataFieldHelper.isReferencePropertyStaticallyHidden;
|
|
10
|
+
var getConnectedFieldsSeparator = DataFieldHelper.getConnectedFieldsSeparator;
|
|
11
|
+
var getConnectedFieldsData = DataFieldHelper.getConnectedFieldsData;
|
|
10
12
|
var getContextRelativeTargetObjectPath = DataModelPathHelper.getContextRelativeTargetObjectPath;
|
|
11
13
|
var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
|
|
12
14
|
var hasStaticPercentUnit = PropertyHelper.hasStaticPercentUnit;
|
|
@@ -107,12 +109,23 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
107
109
|
return isAnnotationOfType(dataFieldTarget, "com.sap.vocabularies.UI.v1.FieldGroupType");
|
|
108
110
|
}
|
|
109
111
|
|
|
112
|
+
/**
|
|
113
|
+
* Determines if the dataFieldForAnnotation points to a connectedFields annotation.
|
|
114
|
+
* @param dataFieldForAnnotation The dataFieldForAnnotation being processed
|
|
115
|
+
* @returns True if the dataFieldForAnnotation points to a connectedFields annotation.
|
|
116
|
+
*/
|
|
117
|
+
_exports.hasFieldGroupTarget = hasFieldGroupTarget;
|
|
118
|
+
function hasConnectedFieldsTarget(dataFieldForAnnotation) {
|
|
119
|
+
const dataFieldTarget = dataFieldForAnnotation.Target.$target;
|
|
120
|
+
return isAnnotationOfType(dataFieldTarget, "com.sap.vocabularies.UI.v1.ConnectedFieldsType");
|
|
121
|
+
}
|
|
122
|
+
|
|
110
123
|
/**
|
|
111
124
|
* Determines if the dataFieldForAnnotation is a field group.
|
|
112
125
|
* @param dataFieldForAnnotation The dataFieldForAnnotation being processed
|
|
113
126
|
* @returns True if the dataFieldForAnnotation is a field group.
|
|
114
127
|
*/
|
|
115
|
-
_exports.
|
|
128
|
+
_exports.hasConnectedFieldsTarget = hasConnectedFieldsTarget;
|
|
116
129
|
function hasIdentificationTarget(dataFieldForAnnotation) {
|
|
117
130
|
const dataFieldTarget = dataFieldForAnnotation.Target.$target;
|
|
118
131
|
return isAnnotationOfTerm(dataFieldTarget, "com.sap.vocabularies.UI.v1.Identification");
|
|
@@ -329,6 +342,8 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
329
342
|
};
|
|
330
343
|
let addUnitInTemplate = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;
|
|
331
344
|
let isAnnotatedAsHidden = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
|
|
345
|
+
let connectedFieldsSeparator = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : undefined;
|
|
346
|
+
const isPartOfaConnectedFields = !!connectedFieldsSeparator;
|
|
332
347
|
if (path && property) {
|
|
333
348
|
let valueIndex;
|
|
334
349
|
/* EXTERNALID */
|
|
@@ -337,7 +352,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
337
352
|
if (isAnnotatedAsHidden) {
|
|
338
353
|
// Collect underlying property
|
|
339
354
|
valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
|
|
340
|
-
_appendTemplate(relatedProperties, `{${valueIndex}}`);
|
|
355
|
+
_appendTemplate(relatedProperties, isPartOfaConnectedFields && relatedProperties.exportSettings?.template ? `${connectedFieldsSeparator}{${valueIndex}}` : `{${valueIndex}}`);
|
|
341
356
|
return relatedProperties;
|
|
342
357
|
}
|
|
343
358
|
const navigationPathPrefix = _getNavigationPathPrefix(path);
|
|
@@ -356,8 +371,11 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
356
371
|
const textRelativePath = getContextRelativeTargetObjectPath(textPropertyDataModelObjectPath);
|
|
357
372
|
if (relatedProperties.exportSettings?.template) {
|
|
358
373
|
// FieldGroup use-case. Need to add each Field in new line.
|
|
359
|
-
|
|
360
|
-
relatedProperties
|
|
374
|
+
// ConnectedFields use-case. Need to add the separator between the Fields that stay on the same line.
|
|
375
|
+
_appendTemplate(relatedProperties, isPartOfaConnectedFields ? connectedFieldsSeparator : "\n");
|
|
376
|
+
if (!connectedFieldsSeparator) {
|
|
377
|
+
relatedProperties.exportSettings.wrap = true;
|
|
378
|
+
}
|
|
361
379
|
}
|
|
362
380
|
|
|
363
381
|
// The text arrangement will be considered only if the text property is groupable
|
|
@@ -367,32 +385,32 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
367
385
|
const pathForText = externalIdPath ? externalIdPath : path;
|
|
368
386
|
const propertyForText = externalIdProperty ? externalIdProperty : property;
|
|
369
387
|
// Check for Text Arrangement.
|
|
370
|
-
const displayMode = getDisplayMode(propertyForText, propertyDataModelObjectPath);
|
|
388
|
+
const displayMode = getDisplayMode(propertyForText, propertyDataModelObjectPath.targetEntityType);
|
|
371
389
|
let descriptionIndex;
|
|
372
390
|
switch (displayMode) {
|
|
373
391
|
case "Description":
|
|
374
392
|
descriptionIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, textRelativePath, textProperty, "Description");
|
|
375
|
-
_appendTemplate(relatedProperties, `{${descriptionIndex}}`);
|
|
393
|
+
_appendTemplate(relatedProperties, isPartOfaConnectedFields && relatedProperties.exportSettings?.template ? `${connectedFieldsSeparator}{${descriptionIndex}}` : `{${descriptionIndex}}`);
|
|
376
394
|
break;
|
|
377
395
|
case "ValueDescription":
|
|
378
396
|
valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, pathForText, propertyForText);
|
|
379
397
|
descriptionIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, textRelativePath, textProperty, "ValueDescription");
|
|
380
|
-
_appendTemplate(relatedProperties, `{${valueIndex}} ({${descriptionIndex}})`);
|
|
398
|
+
_appendTemplate(relatedProperties, isPartOfaConnectedFields && relatedProperties.exportSettings?.template ? `${connectedFieldsSeparator}{${valueIndex}} ({${descriptionIndex}})` : `{${valueIndex}} ({${descriptionIndex}})`);
|
|
381
399
|
break;
|
|
382
400
|
case "DescriptionValue":
|
|
383
401
|
valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, pathForText, propertyForText);
|
|
384
402
|
descriptionIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, textRelativePath, textProperty, "DescriptionValue");
|
|
385
|
-
_appendTemplate(relatedProperties, `{${descriptionIndex}} ({${valueIndex}})`);
|
|
403
|
+
_appendTemplate(relatedProperties, isPartOfaConnectedFields && relatedProperties.exportSettings?.template ? `${connectedFieldsSeparator}{${descriptionIndex}} ({${valueIndex}})` : `{${descriptionIndex}} ({${valueIndex}})`);
|
|
386
404
|
break;
|
|
387
405
|
default:
|
|
388
406
|
valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, pathForText, propertyForText);
|
|
389
|
-
_appendTemplate(relatedProperties, `{${valueIndex}}`);
|
|
407
|
+
_appendTemplate(relatedProperties, isPartOfaConnectedFields && relatedProperties.exportSettings?.template ? `${connectedFieldsSeparator}{${valueIndex}}` : `{${valueIndex}}`);
|
|
390
408
|
break;
|
|
391
409
|
}
|
|
392
410
|
} else {
|
|
393
411
|
// Collect underlying property
|
|
394
412
|
valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
|
|
395
|
-
_appendTemplate(relatedProperties, `{${valueIndex}}`);
|
|
413
|
+
_appendTemplate(relatedProperties, isPartOfaConnectedFields && relatedProperties.exportSettings?.template ? `${connectedFieldsSeparator}{${valueIndex}}` : `{${valueIndex}}`);
|
|
396
414
|
}
|
|
397
415
|
} else {
|
|
398
416
|
// Check for field containing Currency Or Unit Properties or Timezone
|
|
@@ -403,7 +421,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
403
421
|
const timezoneProperty = getAssociatedTimezoneProperty(property);
|
|
404
422
|
const timezoneAnnotation = property?.annotations?.Common?.Timezone;
|
|
405
423
|
if (currencyOrUoMProperty) {
|
|
406
|
-
collectCurrencyOrUnitProperties(relatedProperties, relativePath ?? path, addUnitInTemplate, propertyDataModelObjectPath, currencyOrUoMProperty, currencyProperty);
|
|
424
|
+
collectCurrencyOrUnitProperties(relatedProperties, relativePath ?? path, addUnitInTemplate, propertyDataModelObjectPath, currencyOrUoMProperty, isPartOfaConnectedFields, currencyProperty);
|
|
407
425
|
} else if (timezoneProperty && timezoneAnnotation?.$target) {
|
|
408
426
|
collectTimezoneProperties(property, relatedProperties, path, addUnitInTemplate);
|
|
409
427
|
} else if (property.Target?.$target?.$Type === "com.sap.vocabularies.UI.v1.DataPointType" && !property.Target?.$target?.ValueFormat || property.annotations?.UI?.DataFieldDefault?.Target?.$target?.$Type === "com.sap.vocabularies.UI.v1.DataPointType") {
|
|
@@ -412,12 +430,12 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
412
430
|
const contactProperty = property.fn?.$target;
|
|
413
431
|
const contactPropertyPath = property.fn?.path;
|
|
414
432
|
valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix ? navigationPathPrefix + contactPropertyPath : contactPropertyPath, contactProperty);
|
|
415
|
-
_appendTemplate(relatedProperties, `{${valueIndex}}`);
|
|
433
|
+
_appendTemplate(relatedProperties, isPartOfaConnectedFields && relatedProperties.exportSettings?.template ? `${connectedFieldsSeparator}{${valueIndex}}` : `{${valueIndex}}`);
|
|
416
434
|
} else if (!ignoreSelf) {
|
|
417
435
|
// Collect underlying property
|
|
418
436
|
valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
|
|
419
437
|
_appendTemplate(relatedProperties, `{${valueIndex}}`);
|
|
420
|
-
if (currencyOrUnitAnnotation) {
|
|
438
|
+
if (!isPartOfaConnectedFields && currencyOrUnitAnnotation) {
|
|
421
439
|
relatedProperties.exportSettings.unit = `${currencyOrUnitAnnotation}`; // Hard-coded currency/unit
|
|
422
440
|
if (property?.annotations?.Measures?.ISOCurrency) {
|
|
423
441
|
relatedProperties.exportSettings.isCurrency = true;
|
|
@@ -436,7 +454,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
436
454
|
// Collect underlying property if not collected already.
|
|
437
455
|
// This is to ensure that additionalProperties are made available only to complex property infos.
|
|
438
456
|
valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
|
|
439
|
-
_appendTemplate(relatedProperties, `{${valueIndex}}`);
|
|
457
|
+
_appendTemplate(relatedProperties, isPartOfaConnectedFields && relatedProperties.exportSettings?.template ? `${connectedFieldsSeparator}{${valueIndex}}` : `{${valueIndex}}`);
|
|
440
458
|
}
|
|
441
459
|
}
|
|
442
460
|
return relatedProperties;
|
|
@@ -523,7 +541,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
523
541
|
* @param currencyOrUoMProperty The currency or unit of measure property linked to the column.
|
|
524
542
|
* @param currencyProperty The currency property linked to the column.
|
|
525
543
|
*/
|
|
526
|
-
function collectCurrencyOrUnitProperties(relatedProperties, relativePath, addUnitInTemplate, propertyDataModelObjectPath, currencyOrUoMProperty, currencyProperty) {
|
|
544
|
+
function collectCurrencyOrUnitProperties(relatedProperties, relativePath, addUnitInTemplate, propertyDataModelObjectPath, currencyOrUoMProperty, isPartOfaConnectedFields, currencyProperty) {
|
|
527
545
|
const property = propertyDataModelObjectPath.targetObject;
|
|
528
546
|
if (property) {
|
|
529
547
|
const currencyOrUnitPropertyPath = getAssociatedCurrencyPropertyPath(property) || getAssociatedUnitPropertyPath(property);
|
|
@@ -536,10 +554,12 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
536
554
|
} else {
|
|
537
555
|
relatedProperties.exportSettings.unitProperty = unitOrCurrencyRelativePath;
|
|
538
556
|
}
|
|
539
|
-
if (currencyProperty) {
|
|
557
|
+
if (currencyProperty && !isPartOfaConnectedFields) {
|
|
540
558
|
relatedProperties.exportSettings.isCurrency = true;
|
|
541
559
|
}
|
|
542
|
-
|
|
560
|
+
if (!isPartOfaConnectedFields) {
|
|
561
|
+
relatedProperties.exportSettings.scale = property.scale;
|
|
562
|
+
}
|
|
543
563
|
}
|
|
544
564
|
}
|
|
545
565
|
|
|
@@ -560,6 +580,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
560
580
|
exportSettings: {}
|
|
561
581
|
};
|
|
562
582
|
let isEmbedded = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
583
|
+
let connectedFieldsSeparator = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : undefined;
|
|
563
584
|
let isStaticallyHidden = false;
|
|
564
585
|
switch (dataField?.$Type) {
|
|
565
586
|
case "com.sap.vocabularies.UI.v1.DataField":
|
|
@@ -570,7 +591,7 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
570
591
|
if (dataField.Value) {
|
|
571
592
|
const property = dataField.Value;
|
|
572
593
|
isStaticallyHidden = isReferencePropertyStaticallyHidden(dataField);
|
|
573
|
-
relatedProperties = collectRelatedProperties(property.path, property.$target, converterContext, false, tableType, relatedProperties, isEmbedded, isStaticallyHidden);
|
|
594
|
+
relatedProperties = collectRelatedProperties(property.path, property.$target, converterContext, false, tableType, relatedProperties, isEmbedded, isStaticallyHidden, connectedFieldsSeparator);
|
|
574
595
|
const navigationPathPrefix = _getNavigationPathPrefix(property.path);
|
|
575
596
|
relatedProperties = _collectAdditionalPropertiesForAnalyticalTable(dataField, navigationPathPrefix, tableType, relatedProperties);
|
|
576
597
|
}
|
|
@@ -585,6 +606,12 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
585
606
|
relatedProperties = collectRelatedPropertiesRecursively(innerDataField, converterContext, tableType, relatedProperties, true);
|
|
586
607
|
});
|
|
587
608
|
break;
|
|
609
|
+
case "com.sap.vocabularies.UI.v1.ConnectedFieldsType":
|
|
610
|
+
connectedFieldsSeparator = getConnectedFieldsSeparator(dataField.Target.$target);
|
|
611
|
+
getConnectedFieldsData(dataField.Target.$target).forEach(innerDataField => {
|
|
612
|
+
relatedProperties = collectRelatedPropertiesRecursively(innerDataField, converterContext, tableType, relatedProperties, true, connectedFieldsSeparator);
|
|
613
|
+
});
|
|
614
|
+
break;
|
|
588
615
|
case "com.sap.vocabularies.UI.v1.DataPointType":
|
|
589
616
|
isStaticallyHidden = isReferencePropertyStaticallyHidden(dataField);
|
|
590
617
|
relatedProperties = collectRelatedProperties(dataField.Target.$target.Value.path, dataField, converterContext, false, tableType, relatedProperties, isEmbedded, isStaticallyHidden);
|
|
@@ -646,4 +673,4 @@ sap.ui.define(["sap/fe/base/BindingToolkit", "sap/fe/core/converters/helpers/Agg
|
|
|
646
673
|
_exports.getDataFieldDataType = getDataFieldDataType;
|
|
647
674
|
return _exports;
|
|
648
675
|
}, false);
|
|
649
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJfZXhwb3J0cyIsImlzRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXAiLCIkVHlwZSIsImlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGQiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImRhdGFGaWVsZFRhcmdldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJoYXNJZGVudGlmaWNhdGlvblRhcmdldCIsImlzQW5ub3RhdGlvbk9mVGVybSIsImhhc0RhdGFQb2ludFRhcmdldCIsInZpc2libGVFeHByZXNzaW9uIiwiY29udmVydGVyQ29udGV4dCIsIm5vdCIsImVxdWFsIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhpZGRlbiIsInVuZGVmaW5lZCIsImdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24iLCJpc0RhdGFNb2RlbE9iamVjdFBhdGhGb3JBY3Rpb25XaXRoRGlhbG9nIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInRhcmdldCIsInRhcmdldE9iamVjdCIsImlzQWN0aW9uV2l0aERpYWxvZyIsImFjdGlvbiIsIkFjdGlvblRhcmdldCIsImJDcml0aWNhbCIsIkNvbW1vbiIsIklzQWN0aW9uQ3JpdGljYWwiLCJwYXJhbWV0ZXJzIiwibGVuZ3RoIiwiZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCIsInNvdXJjZSIsInRhcmdldFZhbHVlIiwiaXNQcm9wZXJ0eSIsImRhdGFQb2ludCIsIkRhdGFGaWVsZERlZmF1bHQiLCJUYXJnZXRWYWx1ZSIsIk1heGltdW1WYWx1ZSIsInRvU3RyaW5nIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0IiwicHJvcGVydHkiLCJpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdCIsIlZpc3VhbGl6YXRpb24iLCJpc0FQcm9ncmVzc1R5cGVGcm9tRGF0YVBvaW50IiwiZ2V0U2VtYW50aWNPYmplY3RQYXRoIiwib2JqZWN0IiwiVmFsdWUiLCJTZW1hbnRpY09iamVjdCIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgiLCJwYXRoIiwiaW5jbHVkZXMiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsIl9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUiLCJuYXZpZ2F0aW9uUGF0aFByZWZpeCIsInRhYmxlVHlwZSIsInJlbGF0ZWRQcm9wZXJ0aWVzIiwiaGlkZGVuQW5ub3RhdGlvbiIsImhpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGgiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImNyaXRpY2FsaXR5IiwiQ3JpdGljYWxpdHkiLCJjcml0aWNhbGl0eVByb3BlcnR5UGF0aCIsIl9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4Iiwia2V5IiwidmFsdWUiLCJkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiIsInByb3BlcnRpZXMiLCJhbm5vdGF0aW9uUHJvcGVydHkiLCJPYmplY3QiLCJrZXlzIiwiaW5kZXhPZiIsIl9hcHBlbmRUZW1wbGF0ZSIsImV4cG9ydFNldHRpbmdzIiwidGVtcGxhdGUiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJpZ25vcmVTZWxmIiwiYXJndW1lbnRzIiwiYWRkVW5pdEluVGVtcGxhdGUiLCJpc0Fubm90YXRlZEFzSGlkZGVuIiwidmFsdWVJbmRleCIsImV4dGVybmFsSWRQYXRoIiwiZ2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eVBhdGgiLCJleHRlcm5hbElkUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5IiwiZW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJhZ2dyZWdhdGlvbkhlbHBlciIsIkFnZ3JlZ2F0aW9uSGVscGVyIiwidGV4dFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSIsInRleHRQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsInJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwidGV4dFJlbGF0aXZlUGF0aCIsIndyYXAiLCJ0ZXh0QXJyYW5nZW1lbnRUb0JlQ29uc2lkZXJlZCIsImlzUHJvcGVydHlHcm91cGFibGUiLCJwYXRoRm9yVGV4dCIsInByb3BlcnR5Rm9yVGV4dCIsImRpc3BsYXlNb2RlIiwiZ2V0RGlzcGxheU1vZGUiLCJkZXNjcmlwdGlvbkluZGV4IiwiY3VycmVuY3lQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5IiwidW5pdFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSIsImN1cnJlbmN5T3JVb01Qcm9wZXJ0eSIsImN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbiIsIk1lYXN1cmVzIiwiSVNPQ3VycmVuY3kiLCJVbml0IiwidGltZXpvbmVQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5IiwidGltZXpvbmVBbm5vdGF0aW9uIiwiVGltZXpvbmUiLCJjb2xsZWN0Q3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzIiwiY29sbGVjdFRpbWV6b25lUHJvcGVydGllcyIsIlZhbHVlRm9ybWF0IiwiY29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMiLCJjb250YWN0UHJvcGVydHkiLCJmbiIsImNvbnRhY3RQcm9wZXJ0eVBhdGgiLCJ1bml0IiwiaXNDdXJyZW5jeSIsInRpbWV6b25lIiwiZ2V0RGF0YVBvaW50VmlzdWFsaXphdGlvbiIsImRhdGFQb2ludFByb3BlcnR5IiwiZGF0YXBvaW50VGFyZ2V0IiwiZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5IiwiZGF0YVBvaW50SW5kZXgiLCJuYW1lIiwiZGF0YVBvaW50VGFyZ2V0VmFsdWUiLCJoYXNTdGF0aWNQZXJjZW50VW5pdCIsInRpbWV6b25lT3JVb01JbmRleCIsImN1cnJlbmN5T3JVbml0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgiLCJ1bml0T3JDdXJyZW5jeVByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInVuaXRPckN1cnJlbmN5UmVsYXRpdmVQYXRoIiwiY3VycmVuY3lPclVvTUluZGV4Iiwic2NhbGUiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRW1iZWRkZWQiLCJpc1N0YXRpY2FsbHlIaWRkZW4iLCJpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiIsIkRhdGEiLCJmb3JFYWNoIiwiaW5uZXJEYXRhRmllbGQiLCJkYXRhRmllbGRDb250YWN0IiwiZ2V0RGF0YUZpZWxkRGF0YVR5cGUiLCJvRGF0YUZpZWxkIiwidHlwZSIsInNEYXRhVHlwZSIsIiRQYXRoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJEYXRhRmllbGQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uVGVybSwgRGVjaW1hbCwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBQcmltaXRpdmVUeXBlLCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb250YWN0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tdW5pY2F0aW9uXCI7XG5pbXBvcnQgeyBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tdW5pY2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7XG5cdERhdGFGaWVsZCxcblx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQWN0aW9uLFxuXHREYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb25Hcm91cCxcblx0RGF0YUZpZWxkRm9yQW5ub3RhdGlvbixcblx0RGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50LFxuXHREYXRhUG9pbnRUeXBlLFxuXHREYXRhUG9pbnRUeXBlVHlwZXMsXG5cdEZpZWxkR3JvdXAsXG5cdElkZW50aWZpY2F0aW9uLFxuXHRSZWZlcmVuY2VGYWNldFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UZXJtcywgVUlBbm5vdGF0aW9uVHlwZXMsIFZpc3VhbGl6YXRpb25UeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB7IGVxdWFsLCBnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24sIG5vdCB9IGZyb20gXCJzYXAvZmUvYmFzZS9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBUYWJsZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRXhwb3J0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vdGFibGUvQ29sdW1uc1wiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBpc0Fubm90YXRpb25PZlRlcm0sIGlzQW5ub3RhdGlvbk9mVHlwZSwgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIGlzUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCxcblx0aGFzU3RhdGljUGVyY2VudFVuaXRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLCB0eXBlIERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwiLi4vLi4vdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IERpc3BsYXlNb2RlIH0gZnJvbSBcIi4uLy4uL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCIuLi9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB7IGFubm90YXRpb25Qcm9wZXJ0eTogUHJvcGVydHk7IGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uPzogRGlzcGxheU1vZGUgfT47XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncztcbn07XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0XCIuXG4gKiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCBoYXMgYW4gaW5saW5lIGFjdGlvbiBkZWZpbmVkLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzKS5oYXNPd25Qcm9wZXJ0eShcIkFjdGlvblwiKTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBcIi5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbkdyb3VwIHtcblx0cmV0dXJuIGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXA7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcImlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiLlxuICogaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBpbmxpbmUgJFR5cGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZC5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMgfCB1bmRlZmluZWRcbik6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckFjdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWQpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQWN0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXCIuXG4gKiBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gaGFzIGFuIGlubGluZSAkVHlwZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24ge1xuXHRyZXR1cm4gZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb247XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZFR5cGVzXCIuXG4gKiBEYXRhRmllbGQgaGFzIGEgdmFsdWUgZGVmaW5lZC5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGUgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRUeXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmtub3duKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZFR5cGVzIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLmhhc093blByb3BlcnR5KFwiVmFsdWVcIik7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZFwiLlxuICogRGF0YUZpZWxkIGhhcyBhIHZhbHVlIGRlZmluZWQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZChkYXRhRmllbGQ6IERhdGFGaWVsZCB8IHVua25vd24pOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uaGFzT3duUHJvcGVydHkoXCJWYWx1ZVwiKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaXMgYSBmaWVsZCBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ZpZWxkR3JvdXBUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbjogRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB8IFJlZmVyZW5jZUZhY2V0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdHJldHVybiBpc0Fubm90YXRpb25PZlR5cGU8RmllbGRHcm91cD4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGZpZWxkIGdyb3VwLlxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNJZGVudGlmaWNhdGlvblRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHwgUmVmZXJlbmNlRmFjZXQpOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVGVybTxJZGVudGlmaWNhdGlvbj4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UZXJtcy5JZGVudGlmaWNhdGlvbik7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGRhdGEgcG9pbnQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaXMgYSBkYXRhIHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRGF0YVBvaW50VGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb246IERhdGFGaWVsZEZvckFubm90YXRpb24pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVHlwZTxEYXRhUG9pbnQ+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciAndmlzaWJsZScgc2V0dGluZyBmb3IgdGhlIGFjdGlvbi5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGRhdGEgZmllbGQgcmVjb3JkIHdoaWNoIGNvdWxkIGJlIERhdGFGaWVsZEZvckFjdGlvbiwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIG9yIERhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gYmUgdXNlZCBmb3Igc2V0dGluZyAndmlzaWJsZScgYmFzZWQgb24gVUkuSGlkZGVuIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2libGVFeHByZXNzaW9uKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB8IERhdGFGaWVsZEZvckFjdGlvbkdyb3VwIHwgdW5kZWZpbmVkLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBub3QoXG5cdFx0ZXF1YWwoXG5cdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiwgW10sIHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dC5nZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uKCkpLFxuXHRcdFx0dHJ1ZVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHBhdGggdGFyZ2V0aW5nIGEgZGF0YUZpZWxkIGZvciBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcmV0dXJucyBgRGlhbG9nYCB8IGBOb25lYCBpZiBhIGRpYWxvZyBpcyBuZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YU1vZGVsT2JqZWN0UGF0aEZvckFjdGlvbldpdGhEaWFsb2coXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz5cbik6IFwiRGlhbG9nXCIgfCBcIk5vbmVcIiB7XG5cdGNvbnN0IHRhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRyZXR1cm4gaXNBY3Rpb25XaXRoRGlhbG9nKGlzRGF0YUZpZWxkRm9yQWN0aW9uKHRhcmdldCkgPyB0YXJnZXQgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZGF0YUZpZWxkIGZvciBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCBmb3IgYWN0aW9uXG4gKiBAcmV0dXJucyBgRGlhbG9nYCB8IGBOb25lYCBpZiBhIGRpYWxvZyBpcyBuZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWN0aW9uV2l0aERpYWxvZyhkYXRhRmllbGQ/OiBEYXRhRmllbGRGb3JBY3Rpb24pOiBcIkRpYWxvZ1wiIHwgXCJOb25lXCIge1xuXHRjb25zdCBhY3Rpb24gPSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldDtcblx0aWYgKGFjdGlvbikge1xuXHRcdGNvbnN0IGJDcml0aWNhbCA9IGFjdGlvbi5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0FjdGlvbkNyaXRpY2FsO1xuXHRcdGlmIChhY3Rpb24ucGFyYW1ldGVycy5sZW5ndGggPiAxIHx8IGJDcml0aWNhbCkge1xuXHRcdFx0cmV0dXJuIFwiRGlhbG9nXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBcIk5vbmVcIjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHR9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBUYXJnZXRWYWx1ZSBmcm9tIGEgRGF0YVBvaW50LlxuICogQHBhcmFtIHNvdXJjZSBUaGUgdGFyZ2V0IHByb3BlcnR5IG9yIERhdGFQb2ludFxuICogQHJldHVybnMgVGhlIFRhcmdldFZhbHVlIGFzIGEgZGVjaW1hbCBvciBhIHByb3BlcnR5IHBhdGhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChzb3VyY2U6IFByb3BlcnR5IHwgRGF0YVBvaW50VHlwZSk6IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjx1bmtub3duPiB8IHN0cmluZyB7XG5cdGxldCB0YXJnZXRWYWx1ZTogRGVjaW1hbCB8IHVuZGVmaW5lZCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjx1bmtub3duPiB8IHN0cmluZztcblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSkge1xuXHRcdGNvbnN0IGRhdGFQb2ludCA9IChzb3VyY2UuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50VHlwZTtcblx0XHR0YXJnZXRWYWx1ZSA9IGRhdGFQb2ludD8uVGFyZ2V0VmFsdWUgPz8gZGF0YVBvaW50Py5NYXhpbXVtVmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0dGFyZ2V0VmFsdWUgPSBzb3VyY2UuVGFyZ2V0VmFsdWUgPz8gc291cmNlLk1heGltdW1WYWx1ZTtcblx0fVxuXHRpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSBcIm51bWJlclwiKSB7XG5cdFx0cmV0dXJuIHRhcmdldFZhbHVlLnRvU3RyaW5nKCk7XG5cdH1cblx0cmV0dXJuIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldFZhbHVlKSA/IHRhcmdldFZhbHVlIDogXCIxMDBcIjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHByb3BlcnR5IHVzZXMgYSBEYXRhUG9pbnQgd2l0aGluIGEgRGF0YUZpZWxkRGVmYXVsdC5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByZWZlcmVuY2VkIHByb3BlcnR5IGhhcyBhIERhdGFQb2ludCB3aXRoaW4gdGhlIERhdGFGaWVsZERlZmF1bHQsIGZhbHNlIGVsc2VcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIGRlZmF1bHQgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmlzdWFsaXphdGlvbiB0aHJvdWdoIGEgRGF0YUZpZWxkRGVmYXVsdCBpcyBhIFJhdGluZ1xuICovXG5cbmV4cG9ydCBjb25zdCBpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdCgocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQgYXMgQW5ub3RhdGlvblRlcm08RGF0YVBvaW50Pilcblx0XHRcdD8uVmlzdWFsaXphdGlvbiA9PT0gXCJVSS5WaXN1YWxpemF0aW9uVHlwZS9SYXRpbmdcIlxuXHQpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhIHByb3BlcnR5IHVzZXMgYSBQcm9ncmVzcyB2aXN1YWxpemF0aW9uIFJhdGluZyB0aHJvdWdoIGEgRGF0YUZpZWxkRGVmYXVsdCBvciBhIGRpcmVjdCBEYXRhUG9pbnQuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmlzdWFsaXphdGlvbiBpcyBhIFByb2dyZXNzXG4gKi9cblxuZXhwb3J0IGNvbnN0IGlzQVByb2dyZXNzVHlwZUZyb21EYXRhUG9pbnQgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5IHwgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik6IGJvb2xlYW4ge1xuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkgJiYgaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkpIHtcblx0XHRwcm9wZXJ0eSA9IHByb3BlcnR5LmFubm90YXRpb25zLlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb247XG5cdH1cblx0cmV0dXJuICgocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludFR5cGUpPy5WaXN1YWxpemF0aW9uID09PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1Byb2dyZXNzXCI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VtYW50aWNPYmplY3RQYXRoKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdG9iamVjdDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuXHRcdGlmIChpc0RhdGFGaWVsZFR5cGVzKG9iamVjdCkgJiYgb2JqZWN0LlZhbHVlPy4kdGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG9iamVjdC5WYWx1ZT8uJHRhcmdldDtcblx0XHRcdGlmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNQcm9wZXJ0eShvYmplY3QpKSB7XG5cdFx0XHRpZiAob2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgob2JqZWN0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG5hdmlnYXRpb24gcGF0aCBwcmVmaXggZm9yIGEgcHJvcGVydHkgcGF0aC5cbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBuYXZpZ2F0aW9uIHBhdGggcHJlZml4IEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vXG4gKi9cbmZ1bmN0aW9uIF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRpZiAocGF0aCkge1xuXHRcdHJldHVybiBwYXRoLmluY2x1ZGVzKFwiL1wiKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgOiBcIlwiO1xuXHR9XG5cdHJldHVybiBcIlwiO1xufVxuXG4vKipcbiAqIENvbGxlY3QgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB0aGUgQUxQIHRhYmxlIHVzZS1jYXNlLlxuICpcbiAqIEZvciBlLmcuIElmIFVJLkhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSwgaW5jbHVkZSB0aGlzIHByb3BlcnR5IGluIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBvZiBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqIEBwYXJhbSB0YXJnZXQgUHJvcGVydHkgb3IgRGF0YUZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIG5hdmlnYXRpb25QYXRoUHJlZml4IE5hdmlnYXRpb24gcGF0aCBwcmVmaXgsIGFwcGxpY2FibGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZC5cbiAqL1xuZnVuY3Rpb24gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShcblx0dGFyZ2V0OiBQcmltaXRpdmVUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aFByZWZpeDogc3RyaW5nLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRpZiAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgaGlkZGVuQW5ub3RhdGlvbiA9IHRhcmdldC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbjtcblx0XHRpZiAoaGlkZGVuQW5ub3RhdGlvbj8ucGF0aCAmJiBpc1Byb3BlcnR5KGhpZGRlbkFubm90YXRpb24uJHRhcmdldCkpIHtcblx0XHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGhpZGRlbkFubm90YXRpb24ucGF0aDtcblx0XHRcdC8vIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGFkZGVkIHRvIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIG1hcCBmb3IgdGhlIEFMUCB0YWJsZSB1c2UtY2FzZS5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2hpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGhdID0gaGlkZGVuQW5ub3RhdGlvbi4kdGFyZ2V0O1xuXHRcdH1cblxuXHRcdGNvbnN0IGNyaXRpY2FsaXR5ID0gdGFyZ2V0LkNyaXRpY2FsaXR5O1xuXHRcdGlmIChjcml0aWNhbGl0eT8ucGF0aCAmJiBpc1Byb3BlcnR5KGNyaXRpY2FsaXR5Py4kdGFyZ2V0KSkge1xuXHRcdFx0Y29uc3QgY3JpdGljYWxpdHlQcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGNyaXRpY2FsaXR5LnBhdGg7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllc1tjcml0aWNhbGl0eVByb3BlcnR5UGF0aF0gPSBjcml0aWNhbGl0eT8uJHRhcmdldDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIEhlbHBlciBmb3IgY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzIHRvIHB1c2ggdW5pcXVlIHJlbGF0ZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc1xuICogQHBhcmFtIGtleSBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIHZhbHVlIFRoZSBwcm9wZXJ0aWVzIG9iamVjdCBjb250YWluaW5nIHZhbHVlIHByb3BlcnR5LCBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4uLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG1vZGUgaWYgdGhlIHByb3BlcnR5IGlzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gdGV4dCBhcnJhbmdlbWVudFxuICogQHJldHVybnMgSW5kZXggYXQgd2hpY2ggdGhlIHByb3BlcnR5IGlzIGF2YWlsYWJsZVxuICovXG5mdW5jdGlvbiBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdGtleTogc3RyaW5nLFxuXHR2YWx1ZTogUHJvcGVydHksXG5cdGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uPzogRGlzcGxheU1vZGVcbik6IG51bWJlciB7XG5cdGlmICghcmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllc1trZXldID0geyBhbm5vdGF0aW9uUHJvcGVydHk6IHZhbHVlIH07XG5cdFx0aWYgKGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uKSB7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzW2tleV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gPSBkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMpLmluZGV4T2Yoa2V5KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyB0byBhcHBlbmQgdGhlIGV4cG9ydCBzZXR0aW5ncyB0ZW1wbGF0ZSB3aXRoIGEgZm9ybWF0dGVkIHRleHQuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNcbiAqIEBwYXJhbSB2YWx1ZSBGb3JtYXR0ZWQgdGV4dFxuICovXG5mdW5jdGlvbiBfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUgPSByZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGVcblx0XHQ/IGAke3JlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlfSR7dmFsdWV9YFxuXHRcdDogYCR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgcHJvcGVydHkncyBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGlnbm9yZVNlbGYgV2hldGhlciB0byBleGNsdWRlIHRoZSBzYW1lIHByb3BlcnR5IGZyb20gdGhlIHJlbGF0ZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBUcnVlIGlmIHRoZSB1bml0L2N1cnJlbmN5IHByb3BlcnR5IG5lZWRzIHRvIGJlIGFkZGVkIGluIHRoZSBleHBvcnQgdGVtcGxhdGVcbiAqIEBwYXJhbSBpc0Fubm90YXRlZEFzSGlkZGVuIFRydWUgaWYgdGhlIERhdGFGaWVsZCBvciB0aGUgcHJvcGVydHkgYXJlIHN0YXRpY2FsbHkgaGlkZGVuXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdHBhdGg6IHN0cmluZyxcblx0cHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGlnbm9yZVNlbGY6IGJvb2xlYW4sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyA9IHtcblx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRhZGRpdGlvbmFsUHJvcGVydGllczoge30sXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IHt9XG5cdH0sXG5cdGFkZFVuaXRJblRlbXBsYXRlID0gZmFsc2UsXG5cdGlzQW5ub3RhdGVkQXNIaWRkZW4gPSBmYWxzZVxuKTogQ29tcGxleFByb3BlcnR5SW5mbyB7XG5cdGlmIChwYXRoICYmIHByb3BlcnR5KSB7XG5cdFx0bGV0IHZhbHVlSW5kZXg6IG51bWJlcjtcblx0XHQvKiBFWFRFUk5BTElEICovXG5cdFx0Y29uc3QgZXh0ZXJuYWxJZFBhdGggPSBnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cblx0XHRpZiAoaXNBbm5vdGF0ZWRBc0hpZGRlbikge1xuXHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xuXHRcdH1cblx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRcdC8vIENoZWNrIGZvciBUZXh0IGFubm90YXRpb24uXG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eShleHRlcm5hbElkUHJvcGVydHkgfHwgcHJvcGVydHkpO1xuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eVBhdGggPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aChleHRlcm5hbElkUHJvcGVydHkgfHwgcHJvcGVydHkpO1xuXG5cdFx0Ly8gZ2V0IHRoZSBEYXRhTW9kZWxPYmplY3RQYXRoIGZvciB0aGUgY29sdW1uXG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgZXh0ZXJuYWxJZFBhdGggfHwgcGF0aCk7XG5cdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCB0ZXh0UHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCB0ZXh0UmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCh0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblxuXHRcdGlmIChyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGUpIHtcblx0XHRcdC8vIEZpZWxkR3JvdXAgdXNlLWNhc2UuIE5lZWQgdG8gYWRkIGVhY2ggRmllbGQgaW4gbmV3IGxpbmUuXG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIFwiXFxuXCIpO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3Mud3JhcCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHRleHQgYXJyYW5nZW1lbnQgd2lsbCBiZSBjb25zaWRlcmVkIG9ubHkgaWYgdGhlIHRleHQgcHJvcGVydHkgaXMgZ3JvdXBhYmxlXG5cdFx0Y29uc3QgdGV4dEFycmFuZ2VtZW50VG9CZUNvbnNpZGVyZWQgPVxuXHRcdFx0dGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiICYmICEhYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUdyb3VwYWJsZShwcm9wZXJ0eSlcblx0XHRcdFx0PyAhIXRleHRQcm9wZXJ0eSAmJiAhIWFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUodGV4dFByb3BlcnR5KVxuXHRcdFx0XHQ6IHRydWU7XG5cdFx0aWYgKHRleHRQcm9wZXJ0eSAmJiB0ZXh0UmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRpZiAodGV4dEFycmFuZ2VtZW50VG9CZUNvbnNpZGVyZWQpIHtcblx0XHRcdFx0Y29uc3QgcGF0aEZvclRleHQgPSBleHRlcm5hbElkUGF0aCA/IGV4dGVybmFsSWRQYXRoIDogcGF0aDtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlGb3JUZXh0ID0gZXh0ZXJuYWxJZFByb3BlcnR5ID8gZXh0ZXJuYWxJZFByb3BlcnR5IDogcHJvcGVydHk7XG5cdFx0XHRcdC8vIENoZWNrIGZvciBUZXh0IEFycmFuZ2VtZW50LlxuXHRcdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5Rm9yVGV4dCwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRcdFx0bGV0IGRlc2NyaXB0aW9uSW5kZXg6IG51bWJlcjtcblx0XHRcdFx0c3dpdGNoIChkaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcIkRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHtkZXNjcmlwdGlvbkluZGV4fX1gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBcIlZhbHVlRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aEZvclRleHQsIHByb3BlcnR5Rm9yVGV4dCk7XG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0XHR0ZXh0UmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHR0ZXh0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFwiVmFsdWVEZXNjcmlwdGlvblwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19ICh7JHtkZXNjcmlwdGlvbkluZGV4fX0pYCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGhGb3JUZXh0LCBwcm9wZXJ0eUZvclRleHQpO1xuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcIkRlc2NyaXB0aW9uVmFsdWVcIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske2Rlc2NyaXB0aW9uSW5kZXh9fSAoeyR7dmFsdWVJbmRleH19KWApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aEZvclRleHQsIHByb3BlcnR5Rm9yVGV4dCk7XG5cdFx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHlcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDaGVjayBmb3IgZmllbGQgY29udGFpbmluZyBDdXJyZW5jeSBPciBVbml0IFByb3BlcnRpZXMgb3IgVGltZXpvbmVcblx0XHRcdGNvbnN0IGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGN1cnJlbmN5UHJvcGVydHkgPz8gdW5pdFByb3BlcnR5O1xuXHRcdFx0Y29uc3QgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uOiBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPiA9XG5cdFx0XHRcdHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXG5cdFx0XHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbGxlY3RDdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0cmVsYXRpdmVQYXRoID8/IHBhdGgsXG5cdFx0XHRcdFx0YWRkVW5pdEluVGVtcGxhdGUsXG5cdFx0XHRcdFx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdFx0XHRcdGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSxcblx0XHRcdFx0XHRjdXJyZW5jeVByb3BlcnR5XG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lUHJvcGVydHkgJiYgdGltZXpvbmVBbm5vdGF0aW9uPy4kdGFyZ2V0KSB7XG5cdFx0XHRcdGNvbGxlY3RUaW1lem9uZVByb3BlcnRpZXMocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBhZGRVbml0SW5UZW1wbGF0ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHQocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSAmJiAhcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py5WYWx1ZUZvcm1hdCkgfHxcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzLCByZWxhdGl2ZVBhdGgpO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZSkge1xuXHRcdFx0XHRjb25zdCBjb250YWN0UHJvcGVydHkgPSBwcm9wZXJ0eS5mbj8uJHRhcmdldDtcblx0XHRcdFx0Y29uc3QgY29udGFjdFByb3BlcnR5UGF0aCA9IHByb3BlcnR5LmZuPy5wYXRoO1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGNvbnRhY3RQcm9wZXJ0eVBhdGggOiBjb250YWN0UHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdGNvbnRhY3RQcm9wZXJ0eVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdH0gZWxzZSBpZiAoIWlnbm9yZVNlbGYpIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0aWYgKGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnVuaXQgPSBgJHtjdXJyZW5jeU9yVW5pdEFubm90YXRpb259YDsgLy8gSGFyZC1jb2RlZCBjdXJyZW5jeS91bml0XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5KSB7XG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5pc0N1cnJlbmN5ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAodGltZXpvbmVBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGltZXpvbmUgPSBgJHt0aW1lem9uZUFubm90YXRpb259YDsgLy8gSGFyZC1jb2RlZCB0aW1lem9uZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKHByb3BlcnR5LCBuYXZpZ2F0aW9uUGF0aFByZWZpeCwgdGFibGVUeXBlLCByZWxhdGVkUHJvcGVydGllcyk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKS5sZW5ndGggPiAwICYmIHJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Ly8gV2UgZG9uJ3QgbmVlZCB0byBjb25zaWRlciBhZGRpdGlvbmFsUHJvcGVydGllcyBmb3IgdGhlIGV4cG9ydFxuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MucHJvcGVydHkgPSBbcmVsYXRpdmVQYXRoXTtcblx0XHR9XG5cdFx0aWYgKE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKS5sZW5ndGggPiAwICYmIE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5IGlmIG5vdCBjb2xsZWN0ZWQgYWxyZWFkeS5cblx0XHRcdC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgYWRkaXRpb25hbFByb3BlcnRpZXMgYXJlIG1hZGUgYXZhaWxhYmxlIG9ubHkgdG8gY29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIG9mIFZpc3VhbGl6YXRpb24gb2YgdGhlIERhdGFQb2ludC5cbiAqIEBwYXJhbSBzb3VyY2UgU291cmNlIG9mIHRoZSBEYXRhUG9pbnQuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBvZiBWaXN1YWxpemF0aW9uIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSdzIG5vbmUuXG4gKi9cbmZ1bmN0aW9uIGdldERhdGFQb2ludFZpc3VhbGl6YXRpb24oc291cmNlOiBQcm9wZXJ0eSB8IERhdGFQb2ludFR5cGUpOiBWaXN1YWxpemF0aW9uVHlwZSB7XG5cdGxldCBkYXRhUG9pbnQ6IERhdGFQb2ludFR5cGU7XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkpIHtcblx0XHRkYXRhUG9pbnQgPSAoc291cmNlLmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludFR5cGU7XG5cdH0gZWxzZSB7XG5cdFx0ZGF0YVBvaW50ID0gc291cmNlO1xuXHR9XG5cdHJldHVybiBkYXRhUG9pbnQuVmlzdWFsaXphdGlvbiA/PyBWaXN1YWxpemF0aW9uVHlwZS5OdW1iZXI7XG59XG5cbi8qKlxuICpcdENvbGxlY3QgdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgRGF0YVBvaW50LlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aC5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMocHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLCBwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0Ly8gcGF0aCBtdXN0IG5vdCBiZSB1bmRlZmluZWQsIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGggbWF5IHJldHVybiB1bmRlZmluZWRcblx0aWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCBkYXRhUG9pbnRQcm9wZXJ0eSA9IHByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uVmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0O1xuXHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblx0Ly8gRGF0YVBvaW50IHVzZS1jYXNlIHVzaW5nIERhdGFGaWVsZERlZmF1bHQuXG5cdGNvbnN0IGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0Y29uc3QgdmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFQb2ludFByb3BlcnR5KTtcblx0Ly8gSWYgd2UgaGF2ZSBhIERhdGFQb2ludCB3aXRob3V0IHZpc3VhbGl6YXRpb24sIG9yIGEgTnVtYmVyLCB3ZSBkb24ndCBoYXZlIGEgVGFyZ2V0VmFsdWUvTWF4aW11bVZhbHVlXG5cdGlmIChnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uKGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YXBvaW50VGFyZ2V0KSA9PT0gVmlzdWFsaXphdGlvblR5cGUuTnVtYmVyKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHRhcmdldFZhbHVlID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFwb2ludFRhcmdldCk7XG5cdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRWYWx1ZSkpIHtcblx0XHRpZiAodGFyZ2V0VmFsdWUuJHRhcmdldCkge1xuXHRcdFx0Ly9pbiBjYXNlIGl0J3MgYSBkeW5hbWljIHRhcmdldFZhbHVlXG5cdFx0XHRjb25zdCBkYXRhUG9pbnRJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSA6IHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSxcblx0XHRcdFx0dGFyZ2V0VmFsdWUuJHRhcmdldFxuXHRcdFx0KTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWUucGF0aDtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fS97JHtkYXRhUG9pbnRJbmRleH19YCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGhhc1N0YXRpY1BlcmNlbnRVbml0KGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YVBvaW50UHJvcGVydHkpICYmIGlzQVByb2dyZXNzVHlwZUZyb21EYXRhUG9pbnQocHJvcGVydHkpKSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdCA9IFwiJVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWU7XG5cdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19LyR7dGFyZ2V0VmFsdWV9YCk7XG5cdH1cbn1cblxuLyoqXG4gKlx0Q29sbGVjdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSB3aXRoIFRpbWV6b25lLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aC5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBTaG91bGQgd2UgYWRkIHRoZSB1bml0IGluIHRoZSB0ZW1wbGF0ZS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRpbWV6b25lUHJvcGVydGllcyhcblx0cHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRwYXRoOiBzdHJpbmcsXG5cdGFkZFVuaXRJblRlbXBsYXRlOiBib29sZWFuXG4pOiB2b2lkIHtcblx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uLlRpbWV6b25lO1xuXHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblx0Y29uc3QgdmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cblx0Y29uc3QgdGltZXpvbmVPclVvTUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggKyB0aW1lem9uZUFubm90YXRpb24ucGF0aCxcblx0XHR0aW1lem9uZUFubm90YXRpb24uJHRhcmdldFxuXHQpO1xuXHRpZiAoYWRkVW5pdEluVGVtcGxhdGUpIHtcblx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0gIHske3RpbWV6b25lT3JVb01JbmRleH19YCk7XG5cdH0gZWxzZSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGltZXpvbmVQcm9wZXJ0eSA9IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgdGltZXpvbmVBbm5vdGF0aW9uLnBhdGg7XG5cdH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSByZWxhdGVkIHByb3BlcnRpZXMgZnJvbSBhIHByb3BlcnR5IHdpdGggY3VycmVuY2llcyBvciB1bml0cy5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyIGZvciB0aGUgY29sdW1uLlxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcHJvcGVydHkgcmVsYXRpdmUgcGF0aC5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBTcGVjaWZ5IGlmIHRoZSB1bml0IHNob3VsZCBiZSBhZGRlZCBpbiB0aGUgdGVtcGxhdGUuXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBkYXRhIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSBUaGUgY3VycmVuY3kgb3IgdW5pdCBvZiBtZWFzdXJlIHByb3BlcnR5IGxpbmtlZCB0byB0aGUgY29sdW1uLlxuICogQHBhcmFtIGN1cnJlbmN5UHJvcGVydHkgVGhlIGN1cnJlbmN5IHByb3BlcnR5IGxpbmtlZCB0byB0aGUgY29sdW1uLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0Q3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzKFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdGFkZFVuaXRJblRlbXBsYXRlOiBib29sZWFuLFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRjdXJyZW5jeU9yVW9NUHJvcGVydHk6IFByb3BlcnR5LFxuXHRjdXJyZW5jeVByb3BlcnR5PzogUHJvcGVydHlcbik6IHZvaWQge1xuXHRjb25zdCBwcm9wZXJ0eSA9IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdGlmIChwcm9wZXJ0eSkge1xuXHRcdGNvbnN0IGN1cnJlbmN5T3JVbml0UHJvcGVydHlQYXRoID0gZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHlQYXRoKHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdFx0Y29uc3QgdW5pdE9yQ3VycmVuY3lQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oXG5cdFx0XHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRjdXJyZW5jeU9yVW5pdFByb3BlcnR5UGF0aFxuXHRcdCk7XG5cdFx0Y29uc3QgdW5pdE9yQ3VycmVuY3lSZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHVuaXRPckN1cnJlbmN5UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRjb25zdCB2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHJlbGF0aXZlUGF0aCwgcHJvcGVydHkpO1xuXHRcdGNvbnN0IGN1cnJlbmN5T3JVb01JbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCB1bml0T3JDdXJyZW5jeVJlbGF0aXZlUGF0aCEsIGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSk7XG5cdFx0aWYgKGFkZFVuaXRJblRlbXBsYXRlKSB7XG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0gIHske2N1cnJlbmN5T3JVb01JbmRleH19YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnVuaXRQcm9wZXJ0eSA9IHVuaXRPckN1cnJlbmN5UmVsYXRpdmVQYXRoO1xuXHRcdH1cblx0XHRpZiAoY3VycmVuY3lQcm9wZXJ0eSkge1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MuaXNDdXJyZW5jeSA9IHRydWU7XG5cdFx0fVxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnNjYWxlID0gcHJvcGVydHkuc2NhbGU7XG5cdH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IHByb3BlcnRpZXMgY29uc3VtZWQgYnkgYSBEYXRhRmllbGQuXG4gKiBUaGlzIGlzIGZvciBwb3B1bGF0aW5nIHRoZSBDb21wbGV4UHJvcGVydHlJbmZvcyBvZiB0aGUgdGFibGUgZGVsZWdhdGUuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgaWRlbnRpZmllZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gaXNFbWJlZGRlZCBUcnVlIGlmIHRoZSBEYXRhRmllbGQgaXMgZW1iZWRkZWQgaW4gYW5vdGhlciBhbm5vdGF0aW9uIChzdWNoIGFzIEZpZWxkR3JvdXApLlxuICogQHJldHVybnMgVGhlIHByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgRGF0YUZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSxcblx0XHRleHBvcnRTZXR0aW5nczoge31cblx0fSxcblx0aXNFbWJlZGRlZCA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0bGV0IGlzU3RhdGljYWxseUhpZGRlbiA9IGZhbHNlO1xuXHRzd2l0Y2ggKGRhdGFGaWVsZD8uJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGlmIChkYXRhRmllbGQuVmFsdWUpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBkYXRhRmllbGQuVmFsdWU7XG5cdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCk7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdHByb3BlcnR5LnBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkuJHRhcmdldCxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRpc0VtYmVkZGVkLFxuXHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwcm9wZXJ0eS5wYXRoKTtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKFxuXHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHN3aXRjaCAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZTpcblx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRcdGlubmVyRGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpO1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLnBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGlzRW1iZWRkZWQsXG5cdFx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW5cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZTpcblx0XHRcdFx0XHRjb25zdCBkYXRhRmllbGRDb250YWN0ID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0IGFzIENvbnRhY3Q7XG5cdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKTtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQudmFsdWUsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGRDb250YWN0LFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbixcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0aXNFbWJlZGRlZCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZERhdGFUeXBlID0gZnVuY3Rpb24gKG9EYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChpc1Byb3BlcnR5KG9EYXRhRmllbGQpKSB7XG5cdFx0cmV0dXJuIG9EYXRhRmllbGQudHlwZTtcblx0fVxuXHRsZXQgc0RhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHN3aXRjaCAob0RhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRkZWZhdWx0OlxuXHRcdFx0aWYgKG9EYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0XHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdFx0XHRpZiAoZGF0YUZpZWxkVGFyZ2V0LiRUeXBlID09PSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZFRhcmdldC5mbikpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuZm4uJHRhcmdldD8udHlwZTtcblx0XHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGRUYXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiRQYXRoPy4kVHlwZSB8fCBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZS5nLiBGaWVsZEdyb3VwIG9yIENoYXJ0XG5cdFx0XHRcdFx0Ly8gRmllbGRHcm91cCBQcm9wZXJ0aWVzIGhhdmUgbm8gdHlwZSwgc28gd2UgZGVmaW5lIGl0IGFzIGEgYm9vbGVhbiB0eXBlIHRvIHByZXZlbnQgZXhjZXB0aW9ucyBkdXJpbmcgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSB3aWR0aFxuXHRcdFx0XHRcdHNEYXRhVHlwZSA9XG5cdFx0XHRcdFx0XHRvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0RGVmaW5pdGlvblR5cGVcIiA/IHVuZGVmaW5lZCA6IFwiRWRtLkJvb2xlYW5cIjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gc0RhdGFUeXBlO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBbURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNBLDRCQUE0QkEsQ0FBQ0MsU0FBaUMsRUFBZ0Q7SUFDN0gsT0FBUUEsU0FBUyxDQUFxQ0MsY0FBYyxDQUFDLFFBQVEsQ0FBQztFQUMvRTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkFDLFFBQUEsQ0FBQUgsNEJBQUEsR0FBQUEsNEJBQUE7RUFLTyxTQUFTSSx5QkFBeUJBLENBQUNILFNBQWlDLEVBQXdDO0lBQ2xILE9BQU9BLFNBQVMsQ0FBQ0ksS0FBSyx5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
|
|
676
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJfZXhwb3J0cyIsImlzRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXAiLCIkVHlwZSIsImlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGQiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImRhdGFGaWVsZFRhcmdldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJoYXNDb25uZWN0ZWRGaWVsZHNUYXJnZXQiLCJoYXNJZGVudGlmaWNhdGlvblRhcmdldCIsImlzQW5ub3RhdGlvbk9mVGVybSIsImhhc0RhdGFQb2ludFRhcmdldCIsInZpc2libGVFeHByZXNzaW9uIiwiY29udmVydGVyQ29udGV4dCIsIm5vdCIsImVxdWFsIiwiZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uIiwiYW5ub3RhdGlvbnMiLCJVSSIsIkhpZGRlbiIsInVuZGVmaW5lZCIsImdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24iLCJpc0RhdGFNb2RlbE9iamVjdFBhdGhGb3JBY3Rpb25XaXRoRGlhbG9nIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInRhcmdldCIsInRhcmdldE9iamVjdCIsImlzQWN0aW9uV2l0aERpYWxvZyIsImFjdGlvbiIsIkFjdGlvblRhcmdldCIsImJDcml0aWNhbCIsIkNvbW1vbiIsIklzQWN0aW9uQ3JpdGljYWwiLCJwYXJhbWV0ZXJzIiwibGVuZ3RoIiwiZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludCIsInNvdXJjZSIsInRhcmdldFZhbHVlIiwiaXNQcm9wZXJ0eSIsImRhdGFQb2ludCIsIkRhdGFGaWVsZERlZmF1bHQiLCJUYXJnZXRWYWx1ZSIsIk1heGltdW1WYWx1ZSIsInRvU3RyaW5nIiwiaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24iLCJpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0IiwicHJvcGVydHkiLCJpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdCIsIlZpc3VhbGl6YXRpb24iLCJpc0FQcm9ncmVzc1R5cGVGcm9tRGF0YVBvaW50IiwiZ2V0U2VtYW50aWNPYmplY3RQYXRoIiwib2JqZWN0IiwiVmFsdWUiLCJTZW1hbnRpY09iamVjdCIsImdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgiLCJwYXRoIiwiaW5jbHVkZXMiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsIl9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUiLCJuYXZpZ2F0aW9uUGF0aFByZWZpeCIsInRhYmxlVHlwZSIsInJlbGF0ZWRQcm9wZXJ0aWVzIiwiaGlkZGVuQW5ub3RhdGlvbiIsImhpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGgiLCJhZGRpdGlvbmFsUHJvcGVydGllcyIsImNyaXRpY2FsaXR5IiwiQ3JpdGljYWxpdHkiLCJjcml0aWNhbGl0eVByb3BlcnR5UGF0aCIsIl9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4Iiwia2V5IiwidmFsdWUiLCJkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiIsInByb3BlcnRpZXMiLCJhbm5vdGF0aW9uUHJvcGVydHkiLCJPYmplY3QiLCJrZXlzIiwiaW5kZXhPZiIsIl9hcHBlbmRUZW1wbGF0ZSIsImV4cG9ydFNldHRpbmdzIiwidGVtcGxhdGUiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJpZ25vcmVTZWxmIiwiYXJndW1lbnRzIiwiYWRkVW5pdEluVGVtcGxhdGUiLCJpc0Fubm90YXRlZEFzSGlkZGVuIiwiY29ubmVjdGVkRmllbGRzU2VwYXJhdG9yIiwiaXNQYXJ0T2ZhQ29ubmVjdGVkRmllbGRzIiwidmFsdWVJbmRleCIsImV4dGVybmFsSWRQYXRoIiwiZ2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eVBhdGgiLCJleHRlcm5hbElkUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5IiwiZW50aXR5VHlwZSIsImdldEVudGl0eVR5cGUiLCJhZ2dyZWdhdGlvbkhlbHBlciIsIkFnZ3JlZ2F0aW9uSGVscGVyIiwidGV4dFByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eSIsInRleHRQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCIsImdldENvbnZlcnRlckNvbnRleHRGb3IiLCJnZXRDb250ZXh0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsInJlbGF0aXZlUGF0aCIsImdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgiLCJ0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwidGV4dFJlbGF0aXZlUGF0aCIsIndyYXAiLCJ0ZXh0QXJyYW5nZW1lbnRUb0JlQ29uc2lkZXJlZCIsImlzUHJvcGVydHlHcm91cGFibGUiLCJwYXRoRm9yVGV4dCIsInByb3BlcnR5Rm9yVGV4dCIsImRpc3BsYXlNb2RlIiwiZ2V0RGlzcGxheU1vZGUiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZGVzY3JpcHRpb25JbmRleCIsImN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSIsInVuaXRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkiLCJjdXJyZW5jeU9yVW9NUHJvcGVydHkiLCJjdXJyZW5jeU9yVW5pdEFubm90YXRpb24iLCJNZWFzdXJlcyIsIklTT0N1cnJlbmN5IiwiVW5pdCIsInRpbWV6b25lUHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSIsInRpbWV6b25lQW5ub3RhdGlvbiIsIlRpbWV6b25lIiwiY29sbGVjdEN1cnJlbmN5T3JVbml0UHJvcGVydGllcyIsImNvbGxlY3RUaW1lem9uZVByb3BlcnRpZXMiLCJWYWx1ZUZvcm1hdCIsImNvbGxlY3REYXRhUG9pbnRQcm9wZXJ0aWVzIiwiY29udGFjdFByb3BlcnR5IiwiZm4iLCJjb250YWN0UHJvcGVydHlQYXRoIiwidW5pdCIsImlzQ3VycmVuY3kiLCJ0aW1lem9uZSIsImdldERhdGFQb2ludFZpc3VhbGl6YXRpb24iLCJkYXRhUG9pbnRQcm9wZXJ0eSIsImRhdGFwb2ludFRhcmdldCIsImRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSIsImRhdGFQb2ludEluZGV4IiwibmFtZSIsImRhdGFQb2ludFRhcmdldFZhbHVlIiwiaGFzU3RhdGljUGVyY2VudFVuaXQiLCJ0aW1lem9uZU9yVW9NSW5kZXgiLCJjdXJyZW5jeU9yVW5pdFByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCIsImdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoIiwidW5pdE9yQ3VycmVuY3lQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgiLCJ1bml0T3JDdXJyZW5jeVJlbGF0aXZlUGF0aCIsImN1cnJlbmN5T3JVb01JbmRleCIsInNjYWxlIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJpc0VtYmVkZGVkIiwiaXNTdGF0aWNhbGx5SGlkZGVuIiwiaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4iLCJEYXRhIiwiZm9yRWFjaCIsImlubmVyRGF0YUZpZWxkIiwiZ2V0Q29ubmVjdGVkRmllbGRzU2VwYXJhdG9yIiwiZ2V0Q29ubmVjdGVkRmllbGRzRGF0YSIsImRhdGFGaWVsZENvbnRhY3QiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsIm9EYXRhRmllbGQiLCJ0eXBlIiwic0RhdGFUeXBlIiwiJFBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkRhdGFGaWVsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFubm90YXRpb25UZXJtLCBEZWNpbWFsLCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIFByaW1pdGl2ZVR5cGUsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRhY3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB7IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB0eXBlIHtcblx0Q29ubmVjdGVkRmllbGRzLFxuXHREYXRhRmllbGQsXG5cdERhdGFGaWVsZEFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFjdGlvbixcblx0RGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQWN0aW9uR3JvdXAsXG5cdERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdERhdGFQb2ludCxcblx0RGF0YVBvaW50VHlwZSxcblx0RGF0YVBvaW50VHlwZVR5cGVzLFxuXHRGaWVsZEdyb3VwLFxuXHRJZGVudGlmaWNhdGlvbixcblx0UmVmZXJlbmNlRmFjZXRcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHsgVUlBbm5vdGF0aW9uVGVybXMsIFVJQW5ub3RhdGlvblR5cGVzLCBWaXN1YWxpemF0aW9uVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9iYXNlL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgeyBlcXVhbCwgZ2V0RXhwcmVzc2lvbkZyb21Bbm5vdGF0aW9uLCBub3QgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgVGFibGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbkV4cG9ydFNldHRpbmdzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvQ29tbW9uL3RhYmxlL0NvbHVtbnNcIjtcbmltcG9ydCB7IEFnZ3JlZ2F0aW9uSGVscGVyIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9BZ2dyZWdhdGlvblwiO1xuaW1wb3J0IHsgaXNBbm5vdGF0aW9uT2ZUZXJtLCBpc0Fubm90YXRpb25PZlR5cGUsIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBpc1Byb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHsgZ2V0RGlzcGxheU1vZGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EaXNwbGF5TW9kZUZvcm1hdHRlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGhhc1N0YXRpY1BlcmNlbnRVbml0XG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL1Byb3BlcnR5SGVscGVyXCI7XG5pbXBvcnQgeyBlbmhhbmNlRGF0YU1vZGVsUGF0aCwgZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCwgdHlwZSBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcIi4uLy4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBEaXNwbGF5TW9kZSB9IGZyb20gXCIuLi8uLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHsgZ2V0Q29ubmVjdGVkRmllbGRzRGF0YSwgZ2V0Q29ubmVjdGVkRmllbGRzU2VwYXJhdG9yLCBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCIuLi9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB7IGFubm90YXRpb25Qcm9wZXJ0eTogUHJvcGVydHk7IGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uPzogRGlzcGxheU1vZGUgfT47XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncztcbn07XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0XCIuXG4gKiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCBoYXMgYW4gaW5saW5lIGFjdGlvbiBkZWZpbmVkLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzKS5oYXNPd25Qcm9wZXJ0eShcIkFjdGlvblwiKTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBcIi5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXAoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbkdyb3VwIHtcblx0cmV0dXJuIGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXA7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcImlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiLlxuICogaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBpbmxpbmUgJFR5cGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZC5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMgfCB1bmRlZmluZWRcbik6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckFjdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWQpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQWN0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXCIuXG4gKiBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gaGFzIGFuIGlubGluZSAkVHlwZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkLlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24ge1xuXHRyZXR1cm4gZGF0YUZpZWxkLiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb247XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZFR5cGVzXCIuXG4gKiBEYXRhRmllbGQgaGFzIGEgdmFsdWUgZGVmaW5lZC5cbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGUgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRUeXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmtub3duKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZFR5cGVzIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLmhhc093blByb3BlcnR5KFwiVmFsdWVcIik7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZFwiLlxuICogRGF0YUZpZWxkIGhhcyBhIHZhbHVlIGRlZmluZWQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZChkYXRhRmllbGQ6IERhdGFGaWVsZCB8IHVua25vd24pOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uaGFzT3duUHJvcGVydHkoXCJWYWx1ZVwiKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaXMgYSBmaWVsZCBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ZpZWxkR3JvdXBUYXJnZXQoZGF0YUZpZWxkRm9yQW5ub3RhdGlvbjogRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB8IFJlZmVyZW5jZUZhY2V0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdHJldHVybiBpc0Fubm90YXRpb25PZlR5cGU8RmllbGRHcm91cD4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludHMgdG8gYSBjb25uZWN0ZWRGaWVsZHMgYW5ub3RhdGlvbi5cbiAqIEBwYXJhbSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIFRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGJlaW5nIHByb2Nlc3NlZFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBwb2ludHMgdG8gYSBjb25uZWN0ZWRGaWVsZHMgYW5ub3RhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Nvbm5lY3RlZEZpZWxkc1RhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHwgUmVmZXJlbmNlRmFjZXQpOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVHlwZTxDb25uZWN0ZWRGaWVsZHM+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuQ29ubmVjdGVkRmllbGRzVHlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGZpZWxkIGdyb3VwLlxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNJZGVudGlmaWNhdGlvblRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHwgUmVmZXJlbmNlRmFjZXQpOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVGVybTxJZGVudGlmaWNhdGlvbj4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UZXJtcy5JZGVudGlmaWNhdGlvbik7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGRhdGEgcG9pbnQuXG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaXMgYSBkYXRhIHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRGF0YVBvaW50VGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb246IERhdGFGaWVsZEZvckFubm90YXRpb24pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVHlwZTxEYXRhUG9pbnQ+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciAndmlzaWJsZScgc2V0dGluZyBmb3IgdGhlIGFjdGlvbi5cbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIGRhdGEgZmllbGQgcmVjb3JkIHdoaWNoIGNvdWxkIGJlIERhdGFGaWVsZEZvckFjdGlvbiwgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIG9yIERhdGFGaWVsZEZvckFjdGlvbkdyb3VwXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gdG8gYmUgdXNlZCBmb3Igc2V0dGluZyAndmlzaWJsZScgYmFzZWQgb24gVUkuSGlkZGVuIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2libGVFeHByZXNzaW9uKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEZvckFjdGlvbiB8IERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB8IERhdGFGaWVsZEZvckFjdGlvbkdyb3VwIHwgdW5kZWZpbmVkLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD5cbik6IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBub3QoXG5cdFx0ZXF1YWwoXG5cdFx0XHRnZXRFeHByZXNzaW9uRnJvbUFubm90YXRpb24oZGF0YUZpZWxkPy5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiwgW10sIHVuZGVmaW5lZCwgY29udmVydGVyQ29udGV4dC5nZXRSZWxhdGl2ZU1vZGVsUGF0aEZ1bmN0aW9uKCkpLFxuXHRcdFx0dHJ1ZVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGRhdGEgbW9kZWwgb2JqZWN0IHBhdGggdGFyZ2V0aW5nIGEgZGF0YUZpZWxkIGZvciBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcmV0dXJucyBgRGlhbG9nYCB8IGBOb25lYCBpZiBhIGRpYWxvZyBpcyBuZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YU1vZGVsT2JqZWN0UGF0aEZvckFjdGlvbldpdGhEaWFsb2coXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz5cbik6IFwiRGlhbG9nXCIgfCBcIk5vbmVcIiB7XG5cdGNvbnN0IHRhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRyZXR1cm4gaXNBY3Rpb25XaXRoRGlhbG9nKGlzRGF0YUZpZWxkRm9yQWN0aW9uKHRhcmdldCkgPyB0YXJnZXQgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZGF0YUZpZWxkIGZvciBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCBmb3IgYWN0aW9uXG4gKiBAcmV0dXJucyBgRGlhbG9nYCB8IGBOb25lYCBpZiBhIGRpYWxvZyBpcyBuZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWN0aW9uV2l0aERpYWxvZyhkYXRhRmllbGQ/OiBEYXRhRmllbGRGb3JBY3Rpb24pOiBcIkRpYWxvZ1wiIHwgXCJOb25lXCIge1xuXHRjb25zdCBhY3Rpb24gPSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldDtcblx0aWYgKGFjdGlvbikge1xuXHRcdGNvbnN0IGJDcml0aWNhbCA9IGFjdGlvbi5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0FjdGlvbkNyaXRpY2FsO1xuXHRcdGlmIChhY3Rpb24ucGFyYW1ldGVycy5sZW5ndGggPiAxIHx8IGJDcml0aWNhbCkge1xuXHRcdFx0cmV0dXJuIFwiRGlhbG9nXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBcIk5vbmVcIjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHR9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBUYXJnZXRWYWx1ZSBmcm9tIGEgRGF0YVBvaW50LlxuICogQHBhcmFtIHNvdXJjZSBUaGUgdGFyZ2V0IHByb3BlcnR5IG9yIERhdGFQb2ludFxuICogQHJldHVybnMgVGhlIFRhcmdldFZhbHVlIGFzIGEgZGVjaW1hbCBvciBhIHByb3BlcnR5IHBhdGhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChzb3VyY2U6IFByb3BlcnR5IHwgRGF0YVBvaW50VHlwZSk6IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjx1bmtub3duPiB8IHN0cmluZyB7XG5cdGxldCB0YXJnZXRWYWx1ZTogRGVjaW1hbCB8IHVuZGVmaW5lZCB8IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjx1bmtub3duPiB8IHN0cmluZztcblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSkge1xuXHRcdGNvbnN0IGRhdGFQb2ludCA9IChzb3VyY2UuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50VHlwZTtcblx0XHR0YXJnZXRWYWx1ZSA9IGRhdGFQb2ludD8uVGFyZ2V0VmFsdWUgPz8gZGF0YVBvaW50Py5NYXhpbXVtVmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0dGFyZ2V0VmFsdWUgPSBzb3VyY2UuVGFyZ2V0VmFsdWUgPz8gc291cmNlLk1heGltdW1WYWx1ZTtcblx0fVxuXHRpZiAodHlwZW9mIHRhcmdldFZhbHVlID09PSBcIm51bWJlclwiKSB7XG5cdFx0cmV0dXJuIHRhcmdldFZhbHVlLnRvU3RyaW5nKCk7XG5cdH1cblx0cmV0dXJuIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldFZhbHVlKSA/IHRhcmdldFZhbHVlIDogXCIxMDBcIjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHByb3BlcnR5IHVzZXMgYSBEYXRhUG9pbnQgd2l0aGluIGEgRGF0YUZpZWxkRGVmYXVsdC5cbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByZWZlcmVuY2VkIHByb3BlcnR5IGhhcyBhIERhdGFQb2ludCB3aXRoaW4gdGhlIERhdGFGaWVsZERlZmF1bHQsIGZhbHNlIGVsc2VcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIGRlZmF1bHQgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmlzdWFsaXphdGlvbiB0aHJvdWdoIGEgRGF0YUZpZWxkRGVmYXVsdCBpcyBhIFJhdGluZ1xuICovXG5cbmV4cG9ydCBjb25zdCBpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdCgocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQgYXMgQW5ub3RhdGlvblRlcm08RGF0YVBvaW50Pilcblx0XHRcdD8uVmlzdWFsaXphdGlvbiA9PT0gXCJVSS5WaXN1YWxpemF0aW9uVHlwZS9SYXRpbmdcIlxuXHQpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhIHByb3BlcnR5IHVzZXMgYSBQcm9ncmVzcyB2aXN1YWxpemF0aW9uIFJhdGluZyB0aHJvdWdoIGEgRGF0YUZpZWxkRGVmYXVsdCBvciBhIGRpcmVjdCBEYXRhUG9pbnQuXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmlzdWFsaXphdGlvbiBpcyBhIFByb2dyZXNzXG4gKi9cblxuZXhwb3J0IGNvbnN0IGlzQVByb2dyZXNzVHlwZUZyb21EYXRhUG9pbnQgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5IHwgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik6IGJvb2xlYW4ge1xuXHRpZiAoaXNQcm9wZXJ0eShwcm9wZXJ0eSkgJiYgaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkpIHtcblx0XHRwcm9wZXJ0eSA9IHByb3BlcnR5LmFubm90YXRpb25zLlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb247XG5cdH1cblx0cmV0dXJuICgocHJvcGVydHkgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludFR5cGUpPy5WaXN1YWxpemF0aW9uID09PSBcIlVJLlZpc3VhbGl6YXRpb25UeXBlL1Byb2dyZXNzXCI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VtYW50aWNPYmplY3RQYXRoKFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4sXG5cdG9iamVjdDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuXHRcdGlmIChpc0RhdGFGaWVsZFR5cGVzKG9iamVjdCkgJiYgb2JqZWN0LlZhbHVlPy4kdGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG9iamVjdC5WYWx1ZT8uJHRhcmdldDtcblx0XHRcdGlmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNQcm9wZXJ0eShvYmplY3QpKSB7XG5cdFx0XHRpZiAob2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgob2JqZWN0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG5hdmlnYXRpb24gcGF0aCBwcmVmaXggZm9yIGEgcHJvcGVydHkgcGF0aC5cbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBuYXZpZ2F0aW9uIHBhdGggcHJlZml4IEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vXG4gKi9cbmZ1bmN0aW9uIF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRpZiAocGF0aCkge1xuXHRcdHJldHVybiBwYXRoLmluY2x1ZGVzKFwiL1wiKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgOiBcIlwiO1xuXHR9XG5cdHJldHVybiBcIlwiO1xufVxuXG4vKipcbiAqIENvbGxlY3QgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB0aGUgQUxQIHRhYmxlIHVzZS1jYXNlLlxuICpcbiAqIEZvciBlLmcuIElmIFVJLkhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSwgaW5jbHVkZSB0aGlzIHByb3BlcnR5IGluIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBvZiBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqIEBwYXJhbSB0YXJnZXQgUHJvcGVydHkgb3IgRGF0YUZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIG5hdmlnYXRpb25QYXRoUHJlZml4IE5hdmlnYXRpb24gcGF0aCBwcmVmaXgsIGFwcGxpY2FibGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZC5cbiAqL1xuZnVuY3Rpb24gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShcblx0dGFyZ2V0OiBQcmltaXRpdmVUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aFByZWZpeDogc3RyaW5nLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRpZiAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgaGlkZGVuQW5ub3RhdGlvbiA9IHRhcmdldC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbjtcblx0XHRpZiAoaGlkZGVuQW5ub3RhdGlvbj8ucGF0aCAmJiBpc1Byb3BlcnR5KGhpZGRlbkFubm90YXRpb24uJHRhcmdldCkpIHtcblx0XHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGhpZGRlbkFubm90YXRpb24ucGF0aDtcblx0XHRcdC8vIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGFkZGVkIHRvIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIG1hcCBmb3IgdGhlIEFMUCB0YWJsZSB1c2UtY2FzZS5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2hpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGhdID0gaGlkZGVuQW5ub3RhdGlvbi4kdGFyZ2V0O1xuXHRcdH1cblxuXHRcdGNvbnN0IGNyaXRpY2FsaXR5ID0gdGFyZ2V0LkNyaXRpY2FsaXR5O1xuXHRcdGlmIChjcml0aWNhbGl0eT8ucGF0aCAmJiBpc1Byb3BlcnR5KGNyaXRpY2FsaXR5Py4kdGFyZ2V0KSkge1xuXHRcdFx0Y29uc3QgY3JpdGljYWxpdHlQcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGNyaXRpY2FsaXR5LnBhdGg7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllc1tjcml0aWNhbGl0eVByb3BlcnR5UGF0aF0gPSBjcml0aWNhbGl0eT8uJHRhcmdldDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIEhlbHBlciBmb3IgY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzIHRvIHB1c2ggdW5pcXVlIHJlbGF0ZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc1xuICogQHBhcmFtIGtleSBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIHZhbHVlIFRoZSBwcm9wZXJ0aWVzIG9iamVjdCBjb250YWluaW5nIHZhbHVlIHByb3BlcnR5LCBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4uLlxuICogQHBhcmFtIGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG1vZGUgaWYgdGhlIHByb3BlcnR5IGlzIHJlZmVyZW5jZWQgYXMgZGVzY3JpcHRpb24gb24gdGV4dCBhcnJhbmdlbWVudFxuICogQHJldHVybnMgSW5kZXggYXQgd2hpY2ggdGhlIHByb3BlcnR5IGlzIGF2YWlsYWJsZVxuICovXG5mdW5jdGlvbiBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdGtleTogc3RyaW5nLFxuXHR2YWx1ZTogUHJvcGVydHksXG5cdGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uPzogRGlzcGxheU1vZGVcbik6IG51bWJlciB7XG5cdGlmICghcmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllc1trZXldID0geyBhbm5vdGF0aW9uUHJvcGVydHk6IHZhbHVlIH07XG5cdFx0aWYgKGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uKSB7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzW2tleV0uZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gPSBkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMpLmluZGV4T2Yoa2V5KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyB0byBhcHBlbmQgdGhlIGV4cG9ydCBzZXR0aW5ncyB0ZW1wbGF0ZSB3aXRoIGEgZm9ybWF0dGVkIHRleHQuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNcbiAqIEBwYXJhbSB2YWx1ZSBGb3JtYXR0ZWQgdGV4dFxuICovXG5mdW5jdGlvbiBfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUgPSByZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGVcblx0XHQ/IGAke3JlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlfSR7dmFsdWV9YFxuXHRcdDogYCR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgcHJvcGVydHkncyBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGlnbm9yZVNlbGYgV2hldGhlciB0byBleGNsdWRlIHRoZSBzYW1lIHByb3BlcnR5IGZyb20gdGhlIHJlbGF0ZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBUcnVlIGlmIHRoZSB1bml0L2N1cnJlbmN5IHByb3BlcnR5IG5lZWRzIHRvIGJlIGFkZGVkIGluIHRoZSBleHBvcnQgdGVtcGxhdGVcbiAqIEBwYXJhbSBpc0Fubm90YXRlZEFzSGlkZGVuIFRydWUgaWYgdGhlIERhdGFGaWVsZCBvciB0aGUgcHJvcGVydHkgYXJlIHN0YXRpY2FsbHkgaGlkZGVuXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdHBhdGg6IHN0cmluZyxcblx0cHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGlnbm9yZVNlbGY6IGJvb2xlYW4sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyA9IHtcblx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRhZGRpdGlvbmFsUHJvcGVydGllczoge30sXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IHt9XG5cdH0sXG5cdGFkZFVuaXRJblRlbXBsYXRlID0gZmFsc2UsXG5cdGlzQW5ub3RhdGVkQXNIaWRkZW4gPSBmYWxzZSxcblx0Y29ubmVjdGVkRmllbGRzU2VwYXJhdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRjb25zdCBpc1BhcnRPZmFDb25uZWN0ZWRGaWVsZHMgPSAhIWNvbm5lY3RlZEZpZWxkc1NlcGFyYXRvcjtcblx0aWYgKHBhdGggJiYgcHJvcGVydHkpIHtcblx0XHRsZXQgdmFsdWVJbmRleDogbnVtYmVyO1xuXHRcdC8qIEVYVEVSTkFMSUQgKi9cblx0XHRjb25zdCBleHRlcm5hbElkUGF0aCA9IGdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHlQYXRoKHByb3BlcnR5KTtcblx0XHRjb25zdCBleHRlcm5hbElkUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5KHByb3BlcnR5KTtcblxuXHRcdGlmIChpc0Fubm90YXRlZEFzSGlkZGVuKSB7XG5cdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHlcblx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0aXNQYXJ0T2ZhQ29ubmVjdGVkRmllbGRzICYmIHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZVxuXHRcdFx0XHRcdD8gYCR7Y29ubmVjdGVkRmllbGRzU2VwYXJhdG9yfXske3ZhbHVlSW5kZXh9fWBcblx0XHRcdFx0XHQ6IGB7JHt2YWx1ZUluZGV4fX1gXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xuXHRcdH1cblx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblxuXHRcdGNvbnN0IGVudGl0eVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVR5cGUoKTtcblx0XHRjb25zdCBhZ2dyZWdhdGlvbkhlbHBlciA9IG5ldyBBZ2dyZWdhdGlvbkhlbHBlcihlbnRpdHlUeXBlLCBjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRcdC8vIENoZWNrIGZvciBUZXh0IGFubm90YXRpb24uXG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eShleHRlcm5hbElkUHJvcGVydHkgfHwgcHJvcGVydHkpO1xuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eVBhdGggPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aChleHRlcm5hbElkUHJvcGVydHkgfHwgcHJvcGVydHkpO1xuXG5cdFx0Ly8gZ2V0IHRoZSBEYXRhTW9kZWxPYmplY3RQYXRoIGZvciB0aGUgY29sdW1uXG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgZXh0ZXJuYWxJZFBhdGggfHwgcGF0aCk7XG5cdFx0Y29uc3QgcmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aChwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGNvbnN0IHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4ocHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLCB0ZXh0UHJvcGVydHlQYXRoKTtcblx0XHRjb25zdCB0ZXh0UmVsYXRpdmVQYXRoID0gZ2V0Q29udGV4dFJlbGF0aXZlVGFyZ2V0T2JqZWN0UGF0aCh0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblxuXHRcdGlmIChyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGUpIHtcblx0XHRcdC8vIEZpZWxkR3JvdXAgdXNlLWNhc2UuIE5lZWQgdG8gYWRkIGVhY2ggRmllbGQgaW4gbmV3IGxpbmUuXG5cdFx0XHQvLyBDb25uZWN0ZWRGaWVsZHMgdXNlLWNhc2UuIE5lZWQgdG8gYWRkIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgRmllbGRzIHRoYXQgc3RheSBvbiB0aGUgc2FtZSBsaW5lLlxuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBpc1BhcnRPZmFDb25uZWN0ZWRGaWVsZHMgPyBjb25uZWN0ZWRGaWVsZHNTZXBhcmF0b3IgOiBcIlxcblwiKTtcblx0XHRcdGlmICghY29ubmVjdGVkRmllbGRzU2VwYXJhdG9yKSB7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLndyYXAgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFRoZSB0ZXh0IGFycmFuZ2VtZW50IHdpbGwgYmUgY29uc2lkZXJlZCBvbmx5IGlmIHRoZSB0ZXh0IHByb3BlcnR5IGlzIGdyb3VwYWJsZVxuXHRcdGNvbnN0IHRleHRBcnJhbmdlbWVudFRvQmVDb25zaWRlcmVkID1cblx0XHRcdHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIiAmJiAhIWFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlHcm91cGFibGUocHJvcGVydHkpXG5cdFx0XHRcdD8gISF0ZXh0UHJvcGVydHkgJiYgISFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5R3JvdXBhYmxlKHRleHRQcm9wZXJ0eSlcblx0XHRcdFx0OiB0cnVlO1xuXHRcdGlmICh0ZXh0UHJvcGVydHkgJiYgdGV4dFJlbGF0aXZlUGF0aCkge1xuXHRcdFx0aWYgKHRleHRBcnJhbmdlbWVudFRvQmVDb25zaWRlcmVkKSB7XG5cdFx0XHRcdGNvbnN0IHBhdGhGb3JUZXh0ID0gZXh0ZXJuYWxJZFBhdGggPyBleHRlcm5hbElkUGF0aCA6IHBhdGg7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5Rm9yVGV4dCA9IGV4dGVybmFsSWRQcm9wZXJ0eSA/IGV4dGVybmFsSWRQcm9wZXJ0eSA6IHByb3BlcnR5O1xuXHRcdFx0XHQvLyBDaGVjayBmb3IgVGV4dCBBcnJhbmdlbWVudC5cblx0XHRcdFx0Y29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShwcm9wZXJ0eUZvclRleHQsIHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlKTtcblx0XHRcdFx0bGV0IGRlc2NyaXB0aW9uSW5kZXg6IG51bWJlcjtcblx0XHRcdFx0c3dpdGNoIChkaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcIkRlc2NyaXB0aW9uXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0XHRpc1BhcnRPZmFDb25uZWN0ZWRGaWVsZHMgJiYgcmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlXG5cdFx0XHRcdFx0XHRcdFx0PyBgJHtjb25uZWN0ZWRGaWVsZHNTZXBhcmF0b3J9eyR7ZGVzY3JpcHRpb25JbmRleH19YFxuXHRcdFx0XHRcdFx0XHRcdDogYHske2Rlc2NyaXB0aW9uSW5kZXh9fWBcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGhGb3JUZXh0LCBwcm9wZXJ0eUZvclRleHQpO1xuXHRcdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcIlZhbHVlRGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShcblx0XHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRcdGlzUGFydE9mYUNvbm5lY3RlZEZpZWxkcyAmJiByZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ/IGAke2Nvbm5lY3RlZEZpZWxkc1NlcGFyYXRvcn17JHt2YWx1ZUluZGV4fX0gKHske2Rlc2NyaXB0aW9uSW5kZXh9fSlgXG5cdFx0XHRcdFx0XHRcdFx0OiBgeyR7dmFsdWVJbmRleH19ICh7JHtkZXNjcmlwdGlvbkluZGV4fX0pYFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aEZvclRleHQsIHByb3BlcnR5Rm9yVGV4dCk7XG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0XHR0ZXh0UmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0XHR0ZXh0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFwiRGVzY3JpcHRpb25WYWx1ZVwiXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKFxuXHRcdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdFx0aXNQYXJ0T2ZhQ29ubmVjdGVkRmllbGRzICYmIHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0XHRcdD8gYCR7Y29ubmVjdGVkRmllbGRzU2VwYXJhdG9yfXske2Rlc2NyaXB0aW9uSW5kZXh9fSAoeyR7dmFsdWVJbmRleH19KWBcblx0XHRcdFx0XHRcdFx0XHQ6IGB7JHtkZXNjcmlwdGlvbkluZGV4fX0gKHske3ZhbHVlSW5kZXh9fSlgXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aEZvclRleHQsIHByb3BlcnR5Rm9yVGV4dCk7XG5cdFx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0XHRpc1BhcnRPZmFDb25uZWN0ZWRGaWVsZHMgJiYgcmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlXG5cdFx0XHRcdFx0XHRcdFx0PyBgJHtjb25uZWN0ZWRGaWVsZHNTZXBhcmF0b3J9eyR7dmFsdWVJbmRleH19YFxuXHRcdFx0XHRcdFx0XHRcdDogYHske3ZhbHVlSW5kZXh9fWBcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aXNQYXJ0T2ZhQ29ubmVjdGVkRmllbGRzICYmIHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0PyBgJHtjb25uZWN0ZWRGaWVsZHNTZXBhcmF0b3J9eyR7dmFsdWVJbmRleH19YFxuXHRcdFx0XHRcdFx0OiBgeyR7dmFsdWVJbmRleH19YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDaGVjayBmb3IgZmllbGQgY29udGFpbmluZyBDdXJyZW5jeSBPciBVbml0IFByb3BlcnRpZXMgb3IgVGltZXpvbmVcblx0XHRcdGNvbnN0IGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGN1cnJlbmN5UHJvcGVydHkgPz8gdW5pdFByb3BlcnR5O1xuXHRcdFx0Y29uc3QgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uOiBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPiA9XG5cdFx0XHRcdHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXG5cdFx0XHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5KSB7XG5cdFx0XHRcdGNvbGxlY3RDdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0cmVsYXRpdmVQYXRoID8/IHBhdGgsXG5cdFx0XHRcdFx0YWRkVW5pdEluVGVtcGxhdGUsXG5cdFx0XHRcdFx0cHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRcdFx0XHRcdGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSxcblx0XHRcdFx0XHRpc1BhcnRPZmFDb25uZWN0ZWRGaWVsZHMsXG5cdFx0XHRcdFx0Y3VycmVuY3lQcm9wZXJ0eVxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZVByb3BlcnR5ICYmIHRpbWV6b25lQW5ub3RhdGlvbj8uJHRhcmdldCkge1xuXHRcdFx0XHRjb2xsZWN0VGltZXpvbmVQcm9wZXJ0aWVzKHByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllcywgcGF0aCwgYWRkVW5pdEluVGVtcGxhdGUpO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KHByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUgJiYgIXByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uVmFsdWVGb3JtYXQpIHx8XG5cdFx0XHRcdHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdD8uVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbGxlY3REYXRhUG9pbnRQcm9wZXJ0aWVzKHByb3BlcnR5LCByZWxhdGVkUHJvcGVydGllcywgcmVsYXRpdmVQYXRoKTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkuJFR5cGUgPT09IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMuQ29udGFjdFR5cGUpIHtcblx0XHRcdFx0Y29uc3QgY29udGFjdFByb3BlcnR5ID0gcHJvcGVydHkuZm4/LiR0YXJnZXQ7XG5cdFx0XHRcdGNvbnN0IGNvbnRhY3RQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5mbj8ucGF0aDtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ID8gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjb250YWN0UHJvcGVydHlQYXRoIDogY29udGFjdFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRjb250YWN0UHJvcGVydHlcblx0XHRcdFx0KTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdGlzUGFydE9mYUNvbm5lY3RlZEZpZWxkcyAmJiByZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGVcblx0XHRcdFx0XHRcdD8gYCR7Y29ubmVjdGVkRmllbGRzU2VwYXJhdG9yfXske3ZhbHVlSW5kZXh9fWBcblx0XHRcdFx0XHRcdDogYHske3ZhbHVlSW5kZXh9fWBcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAoIWlnbm9yZVNlbGYpIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0aWYgKCFpc1BhcnRPZmFDb25uZWN0ZWRGaWVsZHMgJiYgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdCA9IGAke2N1cnJlbmN5T3JVbml0QW5ub3RhdGlvbn1gOyAvLyBIYXJkLWNvZGVkIGN1cnJlbmN5L3VuaXRcblx0XHRcdFx0XHRpZiAocHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kpIHtcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmlzQ3VycmVuY3kgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZUFubm90YXRpb24pIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50aW1lem9uZSA9IGAke3RpbWV6b25lQW5ub3RhdGlvbn1gOyAvLyBIYXJkLWNvZGVkIHRpbWV6b25lXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZWxhdGVkUHJvcGVydGllcyA9IF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUocHJvcGVydHksIG5hdmlnYXRpb25QYXRoUHJlZml4LCB0YWJsZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzKTtcblx0XHRpZiAoT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXMpLmxlbmd0aCA+IDAgJiYgcmVsYXRpdmVQYXRoKSB7XG5cdFx0XHQvLyBXZSBkb24ndCBuZWVkIHRvIGNvbnNpZGVyIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIGZvciB0aGUgZXhwb3J0XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5wcm9wZXJ0eSA9IFtyZWxhdGl2ZVBhdGhdO1xuXHRcdH1cblx0XHRpZiAoT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXMpLmxlbmd0aCA+IDAgJiYgT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcykubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHkgaWYgbm90IGNvbGxlY3RlZCBhbHJlYWR5LlxuXHRcdFx0Ly8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBhZGRpdGlvbmFsUHJvcGVydGllcyBhcmUgbWFkZSBhdmFpbGFibGUgb25seSB0byBjb21wbGV4IHByb3BlcnR5IGluZm9zLlxuXHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUoXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRpc1BhcnRPZmFDb25uZWN0ZWRGaWVsZHMgJiYgcmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlXG5cdFx0XHRcdFx0PyBgJHtjb25uZWN0ZWRGaWVsZHNTZXBhcmF0b3J9eyR7dmFsdWVJbmRleH19YFxuXHRcdFx0XHRcdDogYHske3ZhbHVlSW5kZXh9fWBcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIG9mIFZpc3VhbGl6YXRpb24gb2YgdGhlIERhdGFQb2ludC5cbiAqIEBwYXJhbSBzb3VyY2UgU291cmNlIG9mIHRoZSBEYXRhUG9pbnQuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBvZiBWaXN1YWxpemF0aW9uIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSdzIG5vbmUuXG4gKi9cbmZ1bmN0aW9uIGdldERhdGFQb2ludFZpc3VhbGl6YXRpb24oc291cmNlOiBQcm9wZXJ0eSB8IERhdGFQb2ludFR5cGUpOiBWaXN1YWxpemF0aW9uVHlwZSB7XG5cdGxldCBkYXRhUG9pbnQ6IERhdGFQb2ludFR5cGU7XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkpIHtcblx0XHRkYXRhUG9pbnQgPSAoc291cmNlLmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludFR5cGU7XG5cdH0gZWxzZSB7XG5cdFx0ZGF0YVBvaW50ID0gc291cmNlO1xuXHR9XG5cdHJldHVybiBkYXRhUG9pbnQuVmlzdWFsaXphdGlvbiA/PyBWaXN1YWxpemF0aW9uVHlwZS5OdW1iZXI7XG59XG5cbi8qKlxuICpcdENvbGxlY3QgdGhlIHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgRGF0YVBvaW50LlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aC5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMocHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLCBwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcblx0Ly8gcGF0aCBtdXN0IG5vdCBiZSB1bmRlZmluZWQsIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGggbWF5IHJldHVybiB1bmRlZmluZWRcblx0aWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCBkYXRhUG9pbnRQcm9wZXJ0eSA9IHByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uVmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0Y29uc3QgZGF0YXBvaW50VGFyZ2V0ID0gcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0O1xuXHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblx0Ly8gRGF0YVBvaW50IHVzZS1jYXNlIHVzaW5nIERhdGFGaWVsZERlZmF1bHQuXG5cdGNvbnN0IGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA9IHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdDtcblx0Y29uc3QgdmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFQb2ludFByb3BlcnR5KTtcblx0Ly8gSWYgd2UgaGF2ZSBhIERhdGFQb2ludCB3aXRob3V0IHZpc3VhbGl6YXRpb24sIG9yIGEgTnVtYmVyLCB3ZSBkb24ndCBoYXZlIGEgVGFyZ2V0VmFsdWUvTWF4aW11bVZhbHVlXG5cdGlmIChnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uKGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YXBvaW50VGFyZ2V0KSA9PT0gVmlzdWFsaXphdGlvblR5cGUuTnVtYmVyKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHRhcmdldFZhbHVlID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFwb2ludFRhcmdldCk7XG5cdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRWYWx1ZSkpIHtcblx0XHRpZiAodGFyZ2V0VmFsdWUuJHRhcmdldCkge1xuXHRcdFx0Ly9pbiBjYXNlIGl0J3MgYSBkeW5hbWljIHRhcmdldFZhbHVlXG5cdFx0XHRjb25zdCBkYXRhUG9pbnRJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSA6IHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSxcblx0XHRcdFx0dGFyZ2V0VmFsdWUuJHRhcmdldFxuXHRcdFx0KTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWUucGF0aDtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fS97JHtkYXRhUG9pbnRJbmRleH19YCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGhhc1N0YXRpY1BlcmNlbnRVbml0KGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YVBvaW50UHJvcGVydHkpICYmIGlzQVByb2dyZXNzVHlwZUZyb21EYXRhUG9pbnQocHJvcGVydHkpKSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdCA9IFwiJVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWU7XG5cdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19LyR7dGFyZ2V0VmFsdWV9YCk7XG5cdH1cbn1cblxuLyoqXG4gKlx0Q29sbGVjdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSB3aXRoIFRpbWV6b25lLlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aC5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBTaG91bGQgd2UgYWRkIHRoZSB1bml0IGluIHRoZSB0ZW1wbGF0ZS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFRpbWV6b25lUHJvcGVydGllcyhcblx0cHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRwYXRoOiBzdHJpbmcsXG5cdGFkZFVuaXRJblRlbXBsYXRlOiBib29sZWFuXG4pOiB2b2lkIHtcblx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuQ29tbW9uLlRpbWV6b25lO1xuXHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblx0Y29uc3QgdmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBwcm9wZXJ0eSk7XG5cblx0Y29uc3QgdGltZXpvbmVPclVvTUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggKyB0aW1lem9uZUFubm90YXRpb24ucGF0aCxcblx0XHR0aW1lem9uZUFubm90YXRpb24uJHRhcmdldFxuXHQpO1xuXHRpZiAoYWRkVW5pdEluVGVtcGxhdGUpIHtcblx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0gIHske3RpbWV6b25lT3JVb01JbmRleH19YCk7XG5cdH0gZWxzZSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGltZXpvbmVQcm9wZXJ0eSA9IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgdGltZXpvbmVBbm5vdGF0aW9uLnBhdGg7XG5cdH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSByZWxhdGVkIHByb3BlcnRpZXMgZnJvbSBhIHByb3BlcnR5IHdpdGggY3VycmVuY2llcyBvciB1bml0cy5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyIGZvciB0aGUgY29sdW1uLlxuICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcHJvcGVydHkgcmVsYXRpdmUgcGF0aC5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBTcGVjaWZ5IGlmIHRoZSB1bml0IHNob3VsZCBiZSBhZGRlZCBpbiB0aGUgdGVtcGxhdGUuXG4gKiBAcGFyYW0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIFRoZSBkYXRhIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSBUaGUgY3VycmVuY3kgb3IgdW5pdCBvZiBtZWFzdXJlIHByb3BlcnR5IGxpbmtlZCB0byB0aGUgY29sdW1uLlxuICogQHBhcmFtIGN1cnJlbmN5UHJvcGVydHkgVGhlIGN1cnJlbmN5IHByb3BlcnR5IGxpbmtlZCB0byB0aGUgY29sdW1uLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0Q3VycmVuY3lPclVuaXRQcm9wZXJ0aWVzKFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cmVsYXRpdmVQYXRoOiBzdHJpbmcsXG5cdGFkZFVuaXRJblRlbXBsYXRlOiBib29sZWFuLFxuXHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+LFxuXHRjdXJyZW5jeU9yVW9NUHJvcGVydHk6IFByb3BlcnR5LFxuXHRpc1BhcnRPZmFDb25uZWN0ZWRGaWVsZHM6IGJvb2xlYW4sXG5cdGN1cnJlbmN5UHJvcGVydHk/OiBQcm9wZXJ0eVxuKTogdm9pZCB7XG5cdGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdDtcblx0aWYgKHByb3BlcnR5KSB7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVuaXRQcm9wZXJ0eVBhdGggPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgocHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoKHByb3BlcnR5KTtcblx0XHRjb25zdCB1bml0T3JDdXJyZW5jeVByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihcblx0XHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdGN1cnJlbmN5T3JVbml0UHJvcGVydHlQYXRoXG5cdFx0KTtcblx0XHRjb25zdCB1bml0T3JDdXJyZW5jeVJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgodW5pdE9yQ3VycmVuY3lQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGNvbnN0IHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcmVsYXRpdmVQYXRoLCBwcm9wZXJ0eSk7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVvTUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHVuaXRPckN1cnJlbmN5UmVsYXRpdmVQYXRoISwgY3VycmVuY3lPclVvTVByb3BlcnR5KTtcblx0XHRpZiAoYWRkVW5pdEluVGVtcGxhdGUpIHtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fSAgeyR7Y3VycmVuY3lPclVvTUluZGV4fX1gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5ID0gdW5pdE9yQ3VycmVuY3lSZWxhdGl2ZVBhdGg7XG5cdFx0fVxuXHRcdGlmIChjdXJyZW5jeVByb3BlcnR5ICYmICFpc1BhcnRPZmFDb25uZWN0ZWRGaWVsZHMpIHtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmlzQ3VycmVuY3kgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoIWlzUGFydE9mYUNvbm5lY3RlZEZpZWxkcykge1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3Muc2NhbGUgPSBwcm9wZXJ0eS5zY2FsZTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IHByb3BlcnRpZXMgY29uc3VtZWQgYnkgYSBEYXRhRmllbGQuXG4gKiBUaGlzIGlzIGZvciBwb3B1bGF0aW5nIHRoZSBDb21wbGV4UHJvcGVydHlJbmZvcyBvZiB0aGUgdGFibGUgZGVsZWdhdGUuXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgaWRlbnRpZmllZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gaXNFbWJlZGRlZCBUcnVlIGlmIHRoZSBEYXRhRmllbGQgaXMgZW1iZWRkZWQgaW4gYW5vdGhlciBhbm5vdGF0aW9uIChzdWNoIGFzIEZpZWxkR3JvdXApLlxuICogQHJldHVybnMgVGhlIHByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgRGF0YUZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSxcblx0XHRleHBvcnRTZXR0aW5nczoge31cblx0fSxcblx0aXNFbWJlZGRlZCA9IGZhbHNlLFxuXHRjb25uZWN0ZWRGaWVsZHNTZXBhcmF0b3I6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuKTogQ29tcGxleFByb3BlcnR5SW5mbyB7XG5cdGxldCBpc1N0YXRpY2FsbHlIaWRkZW4gPSBmYWxzZTtcblx0c3dpdGNoIChkYXRhRmllbGQ/LiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRpZiAoZGF0YUZpZWxkLlZhbHVlKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gZGF0YUZpZWxkLlZhbHVlO1xuXHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRwcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRcdHByb3BlcnR5LiR0YXJnZXQsXG5cdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0aXNFbWJlZGRlZCxcblx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4sXG5cdFx0XHRcdFx0Y29ubmVjdGVkRmllbGRzU2VwYXJhdG9yXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHByb3BlcnR5LnBhdGgpO1xuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUoXG5cdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4LFxuXHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllc1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0c3dpdGNoIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlOlxuXHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdFx0aW5uZXJEYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuQ29ubmVjdGVkRmllbGRzVHlwZTpcblx0XHRcdFx0XHRjb25uZWN0ZWRGaWVsZHNTZXBhcmF0b3IgPSBnZXRDb25uZWN0ZWRGaWVsZHNTZXBhcmF0b3IoZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0KTtcblx0XHRcdFx0XHRnZXRDb25uZWN0ZWRGaWVsZHNEYXRhKGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldCkuZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRcdGlubmVyRGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHRjb25uZWN0ZWRGaWVsZHNTZXBhcmF0b3Jcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpO1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLnBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGlzRW1iZWRkZWQsXG5cdFx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW5cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZTpcblx0XHRcdFx0XHRjb25zdCBkYXRhRmllbGRDb250YWN0ID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0IGFzIENvbnRhY3Q7XG5cdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKTtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQudmFsdWUsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGRDb250YWN0LFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbixcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0aXNFbWJlZGRlZCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZERhdGFUeXBlID0gZnVuY3Rpb24gKG9EYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChpc1Byb3BlcnR5KG9EYXRhRmllbGQpKSB7XG5cdFx0cmV0dXJuIG9EYXRhRmllbGQudHlwZTtcblx0fVxuXHRsZXQgc0RhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHN3aXRjaCAob0RhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRkZWZhdWx0OlxuXHRcdFx0aWYgKG9EYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0XHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdFx0XHRpZiAoZGF0YUZpZWxkVGFyZ2V0LiRUeXBlID09PSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZFRhcmdldC5mbikpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuZm4uJHRhcmdldD8udHlwZTtcblx0XHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGRUYXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiRQYXRoPy4kVHlwZSB8fCBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZS5nLiBGaWVsZEdyb3VwIG9yIENoYXJ0XG5cdFx0XHRcdFx0Ly8gRmllbGRHcm91cCBQcm9wZXJ0aWVzIGhhdmUgbm8gdHlwZSwgc28gd2UgZGVmaW5lIGl0IGFzIGEgYm9vbGVhbiB0eXBlIHRvIHByZXZlbnQgZXhjZXB0aW9ucyBkdXJpbmcgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSB3aWR0aFxuXHRcdFx0XHRcdHNEYXRhVHlwZSA9XG5cdFx0XHRcdFx0XHRvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0RGVmaW5pdGlvblR5cGVcIiA/IHVuZGVmaW5lZCA6IFwiRWRtLkJvb2xlYW5cIjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gc0RhdGFUeXBlO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0EsNEJBQTRCQSxDQUFDQyxTQUFpQyxFQUFnRDtJQUM3SCxPQUFRQSxTQUFTLENBQXFDQyxjQUFjLENBQUMsUUFBUSxDQUFDO0VBQy9FOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFKQUMsUUFBQSxDQUFBSCw0QkFBQSxHQUFBQSw0QkFBQTtFQUtPLFNBQVNJLHlCQUF5QkEsQ0FBQ0gsU0FBaUMsRUFBd0M7SUFDbEgsT0FBT0EsU0FBUyxDQUFDSSxLQUFLLHlEQUE4QztFQUNyRTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQUYsUUFBQSxDQUFBQyx5QkFBQSxHQUFBQSx5QkFBQTtFQU1PLFNBQVNFLHdCQUF3QkEsQ0FDdkNMLFNBQWtFLEVBQzVCO0lBQ3RDLE9BQU9BLFNBQVMsRUFBRUksS0FBSyx3REFBNkM7RUFDckU7RUFBQ0YsUUFBQSxDQUFBRyx3QkFBQSxHQUFBQSx3QkFBQTtFQUVNLFNBQVNDLG9CQUFvQkEsQ0FBQ04sU0FBNkMsRUFBbUM7SUFDcEgsT0FBT0EsU0FBUyxFQUFFSSxLQUFLLG9EQUF5QztFQUNqRTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQUYsUUFBQSxDQUFBSSxvQkFBQSxHQUFBQSxvQkFBQTtFQU1PLFNBQVNDLG1DQUFtQ0EsQ0FBQ1AsU0FBaUMsRUFBa0Q7SUFDdEksT0FBT0EsU0FBUyxDQUFDSSxLQUFLLG1FQUF3RDtFQUMvRTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQUYsUUFBQSxDQUFBSyxtQ0FBQSxHQUFBQSxtQ0FBQTtFQU1PLFNBQVNDLGdCQUFnQkEsQ0FBQ1IsU0FBMkMsRUFBK0I7SUFDMUcsT0FBUUEsU0FBUyxDQUFvQkMsY0FBYyxDQUFDLE9BQU8sQ0FBQztFQUM3RDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQUMsUUFBQSxDQUFBTSxnQkFBQSxHQUFBQSxnQkFBQTtFQU1PLFNBQVNDLFdBQVdBLENBQUNULFNBQThCLEVBQTBCO0lBQ25GLE9BQVFBLFNBQVMsRUFBZ0JDLGNBQWMsQ0FBQyxPQUFPLENBQUM7RUFDekQ7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBQyxRQUFBLENBQUFPLFdBQUEsR0FBQUEsV0FBQTtFQUtPLFNBQVNDLG1CQUFtQkEsQ0FBQ0Msc0JBQStELEVBQVc7SUFDN0csTUFBTUMsZUFBZSxHQUFHRCxzQkFBc0IsQ0FBQ0UsTUFBTSxDQUFDQyxPQUFPO0lBQzdELE9BQU9DLGtCQUFrQixDQUFhSCxlQUFlLDZDQUFrQyxDQUFDO0VBQ3pGOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFKQVYsUUFBQSxDQUFBUSxtQkFBQSxHQUFBQSxtQkFBQTtFQUtPLFNBQVNNLHdCQUF3QkEsQ0FBQ0wsc0JBQStELEVBQVc7SUFDbEgsTUFBTUMsZUFBZSxHQUFHRCxzQkFBc0IsQ0FBQ0UsTUFBTSxDQUFDQyxPQUFPO0lBQzdELE9BQU9DLGtCQUFrQixDQUFrQkgsZUFBZSxrREFBdUMsQ0FBQztFQUNuRzs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkFWLFFBQUEsQ0FBQWMsd0JBQUEsR0FBQUEsd0JBQUE7RUFLTyxTQUFTQyx1QkFBdUJBLENBQUNOLHNCQUErRCxFQUFXO0lBQ2pILE1BQU1DLGVBQWUsR0FBR0Qsc0JBQXNCLENBQUNFLE1BQU0sQ0FBQ0MsT0FBTztJQUM3RCxPQUFPSSxrQkFBa0IsQ0FBaUJOLGVBQWUsNkNBQWtDLENBQUM7RUFDN0Y7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBVixRQUFBLENBQUFlLHVCQUFBLEdBQUFBLHVCQUFBO0VBS08sU0FBU0Usa0JBQWtCQSxDQUFDUixzQkFBOEMsRUFBVztJQUMzRixNQUFNQyxlQUFlLEdBQUdELHNCQUFzQixDQUFDRSxNQUFNLENBQUNDLE9BQU87SUFDN0QsT0FBT0Msa0JBQWtCLENBQVlILGVBQWUsNENBQWlDLENBQUM7RUFDdkY7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEFWLFFBQUEsQ0FBQWlCLGtCQUFBLEdBQUFBLGtCQUFBO0VBTU8sU0FBU0MsaUJBQWlCQSxDQUNoQ3BCLFNBQXVHLEVBQ3ZHcUIsZ0JBQXlELEVBQ3JCO0lBQ3BDLE9BQU9DLEdBQUcsQ0FDVEMsS0FBSyxDQUNKQywyQkFBMkIsQ0FBQ3hCLFNBQVMsRUFBRXlCLFdBQVcsRUFBRUMsRUFBRSxFQUFFQyxNQUFNLEVBQUUsRUFBRSxFQUFFQyxTQUFTLEVBQUVQLGdCQUFnQixDQUFDUSw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsRUFDL0gsSUFDRCxDQUNELENBQUM7RUFDRjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkEzQixRQUFBLENBQUFrQixpQkFBQSxHQUFBQSxpQkFBQTtFQUtPLFNBQVNVLHdDQUF3Q0EsQ0FDdkRDLG1CQUFnRSxFQUM1QztJQUNwQixNQUFNQyxNQUFNLEdBQUdELG1CQUFtQixDQUFDRSxZQUFZO0lBQy9DLE9BQU9DLGtCQUFrQixDQUFDNUIsb0JBQW9CLENBQUMwQixNQUFNLENBQUMsR0FBR0EsTUFBTSxHQUFHSixTQUFTLENBQUM7RUFDN0U7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBMUIsUUFBQSxDQUFBNEIsd0NBQUEsR0FBQUEsd0NBQUE7RUFLTyxTQUFTSSxrQkFBa0JBLENBQUNsQyxTQUE4QixFQUFxQjtJQUNyRixNQUFNbUMsTUFBTSxHQUFHbkMsU0FBUyxFQUFFb0MsWUFBWTtJQUN0QyxJQUFJRCxNQUFNLEVBQUU7TUFDWCxNQUFNRSxTQUFTLEdBQUdGLE1BQU0sQ0FBQ1YsV0FBVyxFQUFFYSxNQUFNLEVBQUVDLGdCQUFnQjtNQUM5RCxJQUFJSixNQUFNLENBQUNLLFVBQVUsQ0FBQ0MsTUFBTSxHQUFHLENBQUMsSUFBSUosU0FBUyxFQUFFO1FBQzlDLE9BQU8sUUFBUTtNQUNoQixDQUFDLE1BQU07UUFDTixPQUFPLE1BQU07TUFDZDtJQUNELENBQUMsTUFBTTtNQUNOLE9BQU8sTUFBTTtJQUNkO0VBQ0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBbkMsUUFBQSxDQUFBZ0Msa0JBQUEsR0FBQUEsa0JBQUE7RUFNTyxTQUFTUSx5QkFBeUJBLENBQUNDLE1BQWdDLEVBQThDO0lBQ3ZILElBQUlDLFdBQTZFO0lBQ2pGLElBQUlDLFVBQVUsQ0FBQ0YsTUFBTSxDQUFDLEVBQUU7TUFDdkIsTUFBTUcsU0FBUyxHQUFJSCxNQUFNLENBQUNsQixXQUFXLEVBQUVDLEVBQUUsRUFBRXFCLGdCQUFnQixFQUE2QmxDLE1BQU0sRUFBRUMsT0FBd0I7TUFDeEg4QixXQUFXLEdBQUdFLFNBQVMsRUFBRUUsV0FBVyxJQUFJRixTQUFTLEVBQUVHLFlBQVk7SUFDaEUsQ0FBQyxNQUFNO01BQ05MLFdBQVcsR0FBR0QsTUFBTSxDQUFDSyxXQUFXLElBQUlMLE1BQU0sQ0FBQ00sWUFBWTtJQUN4RDtJQUNBLElBQUksT0FBT0wsV0FBVyxLQUFLLFFBQVEsRUFBRTtNQUNwQyxPQUFPQSxXQUFXLENBQUNNLFFBQVEsQ0FBQyxDQUFDO0lBQzlCO0lBQ0EsT0FBT0MsMEJBQTBCLENBQUNQLFdBQVcsQ0FBQyxHQUFHQSxXQUFXLEdBQUcsS0FBSztFQUNyRTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkExQyxRQUFBLENBQUF3Qyx5QkFBQSxHQUFBQSx5QkFBQTtFQU1PLE1BQU1VLCtCQUErQixHQUFHLFNBQUFBLENBQVVDLFFBQWtCLEVBQVc7SUFDckYsT0FDRUEsUUFBUSxDQUFDNUIsV0FBVyxFQUFFQyxFQUFFLEVBQUVxQixnQkFBZ0IsRUFBNkJsQyxNQUFNLEVBQUVDLE9BQU8sRUFBRVYsS0FBSywrQ0FBb0M7RUFFcEksQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkFGLFFBQUEsQ0FBQWtELCtCQUFBLEdBQUFBLCtCQUFBO0VBTU8sTUFBTUUseUNBQXlDLEdBQUcsU0FBQUEsQ0FBVUQsUUFBa0IsRUFBVztJQUMvRixPQUNDRCwrQkFBK0IsQ0FBQ0MsUUFBUSxDQUFDLElBQ3ZDQSxRQUFRLENBQUM1QixXQUFXLEVBQUVDLEVBQUUsRUFBRXFCLGdCQUFnQixFQUE2QmxDLE1BQU0sRUFBRUMsT0FBTyxFQUNyRnlDLGFBQWEsS0FBSyw2QkFBNkI7RUFFcEQsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkFyRCxRQUFBLENBQUFvRCx5Q0FBQSxHQUFBQSx5Q0FBQTtFQU1PLE1BQU1FLDRCQUE0QixHQUFHLFNBQUFBLENBQVVILFFBQTJDLEVBQVc7SUFDM0csSUFBSVIsVUFBVSxDQUFDUSxRQUFRLENBQUMsSUFBSUQsK0JBQStCLENBQUNDLFFBQVEsQ0FBQyxFQUFFO01BQ3RFQSxRQUFRLEdBQUdBLFFBQVEsQ0FBQzVCLFdBQVcsQ0FBQ0MsRUFBRSxFQUFFcUIsZ0JBQTBDO0lBQy9FO0lBQ0EsT0FBU00sUUFBUSxDQUE0QnhDLE1BQU0sRUFBRUMsT0FBTyxFQUFvQnlDLGFBQWEsS0FBSywrQkFBK0I7RUFDbEksQ0FBQztFQUFDckQsUUFBQSxDQUFBc0QsNEJBQUEsR0FBQUEsNEJBQUE7RUFFSyxTQUFTQyxxQkFBcUJBLENBQ3BDcEMsZ0JBQXlELEVBQ3pEcUMsTUFBeUMsRUFDcEI7SUFDckIsSUFBSSxPQUFPQSxNQUFNLEtBQUssUUFBUSxFQUFFO01BQy9CLElBQUlsRCxnQkFBZ0IsQ0FBQ2tELE1BQU0sQ0FBQyxJQUFJQSxNQUFNLENBQUNDLEtBQUssRUFBRTdDLE9BQU8sRUFBRTtRQUN0RCxNQUFNdUMsUUFBUSxHQUFHSyxNQUFNLENBQUNDLEtBQUssRUFBRTdDLE9BQU87UUFDdEMsSUFBSXVDLFFBQVEsRUFBRTVCLFdBQVcsRUFBRWEsTUFBTSxFQUFFc0IsY0FBYyxLQUFLaEMsU0FBUyxFQUFFO1VBQ2hFLE9BQU9QLGdCQUFnQixDQUFDd0MsK0JBQStCLENBQUNSLFFBQVEsRUFBRVMsa0JBQWtCLENBQUM7UUFDdEY7TUFDRCxDQUFDLE1BQU0sSUFBSWpCLFVBQVUsQ0FBQ2EsTUFBTSxDQUFDLEVBQUU7UUFDOUIsSUFBSUEsTUFBTSxFQUFFakMsV0FBVyxFQUFFYSxNQUFNLEVBQUVzQixjQUFjLEtBQUtoQyxTQUFTLEVBQUU7VUFDOUQsT0FBT1AsZ0JBQWdCLENBQUN3QywrQkFBK0IsQ0FBQ0gsTUFBTSxFQUFFSSxrQkFBa0IsQ0FBQztRQUNwRjtNQUNEO0lBQ0Q7SUFDQSxPQUFPbEMsU0FBUztFQUNqQjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBSkExQixRQUFBLENBQUF1RCxxQkFBQSxHQUFBQSxxQkFBQTtFQUtBLFNBQVNNLHdCQUF3QkEsQ0FBQ0MsSUFBd0IsRUFBVTtJQUNuRSxJQUFJQSxJQUFJLEVBQUU7TUFDVCxPQUFPQSxJQUFJLENBQUNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBR0QsSUFBSSxDQUFDRSxTQUFTLENBQUMsQ0FBQyxFQUFFRixJQUFJLENBQUNHLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFO0lBQzlFO0lBQ0EsT0FBTyxFQUFFO0VBQ1Y7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTQyw4Q0FBOENBLENBQ3REcEMsTUFBcUIsRUFDckJxQyxvQkFBNEIsRUFDNUJDLFNBQW9CLEVBQ3BCQyxpQkFBc0MsRUFDaEI7SUFDdEIsSUFBSUQsU0FBUyxLQUFLLGlCQUFpQixFQUFFO01BQ3BDLE1BQU1FLGdCQUFnQixHQUFHeEMsTUFBTSxDQUFDUCxXQUFXLEVBQUVDLEVBQUUsRUFBRUMsTUFBTTtNQUN2RCxJQUFJNkMsZ0JBQWdCLEVBQUVSLElBQUksSUFBSW5CLFVBQVUsQ0FBQzJCLGdCQUFnQixDQUFDMUQsT0FBTyxDQUFDLEVBQUU7UUFDbkUsTUFBTTJELDRCQUE0QixHQUFHSixvQkFBb0IsR0FBR0csZ0JBQWdCLENBQUNSLElBQUk7UUFDakY7UUFDQU8saUJBQWlCLENBQUNHLG9CQUFvQixDQUFDRCw0QkFBNEIsQ0FBQyxHQUFHRCxnQkFBZ0IsQ0FBQzFELE9BQU87TUFDaEc7TUFFQSxNQUFNNkQsV0FBVyxHQUFHM0MsTUFBTSxDQUFDNEMsV0FBVztNQUN0QyxJQUFJRCxXQUFXLEVBQUVYLElBQUksSUFBSW5CLFVBQVUsQ0FBQzhCLFdBQVcsRUFBRTdELE9BQU8sQ0FBQyxFQUFFO1FBQzFELE1BQU0rRCx1QkFBdUIsR0FBR1Isb0JBQW9CLEdBQUdNLFdBQVcsQ0FBQ1gsSUFBSTtRQUN2RU8saUJBQWlCLENBQUNHLG9CQUFvQixDQUFDRyx1QkFBdUIsQ0FBQyxHQUFHRixXQUFXLEVBQUU3RCxPQUFPO01BQ3ZGO0lBQ0Q7SUFDQSxPQUFPeUQsaUJBQWlCO0VBQ3pCOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTTyxnQ0FBZ0NBLENBQ3hDUCxpQkFBc0MsRUFDdENRLEdBQVcsRUFDWEMsS0FBZSxFQUNmQyxzQ0FBb0QsRUFDM0M7SUFDVCxJQUFJLENBQUNWLGlCQUFpQixDQUFDVyxVQUFVLENBQUNqRixjQUFjLENBQUM4RSxHQUFHLENBQUMsRUFBRTtNQUN0RFIsaUJBQWlCLENBQUNXLFVBQVUsQ0FBQ0gsR0FBRyxDQUFDLEdBQUc7UUFBRUksa0JBQWtCLEVBQUVIO01BQU0sQ0FBQztNQUNqRSxJQUFJQyxzQ0FBc0MsRUFBRTtRQUMzQ1YsaUJBQWlCLENBQUNXLFVBQVUsQ0FBQ0gsR0FBRyxDQUFDLENBQUNFLHNDQUFzQyxHQUFHQSxzQ0FBc0M7TUFDbEg7SUFDRDtJQUNBLE9BQU9HLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDZCxpQkFBaUIsQ0FBQ1csVUFBVSxDQUFDLENBQUNJLE9BQU8sQ0FBQ1AsR0FBRyxDQUFDO0VBQzlEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTUSxlQUFlQSxDQUFDaEIsaUJBQXNDLEVBQUVTLEtBQWEsRUFBUTtJQUNyRlQsaUJBQWlCLENBQUNpQixjQUFjLENBQUNDLFFBQVEsR0FBR2xCLGlCQUFpQixDQUFDaUIsY0FBYyxFQUFFQyxRQUFRLEdBQ25GLEdBQUdsQixpQkFBaUIsQ0FBQ2lCLGNBQWMsQ0FBQ0MsUUFBUSxHQUFHVCxLQUFLLEVBQUUsR0FDdEQsR0FBR0EsS0FBSyxFQUFFO0VBQ2Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU1Usd0JBQXdCQSxDQUN2QzFCLElBQVksRUFDWlgsUUFBdUIsRUFDdkJoQyxnQkFBa0MsRUFDbENzRSxVQUFtQixFQUNuQnJCLFNBQW9CLEVBU0U7SUFBQSxJQVJ0QkMsaUJBQXNDLEdBQUFxQixTQUFBLENBQUFuRCxNQUFBLFFBQUFtRCxTQUFBLFFBQUFoRSxTQUFBLEdBQUFnRSxTQUFBLE1BQUc7TUFDeENWLFVBQVUsRUFBRSxDQUFDLENBQUM7TUFDZFIsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO01BQ3hCYyxjQUFjLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQUEsSUFDREssaUJBQWlCLEdBQUFELFNBQUEsQ0FBQW5ELE1BQUEsUUFBQW1ELFNBQUEsUUFBQWhFLFNBQUEsR0FBQWdFLFNBQUEsTUFBRyxLQUFLO0lBQUEsSUFDekJFLG1CQUFtQixHQUFBRixTQUFBLENBQUFuRCxNQUFBLFFBQUFtRCxTQUFBLFFBQUFoRSxTQUFBLEdBQUFnRSxTQUFBLE1BQUcsS0FBSztJQUFBLElBQzNCRyx3QkFBNEMsR0FBQUgsU0FBQSxDQUFBbkQsTUFBQSxRQUFBbUQsU0FBQSxRQUFBaEUsU0FBQSxHQUFBZ0UsU0FBQSxNQUFHaEUsU0FBUztJQUV4RCxNQUFNb0Usd0JBQXdCLEdBQUcsQ0FBQyxDQUFDRCx3QkFBd0I7SUFDM0QsSUFBSS9CLElBQUksSUFBSVgsUUFBUSxFQUFFO01BQ3JCLElBQUk0QyxVQUFrQjtNQUN0QjtNQUNBLE1BQU1DLGNBQWMsR0FBR0MsbUNBQW1DLENBQUM5QyxRQUFRLENBQUM7TUFDcEUsTUFBTStDLGtCQUFrQixHQUFHQywrQkFBK0IsQ0FBQ2hELFFBQVEsQ0FBQztNQUVwRSxJQUFJeUMsbUJBQW1CLEVBQUU7UUFDeEI7UUFDQUcsVUFBVSxHQUFHbkIsZ0NBQWdDLENBQUNQLGlCQUFpQixFQUFFUCxJQUFJLEVBQUVYLFFBQVEsQ0FBQztRQUNoRmtDLGVBQWUsQ0FDZGhCLGlCQUFpQixFQUNqQnlCLHdCQUF3QixJQUFJekIsaUJBQWlCLENBQUNpQixjQUFjLEVBQUVDLFFBQVEsR0FDbkUsR0FBR00sd0JBQXdCLElBQUlFLFVBQVUsR0FBRyxHQUM1QyxJQUFJQSxVQUFVLEdBQ2xCLENBQUM7UUFDRCxPQUFPMUIsaUJBQWlCO01BQ3pCO01BQ0EsTUFBTUYsb0JBQW9CLEdBQUdOLHdCQUF3QixDQUFDQyxJQUFJLENBQUM7TUFFM0QsTUFBTXNDLFVBQVUsR0FBR2pGLGdCQUFnQixDQUFDa0YsYUFBYSxDQUFDLENBQUM7TUFDbkQsTUFBTUMsaUJBQWlCLEdBQUcsSUFBSUMsaUJBQWlCLENBQUNILFVBQVUsRUFBRWpGLGdCQUFnQixDQUFDOztNQUU3RTtNQUNBLE1BQU1xRixZQUFZLEdBQUdDLHlCQUF5QixDQUFDUCxrQkFBa0IsSUFBSS9DLFFBQVEsQ0FBQztNQUM5RSxNQUFNdUQsZ0JBQWdCLEdBQUdDLDZCQUE2QixDQUFDVCxrQkFBa0IsSUFBSS9DLFFBQVEsQ0FBQzs7TUFFdEY7TUFDQSxNQUFNdEIsbUJBQW1CLEdBQUdWLGdCQUFnQixDQUFDeUYsc0JBQXNCLENBQUN6RixnQkFBZ0IsQ0FBQzBGLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0Msc0JBQXNCLENBQUMsQ0FBQztNQUMvSCxNQUFNQywyQkFBMkIsR0FBR0Msb0JBQW9CLENBQVduRixtQkFBbUIsRUFBRW1FLGNBQWMsSUFBSWxDLElBQUksQ0FBQztNQUMvRyxNQUFNbUQsWUFBWSxHQUFHQyxrQ0FBa0MsQ0FBQ0gsMkJBQTJCLENBQUM7TUFDcEYsTUFBTUksK0JBQStCLEdBQUdILG9CQUFvQixDQUFXRCwyQkFBMkIsRUFBRUwsZ0JBQWdCLENBQUM7TUFDckgsTUFBTVUsZ0JBQWdCLEdBQUdGLGtDQUFrQyxDQUFDQywrQkFBK0IsQ0FBQztNQUU1RixJQUFJOUMsaUJBQWlCLENBQUNpQixjQUFjLEVBQUVDLFFBQVEsRUFBRTtRQUMvQztRQUNBO1FBQ0FGLGVBQWUsQ0FBQ2hCLGlCQUFpQixFQUFFeUIsd0JBQXdCLEdBQUdELHdCQUF3QixHQUFHLElBQUksQ0FBQztRQUM5RixJQUFJLENBQUNBLHdCQUF3QixFQUFFO1VBQzlCeEIsaUJBQWlCLENBQUNpQixjQUFjLENBQUMrQixJQUFJLEdBQUcsSUFBSTtRQUM3QztNQUNEOztNQUVBO01BQ0EsTUFBTUMsNkJBQTZCLEdBQ2xDbEQsU0FBUyxLQUFLLGlCQUFpQixJQUFJLENBQUMsQ0FBQ2tDLGlCQUFpQixDQUFDaUIsbUJBQW1CLENBQUNwRSxRQUFRLENBQUMsR0FDakYsQ0FBQyxDQUFDcUQsWUFBWSxJQUFJLENBQUMsQ0FBQ0YsaUJBQWlCLENBQUNpQixtQkFBbUIsQ0FBQ2YsWUFBWSxDQUFDLEdBQ3ZFLElBQUk7TUFDUixJQUFJQSxZQUFZLElBQUlZLGdCQUFnQixFQUFFO1FBQ3JDLElBQUlFLDZCQUE2QixFQUFFO1VBQ2xDLE1BQU1FLFdBQVcsR0FBR3hCLGNBQWMsR0FBR0EsY0FBYyxHQUFHbEMsSUFBSTtVQUMxRCxNQUFNMkQsZUFBZSxHQUFHdkIsa0JBQWtCLEdBQUdBLGtCQUFrQixHQUFHL0MsUUFBUTtVQUMxRTtVQUNBLE1BQU11RSxXQUFXLEdBQUdDLGNBQWMsQ0FBQ0YsZUFBZSxFQUFFViwyQkFBMkIsQ0FBQ2EsZ0JBQWdCLENBQUM7VUFDakcsSUFBSUMsZ0JBQXdCO1VBQzVCLFFBQVFILFdBQVc7WUFDbEIsS0FBSyxhQUFhO2NBQ2pCRyxnQkFBZ0IsR0FBR2pELGdDQUFnQyxDQUNsRFAsaUJBQWlCLEVBQ2pCK0MsZ0JBQWdCLEVBQ2hCWixZQUFZLEVBQ1osYUFDRCxDQUFDO2NBQ0RuQixlQUFlLENBQ2RoQixpQkFBaUIsRUFDakJ5Qix3QkFBd0IsSUFBSXpCLGlCQUFpQixDQUFDaUIsY0FBYyxFQUFFQyxRQUFRLEdBQ25FLEdBQUdNLHdCQUF3QixJQUFJZ0MsZ0JBQWdCLEdBQUcsR0FDbEQsSUFBSUEsZ0JBQWdCLEdBQ3hCLENBQUM7Y0FDRDtZQUVELEtBQUssa0JBQWtCO2NBQ3RCOUIsVUFBVSxHQUFHbkIsZ0NBQWdDLENBQUNQLGlCQUFpQixFQUFFbUQsV0FBVyxFQUFFQyxlQUFlLENBQUM7Y0FDOUZJLGdCQUFnQixHQUFHakQsZ0NBQWdDLENBQ2xEUCxpQkFBaUIsRUFDakIrQyxnQkFBZ0IsRUFDaEJaLFlBQVksRUFDWixrQkFDRCxDQUFDO2NBQ0RuQixlQUFlLENBQ2RoQixpQkFBaUIsRUFDakJ5Qix3QkFBd0IsSUFBSXpCLGlCQUFpQixDQUFDaUIsY0FBYyxFQUFFQyxRQUFRLEdBQ25FLEdBQUdNLHdCQUF3QixJQUFJRSxVQUFVLE9BQU84QixnQkFBZ0IsSUFBSSxHQUNwRSxJQUFJOUIsVUFBVSxPQUFPOEIsZ0JBQWdCLElBQ3pDLENBQUM7Y0FDRDtZQUVELEtBQUssa0JBQWtCO2NBQ3RCOUIsVUFBVSxHQUFHbkIsZ0NBQWdDLENBQUNQLGlCQUFpQixFQUFFbUQsV0FBVyxFQUFFQyxlQUFlLENBQUM7Y0FDOUZJLGdCQUFnQixHQUFHakQsZ0NBQWdDLENBQ2xEUCxpQkFBaUIsRUFDakIrQyxnQkFBZ0IsRUFDaEJaLFlBQVksRUFDWixrQkFDRCxDQUFDO2NBQ0RuQixlQUFlLENBQ2RoQixpQkFBaUIsRUFDakJ5Qix3QkFBd0IsSUFBSXpCLGlCQUFpQixDQUFDaUIsY0FBYyxFQUFFQyxRQUFRLEdBQ25FLEdBQUdNLHdCQUF3QixJQUFJZ0MsZ0JBQWdCLE9BQU85QixVQUFVLElBQUksR0FDcEUsSUFBSThCLGdCQUFnQixPQUFPOUIsVUFBVSxJQUN6QyxDQUFDO2NBQ0Q7WUFDRDtjQUNDQSxVQUFVLEdBQUduQixnQ0FBZ0MsQ0FBQ1AsaUJBQWlCLEVBQUVtRCxXQUFXLEVBQUVDLGVBQWUsQ0FBQztjQUM5RnBDLGVBQWUsQ0FDZGhCLGlCQUFpQixFQUNqQnlCLHdCQUF3QixJQUFJekIsaUJBQWlCLENBQUNpQixjQUFjLEVBQUVDLFFBQVEsR0FDbkUsR0FBR00sd0JBQXdCLElBQUlFLFVBQVUsR0FBRyxHQUM1QyxJQUFJQSxVQUFVLEdBQ2xCLENBQUM7Y0FDRDtVQUNGO1FBQ0QsQ0FBQyxNQUFNO1VBQ047VUFDQUEsVUFBVSxHQUFHbkIsZ0NBQWdDLENBQUNQLGlCQUFpQixFQUFFUCxJQUFJLEVBQUVYLFFBQVEsQ0FBQztVQUNoRmtDLGVBQWUsQ0FDZGhCLGlCQUFpQixFQUNqQnlCLHdCQUF3QixJQUFJekIsaUJBQWlCLENBQUNpQixjQUFjLEVBQUVDLFFBQVEsR0FDbkUsR0FBR00sd0JBQXdCLElBQUlFLFVBQVUsR0FBRyxHQUM1QyxJQUFJQSxVQUFVLEdBQ2xCLENBQUM7UUFDRjtNQUNELENBQUMsTUFBTTtRQUNOO1FBQ0EsTUFBTStCLGdCQUFnQixHQUFHQyw2QkFBNkIsQ0FBQzVFLFFBQVEsQ0FBQztRQUNoRSxNQUFNNkUsWUFBWSxHQUFHQyx5QkFBeUIsQ0FBQzlFLFFBQVEsQ0FBQztRQUN4RCxNQUFNK0UscUJBQXFCLEdBQUdKLGdCQUFnQixJQUFJRSxZQUFZO1FBQzlELE1BQU1HLHdCQUEwRCxHQUMvRGhGLFFBQVEsRUFBRTVCLFdBQVcsRUFBRTZHLFFBQVEsRUFBRUMsV0FBVyxJQUFJbEYsUUFBUSxFQUFFNUIsV0FBVyxFQUFFNkcsUUFBUSxFQUFFRSxJQUFJO1FBQ3RGLE1BQU1DLGdCQUFnQixHQUFHQyw2QkFBNkIsQ0FBQ3JGLFFBQVEsQ0FBQztRQUNoRSxNQUFNc0Ysa0JBQWtCLEdBQUd0RixRQUFRLEVBQUU1QixXQUFXLEVBQUVhLE1BQU0sRUFBRXNHLFFBQVE7UUFFbEUsSUFBSVIscUJBQXFCLEVBQUU7VUFDMUJTLCtCQUErQixDQUM5QnRFLGlCQUFpQixFQUNqQjRDLFlBQVksSUFBSW5ELElBQUksRUFDcEI2QixpQkFBaUIsRUFDakJvQiwyQkFBMkIsRUFDM0JtQixxQkFBcUIsRUFDckJwQyx3QkFBd0IsRUFDeEJnQyxnQkFDRCxDQUFDO1FBQ0YsQ0FBQyxNQUFNLElBQUlTLGdCQUFnQixJQUFJRSxrQkFBa0IsRUFBRTdILE9BQU8sRUFBRTtVQUMzRGdJLHlCQUF5QixDQUFDekYsUUFBUSxFQUFFa0IsaUJBQWlCLEVBQUVQLElBQUksRUFBRTZCLGlCQUFpQixDQUFDO1FBQ2hGLENBQUMsTUFBTSxJQUNMeEMsUUFBUSxDQUFDeEMsTUFBTSxFQUFFQyxPQUFPLEVBQUVWLEtBQUssK0NBQW9DLElBQUksQ0FBQ2lELFFBQVEsQ0FBQ3hDLE1BQU0sRUFBRUMsT0FBTyxFQUFFaUksV0FBVyxJQUM5RzFGLFFBQVEsQ0FBQzVCLFdBQVcsRUFBRUMsRUFBRSxFQUFFcUIsZ0JBQWdCLEVBQUVsQyxNQUFNLEVBQUVDLE9BQU8sRUFBRVYsS0FBSywrQ0FBb0MsRUFDckc7VUFDRDRJLDBCQUEwQixDQUFDM0YsUUFBUSxFQUFFa0IsaUJBQWlCLEVBQUU0QyxZQUFZLENBQUM7UUFDdEUsQ0FBQyxNQUFNLElBQUk5RCxRQUFRLENBQUNqRCxLQUFLLHdEQUE2QyxFQUFFO1VBQ3ZFLE1BQU02SSxlQUFlLEdBQUc1RixRQUFRLENBQUM2RixFQUFFLEVBQUVwSSxPQUFPO1VBQzVDLE1BQU1xSSxtQkFBbUIsR0FBRzlGLFFBQVEsQ0FBQzZGLEVBQUUsRUFBRWxGLElBQUk7VUFDN0NpQyxVQUFVLEdBQUduQixnQ0FBZ0MsQ0FDNUNQLGlCQUFpQixFQUNqQkYsb0JBQW9CLEdBQUdBLG9CQUFvQixHQUFHOEUsbUJBQW1CLEdBQUdBLG1CQUFtQixFQUN2RkYsZUFDRCxDQUFDO1VBQ0QxRCxlQUFlLENBQ2RoQixpQkFBaUIsRUFDakJ5Qix3QkFBd0IsSUFBSXpCLGlCQUFpQixDQUFDaUIsY0FBYyxFQUFFQyxRQUFRLEdBQ25FLEdBQUdNLHdCQUF3QixJQUFJRSxVQUFVLEdBQUcsR0FDNUMsSUFBSUEsVUFBVSxHQUNsQixDQUFDO1FBQ0YsQ0FBQyxNQUFNLElBQUksQ0FBQ04sVUFBVSxFQUFFO1VBQ3ZCO1VBQ0FNLFVBQVUsR0FBR25CLGdDQUFnQyxDQUFDUCxpQkFBaUIsRUFBRVAsSUFBSSxFQUFFWCxRQUFRLENBQUM7VUFDaEZrQyxlQUFlLENBQUNoQixpQkFBaUIsRUFBRSxJQUFJMEIsVUFBVSxHQUFHLENBQUM7VUFDckQsSUFBSSxDQUFDRCx3QkFBd0IsSUFBSXFDLHdCQUF3QixFQUFFO1lBQzFEOUQsaUJBQWlCLENBQUNpQixjQUFjLENBQUM0RCxJQUFJLEdBQUcsR0FBR2Ysd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLElBQUloRixRQUFRLEVBQUU1QixXQUFXLEVBQUU2RyxRQUFRLEVBQUVDLFdBQVcsRUFBRTtjQUNqRGhFLGlCQUFpQixDQUFDaUIsY0FBYyxDQUFDNkQsVUFBVSxHQUFHLElBQUk7WUFDbkQ7VUFDRCxDQUFDLE1BQU0sSUFBSVYsa0JBQWtCLEVBQUU7WUFDOUJwRSxpQkFBaUIsQ0FBQ2lCLGNBQWMsQ0FBQzhELFFBQVEsR0FBRyxHQUFHWCxrQkFBa0IsRUFBRSxDQUFDLENBQUM7VUFDdEU7UUFDRDtNQUNEO01BRUFwRSxpQkFBaUIsR0FBR0gsOENBQThDLENBQUNmLFFBQVEsRUFBRWdCLG9CQUFvQixFQUFFQyxTQUFTLEVBQUVDLGlCQUFpQixDQUFDO01BQ2hJLElBQUlhLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDZCxpQkFBaUIsQ0FBQ0csb0JBQW9CLENBQUMsQ0FBQ2pDLE1BQU0sR0FBRyxDQUFDLElBQUkwRSxZQUFZLEVBQUU7UUFDbkY7UUFDQTVDLGlCQUFpQixDQUFDaUIsY0FBYyxDQUFDbkMsUUFBUSxHQUFHLENBQUM4RCxZQUFZLENBQUM7TUFDM0Q7TUFDQSxJQUFJL0IsTUFBTSxDQUFDQyxJQUFJLENBQUNkLGlCQUFpQixDQUFDRyxvQkFBb0IsQ0FBQyxDQUFDakMsTUFBTSxHQUFHLENBQUMsSUFBSTJDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDZCxpQkFBaUIsQ0FBQ1csVUFBVSxDQUFDLENBQUN6QyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzdIO1FBQ0E7UUFDQXdELFVBQVUsR0FBR25CLGdDQUFnQyxDQUFDUCxpQkFBaUIsRUFBRVAsSUFBSSxFQUFFWCxRQUFRLENBQUM7UUFDaEZrQyxlQUFlLENBQ2RoQixpQkFBaUIsRUFDakJ5Qix3QkFBd0IsSUFBSXpCLGlCQUFpQixDQUFDaUIsY0FBYyxFQUFFQyxRQUFRLEdBQ25FLEdBQUdNLHdCQUF3QixJQUFJRSxVQUFVLEdBQUcsR0FDNUMsSUFBSUEsVUFBVSxHQUNsQixDQUFDO01BQ0Y7SUFDRDtJQUNBLE9BQU8xQixpQkFBaUI7RUFDekI7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUpBckUsUUFBQSxDQUFBd0Ysd0JBQUEsR0FBQUEsd0JBQUE7RUFLQSxTQUFTNkQseUJBQXlCQSxDQUFDNUcsTUFBZ0MsRUFBcUI7SUFDdkYsSUFBSUcsU0FBd0I7SUFDNUIsSUFBSUQsVUFBVSxDQUFDRixNQUFNLENBQUMsRUFBRTtNQUN2QkcsU0FBUyxHQUFJSCxNQUFNLENBQUNsQixXQUFXLEVBQUVDLEVBQUUsRUFBRXFCLGdCQUFnQixFQUE2QmxDLE1BQU0sRUFBRUMsT0FBd0I7SUFDbkgsQ0FBQyxNQUFNO01BQ05nQyxTQUFTLEdBQUdILE1BQU07SUFDbkI7SUFDQSxPQUFPRyxTQUFTLENBQUNTLGFBQWEsaUNBQTRCO0VBQzNEOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLFNBQVN5RiwwQkFBMEJBLENBQUMzRixRQUF1QixFQUFFa0IsaUJBQXNDLEVBQUVQLElBQXdCLEVBQVE7SUFDcEk7SUFDQSxJQUFJQSxJQUFJLEtBQUtwQyxTQUFTLEVBQUU7TUFDdkI7SUFDRDtJQUNBLE1BQU00SCxpQkFBaUIsR0FBR25HLFFBQVEsQ0FBQ3hDLE1BQU0sRUFBRUMsT0FBTyxFQUFFNkMsS0FBSyxDQUFDN0MsT0FBbUI7SUFDN0UsTUFBTTJJLGVBQWUsR0FBR3BHLFFBQVEsQ0FBQ3hDLE1BQU0sRUFBRUMsT0FBTztJQUNoRCxNQUFNdUQsb0JBQW9CLEdBQUdOLHdCQUF3QixDQUFDQyxJQUFJLENBQUM7SUFDM0Q7SUFDQSxNQUFNMEYsd0JBQXdCLEdBQUdyRyxRQUFRLENBQUM1QixXQUFXLEVBQUVDLEVBQUUsRUFBRXFCLGdCQUFnQjtJQUMzRSxNQUFNa0QsVUFBVSxHQUFHbkIsZ0NBQWdDLENBQUNQLGlCQUFpQixFQUFFUCxJQUFJLEVBQUUwRix3QkFBd0IsR0FBR3JHLFFBQVEsR0FBR21HLGlCQUFpQixDQUFDO0lBQ3JJO0lBQ0EsSUFBSUQseUJBQXlCLENBQUNHLHdCQUF3QixHQUFHckcsUUFBUSxHQUFHb0csZUFBZSxDQUFDLGtDQUE2QixFQUFFO01BQ2xIO0lBQ0Q7SUFDQSxNQUFNN0csV0FBVyxHQUFHRix5QkFBeUIsQ0FBQ2dILHdCQUF3QixHQUFHckcsUUFBUSxHQUFHb0csZUFBZSxDQUFDO0lBQ3BHLElBQUl0RywwQkFBMEIsQ0FBQ1AsV0FBVyxDQUFDLEVBQUU7TUFDNUMsSUFBSUEsV0FBVyxDQUFDOUIsT0FBTyxFQUFFO1FBQ3hCO1FBQ0EsTUFBTTZJLGNBQWMsR0FBRzdFLGdDQUFnQyxDQUN0RFAsaUJBQWlCLEVBQ2pCRixvQkFBb0IsR0FBR0Esb0JBQW9CLEdBQUd6QixXQUFXLENBQUM5QixPQUFPLENBQUM4SSxJQUFJLEdBQUdoSCxXQUFXLENBQUM5QixPQUFPLENBQUM4SSxJQUFJLEVBQ2pHaEgsV0FBVyxDQUFDOUIsT0FDYixDQUFDO1FBQ0R5RCxpQkFBaUIsQ0FBQ2lCLGNBQWMsQ0FBQ3FFLG9CQUFvQixHQUFHakgsV0FBVyxDQUFDb0IsSUFBSTtRQUN4RXVCLGVBQWUsQ0FBQ2hCLGlCQUFpQixFQUFFLElBQUkwQixVQUFVLE1BQU0wRCxjQUFjLEdBQUcsQ0FBQztNQUMxRTtJQUNELENBQUMsTUFBTSxJQUFJRyxvQkFBb0IsQ0FBQ0osd0JBQXdCLEdBQUdyRyxRQUFRLEdBQUdtRyxpQkFBaUIsQ0FBQyxJQUFJaEcsNEJBQTRCLENBQUNILFFBQVEsQ0FBQyxFQUFFO01BQ25Ja0IsaUJBQWlCLENBQUNpQixjQUFjLENBQUM0RCxJQUFJLEdBQUcsR0FBRztJQUM1QyxDQUFDLE1BQU07TUFDTjdFLGlCQUFpQixDQUFDaUIsY0FBYyxDQUFDcUUsb0JBQW9CLEdBQUdqSCxXQUFXO01BQ25FMkMsZUFBZSxDQUFDaEIsaUJBQWlCLEVBQUUsSUFBSTBCLFVBQVUsS0FBS3JELFdBQVcsRUFBRSxDQUFDO0lBQ3JFO0VBQ0Q7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTa0cseUJBQXlCQSxDQUNqQ3pGLFFBQXVCLEVBQ3ZCa0IsaUJBQXNDLEVBQ3RDUCxJQUFZLEVBQ1o2QixpQkFBMEIsRUFDbkI7SUFDUCxNQUFNOEMsa0JBQWtCLEdBQUd0RixRQUFRLENBQUM1QixXQUFXLENBQUNhLE1BQU0sQ0FBQ3NHLFFBQVE7SUFDL0QsTUFBTXZFLG9CQUFvQixHQUFHTix3QkFBd0IsQ0FBQ0MsSUFBSSxDQUFDO0lBQzNELE1BQU1pQyxVQUFVLEdBQUduQixnQ0FBZ0MsQ0FBQ1AsaUJBQWlCLEVBQUVQLElBQUksRUFBRVgsUUFBUSxDQUFDO0lBRXRGLE1BQU0wRyxrQkFBa0IsR0FBR2pGLGdDQUFnQyxDQUMxRFAsaUJBQWlCLEVBQ2pCRixvQkFBb0IsR0FBR3NFLGtCQUFrQixDQUFDM0UsSUFBSSxFQUM5QzJFLGtCQUFrQixDQUFDN0gsT0FDcEIsQ0FBQztJQUNELElBQUkrRSxpQkFBaUIsRUFBRTtNQUN0Qk4sZUFBZSxDQUFDaEIsaUJBQWlCLEVBQUUsSUFBSTBCLFVBQVUsT0FBTzhELGtCQUFrQixHQUFHLENBQUM7SUFDL0UsQ0FBQyxNQUFNO01BQ054RixpQkFBaUIsQ0FBQ2lCLGNBQWMsQ0FBQ2lELGdCQUFnQixHQUFHcEUsb0JBQW9CLEdBQUdzRSxrQkFBa0IsQ0FBQzNFLElBQUk7SUFDbkc7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTNkUsK0JBQStCQSxDQUN2Q3RFLGlCQUFzQyxFQUN0QzRDLFlBQW9CLEVBQ3BCdEIsaUJBQTBCLEVBQzFCb0IsMkJBQTBELEVBQzFEbUIscUJBQStCLEVBQy9CcEMsd0JBQWlDLEVBQ2pDZ0MsZ0JBQTJCLEVBQ3BCO0lBQ1AsTUFBTTNFLFFBQVEsR0FBRzRELDJCQUEyQixDQUFDaEYsWUFBWTtJQUN6RCxJQUFJb0IsUUFBUSxFQUFFO01BQ2IsTUFBTTJHLDBCQUEwQixHQUFHQyxpQ0FBaUMsQ0FBQzVHLFFBQVEsQ0FBQyxJQUFJNkcsNkJBQTZCLENBQUM3RyxRQUFRLENBQUM7TUFDekgsTUFBTThHLHlDQUF5QyxHQUFHakQsb0JBQW9CLENBQ3JFRCwyQkFBMkIsRUFDM0IrQywwQkFDRCxDQUFDO01BQ0QsTUFBTUksMEJBQTBCLEdBQUdoRCxrQ0FBa0MsQ0FBQytDLHlDQUF5QyxDQUFDO01BQ2hILE1BQU1sRSxVQUFVLEdBQUduQixnQ0FBZ0MsQ0FBQ1AsaUJBQWlCLEVBQUU0QyxZQUFZLEVBQUU5RCxRQUFRLENBQUM7TUFDOUYsTUFBTWdILGtCQUFrQixHQUFHdkYsZ0NBQWdDLENBQUNQLGlCQUFpQixFQUFFNkYsMEJBQTBCLEVBQUdoQyxxQkFBcUIsQ0FBQztNQUNsSSxJQUFJdkMsaUJBQWlCLEVBQUU7UUFDdEJOLGVBQWUsQ0FBQ2hCLGlCQUFpQixFQUFFLElBQUkwQixVQUFVLE9BQU9vRSxrQkFBa0IsR0FBRyxDQUFDO01BQy9FLENBQUMsTUFBTTtRQUNOOUYsaUJBQWlCLENBQUNpQixjQUFjLENBQUMwQyxZQUFZLEdBQUdrQywwQkFBMEI7TUFDM0U7TUFDQSxJQUFJcEMsZ0JBQWdCLElBQUksQ0FBQ2hDLHdCQUF3QixFQUFFO1FBQ2xEekIsaUJBQWlCLENBQUNpQixjQUFjLENBQUM2RCxVQUFVLEdBQUcsSUFBSTtNQUNuRDtNQUNBLElBQUksQ0FBQ3JELHdCQUF3QixFQUFFO1FBQzlCekIsaUJBQWlCLENBQUNpQixjQUFjLENBQUM4RSxLQUFLLEdBQUdqSCxRQUFRLENBQUNpSCxLQUFLO01BQ3hEO0lBQ0Q7RUFDRDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNDLG1DQUFtQ0EsQ0FDbER2SyxTQUFpQyxFQUNqQ3FCLGdCQUFrQyxFQUNsQ2lELFNBQW9CLEVBUUU7SUFBQSxJQVB0QkMsaUJBQXNDLEdBQUFxQixTQUFBLENBQUFuRCxNQUFBLFFBQUFtRCxTQUFBLFFBQUFoRSxTQUFBLEdBQUFnRSxTQUFBLE1BQUc7TUFDeENWLFVBQVUsRUFBRSxDQUFDLENBQUM7TUFDZFIsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO01BQ3hCYyxjQUFjLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQUEsSUFDRGdGLFVBQVUsR0FBQTVFLFNBQUEsQ0FBQW5ELE1BQUEsUUFBQW1ELFNBQUEsUUFBQWhFLFNBQUEsR0FBQWdFLFNBQUEsTUFBRyxLQUFLO0lBQUEsSUFDbEJHLHdCQUE0QyxHQUFBSCxTQUFBLENBQUFuRCxNQUFBLFFBQUFtRCxTQUFBLFFBQUFoRSxTQUFBLEdBQUFnRSxTQUFBLE1BQUdoRSxTQUFTO0lBRXhELElBQUk2SSxrQkFBa0IsR0FBRyxLQUFLO0lBQzlCLFFBQVF6SyxTQUFTLEVBQUVJLEtBQUs7TUFDdkI7TUFDQTtNQUNBO01BQ0E7TUFDQTtRQUNDLElBQUlKLFNBQVMsQ0FBQzJELEtBQUssRUFBRTtVQUNwQixNQUFNTixRQUFRLEdBQUdyRCxTQUFTLENBQUMyRCxLQUFLO1VBQ2hDOEcsa0JBQWtCLEdBQUdDLG1DQUFtQyxDQUFDMUssU0FBUyxDQUFDO1VBQ25FdUUsaUJBQWlCLEdBQUdtQix3QkFBd0IsQ0FDM0NyQyxRQUFRLENBQUNXLElBQUksRUFDYlgsUUFBUSxDQUFDdkMsT0FBTyxFQUNoQk8sZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTGlELFNBQVMsRUFDVEMsaUJBQWlCLEVBQ2pCaUcsVUFBVSxFQUNWQyxrQkFBa0IsRUFDbEIxRSx3QkFDRCxDQUFDO1VBQ0QsTUFBTTFCLG9CQUFvQixHQUFHTix3QkFBd0IsQ0FBQ1YsUUFBUSxDQUFDVyxJQUFJLENBQUM7VUFDcEVPLGlCQUFpQixHQUFHSCw4Q0FBOEMsQ0FDakVwRSxTQUFTLEVBQ1RxRSxvQkFBb0IsRUFDcEJDLFNBQVMsRUFDVEMsaUJBQ0QsQ0FBQztRQUNGO1FBQ0E7TUFFRDtNQUNBO1FBQ0M7TUFFRDtRQUNDLFFBQVF2RSxTQUFTLENBQUNhLE1BQU0sRUFBRUMsT0FBTyxFQUFFVixLQUFLO1VBQ3ZDO1lBQ0NKLFNBQVMsQ0FBQ2EsTUFBTSxDQUFDQyxPQUFPLENBQUM2SixJQUFJLEVBQUVDLE9BQU8sQ0FBRUMsY0FBc0MsSUFBSztjQUNsRnRHLGlCQUFpQixHQUFHZ0csbUNBQW1DLENBQ3RETSxjQUFjLEVBQ2R4SixnQkFBZ0IsRUFDaEJpRCxTQUFTLEVBQ1RDLGlCQUFpQixFQUNqQixJQUNELENBQUM7WUFDRixDQUFDLENBQUM7WUFDRjtVQUNEO1lBQ0N3Qix3QkFBd0IsR0FBRytFLDJCQUEyQixDQUFDOUssU0FBUyxDQUFDYSxNQUFNLENBQUNDLE9BQU8sQ0FBQztZQUNoRmlLLHNCQUFzQixDQUFDL0ssU0FBUyxDQUFDYSxNQUFNLENBQUNDLE9BQU8sQ0FBQyxDQUFDOEosT0FBTyxDQUFFQyxjQUFzQyxJQUFLO2NBQ3BHdEcsaUJBQWlCLEdBQUdnRyxtQ0FBbUMsQ0FDdERNLGNBQWMsRUFDZHhKLGdCQUFnQixFQUNoQmlELFNBQVMsRUFDVEMsaUJBQWlCLEVBQ2pCLElBQUksRUFDSndCLHdCQUNELENBQUM7WUFDRixDQUFDLENBQUM7WUFDRjtVQUNEO1lBQ0MwRSxrQkFBa0IsR0FBR0MsbUNBQW1DLENBQUMxSyxTQUFTLENBQUM7WUFDbkV1RSxpQkFBaUIsR0FBR21CLHdCQUF3QixDQUMzQzFGLFNBQVMsQ0FBQ2EsTUFBTSxDQUFDQyxPQUFPLENBQUM2QyxLQUFLLENBQUNLLElBQUksRUFDbkNoRSxTQUFTLEVBQ1RxQixnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMaUQsU0FBUyxFQUNUQyxpQkFBaUIsRUFDakJpRyxVQUFVLEVBQ1ZDLGtCQUNELENBQUM7WUFDRDtVQUVEO1lBQ0MsTUFBTU8sZ0JBQWdCLEdBQUdoTCxTQUFTLENBQUNhLE1BQU0sQ0FBQ0MsT0FBa0I7WUFDNUQySixrQkFBa0IsR0FBR0MsbUNBQW1DLENBQUMxSyxTQUFTLENBQUM7WUFDbkV1RSxpQkFBaUIsR0FBR21CLHdCQUF3QixDQUMzQzFGLFNBQVMsQ0FBQ2EsTUFBTSxDQUFDbUUsS0FBSyxFQUN0QmdHLGdCQUFnQixFQUNoQjNKLGdCQUFnQixFQUNoQm9KLGtCQUFrQixFQUNsQm5HLFNBQVMsRUFDVEMsaUJBQWlCLEVBQ2pCaUcsVUFBVSxFQUNWQyxrQkFDRCxDQUFDO1lBQ0Q7VUFDRDtZQUNDO1FBQ0Y7UUFDQTtNQUVEO1FBQ0M7SUFDRjtJQUVBLE9BQU9sRyxpQkFBaUI7RUFDekI7RUFBQ3JFLFFBQUEsQ0FBQXFLLG1DQUFBLEdBQUFBLG1DQUFBO0VBRU0sTUFBTVUsb0JBQW9CLEdBQUcsU0FBQUEsQ0FBVUMsVUFBNkMsRUFBc0I7SUFDaEgsSUFBSXJJLFVBQVUsQ0FBQ3FJLFVBQVUsQ0FBQyxFQUFFO01BQzNCLE9BQU9BLFVBQVUsQ0FBQ0MsSUFBSTtJQUN2QjtJQUNBLElBQUlDLFNBQTZCO0lBQ2pDLFFBQVFGLFVBQVUsQ0FBQzlLLEtBQUs7TUFDdkI7TUFDQTtNQUNBO01BQ0E7UUFDQ2dMLFNBQVMsR0FBR3hKLFNBQVM7UUFDckI7TUFFRDtNQUNBO01BQ0E7TUFDQTtNQUNBO1FBQ0N3SixTQUFTLEdBQUlGLFVBQVUsRUFBZ0J2SCxLQUFLLEVBQUU3QyxPQUFPLEVBQUVxSyxJQUFJO1FBQzNEO01BRUQ7TUFDQTtRQUNDLElBQUlELFVBQVUsQ0FBQ3JLLE1BQU0sRUFBRUMsT0FBTyxFQUFFVixLQUFLLEVBQUU7VUFDdEMsTUFBTVEsZUFBZSxHQUFHc0ssVUFBVSxDQUFDckssTUFBTSxDQUFDQyxPQUFPO1VBQ2pELElBQUlGLGVBQWUsQ0FBQ1IsS0FBSyx3REFBNkMsSUFBSStDLDBCQUEwQixDQUFDdkMsZUFBZSxDQUFDc0ksRUFBRSxDQUFDLEVBQUU7WUFDekhrQyxTQUFTLEdBQUd4SyxlQUFlLENBQUNzSSxFQUFFLENBQUNwSSxPQUFPLEVBQUVxSyxJQUFJO1VBQzdDLENBQUMsTUFBTSxJQUFJdkssZUFBZSxDQUFDUixLQUFLLCtDQUFvQyxFQUFFO1lBQ3JFZ0wsU0FBUyxHQUFHeEssZUFBZSxDQUFDK0MsS0FBSyxFQUFFMEgsS0FBSyxFQUFFakwsS0FBSyxJQUFJUSxlQUFlLENBQUMrQyxLQUFLLEVBQUU3QyxPQUFPLEVBQUVxSyxJQUFJO1VBQ3hGLENBQUMsTUFBTTtZQUNOO1lBQ0E7WUFDQUMsU0FBUyxHQUNSRixVQUFVLENBQUNySyxNQUFNLENBQUNDLE9BQU8sQ0FBQ1YsS0FBSyxLQUFLLGdEQUFnRCxHQUFHd0IsU0FBUyxHQUFHLGFBQWE7VUFDbEg7UUFDRCxDQUFDLE1BQU07VUFDTndKLFNBQVMsR0FBR3hKLFNBQVM7UUFDdEI7UUFDQTtJQUNGO0lBRUEsT0FBT3dKLFNBQVM7RUFDakIsQ0FBQztFQUFDbEwsUUFBQSxDQUFBK0ssb0JBQUEsR0FBQUEsb0JBQUE7RUFBQSxPQUFBL0ssUUFBQTtBQUFBIiwiaWdub3JlTGlzdCI6W119
|