@sapui5/sap.fe.macros 1.141.2 → 1.143.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/macros/.library +1 -1
- package/src/sap/fe/macros/Breadcrumbs.js +4 -10
- package/src/sap/fe/macros/Breadcrumbs.tsx +2 -8
- package/src/sap/fe/macros/Chart.js +34 -23
- package/src/sap/fe/macros/Chart.tsx +25 -11
- package/src/sap/fe/macros/CollaborativeDraftHandler.js +47 -36
- package/src/sap/fe/macros/CollaborativeDraftHandler.tsx +50 -31
- package/src/sap/fe/macros/CollectionBindingInfo.js +8 -2
- package/src/sap/fe/macros/CollectionBindingInfo.ts +11 -6
- package/src/sap/fe/macros/CommonHelper.js +14 -24
- package/src/sap/fe/macros/CommonHelper.ts +18 -25
- package/src/sap/fe/macros/ConditionalSwitch.js +1 -2
- package/src/sap/fe/macros/ConditionalSwitch.tsx +0 -1
- package/src/sap/fe/macros/ConditionalSwitchProperty.js +1 -3
- package/src/sap/fe/macros/ConditionalSwitchProperty.tsx +0 -2
- package/src/sap/fe/macros/Field.js +34 -17
- package/src/sap/fe/macros/Field.ts +64 -32
- package/src/sap/fe/macros/FooterContent.js +7 -3
- package/src/sap/fe/macros/FooterContent.tsx +8 -13
- package/src/sap/fe/macros/KPITag.js +6 -6
- package/src/sap/fe/macros/KPITag.tsx +8 -6
- package/src/sap/fe/macros/MacroAPI.js +4 -3
- package/src/sap/fe/macros/MacroAPI.ts +3 -3
- package/src/sap/fe/macros/MessageButton.js +4 -3
- package/src/sap/fe/macros/MessageButton.tsx +7 -3
- package/src/sap/fe/macros/MicroChart.js +12 -7
- package/src/sap/fe/macros/MicroChart.tsx +9 -3
- package/src/sap/fe/macros/MultiValueField.js +22 -36
- package/src/sap/fe/macros/MultiValueField.tsx +34 -66
- package/src/sap/fe/macros/RichTextEditor.js +3 -4
- package/src/sap/fe/macros/RichTextEditor.tsx +2 -3
- package/src/sap/fe/macros/Share.js +7 -7
- package/src/sap/fe/macros/Share.tsx +9 -6
- package/src/sap/fe/macros/Status.js +39 -11
- package/src/sap/fe/macros/Status.tsx +25 -5
- package/src/sap/fe/macros/ValueHelp.js +5 -2
- package/src/sap/fe/macros/ValueHelp.tsx +5 -0
- package/src/sap/fe/macros/ai/EasyFillDialog.js +2 -1
- package/src/sap/fe/macros/ai/EasyFillDialog.tsx +1 -0
- package/src/sap/fe/macros/ai/EasyFilterBar.js +7 -34
- package/src/sap/fe/macros/ai/EasyFilterBar.tsx +6 -35
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.js +31 -7
- package/src/sap/fe/macros/ai/EasyFilterDataFetcher.ts +33 -6
- package/src/sap/fe/macros/ai/SummarizationButton.js +6 -4
- package/src/sap/fe/macros/ai/SummarizationButton.tsx +5 -3
- package/src/sap/fe/macros/chart/Action.js +25 -2
- package/src/sap/fe/macros/chart/Action.ts +13 -0
- package/src/sap/fe/macros/chart/ActionGroup.js +25 -2
- package/src/sap/fe/macros/chart/ActionGroup.ts +13 -0
- package/src/sap/fe/macros/chart/ChartDelegate.js +29 -8
- package/src/sap/fe/macros/chart/ChartDelegate.ts +46 -14
- package/src/sap/fe/macros/chart/MdcChartTemplate.js +58 -12
- package/src/sap/fe/macros/chart/MdcChartTemplate.tsx +75 -13
- package/src/sap/fe/macros/chart/OverflowGroup.js +62 -0
- package/src/sap/fe/macros/chart/OverflowGroup.ts +22 -0
- package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.js +7 -7
- package/src/sap/fe/macros/controls/BuildingBlockObjectProperty.ts +3 -2
- package/src/sap/fe/macros/controls/FileWrapper.js +11 -5
- package/src/sap/fe/macros/controls/FileWrapper.ts +10 -4
- package/src/sap/fe/macros/controls/FilterBar.js +39 -3
- package/src/sap/fe/macros/controls/FilterBar.ts +42 -1
- package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.js +3 -1
- package/src/sap/fe/macros/controls/NumberWithUnitOrCurrency.tsx +2 -0
- package/src/sap/fe/macros/controls/RadioButtons.js +18 -5
- package/src/sap/fe/macros/controls/RadioButtons.tsx +10 -1
- package/src/sap/fe/macros/coreUI/CreateDialog.js +3 -3
- package/src/sap/fe/macros/coreUI/CreateDialog.tsx +2 -2
- package/src/sap/fe/macros/coreUI/OperationParameterDialog.js +40 -12
- package/src/sap/fe/macros/coreUI/OperationParameterDialog.tsx +48 -9
- package/src/sap/fe/macros/draftIndicator/DraftIndicator.js +4 -2
- package/src/sap/fe/macros/draftIndicator/DraftIndicator.tsx +3 -1
- package/src/sap/fe/macros/field/FieldFormatOptions.js +4 -4
- package/src/sap/fe/macros/field/FieldFormatOptions.ts +2 -2
- package/src/sap/fe/macros/field/FieldHelper.js +4 -3
- package/src/sap/fe/macros/field/FieldHelper.ts +7 -1
- package/src/sap/fe/macros/field/FieldRuntime.js +44 -9
- package/src/sap/fe/macros/field/FieldRuntime.ts +72 -8
- package/src/sap/fe/macros/field/FieldRuntimeHelper.js +3 -34
- package/src/sap/fe/macros/field/FieldRuntimeHelper.ts +28 -53
- package/src/sap/fe/macros/field/FieldTemplating.js +5 -4
- package/src/sap/fe/macros/field/FieldTemplating.ts +6 -4
- package/src/sap/fe/macros/filter/FilterFieldHelper.js +6 -4
- package/src/sap/fe/macros/filter/FilterFieldHelper.ts +7 -2
- package/src/sap/fe/macros/filter/FilterUtils.js +130 -40
- package/src/sap/fe/macros/filter/FilterUtils.ts +167 -45
- package/src/sap/fe/macros/filterBar/ExtendedSemanticDateOperators.js +2 -2
- package/src/sap/fe/macros/filterBar/ExtendedSemanticDateOperators.ts +1 -1
- package/src/sap/fe/macros/filterBar/FilterBar.block.js +4 -3
- package/src/sap/fe/macros/filterBar/FilterBar.block.tsx +19 -8
- package/src/sap/fe/macros/filterBar/FilterBarAPI.js +15 -9
- package/src/sap/fe/macros/filterBar/FilterBarAPI.ts +36 -17
- package/src/sap/fe/macros/filterBar/FilterBarDelegate.js +21 -10
- package/src/sap/fe/macros/filterBar/FilterBarDelegate.ts +81 -63
- package/src/sap/fe/macros/filterBar/UOMValidationDelegate.js +376 -0
- package/src/sap/fe/macros/filterBar/UOMValidationDelegate.ts +463 -0
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.js +4 -3
- package/src/sap/fe/macros/filterBar/mixin/FilterBarAPIStateHandler.ts +3 -2
- package/src/sap/fe/macros/form/Form.block.js +27 -2
- package/src/sap/fe/macros/form/Form.block.ts +31 -11
- package/src/sap/fe/macros/form/FormActionButtons.fragment.xml +13 -3
- package/src/sap/fe/macros/form/FormContainer.block.js +110 -63
- package/src/sap/fe/macros/form/FormContainer.block.ts +121 -64
- package/src/sap/fe/macros/formatters/TableFormatter.js +13 -10
- package/src/sap/fe/macros/formatters/TableFormatter.ts +11 -9
- package/src/sap/fe/macros/formatters/VisualFilterFormatter.js +6 -4
- package/src/sap/fe/macros/formatters/VisualFilterFormatter.ts +5 -5
- package/src/sap/fe/macros/inlineEdit/InlineEdit.js +5 -5
- package/src/sap/fe/macros/inlineEdit/InlineEdit.ts +4 -4
- package/src/sap/fe/macros/insights/InsightsService.js +3 -2
- package/src/sap/fe/macros/insights/InsightsService.ts +2 -1
- package/src/sap/fe/macros/internal/DataPoint.js +7 -8
- package/src/sap/fe/macros/internal/DataPoint.tsx +6 -9
- package/src/sap/fe/macros/internal/field/DisplayStyle.js +8 -6
- package/src/sap/fe/macros/internal/field/DisplayStyle.tsx +7 -8
- package/src/sap/fe/macros/internal/field/EditStyle.js +9 -20
- package/src/sap/fe/macros/internal/field/EditStyle.tsx +17 -41
- package/src/sap/fe/macros/internal/field/FieldBlockStructure.js +2 -2
- package/src/sap/fe/macros/internal/field/FieldBlockStructure.tsx +1 -1
- package/src/sap/fe/macros/internal/field/FieldStructure.js +1 -2
- package/src/sap/fe/macros/internal/field/FieldStructure.tsx +0 -2
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.js +7 -7
- package/src/sap/fe/macros/internal/field/FieldStructureHelper.ts +17 -11
- package/src/sap/fe/macros/internal/helpers/DataPointTemplating.js +6 -2
- package/src/sap/fe/macros/internal/helpers/DataPointTemplating.ts +5 -1
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.js +9 -6
- package/src/sap/fe/macros/internal/valuehelp/AdditionalValueFormatter.ts +7 -5
- package/src/sap/fe/macros/internal/valuehelp/TableDelegate.js +4 -4
- package/src/sap/fe/macros/internal/valuehelp/TableDelegate.ts +6 -6
- package/src/sap/fe/macros/internal/valuehelp/ValueListDialogTable.fragment.xml +5 -2
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +2 -2
- package/src/sap/fe/macros/internal/valuehelp/ValueListHelper.ts +2 -1
- package/src/sap/fe/macros/library.js +5 -6
- package/src/sap/fe/macros/{library.ts → library.tsx} +3 -1
- package/src/sap/fe/macros/mdc/adapter/StateHelper.js +15 -5
- package/src/sap/fe/macros/mdc/adapter/StateHelper.ts +21 -5
- package/src/sap/fe/macros/messagebundle.properties +13 -5
- package/src/sap/fe/macros/messagebundle_ar.properties +12 -3
- package/src/sap/fe/macros/messagebundle_bg.properties +13 -4
- package/src/sap/fe/macros/messagebundle_ca.properties +12 -3
- package/src/sap/fe/macros/messagebundle_cnr.properties +12 -3
- package/src/sap/fe/macros/messagebundle_cs.properties +11 -2
- package/src/sap/fe/macros/messagebundle_cy.properties +12 -3
- package/src/sap/fe/macros/messagebundle_da.properties +12 -3
- package/src/sap/fe/macros/messagebundle_de.properties +16 -7
- package/src/sap/fe/macros/messagebundle_el.properties +13 -4
- package/src/sap/fe/macros/messagebundle_en.properties +13 -4
- package/src/sap/fe/macros/messagebundle_en_GB.properties +13 -4
- package/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +13 -4
- package/src/sap/fe/macros/messagebundle_es.properties +12 -3
- package/src/sap/fe/macros/messagebundle_es_MX.properties +12 -3
- package/src/sap/fe/macros/messagebundle_et.properties +12 -3
- package/src/sap/fe/macros/messagebundle_fi.properties +12 -3
- package/src/sap/fe/macros/messagebundle_fr.properties +12 -3
- package/src/sap/fe/macros/messagebundle_fr_CA.properties +12 -3
- package/src/sap/fe/macros/messagebundle_hi.properties +12 -3
- package/src/sap/fe/macros/messagebundle_hr.properties +13 -4
- package/src/sap/fe/macros/messagebundle_hu.properties +12 -3
- package/src/sap/fe/macros/messagebundle_id.properties +18 -9
- package/src/sap/fe/macros/messagebundle_it.properties +12 -3
- package/src/sap/fe/macros/messagebundle_iw.properties +12 -3
- package/src/sap/fe/macros/messagebundle_ja.properties +12 -3
- package/src/sap/fe/macros/messagebundle_kk.properties +11 -2
- package/src/sap/fe/macros/messagebundle_ko.properties +13 -4
- package/src/sap/fe/macros/messagebundle_lt.properties +12 -3
- package/src/sap/fe/macros/messagebundle_lv.properties +12 -3
- package/src/sap/fe/macros/messagebundle_mk.properties +12 -3
- package/src/sap/fe/macros/messagebundle_ms.properties +12 -3
- package/src/sap/fe/macros/messagebundle_nl.properties +12 -3
- package/src/sap/fe/macros/messagebundle_no.properties +12 -3
- package/src/sap/fe/macros/messagebundle_pl.properties +12 -3
- package/src/sap/fe/macros/messagebundle_pt.properties +12 -3
- package/src/sap/fe/macros/messagebundle_pt_PT.properties +12 -3
- package/src/sap/fe/macros/messagebundle_ro.properties +13 -4
- package/src/sap/fe/macros/messagebundle_ru.properties +12 -3
- package/src/sap/fe/macros/messagebundle_sh.properties +12 -3
- package/src/sap/fe/macros/messagebundle_sk.properties +12 -3
- package/src/sap/fe/macros/messagebundle_sl.properties +13 -4
- package/src/sap/fe/macros/messagebundle_sr.properties +12 -3
- package/src/sap/fe/macros/messagebundle_sv.properties +12 -3
- package/src/sap/fe/macros/messagebundle_th.properties +11 -2
- package/src/sap/fe/macros/messagebundle_tr.properties +12 -3
- package/src/sap/fe/macros/messagebundle_uk.properties +12 -3
- package/src/sap/fe/macros/messagebundle_vi.properties +13 -4
- package/src/sap/fe/macros/messagebundle_zh_CN.properties +12 -3
- package/src/sap/fe/macros/messagebundle_zh_TW.properties +12 -3
- package/src/sap/fe/macros/messages/MessageButton.js +21 -12
- package/src/sap/fe/macros/messages/MessageButton.ts +21 -11
- package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.js +7 -3
- package/src/sap/fe/macros/multivaluefield/MultiValueFieldDelegate.ts +8 -2
- package/src/sap/fe/macros/quickView/QuickView.js +5 -4
- package/src/sap/fe/macros/quickView/QuickView.tsx +10 -3
- package/src/sap/fe/macros/richtexteditor/ButtonGroup.js +2 -2
- package/src/sap/fe/macros/richtexteditor/ButtonGroup.ts +2 -2
- package/src/sap/fe/macros/table/Action.js +21 -5
- package/src/sap/fe/macros/table/Action.ts +14 -4
- package/src/sap/fe/macros/table/ActionGroup.js +15 -2
- package/src/sap/fe/macros/table/ActionGroup.ts +8 -0
- package/src/sap/fe/macros/table/ActionGroupOverride.js +14 -2
- package/src/sap/fe/macros/table/ActionGroupOverride.ts +7 -0
- package/src/sap/fe/macros/table/ActionOverride.js +14 -2
- package/src/sap/fe/macros/table/ActionOverride.ts +7 -0
- package/src/sap/fe/macros/table/ActionsTemplating.js +16 -2
- package/src/sap/fe/macros/table/ActionsTemplating.tsx +15 -0
- package/src/sap/fe/macros/table/Column.js +3 -2
- package/src/sap/fe/macros/table/Column.ts +1 -1
- package/src/sap/fe/macros/table/MdcTableTemplate.js +96 -18
- package/src/sap/fe/macros/table/MdcTableTemplate.tsx +136 -17
- package/src/sap/fe/macros/table/OverflowGroups.js +59 -0
- package/src/sap/fe/macros/table/OverflowGroups.ts +27 -0
- package/src/sap/fe/macros/table/Table.block.js +74 -30
- package/src/sap/fe/macros/table/Table.block.tsx +77 -14
- package/src/sap/fe/macros/table/TableAPI.js +175 -132
- package/src/sap/fe/macros/table/TableAPI.ts +67 -30
- package/src/sap/fe/macros/table/TableDefinition.js +20 -3
- package/src/sap/fe/macros/table/TableDefinition.ts +18 -2
- package/src/sap/fe/macros/table/TableEventHandlerProvider.js +6 -3
- package/src/sap/fe/macros/table/TableEventHandlerProvider.ts +12 -9
- package/src/sap/fe/macros/table/TableHelper.js +5 -2
- package/src/sap/fe/macros/table/TableHelper.ts +5 -2
- package/src/sap/fe/macros/table/TableRuntime.js +25 -13
- package/src/sap/fe/macros/table/TableRuntime.ts +31 -17
- package/src/sap/fe/macros/table/TableSizeHelper.js +4 -4
- package/src/sap/fe/macros/table/TableSizeHelper.ts +6 -11
- package/src/sap/fe/macros/table/Utils.js +9 -3
- package/src/sap/fe/macros/table/Utils.ts +14 -8
- package/src/sap/fe/macros/table/delegates/TableDelegate.js +72 -29
- package/src/sap/fe/macros/table/delegates/TableDelegate.ts +114 -123
- package/src/sap/fe/macros/table/massEdit/MassEditDialog.js +41 -15
- package/src/sap/fe/macros/table/massEdit/MassEditDialog.tsx +41 -22
- package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.js +15 -6
- package/src/sap/fe/macros/table/massEdit/MassEditDialogHelper.tsx +14 -5
- package/src/sap/fe/macros/table/massEdit/MassEditField.js +1 -1
- package/src/sap/fe/macros/table/massEdit/MassEditField.tsx +3 -6
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.js +2 -3
- package/src/sap/fe/macros/table/mixin/ContextMenuHandler.ts +3 -2
- package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.js +42 -14
- package/src/sap/fe/macros/table/mixin/EmptyRowsHandler.ts +49 -19
- package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.js +7 -9
- package/src/sap/fe/macros/table/mixin/TableAPIStateHandler.ts +7 -8
- package/src/sap/fe/macros/table/mixin/TableExport.js +1 -1
- package/src/sap/fe/macros/table/mixin/TableExport.ts +3 -3
- package/src/sap/fe/macros/table/mixin/TableHierarchy.js +3 -4
- package/src/sap/fe/macros/table/mixin/TableHierarchy.ts +2 -3
- package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.js +5 -4
- package/src/sap/fe/macros/table/uploadTable/UploadTableRuntime.ts +6 -3
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.js +17 -10
- package/src/sap/fe/macros/valuehelp/ValueHelpDelegate.ts +24 -9
- package/src/sap/fe/macros/visualfilters/InteractiveChartHelper.js +4 -4
- package/src/sap/fe/macros/visualfilters/InteractiveChartHelper.ts +3 -3
- package/src/sap/fe/macros/visualfilters/VisualFilter.js +20 -2
- package/src/sap/fe/macros/visualfilters/VisualFilter.tsx +28 -6
- package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.js +6 -3
- package/src/sap/fe/macros/visualfilters/VisualFilterRuntime.ts +4 -3
- package/src/sap/fe/macros/visualfilters/fragments/InteractiveCharts.js +3 -3
- package/src/sap/fe/macros/visualfilters/fragments/InteractiveCharts.tsx +10 -4
- package/src/sap/fe/macros/visualfilters/fragments/InteractiveDonutChart.fragment.xml +1 -1
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2025 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/helpers/ResourceModelHelper", "sap/ui/core/Element", "sap/ui/core/Messaging", "sap/ui/core/message/ControlMessageProcessor", "sap/ui/core/message/Message", "sap/ui/core/message/MessageType", "sap/ui/mdc/enums/FilterBarValidationStatus", "../DelegateUtil", "../filter/FilterUtils"], function (CommonUtils, ResourceModelHelper, UI5Element, Messaging, ControlMessageProcessor, Message, MessageType, FilterBarValidationStatus, DelegateUtil, FilterUtils) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* UOMValidationDelegate
|
|
10
|
+
*
|
|
11
|
+
* A FilterBarDelegate extension that adds UOM validation behavior to MDC FilterBars including adaptation and personalization variants used in the Table and Chart or FilterBar P13n.
|
|
12
|
+
*
|
|
13
|
+
* The delegate inspects filter fields for an associated Measures or ISOCurrency or Unit annotation and enforces
|
|
14
|
+
* when a value is entered for the leading (measure) field, a corresponding UOM value
|
|
15
|
+
* either exists or is requested from the user. It updates the FilterField value states and required
|
|
16
|
+
* flags, manages message suppression for live searches, and can reorder the visible UOM field next to
|
|
17
|
+
* its leading field in personalization state when required.
|
|
18
|
+
*
|
|
19
|
+
* Key behaviors:
|
|
20
|
+
* - Works with three FilterBar contexts:
|
|
21
|
+
* - Main (normal) FilterBar
|
|
22
|
+
* - FilterBar P13n (adaptation UI for FilterBar)
|
|
23
|
+
* - Table or Chart P13n (adaptation UI for Table or Chart FilterBar)
|
|
24
|
+
* - Discovers UOM relationships using the converted filter field metadata and the Measures.ISOCurrency or Measures.Unit
|
|
25
|
+
* annotation on the corresponding property.
|
|
26
|
+
* - Determines the validation trigger by inspecting the FilterBar "reason" such as Enter or Go and live mode.
|
|
27
|
+
* - Sets the value state and value state text on the leading (measure) field and marks the UOM FilterField
|
|
28
|
+
* as required when the leading field has a value but no UOM.
|
|
29
|
+
* - Resets value states when no relevant conditions are present.
|
|
30
|
+
*
|
|
31
|
+
* Usage:
|
|
32
|
+
* - The delegate exposes determineValidationState(filterBar, validationType) which returns a Promise
|
|
33
|
+
* resolving to a FilterBarValidationStatus. This method is intended to be invoked by the FilterBar
|
|
34
|
+
* validation lifecycle to decide whether a search should be triggered or whether missing values
|
|
35
|
+
* should be presented to the user.
|
|
36
|
+
*/
|
|
37
|
+
// Type alias representing possible adaptation control element types (FilterBar | Table | Chart)
|
|
38
|
+
|
|
39
|
+
const UOMValidationDelegate = {
|
|
40
|
+
/**
|
|
41
|
+
* Function which determines the validation state of the FilterFields on a given FilterBar control.
|
|
42
|
+
* @param filterBar FilterBar control which can be a P13n FilterBar or a regular one
|
|
43
|
+
* @param _mValidation String which consists which type of validation is happening
|
|
44
|
+
* @returns A Promise with a Validation Status which determines if the search is triggered or not
|
|
45
|
+
*/
|
|
46
|
+
determineValidationState: async function (filterBar, _mValidation) {
|
|
47
|
+
const adaptationControlElement = UI5Element.getElementById(filterBar.getAssociation("adaptationControl", null));
|
|
48
|
+
const filterType = getFilterBarType(filterBar, adaptationControlElement);
|
|
49
|
+
const {
|
|
50
|
+
hasError,
|
|
51
|
+
hasWarning
|
|
52
|
+
} = await UOMValidationDelegate.validateAllUOMFields(filterBar, filterBar._sReason, filterType, adaptationControlElement);
|
|
53
|
+
if (!hasError && !hasWarning) {
|
|
54
|
+
return new Promise(resolve => {
|
|
55
|
+
//After discussions with MDC we need to use this as a temporary workaround to solve the timing issues related to setting the messages to the filterfield and update of the filterfield valuestate
|
|
56
|
+
//TODO: Remove this workaround once MDC provides an API to set the messages to the filterbar. Will be tracked via BLI.
|
|
57
|
+
setTimeout(() => {
|
|
58
|
+
resolve(filterBar.checkFilters());
|
|
59
|
+
}, 0);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//if warning or liveMode, we don't open message box
|
|
63
|
+
filterBar.setShowMessages(!hasWarning && !filterBar.getLiveMode());
|
|
64
|
+
return hasError ? FilterBarValidationStatus.FieldInErrorState : filterBar.checkFilters();
|
|
65
|
+
},
|
|
66
|
+
validateAllUOMFields: async function (filterBar, reason, filterType, adaptationControlElement) {
|
|
67
|
+
let hasError = false,
|
|
68
|
+
hasWarning = false;
|
|
69
|
+
let entityTypePath;
|
|
70
|
+
let controlForMetaModel;
|
|
71
|
+
adaptationControlElement = adaptationControlElement ?? UI5Element.getElementById(filterBar.getAssociation("adaptationControl", null));
|
|
72
|
+
filterType = filterType ?? getFilterBarType(filterBar, adaptationControlElement);
|
|
73
|
+
if (filterType === FilterType.FILTERBAR_P13N || filterType === FilterType.TABLE_CHART_P13N) {
|
|
74
|
+
entityTypePath = DelegateUtil.getCustomData(adaptationControlElement, "entityType");
|
|
75
|
+
controlForMetaModel = adaptationControlElement;
|
|
76
|
+
} else {
|
|
77
|
+
entityTypePath = DelegateUtil.getCustomData(filterBar, "entityType");
|
|
78
|
+
controlForMetaModel = filterBar;
|
|
79
|
+
}
|
|
80
|
+
const view = CommonUtils.getTargetView(controlForMetaModel);
|
|
81
|
+
const appComponent = view && CommonUtils.getAppComponent(view);
|
|
82
|
+
const disableStrictUomFiltering = appComponent?.getManifestEntry("sap.fe")?.app?.disableStrictUomFiltering;
|
|
83
|
+
if (disableStrictUomFiltering === true) {
|
|
84
|
+
return {
|
|
85
|
+
hasError: false,
|
|
86
|
+
hasWarning: false
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const internalModel = controlForMetaModel?.getModel("internal");
|
|
90
|
+
const filterBarId = filterBar.getId();
|
|
91
|
+
const allUomValidationMessages = internalModel?.getProperty("/uomValidationMessages") || {};
|
|
92
|
+
const filterBarUomValidationMessages = allUomValidationMessages[filterBarId] || {};
|
|
93
|
+
|
|
94
|
+
// Clear existing UOM validation messages for this filterBar from the message model
|
|
95
|
+
removeMessages(internalModel, filterBarId, filterBarUomValidationMessages);
|
|
96
|
+
const model = await DelegateUtil.fetchModel(controlForMetaModel);
|
|
97
|
+
const metaModel = model?.getMetaModel();
|
|
98
|
+
const resourceModel = ResourceModelHelper.getResourceModel(controlForMetaModel);
|
|
99
|
+
const allUOMProperties = getUOMProperties(entityTypePath, filterBar, metaModel);
|
|
100
|
+
if (!allUOMProperties.length || !allUOMProperties.some(uomProp => filterBar?.getConditions()?.[uomProp?.field?.fieldKey]?.length > 0)) {
|
|
101
|
+
uomStateMap = {};
|
|
102
|
+
return {
|
|
103
|
+
hasError: false,
|
|
104
|
+
hasWarning: false
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
for (const {
|
|
108
|
+
field,
|
|
109
|
+
uomProperty
|
|
110
|
+
} of allUOMProperties) {
|
|
111
|
+
if (uomProperty) {
|
|
112
|
+
const {
|
|
113
|
+
hasError: fieldHasError,
|
|
114
|
+
hasWarning: fieldHasWarning
|
|
115
|
+
} = validateFilterField(filterBar, field, uomProperty, filterType, resourceModel, adaptationControlElement, reason, internalModel);
|
|
116
|
+
if (fieldHasError) hasError = true;
|
|
117
|
+
if (fieldHasWarning) hasWarning = true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
uomStateMap = {};
|
|
121
|
+
return {
|
|
122
|
+
hasError,
|
|
123
|
+
hasWarning
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Interface representing a unit of measure (UOM) property and its associated field.
|
|
129
|
+
* Used to track relationships between measure fields and their corresponding UOM fields.
|
|
130
|
+
* @interface
|
|
131
|
+
*/
|
|
132
|
+
/**
|
|
133
|
+
* Enumeration of possible FilterBar types in the application.
|
|
134
|
+
* Used to determine the validation behavior based on the context where the filter is being used.
|
|
135
|
+
* @enum {string}
|
|
136
|
+
*/
|
|
137
|
+
var FilterType = /*#__PURE__*/function (FilterType) {
|
|
138
|
+
/** Regular FilterBar instance (not in personalization mode) */
|
|
139
|
+
FilterType["MAIN"] = "Main";
|
|
140
|
+
/** FilterBar in personalization mode for filter adaptation */
|
|
141
|
+
FilterType["FILTERBAR_P13N"] = "FilterP13n";
|
|
142
|
+
/** FilterBar in personalization mode for Table or Chart adaptation */
|
|
143
|
+
FilterType["TABLE_CHART_P13N"] = "TableChartP13n";
|
|
144
|
+
return FilterType;
|
|
145
|
+
}(FilterType || {});
|
|
146
|
+
let uomStateMap = {};
|
|
147
|
+
let controlMessageProcessor;
|
|
148
|
+
/**
|
|
149
|
+
* Determines the FilterType for a given FilterBar and an optional adaptation control element.
|
|
150
|
+
*
|
|
151
|
+
* The function classifies the filter bar into one of three FilterType values:
|
|
152
|
+
* - FilterType.MAIN: When the provided filterBar is not an adaptation such when it is not an AdaptationFilterBar.
|
|
153
|
+
* - FilterType.FILTERBAR_P13N: When the provided filterBar is an AdaptationFilterBar but the adaptationControlElement
|
|
154
|
+
* is not a Table or Chart.
|
|
155
|
+
* - FilterType.TABLE_CHART_P13N: When the provided filterBar is an AdaptationFilterBar and the
|
|
156
|
+
* adaptationControlElement is a Table or Chart.
|
|
157
|
+
* @param filterBar The FilterBar instance to inspect. Expected to implement isA().
|
|
158
|
+
* @param adaptationControlElement The control associated with the adaptation workflow which may be a FilterBar, Table, or Chart. Used to distinguish table or chart personalization from general filter bar personalization.
|
|
159
|
+
* @returns The resolved FilterType enum value representing how the filter bar should be treated.
|
|
160
|
+
*/
|
|
161
|
+
function getFilterBarType(filterBar, adaptationControlElement) {
|
|
162
|
+
if (filterBar.isA("sap.ui.mdc.filterbar.p13n.AdaptationFilterBar")) {
|
|
163
|
+
if (adaptationControlElement?.isA("sap.ui.mdc.Table") || adaptationControlElement?.isA("sap.ui.mdc.Chart")) {
|
|
164
|
+
return FilterType.TABLE_CHART_P13N;
|
|
165
|
+
}
|
|
166
|
+
return FilterType.FILTERBAR_P13N;
|
|
167
|
+
}
|
|
168
|
+
return FilterType.MAIN;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Determines whether an error state check should be performed based on the triggering reason,
|
|
173
|
+
* the type of filter context, and the filter bar's configuration.
|
|
174
|
+
*
|
|
175
|
+
* The function returns true for explicit user actions (for example, "Enter", "Go", or "Variant"),
|
|
176
|
+
* when the filter bar is of the table or chart personalization type, or when the filter bar
|
|
177
|
+
* personalization is active and the filter bar is in live mode.
|
|
178
|
+
* @param reason A string describing the event or user action that triggered validation. For example, "Enter", "Go", or "Variant".
|
|
179
|
+
* @param filterType The FilterType enum value indicating the current filter context which is used to detect personalization contexts.
|
|
180
|
+
* @param filterBar Optional FilterBar instance. When provided, its live mode is consulted for certain personalization types.
|
|
181
|
+
* @returns True if an error state should be checked given the inputs. Otherwise, false.
|
|
182
|
+
*/
|
|
183
|
+
function shouldCheckErrorState(reason, filterType, filterBar) {
|
|
184
|
+
return reason === "Enter" || reason === "Go" || reason === "Variant" || filterBar?.getLiveMode() || filterType === FilterType.TABLE_CHART_P13N;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Removes existing UOM validation messages for a specific filterBar from the message model
|
|
189
|
+
* and clears the uomValidationMessages property in the internal model.
|
|
190
|
+
* @param internalModel The internal JSONModel containing the validation messages
|
|
191
|
+
* @param filterBarId The ID of the filterBar whose messages should be removed
|
|
192
|
+
* @param filterBarUomValidationMessages The current UOM validation messages for this filterBar
|
|
193
|
+
*/
|
|
194
|
+
function removeMessages(internalModel, filterBarId, filterBarUomValidationMessages) {
|
|
195
|
+
if (Object.keys(filterBarUomValidationMessages).length > 0) {
|
|
196
|
+
const allMessages = Messaging.getMessageModel().getData();
|
|
197
|
+
const messagesToRemove = allMessages.filter(m => Object.values(filterBarUomValidationMessages).includes(m.getId()));
|
|
198
|
+
if (messagesToRemove.length) {
|
|
199
|
+
Messaging.removeMessages(messagesToRemove);
|
|
200
|
+
}
|
|
201
|
+
// Clear the uomValidationMessages property for this specific filterBar
|
|
202
|
+
if (internalModel) {
|
|
203
|
+
const allUomValidationMessages = internalModel.getProperty("/uomValidationMessages") || {};
|
|
204
|
+
const updatedMessages = {
|
|
205
|
+
...allUomValidationMessages
|
|
206
|
+
};
|
|
207
|
+
delete updatedMessages[filterBarId];
|
|
208
|
+
internalModel.setProperty("/uomValidationMessages", updatedMessages);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Function to validate the fields.
|
|
215
|
+
* @param filterBar The control on which the fields exist and whose ID will be used as message storage key
|
|
216
|
+
* @param field The field to be evaluated which has a fieldKey and label
|
|
217
|
+
* @param field.fieldKey
|
|
218
|
+
* @param field.label
|
|
219
|
+
* @param uomProperty The UOM property if any exists for the field
|
|
220
|
+
* @param uomProperty.path
|
|
221
|
+
* @param uomProperty.label
|
|
222
|
+
* @param filterType The type of the filterBar
|
|
223
|
+
* @param resourceModel
|
|
224
|
+
* @param adaptationControlElement
|
|
225
|
+
* @param reason
|
|
226
|
+
* @param internalModel The internal JSONModel for message storage
|
|
227
|
+
* @returns An object consisting of whether we have an error or a warning state
|
|
228
|
+
*/
|
|
229
|
+
function validateFilterField(filterBar, field, uomProperty, filterType, resourceModel, adaptationControlElement, reason, internalModel) {
|
|
230
|
+
const {
|
|
231
|
+
fieldKey,
|
|
232
|
+
label
|
|
233
|
+
} = field;
|
|
234
|
+
const associatedUOMPropertyPath = uomProperty.path;
|
|
235
|
+
const filterBarConditions = filterBar.getConditions();
|
|
236
|
+
const isFieldNameInConditions = !!filterBarConditions?.[fieldKey]?.length;
|
|
237
|
+
const isUOMInConditions = associatedUOMPropertyPath ? filterBarConditions?.[associatedUOMPropertyPath]?.length === 1 : false;
|
|
238
|
+
const doesUOMHaveMultipleConditions = associatedUOMPropertyPath ? filterBarConditions?.[associatedUOMPropertyPath]?.length > 1 : false;
|
|
239
|
+
const leadingFilterField = filterBar.getFilterItems().find(item => item.getPropertyKey() === fieldKey);
|
|
240
|
+
const uomFilterField = filterBar.getFilterItems().find(item => item.getPropertyKey() === associatedUOMPropertyPath);
|
|
241
|
+
const messageText = doesUOMHaveMultipleConditions ? resourceModel?.getText?.("FILTERFIELD_VALUE_UOM_MULTIPLE", [uomFilterField?.getLabel() ?? uomProperty?.label]) : resourceModel?.getText?.("FILTERFIELD_VALUE_NO_UOM", [leadingFilterField?.getLabel() ?? label, uomFilterField?.getLabel() ?? uomProperty?.label]);
|
|
242
|
+
if (!isFieldNameInConditions || isFieldNameInConditions && isUOMInConditions) {
|
|
243
|
+
return {
|
|
244
|
+
hasError: false,
|
|
245
|
+
hasWarning: false
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
const isError = shouldCheckErrorState(reason, filterType, filterType === FilterType.FILTERBAR_P13N ? adaptationControlElement : filterBar);
|
|
249
|
+
setMessages(leadingFilterField, uomFilterField, isError ? MessageType.Error : MessageType.Warning, messageText, internalModel, filterBar);
|
|
250
|
+
return {
|
|
251
|
+
hasError: isError,
|
|
252
|
+
hasWarning: !isError
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Updates the UI state for a leading filter field and its associated UOM filter field.
|
|
258
|
+
* Sets the ValueState and optional ValueStateText on the leading filter (if present),
|
|
259
|
+
* and sets the required flag as well as ValueState and ValueStateText on the UOM filter (if present).
|
|
260
|
+
* @param leadingFilterField The primary (leading) MDCFilterField to update. Only its value state and text are modified.
|
|
261
|
+
* @param uomFilterField The UOM MDCFilterField to update. Its required flag, value state, and text are modified.
|
|
262
|
+
* @param messageType The ValueState to apply such as None, Warning, Error, or Success.
|
|
263
|
+
* @param message Optional descriptive text to display for the value state.
|
|
264
|
+
* @param internalModel The internal JSONModel for message storage.
|
|
265
|
+
* @param filterBar The FilterBar whose ID will be used as the key for message storage in the internal model.
|
|
266
|
+
*/
|
|
267
|
+
function setMessages(leadingFilterField, uomFilterField, messageType, message, internalModel, filterBar) {
|
|
268
|
+
const messages = [];
|
|
269
|
+
controlMessageProcessor ??= new ControlMessageProcessor();
|
|
270
|
+
|
|
271
|
+
// Get current UOM validation messages from internal model
|
|
272
|
+
const filterBarId = filterBar?.getId() ?? "";
|
|
273
|
+
const allUomValidationMessages = internalModel?.getProperty("/uomValidationMessages") || {};
|
|
274
|
+
const filterBarUomValidationMessages = allUomValidationMessages[filterBarId] || {};
|
|
275
|
+
let leadingMsg;
|
|
276
|
+
if (leadingFilterField) {
|
|
277
|
+
const fieldId = leadingFilterField.getId();
|
|
278
|
+
// Check if message already exists for this field in this filterBar's context
|
|
279
|
+
if (!filterBarUomValidationMessages[fieldId]) {
|
|
280
|
+
leadingMsg = new Message({
|
|
281
|
+
message: message,
|
|
282
|
+
processor: controlMessageProcessor,
|
|
283
|
+
type: messageType,
|
|
284
|
+
target: fieldId + "/conditions"
|
|
285
|
+
});
|
|
286
|
+
messages.push(leadingMsg);
|
|
287
|
+
// Store message ID in filterBar's validation messages
|
|
288
|
+
filterBarUomValidationMessages[fieldId] = leadingMsg.getId();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (uomFilterField && uomStateMap[uomFilterField.getId()] !== undefined) {
|
|
292
|
+
if (uomStateMap[uomFilterField.getId()]?.messageType === MessageType.None) {
|
|
293
|
+
setMessageForUOMField(uomFilterField, messageType, message, messages, filterBarUomValidationMessages);
|
|
294
|
+
}
|
|
295
|
+
} else if (uomFilterField) {
|
|
296
|
+
setMessageForUOMField(uomFilterField, messageType, message, messages, filterBarUomValidationMessages);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Update internal model with new messages for this filterBar
|
|
300
|
+
if (internalModel) {
|
|
301
|
+
const updatedAllMessages = {
|
|
302
|
+
...allUomValidationMessages
|
|
303
|
+
};
|
|
304
|
+
updatedAllMessages[filterBarId] = filterBarUomValidationMessages;
|
|
305
|
+
internalModel.setProperty("/uomValidationMessages", updatedAllMessages);
|
|
306
|
+
}
|
|
307
|
+
if (messages.length) {
|
|
308
|
+
Messaging.addMessages(messages);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function setMessageForUOMField(uomField, messageType, message, messages, uomValidationMessages) {
|
|
312
|
+
const fieldId = uomField.getId();
|
|
313
|
+
// Check if message already exists for this field
|
|
314
|
+
if (uomValidationMessages[fieldId]) {
|
|
315
|
+
return undefined;
|
|
316
|
+
}
|
|
317
|
+
const msg = new Message({
|
|
318
|
+
message: message,
|
|
319
|
+
processor: controlMessageProcessor,
|
|
320
|
+
type: messageType,
|
|
321
|
+
target: fieldId + "/conditions"
|
|
322
|
+
});
|
|
323
|
+
messages.push(msg);
|
|
324
|
+
uomStateMap[fieldId] = {
|
|
325
|
+
messageType
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
// Store message ID in uomValidationMessages
|
|
329
|
+
uomValidationMessages[fieldId] = msg.getId();
|
|
330
|
+
return msg;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Retrieves UOM-related properties from a filter control's metadata.
|
|
335
|
+
* Processes filter fields to identify measure fields with associated UOM fields
|
|
336
|
+
* through ISOCurrency or Unit annotations.
|
|
337
|
+
* @param entityTypePath Path to the entity type containing the filter fields
|
|
338
|
+
* @param filterControl The filter control to inspect for UOM properties
|
|
339
|
+
* @param metaModel ODataMetaModel
|
|
340
|
+
* @returns Array of UOMProperty objects containing measure field information
|
|
341
|
+
* and their associated UOM field details
|
|
342
|
+
*/
|
|
343
|
+
function getUOMProperties(entityTypePath, filterControl, metaModel) {
|
|
344
|
+
const includeHidden = filterControl.isA("sap.ui.mdc.filterbar.vh.FilterBar") ? true : undefined;
|
|
345
|
+
const filterFields = FilterUtils.getConvertedFilterFields(filterControl, entityTypePath, includeHidden, metaModel);
|
|
346
|
+
const converterContext = FilterUtils.createConverterContext(filterControl, entityTypePath, metaModel);
|
|
347
|
+
return filterFields.map(filterFieldInfo => {
|
|
348
|
+
const annotationPath = filterFieldInfo.annotationPath;
|
|
349
|
+
if (annotationPath) {
|
|
350
|
+
const propertyAnnotations = converterContext.getConvertedTypes().resolvePath(annotationPath).target;
|
|
351
|
+
const uomProperty = propertyAnnotations?.annotations.Measures;
|
|
352
|
+
if (uomProperty?.ISOCurrency || uomProperty?.Unit) {
|
|
353
|
+
let uomPropertyObject;
|
|
354
|
+
const uomPath = uomProperty?.ISOCurrency?.path || uomProperty?.Unit?.path;
|
|
355
|
+
if (uomPath) {
|
|
356
|
+
const uomLabel = filterFields.find(ff => ff.key === uomPath)?.label;
|
|
357
|
+
uomPropertyObject = {
|
|
358
|
+
path: uomPath,
|
|
359
|
+
label: uomLabel ?? uomProperty?.ISOCurrency?.$target?.annotations?.Common?.Label ?? uomProperty?.Unit?.$target?.annotations?.Common?.Label
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
field: {
|
|
364
|
+
fieldKey: filterFieldInfo.key ?? "",
|
|
365
|
+
label: filterFieldInfo.label ?? ""
|
|
366
|
+
},
|
|
367
|
+
uomProperty: uomPropertyObject
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return null;
|
|
372
|
+
}).filter(Boolean);
|
|
373
|
+
}
|
|
374
|
+
return UOMValidationDelegate;
|
|
375
|
+
}, false);
|
|
376
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVT01WYWxpZGF0aW9uRGVsZWdhdGUiLCJkZXRlcm1pbmVWYWxpZGF0aW9uU3RhdGUiLCJmaWx0ZXJCYXIiLCJfbVZhbGlkYXRpb24iLCJhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQiLCJVSTVFbGVtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRBc3NvY2lhdGlvbiIsImZpbHRlclR5cGUiLCJnZXRGaWx0ZXJCYXJUeXBlIiwiaGFzRXJyb3IiLCJoYXNXYXJuaW5nIiwidmFsaWRhdGVBbGxVT01GaWVsZHMiLCJfc1JlYXNvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImNoZWNrRmlsdGVycyIsInNldFNob3dNZXNzYWdlcyIsImdldExpdmVNb2RlIiwiRmlsdGVyQmFyVmFsaWRhdGlvblN0YXR1cyIsIkZpZWxkSW5FcnJvclN0YXRlIiwicmVhc29uIiwiZW50aXR5VHlwZVBhdGgiLCJjb250cm9sRm9yTWV0YU1vZGVsIiwiRmlsdGVyVHlwZSIsIkZJTFRFUkJBUl9QMTNOIiwiVEFCTEVfQ0hBUlRfUDEzTiIsIkRlbGVnYXRlVXRpbCIsImdldEN1c3RvbURhdGEiLCJ2aWV3IiwiQ29tbW9uVXRpbHMiLCJnZXRUYXJnZXRWaWV3IiwiYXBwQ29tcG9uZW50IiwiZ2V0QXBwQ29tcG9uZW50IiwiZGlzYWJsZVN0cmljdFVvbUZpbHRlcmluZyIsImdldE1hbmlmZXN0RW50cnkiLCJhcHAiLCJpbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJmaWx0ZXJCYXJJZCIsImdldElkIiwiYWxsVW9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwiZ2V0UHJvcGVydHkiLCJmaWx0ZXJCYXJVb21WYWxpZGF0aW9uTWVzc2FnZXMiLCJyZW1vdmVNZXNzYWdlcyIsIm1vZGVsIiwiZmV0Y2hNb2RlbCIsIm1ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInJlc291cmNlTW9kZWwiLCJSZXNvdXJjZU1vZGVsSGVscGVyIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImFsbFVPTVByb3BlcnRpZXMiLCJnZXRVT01Qcm9wZXJ0aWVzIiwibGVuZ3RoIiwic29tZSIsInVvbVByb3AiLCJnZXRDb25kaXRpb25zIiwiZmllbGQiLCJmaWVsZEtleSIsInVvbVN0YXRlTWFwIiwidW9tUHJvcGVydHkiLCJmaWVsZEhhc0Vycm9yIiwiZmllbGRIYXNXYXJuaW5nIiwidmFsaWRhdGVGaWx0ZXJGaWVsZCIsImNvbnRyb2xNZXNzYWdlUHJvY2Vzc29yIiwiaXNBIiwiTUFJTiIsInNob3VsZENoZWNrRXJyb3JTdGF0ZSIsIk9iamVjdCIsImtleXMiLCJhbGxNZXNzYWdlcyIsIk1lc3NhZ2luZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJtZXNzYWdlc1RvUmVtb3ZlIiwiZmlsdGVyIiwibSIsInZhbHVlcyIsImluY2x1ZGVzIiwidXBkYXRlZE1lc3NhZ2VzIiwic2V0UHJvcGVydHkiLCJsYWJlbCIsImFzc29jaWF0ZWRVT01Qcm9wZXJ0eVBhdGgiLCJwYXRoIiwiZmlsdGVyQmFyQ29uZGl0aW9ucyIsImlzRmllbGROYW1lSW5Db25kaXRpb25zIiwiaXNVT01JbkNvbmRpdGlvbnMiLCJkb2VzVU9NSGF2ZU11bHRpcGxlQ29uZGl0aW9ucyIsImxlYWRpbmdGaWx0ZXJGaWVsZCIsImdldEZpbHRlckl0ZW1zIiwiZmluZCIsIml0ZW0iLCJnZXRQcm9wZXJ0eUtleSIsInVvbUZpbHRlckZpZWxkIiwibWVzc2FnZVRleHQiLCJnZXRUZXh0IiwiZ2V0TGFiZWwiLCJpc0Vycm9yIiwic2V0TWVzc2FnZXMiLCJNZXNzYWdlVHlwZSIsIkVycm9yIiwiV2FybmluZyIsIm1lc3NhZ2VUeXBlIiwibWVzc2FnZSIsIm1lc3NhZ2VzIiwiQ29udHJvbE1lc3NhZ2VQcm9jZXNzb3IiLCJsZWFkaW5nTXNnIiwiZmllbGRJZCIsIk1lc3NhZ2UiLCJwcm9jZXNzb3IiLCJ0eXBlIiwidGFyZ2V0IiwicHVzaCIsInVuZGVmaW5lZCIsIk5vbmUiLCJzZXRNZXNzYWdlRm9yVU9NRmllbGQiLCJ1cGRhdGVkQWxsTWVzc2FnZXMiLCJhZGRNZXNzYWdlcyIsInVvbUZpZWxkIiwidW9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwibXNnIiwiZmlsdGVyQ29udHJvbCIsImluY2x1ZGVIaWRkZW4iLCJmaWx0ZXJGaWVsZHMiLCJGaWx0ZXJVdGlscyIsImdldENvbnZlcnRlZEZpbHRlckZpZWxkcyIsImNvbnZlcnRlckNvbnRleHQiLCJjcmVhdGVDb252ZXJ0ZXJDb250ZXh0IiwibWFwIiwiZmlsdGVyRmllbGRJbmZvIiwiYW5ub3RhdGlvblBhdGgiLCJwcm9wZXJ0eUFubm90YXRpb25zIiwiZ2V0Q29udmVydGVkVHlwZXMiLCJyZXNvbHZlUGF0aCIsImFubm90YXRpb25zIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ1b21Qcm9wZXJ0eU9iamVjdCIsInVvbVBhdGgiLCJ1b21MYWJlbCIsImZmIiwia2V5IiwiJHRhcmdldCIsIkNvbW1vbiIsIkxhYmVsIiwiQm9vbGVhbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVU9NVmFsaWRhdGlvbkRlbGVnYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVU9NVmFsaWRhdGlvbkRlbGVnYXRlXG4gKlxuICogQSBGaWx0ZXJCYXJEZWxlZ2F0ZSBleHRlbnNpb24gdGhhdCBhZGRzIFVPTSB2YWxpZGF0aW9uIGJlaGF2aW9yIHRvIE1EQyBGaWx0ZXJCYXJzIGluY2x1ZGluZyBhZGFwdGF0aW9uIGFuZCBwZXJzb25hbGl6YXRpb24gdmFyaWFudHMgdXNlZCBpbiB0aGUgVGFibGUgYW5kIENoYXJ0IG9yIEZpbHRlckJhciBQMTNuLlxuICpcbiAqIFRoZSBkZWxlZ2F0ZSBpbnNwZWN0cyBmaWx0ZXIgZmllbGRzIGZvciBhbiBhc3NvY2lhdGVkIE1lYXN1cmVzIG9yIElTT0N1cnJlbmN5IG9yIFVuaXQgYW5ub3RhdGlvbiBhbmQgZW5mb3JjZXNcbiAqIHdoZW4gYSB2YWx1ZSBpcyBlbnRlcmVkIGZvciB0aGUgbGVhZGluZyAobWVhc3VyZSkgZmllbGQsIGEgY29ycmVzcG9uZGluZyBVT00gdmFsdWVcbiAqIGVpdGhlciBleGlzdHMgb3IgaXMgcmVxdWVzdGVkIGZyb20gdGhlIHVzZXIuIEl0IHVwZGF0ZXMgdGhlIEZpbHRlckZpZWxkIHZhbHVlIHN0YXRlcyBhbmQgcmVxdWlyZWRcbiAqIGZsYWdzLCBtYW5hZ2VzIG1lc3NhZ2Ugc3VwcHJlc3Npb24gZm9yIGxpdmUgc2VhcmNoZXMsIGFuZCBjYW4gcmVvcmRlciB0aGUgdmlzaWJsZSBVT00gZmllbGQgbmV4dCB0b1xuICogaXRzIGxlYWRpbmcgZmllbGQgaW4gcGVyc29uYWxpemF0aW9uIHN0YXRlIHdoZW4gcmVxdWlyZWQuXG4gKlxuICogS2V5IGJlaGF2aW9yczpcbiAqIC0gV29ya3Mgd2l0aCB0aHJlZSBGaWx0ZXJCYXIgY29udGV4dHM6XG4gKiAgIC0gTWFpbiAobm9ybWFsKSBGaWx0ZXJCYXJcbiAqICAgLSBGaWx0ZXJCYXIgUDEzbiAoYWRhcHRhdGlvbiBVSSBmb3IgRmlsdGVyQmFyKVxuICogICAtIFRhYmxlIG9yIENoYXJ0IFAxM24gKGFkYXB0YXRpb24gVUkgZm9yIFRhYmxlIG9yIENoYXJ0IEZpbHRlckJhcilcbiAqIC0gRGlzY292ZXJzIFVPTSByZWxhdGlvbnNoaXBzIHVzaW5nIHRoZSBjb252ZXJ0ZWQgZmlsdGVyIGZpZWxkIG1ldGFkYXRhIGFuZCB0aGUgTWVhc3VyZXMuSVNPQ3VycmVuY3kgb3IgTWVhc3VyZXMuVW5pdFxuICogICBhbm5vdGF0aW9uIG9uIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5LlxuICogLSBEZXRlcm1pbmVzIHRoZSB2YWxpZGF0aW9uIHRyaWdnZXIgYnkgaW5zcGVjdGluZyB0aGUgRmlsdGVyQmFyIFwicmVhc29uXCIgc3VjaCBhcyBFbnRlciBvciBHbyBhbmQgbGl2ZSBtb2RlLlxuICogLSBTZXRzIHRoZSB2YWx1ZSBzdGF0ZSBhbmQgdmFsdWUgc3RhdGUgdGV4dCBvbiB0aGUgbGVhZGluZyAobWVhc3VyZSkgZmllbGQgYW5kIG1hcmtzIHRoZSBVT00gRmlsdGVyRmllbGRcbiAqICAgYXMgcmVxdWlyZWQgd2hlbiB0aGUgbGVhZGluZyBmaWVsZCBoYXMgYSB2YWx1ZSBidXQgbm8gVU9NLlxuICogLSBSZXNldHMgdmFsdWUgc3RhdGVzIHdoZW4gbm8gcmVsZXZhbnQgY29uZGl0aW9ucyBhcmUgcHJlc2VudC5cbiAqXG4gKiBVc2FnZTpcbiAqIC0gVGhlIGRlbGVnYXRlIGV4cG9zZXMgZGV0ZXJtaW5lVmFsaWRhdGlvblN0YXRlKGZpbHRlckJhciwgdmFsaWRhdGlvblR5cGUpIHdoaWNoIHJldHVybnMgYSBQcm9taXNlXG4gKiAgIHJlc29sdmluZyB0byBhIEZpbHRlckJhclZhbGlkYXRpb25TdGF0dXMuIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgdGhlIEZpbHRlckJhclxuICogICB2YWxpZGF0aW9uIGxpZmVjeWNsZSB0byBkZWNpZGUgd2hldGhlciBhIHNlYXJjaCBzaG91bGQgYmUgdHJpZ2dlcmVkIG9yIHdoZXRoZXIgbWlzc2luZyB2YWx1ZXNcbiAqICAgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAqL1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eSwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEZpbHRlckZpZWxkIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvY29udHJvbHMvTGlzdFJlcG9ydC9GaWx0ZXJCYXJcIjtcbmltcG9ydCAqIGFzIFJlc291cmNlTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvUmVzb3VyY2VNb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBNZXNzYWdpbmcgZnJvbSBcInNhcC91aS9jb3JlL01lc3NhZ2luZ1wiO1xuaW1wb3J0IENvbnRyb2xNZXNzYWdlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL0NvbnRyb2xNZXNzYWdlUHJvY2Vzc29yXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgTWVzc2FnZVR5cGUgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVR5cGVcIjtcbmltcG9ydCB0eXBlIENoYXJ0IGZyb20gXCJzYXAvdWkvbWRjL0NoYXJ0XCI7XG5pbXBvcnQgdHlwZSBGaWx0ZXJCYXIgZnJvbSBcInNhcC91aS9tZGMvRmlsdGVyQmFyXCI7XG5pbXBvcnQgdHlwZSBNRENGaWx0ZXJGaWVsZCBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJGaWVsZFwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCBGaWx0ZXJCYXJWYWxpZGF0aW9uU3RhdHVzIGZyb20gXCJzYXAvdWkvbWRjL2VudW1zL0ZpbHRlckJhclZhbGlkYXRpb25TdGF0dXNcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgRGVsZWdhdGVVdGlsIGZyb20gXCIuLi9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCB0eXBlIHsgSUZpbHRlckNvbnRyb2wgfSBmcm9tIFwiLi4vZmlsdGVyL0ZpbHRlclV0aWxzXCI7XG5pbXBvcnQgRmlsdGVyVXRpbHMgZnJvbSBcIi4uL2ZpbHRlci9GaWx0ZXJVdGlsc1wiO1xuXG4vLyBUeXBlIGFsaWFzIHJlcHJlc2VudGluZyBwb3NzaWJsZSBhZGFwdGF0aW9uIGNvbnRyb2wgZWxlbWVudCB0eXBlcyAoRmlsdGVyQmFyIHwgVGFibGUgfCBDaGFydClcbnR5cGUgQWRhcHRhdGlvbkVsZW1lbnQgPSBGaWx0ZXJCYXIgfCBUYWJsZSB8IENoYXJ0O1xuXG5jb25zdCBVT01WYWxpZGF0aW9uRGVsZWdhdGUgPSB7XG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB3aGljaCBkZXRlcm1pbmVzIHRoZSB2YWxpZGF0aW9uIHN0YXRlIG9mIHRoZSBGaWx0ZXJGaWVsZHMgb24gYSBnaXZlbiBGaWx0ZXJCYXIgY29udHJvbC5cblx0ICogQHBhcmFtIGZpbHRlckJhciBGaWx0ZXJCYXIgY29udHJvbCB3aGljaCBjYW4gYmUgYSBQMTNuIEZpbHRlckJhciBvciBhIHJlZ3VsYXIgb25lXG5cdCAqIEBwYXJhbSBfbVZhbGlkYXRpb24gU3RyaW5nIHdoaWNoIGNvbnNpc3RzIHdoaWNoIHR5cGUgb2YgdmFsaWRhdGlvbiBpcyBoYXBwZW5pbmdcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHdpdGggYSBWYWxpZGF0aW9uIFN0YXR1cyB3aGljaCBkZXRlcm1pbmVzIGlmIHRoZSBzZWFyY2ggaXMgdHJpZ2dlcmVkIG9yIG5vdFxuXHQgKi9cblx0ZGV0ZXJtaW5lVmFsaWRhdGlvblN0YXRlOiBhc3luYyBmdW5jdGlvbiAoZmlsdGVyQmFyOiBGaWx0ZXJCYXIsIF9tVmFsaWRhdGlvbjogc3RyaW5nKTogUHJvbWlzZTxGaWx0ZXJCYXJWYWxpZGF0aW9uU3RhdHVzPiB7XG5cdFx0Y29uc3QgYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50ID0gVUk1RWxlbWVudC5nZXRFbGVtZW50QnlJZChmaWx0ZXJCYXIuZ2V0QXNzb2NpYXRpb24oXCJhZGFwdGF0aW9uQ29udHJvbFwiLCBudWxsKSBhcyBzdHJpbmcpO1xuXHRcdGNvbnN0IGZpbHRlclR5cGUgPSBnZXRGaWx0ZXJCYXJUeXBlKGZpbHRlckJhciwgYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50IGFzIEFkYXB0YXRpb25FbGVtZW50KTtcblx0XHRjb25zdCB7IGhhc0Vycm9yLCBoYXNXYXJuaW5nIH0gPSBhd2FpdCBVT01WYWxpZGF0aW9uRGVsZWdhdGUudmFsaWRhdGVBbGxVT01GaWVsZHMoXG5cdFx0XHRmaWx0ZXJCYXIsXG5cdFx0XHRmaWx0ZXJCYXIuX3NSZWFzb24sXG5cdFx0XHRmaWx0ZXJUeXBlLFxuXHRcdFx0YWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50XG5cdFx0KTtcblx0XHRpZiAoIWhhc0Vycm9yICYmICFoYXNXYXJuaW5nKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRcdFx0Ly9BZnRlciBkaXNjdXNzaW9ucyB3aXRoIE1EQyB3ZSBuZWVkIHRvIHVzZSB0aGlzIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgdG8gc29sdmUgdGhlIHRpbWluZyBpc3N1ZXMgcmVsYXRlZCB0byBzZXR0aW5nIHRoZSBtZXNzYWdlcyB0byB0aGUgZmlsdGVyZmllbGQgYW5kIHVwZGF0ZSBvZiB0aGUgZmlsdGVyZmllbGQgdmFsdWVzdGF0ZVxuXHRcdFx0XHQvL1RPRE86IFJlbW92ZSB0aGlzIHdvcmthcm91bmQgb25jZSBNREMgcHJvdmlkZXMgYW4gQVBJIHRvIHNldCB0aGUgbWVzc2FnZXMgdG8gdGhlIGZpbHRlcmJhci4gV2lsbCBiZSB0cmFja2VkIHZpYSBCTEkuXG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHJlc29sdmUoZmlsdGVyQmFyLmNoZWNrRmlsdGVycygpKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly9pZiB3YXJuaW5nIG9yIGxpdmVNb2RlLCB3ZSBkb24ndCBvcGVuIG1lc3NhZ2UgYm94XG5cdFx0ZmlsdGVyQmFyLnNldFNob3dNZXNzYWdlcyghaGFzV2FybmluZyAmJiAhZmlsdGVyQmFyLmdldExpdmVNb2RlKCkpO1xuXHRcdHJldHVybiBoYXNFcnJvciA/IEZpbHRlckJhclZhbGlkYXRpb25TdGF0dXMuRmllbGRJbkVycm9yU3RhdGUgOiBmaWx0ZXJCYXIuY2hlY2tGaWx0ZXJzKCk7XG5cdH0sXG5cdHZhbGlkYXRlQWxsVU9NRmllbGRzOiBhc3luYyBmdW5jdGlvbiAoXG5cdFx0ZmlsdGVyQmFyOiBGaWx0ZXJCYXIsXG5cdFx0cmVhc29uPzogc3RyaW5nLFxuXHRcdGZpbHRlclR5cGU/OiBGaWx0ZXJUeXBlLFxuXHRcdGFkYXB0YXRpb25Db250cm9sRWxlbWVudD86IFVJNUVsZW1lbnRcblx0KTogUHJvbWlzZTx7IGhhc0Vycm9yOiBib29sZWFuOyBoYXNXYXJuaW5nOiBib29sZWFuIH0+IHtcblx0XHRsZXQgaGFzRXJyb3IgPSBmYWxzZSxcblx0XHRcdGhhc1dhcm5pbmcgPSBmYWxzZTtcblx0XHRsZXQgZW50aXR5VHlwZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRsZXQgY29udHJvbEZvck1ldGFNb2RlbDogVUk1RWxlbWVudCB8IHVuZGVmaW5lZDtcblx0XHRhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQgPVxuXHRcdFx0YWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50ID8/IFVJNUVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmlsdGVyQmFyLmdldEFzc29jaWF0aW9uKFwiYWRhcHRhdGlvbkNvbnRyb2xcIiwgbnVsbCkgYXMgc3RyaW5nKTtcblx0XHRmaWx0ZXJUeXBlID0gZmlsdGVyVHlwZSA/PyBnZXRGaWx0ZXJCYXJUeXBlKGZpbHRlckJhciwgYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50IGFzIEFkYXB0YXRpb25FbGVtZW50KTtcblx0XHRpZiAoZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZS5GSUxURVJCQVJfUDEzTiB8fCBmaWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlLlRBQkxFX0NIQVJUX1AxM04pIHtcblx0XHRcdGVudGl0eVR5cGVQYXRoID0gRGVsZWdhdGVVdGlsLmdldEN1c3RvbURhdGE8c3RyaW5nPihhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQgYXMgRmlsdGVyQmFyLCBcImVudGl0eVR5cGVcIikgYXMgc3RyaW5nO1xuXHRcdFx0Y29udHJvbEZvck1ldGFNb2RlbCA9IGFkYXB0YXRpb25Db250cm9sRWxlbWVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZW50aXR5VHlwZVBhdGggPSBEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YTxzdHJpbmc+KGZpbHRlckJhciwgXCJlbnRpdHlUeXBlXCIpIGFzIHN0cmluZztcblx0XHRcdGNvbnRyb2xGb3JNZXRhTW9kZWwgPSBmaWx0ZXJCYXI7XG5cdFx0fVxuXHRcdGNvbnN0IHZpZXcgPSBDb21tb25VdGlscy5nZXRUYXJnZXRWaWV3KGNvbnRyb2xGb3JNZXRhTW9kZWwgYXMgQ29udHJvbCk7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdmlldyAmJiBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldyk7XG5cdFx0Y29uc3QgZGlzYWJsZVN0cmljdFVvbUZpbHRlcmluZyA9IGFwcENvbXBvbmVudD8uZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5mZVwiKT8uYXBwPy5kaXNhYmxlU3RyaWN0VW9tRmlsdGVyaW5nO1xuXHRcdGlmIChkaXNhYmxlU3RyaWN0VW9tRmlsdGVyaW5nID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4geyBoYXNFcnJvcjogZmFsc2UsIGhhc1dhcm5pbmc6IGZhbHNlIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGNvbnRyb2xGb3JNZXRhTW9kZWw/LmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdFx0Y29uc3QgZmlsdGVyQmFySWQgPSBmaWx0ZXJCYXIuZ2V0SWQoKTtcblx0XHRjb25zdCBhbGxVb21WYWxpZGF0aW9uTWVzc2FnZXMgPSBpbnRlcm5hbE1vZGVsPy5nZXRQcm9wZXJ0eShcIi91b21WYWxpZGF0aW9uTWVzc2FnZXNcIikgfHwge307XG5cdFx0Y29uc3QgZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gYWxsVW9tVmFsaWRhdGlvbk1lc3NhZ2VzW2ZpbHRlckJhcklkXSB8fCB7fTtcblxuXHRcdC8vIENsZWFyIGV4aXN0aW5nIFVPTSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvciB0aGlzIGZpbHRlckJhciBmcm9tIHRoZSBtZXNzYWdlIG1vZGVsXG5cdFx0cmVtb3ZlTWVzc2FnZXMoaW50ZXJuYWxNb2RlbCBhcyBKU09OTW9kZWwsIGZpbHRlckJhcklkLCBmaWx0ZXJCYXJVb21WYWxpZGF0aW9uTWVzc2FnZXMpO1xuXHRcdGNvbnN0IG1vZGVsID0gYXdhaXQgRGVsZWdhdGVVdGlsLmZldGNoTW9kZWwoY29udHJvbEZvck1ldGFNb2RlbCBhcyBBZGFwdGF0aW9uRWxlbWVudCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gbW9kZWw/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBSZXNvdXJjZU1vZGVsSGVscGVyLmdldFJlc291cmNlTW9kZWwoY29udHJvbEZvck1ldGFNb2RlbCBhcyBDb250cm9sKTtcblx0XHRjb25zdCBhbGxVT01Qcm9wZXJ0aWVzID0gZ2V0VU9NUHJvcGVydGllcyhlbnRpdHlUeXBlUGF0aCwgZmlsdGVyQmFyIGFzIElGaWx0ZXJDb250cm9sLCBtZXRhTW9kZWwpO1xuXHRcdGlmIChcblx0XHRcdCFhbGxVT01Qcm9wZXJ0aWVzLmxlbmd0aCB8fFxuXHRcdFx0IWFsbFVPTVByb3BlcnRpZXMuc29tZSgodW9tUHJvcDogVU9NUHJvcGVydHkpID0+IGZpbHRlckJhcj8uZ2V0Q29uZGl0aW9ucygpPy5bdW9tUHJvcD8uZmllbGQ/LmZpZWxkS2V5XT8ubGVuZ3RoID4gMClcblx0XHQpIHtcblx0XHRcdHVvbVN0YXRlTWFwID0ge307XG5cdFx0XHRyZXR1cm4geyBoYXNFcnJvcjogZmFsc2UsIGhhc1dhcm5pbmc6IGZhbHNlIH07XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgeyBmaWVsZCwgdW9tUHJvcGVydHkgfSBvZiBhbGxVT01Qcm9wZXJ0aWVzKSB7XG5cdFx0XHRpZiAodW9tUHJvcGVydHkpIHtcblx0XHRcdFx0Y29uc3QgeyBoYXNFcnJvcjogZmllbGRIYXNFcnJvciwgaGFzV2FybmluZzogZmllbGRIYXNXYXJuaW5nIH0gPSB2YWxpZGF0ZUZpbHRlckZpZWxkKFxuXHRcdFx0XHRcdGZpbHRlckJhcixcblx0XHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0XHR1b21Qcm9wZXJ0eSxcblx0XHRcdFx0XHRmaWx0ZXJUeXBlLFxuXHRcdFx0XHRcdHJlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0YWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50LFxuXHRcdFx0XHRcdHJlYXNvbiBhcyBzdHJpbmcsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbCBhcyBKU09OTW9kZWxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoZmllbGRIYXNFcnJvcikgaGFzRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRpZiAoZmllbGRIYXNXYXJuaW5nKSBoYXNXYXJuaW5nID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dW9tU3RhdGVNYXAgPSB7fTtcblx0XHRyZXR1cm4geyBoYXNFcnJvciwgaGFzV2FybmluZyB9O1xuXHR9XG59O1xuLyoqXG4gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgdW5pdCBvZiBtZWFzdXJlIChVT00pIHByb3BlcnR5IGFuZCBpdHMgYXNzb2NpYXRlZCBmaWVsZC5cbiAqIFVzZWQgdG8gdHJhY2sgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIG1lYXN1cmUgZmllbGRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIFVPTSBmaWVsZHMuXG4gKiBAaW50ZXJmYWNlXG4gKi9cbmludGVyZmFjZSBVT01Qcm9wZXJ0eSB7XG5cdC8qKlxuXHQgKiBUaGUgbWFpbiBtZWFzdXJlIGZpZWxkIGluZm9ybWF0aW9uXG5cdCAqL1xuXHRmaWVsZDoge1xuXHRcdC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGZpZWxkICovXG5cdFx0ZmllbGRLZXk6IHN0cmluZztcblx0XHQvKiogRGlzcGxheSBsYWJlbCBmb3IgdGhlIGZpZWxkICovXG5cdFx0bGFiZWw6IHN0cmluZztcblx0fTtcblx0LyoqXG5cdCAqIE9wdGlvbmFsIGFzc29jaWF0ZWQgdW5pdCBvZiBtZWFzdXJlIChVT00pIGZpZWxkIGluZm9ybWF0aW9uXG5cdCAqL1xuXHR1b21Qcm9wZXJ0eT86IHtcblx0XHQvKiogUGF0aCB0byB0aGUgVU9NIGZpZWxkICovXG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdC8qKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgVU9NIGZpZWxkICovXG5cdFx0bGFiZWw6IHN0cmluZztcblx0fTtcbn1cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBGaWx0ZXJCYXIgdHlwZXMgaW4gdGhlIGFwcGxpY2F0aW9uLlxuICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIHZhbGlkYXRpb24gYmVoYXZpb3IgYmFzZWQgb24gdGhlIGNvbnRleHQgd2hlcmUgdGhlIGZpbHRlciBpcyBiZWluZyB1c2VkLlxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZW51bSBGaWx0ZXJUeXBlIHtcblx0LyoqIFJlZ3VsYXIgRmlsdGVyQmFyIGluc3RhbmNlIChub3QgaW4gcGVyc29uYWxpemF0aW9uIG1vZGUpICovXG5cdE1BSU4gPSBcIk1haW5cIixcblx0LyoqIEZpbHRlckJhciBpbiBwZXJzb25hbGl6YXRpb24gbW9kZSBmb3IgZmlsdGVyIGFkYXB0YXRpb24gKi9cblx0RklMVEVSQkFSX1AxM04gPSBcIkZpbHRlclAxM25cIixcblx0LyoqIEZpbHRlckJhciBpbiBwZXJzb25hbGl6YXRpb24gbW9kZSBmb3IgVGFibGUgb3IgQ2hhcnQgYWRhcHRhdGlvbiAqL1xuXHRUQUJMRV9DSEFSVF9QMTNOID0gXCJUYWJsZUNoYXJ0UDEzblwiXG59XG5cbmxldCB1b21TdGF0ZU1hcDogUmVjb3JkPHN0cmluZywgeyBtZXNzYWdlVHlwZT86IE1lc3NhZ2VUeXBlIH0+ID0ge307XG5sZXQgY29udHJvbE1lc3NhZ2VQcm9jZXNzb3I6IENvbnRyb2xNZXNzYWdlUHJvY2Vzc29yIHwgdW5kZWZpbmVkO1xuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBGaWx0ZXJUeXBlIGZvciBhIGdpdmVuIEZpbHRlckJhciBhbmQgYW4gb3B0aW9uYWwgYWRhcHRhdGlvbiBjb250cm9sIGVsZW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIGNsYXNzaWZpZXMgdGhlIGZpbHRlciBiYXIgaW50byBvbmUgb2YgdGhyZWUgRmlsdGVyVHlwZSB2YWx1ZXM6XG4gKiAtIEZpbHRlclR5cGUuTUFJTjogV2hlbiB0aGUgcHJvdmlkZWQgZmlsdGVyQmFyIGlzIG5vdCBhbiBhZGFwdGF0aW9uIHN1Y2ggd2hlbiBpdCBpcyBub3QgYW4gQWRhcHRhdGlvbkZpbHRlckJhci5cbiAqIC0gRmlsdGVyVHlwZS5GSUxURVJCQVJfUDEzTjogV2hlbiB0aGUgcHJvdmlkZWQgZmlsdGVyQmFyIGlzIGFuIEFkYXB0YXRpb25GaWx0ZXJCYXIgYnV0IHRoZSBhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnRcbiAqICAgaXMgbm90IGEgVGFibGUgb3IgQ2hhcnQuXG4gKiAtIEZpbHRlclR5cGUuVEFCTEVfQ0hBUlRfUDEzTjogV2hlbiB0aGUgcHJvdmlkZWQgZmlsdGVyQmFyIGlzIGFuIEFkYXB0YXRpb25GaWx0ZXJCYXIgYW5kIHRoZVxuICogICBhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQgaXMgYSBUYWJsZSBvciBDaGFydC5cbiAqIEBwYXJhbSBmaWx0ZXJCYXIgVGhlIEZpbHRlckJhciBpbnN0YW5jZSB0byBpbnNwZWN0LiBFeHBlY3RlZCB0byBpbXBsZW1lbnQgaXNBKCkuXG4gKiBAcGFyYW0gYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50IFRoZSBjb250cm9sIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRhcHRhdGlvbiB3b3JrZmxvdyB3aGljaCBtYXkgYmUgYSBGaWx0ZXJCYXIsIFRhYmxlLCBvciBDaGFydC4gVXNlZCB0byBkaXN0aW5ndWlzaCB0YWJsZSBvciBjaGFydCBwZXJzb25hbGl6YXRpb24gZnJvbSBnZW5lcmFsIGZpbHRlciBiYXIgcGVyc29uYWxpemF0aW9uLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIEZpbHRlclR5cGUgZW51bSB2YWx1ZSByZXByZXNlbnRpbmcgaG93IHRoZSBmaWx0ZXIgYmFyIHNob3VsZCBiZSB0cmVhdGVkLlxuICovXG5mdW5jdGlvbiBnZXRGaWx0ZXJCYXJUeXBlKGZpbHRlckJhcjogRmlsdGVyQmFyLCBhZGFwdGF0aW9uQ29udHJvbEVsZW1lbnQ6IEZpbHRlckJhciB8IFRhYmxlIHwgQ2hhcnQpOiBGaWx0ZXJUeXBlIHtcblx0aWYgKGZpbHRlckJhci5pc0EoXCJzYXAudWkubWRjLmZpbHRlcmJhci5wMTNuLkFkYXB0YXRpb25GaWx0ZXJCYXJcIikpIHtcblx0XHRpZiAoKGFkYXB0YXRpb25Db250cm9sRWxlbWVudCBhcyBUYWJsZSk/LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgfHwgKGFkYXB0YXRpb25Db250cm9sRWxlbWVudCBhcyBDaGFydCk/LmlzQShcInNhcC51aS5tZGMuQ2hhcnRcIikpIHtcblx0XHRcdHJldHVybiBGaWx0ZXJUeXBlLlRBQkxFX0NIQVJUX1AxM047XG5cdFx0fVxuXHRcdHJldHVybiBGaWx0ZXJUeXBlLkZJTFRFUkJBUl9QMTNOO1xuXHR9XG5cdHJldHVybiBGaWx0ZXJUeXBlLk1BSU47XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVycm9yIHN0YXRlIGNoZWNrIHNob3VsZCBiZSBwZXJmb3JtZWQgYmFzZWQgb24gdGhlIHRyaWdnZXJpbmcgcmVhc29uLFxuICogdGhlIHR5cGUgb2YgZmlsdGVyIGNvbnRleHQsIGFuZCB0aGUgZmlsdGVyIGJhcidzIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgZXhwbGljaXQgdXNlciBhY3Rpb25zIChmb3IgZXhhbXBsZSwgXCJFbnRlclwiLCBcIkdvXCIsIG9yIFwiVmFyaWFudFwiKSxcbiAqIHdoZW4gdGhlIGZpbHRlciBiYXIgaXMgb2YgdGhlIHRhYmxlIG9yIGNoYXJ0IHBlcnNvbmFsaXphdGlvbiB0eXBlLCBvciB3aGVuIHRoZSBmaWx0ZXIgYmFyXG4gKiBwZXJzb25hbGl6YXRpb24gaXMgYWN0aXZlIGFuZCB0aGUgZmlsdGVyIGJhciBpcyBpbiBsaXZlIG1vZGUuXG4gKiBAcGFyYW0gcmVhc29uIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGV2ZW50IG9yIHVzZXIgYWN0aW9uIHRoYXQgdHJpZ2dlcmVkIHZhbGlkYXRpb24uIEZvciBleGFtcGxlLCBcIkVudGVyXCIsIFwiR29cIiwgb3IgXCJWYXJpYW50XCIuXG4gKiBAcGFyYW0gZmlsdGVyVHlwZSBUaGUgRmlsdGVyVHlwZSBlbnVtIHZhbHVlIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgZmlsdGVyIGNvbnRleHQgd2hpY2ggaXMgdXNlZCB0byBkZXRlY3QgcGVyc29uYWxpemF0aW9uIGNvbnRleHRzLlxuICogQHBhcmFtIGZpbHRlckJhciBPcHRpb25hbCBGaWx0ZXJCYXIgaW5zdGFuY2UuIFdoZW4gcHJvdmlkZWQsIGl0cyBsaXZlIG1vZGUgaXMgY29uc3VsdGVkIGZvciBjZXJ0YWluIHBlcnNvbmFsaXphdGlvbiB0eXBlcy5cbiAqIEByZXR1cm5zIFRydWUgaWYgYW4gZXJyb3Igc3RhdGUgc2hvdWxkIGJlIGNoZWNrZWQgZ2l2ZW4gdGhlIGlucHV0cy4gT3RoZXJ3aXNlLCBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkQ2hlY2tFcnJvclN0YXRlKHJlYXNvbjogc3RyaW5nLCBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLCBmaWx0ZXJCYXI6IEZpbHRlckJhciB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdHJlYXNvbiA9PT0gXCJFbnRlclwiIHx8XG5cdFx0cmVhc29uID09PSBcIkdvXCIgfHxcblx0XHRyZWFzb24gPT09IFwiVmFyaWFudFwiIHx8XG5cdFx0KGZpbHRlckJhcj8uZ2V0TGl2ZU1vZGUoKSBhcyBib29sZWFuKSB8fFxuXHRcdGZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuVEFCTEVfQ0hBUlRfUDEzTlxuXHQpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXhpc3RpbmcgVU9NIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIGEgc3BlY2lmaWMgZmlsdGVyQmFyIGZyb20gdGhlIG1lc3NhZ2UgbW9kZWxcbiAqIGFuZCBjbGVhcnMgdGhlIHVvbVZhbGlkYXRpb25NZXNzYWdlcyBwcm9wZXJ0eSBpbiB0aGUgaW50ZXJuYWwgbW9kZWwuXG4gKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgaW50ZXJuYWwgSlNPTk1vZGVsIGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXNcbiAqIEBwYXJhbSBmaWx0ZXJCYXJJZCBUaGUgSUQgb2YgdGhlIGZpbHRlckJhciB3aG9zZSBtZXNzYWdlcyBzaG91bGQgYmUgcmVtb3ZlZFxuICogQHBhcmFtIGZpbHRlckJhclVvbVZhbGlkYXRpb25NZXNzYWdlcyBUaGUgY3VycmVudCBVT00gdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgdGhpcyBmaWx0ZXJCYXJcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlTWVzc2FnZXMoXG5cdGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCB8IHVuZGVmaW5lZCxcblx0ZmlsdGVyQmFySWQ6IHN0cmluZyxcblx0ZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiB2b2lkIHtcblx0aWYgKE9iamVjdC5rZXlzKGZpbHRlckJhclVvbVZhbGlkYXRpb25NZXNzYWdlcykubGVuZ3RoID4gMCkge1xuXHRcdGNvbnN0IGFsbE1lc3NhZ2VzOiBNZXNzYWdlW10gPSBNZXNzYWdpbmcuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdGNvbnN0IG1lc3NhZ2VzVG9SZW1vdmUgPSBhbGxNZXNzYWdlcy5maWx0ZXIoKG0pID0+IE9iamVjdC52YWx1ZXMoZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzKS5pbmNsdWRlcyhtLmdldElkKCkpKTtcblx0XHRpZiAobWVzc2FnZXNUb1JlbW92ZS5sZW5ndGgpIHtcblx0XHRcdE1lc3NhZ2luZy5yZW1vdmVNZXNzYWdlcyhtZXNzYWdlc1RvUmVtb3ZlKTtcblx0XHR9XG5cdFx0Ly8gQ2xlYXIgdGhlIHVvbVZhbGlkYXRpb25NZXNzYWdlcyBwcm9wZXJ0eSBmb3IgdGhpcyBzcGVjaWZpYyBmaWx0ZXJCYXJcblx0XHRpZiAoaW50ZXJuYWxNb2RlbCkge1xuXHRcdFx0Y29uc3QgYWxsVW9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi91b21WYWxpZGF0aW9uTWVzc2FnZXNcIikgfHwge307XG5cdFx0XHRjb25zdCB1cGRhdGVkTWVzc2FnZXMgPSB7IC4uLmFsbFVvbVZhbGlkYXRpb25NZXNzYWdlcyB9O1xuXHRcdFx0ZGVsZXRlIHVwZGF0ZWRNZXNzYWdlc1tmaWx0ZXJCYXJJZF07XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3VvbVZhbGlkYXRpb25NZXNzYWdlc1wiLCB1cGRhdGVkTWVzc2FnZXMpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBmaWVsZHMuXG4gKiBAcGFyYW0gZmlsdGVyQmFyIFRoZSBjb250cm9sIG9uIHdoaWNoIHRoZSBmaWVsZHMgZXhpc3QgYW5kIHdob3NlIElEIHdpbGwgYmUgdXNlZCBhcyBtZXNzYWdlIHN0b3JhZ2Uga2V5XG4gKiBAcGFyYW0gZmllbGQgVGhlIGZpZWxkIHRvIGJlIGV2YWx1YXRlZCB3aGljaCBoYXMgYSBmaWVsZEtleSBhbmQgbGFiZWxcbiAqIEBwYXJhbSBmaWVsZC5maWVsZEtleVxuICogQHBhcmFtIGZpZWxkLmxhYmVsXG4gKiBAcGFyYW0gdW9tUHJvcGVydHkgVGhlIFVPTSBwcm9wZXJ0eSBpZiBhbnkgZXhpc3RzIGZvciB0aGUgZmllbGRcbiAqIEBwYXJhbSB1b21Qcm9wZXJ0eS5wYXRoXG4gKiBAcGFyYW0gdW9tUHJvcGVydHkubGFiZWxcbiAqIEBwYXJhbSBmaWx0ZXJUeXBlIFRoZSB0eXBlIG9mIHRoZSBmaWx0ZXJCYXJcbiAqIEBwYXJhbSByZXNvdXJjZU1vZGVsXG4gKiBAcGFyYW0gYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50XG4gKiBAcGFyYW0gcmVhc29uXG4gKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgaW50ZXJuYWwgSlNPTk1vZGVsIGZvciBtZXNzYWdlIHN0b3JhZ2VcbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHdoZXRoZXIgd2UgaGF2ZSBhbiBlcnJvciBvciBhIHdhcm5pbmcgc3RhdGVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXJGaWVsZChcblx0ZmlsdGVyQmFyOiBGaWx0ZXJCYXIsXG5cdGZpZWxkOiB7IGZpZWxkS2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfSxcblx0dW9tUHJvcGVydHk6IHsgcGF0aDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0sXG5cdGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG5cdHJlc291cmNlTW9kZWw6IFJlc291cmNlTW9kZWwsXG5cdGFkYXB0YXRpb25Db250cm9sRWxlbWVudDogVUk1RWxlbWVudCB8IHVuZGVmaW5lZCxcblx0cmVhc29uOiBzdHJpbmcsXG5cdGludGVybmFsTW9kZWw/OiBKU09OTW9kZWxcbik6IHsgaGFzRXJyb3I6IGJvb2xlYW47IGhhc1dhcm5pbmc6IGJvb2xlYW4gfSB7XG5cdGNvbnN0IHsgZmllbGRLZXksIGxhYmVsIH0gPSBmaWVsZDtcblx0Y29uc3QgYXNzb2NpYXRlZFVPTVByb3BlcnR5UGF0aCA9IHVvbVByb3BlcnR5LnBhdGg7XG5cdGNvbnN0IGZpbHRlckJhckNvbmRpdGlvbnMgPSBmaWx0ZXJCYXIuZ2V0Q29uZGl0aW9ucygpO1xuXHRjb25zdCBpc0ZpZWxkTmFtZUluQ29uZGl0aW9ucyA9ICEhZmlsdGVyQmFyQ29uZGl0aW9ucz8uW2ZpZWxkS2V5XT8ubGVuZ3RoO1xuXHRjb25zdCBpc1VPTUluQ29uZGl0aW9ucyA9IGFzc29jaWF0ZWRVT01Qcm9wZXJ0eVBhdGggPyBmaWx0ZXJCYXJDb25kaXRpb25zPy5bYXNzb2NpYXRlZFVPTVByb3BlcnR5UGF0aF0/Lmxlbmd0aCA9PT0gMSA6IGZhbHNlO1xuXHRjb25zdCBkb2VzVU9NSGF2ZU11bHRpcGxlQ29uZGl0aW9ucyA9IGFzc29jaWF0ZWRVT01Qcm9wZXJ0eVBhdGggPyBmaWx0ZXJCYXJDb25kaXRpb25zPy5bYXNzb2NpYXRlZFVPTVByb3BlcnR5UGF0aF0/Lmxlbmd0aCA+IDEgOiBmYWxzZTtcblx0Y29uc3QgbGVhZGluZ0ZpbHRlckZpZWxkID0gZmlsdGVyQmFyLmdldEZpbHRlckl0ZW1zKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5nZXRQcm9wZXJ0eUtleSgpID09PSBmaWVsZEtleSk7XG5cdGNvbnN0IHVvbUZpbHRlckZpZWxkID0gZmlsdGVyQmFyLmdldEZpbHRlckl0ZW1zKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5nZXRQcm9wZXJ0eUtleSgpID09PSBhc3NvY2lhdGVkVU9NUHJvcGVydHlQYXRoKTtcblx0Y29uc3QgbWVzc2FnZVRleHQgPSBkb2VzVU9NSGF2ZU11bHRpcGxlQ29uZGl0aW9uc1xuXHRcdD8gcmVzb3VyY2VNb2RlbD8uZ2V0VGV4dD8uKFwiRklMVEVSRklFTERfVkFMVUVfVU9NX01VTFRJUExFXCIsIFt1b21GaWx0ZXJGaWVsZD8uZ2V0TGFiZWwoKSA/PyB1b21Qcm9wZXJ0eT8ubGFiZWxdKVxuXHRcdDogcmVzb3VyY2VNb2RlbD8uZ2V0VGV4dD8uKFwiRklMVEVSRklFTERfVkFMVUVfTk9fVU9NXCIsIFtcblx0XHRcdFx0bGVhZGluZ0ZpbHRlckZpZWxkPy5nZXRMYWJlbCgpID8/IGxhYmVsLFxuXHRcdFx0XHR1b21GaWx0ZXJGaWVsZD8uZ2V0TGFiZWwoKSA/PyB1b21Qcm9wZXJ0eT8ubGFiZWxcblx0XHQgIF0pO1xuXHRpZiAoIWlzRmllbGROYW1lSW5Db25kaXRpb25zIHx8IChpc0ZpZWxkTmFtZUluQ29uZGl0aW9ucyAmJiBpc1VPTUluQ29uZGl0aW9ucykpIHtcblx0XHRyZXR1cm4geyBoYXNFcnJvcjogZmFsc2UsIGhhc1dhcm5pbmc6IGZhbHNlIH07XG5cdH1cblxuXHRjb25zdCBpc0Vycm9yID0gc2hvdWxkQ2hlY2tFcnJvclN0YXRlKFxuXHRcdHJlYXNvbixcblx0XHRmaWx0ZXJUeXBlLFxuXHRcdGZpbHRlclR5cGUgPT09IEZpbHRlclR5cGUuRklMVEVSQkFSX1AxM04gPyAoYWRhcHRhdGlvbkNvbnRyb2xFbGVtZW50IGFzIEZpbHRlckJhcikgOiBmaWx0ZXJCYXJcblx0KTtcblx0c2V0TWVzc2FnZXMoXG5cdFx0bGVhZGluZ0ZpbHRlckZpZWxkLFxuXHRcdHVvbUZpbHRlckZpZWxkLFxuXHRcdGlzRXJyb3IgPyBNZXNzYWdlVHlwZS5FcnJvciA6IE1lc3NhZ2VUeXBlLldhcm5pbmcsXG5cdFx0bWVzc2FnZVRleHQsXG5cdFx0aW50ZXJuYWxNb2RlbCBhcyBKU09OTW9kZWwsXG5cdFx0ZmlsdGVyQmFyXG5cdCk7XG5cdHJldHVybiB7IGhhc0Vycm9yOiBpc0Vycm9yLCBoYXNXYXJuaW5nOiAhaXNFcnJvciB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIFVJIHN0YXRlIGZvciBhIGxlYWRpbmcgZmlsdGVyIGZpZWxkIGFuZCBpdHMgYXNzb2NpYXRlZCBVT00gZmlsdGVyIGZpZWxkLlxuICogU2V0cyB0aGUgVmFsdWVTdGF0ZSBhbmQgb3B0aW9uYWwgVmFsdWVTdGF0ZVRleHQgb24gdGhlIGxlYWRpbmcgZmlsdGVyIChpZiBwcmVzZW50KSxcbiAqIGFuZCBzZXRzIHRoZSByZXF1aXJlZCBmbGFnIGFzIHdlbGwgYXMgVmFsdWVTdGF0ZSBhbmQgVmFsdWVTdGF0ZVRleHQgb24gdGhlIFVPTSBmaWx0ZXIgKGlmIHByZXNlbnQpLlxuICogQHBhcmFtIGxlYWRpbmdGaWx0ZXJGaWVsZCBUaGUgcHJpbWFyeSAobGVhZGluZykgTURDRmlsdGVyRmllbGQgdG8gdXBkYXRlLiBPbmx5IGl0cyB2YWx1ZSBzdGF0ZSBhbmQgdGV4dCBhcmUgbW9kaWZpZWQuXG4gKiBAcGFyYW0gdW9tRmlsdGVyRmllbGQgVGhlIFVPTSBNRENGaWx0ZXJGaWVsZCB0byB1cGRhdGUuIEl0cyByZXF1aXJlZCBmbGFnLCB2YWx1ZSBzdGF0ZSwgYW5kIHRleHQgYXJlIG1vZGlmaWVkLlxuICogQHBhcmFtIG1lc3NhZ2VUeXBlIFRoZSBWYWx1ZVN0YXRlIHRvIGFwcGx5IHN1Y2ggYXMgTm9uZSwgV2FybmluZywgRXJyb3IsIG9yIFN1Y2Nlc3MuXG4gKiBAcGFyYW0gbWVzc2FnZSBPcHRpb25hbCBkZXNjcmlwdGl2ZSB0ZXh0IHRvIGRpc3BsYXkgZm9yIHRoZSB2YWx1ZSBzdGF0ZS5cbiAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIFRoZSBpbnRlcm5hbCBKU09OTW9kZWwgZm9yIG1lc3NhZ2Ugc3RvcmFnZS5cbiAqIEBwYXJhbSBmaWx0ZXJCYXIgVGhlIEZpbHRlckJhciB3aG9zZSBJRCB3aWxsIGJlIHVzZWQgYXMgdGhlIGtleSBmb3IgbWVzc2FnZSBzdG9yYWdlIGluIHRoZSBpbnRlcm5hbCBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gc2V0TWVzc2FnZXMoXG5cdGxlYWRpbmdGaWx0ZXJGaWVsZDogTURDRmlsdGVyRmllbGQgfCB1bmRlZmluZWQsXG5cdHVvbUZpbHRlckZpZWxkOiBNRENGaWx0ZXJGaWVsZCB8IHVuZGVmaW5lZCxcblx0bWVzc2FnZVR5cGU6IE1lc3NhZ2VUeXBlLFxuXHRtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdGludGVybmFsTW9kZWw/OiBKU09OTW9kZWwsXG5cdGZpbHRlckJhcj86IEZpbHRlckJhclxuKTogdm9pZCB7XG5cdGNvbnN0IG1lc3NhZ2VzOiBNZXNzYWdlIHwgTWVzc2FnZVtdID0gW107XG5cdGNvbnRyb2xNZXNzYWdlUHJvY2Vzc29yID8/PSBuZXcgQ29udHJvbE1lc3NhZ2VQcm9jZXNzb3IoKTtcblxuXHQvLyBHZXQgY3VycmVudCBVT00gdmFsaWRhdGlvbiBtZXNzYWdlcyBmcm9tIGludGVybmFsIG1vZGVsXG5cdGNvbnN0IGZpbHRlckJhcklkID0gZmlsdGVyQmFyPy5nZXRJZCgpID8/IFwiXCI7XG5cdGNvbnN0IGFsbFVvbVZhbGlkYXRpb25NZXNzYWdlcyA9IGludGVybmFsTW9kZWw/LmdldFByb3BlcnR5KFwiL3VvbVZhbGlkYXRpb25NZXNzYWdlc1wiKSB8fCB7fTtcblx0Y29uc3QgZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gYWxsVW9tVmFsaWRhdGlvbk1lc3NhZ2VzW2ZpbHRlckJhcklkXSB8fCB7fTtcblxuXHRsZXQgbGVhZGluZ01zZzogTWVzc2FnZSB8IHVuZGVmaW5lZDtcblx0aWYgKGxlYWRpbmdGaWx0ZXJGaWVsZCkge1xuXHRcdGNvbnN0IGZpZWxkSWQgPSBsZWFkaW5nRmlsdGVyRmllbGQuZ2V0SWQoKTtcblx0XHQvLyBDaGVjayBpZiBtZXNzYWdlIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGZpZWxkIGluIHRoaXMgZmlsdGVyQmFyJ3MgY29udGV4dFxuXHRcdGlmICghZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzW2ZpZWxkSWRdKSB7XG5cdFx0XHRsZWFkaW5nTXNnID0gbmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRtZXNzYWdlOiBtZXNzYWdlLFxuXHRcdFx0XHRwcm9jZXNzb3I6IGNvbnRyb2xNZXNzYWdlUHJvY2Vzc29yLFxuXHRcdFx0XHR0eXBlOiBtZXNzYWdlVHlwZSxcblx0XHRcdFx0dGFyZ2V0OiBmaWVsZElkICsgXCIvY29uZGl0aW9uc1wiXG5cdFx0XHR9KTtcblx0XHRcdG1lc3NhZ2VzLnB1c2gobGVhZGluZ01zZyk7XG5cdFx0XHQvLyBTdG9yZSBtZXNzYWdlIElEIGluIGZpbHRlckJhcidzIHZhbGlkYXRpb24gbWVzc2FnZXNcblx0XHRcdGZpbHRlckJhclVvbVZhbGlkYXRpb25NZXNzYWdlc1tmaWVsZElkXSA9IGxlYWRpbmdNc2cuZ2V0SWQoKTtcblx0XHR9XG5cdH1cblx0aWYgKHVvbUZpbHRlckZpZWxkICYmIHVvbVN0YXRlTWFwW3VvbUZpbHRlckZpZWxkLmdldElkKCldICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAodW9tU3RhdGVNYXBbdW9tRmlsdGVyRmllbGQuZ2V0SWQoKV0/Lm1lc3NhZ2VUeXBlID09PSBNZXNzYWdlVHlwZS5Ob25lKSB7XG5cdFx0XHRzZXRNZXNzYWdlRm9yVU9NRmllbGQodW9tRmlsdGVyRmllbGQsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlLCBtZXNzYWdlcywgZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAodW9tRmlsdGVyRmllbGQpIHtcblx0XHRzZXRNZXNzYWdlRm9yVU9NRmllbGQodW9tRmlsdGVyRmllbGQsIG1lc3NhZ2VUeXBlLCBtZXNzYWdlLCBtZXNzYWdlcywgZmlsdGVyQmFyVW9tVmFsaWRhdGlvbk1lc3NhZ2VzKTtcblx0fVxuXG5cdC8vIFVwZGF0ZSBpbnRlcm5hbCBtb2RlbCB3aXRoIG5ldyBtZXNzYWdlcyBmb3IgdGhpcyBmaWx0ZXJCYXJcblx0aWYgKGludGVybmFsTW9kZWwpIHtcblx0XHRjb25zdCB1cGRhdGVkQWxsTWVzc2FnZXMgPSB7IC4uLmFsbFVvbVZhbGlkYXRpb25NZXNzYWdlcyB9O1xuXHRcdHVwZGF0ZWRBbGxNZXNzYWdlc1tmaWx0ZXJCYXJJZF0gPSBmaWx0ZXJCYXJVb21WYWxpZGF0aW9uTWVzc2FnZXM7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi91b21WYWxpZGF0aW9uTWVzc2FnZXNcIiwgdXBkYXRlZEFsbE1lc3NhZ2VzKTtcblx0fVxuXHRpZiAobWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0TWVzc2FnaW5nLmFkZE1lc3NhZ2VzKG1lc3NhZ2VzKTtcblx0fVxufVxuXG5mdW5jdGlvbiBzZXRNZXNzYWdlRm9yVU9NRmllbGQoXG5cdHVvbUZpZWxkOiBNRENGaWx0ZXJGaWVsZCxcblx0bWVzc2FnZVR5cGU6IE1lc3NhZ2VUeXBlLFxuXHRtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1lc3NhZ2VzOiBNZXNzYWdlW10sXG5cdHVvbVZhbGlkYXRpb25NZXNzYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKTogTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGZpZWxkSWQgPSB1b21GaWVsZC5nZXRJZCgpO1xuXHQvLyBDaGVjayBpZiBtZXNzYWdlIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGZpZWxkXG5cdGlmICh1b21WYWxpZGF0aW9uTWVzc2FnZXNbZmllbGRJZF0pIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IG1zZyA9IG5ldyBNZXNzYWdlKHtcblx0XHRtZXNzYWdlOiBtZXNzYWdlLFxuXHRcdHByb2Nlc3NvcjogY29udHJvbE1lc3NhZ2VQcm9jZXNzb3IsXG5cdFx0dHlwZTogbWVzc2FnZVR5cGUsXG5cdFx0dGFyZ2V0OiBmaWVsZElkICsgXCIvY29uZGl0aW9uc1wiXG5cdH0pO1xuXHRtZXNzYWdlcy5wdXNoKG1zZyk7XG5cdHVvbVN0YXRlTWFwW2ZpZWxkSWRdID0geyBtZXNzYWdlVHlwZSB9O1xuXG5cdC8vIFN0b3JlIG1lc3NhZ2UgSUQgaW4gdW9tVmFsaWRhdGlvbk1lc3NhZ2VzXG5cdHVvbVZhbGlkYXRpb25NZXNzYWdlc1tmaWVsZElkXSA9IG1zZy5nZXRJZCgpO1xuXHRyZXR1cm4gbXNnO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBVT00tcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBmaWx0ZXIgY29udHJvbCdzIG1ldGFkYXRhLlxuICogUHJvY2Vzc2VzIGZpbHRlciBmaWVsZHMgdG8gaWRlbnRpZnkgbWVhc3VyZSBmaWVsZHMgd2l0aCBhc3NvY2lhdGVkIFVPTSBmaWVsZHNcbiAqIHRocm91Z2ggSVNPQ3VycmVuY3kgb3IgVW5pdCBhbm5vdGF0aW9ucy5cbiAqIEBwYXJhbSBlbnRpdHlUeXBlUGF0aCBQYXRoIHRvIHRoZSBlbnRpdHkgdHlwZSBjb250YWluaW5nIHRoZSBmaWx0ZXIgZmllbGRzXG4gKiBAcGFyYW0gZmlsdGVyQ29udHJvbCBUaGUgZmlsdGVyIGNvbnRyb2wgdG8gaW5zcGVjdCBmb3IgVU9NIHByb3BlcnRpZXNcbiAqIEBwYXJhbSBtZXRhTW9kZWwgT0RhdGFNZXRhTW9kZWxcbiAqIEByZXR1cm5zIEFycmF5IG9mIFVPTVByb3BlcnR5IG9iamVjdHMgY29udGFpbmluZyBtZWFzdXJlIGZpZWxkIGluZm9ybWF0aW9uXG4gKiBhbmQgdGhlaXIgYXNzb2NpYXRlZCBVT00gZmllbGQgZGV0YWlsc1xuICovXG5mdW5jdGlvbiBnZXRVT01Qcm9wZXJ0aWVzKFxuXHRlbnRpdHlUeXBlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRmaWx0ZXJDb250cm9sOiBJRmlsdGVyQ29udHJvbCxcblx0bWV0YU1vZGVsPzogT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWRcbik6IFVPTVByb3BlcnR5W10ge1xuXHRjb25zdCBpbmNsdWRlSGlkZGVuID0gZmlsdGVyQ29udHJvbC5pc0EoXCJzYXAudWkubWRjLmZpbHRlcmJhci52aC5GaWx0ZXJCYXJcIikgPyB0cnVlIDogdW5kZWZpbmVkO1xuXHRjb25zdCBmaWx0ZXJGaWVsZHMgPSBGaWx0ZXJVdGlscy5nZXRDb252ZXJ0ZWRGaWx0ZXJGaWVsZHMoZmlsdGVyQ29udHJvbCwgZW50aXR5VHlwZVBhdGgsIGluY2x1ZGVIaWRkZW4sIG1ldGFNb2RlbCk7XG5cdGNvbnN0IGNvbnZlcnRlckNvbnRleHQgPSBGaWx0ZXJVdGlscy5jcmVhdGVDb252ZXJ0ZXJDb250ZXh0KGZpbHRlckNvbnRyb2wsIGVudGl0eVR5cGVQYXRoLCBtZXRhTW9kZWwpO1xuXHRyZXR1cm4gZmlsdGVyRmllbGRzXG5cdFx0Lm1hcCgoZmlsdGVyRmllbGRJbmZvOiBGaWx0ZXJGaWVsZCkgPT4ge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvblBhdGggPSBmaWx0ZXJGaWVsZEluZm8uYW5ub3RhdGlvblBhdGg7XG5cdFx0XHRpZiAoYW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlBbm5vdGF0aW9ucyA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVkVHlwZXMoKS5yZXNvbHZlUGF0aDxQcm9wZXJ0eT4oYW5ub3RhdGlvblBhdGgpLnRhcmdldDtcblx0XHRcdFx0Y29uc3QgdW9tUHJvcGVydHkgPSBwcm9wZXJ0eUFubm90YXRpb25zPy5hbm5vdGF0aW9ucy5NZWFzdXJlcztcblx0XHRcdFx0aWYgKHVvbVByb3BlcnR5Py5JU09DdXJyZW5jeSB8fCB1b21Qcm9wZXJ0eT8uVW5pdCkge1xuXHRcdFx0XHRcdGxldCB1b21Qcm9wZXJ0eU9iamVjdDtcblx0XHRcdFx0XHRjb25zdCB1b21QYXRoID1cblx0XHRcdFx0XHRcdCh1b21Qcm9wZXJ0eSBhcyB7IElTT0N1cnJlbmN5PzogeyBwYXRoOiBzdHJpbmcgfSB9KT8uSVNPQ3VycmVuY3k/LnBhdGggfHxcblx0XHRcdFx0XHRcdCh1b21Qcm9wZXJ0eSBhcyB7IFVuaXQ/OiB7IHBhdGg6IHN0cmluZyB9IH0pPy5Vbml0Py5wYXRoO1xuXHRcdFx0XHRcdGlmICh1b21QYXRoKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB1b21MYWJlbCA9IGZpbHRlckZpZWxkcy5maW5kKChmZikgPT4gZmYua2V5ID09PSB1b21QYXRoKT8ubGFiZWw7XG5cdFx0XHRcdFx0XHR1b21Qcm9wZXJ0eU9iamVjdCA9IHtcblx0XHRcdFx0XHRcdFx0cGF0aDogdW9tUGF0aCxcblx0XHRcdFx0XHRcdFx0bGFiZWw6XG5cdFx0XHRcdFx0XHRcdFx0dW9tTGFiZWwgPz9cblx0XHRcdFx0XHRcdFx0XHQodW9tUHJvcGVydHk/LklTT0N1cnJlbmN5IGFzIHVua25vd24gYXMgUHJvcGVydHlQYXRoKT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uTGFiZWwgPz9cblx0XHRcdFx0XHRcdFx0XHQodW9tUHJvcGVydHk/LlVuaXQgYXMgdW5rbm93biBhcyBQcm9wZXJ0eVBhdGgpPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5MYWJlbFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdGZpZWxkOiB7IGZpZWxkS2V5OiBmaWx0ZXJGaWVsZEluZm8ua2V5ID8/IFwiXCIsIGxhYmVsOiBmaWx0ZXJGaWVsZEluZm8ubGFiZWwgPz8gXCJcIiB9LFxuXHRcdFx0XHRcdFx0dW9tUHJvcGVydHk6IHVvbVByb3BlcnR5T2JqZWN0XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSlcblx0XHQuZmlsdGVyKEJvb2xlYW4pIGFzIFVPTVByb3BlcnR5W107XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVPTVZhbGlkYXRpb25EZWxlZ2F0ZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztFQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUF1QkE7O0VBR0EsTUFBTUEscUJBQXFCLEdBQUc7SUFDN0I7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHdCQUF3QixFQUFFLGVBQUFBLENBQWdCQyxTQUFvQixFQUFFQyxZQUFvQixFQUFzQztNQUN6SCxNQUFNQyx3QkFBd0IsR0FBR0MsVUFBVSxDQUFDQyxjQUFjLENBQUNKLFNBQVMsQ0FBQ0ssY0FBYyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBVyxDQUFDO01BQ3pILE1BQU1DLFVBQVUsR0FBR0MsZ0JBQWdCLENBQUNQLFNBQVMsRUFBRUUsd0JBQTZDLENBQUM7TUFDN0YsTUFBTTtRQUFFTSxRQUFRO1FBQUVDO01BQVcsQ0FBQyxHQUFHLE1BQU1YLHFCQUFxQixDQUFDWSxvQkFBb0IsQ0FDaEZWLFNBQVMsRUFDVEEs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
|