@smartbit4all/ng-client 4.2.34 → 5.0.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/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs +12 -12
- package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs.map +1 -1
- package/fesm2022/smartbit4all-ng-client.mjs +521 -501
- package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
- package/lib/smart-client/smart-component-api-client.d.ts +2 -2
- package/lib/smart-component-layout/smart-component-layout.component.d.ts +1 -1
- package/lib/smart-dialog/smartdialog.module.d.ts +2 -1
- package/lib/smart-grid/smart-grid.component.d.ts +1 -1
- package/lib/smart-grid/smart-grid.module.d.ts +21 -19
- package/lib/smart-map/abstract-map.d.ts +1 -1
- package/lib/smart-ng-client.module.d.ts +4 -3
- package/lib/view-context/smart-view-context.module.d.ts +42 -43
- package/package.json +12 -14
- package/smartbit4all-ng-client-5.0.1.tgz +0 -0
- package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +0 -17
- package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +0 -35
- package/esm2022/lib/component-factory-service/projects.mjs +0 -6
- package/esm2022/lib/session/api/api/api.mjs +0 -4
- package/esm2022/lib/session/api/api/session.service.mjs +0 -306
- package/esm2022/lib/session/api/configuration.mjs +0 -91
- package/esm2022/lib/session/api/encoder.mjs +0 -19
- package/esm2022/lib/session/api/index.mjs +0 -3
- package/esm2022/lib/session/api/model/accountInfo.mjs +0 -13
- package/esm2022/lib/session/api/model/apiError.mjs +0 -13
- package/esm2022/lib/session/api/model/authenticationProviderData.mjs +0 -13
- package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +0 -2
- package/esm2022/lib/session/api/model/models.mjs +0 -9
- package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +0 -13
- package/esm2022/lib/session/api/model/session.mjs +0 -2
- package/esm2022/lib/session/api/model/sessionInfoData.mjs +0 -2
- package/esm2022/lib/session/api/model/userActivityLog.mjs +0 -13
- package/esm2022/lib/session/api/param.mjs +0 -2
- package/esm2022/lib/session/api/variables.mjs +0 -9
- package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +0 -225
- package/esm2022/lib/session/projects.mjs +0 -10
- package/esm2022/lib/session/smart-error-catching.interceptor.mjs +0 -95
- package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +0 -46
- package/esm2022/lib/session/smart-session-handler.service.mjs +0 -6
- package/esm2022/lib/session/smart-session.module.mjs +0 -58
- package/esm2022/lib/session/smart-session.service.mjs +0 -230
- package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +0 -35
- package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +0 -58
- package/esm2022/lib/shared/projects.mjs +0 -4
- package/esm2022/lib/shared/shared.module.mjs +0 -19
- package/esm2022/lib/shared/smart-tooltip.directive.mjs +0 -58
- package/esm2022/lib/shared/smarttable.date-pipe.mjs +0 -43
- package/esm2022/lib/smart-client/projects.mjs +0 -5
- package/esm2022/lib/smart-client/smart-authentication.service.mjs +0 -21
- package/esm2022/lib/smart-client/smart-component-api-client.mjs +0 -786
- package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +0 -81
- package/esm2022/lib/smart-client/smart.component.mjs +0 -84
- package/esm2022/lib/smart-client/smart.service.mjs +0 -75
- package/esm2022/lib/smart-component-layout/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +0 -133
- package/esm2022/lib/smart-component-layout/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-component-layout/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-component-layout/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-component-layout/api/index.mjs +0 -7
- package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +0 -18
- package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +0 -20
- package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +0 -17
- package/esm2022/lib/smart-component-layout/api/model/models.mjs +0 -6
- package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/param.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/variables.mjs +0 -9
- package/esm2022/lib/smart-component-layout/projects.mjs +0 -8
- package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +0 -111
- package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +0 -307
- package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +0 -45
- package/esm2022/lib/smart-dialog/projects.mjs +0 -8
- package/esm2022/lib/smart-dialog/smartdialog.component.mjs +0 -54
- package/esm2022/lib/smart-dialog/smartdialog.model.mjs +0 -16
- package/esm2022/lib/smart-dialog/smartdialog.module.mjs +0 -46
- package/esm2022/lib/smart-dialog/smartdialog.service.mjs +0 -90
- package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +0 -96
- package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +0 -12
- package/esm2022/lib/smart-expandable-section/projects.mjs +0 -8
- package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +0 -53
- package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +0 -14
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +0 -17
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +0 -8
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +0 -20
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +0 -28
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +0 -32
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +0 -18
- package/esm2022/lib/smart-filter/api/filter/model/model.mjs +0 -16
- package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +0 -13
- package/esm2022/lib/smart-filter/api/value/model/value.mjs +0 -13
- package/esm2022/lib/smart-filter/projects.mjs +0 -9
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +0 -14
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +0 -165
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +0 -45
- package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +0 -36
- package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +0 -31
- package/esm2022/lib/smart-filter/smart-filter.model.mjs +0 -13
- package/esm2022/lib/smart-filter/smart-filter.module.mjs +0 -33
- package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +0 -198
- package/esm2022/lib/smart-filter-editor/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-filter-editor/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +0 -17
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +0 -13
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +0 -8
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +0 -7
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +0 -20
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +0 -28
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +0 -32
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +0 -19
- package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +0 -17
- package/esm2022/lib/smart-filter-editor/api/param.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/variables.mjs +0 -9
- package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +0 -15
- package/esm2022/lib/smart-filter-editor/project.mjs +0 -8
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +0 -73
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +0 -40
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +0 -273
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +0 -69
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +0 -47
- package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +0 -24
- package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +0 -57
- package/esm2022/lib/smart-form/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-form/api/api/default.service.mjs +0 -133
- package/esm2022/lib/smart-form/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-form/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-form/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-form/api/index.mjs +0 -7
- package/esm2022/lib/smart-form/api/model/models.mjs +0 -12
- package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +0 -7
- package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +0 -22
- package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +0 -17
- package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +0 -46
- package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +0 -18
- package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +0 -20
- package/esm2022/lib/smart-form/api/param.mjs +0 -2
- package/esm2022/lib/smart-form/api/variables.mjs +0 -9
- package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +0 -20
- package/esm2022/lib/smart-form/projects.mjs +0 -15
- package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +0 -613
- package/esm2022/lib/smart-form/services/smartform.service.mjs +0 -673
- package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +0 -15
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +0 -78
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +0 -2
- package/esm2022/lib/smart-form/smartform.component.mjs +0 -185
- package/esm2022/lib/smart-form/smartform.form-model.mjs +0 -2
- package/esm2022/lib/smart-form/smartform.model.mjs +0 -38
- package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +0 -84
- package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +0 -36
- package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +0 -79
- package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +0 -874
- package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +0 -78
- package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +0 -31
- package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +0 -4
- package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +0 -451
- package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +0 -40
- package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +0 -91
- package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +0 -19
- package/esm2022/lib/smart-grid/api/grid-api/index.mjs +0 -7
- package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +0 -17
- package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +0 -20
- package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +0 -13
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +0 -18
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +0 -17
- package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +0 -8
- package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +0 -14
- package/esm2022/lib/smart-grid/api/grid-api/param.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +0 -9
- package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +0 -20
- package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +0 -66
- package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +0 -182
- package/esm2022/lib/smart-grid/models/model.mjs +0 -29
- package/esm2022/lib/smart-grid/projects.mjs +0 -9
- package/esm2022/lib/smart-grid/smart-grid.component.mjs +0 -934
- package/esm2022/lib/smart-grid/smart-grid.module.mjs +0 -100
- package/esm2022/lib/smart-grid/smart-grid.service.mjs +0 -80
- package/esm2022/lib/smart-icon/projects.mjs +0 -7
- package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +0 -53
- package/esm2022/lib/smart-icon/smart-icon.module.mjs +0 -22
- package/esm2022/lib/smart-icon/smart-icon.service.mjs +0 -74
- package/esm2022/lib/smart-map/abstract-map.mjs +0 -112
- package/esm2022/lib/smart-map/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +0 -312
- package/esm2022/lib/smart-map/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-map/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-map/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-map/api/index.mjs +0 -7
- package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +0 -13
- package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +0 -17
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +0 -19
- package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +0 -18
- package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +0 -17
- package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +0 -18
- package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +0 -17
- package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/models.mjs +0 -21
- package/esm2022/lib/smart-map/api/param.mjs +0 -2
- package/esm2022/lib/smart-map/api/variables.mjs +0 -9
- package/esm2022/lib/smart-map/api-default/api-default.mjs +0 -2
- package/esm2022/lib/smart-map/impl/google-map.mjs +0 -221
- package/esm2022/lib/smart-map/impl/leaflet-map.mjs +0 -264
- package/esm2022/lib/smart-map/projects.mjs +0 -9
- package/esm2022/lib/smart-map/smart-map.component.mjs +0 -218
- package/esm2022/lib/smart-map/smart-map.module.mjs +0 -22
- package/esm2022/lib/smart-map/smart-map.types.mjs +0 -2
- package/esm2022/lib/smart-navbar/projects.mjs +0 -8
- package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +0 -61
- package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +0 -6
- package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +0 -63
- package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +0 -14
- package/esm2022/lib/smart-navigation/projects.mjs +0 -6
- package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +0 -2
- package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +0 -18
- package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +0 -56
- package/esm2022/lib/smart-ng-client.module.mjs +0 -130
- package/esm2022/lib/smart-ng-client.service.mjs +0 -19
- package/esm2022/lib/smart-subject/projects.mjs +0 -5
- package/esm2022/lib/smart-subject/smart-subject.mjs +0 -21
- package/esm2022/lib/smart-tab-group/projects.mjs +0 -9
- package/esm2022/lib/smart-tab-group/smart-tab-group.component.mjs +0 -43
- package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +0 -25
- package/esm2022/lib/smart-tab-group/smart-tab-group.service.mjs +0 -14
- package/esm2022/lib/smart-tab-group/tab-content/tab-content.component.mjs +0 -31
- package/esm2022/lib/smart-tab-group/tab-group-simplified/tab-group.component.mjs +0 -66
- package/esm2022/lib/smart-tab-group/tabTile.model.mjs +0 -2
- package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +0 -43
- package/esm2022/lib/smart-table/components/loading/loading.component.mjs +0 -15
- package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +0 -52
- package/esm2022/lib/smart-table/projects.mjs +0 -8
- package/esm2022/lib/smart-table/smarttable.component.mjs +0 -98
- package/esm2022/lib/smart-table/smarttable.model.mjs +0 -169
- package/esm2022/lib/smart-table/smarttable.module.mjs +0 -105
- package/esm2022/lib/smart-table/smarttable.service.mjs +0 -14
- package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +0 -39
- package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +0 -23
- package/esm2022/lib/smart-table/tables/table.mjs +0 -520
- package/esm2022/lib/smart-tree/projects.mjs +0 -9
- package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +0 -288
- package/esm2022/lib/smart-tree/smarttree.component.mjs +0 -181
- package/esm2022/lib/smart-tree/smarttree.model.mjs +0 -7
- package/esm2022/lib/smart-tree/smarttree.module.mjs +0 -60
- package/esm2022/lib/smart-tree/smarttree.node.model.mjs +0 -6
- package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +0 -2
- package/esm2022/lib/smart-tree/smarttree.service.mjs +0 -47
- package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +0 -1190
- package/esm2022/lib/smart-tree/tree-api/configuration.mjs +0 -91
- package/esm2022/lib/smart-tree/tree-api/encoder.mjs +0 -19
- package/esm2022/lib/smart-tree/tree-api/param.mjs +0 -2
- package/esm2022/lib/smart-tree/tree-api/variables.mjs +0 -9
- package/esm2022/lib/smart-validation/named-validator.service.mjs +0 -115
- package/esm2022/lib/smart-validation/projects.mjs +0 -4
- package/esm2022/lib/smart-validation/smart-validation.module.mjs +0 -24
- package/esm2022/lib/smart-validation/smart-validation.types.mjs +0 -4
- package/esm2022/lib/view-context/api/api/api.mjs +0 -4
- package/esm2022/lib/view-context/api/api/view.service.mjs +0 -903
- package/esm2022/lib/view-context/api/api.module.mjs +0 -40
- package/esm2022/lib/view-context/api/configuration.mjs +0 -91
- package/esm2022/lib/view-context/api/encoder.mjs +0 -19
- package/esm2022/lib/view-context/api/index.mjs +0 -7
- package/esm2022/lib/view-context/api/model/clipboardData.mjs +0 -13
- package/esm2022/lib/view-context/api/model/closeResult.mjs +0 -18
- package/esm2022/lib/view-context/api/model/componentConstraint.mjs +0 -2
- package/esm2022/lib/view-context/api/model/componentModel.mjs +0 -2
- package/esm2022/lib/view-context/api/model/componentModelChange.mjs +0 -13
- package/esm2022/lib/view-context/api/model/dataChange.mjs +0 -2
- package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +0 -2
- package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +0 -21
- package/esm2022/lib/view-context/api/model/deviceInfo.mjs +0 -13
- package/esm2022/lib/view-context/api/model/downloadedFile.mjs +0 -13
- package/esm2022/lib/view-context/api/model/iconPosition.mjs +0 -20
- package/esm2022/lib/view-context/api/model/imageResource.mjs +0 -8
- package/esm2022/lib/view-context/api/model/link.mjs +0 -20
- package/esm2022/lib/view-context/api/model/messageData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/messageOption.mjs +0 -2
- package/esm2022/lib/view-context/api/model/messageOptionType.mjs +0 -18
- package/esm2022/lib/view-context/api/model/messageResult.mjs +0 -2
- package/esm2022/lib/view-context/api/model/messageTextType.mjs +0 -17
- package/esm2022/lib/view-context/api/model/messageType.mjs +0 -19
- package/esm2022/lib/view-context/api/model/models.mjs +0 -54
- package/esm2022/lib/view-context/api/model/namedValidator.mjs +0 -19
- package/esm2022/lib/view-context/api/model/openPendingData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +0 -2
- package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +0 -2
- package/esm2022/lib/view-context/api/model/serverRequestType.mjs +0 -24
- package/esm2022/lib/view-context/api/model/smartLinkData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/statisticRecord.mjs +0 -13
- package/esm2022/lib/view-context/api/model/style.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiAction.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +0 -27
- package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +0 -20
- package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +0 -21
- package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +0 -22
- package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uploadedFile.mjs +0 -13
- package/esm2022/lib/view-context/api/model/valueSet.mjs +0 -2
- package/esm2022/lib/view-context/api/model/view.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewApiError.mjs +0 -13
- package/esm2022/lib/view-context/api/model/viewConstraint.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContext.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContextChange.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContextData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +0 -18
- package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +0 -13
- package/esm2022/lib/view-context/api/model/viewState.mjs +0 -22
- package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewType.mjs +0 -18
- package/esm2022/lib/view-context/api/param.mjs +0 -2
- package/esm2022/lib/view-context/api/variables.mjs +0 -9
- package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +0 -20
- package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +0 -74
- package/esm2022/lib/view-context/projects.mjs +0 -19
- package/esm2022/lib/view-context/property-definition-data.mjs +0 -2
- package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +0 -30
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +0 -63
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +0 -55
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +0 -60
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +0 -97
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +0 -60
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +0 -132
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +0 -59
- package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +0 -192
- package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +0 -183
- package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +0 -7
- package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +0 -211
- package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +0 -83
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +0 -29
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +0 -75
- package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +0 -39
- package/esm2022/lib/view-context/smart-view-context.model.mjs +0 -2
- package/esm2022/lib/view-context/smart-view-context.module.mjs +0 -327
- package/esm2022/lib/view-context/smart-view-context.service.mjs +0 -696
- package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +0 -33
- package/esm2022/lib/view-context/utility/componentLibrary.mjs +0 -9
- package/esm2022/lib/view-context/utility/smart-object-utility.mjs +0 -44
- package/esm2022/lib/view-context/utility/smart-style-utility.mjs +0 -68
- package/esm2022/lib/view-context/value-api/api/api.mjs +0 -4
- package/esm2022/lib/view-context/value-api/api/value.service.mjs +0 -138
- package/esm2022/lib/view-context/value-api/api.module.mjs +0 -40
- package/esm2022/lib/view-context/value-api/configuration.mjs +0 -91
- package/esm2022/lib/view-context/value-api/encoder.mjs +0 -19
- package/esm2022/lib/view-context/value-api/index.mjs +0 -7
- package/esm2022/lib/view-context/value-api/model/genericValue.mjs +0 -13
- package/esm2022/lib/view-context/value-api/model/models.mjs +0 -11
- package/esm2022/lib/view-context/value-api/model/value.mjs +0 -13
- package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +0 -13
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +0 -24
- package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +0 -19
- package/esm2022/lib/view-context/value-api/param.mjs +0 -2
- package/esm2022/lib/view-context/value-api/variables.mjs +0 -9
- package/esm2022/projects.mjs +0 -28
- package/esm2022/smartbit4all-ng-client.mjs +0 -5
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartData.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartOrientation.mjs +0 -16
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartType.mjs +0 -21
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartValue.mjs +0 -13
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/models.mjs +0 -7
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.mjs +0 -16
- package/esm2022/src/lib/smart-chart/smart-chart/default-chart-options.provider.mjs +0 -233
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.component.mjs +0 -285
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.module.mjs +0 -39
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api.module.mjs +0 -40
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/configuration.mjs +0 -91
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/index.mjs +0 -7
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramColor.mjs +0 -13
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataContainer.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataItem.mjs +0 -13
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSet.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.mjs +0 -13
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDescriptor.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramShape.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/drawTime.mjs +0 -18
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/labelText.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/models.mjs +0 -11
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/param.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/variables.mjs +0 -9
- package/esm2022/src/lib/smart-chart/smart-chart-projects.mjs +0 -9
- package/esm2022/src/lib/smart-chart/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -5
- package/esm2022/src/lib/smart-chart/view-context/utility/componentLibrary.mjs +0 -9
- package/smartbit4all-ng-client-4.2.34.tgz +0 -0
|
@@ -1,673 +0,0 @@
|
|
|
1
|
-
import { Injectable, Optional } from "@angular/core";
|
|
2
|
-
import { UntypedFormControl, UntypedFormGroup, Validators, } from "@angular/forms";
|
|
3
|
-
import { SelectionDefinitionTypeEnum, SmartFormWidgetType, } from "../api";
|
|
4
|
-
import { ComponentLibrary } from "../../view-context/utility/componentLibrary";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../../smart-validation/named-validator.service";
|
|
7
|
-
export class SmartFormService {
|
|
8
|
-
constructor(validatorProvider) {
|
|
9
|
-
this.validatorProvider = validatorProvider;
|
|
10
|
-
this.emptyKey = "e#m%p@t*y";
|
|
11
|
-
this.componentLibrary = ComponentLibrary;
|
|
12
|
-
this.group = {};
|
|
13
|
-
this.regexRegexChars = new RegExp(/[\.\-\[\]\/\{\}\(\)\+\^\$\\\|]/g);
|
|
14
|
-
this.regexAsteriskInTheMiddle = new RegExp(/([^\*])\*([^\*])/g);
|
|
15
|
-
this.regexAsteriskInTheEnd = new RegExp(/([^\*])\*$/g);
|
|
16
|
-
this.regexAsteriskInTheBeginning = new RegExp(/^\*([^\*])/g);
|
|
17
|
-
this.regexAsteriskOnly = new RegExp(/^\*$/g);
|
|
18
|
-
this.regexDoubleAsteriskWithDot = new RegExp(/\*\*\\\./g);
|
|
19
|
-
this.regexDoubleAsterisk = new RegExp(/\*\*/g);
|
|
20
|
-
this.regexQuestionMark = new RegExp(/\?/g);
|
|
21
|
-
this.regexByPattern = new Map();
|
|
22
|
-
}
|
|
23
|
-
getSmartFormWidgetByKey(key) {
|
|
24
|
-
return this.findSmartFormWidgetByKey(this.smartForm?.widgets, key);
|
|
25
|
-
}
|
|
26
|
-
collectKeysFromSmartForm(widgets, keys) {
|
|
27
|
-
widgets.forEach((w) => {
|
|
28
|
-
if (w.type !== SmartFormWidgetType.CONTAINER &&
|
|
29
|
-
w.type !== SmartFormWidgetType.LABEL &&
|
|
30
|
-
w.type !== SmartFormWidgetType.CHECK_BOX_2 &&
|
|
31
|
-
w.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
32
|
-
keys.push(w.key);
|
|
33
|
-
}
|
|
34
|
-
if (w.type === SmartFormWidgetType.TEXT_FIELD_CHIPS ||
|
|
35
|
-
w.type === SmartFormWidgetType.SELECT ||
|
|
36
|
-
w.type === SmartFormWidgetType.SELECT_MULTIPLE ||
|
|
37
|
-
w.type === SmartFormWidgetType.CHECK_BOX ||
|
|
38
|
-
w.type === SmartFormWidgetType.RADIO_BUTTON ||
|
|
39
|
-
w.type === SmartFormWidgetType.CONTAINER) {
|
|
40
|
-
if (w.valueList?.length) {
|
|
41
|
-
keys = this.collectKeysFromSmartForm(w.valueList, keys);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
else if (w.type === SmartFormWidgetType.CHECK_BOX_2) {
|
|
45
|
-
if (w.valueList?.length) {
|
|
46
|
-
let childrenKeys = this.collectKeysFromSmartForm(w.valueList, []);
|
|
47
|
-
childrenKeys = childrenKeys
|
|
48
|
-
.filter((key) => key !== w.key)
|
|
49
|
-
.flatMap((key) => `${w.key}.${key}`);
|
|
50
|
-
keys.push(...childrenKeys);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
return keys;
|
|
55
|
-
}
|
|
56
|
-
findSmartFormWidgetByKey(widgets, key) {
|
|
57
|
-
let widgetFoundByKey;
|
|
58
|
-
for (let w of widgets) {
|
|
59
|
-
if (w.key === key) {
|
|
60
|
-
return w;
|
|
61
|
-
}
|
|
62
|
-
else if (w.type === SmartFormWidgetType.CONTAINER &&
|
|
63
|
-
w.valueList?.length) {
|
|
64
|
-
widgetFoundByKey = this.findSmartFormWidgetByKey(w.valueList, key);
|
|
65
|
-
if (widgetFoundByKey) {
|
|
66
|
-
return widgetFoundByKey;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return widgetFoundByKey;
|
|
71
|
-
}
|
|
72
|
-
getValueDeeply(model, key) {
|
|
73
|
-
let splittedKey = key.split(".");
|
|
74
|
-
let value;
|
|
75
|
-
splittedKey.forEach((k) => {
|
|
76
|
-
if (!value) {
|
|
77
|
-
value = model[k];
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
if (value[k] === undefined ||
|
|
81
|
-
value[k] === null ||
|
|
82
|
-
(!value && typeof value[k] !== "boolean")) {
|
|
83
|
-
value = "";
|
|
84
|
-
return value;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
value = value[k];
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
return value;
|
|
92
|
-
}
|
|
93
|
-
setValueDeeply(model, key, value) {
|
|
94
|
-
let splittedKeys = key.split(".");
|
|
95
|
-
let deepModel = [model];
|
|
96
|
-
let tempModel;
|
|
97
|
-
for (let index = 0; index < splittedKeys.length; index++) {
|
|
98
|
-
tempModel = deepModel[index];
|
|
99
|
-
if (typeof tempModel[splittedKeys[index]] !== "string" &&
|
|
100
|
-
typeof tempModel[splittedKeys[index]] !== "boolean" &&
|
|
101
|
-
typeof tempModel[splittedKeys[index]] !== "number" &&
|
|
102
|
-
tempModel[splittedKeys[index]] !== undefined) {
|
|
103
|
-
deepModel.push(tempModel[splittedKeys[index]]);
|
|
104
|
-
}
|
|
105
|
-
if (index === splittedKeys.length - 1) {
|
|
106
|
-
let oldValue = tempModel[splittedKeys[index]];
|
|
107
|
-
// if (value === '' && (oldValue === null || oldValue === undefined) then don't change value.
|
|
108
|
-
if (value !== "" || (oldValue !== null && oldValue !== undefined)) {
|
|
109
|
-
tempModel[splittedKeys[index]] = value;
|
|
110
|
-
}
|
|
111
|
-
break;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
getPropertyNamesDeeply(element) {
|
|
116
|
-
let properties = Object.keys(element);
|
|
117
|
-
properties.forEach((property) => {
|
|
118
|
-
if (typeof element[property] === "string" ||
|
|
119
|
-
typeof element[property] === "boolean" ||
|
|
120
|
-
typeof element[property] === "number" ||
|
|
121
|
-
element[property] === undefined ||
|
|
122
|
-
element[property] === null ||
|
|
123
|
-
!element[property] ||
|
|
124
|
-
!element) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
let innerProperties = this.getPropertyNamesDeeply(element[property]);
|
|
128
|
-
innerProperties = innerProperties.map((innerProperty) => `${property}.${innerProperty}`);
|
|
129
|
-
properties.push(...innerProperties);
|
|
130
|
-
});
|
|
131
|
-
return properties;
|
|
132
|
-
}
|
|
133
|
-
setValuesFromModel(widgets, compLib) {
|
|
134
|
-
const smartForm = this.smartForm;
|
|
135
|
-
const data = smartForm.componentModel?.data;
|
|
136
|
-
if (!data) {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
if (!widgets) {
|
|
140
|
-
widgets = smartForm.widgets;
|
|
141
|
-
}
|
|
142
|
-
const keys = this.collectKeysFromSmartForm(widgets, []);
|
|
143
|
-
let widget;
|
|
144
|
-
for (const key of this.getPropertyNamesDeeply(data)) {
|
|
145
|
-
if (keys.includes(key)) {
|
|
146
|
-
widget = this.findSmartFormWidgetByKey(widgets, key);
|
|
147
|
-
if (widget) {
|
|
148
|
-
let value = this.getValueDeeply(data, key);
|
|
149
|
-
if (typeof value === "boolean" &&
|
|
150
|
-
widget.type !== SmartFormWidgetType.TOGGLE) {
|
|
151
|
-
value = `${value}`;
|
|
152
|
-
}
|
|
153
|
-
if (compLib === this.componentLibrary.PRIMENG) {
|
|
154
|
-
if (widget.type === SmartFormWidgetType.DATE_PICKER) {
|
|
155
|
-
if (value) {
|
|
156
|
-
widget.value = new Date(value);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
if (widget.type !== SmartFormWidgetType.INDICATOR &&
|
|
161
|
-
widget.type !== SmartFormWidgetType.LABEL &&
|
|
162
|
-
widget.type !== SmartFormWidgetType.CONTAINER &&
|
|
163
|
-
widget.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
164
|
-
widget.type !== SmartFormWidgetType.DIVIDER &&
|
|
165
|
-
widget.type !== SmartFormWidgetType.BUTTON &&
|
|
166
|
-
widget.type !== SmartFormWidgetType.COMPONENT &&
|
|
167
|
-
widget.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
168
|
-
widget.value = value;
|
|
169
|
-
if (widget.showLabel === undefined && smartForm.showLabel) {
|
|
170
|
-
widget.showLabel = true;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
this.copyFromValueSetToValuesList(widget, smartForm.componentModel.valueSets);
|
|
174
|
-
if (widget &&
|
|
175
|
-
widget.type === SmartFormWidgetType.CHECK_BOX &&
|
|
176
|
-
widget.valueList.length === 1) {
|
|
177
|
-
widget.valueList = widget.valueList.map((item) => {
|
|
178
|
-
let value = this.getValueDeeply(data, key);
|
|
179
|
-
item.value = value;
|
|
180
|
-
return item;
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
// In case of CheckBox2
|
|
186
|
-
let splittedKeys = key.split(".");
|
|
187
|
-
splittedKeys.splice(splittedKeys.length - 1, 1);
|
|
188
|
-
widget = this.findSmartFormWidgetByKey(widgets, splittedKeys.join("."));
|
|
189
|
-
if (widget && widget.type === SmartFormWidgetType.CHECK_BOX_2) {
|
|
190
|
-
this.copyFromValueSetToValuesList(widget, smartForm.componentModel.valueSets);
|
|
191
|
-
if (widget.valueList) {
|
|
192
|
-
widget.valueList = widget.valueList.map((item) => {
|
|
193
|
-
let value = this.getValueDeeply(data, `${widget?.key}.${item.key}`);
|
|
194
|
-
item.value = value;
|
|
195
|
-
return item;
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
copyFromValueSetToValuesList(widget, valueSets) {
|
|
204
|
-
if (widget.type === SmartFormWidgetType.SELECT ||
|
|
205
|
-
widget.type === SmartFormWidgetType.SELECT_MULTIPLE ||
|
|
206
|
-
widget.type === SmartFormWidgetType.RADIO_BUTTON ||
|
|
207
|
-
widget.type === SmartFormWidgetType.CHECK_BOX ||
|
|
208
|
-
widget.type === SmartFormWidgetType.CHECK_BOX_2 ||
|
|
209
|
-
widget.type === SmartFormWidgetType.TEXT_FIELD) {
|
|
210
|
-
if (widget.selection && valueSets) {
|
|
211
|
-
let valueSet = valueSets[widget.selection.valueSetName];
|
|
212
|
-
if (!valueSet) {
|
|
213
|
-
console.warn("valueSet not found", widget.selection.valueSetName);
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
let valueSetData = valueSet.valueSetData;
|
|
217
|
-
let values = valueSetData.values;
|
|
218
|
-
let displayProperty = widget.selection?.displayProperty ??
|
|
219
|
-
"displayValue";
|
|
220
|
-
// check is displayProperty exists, fallback for common display properties
|
|
221
|
-
if (!this.checkProperty(values, displayProperty)) {
|
|
222
|
-
displayProperty = "name"; // GenericValue.name
|
|
223
|
-
if (!this.checkProperty(values, displayProperty)) {
|
|
224
|
-
displayProperty = "displayValue"; // Value.displayValue
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
if (widget.selection.type === SelectionDefinitionTypeEnum.PROPERTY &&
|
|
228
|
-
!widget.selection.mapping.length) {
|
|
229
|
-
let keyProperty = valueSetData.keyProperty ?? "objectUri";
|
|
230
|
-
if (!this.checkProperty(values, keyProperty)) {
|
|
231
|
-
keyProperty = "uri"; // GenericValue.uri
|
|
232
|
-
if (!this.checkProperty(values, keyProperty)) {
|
|
233
|
-
keyProperty = "objectUri"; // Value.objectUri
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
widget.valueList = values.map((value) => {
|
|
237
|
-
return {
|
|
238
|
-
key: value[keyProperty],
|
|
239
|
-
label: value[displayProperty],
|
|
240
|
-
type: SmartFormWidgetType.ITEM,
|
|
241
|
-
value: value[keyProperty],
|
|
242
|
-
};
|
|
243
|
-
});
|
|
244
|
-
this.addEmptyItemToValueList(widget, widget.selection.emptyLabel);
|
|
245
|
-
}
|
|
246
|
-
else if (widget.selection.type === SelectionDefinitionTypeEnum.OBJECT &&
|
|
247
|
-
!widget.selection.mapping.length) {
|
|
248
|
-
widget.valueList = values.map((value, index) => {
|
|
249
|
-
return {
|
|
250
|
-
key: `${index}`,
|
|
251
|
-
label: value[displayProperty],
|
|
252
|
-
type: SmartFormWidgetType.ITEM,
|
|
253
|
-
value: value,
|
|
254
|
-
};
|
|
255
|
-
});
|
|
256
|
-
this.addEmptyItemToValueList(widget);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
checkProperty(values, property) {
|
|
263
|
-
if (!values?.length) {
|
|
264
|
-
// no sample data, assume existance
|
|
265
|
-
return true;
|
|
266
|
-
}
|
|
267
|
-
return property in values[0];
|
|
268
|
-
}
|
|
269
|
-
toFormGroup(compLib) {
|
|
270
|
-
this.createFormControls(this.smartForm.widgets, compLib);
|
|
271
|
-
if (this.formGroup) {
|
|
272
|
-
this.formGroup.controls = this.group;
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
this.formGroup = new UntypedFormGroup(this.group);
|
|
276
|
-
}
|
|
277
|
-
if (this.smartForm.validators && this.smartForm.validators.length) {
|
|
278
|
-
this.formGroup.setValidators(this.smartForm.validators.map((validator) => {
|
|
279
|
-
return validator.validator;
|
|
280
|
-
}));
|
|
281
|
-
}
|
|
282
|
-
return this.formGroup;
|
|
283
|
-
}
|
|
284
|
-
createFormControls(widgets, compLib, parentKey) {
|
|
285
|
-
widgets.map((widget) => {
|
|
286
|
-
if (widget.type !== SmartFormWidgetType.INDICATOR &&
|
|
287
|
-
widget.type !== SmartFormWidgetType.LABEL &&
|
|
288
|
-
widget.type !== SmartFormWidgetType.CONTAINER &&
|
|
289
|
-
widget.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
290
|
-
widget.type !== SmartFormWidgetType.IMAGE &&
|
|
291
|
-
widget.type !== SmartFormWidgetType.SVG &&
|
|
292
|
-
widget.type !== SmartFormWidgetType.DIVIDER &&
|
|
293
|
-
widget.type !== SmartFormWidgetType.BUTTON &&
|
|
294
|
-
widget.type !== SmartFormWidgetType.CHECK_BOX_2 &&
|
|
295
|
-
widget.type !== SmartFormWidgetType.ITEM &&
|
|
296
|
-
widget.type !== SmartFormWidgetType.COMPONENT &&
|
|
297
|
-
widget.type !== SmartFormWidgetType.MATRIX &&
|
|
298
|
-
widget.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
299
|
-
if (compLib === this.componentLibrary.PRIMENG) {
|
|
300
|
-
if (widget.type === SmartFormWidgetType.DATE_PICKER) {
|
|
301
|
-
if (widget.value) {
|
|
302
|
-
widget.value = new Date(widget.value);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
this.createFormControl(`${widget.key}`, widget.value, widget.isDisabled, widget.validators);
|
|
307
|
-
}
|
|
308
|
-
if (widget.type === SmartFormWidgetType.MATRIX) {
|
|
309
|
-
if (widget.isMultiple) {
|
|
310
|
-
let dataKeys = Object.keys(widget.value.data);
|
|
311
|
-
let itemKeys = widget.value.columns.map((value) => value.code);
|
|
312
|
-
dataKeys.forEach((key) => {
|
|
313
|
-
itemKeys.forEach((item) => {
|
|
314
|
-
this.createFormControl(`${widget.key}.data.${key}.${item}`, widget.value.data[key][item], undefined, // TODO really we don't pass widget.isDisabled?
|
|
315
|
-
widget.validators);
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
Object.keys(widget.value.data).map((key) => {
|
|
321
|
-
this.createFormControl(`${widget.key}.${key}`, widget.isMultiple
|
|
322
|
-
? widget.value.data[key]
|
|
323
|
-
: widget.value.data[key][0], widget.isDisabled, widget.validators);
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
if (widget.type === SmartFormWidgetType.ITEM && parentKey) {
|
|
328
|
-
this.createFormControl(`${parentKey}.${widget.key}`, widget.value, widget.isDisabled, undefined);
|
|
329
|
-
}
|
|
330
|
-
if (widget.type === SmartFormWidgetType.CONTAINER &&
|
|
331
|
-
widget.valueList?.length) {
|
|
332
|
-
this.createFormControls(widget.valueList, compLib);
|
|
333
|
-
}
|
|
334
|
-
if (widget.type === SmartFormWidgetType.CHECK_BOX_2 &&
|
|
335
|
-
widget.valueList?.length) {
|
|
336
|
-
this.createFormControls(widget.valueList, compLib, widget.key);
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
isValidatorInList(validator, list) {
|
|
341
|
-
return (list !== undefined && list.length > 0 && list.some((v) => v === validator));
|
|
342
|
-
}
|
|
343
|
-
createFormControl(key, value, isDisabled, validators) {
|
|
344
|
-
let formControl = this.group[key];
|
|
345
|
-
if (!formControl) {
|
|
346
|
-
formControl = new UntypedFormControl();
|
|
347
|
-
this.group[key] = formControl;
|
|
348
|
-
}
|
|
349
|
-
formControl.setValue(value || "", { emitEvent: false });
|
|
350
|
-
formControl.clearValidators();
|
|
351
|
-
validators?.map((validator) => {
|
|
352
|
-
formControl.addValidators(validator.validator);
|
|
353
|
-
});
|
|
354
|
-
if (isDisabled !== undefined) {
|
|
355
|
-
if (isDisabled) {
|
|
356
|
-
formControl.disable({ emitEvent: false });
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
formControl.enable({ emitEvent: false });
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
return formControl;
|
|
363
|
-
}
|
|
364
|
-
copyValueFromFormToWidgetBeans(widgets, group) {
|
|
365
|
-
widgets.forEach((widget) => {
|
|
366
|
-
if (widget.type === SmartFormWidgetType.CONTAINER &&
|
|
367
|
-
widget.valueList?.length) {
|
|
368
|
-
this.copyValueFromFormToWidgetBeans(widget.valueList, group);
|
|
369
|
-
}
|
|
370
|
-
else if (widget.type === SmartFormWidgetType.MATRIX) {
|
|
371
|
-
if (widget.isMultiple) {
|
|
372
|
-
let dataKeys = Object.keys(widget.value.data);
|
|
373
|
-
let itemKeys = widget.value.columns.map((value) => value.code);
|
|
374
|
-
dataKeys.forEach((key) => {
|
|
375
|
-
itemKeys.forEach((item) => {
|
|
376
|
-
widget.value.data[key][item] = [
|
|
377
|
-
group.controls[`${widget.key}.data.${key}.${item}`].value,
|
|
378
|
-
];
|
|
379
|
-
});
|
|
380
|
-
});
|
|
381
|
-
let datakeys = Object.keys(widget.value.data);
|
|
382
|
-
//Map checkbox key - boolean value to string key array
|
|
383
|
-
let valueKeys = widget.value.columns.map((value) => value.code);
|
|
384
|
-
datakeys.forEach((key) => {
|
|
385
|
-
let newData = [];
|
|
386
|
-
valueKeys.forEach((valueKey) => {
|
|
387
|
-
let value = widget.value.data[key][valueKey];
|
|
388
|
-
if (value[0]) {
|
|
389
|
-
newData.push(valueKey);
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
widget.value.data[key] = newData;
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
else {
|
|
396
|
-
Object.keys(widget.value.data).map((key) => {
|
|
397
|
-
widget.value.data[key] = [
|
|
398
|
-
group.controls[`${widget.key}.${key}`].value,
|
|
399
|
-
];
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
else if (widget.type !== SmartFormWidgetType.INDICATOR &&
|
|
404
|
-
widget.type !== SmartFormWidgetType.LABEL &&
|
|
405
|
-
widget.type !== SmartFormWidgetType.CONTAINER &&
|
|
406
|
-
widget.type !== SmartFormWidgetType.IMAGE &&
|
|
407
|
-
widget.type !== SmartFormWidgetType.SVG &&
|
|
408
|
-
widget.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
409
|
-
widget.type !== SmartFormWidgetType.BUTTON &&
|
|
410
|
-
widget.type !== SmartFormWidgetType.DIVIDER &&
|
|
411
|
-
widget.type !== SmartFormWidgetType.CHECK_BOX_2 &&
|
|
412
|
-
widget.type !== SmartFormWidgetType.COMPONENT &&
|
|
413
|
-
widget.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
414
|
-
widget.value = group.controls[widget.key].value;
|
|
415
|
-
}
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
toSmartForm(group) {
|
|
419
|
-
if (this.smartForm) {
|
|
420
|
-
this.copyValueFromFormToWidgetBeans(this.smartForm.widgets, group);
|
|
421
|
-
const data = this.smartForm.componentModel?.data;
|
|
422
|
-
if (data) {
|
|
423
|
-
for (const key of this.getPropertyNamesDeeply(data)) {
|
|
424
|
-
if (group.controls[key]) {
|
|
425
|
-
this.setValueDeeply(data, key, group.controls[key].value);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
return this.smartForm;
|
|
431
|
-
}
|
|
432
|
-
getModel(group) {
|
|
433
|
-
if (!this.smartForm?.componentModel) {
|
|
434
|
-
return {};
|
|
435
|
-
}
|
|
436
|
-
let originalModel = this.smartForm.componentModel.data;
|
|
437
|
-
let copyOfModel = { ...originalModel };
|
|
438
|
-
// copyOfModel should be the current model
|
|
439
|
-
this.smartForm.componentModel.data = copyOfModel;
|
|
440
|
-
// copy value from FormGroup into model
|
|
441
|
-
this.toSmartForm(group);
|
|
442
|
-
let newModel = this.smartForm.componentModel.data;
|
|
443
|
-
this.smartForm.componentModel.data = originalModel;
|
|
444
|
-
return newModel;
|
|
445
|
-
}
|
|
446
|
-
applyComponentConstraints(widgets, constraints) {
|
|
447
|
-
widgets.forEach((widget) => {
|
|
448
|
-
let widgetConstraints = constraints?.filter(
|
|
449
|
-
//(constraint: SmartFormComponentConstraint) => constraint.dataName === widget.key
|
|
450
|
-
(constraint) => this.antPathMatcher(constraint.dataName, widget.key));
|
|
451
|
-
if (widgetConstraints && widgetConstraints.length) {
|
|
452
|
-
widgetConstraints.forEach((constraint) => {
|
|
453
|
-
if (constraint.visible === undefined) {
|
|
454
|
-
if (widget.isVisible === undefined) {
|
|
455
|
-
widget.isVisible = true;
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
else {
|
|
459
|
-
widget.isVisible = constraint.visible;
|
|
460
|
-
}
|
|
461
|
-
if (widget.type !== SmartFormWidgetType.INDICATOR &&
|
|
462
|
-
widget.type !== SmartFormWidgetType.LABEL &&
|
|
463
|
-
widget.type !== SmartFormWidgetType.CONTAINER &&
|
|
464
|
-
widget.type !== SmartFormWidgetType.IMAGE &&
|
|
465
|
-
widget.type !== SmartFormWidgetType.SVG &&
|
|
466
|
-
widget.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
467
|
-
widget.type !== SmartFormWidgetType.DIVIDER &&
|
|
468
|
-
widget.type !== SmartFormWidgetType.BUTTON &&
|
|
469
|
-
widget.type !== SmartFormWidgetType.COMPONENT &&
|
|
470
|
-
widget.type !== SmartFormWidgetType.YOUTUBE_PLAYER) {
|
|
471
|
-
let validators = widget.validators ?? [];
|
|
472
|
-
let requiredIndex = validators.findIndex((v) => v.validator === Validators.required);
|
|
473
|
-
let wasMandatory = requiredIndex >= 0;
|
|
474
|
-
let tobeMandatory = false;
|
|
475
|
-
if (constraint.mandatory === undefined) {
|
|
476
|
-
// not specified on server, use client state
|
|
477
|
-
// if widget is not visible, client should default to not mandatory
|
|
478
|
-
tobeMandatory = widget.isVisible && wasMandatory;
|
|
479
|
-
}
|
|
480
|
-
else {
|
|
481
|
-
tobeMandatory = constraint.mandatory;
|
|
482
|
-
}
|
|
483
|
-
if (!wasMandatory && tobeMandatory) {
|
|
484
|
-
// add required validator
|
|
485
|
-
widget.validators = [
|
|
486
|
-
...validators,
|
|
487
|
-
{
|
|
488
|
-
validator: Validators.required,
|
|
489
|
-
isCustom: false,
|
|
490
|
-
errorMessage: "",
|
|
491
|
-
name: "required",
|
|
492
|
-
},
|
|
493
|
-
];
|
|
494
|
-
// remove empty item
|
|
495
|
-
this.removeEmptyItemFromValueList(widget);
|
|
496
|
-
}
|
|
497
|
-
if (wasMandatory && !tobeMandatory) {
|
|
498
|
-
// remove required validator
|
|
499
|
-
widget.validators?.splice(requiredIndex, 1);
|
|
500
|
-
// add empty item
|
|
501
|
-
let emptyLabel = "";
|
|
502
|
-
if ("selection" in widget) {
|
|
503
|
-
emptyLabel = widget.selection?.emptyLabel ?? "";
|
|
504
|
-
}
|
|
505
|
-
this.addEmptyItemToValueList(widget, emptyLabel);
|
|
506
|
-
}
|
|
507
|
-
if (constraint.enabled === undefined ||
|
|
508
|
-
constraint.enabled === null) {
|
|
509
|
-
if (widget.isDisabled === undefined) {
|
|
510
|
-
widget.isDisabled = false;
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
else {
|
|
514
|
-
widget.isDisabled = !constraint.enabled;
|
|
515
|
-
}
|
|
516
|
-
this.validatorProvider?.applyConstraint(widget, constraint);
|
|
517
|
-
}
|
|
518
|
-
});
|
|
519
|
-
}
|
|
520
|
-
if (widget.type === SmartFormWidgetType.CONTAINER &&
|
|
521
|
-
widget.valueList &&
|
|
522
|
-
widget.valueList.length) {
|
|
523
|
-
this.applyComponentConstraints(widget.valueList, constraints);
|
|
524
|
-
}
|
|
525
|
-
});
|
|
526
|
-
}
|
|
527
|
-
antPathMatcher(pattern, path) {
|
|
528
|
-
if (!pattern || !path) {
|
|
529
|
-
// empty pattern or path -> not evaluated, true or false?
|
|
530
|
-
return false;
|
|
531
|
-
}
|
|
532
|
-
let regex = this.regexByPattern.get(pattern);
|
|
533
|
-
if (regex === undefined) {
|
|
534
|
-
// escape regex characters except for ?, *, **
|
|
535
|
-
let regexPattern = pattern.replace(this.regexRegexChars, "\\$&");
|
|
536
|
-
// replace ant-style wildcards with regex equivalents
|
|
537
|
-
// replace * with a pattern that matches any character except for '.'
|
|
538
|
-
regexPattern = regexPattern.replace(this.regexAsteriskInTheMiddle, "$1[^.]*$2"); // not* * not*
|
|
539
|
-
regexPattern = regexPattern.replace(this.regexAsteriskInTheEnd, "$1[^.]*"); // not* * EOL
|
|
540
|
-
regexPattern = regexPattern.replace(this.regexAsteriskInTheBeginning, "[^.]*$1"); // BOL * not*
|
|
541
|
-
regexPattern = regexPattern.replace(this.regexAsteriskOnly, "[^.]*"); // BOL * EOL
|
|
542
|
-
// replace ** with a pattern that matches any character including '.'
|
|
543
|
-
regexPattern = regexPattern.replace(this.regexDoubleAsteriskWithDot, ".*"); // **.
|
|
544
|
-
regexPattern = regexPattern.replace(this.regexDoubleAsterisk, ".*"); // **
|
|
545
|
-
// replace ? with a single character matcher
|
|
546
|
-
regexPattern = regexPattern.replace(this.regexQuestionMark, ".");
|
|
547
|
-
// create a RegExp object
|
|
548
|
-
regex = new RegExp("^" + regexPattern + "$");
|
|
549
|
-
this.regexByPattern.set(pattern, regex);
|
|
550
|
-
}
|
|
551
|
-
// test the path against the generated regex
|
|
552
|
-
return regex.test(path);
|
|
553
|
-
}
|
|
554
|
-
applyConstraints(widgets) {
|
|
555
|
-
if (this.smartForm.componentModel?.constraints &&
|
|
556
|
-
this.smartForm.componentModel?.constraints.length) {
|
|
557
|
-
if (!widgets) {
|
|
558
|
-
widgets = this.smartForm.widgets;
|
|
559
|
-
}
|
|
560
|
-
this.applyComponentConstraints(widgets, this.smartForm.componentModel?.constraints);
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
addEmptyItemToValueList(widget, emptyLabel) {
|
|
564
|
-
if (widget.type == SmartFormWidgetType.SELECT) {
|
|
565
|
-
const containsEmptyKey = widget.valueList.some((v) => v.key === this.emptyKey);
|
|
566
|
-
if (!containsEmptyKey) {
|
|
567
|
-
widget.valueList?.unshift({
|
|
568
|
-
key: this.emptyKey,
|
|
569
|
-
label: emptyLabel ?? "",
|
|
570
|
-
type: SmartFormWidgetType.ITEM,
|
|
571
|
-
value: "", // this should be undefined, but FormControl cannot be null, from v14 it will
|
|
572
|
-
});
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
removeEmptyItemFromValueList(widget) {
|
|
577
|
-
if ("valueList" in widget) {
|
|
578
|
-
if (widget.valueList?.length) {
|
|
579
|
-
let firstItem = widget.valueList[0];
|
|
580
|
-
if (firstItem?.key === this.emptyKey) {
|
|
581
|
-
widget.valueList.shift();
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
filterWidgetsByVisibility(widgets) {
|
|
587
|
-
return widgets.filter((widget) => widget.isVisible === undefined ? true : widget.isVisible);
|
|
588
|
-
}
|
|
589
|
-
async getTranslationOfKey(key) {
|
|
590
|
-
return await this.smartForm.translateService.get(key).toPromise();
|
|
591
|
-
}
|
|
592
|
-
async translateWidgets(widgets) {
|
|
593
|
-
Promise.all(widgets.map(async (widget) => {
|
|
594
|
-
if (widget.type === SmartFormWidgetType.YOUTUBE_PLAYER)
|
|
595
|
-
return;
|
|
596
|
-
if (widget.type !== SmartFormWidgetType.CONTAINER) {
|
|
597
|
-
if (!widget.originalLabel) {
|
|
598
|
-
widget.originalLabel = `${widget.label}`;
|
|
599
|
-
}
|
|
600
|
-
// Label
|
|
601
|
-
widget.label = await this.getTranslationOfKey(widget.originalLabel);
|
|
602
|
-
// Placeholder
|
|
603
|
-
if ((widget.type === SmartFormWidgetType.TEXT_FIELD ||
|
|
604
|
-
widget.type === SmartFormWidgetType.TEXT_FIELD_NUMBER ||
|
|
605
|
-
widget.type === SmartFormWidgetType.TEXT_FIELD_CHIPS ||
|
|
606
|
-
widget.type === SmartFormWidgetType.RICH_TEXT ||
|
|
607
|
-
widget.type === SmartFormWidgetType.TEXT_BOX) &&
|
|
608
|
-
widget.placeholder) {
|
|
609
|
-
if (!widget.originalPlaceholder) {
|
|
610
|
-
widget.originalPlaceholder = `${widget.placeholder}`;
|
|
611
|
-
}
|
|
612
|
-
widget.placeholder = await this.getTranslationOfKey(widget.originalPlaceholder);
|
|
613
|
-
}
|
|
614
|
-
// Validators
|
|
615
|
-
if (widget.type !== SmartFormWidgetType.INDICATOR &&
|
|
616
|
-
widget.type !== SmartFormWidgetType.LABEL &&
|
|
617
|
-
widget.type !== SmartFormWidgetType.IMAGE &&
|
|
618
|
-
widget.type !== SmartFormWidgetType.SVG &&
|
|
619
|
-
widget.type !== SmartFormWidgetType.FILE_UPLOADER &&
|
|
620
|
-
widget.type !== SmartFormWidgetType.DIVIDER &&
|
|
621
|
-
widget.type !== SmartFormWidgetType.BUTTON &&
|
|
622
|
-
widget.type !== SmartFormWidgetType.COMPONENT &&
|
|
623
|
-
widget.validators) {
|
|
624
|
-
widget.validators = await Promise.all(widget.validators.map(async (validator) => {
|
|
625
|
-
if (!validator.originalErrorMessage) {
|
|
626
|
-
validator.originalErrorMessage = `${validator.errorMessage}`;
|
|
627
|
-
}
|
|
628
|
-
validator.errorMessage = await this.getTranslationOfKey(validator.originalErrorMessage);
|
|
629
|
-
return validator;
|
|
630
|
-
}));
|
|
631
|
-
}
|
|
632
|
-
// Indicator
|
|
633
|
-
if (widget.type === SmartFormWidgetType.INDICATOR &&
|
|
634
|
-
widget.indicator) {
|
|
635
|
-
if (!widget.indicator.originalIndicatorStatusLabels) {
|
|
636
|
-
widget.indicator.originalIndicatorStatusLabels =
|
|
637
|
-
widget.indicator.indicatorStatusLabels.map((label) => label);
|
|
638
|
-
}
|
|
639
|
-
widget.indicator.indicatorStatusLabels = await Promise.all(widget.indicator.indicatorStatusLabels.map(async (label, index) => await this.getTranslationOfKey(widget.indicator.originalIndicatorStatusLabels[index])));
|
|
640
|
-
}
|
|
641
|
-
if ((widget.type === SmartFormWidgetType.TEXT_FIELD_CHIPS ||
|
|
642
|
-
widget.type === SmartFormWidgetType.SELECT ||
|
|
643
|
-
widget.type === SmartFormWidgetType.SELECT_MULTIPLE ||
|
|
644
|
-
widget.type === SmartFormWidgetType.CHECK_BOX ||
|
|
645
|
-
widget.type === SmartFormWidgetType.CHECK_BOX_2 ||
|
|
646
|
-
widget.type === SmartFormWidgetType.RADIO_BUTTON) &&
|
|
647
|
-
widget.valueList) {
|
|
648
|
-
this.translateWidgetItems(widget.valueList);
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
else {
|
|
652
|
-
this.translateWidgets(widget.valueList);
|
|
653
|
-
}
|
|
654
|
-
}));
|
|
655
|
-
}
|
|
656
|
-
async translateWidgetItems(widgets) {
|
|
657
|
-
Promise.all(widgets.map(async (widget) => {
|
|
658
|
-
if (!widget.originalLabel) {
|
|
659
|
-
widget.originalLabel = `${widget.label}`;
|
|
660
|
-
}
|
|
661
|
-
// Label
|
|
662
|
-
widget.label = await this.getTranslationOfKey(widget.originalLabel);
|
|
663
|
-
}));
|
|
664
|
-
}
|
|
665
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartFormService, deps: [{ token: i1.NamedValidatorService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
666
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartFormService }); }
|
|
667
|
-
}
|
|
668
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartFormService, decorators: [{
|
|
669
|
-
type: Injectable
|
|
670
|
-
}], ctorParameters: () => [{ type: i1.NamedValidatorService, decorators: [{
|
|
671
|
-
type: Optional
|
|
672
|
-
}] }] });
|
|
673
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1mb3JtL3NlcnZpY2VzL3NtYXJ0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFFTCwyQkFBMkIsRUFDM0IsbUJBQW1CLEdBQ3BCLE1BQU0sUUFBUSxDQUFDO0FBY2hCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7QUFPL0UsTUFBTSxPQUFPLGdCQUFnQjtJQVMzQixZQUFnQyxpQkFBeUM7UUFBekMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF3QjtRQVJ4RCxhQUFRLEdBQVcsV0FBVyxDQUFDO1FBQ2hELHFCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3BDLFVBQUssR0FBUSxFQUFFLENBQUM7UUFncEJDLG9CQUFlLEdBQUcsSUFBSSxNQUFNLENBQzNDLGlDQUFpQyxDQUNsQyxDQUFDO1FBQ2UsNkJBQXdCLEdBQUcsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzRCwwQkFBcUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxnQ0FBMkIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RCxzQkFBaUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QywrQkFBMEIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCx3QkFBbUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENB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QUFLLG1CQUFtQixDQUFDLFdBQVc7b0JBQy9DLE1BQU0sQ0FBQyxJQUFJLEtBQUssbUJBQW1CLENBQUMsWUFBWSxDQUFDO29CQUNuRCxNQUFNLENBQUMsU0FBUyxFQUNoQixDQUFDO29CQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFVLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBMEI7UUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUF1QixFQUFFLEVBQUU7WUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxDQUFDLGFBQWEsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsU0FBUztZQUNULE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOytHQXgyQlUsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQVVJLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgVW50eXBlZEZvcm1Db250cm9sLFxyXG4gIFVudHlwZWRGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtcclxuICBTZWxlY3Rpb25EZWZpbml0aW9uLFxyXG4gIFNlbGVjdGlvbkRlZmluaXRpb25UeXBlRW51bSxcclxuICBTbWFydEZvcm1XaWRnZXRUeXBlLFxyXG59IGZyb20gXCIuLi9hcGlcIjtcclxuaW1wb3J0IHtcclxuICBTbWFydEZvcm1XaWRnZXQsXHJcbiAgU21hcnRJdGVtLFxyXG4gIFNtYXJ0SXRlbXMsXHJcbiAgU21hcnRTZWxlY3QsXHJcbiAgU21hcnRTb3J0YWJsZSxcclxufSBmcm9tIFwiLi4vc21hcnRmb3JtLmZvcm0tbW9kZWxcIjtcclxuaW1wb3J0IHtcclxuICBTbWFydEZvcm0sXHJcbiAgU21hcnRGb3JtQ29tcG9uZW50Q29uc3RyYWludCxcclxuICBTbWFydFZhbGlkYXRvcixcclxuICBWYWx1ZSxcclxufSBmcm9tIFwiLi4vc21hcnRmb3JtLm1vZGVsXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudExpYnJhcnkgfSBmcm9tIFwiLi4vLi4vdmlldy1jb250ZXh0L3V0aWxpdHkvY29tcG9uZW50TGlicmFyeVwiO1xyXG5pbXBvcnQge1xyXG4gIE5hbWVkVmFsaWRhdG9yU2VydmljZSxcclxuICBWYWxpZGF0ZWRXaWRnZXQsXHJcbn0gZnJvbSBcIi4uLy4uL3NtYXJ0LXZhbGlkYXRpb24vbmFtZWQtdmFsaWRhdG9yLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFNtYXJ0Rm9ybVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZW1wdHlLZXk6IHN0cmluZyA9IFwiZSNtJXBAdCp5XCI7XHJcbiAgY29tcG9uZW50TGlicmFyeSA9IENvbXBvbmVudExpYnJhcnk7XHJcbiAgZ3JvdXA6IGFueSA9IHt9O1xyXG5cclxuICBmb3JtR3JvdXA/OiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICBzbWFydEZvcm0/OiBTbWFydEZvcm07XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgdmFsaWRhdG9yUHJvdmlkZXI/OiBOYW1lZFZhbGlkYXRvclNlcnZpY2UpIHt9XHJcblxyXG4gIGdldFNtYXJ0Rm9ybVdpZGdldEJ5S2V5KGtleTogc3RyaW5nKTogU21hcnRGb3JtV2lkZ2V0PGFueT4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuZmluZFNtYXJ0Rm9ybVdpZGdldEJ5S2V5KHRoaXMuc21hcnRGb3JtPy53aWRnZXRzISwga2V5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29sbGVjdEtleXNGcm9tU21hcnRGb3JtKFxyXG4gICAgd2lkZ2V0czogU21hcnRGb3JtV2lkZ2V0PGFueT5bXSB8IFNtYXJ0SXRlbXM8YW55PltdLFxyXG4gICAga2V5czogc3RyaW5nW11cclxuICApOiBzdHJpbmdbXSB7XHJcbiAgICB3aWRnZXRzLmZvckVhY2goKHcpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHcudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgICB3LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgICB3LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzIgJiZcclxuICAgICAgICB3LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuWU9VVFVCRV9QTEFZRVJcclxuICAgICAgKSB7XHJcbiAgICAgICAga2V5cy5wdXNoKHcua2V5KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdy50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMgfHxcclxuICAgICAgICB3LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUIHx8XHJcbiAgICAgICAgdy50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRSB8fFxyXG4gICAgICAgIHcudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1ggfHxcclxuICAgICAgICB3LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUkFESU9fQlVUVE9OIHx8XHJcbiAgICAgICAgdy50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUlxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAody52YWx1ZUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAga2V5cyA9IHRoaXMuY29sbGVjdEtleXNGcm9tU21hcnRGb3JtKHcudmFsdWVMaXN0LCBrZXlzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAody50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWF8yKSB7XHJcbiAgICAgICAgaWYgKHcudmFsdWVMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgIGxldCBjaGlsZHJlbktleXMgPSB0aGlzLmNvbGxlY3RLZXlzRnJvbVNtYXJ0Rm9ybSh3LnZhbHVlTGlzdCwgW10pO1xyXG4gICAgICAgICAgY2hpbGRyZW5LZXlzID0gY2hpbGRyZW5LZXlzXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleTogc3RyaW5nKSA9PiBrZXkgIT09IHcua2V5KVxyXG4gICAgICAgICAgICAuZmxhdE1hcCgoa2V5OiBzdHJpbmcpID0+IGAke3cua2V5fS4ke2tleX1gKTtcclxuXHJcbiAgICAgICAgICBrZXlzLnB1c2goLi4uY2hpbGRyZW5LZXlzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBrZXlzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5kU21hcnRGb3JtV2lkZ2V0QnlLZXkoXHJcbiAgICB3aWRnZXRzOiBTbWFydEZvcm1XaWRnZXQ8YW55PltdLFxyXG4gICAga2V5OiBzdHJpbmdcclxuICApOiBTbWFydEZvcm1XaWRnZXQ8YW55PiB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgd2lkZ2V0Rm91bmRCeUtleTogU21hcnRGb3JtV2lkZ2V0PGFueT4gfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgZm9yIChsZXQgdyBvZiB3aWRnZXRzKSB7XHJcbiAgICAgIGlmICh3LmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHc7XHJcbiAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgdy50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICAgIHcudmFsdWVMaXN0Py5sZW5ndGhcclxuICAgICAgKSB7XHJcbiAgICAgICAgd2lkZ2V0Rm91bmRCeUtleSA9IHRoaXMuZmluZFNtYXJ0Rm9ybVdpZGdldEJ5S2V5KHcudmFsdWVMaXN0LCBrZXkpO1xyXG4gICAgICAgIGlmICh3aWRnZXRGb3VuZEJ5S2V5KSB7XHJcbiAgICAgICAgICByZXR1cm4gd2lkZ2V0Rm91bmRCeUtleTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB3aWRnZXRGb3VuZEJ5S2V5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWYWx1ZURlZXBseShtb2RlbDogYW55LCBrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICBsZXQgc3BsaXR0ZWRLZXkgPSBrZXkuc3BsaXQoXCIuXCIpO1xyXG4gICAgbGV0IHZhbHVlOiBhbnk7XHJcblxyXG4gICAgc3BsaXR0ZWRLZXkuZm9yRWFjaCgoazogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICB2YWx1ZSA9IG1vZGVsW2tdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHZhbHVlW2tdID09PSB1bmRlZmluZWQgfHxcclxuICAgICAgICAgIHZhbHVlW2tdID09PSBudWxsIHx8XHJcbiAgICAgICAgICAoIXZhbHVlICYmIHR5cGVvZiB2YWx1ZVtrXSAhPT0gXCJib29sZWFuXCIpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZhbHVlID0gdmFsdWVba107XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VmFsdWVEZWVwbHkobW9kZWw6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBzcGxpdHRlZEtleXMgPSBrZXkuc3BsaXQoXCIuXCIpO1xyXG5cclxuICAgIGxldCBkZWVwTW9kZWw6IGFueVtdID0gW21vZGVsXTtcclxuICAgIGxldCB0ZW1wTW9kZWw6IGFueTtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3BsaXR0ZWRLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICB0ZW1wTW9kZWwgPSBkZWVwTW9kZWxbaW5kZXhdO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09IFwic3RyaW5nXCIgJiZcclxuICAgICAgICB0eXBlb2YgdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dICE9PSBcImJvb2xlYW5cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09IFwibnVtYmVyXCIgJiZcclxuICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09IHVuZGVmaW5lZFxyXG4gICAgICApIHtcclxuICAgICAgICBkZWVwTW9kZWwucHVzaCh0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW5kZXggPT09IHNwbGl0dGVkS2V5cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgbGV0IG9sZFZhbHVlID0gdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dO1xyXG4gICAgICAgIC8vIGlmICh2YWx1ZSA9PT0gJycgJiYgKG9sZFZhbHVlID09PSBudWxsIHx8IG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHRoZW4gZG9uJ3QgY2hhbmdlIHZhbHVlLlxyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gXCJcIiB8fCAob2xkVmFsdWUgIT09IG51bGwgJiYgb2xkVmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UHJvcGVydHlOYW1lc0RlZXBseShlbGVtZW50OiBhbnkpOiBzdHJpbmdbXSB7XHJcbiAgICBsZXQgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGVsZW1lbnQpO1xyXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdHlwZW9mIGVsZW1lbnRbcHJvcGVydHldID09PSBcInN0cmluZ1wiIHx8XHJcbiAgICAgICAgdHlwZW9mIGVsZW1lbnRbcHJvcGVydHldID09PSBcImJvb2xlYW5cIiB8fFxyXG4gICAgICAgIHR5cGVvZiBlbGVtZW50W3Byb3BlcnR5XSA9PT0gXCJudW1iZXJcIiB8fFxyXG4gICAgICAgIGVsZW1lbnRbcHJvcGVydHldID09PSB1bmRlZmluZWQgfHxcclxuICAgICAgICBlbGVtZW50W3Byb3BlcnR5XSA9PT0gbnVsbCB8fFxyXG4gICAgICAgICFlbGVtZW50W3Byb3BlcnR5XSB8fFxyXG4gICAgICAgICFlbGVtZW50XHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgaW5uZXJQcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWVzRGVlcGx5KGVsZW1lbnRbcHJvcGVydHldKTtcclxuICAgICAgaW5uZXJQcm9wZXJ0aWVzID0gaW5uZXJQcm9wZXJ0aWVzLm1hcChcclxuICAgICAgICAoaW5uZXJQcm9wZXJ0eTogc3RyaW5nKSA9PiBgJHtwcm9wZXJ0eX0uJHtpbm5lclByb3BlcnR5fWBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHByb3BlcnRpZXMucHVzaCguLi5pbm5lclByb3BlcnRpZXMpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvcGVydGllcztcclxuICB9XHJcblxyXG4gIHNldFZhbHVlc0Zyb21Nb2RlbChcclxuICAgIHdpZGdldHM/OiBTbWFydEZvcm1XaWRnZXQ8YW55PltdLFxyXG4gICAgY29tcExpYj86IENvbXBvbmVudExpYnJhcnlcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IHNtYXJ0Rm9ybSA9IHRoaXMuc21hcnRGb3JtITtcclxuICAgIGNvbnN0IGRhdGEgPSBzbWFydEZvcm0uY29tcG9uZW50TW9kZWw/LmRhdGE7XHJcbiAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghd2lkZ2V0cykge1xyXG4gICAgICB3aWRnZXRzID0gc21hcnRGb3JtLndpZGdldHM7XHJcbiAgICB9XHJcbiAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IHRoaXMuY29sbGVjdEtleXNGcm9tU21hcnRGb3JtKHdpZGdldHMsIFtdKTtcclxuXHJcbiAgICBsZXQgd2lkZ2V0OiBTbWFydEZvcm1XaWRnZXQ8YW55PiB8IHVuZGVmaW5lZDtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuZ2V0UHJvcGVydHlOYW1lc0RlZXBseShkYXRhKSkge1xyXG4gICAgICBpZiAoa2V5cy5pbmNsdWRlcyhrZXkpKSB7XHJcbiAgICAgICAgd2lkZ2V0ID0gdGhpcy5maW5kU21hcnRGb3JtV2lkZ2V0QnlLZXkod2lkZ2V0cywga2V5KTtcclxuICAgICAgICBpZiAod2lkZ2V0KSB7XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmdldFZhbHVlRGVlcGx5KGRhdGEsIGtleSk7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVE9HR0xFXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBgJHt2YWx1ZX1gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgICAgICAgICAgIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1BJQ0tFUikge1xyXG4gICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgd2lkZ2V0LnZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHdpZGdldC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICBpZiAod2lkZ2V0LnNob3dMYWJlbCA9PT0gdW5kZWZpbmVkICYmIHNtYXJ0Rm9ybS5zaG93TGFiZWwpIHtcclxuICAgICAgICAgICAgICB3aWRnZXQuc2hvd0xhYmVsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuY29weUZyb21WYWx1ZVNldFRvVmFsdWVzTGlzdChcclxuICAgICAgICAgICAgd2lkZ2V0LFxyXG4gICAgICAgICAgICBzbWFydEZvcm0uY29tcG9uZW50TW9kZWwudmFsdWVTZXRzXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgd2lkZ2V0ICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWCAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudmFsdWVMaXN0Lmxlbmd0aCA9PT0gMVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHdpZGdldC52YWx1ZUxpc3QgPSB3aWRnZXQudmFsdWVMaXN0Lm1hcCgoaXRlbTogU21hcnRJdGVtPGFueT4pID0+IHtcclxuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmdldFZhbHVlRGVlcGx5KGRhdGEsIGtleSk7XHJcbiAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gSW4gY2FzZSBvZiBDaGVja0JveDJcclxuICAgICAgICAgIGxldCBzcGxpdHRlZEtleXMgPSBrZXkuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgICAgc3BsaXR0ZWRLZXlzLnNwbGljZShzcGxpdHRlZEtleXMubGVuZ3RoIC0gMSwgMSk7XHJcbiAgICAgICAgICB3aWRnZXQgPSB0aGlzLmZpbmRTbWFydEZvcm1XaWRnZXRCeUtleShcclxuICAgICAgICAgICAgd2lkZ2V0cyxcclxuICAgICAgICAgICAgc3BsaXR0ZWRLZXlzLmpvaW4oXCIuXCIpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHdpZGdldCAmJiB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMikge1xyXG4gICAgICAgICAgICB0aGlzLmNvcHlGcm9tVmFsdWVTZXRUb1ZhbHVlc0xpc3QoXHJcbiAgICAgICAgICAgICAgd2lkZ2V0LFxyXG4gICAgICAgICAgICAgIHNtYXJ0Rm9ybS5jb21wb25lbnRNb2RlbC52YWx1ZVNldHNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKHdpZGdldC52YWx1ZUxpc3QpIHtcclxuICAgICAgICAgICAgICB3aWRnZXQudmFsdWVMaXN0ID0gd2lkZ2V0LnZhbHVlTGlzdC5tYXAoXHJcbiAgICAgICAgICAgICAgICAoaXRlbTogU21hcnRJdGVtPGFueT4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZURlZXBseShcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgIGAke3dpZGdldD8ua2V5fS4ke2l0ZW0ua2V5fWBcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvcHlGcm9tVmFsdWVTZXRUb1ZhbHVlc0xpc3QoXHJcbiAgICB3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+LFxyXG4gICAgdmFsdWVTZXRzOiBhbnlcclxuICApIHtcclxuICAgIGlmIChcclxuICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUIHx8XHJcbiAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRSB8fFxyXG4gICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SQURJT19CVVRUT04gfHxcclxuICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YIHx8XHJcbiAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWF8yIHx8XHJcbiAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERcclxuICAgICkge1xyXG4gICAgICBpZiAod2lkZ2V0LnNlbGVjdGlvbiAmJiB2YWx1ZVNldHMpIHtcclxuICAgICAgICBsZXQgdmFsdWVTZXQgPSB2YWx1ZVNldHNbd2lkZ2V0LnNlbGVjdGlvbi52YWx1ZVNldE5hbWVdO1xyXG4gICAgICAgIGlmICghdmFsdWVTZXQpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihcInZhbHVlU2V0IG5vdCBmb3VuZFwiLCB3aWRnZXQuc2VsZWN0aW9uLnZhbHVlU2V0TmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCB2YWx1ZVNldERhdGEgPSB2YWx1ZVNldC52YWx1ZVNldERhdGE7XHJcbiAgICAgICAgICBsZXQgdmFsdWVzID0gdmFsdWVTZXREYXRhLnZhbHVlcztcclxuICAgICAgICAgIGxldCBkaXNwbGF5UHJvcGVydHkgPVxyXG4gICAgICAgICAgICAod2lkZ2V0IGFzIFNtYXJ0U2VsZWN0PGFueT4pLnNlbGVjdGlvbj8uZGlzcGxheVByb3BlcnR5ID8/XHJcbiAgICAgICAgICAgIFwiZGlzcGxheVZhbHVlXCI7XHJcbiAgICAgICAgICAvLyBjaGVjayBpcyBkaXNwbGF5UHJvcGVydHkgZXhpc3RzLCBmYWxsYmFjayBmb3IgY29tbW9uIGRpc3BsYXkgcHJvcGVydGllc1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNoZWNrUHJvcGVydHkodmFsdWVzLCBkaXNwbGF5UHJvcGVydHkpKSB7XHJcbiAgICAgICAgICAgIGRpc3BsYXlQcm9wZXJ0eSA9IFwibmFtZVwiOyAvLyBHZW5lcmljVmFsdWUubmFtZVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tQcm9wZXJ0eSh2YWx1ZXMsIGRpc3BsYXlQcm9wZXJ0eSkpIHtcclxuICAgICAgICAgICAgICBkaXNwbGF5UHJvcGVydHkgPSBcImRpc3BsYXlWYWx1ZVwiOyAvLyBWYWx1ZS5kaXNwbGF5VmFsdWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB3aWRnZXQuc2VsZWN0aW9uLnR5cGUgPT09IFNlbGVjdGlvbkRlZmluaXRpb25UeXBlRW51bS5QUk9QRVJUWSAmJlxyXG4gICAgICAgICAgICAhd2lkZ2V0LnNlbGVjdGlvbi5tYXBwaW5nLmxlbmd0aFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGxldCBrZXlQcm9wZXJ0eSA9IHZhbHVlU2V0RGF0YS5rZXlQcm9wZXJ0eSA/PyBcIm9iamVjdFVyaVwiO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tQcm9wZXJ0eSh2YWx1ZXMsIGtleVByb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgIGtleVByb3BlcnR5ID0gXCJ1cmlcIjsgLy8gR2VuZXJpY1ZhbHVlLnVyaVxyXG4gICAgICAgICAgICAgIGlmICghdGhpcy5jaGVja1Byb3BlcnR5KHZhbHVlcywga2V5UHJvcGVydHkpKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlQcm9wZXJ0eSA9IFwib2JqZWN0VXJpXCI7IC8vIFZhbHVlLm9iamVjdFVyaVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aWRnZXQudmFsdWVMaXN0ID0gdmFsdWVzLm1hcCgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IHZhbHVlW2tleVByb3BlcnR5XSxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiB2YWx1ZVtkaXNwbGF5UHJvcGVydHldLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlW2tleVByb3BlcnR5XSxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5hZGRFbXB0eUl0ZW1Ub1ZhbHVlTGlzdCh3aWRnZXQsIHdpZGdldC5zZWxlY3Rpb24uZW1wdHlMYWJlbCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICB3aWRnZXQuc2VsZWN0aW9uLnR5cGUgPT09IFNlbGVjdGlvbkRlZmluaXRpb25UeXBlRW51bS5PQkpFQ1QgJiZcclxuICAgICAgICAgICAgIXdpZGdldC5zZWxlY3Rpb24ubWFwcGluZy5sZW5ndGhcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB3aWRnZXQudmFsdWVMaXN0ID0gdmFsdWVzLm1hcCgodmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGAke2luZGV4fWAsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogdmFsdWVbZGlzcGxheVByb3BlcnR5XSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSVRFTSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5hZGRFbXB0eUl0ZW1Ub1ZhbHVlTGlzdCh3aWRnZXQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja1Byb3BlcnR5KHZhbHVlczogb2JqZWN0W10sIHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghdmFsdWVzPy5sZW5ndGgpIHtcclxuICAgICAgLy8gbm8gc2FtcGxlIGRhdGEsIGFzc3VtZSBleGlzdGFuY2VcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJvcGVydHkgaW4gdmFsdWVzWzBdO1xyXG4gIH1cclxuXHJcbiAgdG9Gb3JtR3JvdXAoY29tcExpYj86IENvbXBvbmVudExpYnJhcnkpOiBVbnR5cGVkRm9ybUdyb3VwIHtcclxuICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2xzKHRoaXMuc21hcnRGb3JtIS53aWRnZXRzLCBjb21wTGliISk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzID0gdGhpcy5ncm91cDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAodGhpcy5ncm91cCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc21hcnRGb3JtIS52YWxpZGF0b3JzICYmIHRoaXMuc21hcnRGb3JtIS52YWxpZGF0b3JzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmZvcm1Hcm91cC5zZXRWYWxpZGF0b3JzKFxyXG4gICAgICAgIHRoaXMuc21hcnRGb3JtIS52YWxpZGF0b3JzLm1hcCgodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0b3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXA7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVGb3JtQ29udHJvbHMoXHJcbiAgICB3aWRnZXRzOiBTbWFydEZvcm1XaWRnZXQ8YW55PltdIHwgU21hcnRJdGVtPGFueT5bXSxcclxuICAgIGNvbXBMaWI6IENvbXBvbmVudExpYnJhcnksXHJcbiAgICBwYXJlbnRLZXk/OiBzdHJpbmdcclxuICApOiB2b2lkIHtcclxuICAgIHdpZGdldHMubWFwKCh3aWRnZXQpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWF8yICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSVRFTSAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1BVFJJWCAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmIChjb21wTGliISA9PT0gdGhpcy5jb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcclxuICAgICAgICAgIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1BJQ0tFUikge1xyXG4gICAgICAgICAgICBpZiAod2lkZ2V0LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnZhbHVlID0gbmV3IERhdGUod2lkZ2V0LnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKFxyXG4gICAgICAgICAgYCR7d2lkZ2V0LmtleX1gLFxyXG4gICAgICAgICAgd2lkZ2V0LnZhbHVlLFxyXG4gICAgICAgICAgd2lkZ2V0LmlzRGlzYWJsZWQsXHJcbiAgICAgICAgICB3aWRnZXQudmFsaWRhdG9yc1xyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NQVRSSVgpIHtcclxuICAgICAgICBpZiAod2lkZ2V0LmlzTXVsdGlwbGUpIHtcclxuICAgICAgICAgIGxldCBkYXRhS2V5cyA9IE9iamVjdC5rZXlzKHdpZGdldC52YWx1ZS5kYXRhKTtcclxuICAgICAgICAgIGxldCBpdGVtS2V5cyA9IHdpZGdldC52YWx1ZS5jb2x1bW5zLm1hcCgodmFsdWU6IFZhbHVlKSA9PiB2YWx1ZS5jb2RlKTtcclxuICAgICAgICAgIGRhdGFLZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW1LZXlzLmZvckVhY2goKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgICBgJHt3aWRnZXQua2V5fS5kYXRhLiR7a2V5fS4ke2l0ZW19YCxcclxuICAgICAgICAgICAgICAgIHdpZGdldC52YWx1ZS5kYXRhW2tleV1baXRlbV0sXHJcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsIC8vIFRPRE8gcmVhbGx5IHdlIGRvbid0IHBhc3Mgd2lkZ2V0LmlzRGlzYWJsZWQ/XHJcbiAgICAgICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9yc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKHdpZGdldC52YWx1ZS5kYXRhKS5tYXAoKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgYCR7d2lkZ2V0LmtleX0uJHtrZXl9YCxcclxuICAgICAgICAgICAgICB3aWRnZXQuaXNNdWx0aXBsZVxyXG4gICAgICAgICAgICAgICAgPyB3aWRnZXQudmFsdWUuZGF0YVtrZXldXHJcbiAgICAgICAgICAgICAgICA6IHdpZGdldC52YWx1ZS5kYXRhW2tleV1bMF0sXHJcbiAgICAgICAgICAgICAgd2lkZ2V0LmlzRGlzYWJsZWQsXHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnZhbGlkYXRvcnNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSVRFTSAmJiBwYXJlbnRLZXkpIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9sKFxyXG4gICAgICAgICAgYCR7cGFyZW50S2V5fS4ke3dpZGdldC5rZXl9YCxcclxuICAgICAgICAgIHdpZGdldC52YWx1ZSxcclxuICAgICAgICAgIHdpZGdldC5pc0Rpc2FibGVkLFxyXG4gICAgICAgICAgdW5kZWZpbmVkXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICAgIHdpZGdldC52YWx1ZUxpc3Q/Lmxlbmd0aFxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvcm1Db250cm9scyh3aWRnZXQudmFsdWVMaXN0LCBjb21wTGliKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzIgJiZcclxuICAgICAgICB3aWRnZXQudmFsdWVMaXN0Py5sZW5ndGhcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHMod2lkZ2V0LnZhbHVlTGlzdCwgY29tcExpYiwgd2lkZ2V0LmtleSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaXNWYWxpZGF0b3JJbkxpc3QoXHJcbiAgICB2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yLFxyXG4gICAgbGlzdD86IFNtYXJ0VmFsaWRhdG9yW11cclxuICApOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGxpc3QgIT09IHVuZGVmaW5lZCAmJiBsaXN0Lmxlbmd0aCA+IDAgJiYgbGlzdC5zb21lKCh2KSA9PiB2ID09PSB2YWxpZGF0b3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGb3JtQ29udHJvbChcclxuICAgIGtleTogc3RyaW5nLFxyXG4gICAgdmFsdWU/OiBzdHJpbmcsXHJcbiAgICBpc0Rpc2FibGVkPzogYm9vbGVhbixcclxuICAgIHZhbGlkYXRvcnM/OiBTbWFydFZhbGlkYXRvcltdXHJcbiAgKTogVW50eXBlZEZvcm1Db250cm9sIHtcclxuICAgIGxldCBmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gdGhpcy5ncm91cFtrZXldO1xyXG4gICAgaWYgKCFmb3JtQ29udHJvbCkge1xyXG4gICAgICBmb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICAgICAgdGhpcy5ncm91cFtrZXldID0gZm9ybUNvbnRyb2w7XHJcbiAgICB9XHJcbiAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSB8fCBcIlwiLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICBmb3JtQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgIHZhbGlkYXRvcnM/Lm1hcCgodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4ge1xyXG4gICAgICBmb3JtQ29udHJvbC5hZGRWYWxpZGF0b3JzKHZhbGlkYXRvci52YWxpZGF0b3IpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGlzRGlzYWJsZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoaXNEaXNhYmxlZCkge1xyXG4gICAgICAgIGZvcm1Db250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvcm1Db250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmb3JtQ29udHJvbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29weVZhbHVlRnJvbUZvcm1Ub1dpZGdldEJlYW5zKFxyXG4gICAgd2lkZ2V0czogU21hcnRGb3JtV2lkZ2V0PGFueT5bXSxcclxuICAgIGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwXHJcbiAgKTogdm9pZCB7XHJcbiAgICB3aWRnZXRzLmZvckVhY2goKHdpZGdldCkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgICAgd2lkZ2V0LnZhbHVlTGlzdD8ubGVuZ3RoXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuY29weVZhbHVlRnJvbUZvcm1Ub1dpZGdldEJlYW5zKHdpZGdldC52YWx1ZUxpc3QsIGdyb3VwKTtcclxuICAgICAgfSBlbHNlIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NQVRSSVgpIHtcclxuICAgICAgICBpZiAod2lkZ2V0LmlzTXVsdGlwbGUpIHtcclxuICAgICAgICAgIGxldCBkYXRhS2V5cyA9IE9iamVjdC5rZXlzKHdpZGdldC52YWx1ZS5kYXRhKTtcclxuICAgICAgICAgIGxldCBpdGVtS2V5cyA9IHdpZGdldC52YWx1ZS5jb2x1bW5zLm1hcCgodmFsdWU6IFZhbHVlKSA9PiB2YWx1ZS5jb2RlKTtcclxuICAgICAgICAgIGRhdGFLZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW1LZXlzLmZvckVhY2goKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIHdpZGdldC52YWx1ZS5kYXRhW2tleV1baXRlbV0gPSBbXHJcbiAgICAgICAgICAgICAgICBncm91cC5jb250cm9sc1tgJHt3aWRnZXQua2V5fS5kYXRhLiR7a2V5fS4ke2l0ZW19YF0udmFsdWUsXHJcbiAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBsZXQgZGF0YWtleXMgPSBPYmplY3Qua2V5cyh3aWRnZXQudmFsdWUuZGF0YSk7XHJcbiAgICAgICAgICAvL01hcCBjaGVja2JveCBrZXkgLSBib29sZWFuIHZhbHVlIHRvIHN0cmluZyBrZXkgYXJyYXlcclxuICAgICAgICAgIGxldCB2YWx1ZUtleXMgPSB3aWRnZXQudmFsdWUuY29sdW1ucy5tYXAoXHJcbiAgICAgICAgICAgICh2YWx1ZTogVmFsdWUpID0+IHZhbHVlLmNvZGVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBkYXRha2V5cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBsZXQgbmV3RGF0YTogYW55W10gPSBbXTtcclxuICAgICAgICAgICAgdmFsdWVLZXlzLmZvckVhY2goKHZhbHVlS2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB3aWRnZXQudmFsdWUuZGF0YVtrZXldW3ZhbHVlS2V5XTtcclxuICAgICAgICAgICAgICBpZiAodmFsdWVbMF0pIHtcclxuICAgICAgICAgICAgICAgIG5ld0RhdGEucHVzaCh2YWx1ZUtleSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbHVlLmRhdGFba2V5XSA9IG5ld0RhdGE7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgT2JqZWN0LmtleXMod2lkZ2V0LnZhbHVlLmRhdGEpLm1hcCgoa2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbHVlLmRhdGFba2V5XSA9IFtcclxuICAgICAgICAgICAgICBncm91cC5jb250cm9sc1tgJHt3aWRnZXQua2V5fS4ke2tleX1gXS52YWx1ZSxcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXHJcbiAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcclxuICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMiAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICAgICkge1xyXG4gICAgICAgIHdpZGdldC52YWx1ZSA9IGdyb3VwLmNvbnRyb2xzW3dpZGdldC5rZXldLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvU21hcnRGb3JtKGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogU21hcnRGb3JtIHtcclxuICAgIGlmICh0aGlzLnNtYXJ0Rm9ybSkge1xyXG4gICAgICB0aGlzLmNvcHlWYWx1ZUZyb21Gb3JtVG9XaWRnZXRCZWFucyh0aGlzLnNtYXJ0Rm9ybS53aWRnZXRzLCBncm91cCk7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNtYXJ0Rm9ybS5jb21wb25lbnRNb2RlbD8uZGF0YTtcclxuICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmdldFByb3BlcnR5TmFtZXNEZWVwbHkoZGF0YSkpIHtcclxuICAgICAgICAgIGlmIChncm91cC5jb250cm9sc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVEZWVwbHkoZGF0YSwga2V5LCBncm91cC5jb250cm9sc1trZXldLnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnNtYXJ0Rm9ybSE7XHJcbiAgfVxyXG5cclxuICBnZXRNb2RlbChncm91cDogVW50eXBlZEZvcm1Hcm91cCk6IGFueSB7XHJcbiAgICBpZiAoIXRoaXMuc21hcnRGb3JtPy5jb21wb25lbnRNb2RlbCkge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgICBsZXQgb3JpZ2luYWxNb2RlbCA9IHRoaXMuc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsLmRhdGE7XHJcbiAgICBsZXQgY29weU9mTW9kZWwgPSB7IC4uLm9yaWdpbmFsTW9kZWwgfTtcclxuXHJcbiAgICAvLyBjb3B5T2ZNb2RlbCBzaG91bGQgYmUgdGhlIGN1cnJlbnQgbW9kZWxcclxuICAgIHRoaXMuc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsLmRhdGEgPSBjb3B5T2ZNb2RlbDtcclxuICAgIC8vIGNvcHkgdmFsdWUgZnJvbSBGb3JtR3JvdXAgaW50byBtb2RlbFxyXG4gICAgdGhpcy50b1NtYXJ0Rm9ybShncm91cCk7XHJcblxyXG4gICAgbGV0IG5ld01vZGVsID0gdGhpcy5zbWFydEZvcm0uY29tcG9uZW50TW9kZWwuZGF0YTtcclxuICAgIHRoaXMuc21hcnRGb3JtLmNvbXBvbmVudE1vZGVsLmRhdGEgPSBvcmlnaW5hbE1vZGVsO1xyXG5cclxuICAgIHJldHVybiBuZXdNb2RlbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlDb21wb25lbnRDb25zdHJhaW50cyhcclxuICAgIHdpZGdldHM6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10sXHJcbiAgICBjb25zdHJhaW50czogU21hcnRGb3JtQ29tcG9uZW50Q29uc3RyYWludFtdXHJcbiAgKSB7XHJcbiAgICB3aWRnZXRzLmZvckVhY2goKHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4pID0+IHtcclxuICAgICAgbGV0IHdpZGdldENvbnN0cmFpbnRzID0gY29uc3RyYWludHM/LmZpbHRlcihcclxuICAgICAgICAvLyhjb25zdHJhaW50OiBTbWFydEZvcm1Db21wb25lbnRDb25zdHJhaW50KSA9PiBjb25zdHJhaW50LmRhdGFOYW1lID09PSB3aWRnZXQua2V5XHJcbiAgICAgICAgKGNvbnN0cmFpbnQpID0+IHRoaXMuYW50UGF0aE1hdGNoZXIoY29uc3RyYWludC5kYXRhTmFtZSwgd2lkZ2V0LmtleSlcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICh3aWRnZXRDb25zdHJhaW50cyAmJiB3aWRnZXRDb25zdHJhaW50cy5sZW5ndGgpIHtcclxuICAgICAgICB3aWRnZXRDb25zdHJhaW50cy5mb3JFYWNoKChjb25zdHJhaW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29uc3RyYWludC52aXNpYmxlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHdpZGdldC5pc1Zpc2libGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIHdpZGdldC5pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB3aWRnZXQuaXNWaXNpYmxlID0gY29uc3RyYWludC52aXNpYmxlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWxpZGF0b3JzID0gd2lkZ2V0LnZhbGlkYXRvcnMgPz8gW107XHJcbiAgICAgICAgICAgIGxldCByZXF1aXJlZEluZGV4ID0gdmFsaWRhdG9ycy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgKHYpID0+IHYudmFsaWRhdG9yID09PSBWYWxpZGF0b3JzLnJlcXVpcmVkXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGxldCB3YXNNYW5kYXRvcnkgPSByZXF1aXJlZEluZGV4ID49IDA7XHJcbiAgICAgICAgICAgIGxldCB0b2JlTWFuZGF0b3J5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChjb25zdHJhaW50Lm1hbmRhdG9yeSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgLy8gbm90IHNwZWNpZmllZCBvbiBzZXJ2ZXIsIHVzZSBjbGllbnQgc3RhdGVcclxuICAgICAgICAgICAgICAvLyBpZiB3aWRnZXQgaXMgbm90IHZpc2libGUsIGNsaWVudCBzaG91bGQgZGVmYXVsdCB0byBub3QgbWFuZGF0b3J5XHJcbiAgICAgICAgICAgICAgdG9iZU1hbmRhdG9yeSA9IHdpZGdldC5pc1Zpc2libGUgJiYgd2FzTWFuZGF0b3J5O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRvYmVNYW5kYXRvcnkgPSBjb25zdHJhaW50Lm1hbmRhdG9yeTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXdhc01hbmRhdG9yeSAmJiB0b2JlTWFuZGF0b3J5KSB7XHJcbiAgICAgICAgICAgICAgLy8gYWRkIHJlcXVpcmVkIHZhbGlkYXRvclxyXG4gICAgICAgICAgICAgIHdpZGdldC52YWxpZGF0b3JzID0gW1xyXG4gICAgICAgICAgICAgICAgLi4udmFsaWRhdG9ycyxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICAgICAgICBpc0N1c3RvbTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogXCJcIixcclxuICAgICAgICAgICAgICAgICAgbmFtZTogXCJyZXF1aXJlZFwiLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgIC8vIHJlbW92ZSBlbXB0eSBpdGVtXHJcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbXB0eUl0ZW1Gcm9tVmFsdWVMaXN0KHdpZGdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHdhc01hbmRhdG9yeSAmJiAhdG9iZU1hbmRhdG9yeSkge1xyXG4gICAgICAgICAgICAgIC8vIHJlbW92ZSByZXF1aXJlZCB2YWxpZGF0b3JcclxuICAgICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9ycz8uc3BsaWNlKHJlcXVpcmVkSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgIC8vIGFkZCBlbXB0eSBpdGVtXHJcbiAgICAgICAgICAgICAgbGV0IGVtcHR5TGFiZWwgPSBcIlwiO1xyXG4gICAgICAgICAgICAgIGlmIChcInNlbGVjdGlvblwiIGluIHdpZGdldCkge1xyXG4gICAgICAgICAgICAgICAgZW1wdHlMYWJlbCA9IHdpZGdldC5zZWxlY3Rpb24/LmVtcHR5TGFiZWwgPz8gXCJcIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5hZGRFbXB0eUl0ZW1Ub1ZhbHVlTGlzdCh3aWRnZXQsIGVtcHR5TGFiZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICBjb25zdHJhaW50LmVuYWJsZWQgPT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgICAgICAgIGNvbnN0cmFpbnQuZW5hYmxlZCA9PT0gbnVsbFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpZiAod2lkZ2V0LmlzRGlzYWJsZWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgd2lkZ2V0LmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LmlzRGlzYWJsZWQgPSAhY29uc3RyYWludC5lbmFibGVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yUHJvdmlkZXI/LmFwcGx5Q29uc3RyYWludChcclxuICAgICAgICAgICAgICB3aWRnZXQgYXMgVmFsaWRhdGVkV2lkZ2V0PGFueT4sXHJcbiAgICAgICAgICAgICAgY29uc3RyYWludFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgICB3aWRnZXQudmFsdWVMaXN0ICYmXHJcbiAgICAgICAgd2lkZ2V0LnZhbHVlTGlzdC5sZW5ndGhcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseUNvbXBvbmVudENvbnN0cmFpbnRzKHdpZGdldC52YWx1ZUxpc3QsIGNvbnN0cmFpbnRzKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2V4UmVnZXhDaGFycyA9IG5ldyBSZWdFeHAoXHJcbiAgICAvW1xcLlxcLVxcW1xcXVxcL1xce1xcfVxcKFxcKVxcK1xcXlxcJFxcXFxcXHxdL2dcclxuICApO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnZXhBc3Rlcmlza0luVGhlTWlkZGxlID0gbmV3IFJlZ0V4cCgvKFteXFwqXSlcXCooW15cXCpdKS9nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2V4QXN0ZXJpc2tJblRoZUVuZCA9IG5ldyBSZWdFeHAoLyhbXlxcKl0pXFwqJC9nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2V4QXN0ZXJpc2tJblRoZUJlZ2lubmluZyA9IG5ldyBSZWdFeHAoL15cXCooW15cXCpdKS9nKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2V4QXN0ZXJpc2tPbmx5ID0gbmV3IFJlZ0V4cCgvXlxcKiQvZyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWdleERvdWJsZUFzdGVyaXNrV2l0aERvdCA9IG5ldyBSZWdFeHAoL1xcKlxcKlxcXFxcXC4vZyk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSByZWdleERvdWJsZUFzdGVyaXNrID0gbmV3IFJlZ0V4cCgvXFwqXFwqL2cpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnZXhRdWVzdGlvbk1hcmsgPSBuZXcgUmVnRXhwKC9cXD8vZyk7XHJcbiAgcHJpdmF0ZSByZWdleEJ5UGF0dGVybjogTWFwPHN0cmluZywgUmVnRXhwPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgYW50UGF0aE1hdGNoZXIocGF0dGVybj86IHN0cmluZywgcGF0aD86IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFwYXR0ZXJuIHx8ICFwYXRoKSB7XHJcbiAgICAgIC8vIGVtcHR5IHBhdHRlcm4gb3IgcGF0aCAtPiBub3QgZXZhbHVhdGVkLCB0cnVlIG9yIGZhbHNlP1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVnZXggPSB0aGlzLnJlZ2V4QnlQYXR0ZXJuLmdldChwYXR0ZXJuKTtcclxuICAgIGlmIChyZWdleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIGVzY2FwZSByZWdleCBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgPywgKiwgKipcclxuICAgICAgbGV0IHJlZ2V4UGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4UmVnZXhDaGFycywgXCJcXFxcJCZcIik7XHJcblxyXG4gICAgICAvLyByZXBsYWNlIGFudC1zdHlsZSB3aWxkY2FyZHMgd2l0aCByZWdleCBlcXVpdmFsZW50c1xyXG5cclxuICAgICAgLy8gcmVwbGFjZSAqIHdpdGggYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBmb3IgJy4nXHJcbiAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5yZXBsYWNlKFxyXG4gICAgICAgIHRoaXMucmVnZXhBc3Rlcmlza0luVGhlTWlkZGxlLFxyXG4gICAgICAgIFwiJDFbXi5dKiQyXCJcclxuICAgICAgKTsgLy8gbm90KiAqIG5vdCpcclxuICAgICAgcmVnZXhQYXR0ZXJuID0gcmVnZXhQYXR0ZXJuLnJlcGxhY2UoXHJcbiAgICAgICAgdGhpcy5yZWdleEFzdGVyaXNrSW5UaGVFbmQsXHJcbiAgICAgICAgXCIkMVteLl0qXCJcclxuICAgICAgKTsgLy8gbm90KiAqIEVPTFxyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZShcclxuICAgICAgICB0aGlzLnJlZ2V4QXN0ZXJpc2tJblRoZUJlZ2lubmluZyxcclxuICAgICAgICBcIlteLl0qJDFcIlxyXG4gICAgICApOyAvLyBCT0wgKiBub3QqXHJcbiAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5yZXBsYWNlKHRoaXMucmVnZXhBc3Rlcmlza09ubHksIFwiW14uXSpcIik7IC8vIEJPTCAqIEVPTFxyXG5cclxuICAgICAgLy8gcmVwbGFjZSAqKiB3aXRoIGEgcGF0dGVybiB0aGF0IG1hdGNoZXMgYW55IGNoYXJhY3RlciBpbmNsdWRpbmcgJy4nXHJcbiAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5yZXBsYWNlKFxyXG4gICAgICAgIHRoaXMucmVnZXhEb3VibGVBc3Rlcmlza1dpdGhEb3QsXHJcbiAgICAgICAgXCIuKlwiXHJcbiAgICAgICk7IC8vICoqLlxyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4RG91YmxlQXN0ZXJpc2ssIFwiLipcIik7IC8vICoqXHJcblxyXG4gICAgICAvLyByZXBsYWNlID8gd2l0aCBhIHNpbmdsZSBjaGFyYWN0ZXIgbWF0Y2hlclxyXG4gICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4ucmVwbGFjZSh0aGlzLnJlZ2V4UXVlc3Rpb25NYXJrLCBcIi5cIik7XHJcblxyXG4gICAgICAvLyBjcmVhdGUgYSBSZWdFeHAgb2JqZWN0XHJcbiAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChcIl5cIiArIHJlZ2V4UGF0dGVybiArIFwiJFwiKTtcclxuICAgICAgdGhpcy5yZWdleEJ5UGF0dGVybi5zZXQocGF0dGVybiwgcmVnZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRlc3QgdGhlIHBhdGggYWdhaW5zdCB0aGUgZ2VuZXJhdGVkIHJlZ2V4XHJcbiAgICByZXR1cm4gcmVnZXgudGVzdChwYXRoKTtcclxuICB9XHJcblxyXG4gIGFwcGx5Q29uc3RyYWludHMod2lkZ2V0cz86IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10pOiB2b2lkIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zbWFydEZvcm0hLmNvbXBvbmVudE1vZGVsPy5jb25zdHJhaW50cyAmJlxyXG4gICAgICB0aGlzLnNtYXJ0Rm9ybSEuY29tcG9uZW50TW9kZWw/LmNvbnN0cmFpbnRzLmxlbmd0aFxyXG4gICAgKSB7XHJcbiAgICAgIGlmICghd2lkZ2V0cykge1xyXG4gICAgICAgIHdpZGdldHMgPSB0aGlzLnNtYXJ0Rm9ybSEud2lkZ2V0cztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFwcGx5Q29tcG9uZW50Q29uc3RyYWludHMoXHJcbiAgICAgICAgd2lkZ2V0cyxcclxuICAgICAgICB0aGlzLnNtYXJ0Rm9ybSEuY29tcG9uZW50TW9kZWw/LmNvbnN0cmFpbnRzXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRFbXB0eUl0ZW1Ub1ZhbHVlTGlzdCh3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+LCBlbXB0eUxhYmVsPzogc3RyaW5nKSB7XHJcbiAgICBpZiAod2lkZ2V0LnR5cGUgPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1QpIHtcclxuICAgICAgY29uc3QgY29udGFpbnNFbXB0eUtleSA9IHdpZGdldC52YWx1ZUxpc3Quc29tZShcclxuICAgICAgICAodikgPT4gdi5rZXkgPT09IHRoaXMuZW1wdHlLZXlcclxuICAgICAgKTtcclxuICAgICAgaWYgKCFjb250YWluc0VtcHR5S2V5KSB7XHJcbiAgICAgICAgd2lkZ2V0LnZhbHVlTGlzdD8udW5zaGlmdCh7XHJcbiAgICAgICAgICBrZXk6IHRoaXMuZW1wdHlLZXksXHJcbiAgICAgICAgICBsYWJlbDogZW1wdHlMYWJlbCA/PyBcIlwiLFxyXG4gICAgICAgICAgdHlwZTogU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNLFxyXG4gICAgICAgICAgdmFsdWU6IFwiXCIsIC8vIHRoaXMgc2hvdWxkIGJlIHVuZGVmaW5lZCwgYnV0IEZvcm1Db250cm9sIGNhbm5vdCBiZSBudWxsLCBmcm9tIHYxNCBpdCB3aWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUVtcHR5SXRlbUZyb21WYWx1ZUxpc3Qod2lkZ2V0OiBTbWFydEZvcm1XaWRnZXQ8YW55Pikge1xyXG4gICAgaWYgKFwidmFsdWVMaXN0XCIgaW4gd2lkZ2V0KSB7XHJcbiAgICAgIGlmICh3aWRnZXQudmFsdWVMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgZmlyc3RJdGVtID0gd2lkZ2V0LnZhbHVlTGlzdFswXTtcclxuICAgICAgICBpZiAoZmlyc3RJdGVtPy5rZXkgPT09IHRoaXMuZW1wdHlLZXkpIHtcclxuICAgICAgICAgIHdpZGdldC52YWx1ZUxpc3Quc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbHRlcldpZGdldHNCeVZpc2liaWxpdHkoXHJcbiAgICB3aWRnZXRzOiBTbWFydEZvcm1XaWRnZXQ8YW55PltdXHJcbiAgKTogU21hcnRGb3JtV2lkZ2V0PGFueT5bXSB7XHJcbiAgICByZXR1cm4gd2lkZ2V0cy5maWx0ZXIoKHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4pID0+XHJcbiAgICAgIHdpZGdldC5pc1Zpc2libGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB3aWRnZXQuaXNWaXNpYmxlXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRUcmFuc2xhdGlvbk9mS2V5KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnNtYXJ0Rm9ybSEudHJhbnNsYXRlU2VydmljZSEuZ2V0KGtleSkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyB0cmFuc2xhdGVXaWRnZXRzKHdpZGdldHM6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+W10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIFByb21pc2UuYWxsKFxyXG4gICAgICB3aWRnZXRzLm1hcChhc3luYyAod2lkZ2V0OiBTbWFydEZvcm1XaWRnZXQ8YW55PikgPT4ge1xyXG4gICAgICAgIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUikgcmV0dXJuO1xyXG4gICAgICAgIGlmICh3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIpIHtcclxuICAgICAgICAgIGlmICghd2lkZ2V0Lm9yaWdpbmFsTGFiZWwpIHtcclxuICAgICAgICAgICAgd2lkZ2V0Lm9yaWdpbmFsTGFiZWwgPSBgJHt3aWRnZXQubGFiZWx9YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vICBMYWJlbFxyXG4gICAgICAgICAgd2lkZ2V0LmxhYmVsID0gYXdhaXQgdGhpcy5nZXRUcmFuc2xhdGlvbk9mS2V5KHdpZGdldC5vcmlnaW5hbExhYmVsKTtcclxuXHJcbiAgICAgICAgICAvLyBQbGFjZWhvbGRlclxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRCB8fFxyXG4gICAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTlVNQkVSIHx8XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyB8fFxyXG4gICAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVCB8fFxyXG4gICAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfQk9YKSAmJlxyXG4gICAgICAgICAgICB3aWRnZXQucGxhY2Vob2xkZXJcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBpZiAoIXdpZGdldC5vcmlnaW5hbFBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0Lm9yaWdpbmFsUGxhY2Vob2xkZXIgPSBgJHt3aWRnZXQucGxhY2Vob2xkZXJ9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aWRnZXQucGxhY2Vob2xkZXIgPSBhd2FpdCB0aGlzLmdldFRyYW5zbGF0aW9uT2ZLZXkoXHJcbiAgICAgICAgICAgICAgd2lkZ2V0Lm9yaWdpbmFsUGxhY2Vob2xkZXJcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBWYWxpZGF0b3JzXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSICYmXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbGlkYXRvcnNcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICB3aWRnZXQudmFsaWRhdG9ycyA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgIHdpZGdldC52YWxpZGF0b3JzLm1hcChhc3luYyAodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0b3Iub3JpZ2luYWxFcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLm9yaWdpbmFsRXJyb3JNZXNzYWdlID0gYCR7dmFsaWRhdG9yLmVycm9yTWVzc2FnZX1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLmVycm9yTWVzc2FnZSA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNsYXRpb25PZktleShcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLm9yaWdpbmFsRXJyb3JNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvcjtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gSW5kaWNhdG9yXHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICAgICAgICB3aWRnZXQuaW5kaWNhdG9yXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKCF3aWRnZXQuaW5kaWNhdG9yLm9yaWdpbmFsSW5kaWNhdG9yU3RhdHVzTGFiZWxzKSB7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0LmluZGljYXRvci5vcmlnaW5hbEluZGljYXRvclN0YXR1c0xhYmVscyA9XHJcbiAgICAgICAgICAgICAgICB3aWRnZXQuaW5kaWNhdG9yLmluZGljYXRvclN0YXR1c0xhYmVscy5tYXAoXHJcbiAgICAgICAgICAgICAgICAgIChsYWJlbDogc3RyaW5nKSA9PiBsYWJlbFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aWRnZXQuaW5kaWNhdG9yLmluZGljYXRvclN0YXR1c0xhYmVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgIHdpZGdldC5pbmRpY2F0b3IuaW5kaWNhdG9yU3RhdHVzTGFiZWxzLm1hcChcclxuICAgICAgICAgICAgICAgIGFzeW5jIChsYWJlbDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PlxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFRyYW5zbGF0aW9uT2ZLZXkoXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LmluZGljYXRvciEub3JpZ2luYWxJbmRpY2F0b3JTdGF0dXNMYWJlbHMhW2luZGV4XVxyXG4gICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1QgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1RfTVVMVElQTEUgfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1ggfHxcclxuICAgICAgICAgICAgICB3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMiB8fFxyXG4gICAgICAgICAgICAgIHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTikgJiZcclxuICAgICAgICAgICAgd2lkZ2V0LnZhbHVlTGlzdFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlV2lkZ2V0SXRlbXMod2lkZ2V0LnZhbHVlTGlzdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlV2lkZ2V0cyh3aWRnZXQudmFsdWVMaXN0ISk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHRyYW5zbGF0ZVdpZGdldEl0ZW1zKHdpZGdldHM6IFNtYXJ0SXRlbXM8YW55PltdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBQcm9taXNlLmFsbChcclxuICAgICAgd2lkZ2V0cy5tYXAoYXN5bmMgKHdpZGdldDogU21hcnRJdGVtczxhbnk+KSA9PiB7XHJcbiAgICAgICAgaWYgKCF3aWRnZXQub3JpZ2luYWxMYWJlbCkge1xyXG4gICAgICAgICAgd2lkZ2V0Lm9yaWdpbmFsTGFiZWwgPSBgJHt3aWRnZXQubGFiZWx9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gIExhYmVsXHJcbiAgICAgICAgd2lkZ2V0LmxhYmVsID0gYXdhaXQgdGhpcy5nZXRUcmFuc2xhdGlvbk9mS2V5KHdpZGdldC5vcmlnaW5hbExhYmVsKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|