@smartbit4all/ng-client 6.0.32 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION-7.0.md +1641 -0
- package/README.md +199 -386
- package/WIDGETS.md +206 -0
- package/fesm2022/smartbit4all-ng-client.mjs +13661 -16214
- package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
- package/package.json +15 -18
- package/smartbit4all-ng-client-7.0.0.tgz +0 -0
- package/types/smartbit4all-ng-client.d.ts +10328 -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 -12
- package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +0 -2
- package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +0 -217
- package/esm2022/lib/session/smart-default-error-ui.service.mjs +0 -134
- package/esm2022/lib/session/smart-error-catching.interceptor.mjs +0 -109
- package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +0 -44
- package/esm2022/lib/session/smart-session-handler.service.mjs +0 -7
- package/esm2022/lib/session/smart-session.module.mjs +0 -58
- package/esm2022/lib/session/smart-session.service.mjs +0 -309
- package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +0 -59
- 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 -4
- package/esm2022/lib/smart-client/smart-component-api-client.mjs +0 -935
- package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +0 -79
- package/esm2022/lib/smart-client/smart.component.mjs +0 -88
- package/esm2022/lib/smart-client/smart.service.mjs +0 -71
- 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 -22
- package/esm2022/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +0 -17
- package/esm2022/lib/smart-component-layout/api/model/models.mjs +0 -10
- 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/model/toolbarAlignment.mjs +0 -17
- package/esm2022/lib/smart-component-layout/api/model/toolbarDirection.mjs +0 -17
- package/esm2022/lib/smart-component-layout/api/model/toolbarProperties.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 -169
- package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +0 -438
- package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +0 -57
- package/esm2022/lib/smart-diagram/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-diagram/api/api/diagramService.service.mjs +0 -141
- package/esm2022/lib/smart-diagram/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-diagram/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-diagram/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-diagram/api/index.mjs +0 -7
- package/esm2022/lib/smart-diagram/api/model/diagramColor.mjs +0 -13
- package/esm2022/lib/smart-diagram/api/model/diagramDataContainer.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/diagramDataItem.mjs +0 -13
- package/esm2022/lib/smart-diagram/api/model/diagramDataSet.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/diagramDescriptor.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/diagramModel.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/diagramShape.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/drawTime.mjs +0 -18
- package/esm2022/lib/smart-diagram/api/model/labelText.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/model/models.mjs +0 -10
- package/esm2022/lib/smart-diagram/api/param.mjs +0 -2
- package/esm2022/lib/smart-diagram/api/variables.mjs +0 -9
- package/esm2022/lib/smart-diagram/component/default-smart-diagram-options.provider.mjs +0 -312
- package/esm2022/lib/smart-diagram/component/smart-diagram.component.mjs +0 -359
- package/esm2022/lib/smart-diagram/component/smart-diagram.module.mjs +0 -40
- package/esm2022/lib/smart-diagram/component/smart-diagram.util.mjs +0 -10
- package/esm2022/lib/smart-diagram/projects.mjs +0 -5
- 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 -86
- package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +0 -101
- 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 -57
- 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 -166
- 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 -294
- 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 -63
- 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/dateFieldProperties.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/divProperties.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/fileUploaderProperties.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/imageProperties.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/models.mjs +0 -20
- package/esm2022/lib/smart-form/api/model/multiFileUploaderProperties.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/recordingUploaderProperties.mjs +0 -7
- package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +0 -14
- 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 -49
- 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/textBoxProperties.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/textFieldProperties.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +0 -21
- 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 -18
- package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +0 -754
- package/esm2022/lib/smart-form/services/smartform.service.mjs +0 -683
- 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 -193
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +0 -2
- package/esm2022/lib/smart-form/smartform.component.mjs +0 -190
- 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-file-editor/smart-file-editor.component.mjs +0 -179
- package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +0 -83
- package/esm2022/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.mjs +0 -170
- package/esm2022/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.mjs +0 -151
- package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +0 -35
- package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +0 -79
- package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +0 -1050
- 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-generic-pages/acl-editing-view/acl-editing-view.component.mjs +0 -98
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCL.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.mjs +0 -18
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.mjs +0 -19
- package/esm2022/lib/smart-generic-pages/api/platform/acl/model/subject.mjs +0 -13
- package/esm2022/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.mjs +0 -13
- package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationItem.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.mjs +0 -2
- package/esm2022/lib/smart-generic-pages/generic-page/generic-page.component.mjs +0 -54
- package/esm2022/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.mjs +0 -40
- package/esm2022/lib/smart-generic-pages/no-permission-page/no-permission-page.component.mjs +0 -40
- package/esm2022/lib/smart-generic-pages/projects.mjs +0 -13
- package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +0 -81
- package/esm2022/lib/smart-generic-pages/smart-generic-pages.module.mjs +0 -116
- package/esm2022/lib/smart-generic-pages/subject-selector/subject-selector.component.mjs +0 -78
- package/esm2022/lib/smart-generic-pages/validation-result-page/validation-result-page.component.mjs +0 -93
- 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 -514
- 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/gridExportDescriptor.mjs +0 -2
- 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/gridRowLayoutDescriptor.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 -16
- 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/generic-component/expanded-row-renderer.component.mjs +0 -47
- package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +0 -92
- package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +0 -200
- 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-toolbar-util.mjs +0 -76
- package/esm2022/lib/smart-grid/smart-grid.component.mjs +0 -1074
- package/esm2022/lib/smart-grid/smart-grid.module.mjs +0 -103
- package/esm2022/lib/smart-grid/smart-grid.service.mjs +0 -92
- package/esm2022/lib/smart-icon/projects.mjs +0 -9
- package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +0 -95
- package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.mjs +0 -33
- package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.mjs +0 -37
- package/esm2022/lib/smart-icon/smart-icon.module.mjs +0 -26
- package/esm2022/lib/smart-icon/smart-icon.service.mjs +0 -93
- 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 -224
- package/esm2022/lib/smart-map/impl/leaflet-map.mjs +0 -422
- package/esm2022/lib/smart-map/projects.mjs +0 -9
- package/esm2022/lib/smart-map/smart-map.component.mjs +0 -222
- 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 -27
- package/esm2022/lib/smart-ng-client.module.mjs +0 -131
- 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 -5
- package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +0 -22
- 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 -177
- package/esm2022/lib/smart-table/smarttable.module.mjs +0 -109
- package/esm2022/lib/smart-table/smarttable.service.mjs +0 -14
- package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +0 -40
- package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +0 -23
- package/esm2022/lib/smart-table/tables/table.mjs +0 -614
- package/esm2022/lib/smart-tree/projects.mjs +0 -9
- package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +0 -292
- package/esm2022/lib/smart-tree/smarttree.component.mjs +0 -188
- package/esm2022/lib/smart-tree/smarttree.model.mjs +0 -7
- package/esm2022/lib/smart-tree/smarttree.module.mjs +0 -64
- 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/theme/theme.service.mjs +0 -48
- package/esm2022/lib/view-context/api/api/api.mjs +0 -4
- package/esm2022/lib/view-context/api/api/view.service.mjs +0 -1113
- package/esm2022/lib/view-context/api/api-default/binaryContentData.mjs +0 -2
- package/esm2022/lib/view-context/api/api-default/binaryData.mjs +0 -2
- package/esm2022/lib/view-context/api/api-default/invocationError.mjs +0 -2
- package/esm2022/lib/view-context/api/api-default/invocationRequest.mjs +0 -2
- package/esm2022/lib/view-context/api/api-default/invocationRun.mjs +0 -2
- 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/backgroundProcessInfo.mjs +0 -2
- package/esm2022/lib/view-context/api/model/badgeDescriptor.mjs +0 -13
- 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/menuDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/menuOpenDirection.mjs +0 -23
- package/esm2022/lib/view-context/api/model/menuTriggerType.mjs +0 -17
- 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 -71
- package/esm2022/lib/view-context/api/model/multiComboBoxElement.mjs +0 -13
- package/esm2022/lib/view-context/api/model/multiComboBoxModel.mjs +0 -2
- 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/publishedViewData.mjs +0 -13
- 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/shellProperty.mjs +0 -13
- package/esm2022/lib/view-context/api/model/smartLinkData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/smartLinkMigrationStatus.mjs +0 -8
- 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/themeDefinition.mjs +0 -2
- package/esm2022/lib/view-context/api/model/themeDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/themeShellDescriptor.mjs +0 -2
- 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/uiActionDefinition.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +0 -2
- 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/uiActionSchedule.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +0 -22
- package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uploadWidgetType.mjs +0 -18
- package/esm2022/lib/view-context/api/model/uploadedFile.mjs +0 -2
- 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 -8
- 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/default-view-components.token.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 -93
- package/esm2022/lib/view-context/projects.mjs +0 -30
- package/esm2022/lib/view-context/property-definition-data.mjs +0 -2
- package/esm2022/lib/view-context/reuse-router-slot.token.mjs +0 -4
- package/esm2022/lib/view-context/smart-embedded-slot.directive.mjs +0 -57
- package/esm2022/lib/view-context/smart-ui-action/components/menu/click/menu.component.mjs +0 -254
- package/esm2022/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.mjs +0 -256
- package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.constants.mjs +0 -62
- package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.service.mjs +0 -29
- 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/components/theme-selector/theme-selector.component.mjs +0 -35
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +0 -198
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.mjs +0 -95
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.mjs +0 -134
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.mjs +0 -12
- package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +0 -256
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +0 -77
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +0 -54
- 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 -106
- 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 -58
- package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +0 -35
- package/esm2022/lib/view-context/smart-ui-action/ui-action-button/button-icon-placeholder.mjs +0 -7
- package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +0 -258
- package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +0 -348
- package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +0 -185
- 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 -250
- package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +0 -77
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +0 -35
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +0 -74
- package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +0 -63
- package/esm2022/lib/view-context/smart-view-context.model.mjs +0 -2
- package/esm2022/lib/view-context/smart-view-context.module.mjs +0 -405
- package/esm2022/lib/view-context/smart-view-context.service.mjs +0 -1079
- package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +0 -41
- 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/lib/view-context/view-handler-resolution.mjs +0 -21
- package/esm2022/lib/view-context/view-op.mjs +0 -41
- package/esm2022/lib/view-context/view-slot-resolution.mjs +0 -28
- package/esm2022/projects.mjs +0 -31
- package/esm2022/smartbit4all-ng-client.mjs +0 -5
- package/index.d.ts +0 -5
- package/lib/component-factory-service/component-factory-service.module.d.ts +0 -6
- package/lib/component-factory-service/component-factory-service.service.d.ts +0 -13
- package/lib/component-factory-service/projects.d.ts +0 -2
- package/lib/session/api/api/api.d.ts +0 -3
- package/lib/session/api/api/session.service.d.ts +0 -107
- package/lib/session/api/configuration.d.ts +0 -104
- package/lib/session/api/encoder.d.ts +0 -11
- package/lib/session/api/index.d.ts +0 -2
- package/lib/session/api/model/accountInfo.d.ts +0 -24
- package/lib/session/api/model/apiError.d.ts +0 -15
- package/lib/session/api/model/authenticationProviderData.d.ts +0 -17
- package/lib/session/api/model/getAuthenticationProvidersResponse.d.ts +0 -15
- package/lib/session/api/model/models.d.ts +0 -8
- package/lib/session/api/model/refreshSessionRequest.d.ts +0 -14
- package/lib/session/api/model/session.d.ts +0 -32
- package/lib/session/api/model/sessionInfoData.d.ts +0 -26
- package/lib/session/api/model/userActivityLog.d.ts +0 -33
- package/lib/session/api/param.d.ts +0 -37
- package/lib/session/api/variables.d.ts +0 -8
- package/lib/session/cookie-service/smart-cookie.service.d.ts +0 -129
- package/lib/session/projects.d.ts +0 -8
- package/lib/session/smart-backend-bootstrap.config.d.ts +0 -73
- package/lib/session/smart-backend-bootstrap.service.d.ts +0 -57
- package/lib/session/smart-default-error-ui.service.d.ts +0 -90
- package/lib/session/smart-error-catching.interceptor.d.ts +0 -21
- package/lib/session/smart-header-maintainer.interceptor.d.ts +0 -11
- package/lib/session/smart-session-handler.service.d.ts +0 -22
- package/lib/session/smart-session.module.d.ts +0 -12
- package/lib/session/smart-session.service.d.ts +0 -88
- package/lib/session/smart-timer/smart-session-timer.component.d.ts +0 -19
- package/lib/shared/projects.d.ts +0 -3
- package/lib/shared/shared.module.d.ts +0 -9
- package/lib/shared/smart-tooltip.directive.d.ts +0 -16
- package/lib/shared/smarttable.date-pipe.d.ts +0 -18
- package/lib/smart-client/projects.d.ts +0 -3
- package/lib/smart-client/smart-component-api-client.d.ts +0 -143
- package/lib/smart-client/smart-file-uploader/smart-file-uploader.component.d.ts +0 -25
- package/lib/smart-client/smart.component.d.ts +0 -35
- package/lib/smart-client/smart.service.d.ts +0 -29
- package/lib/smart-component-layout/api/api/api.d.ts +0 -3
- package/lib/smart-component-layout/api/api/default.service.d.ts +0 -33
- package/lib/smart-component-layout/api/api.module.d.ts +0 -11
- package/lib/smart-component-layout/api/configuration.d.ts +0 -104
- package/lib/smart-component-layout/api/encoder.d.ts +0 -11
- package/lib/smart-component-layout/api/index.d.ts +0 -6
- package/lib/smart-component-layout/api/model/componentType.d.ts +0 -16
- package/lib/smart-component-layout/api/model/componentWidgetType.d.ts +0 -20
- package/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.d.ts +0 -19
- package/lib/smart-component-layout/api/model/layoutDirection.d.ts +0 -15
- package/lib/smart-component-layout/api/model/models.d.ts +0 -9
- package/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.d.ts +0 -32
- package/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.d.ts +0 -26
- package/lib/smart-component-layout/api/model/toolbarAlignment.d.ts +0 -15
- package/lib/smart-component-layout/api/model/toolbarDirection.d.ts +0 -15
- package/lib/smart-component-layout/api/model/toolbarProperties.d.ts +0 -18
- package/lib/smart-component-layout/api/param.d.ts +0 -37
- package/lib/smart-component-layout/api/variables.d.ts +0 -8
- package/lib/smart-component-layout/projects.d.ts +0 -4
- package/lib/smart-component-layout/smart-component-layout-utility.d.ts +0 -25
- package/lib/smart-component-layout/smart-component-layout.component.d.ts +0 -93
- package/lib/smart-component-layout/smart-component-layout.module.d.ts +0 -17
- package/lib/smart-diagram/api/api/api.d.ts +0 -3
- package/lib/smart-diagram/api/api/diagramService.service.d.ts +0 -36
- package/lib/smart-diagram/api/api.module.d.ts +0 -11
- package/lib/smart-diagram/api/configuration.d.ts +0 -104
- package/lib/smart-diagram/api/encoder.d.ts +0 -11
- package/lib/smart-diagram/api/index.d.ts +0 -6
- package/lib/smart-diagram/api/model/diagramColor.d.ts +0 -17
- package/lib/smart-diagram/api/model/diagramDataContainer.d.ts +0 -19
- package/lib/smart-diagram/api/model/diagramDataItem.d.ts +0 -25
- package/lib/smart-diagram/api/model/diagramDataSet.d.ts +0 -22
- package/lib/smart-diagram/api/model/diagramDescriptor.d.ts +0 -57
- package/lib/smart-diagram/api/model/diagramModel.d.ts +0 -19
- package/lib/smart-diagram/api/model/diagramShape.d.ts +0 -30
- package/lib/smart-diagram/api/model/drawTime.d.ts +0 -18
- package/lib/smart-diagram/api/model/labelText.d.ts +0 -21
- package/lib/smart-diagram/api/model/models.d.ts +0 -9
- package/lib/smart-diagram/api/param.d.ts +0 -37
- package/lib/smart-diagram/api/variables.d.ts +0 -8
- package/lib/smart-diagram/component/default-smart-diagram-options.provider.d.ts +0 -33
- package/lib/smart-diagram/component/smart-diagram.component.d.ts +0 -43
- package/lib/smart-diagram/component/smart-diagram.module.d.ts +0 -11
- package/lib/smart-diagram/component/smart-diagram.util.d.ts +0 -1
- package/lib/smart-diagram/projects.d.ts +0 -4
- package/lib/smart-dialog/projects.d.ts +0 -4
- package/lib/smart-dialog/smartdialog.component.d.ts +0 -19
- package/lib/smart-dialog/smartdialog.model.d.ts +0 -68
- package/lib/smart-dialog/smartdialog.module.d.ts +0 -14
- package/lib/smart-dialog/smartdialog.service.d.ts +0 -28
- package/lib/smart-expandable-section/expandable-section.component.d.ts +0 -30
- package/lib/smart-expandable-section/expandable-section.model.d.ts +0 -43
- package/lib/smart-expandable-section/projects.d.ts +0 -4
- package/lib/smart-expandable-section/smart-expandable-section.module.d.ts +0 -17
- package/lib/smart-expandable-section/smart-expandable-section.service.d.ts +0 -6
- package/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.d.ts +0 -15
- package/lib/smart-filter/api/filter/model/filterExpressionBuilderField.d.ts +0 -27
- package/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.d.ts +0 -36
- package/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.d.ts +0 -27
- package/lib/smart-filter/api/filter/model/filterExpressionData.d.ts +0 -27
- package/lib/smart-filter/api/filter/model/filterExpressionDataType.d.ts +0 -18
- package/lib/smart-filter/api/filter/model/filterExpressionField.d.ts +0 -44
- package/lib/smart-filter/api/filter/model/filterExpressionFieldList.d.ts +0 -21
- package/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.d.ts +0 -26
- package/lib/smart-filter/api/filter/model/filterExpressionList.d.ts +0 -18
- package/lib/smart-filter/api/filter/model/filterExpressionOperandData.d.ts +0 -25
- package/lib/smart-filter/api/filter/model/filterExpressionOperation.d.ts +0 -30
- package/lib/smart-filter/api/filter/model/filterExpressionOrderBy.d.ts +0 -25
- package/lib/smart-filter/api/filter/model/model.d.ts +0 -15
- package/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.d.ts +0 -19
- package/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.d.ts +0 -18
- package/lib/smart-filter/api/value/model/value.d.ts +0 -29
- package/lib/smart-filter/projects.d.ts +0 -5
- package/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.d.ts +0 -8
- package/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.d.ts +0 -31
- package/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.d.ts +0 -18
- package/lib/smart-filter/smart-filter/smart-filter.component.d.ts +0 -15
- package/lib/smart-filter/smart-filter/smart-filter.service.d.ts +0 -16
- package/lib/smart-filter/smart-filter.model.d.ts +0 -25
- package/lib/smart-filter/smart-filter.module.d.ts +0 -15
- package/lib/smart-filter-editor/api/api/filter.service.d.ts +0 -57
- package/lib/smart-filter-editor/api/configuration.d.ts +0 -104
- package/lib/smart-filter-editor/api/encoder.d.ts +0 -11
- package/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.d.ts +0 -15
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.d.ts +0 -16
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderField.d.ts +0 -27
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.d.ts +0 -36
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.d.ts +0 -27
- package/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.d.ts +0 -38
- package/lib/smart-filter-editor/api/model/filterExpressionData.d.ts +0 -27
- package/lib/smart-filter-editor/api/model/filterExpressionDataType.d.ts +0 -18
- package/lib/smart-filter-editor/api/model/filterExpressionField.d.ts +0 -44
- package/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.d.ts +0 -17
- package/lib/smart-filter-editor/api/model/filterExpressionFieldList.d.ts +0 -21
- package/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.d.ts +0 -26
- package/lib/smart-filter-editor/api/model/filterExpressionList.d.ts +0 -18
- package/lib/smart-filter-editor/api/model/filterExpressionOperandData.d.ts +0 -25
- package/lib/smart-filter-editor/api/model/filterExpressionOperation.d.ts +0 -30
- package/lib/smart-filter-editor/api/model/filterExpressionOrderBy.d.ts +0 -28
- package/lib/smart-filter-editor/api/model/smartFilterType.d.ts +0 -15
- package/lib/smart-filter-editor/api/param.d.ts +0 -37
- package/lib/smart-filter-editor/api/variables.d.ts +0 -8
- package/lib/smart-filter-editor/filterExpressionBuilderApiActions.d.ts +0 -13
- package/lib/smart-filter-editor/project.d.ts +0 -7
- package/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.d.ts +0 -19
- package/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.d.ts +0 -17
- package/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.d.ts +0 -44
- package/lib/smart-filter-editor/smart-filter-editor.model.d.ts +0 -4
- package/lib/smart-filter-editor/smart-filter-editor.module.d.ts +0 -18
- package/lib/smart-filter-editor/smart-filter-editor.service.d.ts +0 -45
- package/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.d.ts +0 -9
- package/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.d.ts +0 -21
- package/lib/smart-form/api/api/api.d.ts +0 -3
- package/lib/smart-form/api/api/default.service.d.ts +0 -33
- package/lib/smart-form/api/api.module.d.ts +0 -11
- package/lib/smart-form/api/configuration.d.ts +0 -104
- package/lib/smart-form/api/encoder.d.ts +0 -11
- package/lib/smart-form/api/index.d.ts +0 -6
- package/lib/smart-form/api/model/dateFieldProperties.d.ts +0 -15
- package/lib/smart-form/api/model/divProperties.d.ts +0 -15
- package/lib/smart-form/api/model/fileUploaderProperties.d.ts +0 -20
- package/lib/smart-form/api/model/imageProperties.d.ts +0 -15
- package/lib/smart-form/api/model/models.d.ts +0 -19
- package/lib/smart-form/api/model/multiFileUploaderProperties.d.ts +0 -19
- package/lib/smart-form/api/model/propertyMapping.d.ts +0 -24
- package/lib/smart-form/api/model/recordingUploaderProperties.d.ts +0 -20
- package/lib/smart-form/api/model/selectionDefinition.d.ts +0 -58
- package/lib/smart-form/api/model/smartFormInputMode.d.ts +0 -20
- package/lib/smart-form/api/model/smartFormWidgetDirection.d.ts +0 -15
- package/lib/smart-form/api/model/smartFormWidgetType.d.ts +0 -47
- package/lib/smart-form/api/model/smartLayoutDefinition.d.ts +0 -15
- package/lib/smart-form/api/model/smartMatrixModel.d.ts +0 -29
- package/lib/smart-form/api/model/smartWidgetDefinition.d.ts +0 -125
- package/lib/smart-form/api/model/smartWidgetHint.d.ts +0 -19
- package/lib/smart-form/api/model/sortDefinition.d.ts +0 -15
- package/lib/smart-form/api/model/textBoxProperties.d.ts +0 -15
- package/lib/smart-form/api/model/textFieldProperties.d.ts +0 -14
- package/lib/smart-form/api/model/valueChangeMode.d.ts +0 -19
- package/lib/smart-form/api/param.d.ts +0 -37
- package/lib/smart-form/api/variables.d.ts +0 -8
- package/lib/smart-form/highlightMacthingString-pipe.d.ts +0 -7
- package/lib/smart-form/projects.d.ts +0 -14
- package/lib/smart-form/services/smartform.layout-definition.service.d.ts +0 -50
- package/lib/smart-form/services/smartform.service.d.ts +0 -52
- package/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.d.ts +0 -8
- package/lib/smart-form/smartfileuploader/smartfileuploader.component.d.ts +0 -38
- package/lib/smart-form/smartfileuploader/smartfileuploader.model.d.ts +0 -7
- package/lib/smart-form/smartform.component.d.ts +0 -43
- package/lib/smart-form/smartform.form-model.d.ts +0 -864
- package/lib/smart-form/smartform.model.d.ts +0 -126
- package/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.d.ts +0 -54
- package/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.d.ts +0 -29
- package/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.d.ts +0 -57
- package/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.d.ts +0 -50
- package/lib/smart-form/widgets/directives/comparable-dropdown.directive.d.ts +0 -10
- package/lib/smart-form/widgets/directives/comparable-multiselect.directive.d.ts +0 -10
- package/lib/smart-form/widgets/smartformwidget/smartformwidget.component.d.ts +0 -173
- package/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.d.ts +0 -24
- package/lib/smart-form/widgets/smartformwidget/trackCaps.directive.d.ts +0 -9
- package/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.d.ts +0 -21
- package/lib/smart-generic-pages/api/platform/acl/model/aCL.d.ts +0 -18
- package/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.d.ts +0 -54
- package/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.d.ts +0 -19
- package/lib/smart-generic-pages/api/platform/acl/model/subject.d.ts +0 -24
- package/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.d.ts +0 -2
- package/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.d.ts +0 -27
- package/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.d.ts +0 -14
- package/lib/smart-generic-pages/api/platform/validation/model/validationItem.d.ts +0 -17
- package/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.d.ts +0 -18
- package/lib/smart-generic-pages/generic-page/generic-page.component.d.ts +0 -12
- package/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.d.ts +0 -11
- package/lib/smart-generic-pages/no-permission-page/no-permission-page.component.d.ts +0 -11
- package/lib/smart-generic-pages/projects.d.ts +0 -9
- package/lib/smart-generic-pages/search-page/search-page.component.d.ts +0 -25
- package/lib/smart-generic-pages/smart-generic-pages.module.d.ts +0 -19
- package/lib/smart-generic-pages/subject-selector/subject-selector.component.d.ts +0 -17
- package/lib/smart-generic-pages/validation-result-page/validation-result-page.component.d.ts +0 -25
- package/lib/smart-grid/api/grid-api/api/api.d.ts +0 -3
- package/lib/smart-grid/api/grid-api/api/grid.service.d.ts +0 -182
- package/lib/smart-grid/api/grid-api/api.module.d.ts +0 -11
- package/lib/smart-grid/api/grid-api/configuration.d.ts +0 -104
- package/lib/smart-grid/api/grid-api/encoder.d.ts +0 -11
- package/lib/smart-grid/api/grid-api/index.d.ts +0 -6
- package/lib/smart-grid/api/grid-api/model/gridColumnContentType.d.ts +0 -15
- package/lib/smart-grid/api/grid-api/model/gridColumnMeta.d.ts +0 -34
- package/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.d.ts +0 -44
- package/lib/smart-grid/api/grid-api/model/gridExportDescriptor.d.ts +0 -19
- package/lib/smart-grid/api/grid-api/model/gridModel.d.ts +0 -36
- package/lib/smart-grid/api/grid-api/model/gridPage.d.ts +0 -26
- package/lib/smart-grid/api/grid-api/model/gridRow.d.ts +0 -47
- package/lib/smart-grid/api/grid-api/model/gridRowLayoutDescriptor.d.ts +0 -20
- package/lib/smart-grid/api/grid-api/model/gridSelectionChange.d.ts +0 -24
- package/lib/smart-grid/api/grid-api/model/gridSelectionMode.d.ts +0 -16
- package/lib/smart-grid/api/grid-api/model/gridSelectionType.d.ts +0 -15
- package/lib/smart-grid/api/grid-api/model/gridServerModel.d.ts +0 -22
- package/lib/smart-grid/api/grid-api/model/gridUpdateData.d.ts +0 -20
- package/lib/smart-grid/api/grid-api/model/gridView.d.ts +0 -21
- package/lib/smart-grid/api/grid-api/model/gridViewDescriptor.d.ts +0 -39
- package/lib/smart-grid/api/grid-api/model/models.d.ts +0 -15
- package/lib/smart-grid/api/grid-api/param.d.ts +0 -37
- package/lib/smart-grid/api/grid-api/variables.d.ts +0 -8
- package/lib/smart-grid/components/expandable-grid/expandable-grid.component.d.ts +0 -10
- package/lib/smart-grid/components/generic-component/expanded-row-renderer.component.d.ts +0 -21
- package/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.d.ts +0 -26
- package/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.d.ts +0 -47
- package/lib/smart-grid/models/model.d.ts +0 -73
- package/lib/smart-grid/projects.d.ts +0 -5
- package/lib/smart-grid/smart-grid-toolbar-util.d.ts +0 -12
- package/lib/smart-grid/smart-grid.component.d.ts +0 -157
- package/lib/smart-grid/smart-grid.module.d.ts +0 -29
- package/lib/smart-grid/smart-grid.service.d.ts +0 -26
- package/lib/smart-icon/projects.d.ts +0 -5
- package/lib/smart-icon/smart-icon/smart-icon.component.d.ts +0 -34
- package/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.d.ts +0 -10
- package/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.d.ts +0 -14
- package/lib/smart-icon/smart-icon.module.d.ts +0 -14
- package/lib/smart-icon/smart-icon.service.d.ts +0 -29
- package/lib/smart-map/abstract-map.d.ts +0 -37
- package/lib/smart-map/api/api/api.d.ts +0 -3
- package/lib/smart-map/api/api/geoMap.service.d.ts +0 -101
- package/lib/smart-map/api/api.module.d.ts +0 -11
- package/lib/smart-map/api/configuration.d.ts +0 -104
- package/lib/smart-map/api/encoder.d.ts +0 -11
- package/lib/smart-map/api/index.d.ts +0 -6
- package/lib/smart-map/api/model/gPSPosition.d.ts +0 -32
- package/lib/smart-map/api/model/gPSRoute.d.ts +0 -21
- package/lib/smart-map/api/model/geoMapChange.d.ts +0 -21
- package/lib/smart-map/api/model/geoMapDataLoadingMode.d.ts +0 -15
- package/lib/smart-map/api/model/geoMapDataSourceDescriptor.d.ts +0 -52
- package/lib/smart-map/api/model/geoMapDataSourceType.d.ts +0 -17
- package/lib/smart-map/api/model/geoMapEditingSession.d.ts +0 -17
- package/lib/smart-map/api/model/geoMapInteraction.d.ts +0 -24
- package/lib/smart-map/api/model/geoMapItem.d.ts +0 -41
- package/lib/smart-map/api/model/geoMapItemKind.d.ts +0 -16
- package/lib/smart-map/api/model/geoMapLayer.d.ts +0 -19
- package/lib/smart-map/api/model/geoMapLayerChange.d.ts +0 -20
- package/lib/smart-map/api/model/geoMapLayerDescriptor.d.ts +0 -28
- package/lib/smart-map/api/model/geoMapModel.d.ts +0 -26
- package/lib/smart-map/api/model/geoMapOperationMode.d.ts +0 -15
- package/lib/smart-map/api/model/geoMapSelectionMode.d.ts +0 -16
- package/lib/smart-map/api/model/geoMapServerModel.d.ts +0 -25
- package/lib/smart-map/api/model/geoMapTextType.d.ts +0 -15
- package/lib/smart-map/api/model/geoMapViewState.d.ts +0 -27
- package/lib/smart-map/api/model/geoMapViewport.d.ts +0 -20
- package/lib/smart-map/api/model/models.d.ts +0 -20
- package/lib/smart-map/api/param.d.ts +0 -37
- package/lib/smart-map/api/variables.d.ts +0 -8
- package/lib/smart-map/api-default/api-default.d.ts +0 -2
- package/lib/smart-map/impl/google-map.d.ts +0 -23
- package/lib/smart-map/impl/leaflet-map.d.ts +0 -22
- package/lib/smart-map/projects.d.ts +0 -8
- package/lib/smart-map/smart-map.component.d.ts +0 -39
- package/lib/smart-map/smart-map.module.d.ts +0 -11
- package/lib/smart-map/smart-map.types.d.ts +0 -34
- package/lib/smart-navbar/projects.d.ts +0 -4
- package/lib/smart-navbar/smart-navbar.component.d.ts +0 -20
- package/lib/smart-navbar/smart-navbar.model.d.ts +0 -48
- package/lib/smart-navbar/smart-navbar.module.d.ts +0 -18
- package/lib/smart-navbar/smart-navbar.service.d.ts +0 -6
- package/lib/smart-navigation/projects.d.ts +0 -2
- package/lib/smart-navigation/smart-navigation.interface.d.ts +0 -5
- package/lib/smart-navigation/smart-navigation.module.d.ts +0 -6
- package/lib/smart-navigation/smart-navigation.service.d.ts +0 -12
- package/lib/smart-ng-client.module.d.ts +0 -25
- package/lib/smart-ng-client.service.d.ts +0 -10
- package/lib/smart-subject/projects.d.ts +0 -1
- package/lib/smart-subject/smart-subject.d.ts +0 -6
- package/lib/smart-tab-group/projects.d.ts +0 -1
- package/lib/smart-tab-group/smart-tab-group.module.d.ts +0 -10
- package/lib/smart-table/components/default-actions-popup/default-actions-popup.component.d.ts +0 -19
- package/lib/smart-table/components/loading/loading.component.d.ts +0 -8
- package/lib/smart-table/directives/mat-context-menu-trigger-for.directive.d.ts +0 -10
- package/lib/smart-table/projects.d.ts +0 -4
- package/lib/smart-table/smarttable.component.d.ts +0 -34
- package/lib/smart-table/smarttable.model.d.ts +0 -202
- package/lib/smart-table/smarttable.module.d.ts +0 -29
- package/lib/smart-table/smarttable.service.d.ts +0 -6
- package/lib/smart-table/tables/material-table/material-table.component.d.ts +0 -8
- package/lib/smart-table/tables/mobile-table/mobile-table.component.d.ts +0 -8
- package/lib/smart-table/tables/table.d.ts +0 -98
- package/lib/smart-tree/projects.d.ts +0 -5
- package/lib/smart-tree/smarttree-generic.service.d.ts +0 -48
- package/lib/smart-tree/smarttree.component.d.ts +0 -43
- package/lib/smart-tree/smarttree.model.d.ts +0 -42
- package/lib/smart-tree/smarttree.module.d.ts +0 -16
- package/lib/smart-tree/smarttree.node.model.d.ts +0 -13
- package/lib/smart-tree/smarttree.service.d.ts +0 -25
- package/lib/smart-tree/smarttree.service.interface.d.ts +0 -43
- package/lib/smart-tree/tree-api/api/tree.service.d.ts +0 -336
- package/lib/smart-tree/tree-api/configuration.d.ts +0 -104
- package/lib/smart-tree/tree-api/encoder.d.ts +0 -11
- package/lib/smart-tree/tree-api/param.d.ts +0 -37
- package/lib/smart-tree/tree-api/variables.d.ts +0 -8
- package/lib/smart-validation/named-validator.service.d.ts +0 -17
- package/lib/smart-validation/projects.d.ts +0 -3
- package/lib/smart-validation/smart-validation.module.d.ts +0 -8
- package/lib/smart-validation/smart-validation.types.d.ts +0 -12
- package/lib/theme/theme.service.d.ts +0 -17
- package/lib/view-context/api/api/api.d.ts +0 -3
- package/lib/view-context/api/api/view.service.d.ts +0 -426
- package/lib/view-context/api/api-default/binaryContentData.d.ts +0 -2
- package/lib/view-context/api/api-default/binaryData.d.ts +0 -2
- package/lib/view-context/api/api-default/invocationError.d.ts +0 -2
- package/lib/view-context/api/api-default/invocationRequest.d.ts +0 -2
- package/lib/view-context/api/api-default/invocationRun.d.ts +0 -2
- package/lib/view-context/api/api.module.d.ts +0 -11
- package/lib/view-context/api/configuration.d.ts +0 -104
- package/lib/view-context/api/encoder.d.ts +0 -11
- package/lib/view-context/api/index.d.ts +0 -6
- package/lib/view-context/api/model/backgroundProcessInfo.d.ts +0 -25
- package/lib/view-context/api/model/badgeDescriptor.d.ts +0 -15
- package/lib/view-context/api/model/clipboardData.d.ts +0 -20
- package/lib/view-context/api/model/closeResult.d.ts +0 -16
- package/lib/view-context/api/model/componentConstraint.d.ts +0 -31
- package/lib/view-context/api/model/componentModel.d.ts +0 -47
- package/lib/view-context/api/model/componentModelChange.d.ts +0 -29
- package/lib/view-context/api/model/dataChange.d.ts +0 -25
- package/lib/view-context/api/model/dataChangeEvent.d.ts +0 -31
- package/lib/view-context/api/model/dataChangeKind.d.ts +0 -19
- package/lib/view-context/api/model/deviceInfo.d.ts +0 -43
- package/lib/view-context/api/model/downloadedFile.d.ts +0 -19
- package/lib/view-context/api/model/iconPosition.d.ts +0 -18
- package/lib/view-context/api/model/imageResource.d.ts +0 -28
- package/lib/view-context/api/model/link.d.ts +0 -35
- package/lib/view-context/api/model/menuDescriptor.d.ts +0 -17
- package/lib/view-context/api/model/menuOpenDirection.d.ts +0 -21
- package/lib/view-context/api/model/menuTriggerType.d.ts +0 -15
- package/lib/view-context/api/model/messageData.d.ts +0 -29
- package/lib/view-context/api/model/messageOption.d.ts +0 -20
- package/lib/view-context/api/model/messageOptionType.d.ts +0 -16
- package/lib/view-context/api/model/messageResult.d.ts +0 -16
- package/lib/view-context/api/model/messageTextType.d.ts +0 -15
- package/lib/view-context/api/model/messageType.d.ts +0 -17
- package/lib/view-context/api/model/models.d.ts +0 -70
- package/lib/view-context/api/model/multiComboBoxElement.d.ts +0 -16
- package/lib/view-context/api/model/multiComboBoxModel.d.ts +0 -16
- package/lib/view-context/api/model/namedValidator.d.ts +0 -27
- package/lib/view-context/api/model/openPendingData.d.ts +0 -29
- package/lib/view-context/api/model/publishedViewData.d.ts +0 -14
- package/lib/view-context/api/model/serverRequestExecutionStat.d.ts +0 -40
- package/lib/view-context/api/model/serverRequestTrack.d.ts +0 -60
- package/lib/view-context/api/model/serverRequestType.d.ts +0 -22
- package/lib/view-context/api/model/shellProperty.d.ts +0 -15
- package/lib/view-context/api/model/smartLinkData.d.ts +0 -29
- package/lib/view-context/api/model/smartLinkMigrationStatus.d.ts +0 -39
- package/lib/view-context/api/model/statisticRecord.d.ts +0 -36
- package/lib/view-context/api/model/style.d.ts +0 -21
- package/lib/view-context/api/model/themeDefinition.d.ts +0 -22
- package/lib/view-context/api/model/themeDescriptor.d.ts +0 -16
- package/lib/view-context/api/model/themeShellDescriptor.d.ts +0 -17
- package/lib/view-context/api/model/uiAction.d.ts +0 -68
- package/lib/view-context/api/model/uiActionButtonDescriptor.d.ts +0 -25
- package/lib/view-context/api/model/uiActionButtonType.d.ts +0 -25
- package/lib/view-context/api/model/uiActionConstraint.d.ts +0 -22
- package/lib/view-context/api/model/uiActionDefinition.d.ts +0 -19
- package/lib/view-context/api/model/uiActionDefinitionEntry.d.ts +0 -18
- package/lib/view-context/api/model/uiActionDescriptor.d.ts +0 -44
- package/lib/view-context/api/model/uiActionDialogDescriptor.d.ts +0 -23
- package/lib/view-context/api/model/uiActionFeedbackType.d.ts +0 -18
- package/lib/view-context/api/model/uiActionInputType.d.ts +0 -19
- package/lib/view-context/api/model/uiActionRequest.d.ts +0 -31
- package/lib/view-context/api/model/uiActionSchedule.d.ts +0 -14
- package/lib/view-context/api/model/uiActionTooltip.d.ts +0 -25
- package/lib/view-context/api/model/uiActionUploadDescriptor.d.ts +0 -27
- package/lib/view-context/api/model/uploadWidgetType.d.ts +0 -16
- package/lib/view-context/api/model/uploadedFile.d.ts +0 -20
- package/lib/view-context/api/model/valueSet.d.ts +0 -20
- package/lib/view-context/api/model/view.d.ts +0 -88
- package/lib/view-context/api/model/viewApiError.d.ts +0 -18
- package/lib/view-context/api/model/viewConstraint.d.ts +0 -18
- package/lib/view-context/api/model/viewContext.d.ts +0 -33
- package/lib/view-context/api/model/viewContextChange.d.ts +0 -24
- package/lib/view-context/api/model/viewContextData.d.ts +0 -25
- package/lib/view-context/api/model/viewContextUpdate.d.ts +0 -24
- package/lib/view-context/api/model/viewData.d.ts +0 -28
- package/lib/view-context/api/model/viewEventHandler.d.ts +0 -36
- package/lib/view-context/api/model/viewPlaceholder.d.ts +0 -22
- package/lib/view-context/api/model/viewState.d.ts +0 -20
- package/lib/view-context/api/model/viewStateUpdate.d.ts +0 -22
- package/lib/view-context/api/model/viewType.d.ts +0 -16
- package/lib/view-context/api/param.d.ts +0 -37
- package/lib/view-context/api/variables.d.ts +0 -8
- package/lib/view-context/default-view-components.token.d.ts +0 -18
- package/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.d.ts +0 -9
- package/lib/view-context/message-dialog/message-dialog.component.d.ts +0 -27
- package/lib/view-context/projects.d.ts +0 -26
- package/lib/view-context/property-definition-data.d.ts +0 -5
- package/lib/view-context/reuse-router-slot.token.d.ts +0 -3
- package/lib/view-context/smart-embedded-slot.directive.d.ts +0 -20
- package/lib/view-context/smart-ui-action/components/menu/click/menu.component.d.ts +0 -49
- package/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.d.ts +0 -50
- package/lib/view-context/smart-ui-action/components/menu/menu.constants.d.ts +0 -7
- package/lib/view-context/smart-ui-action/components/menu/menu.service.d.ts +0 -11
- package/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.d.ts +0 -13
- package/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.d.ts +0 -16
- package/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.d.ts +0 -30
- package/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.d.ts +0 -32
- package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.d.ts +0 -40
- package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.d.ts +0 -3
- package/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.d.ts +0 -43
- package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.d.ts +0 -29
- package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.d.ts +0 -21
- package/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.d.ts +0 -15
- package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.d.ts +0 -36
- package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.d.ts +0 -26
- package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.d.ts +0 -31
- package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.d.ts +0 -28
- package/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.d.ts +0 -13
- package/lib/view-context/smart-ui-action/ui-action-button/button-icon-placeholder.d.ts +0 -5
- package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +0 -55
- package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +0 -73
- package/lib/view-context/smart-ui-action/ui-action.descriptor.service.d.ts +0 -23
- package/lib/view-context/smart-ui-action/ui-action.model.d.ts +0 -43
- package/lib/view-context/smart-ui-action/ui-action.service.d.ts +0 -42
- package/lib/view-context/smart-view-context-dialog.service.d.ts +0 -21
- package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.d.ts +0 -15
- package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.d.ts +0 -21
- package/lib/view-context/smart-view-context.interceptor.d.ts +0 -17
- package/lib/view-context/smart-view-context.model.d.ts +0 -37
- package/lib/view-context/smart-view-context.module.d.ts +0 -86
- package/lib/view-context/smart-view-context.service.d.ts +0 -172
- package/lib/view-context/smart-view-redirect/smart-view-redirect.d.ts +0 -16
- package/lib/view-context/utility/componentLibrary.d.ts +0 -6
- package/lib/view-context/utility/smart-object-utility.d.ts +0 -5
- package/lib/view-context/utility/smart-style-utility.d.ts +0 -12
- package/lib/view-context/value-api/api/api.d.ts +0 -3
- package/lib/view-context/value-api/api/value.service.d.ts +0 -35
- package/lib/view-context/value-api/api.module.d.ts +0 -11
- package/lib/view-context/value-api/configuration.d.ts +0 -104
- package/lib/view-context/value-api/encoder.d.ts +0 -11
- package/lib/view-context/value-api/index.d.ts +0 -6
- package/lib/view-context/value-api/model/genericValue.d.ts +0 -33
- package/lib/view-context/value-api/model/models.d.ts +0 -10
- package/lib/view-context/value-api/model/value.d.ts +0 -29
- package/lib/view-context/value-api/model/valueSetData.d.ts +0 -41
- package/lib/view-context/value-api/model/valueSetDefinition.d.ts +0 -16
- package/lib/view-context/value-api/model/valueSetDefinitionData.d.ts +0 -53
- package/lib/view-context/value-api/model/valueSetDefinitionIdentifier.d.ts +0 -21
- package/lib/view-context/value-api/model/valueSetDefinitionKind.d.ts +0 -22
- package/lib/view-context/value-api/model/valueSetExpression.d.ts +0 -18
- package/lib/view-context/value-api/model/valueSetOperand.d.ts +0 -25
- package/lib/view-context/value-api/model/valueSetOperation.d.ts +0 -17
- package/lib/view-context/value-api/param.d.ts +0 -37
- package/lib/view-context/value-api/variables.d.ts +0 -8
- package/lib/view-context/view-handler-resolution.d.ts +0 -11
- package/lib/view-context/view-op.d.ts +0 -18
- package/lib/view-context/view-slot-resolution.d.ts +0 -27
- package/projects.d.ts +0 -27
- package/smartbit4all-ng-client-6.0.32.tgz +0 -0
|
@@ -1,1079 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, InjectionToken, Optional, } from '@angular/core';
|
|
2
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
-
import { LinkTargetEnum, ViewState, ViewType, } from './api';
|
|
4
|
-
import { MessageDialogComponent } from './message-dialog/message-dialog.component';
|
|
5
|
-
import { SmartSubject } from '../smart-subject/projects';
|
|
6
|
-
import { MatDialogRef } from '@angular/material/dialog';
|
|
7
|
-
import { DynamicDialogRef } from 'primeng/dynamicdialog';
|
|
8
|
-
import { COMPONENT_LIBRARY } from './utility/componentLibrary';
|
|
9
|
-
import { resolveSlot } from './view-slot-resolution';
|
|
10
|
-
import { SMART_DEFAULT_VIEW_COMPONENTS, } from './default-view-components.token';
|
|
11
|
-
import { resolveViewHandler } from './view-handler-resolution';
|
|
12
|
-
import { buildViewOps } from './view-op';
|
|
13
|
-
import { REUSE_ROUTER_SLOT_COMPONENT } from './reuse-router-slot.token';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "./api";
|
|
16
|
-
import * as i2 from "../session/smart-session.service";
|
|
17
|
-
import * as i3 from "./smart-view-context-dialog.service";
|
|
18
|
-
import * as i4 from "../theme/theme.service";
|
|
19
|
-
import * as i5 from "./utility/componentLibrary";
|
|
20
|
-
export const SmartViewContextErrorDialogButtonLabel = 'SmartViewContextErrorDialogButtonLabel';
|
|
21
|
-
export const SmartViewContextErrorDialogTitle = 'SmartViewContextErrorDialogTitle';
|
|
22
|
-
export const SmartViewContextErrorDialogMessage = 'SmartViewContextErrorDialogMessage';
|
|
23
|
-
export const DefaultUiActionCode_CLOSE = 'DEFAULT_CLOSE';
|
|
24
|
-
export const DIALOG_DISABLE_CLOSE = new InjectionToken('dialogDisableClose');
|
|
25
|
-
export class SmartViewContextService {
|
|
26
|
-
set translateService(translateService) {
|
|
27
|
-
this._translateService = translateService;
|
|
28
|
-
this.translateServiceChanged.next();
|
|
29
|
-
this.translateServiceChanged.complete();
|
|
30
|
-
}
|
|
31
|
-
get translateService() {
|
|
32
|
-
if (this._translateService) {
|
|
33
|
-
return this._translateService;
|
|
34
|
-
}
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
constructor(view, session, dialog, apiQueueService, themeService, inject, compLib, defaultViewComponents) {
|
|
38
|
-
this.view = view;
|
|
39
|
-
this.session = session;
|
|
40
|
-
this.dialog = dialog;
|
|
41
|
-
this.apiQueueService = apiQueueService;
|
|
42
|
-
this.themeService = themeService;
|
|
43
|
-
this.inject = inject;
|
|
44
|
-
this.viewContextUuidName = 'viewContextUuid';
|
|
45
|
-
this.viewContextUuidHeaderName = 'viewContextUuid';
|
|
46
|
-
this.pageNamePrefix = 'page.';
|
|
47
|
-
this.componentNamePrefix = 'component.';
|
|
48
|
-
this.viewHandlers = new Array();
|
|
49
|
-
this.defaultComponents = new Map();
|
|
50
|
-
this.openedViewUuids = new Array();
|
|
51
|
-
this.openedViewData = new Array();
|
|
52
|
-
// Monotonic counter bumped on every successful startViewContext(). Callers
|
|
53
|
-
// that hold a reference to a view-uuid from a previous viewcontext can
|
|
54
|
-
// detect a rebuild by comparing snapshots of this value.
|
|
55
|
-
this.generation = 0;
|
|
56
|
-
this._destroy$ = new Subject();
|
|
57
|
-
this.uuidOfPageHasBeenChanged = new SmartSubject(this._destroy$);
|
|
58
|
-
this.viewContextHasBeenSynced = new SmartSubject(this._destroy$);
|
|
59
|
-
this.openSmartLink = new SmartSubject(this._destroy$);
|
|
60
|
-
this.isOpeningSmartLink = false;
|
|
61
|
-
this.dialogRefs = [];
|
|
62
|
-
this.embeddedContainers = new Map();
|
|
63
|
-
this.embeddedViewRefs = [];
|
|
64
|
-
this.pendingEmbeddedViews = [];
|
|
65
|
-
this.smartApiClients = new Map();
|
|
66
|
-
this.translateServiceChanged = new SmartSubject(this._destroy$);
|
|
67
|
-
this.componentLibrary = compLib;
|
|
68
|
-
for (const entry of defaultViewComponents ?? []) {
|
|
69
|
-
this.defaultComponents.set(entry.componentName, entry.component);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
ngOnDestroy() {
|
|
73
|
-
this._destroy$.next();
|
|
74
|
-
this._destroy$.complete();
|
|
75
|
-
}
|
|
76
|
-
follow(uuid, detectChange) {
|
|
77
|
-
this.smartApiClients.set(uuid, detectChange);
|
|
78
|
-
}
|
|
79
|
-
unfollow(uuid) {
|
|
80
|
-
this.smartApiClients.delete(uuid);
|
|
81
|
-
}
|
|
82
|
-
registerEmbeddedSlot(containerUuid, containerId, vcRef, kind) {
|
|
83
|
-
let innerMap = this.embeddedContainers.get(containerUuid);
|
|
84
|
-
if (!innerMap) {
|
|
85
|
-
innerMap = new Map();
|
|
86
|
-
this.embeddedContainers.set(containerUuid, innerMap);
|
|
87
|
-
}
|
|
88
|
-
innerMap.set(containerId, { vcRef, kind });
|
|
89
|
-
// Reattach embedded views that were detached before layout re-render
|
|
90
|
-
const existing = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid && ref.containerId === containerId);
|
|
91
|
-
for (const ref of existing) {
|
|
92
|
-
if (!ref.componentRef.hostView.destroyed) {
|
|
93
|
-
vcRef.insert(ref.componentRef.hostView);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// Drain pending queue (match on the resolved slot, so router-slot NORMAL views match too)
|
|
97
|
-
const matches = (v) => {
|
|
98
|
-
const s = resolveSlot(v);
|
|
99
|
-
return s.containerUuid === containerUuid && s.containerId === containerId;
|
|
100
|
-
};
|
|
101
|
-
const matching = this.pendingEmbeddedViews.filter(matches);
|
|
102
|
-
this.pendingEmbeddedViews = this.pendingEmbeddedViews.filter((v) => !matches(v));
|
|
103
|
-
if (matching.length > 0) {
|
|
104
|
-
const updates = matching.map((v) => this.openView(v));
|
|
105
|
-
this.sendViewContextUpdates(updates);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
detachAllEmbeddedViews(containerUuid) {
|
|
109
|
-
const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
|
|
110
|
-
for (const child of children) {
|
|
111
|
-
if (child.componentRef.hostView.destroyed) {
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
// Only detach views living in a re-rendering LAYOUT slot. A STABLE directive
|
|
115
|
-
// slot (router-outlet) lives outside the layout *ngFor and survives the parent
|
|
116
|
-
// re-render, so its child needs no detach protection — detaching it here is
|
|
117
|
-
// what produced the false-orphan destroy in multi-level NORMAL nesting
|
|
118
|
-
// (Home -> Main -> page): Main got swept up by Home's layout dance. (#28870)
|
|
119
|
-
const entry = this.embeddedContainers.get(containerUuid)?.get(child.containerId);
|
|
120
|
-
if (!entry || entry.kind === 'stable') {
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
const idx = entry.vcRef.indexOf(child.componentRef.hostView);
|
|
124
|
-
if (idx >= 0) {
|
|
125
|
-
entry.vcRef.detach(idx);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
cleanupOrphanedEmbeddedViews(containerUuid) {
|
|
130
|
-
const refs = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
|
|
131
|
-
const orphaned = [];
|
|
132
|
-
for (const ref of refs) {
|
|
133
|
-
if (ref.componentRef.hostView.destroyed) {
|
|
134
|
-
orphaned.push(ref);
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
const vcRef = this.getEmbeddedSlot(containerUuid, ref.containerId);
|
|
138
|
-
if (!vcRef) {
|
|
139
|
-
// The slot is truly gone (its layout host was torn down and not recreated):
|
|
140
|
-
// a real orphan to destroy.
|
|
141
|
-
orphaned.push(ref);
|
|
142
|
-
continue;
|
|
143
|
-
}
|
|
144
|
-
// Slot still registered but its view was detached by detachAllEmbeddedViews and
|
|
145
|
-
// never reattached, because the *ngFor reused the slot host (only a sibling
|
|
146
|
-
// widget changed) so no re-register fired. Reattach so every detach is paired.
|
|
147
|
-
if (vcRef.indexOf(ref.componentRef.hostView) < 0) {
|
|
148
|
-
vcRef.insert(ref.componentRef.hostView);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
for (const ref of orphaned) {
|
|
152
|
-
if (!ref.componentRef.hostView.destroyed) {
|
|
153
|
-
ref.componentRef.destroy();
|
|
154
|
-
}
|
|
155
|
-
const idx = this.openedViewUuids.indexOf(ref.uuid);
|
|
156
|
-
if (idx >= 0) {
|
|
157
|
-
this.openedViewUuids.splice(idx, 1);
|
|
158
|
-
this.openedViewData.splice(idx, 1);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
this.embeddedViewRefs = this.embeddedViewRefs.filter((ref) => !orphaned.includes(ref));
|
|
162
|
-
}
|
|
163
|
-
getCompositeModel(containerUuid) {
|
|
164
|
-
const result = {};
|
|
165
|
-
const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
|
|
166
|
-
for (const child of children) {
|
|
167
|
-
result[child.uuid] = child.componentRef.instance.getModel();
|
|
168
|
-
Object.assign(result, this.getCompositeModel(child.uuid));
|
|
169
|
-
}
|
|
170
|
-
return result;
|
|
171
|
-
}
|
|
172
|
-
submitEmbeddedForms(containerUuid, validate) {
|
|
173
|
-
const allInvalidKeys = [];
|
|
174
|
-
const allInvalidNames = [];
|
|
175
|
-
const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
|
|
176
|
-
for (const child of children) {
|
|
177
|
-
const instance = child.componentRef.instance;
|
|
178
|
-
instance.submitForm(validate);
|
|
179
|
-
if (validate) {
|
|
180
|
-
const invalid = instance.getInvalidFields();
|
|
181
|
-
allInvalidKeys.push(...invalid.invalidFieldKeys);
|
|
182
|
-
allInvalidNames.push(...invalid.invalidFieldNames);
|
|
183
|
-
}
|
|
184
|
-
const nested = this.submitEmbeddedForms(child.uuid, validate);
|
|
185
|
-
allInvalidKeys.push(...nested.invalidFieldKeys);
|
|
186
|
-
allInvalidNames.push(...nested.invalidFieldNames);
|
|
187
|
-
}
|
|
188
|
-
return { invalidFieldKeys: allInvalidKeys, invalidFieldNames: allInvalidNames };
|
|
189
|
-
}
|
|
190
|
-
unregisterEmbeddedSlot(containerUuid, containerId) {
|
|
191
|
-
const innerMap = this.embeddedContainers.get(containerUuid);
|
|
192
|
-
if (innerMap) {
|
|
193
|
-
innerMap.delete(containerId);
|
|
194
|
-
if (innerMap.size === 0) {
|
|
195
|
-
this.embeddedContainers.delete(containerUuid);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
getEmbeddedSlot(containerUuid, containerId) {
|
|
200
|
-
return this.embeddedContainers.get(containerUuid)?.get(containerId)?.vcRef;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Create the view's component into its resolved slot. Returns false and queues
|
|
204
|
-
* the view if the slot is not registered yet (drained on registration).
|
|
205
|
-
*/
|
|
206
|
-
insertViewIntoSlot(view, component) {
|
|
207
|
-
const { containerUuid, containerId } = resolveSlot(view);
|
|
208
|
-
const vcRef = this.getEmbeddedSlot(containerUuid, containerId);
|
|
209
|
-
if (!vcRef) {
|
|
210
|
-
// Slot not registered yet: queue the view and drain it when its slot registers
|
|
211
|
-
// (registerEmbeddedSlot). The synchronous detectChanges below renders a freshly
|
|
212
|
-
// mounted parent's template in the same syncView pass, so a parent -> child ->
|
|
213
|
-
// grandchild chain (Home -> Main -> page) registers every slot immediately and
|
|
214
|
-
// the queue drains within the pass — even when restoreViews opens a child before
|
|
215
|
-
// its parent. (#28870)
|
|
216
|
-
this.pendingEmbeddedViews.push(view);
|
|
217
|
-
return false;
|
|
218
|
-
}
|
|
219
|
-
const componentRef = vcRef.createComponent(component);
|
|
220
|
-
componentRef.instance.uuid = view.uuid;
|
|
221
|
-
this.embeddedViewRefs.push({ uuid: view.uuid, containerUuid, containerId, componentRef });
|
|
222
|
-
// Render the freshly created component synchronously so its own embedded-slot
|
|
223
|
-
// directives (the router-outlet slot of a nested NORMAL view) register their
|
|
224
|
-
// containers immediately. This lets a parent -> child -> grandchild chain
|
|
225
|
-
// (e.g. Home -> Main -> page) mount in a single synchronous syncView pass
|
|
226
|
-
// instead of depending on a change-detection tick firing between each level.
|
|
227
|
-
// Without it the child cannot resolve its slot, queues into
|
|
228
|
-
// pendingEmbeddedViews, and the drain races the async updateViewContext
|
|
229
|
-
// round-trips — intermittently leaving a parent OPENED in backend bookkeeping
|
|
230
|
-
// but never mounted on the client, so its slot child stays blank. (#28870)
|
|
231
|
-
componentRef.changeDetectorRef.detectChanges();
|
|
232
|
-
componentRef.instance.run();
|
|
233
|
-
return true;
|
|
234
|
-
}
|
|
235
|
-
setActionDescriptors(actionDescriptors) {
|
|
236
|
-
this.actionDescriptors = actionDescriptors;
|
|
237
|
-
}
|
|
238
|
-
getActionDescriptors() {
|
|
239
|
-
if (!this.actionDescriptors) {
|
|
240
|
-
console.error('No action descriptors has been set to ViewContext.');
|
|
241
|
-
}
|
|
242
|
-
return this.actionDescriptors;
|
|
243
|
-
}
|
|
244
|
-
setViewHandlers(viewHandlers) {
|
|
245
|
-
this.viewHandlers = viewHandlers;
|
|
246
|
-
}
|
|
247
|
-
setViewApiErrors(viewApiErrors) {
|
|
248
|
-
this.smartViewContextApiErrors = viewApiErrors;
|
|
249
|
-
}
|
|
250
|
-
setMessageDialogName(messageDialogName) {
|
|
251
|
-
this.messageDialogname = messageDialogName;
|
|
252
|
-
this.viewHandlers.push({
|
|
253
|
-
name: messageDialogName,
|
|
254
|
-
component: MessageDialogComponent,
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
setUpUrlForViewService() {
|
|
258
|
-
this.view.configuration.basePath = this.url;
|
|
259
|
-
}
|
|
260
|
-
getModuleURL(module) {
|
|
261
|
-
if (!this.moduleUrlsByModule) {
|
|
262
|
-
throw new Error('ModulesMap does not exist.');
|
|
263
|
-
}
|
|
264
|
-
let moduleUrl = this.moduleUrlsByModule?.get(module);
|
|
265
|
-
if (!moduleUrl) {
|
|
266
|
-
throw new Error('ModuleUrl does not exist with the given module.');
|
|
267
|
-
}
|
|
268
|
-
return moduleUrl;
|
|
269
|
-
}
|
|
270
|
-
setModuleURL(modules) {
|
|
271
|
-
this.moduleUrlsByModule = modules;
|
|
272
|
-
}
|
|
273
|
-
setUrl(url) {
|
|
274
|
-
this.url = url + '/view';
|
|
275
|
-
this.setUpUrlForViewService();
|
|
276
|
-
}
|
|
277
|
-
async getAndSyncViewContext(uuid) {
|
|
278
|
-
if (!uuid) {
|
|
279
|
-
uuid = this.getViewContextUuid();
|
|
280
|
-
}
|
|
281
|
-
await this.getViewContext(uuid).then(async () => {
|
|
282
|
-
await this.syncView();
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
async getViewContext(uuid) {
|
|
286
|
-
this.viewContext = await this.view.getViewContext(uuid).toPromise();
|
|
287
|
-
if (!this.viewContext) {
|
|
288
|
-
throw new Error('ViewContext does not exist with the given uuid.');
|
|
289
|
-
}
|
|
290
|
-
return this.viewContext;
|
|
291
|
-
}
|
|
292
|
-
async getViewContextDataByPageName(pageName) {
|
|
293
|
-
if (!this.viewContext) {
|
|
294
|
-
await this.getViewContext(this.getViewContextUuid());
|
|
295
|
-
}
|
|
296
|
-
let pageUuid = this.getUuidOfPage(pageName);
|
|
297
|
-
let viewContextByPageName = this.viewContext?.views.find((view) => view.uuid === pageUuid);
|
|
298
|
-
if (!viewContextByPageName) {
|
|
299
|
-
throw new Error(`The ViewData of ${pageName} is not found!`);
|
|
300
|
-
}
|
|
301
|
-
return viewContextByPageName;
|
|
302
|
-
}
|
|
303
|
-
async updateViewContext(viewContextUpdate) {
|
|
304
|
-
viewContextUpdate.deviceInfo ??= {
|
|
305
|
-
deviceId: 'id',
|
|
306
|
-
userAgent: navigator.userAgent,
|
|
307
|
-
parameters: new Map(),
|
|
308
|
-
};
|
|
309
|
-
viewContextUpdate.deviceInfo.componentLibrary = this.componentLibrary;
|
|
310
|
-
viewContextUpdate.deviceInfo.themeName = this.themeService.currentTheme();
|
|
311
|
-
this.viewContext = await this.view.updateViewContext(viewContextUpdate).toPromise();
|
|
312
|
-
return this.viewContext;
|
|
313
|
-
}
|
|
314
|
-
clearSessionStorage() {
|
|
315
|
-
sessionStorage.clear();
|
|
316
|
-
this.clearEmbeddedViews();
|
|
317
|
-
this.openedViewData = [];
|
|
318
|
-
this.openedViewUuids = [];
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Tear down all slot-hosted view components on a viewContext reset (e.g. logout /
|
|
322
|
-
* viewcontext-lost). Without this the previous view tree stays mounted in the root
|
|
323
|
-
* slot and the new tree is appended alongside it. Destroying a parent cascades to
|
|
324
|
-
* its nested slot directives (which unregister their containers via ngOnDestroy),
|
|
325
|
-
* leaving only the host-owned root slot registered.
|
|
326
|
-
*/
|
|
327
|
-
clearEmbeddedViews() {
|
|
328
|
-
for (const ref of this.embeddedViewRefs) {
|
|
329
|
-
if (!ref.componentRef.hostView.destroyed) {
|
|
330
|
-
ref.componentRef.destroy();
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
this.embeddedViewRefs = [];
|
|
334
|
-
this.pendingEmbeddedViews = [];
|
|
335
|
-
}
|
|
336
|
-
async startViewContext() {
|
|
337
|
-
this.clearSessionStorage();
|
|
338
|
-
this.session.addHeaderParam({
|
|
339
|
-
headerName: this.viewContextUuidHeaderName,
|
|
340
|
-
value: '',
|
|
341
|
-
});
|
|
342
|
-
let newViewContext = await this.view
|
|
343
|
-
.createViewContext()
|
|
344
|
-
.toPromise();
|
|
345
|
-
if (!newViewContext) {
|
|
346
|
-
throw new Error('No ViewContext was created');
|
|
347
|
-
}
|
|
348
|
-
this.viewContext = newViewContext;
|
|
349
|
-
this.setViewContextUuid(newViewContext.uuid);
|
|
350
|
-
this.generation++;
|
|
351
|
-
return this.viewContext;
|
|
352
|
-
}
|
|
353
|
-
getGeneration() {
|
|
354
|
-
return this.generation;
|
|
355
|
-
}
|
|
356
|
-
async initialize(uuid) {
|
|
357
|
-
if (this.initializeRunning) {
|
|
358
|
-
return this.initializeRunning.toPromise();
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
this.initializeRunning = new SmartSubject(this._destroy$);
|
|
362
|
-
try {
|
|
363
|
-
if (this.viewHandlers.length === 0) {
|
|
364
|
-
throw new Error("There aren't any viewHandlers in SmartViewContextService! Provide some to use its functions.");
|
|
365
|
-
}
|
|
366
|
-
if (!this.messageDialogname) {
|
|
367
|
-
throw new Error('The messageDialogName provided by the backend has not been set.');
|
|
368
|
-
}
|
|
369
|
-
if (uuid) {
|
|
370
|
-
this.setViewContextUuid(uuid);
|
|
371
|
-
try {
|
|
372
|
-
await this.getViewContext(uuid);
|
|
373
|
-
}
|
|
374
|
-
catch (err) {
|
|
375
|
-
await this.startViewContext();
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
else {
|
|
379
|
-
await this.startViewContext();
|
|
380
|
-
}
|
|
381
|
-
return this.viewContext;
|
|
382
|
-
}
|
|
383
|
-
finally {
|
|
384
|
-
this.initializeRunning.next(this.viewContext);
|
|
385
|
-
this.initializeRunning.complete();
|
|
386
|
-
this.initializeRunning = undefined;
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
async initViewContext() {
|
|
391
|
-
let uuid;
|
|
392
|
-
try {
|
|
393
|
-
uuid = this.getViewContextUuid();
|
|
394
|
-
}
|
|
395
|
-
catch (error) {
|
|
396
|
-
await this.initialize();
|
|
397
|
-
uuid = this.getViewContextUuid();
|
|
398
|
-
}
|
|
399
|
-
await this.initialize(uuid);
|
|
400
|
-
await this.restoreViews(uuid);
|
|
401
|
-
await this.getAndSyncViewContext();
|
|
402
|
-
}
|
|
403
|
-
/**
|
|
404
|
-
* Hydrates the view-context state from an already-existing UUID provided
|
|
405
|
-
* externally (e.g. by a native mobile shell via URL fragment). Unlike
|
|
406
|
-
* `initialize(uuid)`, this method does NOT fall back to creating a fresh
|
|
407
|
-
* viewContext if the backend rejects the UUID — the caller is expected to
|
|
408
|
-
* surface the failure (typically via the bootstrap's `onStartError` hook).
|
|
409
|
-
*/
|
|
410
|
-
async initFromExistingViewContext(uuid) {
|
|
411
|
-
this.setViewContextUuid(uuid);
|
|
412
|
-
await this.getViewContext(uuid);
|
|
413
|
-
await this.restoreViews(uuid);
|
|
414
|
-
}
|
|
415
|
-
async initNewViewContext() {
|
|
416
|
-
if (this.initiNewContextRunning) {
|
|
417
|
-
return this.initiNewContextRunning.toPromise();
|
|
418
|
-
}
|
|
419
|
-
this.initiNewContextRunning = new SmartSubject(this._destroy$);
|
|
420
|
-
try {
|
|
421
|
-
await this.startViewContext();
|
|
422
|
-
let uuid = this.getViewContextUuid();
|
|
423
|
-
await this.initialize(uuid);
|
|
424
|
-
await this.restoreViews(uuid);
|
|
425
|
-
}
|
|
426
|
-
finally {
|
|
427
|
-
this.initiNewContextRunning.next();
|
|
428
|
-
this.initiNewContextRunning.complete();
|
|
429
|
-
this.initiNewContextRunning = undefined;
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
openView(view) {
|
|
433
|
-
let alreadyOpened = this.openedViewUuids.some((uuid) => uuid === view.uuid);
|
|
434
|
-
if (alreadyOpened)
|
|
435
|
-
return undefined;
|
|
436
|
-
const viewHandler = resolveViewHandler(this.viewHandlers, this.defaultComponents, view);
|
|
437
|
-
if (!viewHandler) {
|
|
438
|
-
throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName} (componentName: ${view.componentName})`);
|
|
439
|
-
}
|
|
440
|
-
if (view.type === ViewType.DIALOG) {
|
|
441
|
-
if (!viewHandler.component) {
|
|
442
|
-
throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
|
|
443
|
-
}
|
|
444
|
-
let refIsAlradyAdded = this.dialogRefs.some((ref) => ref.uuid === view.uuid);
|
|
445
|
-
if (!refIsAlradyAdded) {
|
|
446
|
-
let dialogRef;
|
|
447
|
-
try {
|
|
448
|
-
this.openedViewUuids.push(view.uuid);
|
|
449
|
-
this.openedViewData.push(view);
|
|
450
|
-
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
451
|
-
dialogRef = this.dialog.openComponentAsDialog(viewHandler.component, viewHandler.name, view.uuid);
|
|
452
|
-
}
|
|
453
|
-
finally {
|
|
454
|
-
const index = this.openedViewUuids.indexOf(view.uuid);
|
|
455
|
-
if (index >= 0) {
|
|
456
|
-
this.openedViewUuids.splice(index, 1);
|
|
457
|
-
this.openedViewData.splice(index, 1);
|
|
458
|
-
this.clearUuidOfPage(view.viewName, viewHandler.componentName);
|
|
459
|
-
}
|
|
460
|
-
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
461
|
-
}
|
|
462
|
-
let dialogDisableClose = true;
|
|
463
|
-
let isMessageDialog = view.viewName === this.messageDialogname;
|
|
464
|
-
if (!isMessageDialog) {
|
|
465
|
-
try {
|
|
466
|
-
dialogDisableClose = this.inject.get(DIALOG_DISABLE_CLOSE);
|
|
467
|
-
}
|
|
468
|
-
catch {
|
|
469
|
-
console.error('Error during reading DIALOG_DISABLE_CLOSE');
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
if (dialogRef instanceof MatDialogRef) {
|
|
473
|
-
dialogRef.disableClose = dialogDisableClose;
|
|
474
|
-
// if (isMessageDialog) {
|
|
475
|
-
// if (view.message?.options && view.message.options.length) {
|
|
476
|
-
// }
|
|
477
|
-
// }
|
|
478
|
-
if (!dialogDisableClose) {
|
|
479
|
-
dialogRef
|
|
480
|
-
.afterClosed()
|
|
481
|
-
.pipe(takeUntil(this._destroy$))
|
|
482
|
-
.subscribe(() => {
|
|
483
|
-
this.performAction(view.uuid, { code: DefaultUiActionCode_CLOSE, params: {} });
|
|
484
|
-
});
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
else if (dialogRef instanceof DynamicDialogRef) {
|
|
488
|
-
if (!dialogDisableClose) {
|
|
489
|
-
dialogRef.onDestroy.pipe(takeUntil(this._destroy$)).subscribe(() => {
|
|
490
|
-
this.performAction(view.uuid, { code: DefaultUiActionCode_CLOSE, params: {} });
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
this.dialogRefs.push({
|
|
495
|
-
uuid: view.uuid,
|
|
496
|
-
dialogRef,
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
else if (view.type === ViewType.NORMAL) {
|
|
501
|
-
if (!viewHandler.component) {
|
|
502
|
-
throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
|
|
503
|
-
}
|
|
504
|
-
// COMPATIBILITY SHIM (#28870, intentional): some child services (SmarttreeGenericService,
|
|
505
|
-
// SmartFilterEditorService) and generic components (SearchPageComponent, GenericPageComponent)
|
|
506
|
-
// still resolve their view uuid via the pageName -> getUuidOfPage(sessionStorage) indirection
|
|
507
|
-
// in their CONSTRUCTOR, which runs inside createComponent() below — before openView's normal
|
|
508
|
-
// bookkeeping. So the mapping must be written here, ahead of component creation. The proper
|
|
509
|
-
// fix (feed those consumers the injected uuid + defer their init) is deferred consumer plumbing;
|
|
510
|
-
// until then this write keeps the indirection correct in the slot world.
|
|
511
|
-
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
512
|
-
// A NORMAL view with no containerUuid lands in the host root slot (resolveSlot maps
|
|
513
|
-
// it to ROOT_CONTAINER_UUID); if no slot is registered yet it queues and drains later.
|
|
514
|
-
const inserted = this.insertViewIntoSlot(view, viewHandler.component);
|
|
515
|
-
if (!inserted)
|
|
516
|
-
return undefined;
|
|
517
|
-
}
|
|
518
|
-
else if (view.type === ViewType.EMBEDDED) {
|
|
519
|
-
if (!viewHandler.component) {
|
|
520
|
-
throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
|
|
521
|
-
}
|
|
522
|
-
// Write the page-uuid mapping ahead of component creation so constructor-time
|
|
523
|
-
// and nested getUuidOfPage(viewName) consumers (filter, tree) resolve. The
|
|
524
|
-
// page.<viewName> key is distinct per view, so it never collides. The
|
|
525
|
-
// component.<componentName> reverse key CAN be overwritten by another
|
|
526
|
-
// concurrent dynamic view of the same default component, but it is read only
|
|
527
|
-
// synchronously in the constructor (right after this write) and slot views
|
|
528
|
-
// load via the injected _uuid afterwards, so the overwrite never mis-resolves
|
|
529
|
-
// at runtime. (#28870)
|
|
530
|
-
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
531
|
-
const inserted = this.insertViewIntoSlot(view, viewHandler.component);
|
|
532
|
-
if (!inserted)
|
|
533
|
-
return undefined;
|
|
534
|
-
}
|
|
535
|
-
else {
|
|
536
|
-
throw new Error('The type of the view and its viewHandler is not the same!');
|
|
537
|
-
}
|
|
538
|
-
view.state = ViewState.OPENED;
|
|
539
|
-
this.openedViewUuids.push(view.uuid);
|
|
540
|
-
this.openedViewData.push(view);
|
|
541
|
-
if (view.type !== ViewType.EMBEDDED) {
|
|
542
|
-
this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
|
|
543
|
-
this.uuidOfPageHasBeenChanged.next(view.viewName);
|
|
544
|
-
}
|
|
545
|
-
return {
|
|
546
|
-
state: ViewState.OPENED,
|
|
547
|
-
uuid: view.uuid,
|
|
548
|
-
};
|
|
549
|
-
}
|
|
550
|
-
closeView(view) {
|
|
551
|
-
const viewHandler = resolveViewHandler(this.viewHandlers, this.defaultComponents, view);
|
|
552
|
-
if (!viewHandler) {
|
|
553
|
-
throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName} (componentName: ${view.componentName})`);
|
|
554
|
-
}
|
|
555
|
-
const updates = [];
|
|
556
|
-
if (view.type === ViewType.DIALOG) {
|
|
557
|
-
let dialogRef = this.dialogRefs.find((dialogRef) => dialogRef.uuid === view.uuid);
|
|
558
|
-
if (dialogRef) {
|
|
559
|
-
dialogRef.dialogRef.close();
|
|
560
|
-
let index = this.dialogRefs.indexOf(dialogRef);
|
|
561
|
-
this.dialogRefs.splice(index, 1);
|
|
562
|
-
}
|
|
563
|
-
else {
|
|
564
|
-
// console.log('DialogRef is not found by uuid.');
|
|
565
|
-
}
|
|
566
|
-
updates.push(...this.cleanupEmbeddedChildren(view.uuid));
|
|
567
|
-
}
|
|
568
|
-
else if (view.type === ViewType.NORMAL) {
|
|
569
|
-
// Destroy nested children first, then the view's own slot component.
|
|
570
|
-
// destroyViewRef is a no-op for the legacy route-rendered (rootless) case.
|
|
571
|
-
updates.push(...this.cleanupEmbeddedChildren(view.uuid));
|
|
572
|
-
this.destroyViewRef(view.uuid);
|
|
573
|
-
}
|
|
574
|
-
else if (view.type === ViewType.EMBEDDED) {
|
|
575
|
-
this.destroyViewRef(view.uuid);
|
|
576
|
-
}
|
|
577
|
-
else {
|
|
578
|
-
throw new Error('The type of the view and its viewHandler is not the same!');
|
|
579
|
-
}
|
|
580
|
-
view.state = ViewState.CLOSED;
|
|
581
|
-
const index = this.openedViewUuids.indexOf(view.uuid);
|
|
582
|
-
if (index >= 0) {
|
|
583
|
-
this.openedViewUuids.splice(index, 1);
|
|
584
|
-
this.openedViewData.splice(index, 1);
|
|
585
|
-
// Clear for every type: openView now writes the page-uuid mapping for
|
|
586
|
-
// EMBEDDED views too (#28870), so the clear must be symmetric to avoid a
|
|
587
|
-
// stale sessionStorage entry. clearUuidOfPage is a no-op for keys never
|
|
588
|
-
// written, so this stays safe for the legacy rootless case.
|
|
589
|
-
this.clearUuidOfPage(view.viewName, viewHandler.componentName);
|
|
590
|
-
}
|
|
591
|
-
updates.push({
|
|
592
|
-
state: ViewState.CLOSED,
|
|
593
|
-
uuid: view.uuid,
|
|
594
|
-
});
|
|
595
|
-
return updates;
|
|
596
|
-
}
|
|
597
|
-
cleanupEmbeddedChildren(containerUuid) {
|
|
598
|
-
const updates = [];
|
|
599
|
-
const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
|
|
600
|
-
for (const child of children) {
|
|
601
|
-
child.componentRef.destroy();
|
|
602
|
-
updates.push({ state: ViewState.CLOSED, uuid: child.uuid });
|
|
603
|
-
}
|
|
604
|
-
this.embeddedViewRefs = this.embeddedViewRefs.filter((ref) => ref.containerUuid !== containerUuid);
|
|
605
|
-
this.pendingEmbeddedViews = this.pendingEmbeddedViews.filter((v) => v.containerUuid !== containerUuid);
|
|
606
|
-
this.embeddedContainers.delete(containerUuid);
|
|
607
|
-
return updates;
|
|
608
|
-
}
|
|
609
|
-
/** Destroy the component for a view living in a slot, if present (no-op for route-rendered views). */
|
|
610
|
-
destroyViewRef(uuid) {
|
|
611
|
-
const refIndex = this.embeddedViewRefs.findIndex((ref) => ref.uuid === uuid);
|
|
612
|
-
if (refIndex >= 0) {
|
|
613
|
-
this.embeddedViewRefs[refIndex].componentRef.destroy();
|
|
614
|
-
this.embeddedViewRefs.splice(refIndex, 1);
|
|
615
|
-
}
|
|
616
|
-
this.pendingEmbeddedViews = this.pendingEmbeddedViews.filter((v) => v.uuid !== uuid);
|
|
617
|
-
}
|
|
618
|
-
async sendViewContextUpdates(updatesToSend) {
|
|
619
|
-
const updates = [];
|
|
620
|
-
updatesToSend.forEach((update) => {
|
|
621
|
-
if (update !== undefined && update !== null)
|
|
622
|
-
updates.push(update);
|
|
623
|
-
});
|
|
624
|
-
if (updates.length > 0) {
|
|
625
|
-
await this.updateViewContext({
|
|
626
|
-
updates,
|
|
627
|
-
uuid: this.viewContext?.uuid,
|
|
628
|
-
});
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
async restoreViews(uuid) {
|
|
632
|
-
const updates = [];
|
|
633
|
-
if (!this.viewContext) {
|
|
634
|
-
await this.getViewContext(uuid);
|
|
635
|
-
}
|
|
636
|
-
this.viewContext.views.filter((view) => view.state === ViewState.OPENED || view.state === ViewState.TO_OPEN).map((view) => {
|
|
637
|
-
const update = this.openView(view);
|
|
638
|
-
if (update) {
|
|
639
|
-
updates.push(update);
|
|
640
|
-
}
|
|
641
|
-
});
|
|
642
|
-
await this.sendViewContextUpdates(updates);
|
|
643
|
-
}
|
|
644
|
-
reuseEnabled() {
|
|
645
|
-
try {
|
|
646
|
-
const value = this.inject.get(REUSE_ROUTER_SLOT_COMPONENT);
|
|
647
|
-
return value !== false; // default ON when unset/null
|
|
648
|
-
}
|
|
649
|
-
catch {
|
|
650
|
-
return true;
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
executeReuse(oldView, newView) {
|
|
654
|
-
const ref = this.embeddedViewRefs.find((r) => r.uuid === oldView.uuid);
|
|
655
|
-
if (!ref) {
|
|
656
|
-
// No live component to reuse (e.g. was route-rendered) — fall back to close + open.
|
|
657
|
-
const updates = [...this.closeView(oldView)];
|
|
658
|
-
const opened = this.openView(newView);
|
|
659
|
-
if (opened)
|
|
660
|
-
updates.push(opened);
|
|
661
|
-
return updates;
|
|
662
|
-
}
|
|
663
|
-
// The reused parent is logically a fresh page (new uuid); its previous embedded
|
|
664
|
-
// children do not carry over (the backend leaves them keyed under the old parent
|
|
665
|
-
// uuid). Tear them down here and report them CLOSED.
|
|
666
|
-
const childUpdates = this.cleanupEmbeddedChildren(oldView.uuid);
|
|
667
|
-
ref.componentRef.instance.uuid = newView.uuid; // setter runs unfollow(old)/follow(new)
|
|
668
|
-
ref.uuid = newView.uuid;
|
|
669
|
-
const oldIdx = this.openedViewUuids.indexOf(oldView.uuid);
|
|
670
|
-
if (oldIdx >= 0) {
|
|
671
|
-
this.openedViewUuids.splice(oldIdx, 1);
|
|
672
|
-
this.openedViewData.splice(oldIdx, 1);
|
|
673
|
-
}
|
|
674
|
-
this.openedViewUuids.push(newView.uuid);
|
|
675
|
-
this.openedViewData.push(newView);
|
|
676
|
-
ref.componentRef.instance.run();
|
|
677
|
-
oldView.state = ViewState.CLOSED;
|
|
678
|
-
newView.state = ViewState.OPENED;
|
|
679
|
-
// Mirror the normal openView tail so getUuidOfPage consumers (e.g. trees) resolve the new uuid.
|
|
680
|
-
const viewHandler = resolveViewHandler(this.viewHandlers, this.defaultComponents, newView);
|
|
681
|
-
this.setUuidOfPage(newView.viewName, newView.uuid, viewHandler?.componentName);
|
|
682
|
-
this.uuidOfPageHasBeenChanged.next(newView.viewName);
|
|
683
|
-
return [
|
|
684
|
-
...childUpdates,
|
|
685
|
-
{ state: ViewState.CLOSED, uuid: oldView.uuid },
|
|
686
|
-
{ state: ViewState.OPENED, uuid: newView.uuid },
|
|
687
|
-
];
|
|
688
|
-
}
|
|
689
|
-
async syncView() {
|
|
690
|
-
const updates = [];
|
|
691
|
-
const ops = buildViewOps(this.viewContext?.views ?? [], this.reuseEnabled());
|
|
692
|
-
for (const op of ops) {
|
|
693
|
-
if (op.kind === 'open') {
|
|
694
|
-
updates.push(this.openView(op.view));
|
|
695
|
-
}
|
|
696
|
-
else if (op.kind === 'close') {
|
|
697
|
-
updates.push(...this.closeView(op.view));
|
|
698
|
-
}
|
|
699
|
-
else {
|
|
700
|
-
updates.push(...this.executeReuse(op.oldView, op.newView));
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
const viewDataToClose = this.openedViewData.filter((viewData) => !this.viewContext?.views
|
|
704
|
-
.flatMap((viewData) => viewData.uuid)
|
|
705
|
-
.includes(viewData.uuid));
|
|
706
|
-
if (viewDataToClose?.length) {
|
|
707
|
-
viewDataToClose.map((viewData) => {
|
|
708
|
-
updates.push(...this.closeView(viewData));
|
|
709
|
-
});
|
|
710
|
-
}
|
|
711
|
-
this.viewContext?.links?.map((data) => {
|
|
712
|
-
const link = document.createElement('a');
|
|
713
|
-
let target = '_blank'; // default
|
|
714
|
-
switch (data.target ?? LinkTargetEnum.BLANK) {
|
|
715
|
-
case 'SELF':
|
|
716
|
-
target = '_self';
|
|
717
|
-
break;
|
|
718
|
-
case 'BLANK':
|
|
719
|
-
target = '_blank';
|
|
720
|
-
break;
|
|
721
|
-
case 'PARENT':
|
|
722
|
-
target = '_parent';
|
|
723
|
-
break;
|
|
724
|
-
case 'TOP':
|
|
725
|
-
target = '_top';
|
|
726
|
-
break;
|
|
727
|
-
}
|
|
728
|
-
link.setAttribute('target', target);
|
|
729
|
-
link.setAttribute('href', data.url);
|
|
730
|
-
if (data.download) {
|
|
731
|
-
link.setAttribute('download', data.filename ?? '');
|
|
732
|
-
}
|
|
733
|
-
document.body.appendChild(link);
|
|
734
|
-
link.click();
|
|
735
|
-
link.remove();
|
|
736
|
-
});
|
|
737
|
-
this.startDownloadsFiles(this.viewContext?.downloads || []);
|
|
738
|
-
const clipboardText = this.viewContext?.clipboardData
|
|
739
|
-
?.map((cd) => cd.text || '')
|
|
740
|
-
.join('');
|
|
741
|
-
if (clipboardText) {
|
|
742
|
-
const clipboard = navigator.clipboard;
|
|
743
|
-
// available only in secure contexts.
|
|
744
|
-
if (clipboard) {
|
|
745
|
-
try {
|
|
746
|
-
clipboard
|
|
747
|
-
.writeText(clipboardText)
|
|
748
|
-
.catch((e) => console.error('Failed to copy text to clipboard', e));
|
|
749
|
-
}
|
|
750
|
-
catch (e) {
|
|
751
|
-
console.error('Error accessing clipboard', e);
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
await this.sendViewContextUpdates(updates);
|
|
756
|
-
this.viewContextHasBeenSynced.next();
|
|
757
|
-
}
|
|
758
|
-
async startDownloadsFiles(downloads) {
|
|
759
|
-
for (const file of downloads) {
|
|
760
|
-
try {
|
|
761
|
-
let blob = await this.downloadResource(file.uuid, file.identifier);
|
|
762
|
-
let url = URL.createObjectURL(blob);
|
|
763
|
-
const link = document.createElement('a');
|
|
764
|
-
link.setAttribute('target', '_blank');
|
|
765
|
-
link.setAttribute('href', url);
|
|
766
|
-
link.setAttribute('download', file.filename);
|
|
767
|
-
document.body.appendChild(link);
|
|
768
|
-
link.click();
|
|
769
|
-
link.remove();
|
|
770
|
-
}
|
|
771
|
-
catch (e) {
|
|
772
|
-
console.error('Error downloading file', e);
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
setViewContextUuid(uuid) {
|
|
777
|
-
sessionStorage.setItem(this.viewContextUuidName, uuid);
|
|
778
|
-
this.session.addHeaderParam({
|
|
779
|
-
headerName: this.viewContextUuidHeaderName,
|
|
780
|
-
value: uuid,
|
|
781
|
-
});
|
|
782
|
-
}
|
|
783
|
-
getViewContextUuid() {
|
|
784
|
-
let viewContextUuid = sessionStorage.getItem(this.viewContextUuidName);
|
|
785
|
-
if (!viewContextUuid) {
|
|
786
|
-
throw new Error('View context is not initialized!');
|
|
787
|
-
}
|
|
788
|
-
return viewContextUuid;
|
|
789
|
-
}
|
|
790
|
-
hasViewContextUuid() {
|
|
791
|
-
let viewContextUuid = sessionStorage.getItem(this.viewContextUuidName);
|
|
792
|
-
return viewContextUuid !== null && viewContextUuid !== undefined;
|
|
793
|
-
}
|
|
794
|
-
setUuidOfPage(pageName, uuid, componentName) {
|
|
795
|
-
sessionStorage.setItem(this.pageNamePrefix + pageName, uuid);
|
|
796
|
-
if (componentName) {
|
|
797
|
-
sessionStorage.setItem(this.componentNamePrefix + componentName, pageName);
|
|
798
|
-
}
|
|
799
|
-
}
|
|
800
|
-
clearUuidOfPage(pageName, componentName) {
|
|
801
|
-
sessionStorage.removeItem(this.pageNamePrefix + pageName);
|
|
802
|
-
if (componentName) {
|
|
803
|
-
sessionStorage.removeItem(this.componentNamePrefix + componentName);
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
getUuidOfPage(pageName) {
|
|
807
|
-
let uuid = sessionStorage.getItem(this.pageNamePrefix + pageName);
|
|
808
|
-
if (!uuid) {
|
|
809
|
-
throw new Error(`The uuid of ${pageName} is not available.`);
|
|
810
|
-
}
|
|
811
|
-
return uuid;
|
|
812
|
-
}
|
|
813
|
-
getPageNameOfComponent(componentName) {
|
|
814
|
-
let pageName = sessionStorage.getItem(this.componentNamePrefix + componentName);
|
|
815
|
-
if (!pageName) {
|
|
816
|
-
throw new Error(`The pageName of ${componentName} is not available.`);
|
|
817
|
-
}
|
|
818
|
-
return pageName;
|
|
819
|
-
}
|
|
820
|
-
async message(messageData, messageResult) {
|
|
821
|
-
return await this.handlePerformActionResponse(await this.view
|
|
822
|
-
.message(messageData.viewUuid ?? '', messageData.uuid, messageResult)
|
|
823
|
-
.toPromise());
|
|
824
|
-
// in future use this.apiQueueService.addToQueue
|
|
825
|
-
}
|
|
826
|
-
async getSmartViewContextApiErrorByCode(code) {
|
|
827
|
-
let buttonLabel;
|
|
828
|
-
let dialogTitle;
|
|
829
|
-
let message;
|
|
830
|
-
if (this.translateService) {
|
|
831
|
-
buttonLabel = await this.translateService
|
|
832
|
-
.get(SmartViewContextErrorDialogButtonLabel)
|
|
833
|
-
.toPromise();
|
|
834
|
-
dialogTitle = await this.translateService.get(SmartViewContextErrorDialogTitle).toPromise();
|
|
835
|
-
message = await this.translateService.get(SmartViewContextErrorDialogMessage).toPromise();
|
|
836
|
-
}
|
|
837
|
-
else {
|
|
838
|
-
buttonLabel = 'Ok';
|
|
839
|
-
dialogTitle = 'Hiba';
|
|
840
|
-
message = 'An error has occured.';
|
|
841
|
-
}
|
|
842
|
-
if (!this.smartViewContextApiErrors) {
|
|
843
|
-
return {
|
|
844
|
-
code,
|
|
845
|
-
message,
|
|
846
|
-
buttonLabel,
|
|
847
|
-
dialogTitle,
|
|
848
|
-
};
|
|
849
|
-
}
|
|
850
|
-
let apiErrorsWithCode = this.smartViewContextApiErrors.viewContextApiErrors.filter((apiError) => {
|
|
851
|
-
return apiError.code === code;
|
|
852
|
-
});
|
|
853
|
-
if (!apiErrorsWithCode || (apiErrorsWithCode && !apiErrorsWithCode.length)) {
|
|
854
|
-
console.error(`SmartViewContextApiError with code ${code} could not be found.`);
|
|
855
|
-
return {
|
|
856
|
-
code,
|
|
857
|
-
message,
|
|
858
|
-
buttonLabel,
|
|
859
|
-
dialogTitle,
|
|
860
|
-
};
|
|
861
|
-
}
|
|
862
|
-
return apiErrorsWithCode[0];
|
|
863
|
-
}
|
|
864
|
-
async getViewConstraint(uuid) {
|
|
865
|
-
let viewConstraintResponse = await this.view.getViewConstraint(uuid).toPromise();
|
|
866
|
-
if (!viewConstraintResponse)
|
|
867
|
-
throw new Error('Could not get ViewConstraint with the given uuid.');
|
|
868
|
-
return viewConstraintResponse;
|
|
869
|
-
}
|
|
870
|
-
async showPublishedView(channel, uuid) {
|
|
871
|
-
this.isOpeningSmartLink = true;
|
|
872
|
-
await this.session.initialize();
|
|
873
|
-
// TODO init view context automatically
|
|
874
|
-
// await this.initialize();
|
|
875
|
-
await this.initViewContext();
|
|
876
|
-
this.openSmartLink.next([channel, uuid]);
|
|
877
|
-
await this.openSmartLink.toPromise();
|
|
878
|
-
await this.view.showPublishedView(channel, uuid).toPromise();
|
|
879
|
-
await this.getAndSyncViewContext();
|
|
880
|
-
this.isOpeningSmartLink = false;
|
|
881
|
-
}
|
|
882
|
-
async downloadResource(uuid, item) {
|
|
883
|
-
return await this.view.downloadItem(uuid, item).toPromise();
|
|
884
|
-
}
|
|
885
|
-
async performAction(uuid, uiActionRequest) {
|
|
886
|
-
return await this._performAction({
|
|
887
|
-
uuid,
|
|
888
|
-
uiActionRequest,
|
|
889
|
-
});
|
|
890
|
-
// const isCompleted = new Subject<void>();
|
|
891
|
-
// this.apiQueueService.addToQueue({
|
|
892
|
-
// callback: this._performAction.bind(this),
|
|
893
|
-
// config: {
|
|
894
|
-
// uuid,
|
|
895
|
-
// uiActionRequest,
|
|
896
|
-
// },
|
|
897
|
-
// isCompleted,
|
|
898
|
-
// });
|
|
899
|
-
// return await isCompleted.toPromise();
|
|
900
|
-
}
|
|
901
|
-
async performWidgetAction(uuid, widgetId, nodeId, uiActionRequest) {
|
|
902
|
-
return await this._performWidgetAction({ uuid, widgetId, nodeId, uiActionRequest });
|
|
903
|
-
// const isCompleted = new Subject<void>();
|
|
904
|
-
// this.apiQueueService.addToQueue({
|
|
905
|
-
// callback: this._performWidgetAction.bind(this),
|
|
906
|
-
// config: {
|
|
907
|
-
// uuid,
|
|
908
|
-
// widgetId,
|
|
909
|
-
// nodeId,
|
|
910
|
-
// uiActionRequest,
|
|
911
|
-
// },
|
|
912
|
-
// isCompleted,
|
|
913
|
-
// });
|
|
914
|
-
// return await isCompleted.toPromise();
|
|
915
|
-
}
|
|
916
|
-
async performWidgetMainAction(uuid, widgetId, uiActionRequest) {
|
|
917
|
-
return await this._performWidgetMainAction({ uuid, widgetId, uiActionRequest });
|
|
918
|
-
// const isCompleted = new Subject<void>();
|
|
919
|
-
// this.apiQueueService.addToQueue({
|
|
920
|
-
// callback: this._performWidgetMainAction.bind(this),
|
|
921
|
-
// config: {
|
|
922
|
-
// uuid,
|
|
923
|
-
// widgetId,
|
|
924
|
-
// uiActionRequest,
|
|
925
|
-
// },
|
|
926
|
-
// isCompleted,
|
|
927
|
-
// });
|
|
928
|
-
// return await isCompleted.toPromise();
|
|
929
|
-
}
|
|
930
|
-
async performUploadAction(uuid, uiActionRequest, param, content) {
|
|
931
|
-
this._performUploadAction({
|
|
932
|
-
uuid,
|
|
933
|
-
uiActionRequest,
|
|
934
|
-
param,
|
|
935
|
-
content,
|
|
936
|
-
});
|
|
937
|
-
}
|
|
938
|
-
async performUploadMultipleAction(uuid, uiActionRequest, param, content) {
|
|
939
|
-
this._performUploadMultipleAction({
|
|
940
|
-
uuid,
|
|
941
|
-
uiActionRequest,
|
|
942
|
-
param,
|
|
943
|
-
content,
|
|
944
|
-
});
|
|
945
|
-
}
|
|
946
|
-
async dataChanged(uuid, dataChange) {
|
|
947
|
-
return await this._dataChanged({ uuid, dataChange });
|
|
948
|
-
// const isCompleted = new Subject<void>();
|
|
949
|
-
// this.apiQueueService.addToQueue(
|
|
950
|
-
// {
|
|
951
|
-
// callback: this._dataChanged.bind(this),
|
|
952
|
-
// config: {
|
|
953
|
-
// uuid,
|
|
954
|
-
// dataChange,
|
|
955
|
-
// },
|
|
956
|
-
// isCompleted,
|
|
957
|
-
// },
|
|
958
|
-
// true
|
|
959
|
-
// );
|
|
960
|
-
// return await isCompleted.toPromise();
|
|
961
|
-
}
|
|
962
|
-
async _performAction(config) {
|
|
963
|
-
return await this.handlePerformActionResponse(await this.view.performAction(config.uuid, config.uiActionRequest).toPromise());
|
|
964
|
-
}
|
|
965
|
-
async _performWidgetAction(config) {
|
|
966
|
-
return await this.handlePerformActionResponse(await this.view
|
|
967
|
-
.performWidgetAction(config.uuid, config.widgetId, config.nodeId, config.uiActionRequest)
|
|
968
|
-
.toPromise());
|
|
969
|
-
}
|
|
970
|
-
async _performWidgetMainAction(config) {
|
|
971
|
-
return await this.handlePerformActionResponse(await this.view
|
|
972
|
-
.performWidgetMainAction(config.uuid, config.widgetId, config.uiActionRequest)
|
|
973
|
-
.toPromise());
|
|
974
|
-
}
|
|
975
|
-
async _performUploadAction(config) {
|
|
976
|
-
return await this.handlePerformActionResponse(await this.view
|
|
977
|
-
.uploadAction(config.uuid, JSON.stringify(config.uiActionRequest), config.param, config.content)
|
|
978
|
-
.toPromise());
|
|
979
|
-
}
|
|
980
|
-
async _performUploadMultipleAction(config) {
|
|
981
|
-
return await this.handlePerformActionResponse(await this.view
|
|
982
|
-
.uploadMultipleAction(config.uuid, JSON.stringify(config.uiActionRequest), config.param, config.content)
|
|
983
|
-
.toPromise());
|
|
984
|
-
}
|
|
985
|
-
async _dataChanged(config) {
|
|
986
|
-
return await this.handlePerformActionResponse(await this.view.dataChanged(config.uuid, config.dataChange).toPromise());
|
|
987
|
-
}
|
|
988
|
-
async handlePerformActionResponse(viewContextChange) {
|
|
989
|
-
this.viewContext = viewContextChange?.viewContext;
|
|
990
|
-
await this.syncView();
|
|
991
|
-
if (viewContextChange?.changes) {
|
|
992
|
-
this.handleChanges(viewContextChange.changes);
|
|
993
|
-
}
|
|
994
|
-
return viewContextChange?.result;
|
|
995
|
-
}
|
|
996
|
-
handleChanges(changes) {
|
|
997
|
-
changes.forEach((componentModelChange) => {
|
|
998
|
-
let detectChange = this.smartApiClients.get(componentModelChange.uuid);
|
|
999
|
-
if (detectChange) {
|
|
1000
|
-
detectChange.next(componentModelChange);
|
|
1001
|
-
}
|
|
1002
|
-
});
|
|
1003
|
-
}
|
|
1004
|
-
async load(uuid) {
|
|
1005
|
-
return await this.view.getComponentModel(uuid).toPromise();
|
|
1006
|
-
}
|
|
1007
|
-
async load2(uuid) {
|
|
1008
|
-
let change = await this.view.getComponentModel2(uuid).toPromise();
|
|
1009
|
-
this.handlePerformActionResponse(change);
|
|
1010
|
-
return change;
|
|
1011
|
-
}
|
|
1012
|
-
getCurrentViewContext() {
|
|
1013
|
-
return this.viewContext;
|
|
1014
|
-
}
|
|
1015
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, deps: [{ token: i1.ViewService }, { token: i2.SmartSessionService }, { token: i3.SmartViewContextDialogService }, { token: ApiQueueService }, { token: i4.ThemeService }, { token: i0.Injector }, { token: COMPONENT_LIBRARY, optional: true }, { token: SMART_DEFAULT_VIEW_COMPONENTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1016
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, providedIn: 'root' }); }
|
|
1017
|
-
}
|
|
1018
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, decorators: [{
|
|
1019
|
-
type: Injectable,
|
|
1020
|
-
args: [{
|
|
1021
|
-
providedIn: 'root',
|
|
1022
|
-
}]
|
|
1023
|
-
}], ctorParameters: () => [{ type: i1.ViewService }, { type: i2.SmartSessionService }, { type: i3.SmartViewContextDialogService }, { type: ApiQueueService }, { type: i4.ThemeService }, { type: i0.Injector }, { type: i5.ComponentLibrary, decorators: [{
|
|
1024
|
-
type: Inject,
|
|
1025
|
-
args: [COMPONENT_LIBRARY]
|
|
1026
|
-
}, {
|
|
1027
|
-
type: Optional
|
|
1028
|
-
}] }, { type: undefined, decorators: [{
|
|
1029
|
-
type: Inject,
|
|
1030
|
-
args: [SMART_DEFAULT_VIEW_COMPONENTS]
|
|
1031
|
-
}, {
|
|
1032
|
-
type: Optional
|
|
1033
|
-
}] }] });
|
|
1034
|
-
export const IS_ASYNC_PARAM_NAME = 'isAsync';
|
|
1035
|
-
export class ApiQueueService {
|
|
1036
|
-
constructor() {
|
|
1037
|
-
this._destroy$ = new Subject();
|
|
1038
|
-
this.queue = [];
|
|
1039
|
-
this.isProcessing = false;
|
|
1040
|
-
this.queueSubject = new SmartSubject(this._destroy$);
|
|
1041
|
-
this.queueSubject.pipe(takeUntil(this._destroy$)).subscribe(() => this.processQueue());
|
|
1042
|
-
}
|
|
1043
|
-
ngOnDestroy() {
|
|
1044
|
-
this._destroy$.next();
|
|
1045
|
-
this._destroy$.complete();
|
|
1046
|
-
}
|
|
1047
|
-
addToQueue(call, priority = false) {
|
|
1048
|
-
if (priority) {
|
|
1049
|
-
this.queue.unshift(call); // Add at the beginning of the queue if it has higher priority
|
|
1050
|
-
}
|
|
1051
|
-
else {
|
|
1052
|
-
this.queue.push(call); // Add at the end of the queue if it has lower priority
|
|
1053
|
-
}
|
|
1054
|
-
if (!this.isProcessing) {
|
|
1055
|
-
this.processQueue();
|
|
1056
|
-
}
|
|
1057
|
-
}
|
|
1058
|
-
async processQueue() {
|
|
1059
|
-
if (this.queue.length === 0) {
|
|
1060
|
-
this.isProcessing = false;
|
|
1061
|
-
return;
|
|
1062
|
-
}
|
|
1063
|
-
const apiQueueCall = this.queue.shift();
|
|
1064
|
-
if (apiQueueCall) {
|
|
1065
|
-
await apiQueueCall.callback(apiQueueCall.config);
|
|
1066
|
-
apiQueueCall.isCompleted.complete();
|
|
1067
|
-
this.queueSubject.next();
|
|
1068
|
-
}
|
|
1069
|
-
}
|
|
1070
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1071
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, providedIn: 'root' }); }
|
|
1072
|
-
}
|
|
1073
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, decorators: [{
|
|
1074
|
-
type: Injectable,
|
|
1075
|
-
args: [{
|
|
1076
|
-
providedIn: 'root',
|
|
1077
|
-
}]
|
|
1078
|
-
}], ctorParameters: () => [] });
|
|
1079
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsY0FBYyxFQUlkLFFBQVEsR0FFVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHekQsT0FBTyxFQU9MLGNBQWMsRUFXZCxTQUFTLEVBRVQsUUFBUSxHQUNULE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFTbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQW9CLE1BQU0sNEJBQTRCLENBQUM7QUFFakYsT0FBTyxFQUFFLFdBQVcsRUFBWSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ELE9BQU8sRUFDTCw2QkFBNkIsR0FFOUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7O0FBR3hFLE1BQU0sQ0FBQyxNQUFNLHNDQUFzQyxHQUFHLHdDQUF3QyxDQUFDO0FBQy9GLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxH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QUUsQ0FBQztZQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsOERBQThEO1FBQzFGLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyx1REFBdUQ7UUFDaEYsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVk7UUFDaEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixNQUFNLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELFlBQVksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQzsrR0F0Q1UsZUFBZTttSEFBZixlQUFlLGNBRmQsTUFBTTs7NEZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEluamVjdCxcclxuICBJbmplY3RhYmxlLFxyXG4gIEluamVjdGlvblRva2VuLFxyXG4gIEluamVjdG9yLFxyXG4gIG1vZGVsLFxyXG4gIE9uRGVzdHJveSxcclxuICBPcHRpb25hbCxcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBsYXN0VmFsdWVGcm9tLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU21hcnRGb3JtSW52YWxpZEZpZWxkcyB9IGZyb20gJy4uL3NtYXJ0LWZvcm0vc21hcnRmb3JtLm1vZGVsJztcclxuaW1wb3J0IHsgU21hcnRTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uL3Nlc3Npb24vc21hcnQtc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBDbGlwYm9hcmREYXRhLFxyXG4gIENvbXBvbmVudE1vZGVsLFxyXG4gIENvbXBvbmVudE1vZGVsQ2hhbmdlLFxyXG4gIERhdGFDaGFuZ2UsXHJcbiAgRG93bmxvYWRlZEZpbGUsXHJcbiAgTGluayxcclxuICBMaW5rVGFyZ2V0RW51bSxcclxuICBNZXNzYWdlRGF0YSxcclxuICBNZXNzYWdlUmVzdWx0LFxyXG4gIFVpQWN0aW9uRGVzY3JpcHRvcixcclxuICBVaUFjdGlvblJlcXVlc3QsXHJcbiAgVmlld0NvbnN0cmFpbnQsXHJcbiAgVmlld0NvbnRleHRDaGFuZ2UsXHJcbiAgVmlld0NvbnRleHREYXRhLFxyXG4gIFZpZXdDb250ZXh0VXBkYXRlLFxyXG4gIFZpZXdEYXRhLFxyXG4gIFZpZXdTZXJ2aWNlLFxyXG4gIFZpZXdTdGF0ZSxcclxuICBWaWV3U3RhdGVVcGRhdGUsXHJcbiAgVmlld1R5cGUsXHJcbn0gZnJvbSAnLi9hcGknO1xyXG5pbXBvcnQgeyBNZXNzYWdlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9tZXNzYWdlLWRpYWxvZy9tZXNzYWdlLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0RW1iZWRkZWRWaWV3UmVmLFxyXG4gIFNtYXJ0VHJhbnNsYXRlU2VydmljZSxcclxuICBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3IsXHJcbiAgU21hcnRWaWV3Q29udGV4dEFwaUVycm9ycyxcclxuICBTbWFydFZpZXdEaWFsb2dSZWYsXHJcbiAgU21hcnRWaWV3SGFuZGxlck1vZGVsLFxyXG59IGZyb20gJy4vc21hcnQtdmlldy1jb250ZXh0Lm1vZGVsJztcclxuaW1wb3J0IHsgU21hcnRTdWJqZWN0IH0gZnJvbSAnLi4vc21hcnQtc3ViamVjdC9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IFNtYXJ0Vmlld0NvbnRleHREaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9zbWFydC12aWV3LWNvbnRleHQtZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgQ09NUE9ORU5UX0xJQlJBUlksIENvbXBvbmVudExpYnJhcnkgfSBmcm9tICcuL3V0aWxpdHkvY29tcG9uZW50TGlicmFyeSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgcmVzb2x2ZVNsb3QsIFNsb3RLaW5kIH0gZnJvbSAnLi92aWV3LXNsb3QtcmVzb2x1dGlvbic7XHJcbmltcG9ydCB7XHJcbiAgU01BUlRfREVGQVVMVF9WSUVXX0NPTVBPTkVOVFMsXHJcbiAgRGVmYXVsdFZpZXdDb21wb25lbnRFbnRyeSxcclxufSBmcm9tICcuL2RlZmF1bHQtdmlldy1jb21wb25lbnRzLnRva2VuJztcclxuaW1wb3J0IHsgcmVzb2x2ZVZpZXdIYW5kbGVyIH0gZnJvbSAnLi92aWV3LWhhbmRsZXItcmVzb2x1dGlvbic7XHJcbmltcG9ydCB7IGJ1aWxkVmlld09wcyB9IGZyb20gJy4vdmlldy1vcCc7XHJcbmltcG9ydCB7IFJFVVNFX1JPVVRFUl9TTE9UX0NPTVBPTkVOVCB9IGZyb20gJy4vcmV1c2Utcm91dGVyLXNsb3QudG9rZW4nO1xyXG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi90aGVtZS90aGVtZS5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dCdXR0b25MYWJlbCA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dCdXR0b25MYWJlbCc7XHJcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSc7XHJcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dNZXNzYWdlID0gJ1NtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ01lc3NhZ2UnO1xyXG5leHBvcnQgY29uc3QgRGVmYXVsdFVpQWN0aW9uQ29kZV9DTE9TRSA9ICdERUZBVUxUX0NMT1NFJztcclxuXHJcbmV4cG9ydCBjb25zdCBESUFMT0dfRElTQUJMRV9DTE9TRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPignZGlhbG9nRGlzYWJsZUNsb3NlJyk7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRWaWV3Q29udGV4dFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRleHRVdWlkTmFtZTogc3RyaW5nID0gJ3ZpZXdDb250ZXh0VXVpZCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGV4dFV1aWRIZWFkZXJOYW1lOiBzdHJpbmcgPSAndmlld0NvbnRleHRVdWlkJztcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VOYW1lUHJlZml4OiBzdHJpbmcgPSAncGFnZS4nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50TmFtZVByZWZpeDogc3RyaW5nID0gJ2NvbXBvbmVudC4nO1xyXG4gIHB1YmxpYyBtZXNzYWdlRGlhbG9nbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgdXJsPzogc3RyaW5nO1xyXG4gIHByaXZhdGUgdmlld0NvbnRleHQ/OiBWaWV3Q29udGV4dERhdGE7XHJcbiAgcHJpdmF0ZSB2aWV3SGFuZGxlcnM6IEFycmF5PFNtYXJ0Vmlld0hhbmRsZXJNb2RlbD4gPSBuZXcgQXJyYXkoKTtcclxuICBwcml2YXRlIGRlZmF1bHRDb21wb25lbnRzOiBNYXA8c3RyaW5nLCBDb21wb25lbnRUeXBlPGFueT4+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgb3BlbmVkVmlld1V1aWRzOiBBcnJheTxzdHJpbmc+ID0gbmV3IEFycmF5KCk7XHJcbiAgcHJpdmF0ZSBvcGVuZWRWaWV3RGF0YTogQXJyYXk8Vmlld0RhdGE+ID0gbmV3IEFycmF5KCk7XHJcbiAgLy8gTW9ub3RvbmljIGNvdW50ZXIgYnVtcGVkIG9uIGV2ZXJ5IHN1Y2Nlc3NmdWwgc3RhcnRWaWV3Q29udGV4dCgpLiBDYWxsZXJzXHJcbiAgLy8gdGhhdCBob2xkIGEgcmVmZXJlbmNlIHRvIGEgdmlldy11dWlkIGZyb20gYSBwcmV2aW91cyB2aWV3Y29udGV4dCBjYW5cclxuICAvLyBkZXRlY3QgYSByZWJ1aWxkIGJ5IGNvbXBhcmluZyBzbmFwc2hvdHMgb2YgdGhpcyB2YWx1ZS5cclxuICBwcml2YXRlIGdlbmVyYXRpb246IG51bWJlciA9IDA7XHJcblxyXG4gIHByaXZhdGUgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuICBwdWJsaWMgdXVpZE9mUGFnZUhhc0JlZW5DaGFuZ2VkOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcclxuICBwdWJsaWMgdmlld0NvbnRleHRIYXNCZWVuU3luY2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplUnVubmluZzogU3ViamVjdDxWaWV3Q29udGV4dERhdGE+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgaW5pdGlOZXdDb250ZXh0UnVubmluZzogU3ViamVjdDx2b2lkPiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHVibGljIHNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnM/OiBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzO1xyXG5cclxuICBwdWJsaWMgb3BlblNtYXJ0TGluazogU3ViamVjdDxbc3RyaW5nLCBzdHJpbmddPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xyXG4gIHB1YmxpYyBpc09wZW5pbmdTbWFydExpbms6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBkaWFsb2dSZWZzOiBTbWFydFZpZXdEaWFsb2dSZWZbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGVtYmVkZGVkQ29udGFpbmVyczogTWFwPHN0cmluZywgTWFwPHN0cmluZywgRW1iZWRkZWRTbG90RW50cnk+PiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIGVtYmVkZGVkVmlld1JlZnM6IFNtYXJ0RW1iZWRkZWRWaWV3UmVmW10gPSBbXTtcclxuICBwcml2YXRlIHBlbmRpbmdFbWJlZGRlZFZpZXdzOiBWaWV3RGF0YVtdID0gW107XHJcblxyXG4gIHByaXZhdGUgYWN0aW9uRGVzY3JpcHRvcnM/OiBNYXA8c3RyaW5nLCBVaUFjdGlvbkRlc2NyaXB0b3I+O1xyXG5cclxuICBwcml2YXRlIG1vZHVsZVVybHNCeU1vZHVsZT86IE1hcDxzdHJpbmcsIHN0cmluZz47XHJcblxyXG4gIHB1YmxpYyBjb21tb25GZWVkYmFja1RleHQ/OiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyBzbWFydEFwaUNsaWVudHM6IE1hcDxzdHJpbmcsIFNtYXJ0U3ViamVjdDxhbnk+PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHVibGljIHNldCB0cmFuc2xhdGVTZXJ2aWNlKHRyYW5zbGF0ZVNlcnZpY2U6IFNtYXJ0VHJhbnNsYXRlU2VydmljZSB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZSA9IHRyYW5zbGF0ZVNlcnZpY2U7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VDaGFuZ2VkLm5leHQoKTtcclxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZUNoYW5nZWQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgdHJhbnNsYXRlU2VydmljZSgpOiBTbWFydFRyYW5zbGF0ZVNlcnZpY2UgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdHJhbnNsYXRlU2VydmljZT86IFNtYXJ0VHJhbnNsYXRlU2VydmljZTtcclxuICBwdWJsaWMgdHJhbnNsYXRlU2VydmljZUNoYW5nZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcclxuXHJcbiAgcHVibGljIGNvbXBvbmVudExpYnJhcnk6IENvbXBvbmVudExpYnJhcnkgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB2aWV3OiBWaWV3U2VydmljZSxcclxuICAgIHByaXZhdGUgc2Vzc2lvbjogU21hcnRTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nOiBTbWFydFZpZXdDb250ZXh0RGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpUXVldWVTZXJ2aWNlOiBBcGlRdWV1ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBpbmplY3Q6IEluamVjdG9yLFxyXG4gICAgQEluamVjdChDT01QT05FTlRfTElCUkFSWSkgQE9wdGlvbmFsKCkgY29tcExpYj86IENvbXBvbmVudExpYnJhcnksXHJcbiAgICBASW5qZWN0KFNNQVJUX0RFRkFVTFRfVklFV19DT01QT05FTlRTKVxyXG4gICAgQE9wdGlvbmFsKClcclxuICAgIGRlZmF1bHRWaWV3Q29tcG9uZW50cz86IERlZmF1bHRWaWV3Q29tcG9uZW50RW50cnlbXVxyXG4gICkge1xyXG4gICAgdGhpcy5jb21wb25lbnRMaWJyYXJ5ID0gY29tcExpYjtcclxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGVmYXVsdFZpZXdDb21wb25lbnRzID8/IFtdKSB7XHJcbiAgICAgIHRoaXMuZGVmYXVsdENvbXBvbmVudHMuc2V0KGVudHJ5LmNvbXBvbmVudE5hbWUsIGVudHJ5LmNvbXBvbmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9sbG93KHV1aWQ6IHN0cmluZywgZGV0ZWN0Q2hhbmdlOiBTbWFydFN1YmplY3Q8YW55Pik6IHZvaWQge1xyXG4gICAgdGhpcy5zbWFydEFwaUNsaWVudHMuc2V0KHV1aWQsIGRldGVjdENoYW5nZSk7XHJcbiAgfVxyXG4gIHB1YmxpYyB1bmZvbGxvdyh1dWlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc21hcnRBcGlDbGllbnRzLmRlbGV0ZSh1dWlkKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyRW1iZWRkZWRTbG90KFxyXG4gICAgY29udGFpbmVyVXVpZDogc3RyaW5nLFxyXG4gICAgY29udGFpbmVySWQ6IHN0cmluZyxcclxuICAgIHZjUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAga2luZDogU2xvdEtpbmRcclxuICApOiB2b2lkIHtcclxuICAgIGxldCBpbm5lck1hcCA9IHRoaXMuZW1iZWRkZWRDb250YWluZXJzLmdldChjb250YWluZXJVdWlkKTtcclxuICAgIGlmICghaW5uZXJNYXApIHtcclxuICAgICAgaW5uZXJNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgIHRoaXMuZW1iZWRkZWRDb250YWluZXJzLnNldChjb250YWluZXJVdWlkLCBpbm5lck1hcCk7XHJcbiAgICB9XHJcbiAgICBpbm5lck1hcC5zZXQoY29udGFpbmVySWQsIHsgdmNSZWYsIGtpbmQgfSk7XHJcblxyXG4gICAgLy8gUmVhdHRhY2ggZW1iZWRkZWQgdmlld3MgdGhhdCB3ZXJlIGRldGFjaGVkIGJlZm9yZSBsYXlvdXQgcmUtcmVuZGVyXHJcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZW1iZWRkZWRWaWV3UmVmcy5maWx0ZXIoXHJcbiAgICAgIChyZWYpID0+IHJlZi5jb250YWluZXJVdWlkID09PSBjb250YWluZXJVdWlkICYmIHJlZi5jb250YWluZXJJZCA9PT0gY29udGFpbmVySWRcclxuICAgICk7XHJcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiBleGlzdGluZykge1xyXG4gICAgICBpZiAoIXJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcuZGVzdHJveWVkKSB7XHJcbiAgICAgICAgdmNSZWYuaW5zZXJ0KHJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRHJhaW4gcGVuZGluZyBxdWV1ZSAobWF0Y2ggb24gdGhlIHJlc29sdmVkIHNsb3QsIHNvIHJvdXRlci1zbG90IE5PUk1BTCB2aWV3cyBtYXRjaCB0b28pXHJcbiAgICBjb25zdCBtYXRjaGVzID0gKHY6IFZpZXdEYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IHMgPSByZXNvbHZlU2xvdCh2KTtcclxuICAgICAgcmV0dXJuIHMuY29udGFpbmVyVXVpZCA9PT0gY29udGFpbmVyVXVpZCAmJiBzLmNvbnRhaW5lcklkID09PSBjb250YWluZXJJZDtcclxuICAgIH07XHJcbiAgICBjb25zdCBtYXRjaGluZyA9IHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MuZmlsdGVyKG1hdGNoZXMpO1xyXG4gICAgdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cyA9IHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MuZmlsdGVyKCh2KSA9PiAhbWF0Y2hlcyh2KSk7XHJcblxyXG4gICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgdXBkYXRlczogKFZpZXdTdGF0ZVVwZGF0ZSB8IHVuZGVmaW5lZClbXSA9IG1hdGNoaW5nLm1hcCgodikgPT4gdGhpcy5vcGVuVmlldyh2KSk7XHJcbiAgICAgIHRoaXMuc2VuZFZpZXdDb250ZXh0VXBkYXRlcyh1cGRhdGVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRldGFjaEFsbEVtYmVkZGVkVmlld3MoY29udGFpbmVyVXVpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZW1iZWRkZWRWaWV3UmVmcy5maWx0ZXIoKHJlZikgPT4gcmVmLmNvbnRhaW5lclV1aWQgPT09IGNvbnRhaW5lclV1aWQpO1xyXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xyXG4gICAgICBpZiAoY2hpbGQuY29tcG9uZW50UmVmLmhvc3RWaWV3LmRlc3Ryb3llZCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIE9ubHkgZGV0YWNoIHZpZXdzIGxpdmluZyBpbiBhIHJlLXJlbmRlcmluZyBMQVlPVVQgc2xvdC4gQSBTVEFCTEUgZGlyZWN0aXZlXHJcbiAgICAgIC8vIHNsb3QgKHJvdXRlci1vdXRsZXQpIGxpdmVzIG91dHNpZGUgdGhlIGxheW91dCAqbmdGb3IgYW5kIHN1cnZpdmVzIHRoZSBwYXJlbnRcclxuICAgICAgLy8gcmUtcmVuZGVyLCBzbyBpdHMgY2hpbGQgbmVlZHMgbm8gZGV0YWNoIHByb3RlY3Rpb24g4oCUIGRldGFjaGluZyBpdCBoZXJlIGlzXHJcbiAgICAgIC8vIHdoYXQgcHJvZHVjZWQgdGhlIGZhbHNlLW9ycGhhbiBkZXN0cm95IGluIG11bHRpLWxldmVsIE5PUk1BTCBuZXN0aW5nXHJcbiAgICAgIC8vIChIb21lIC0+IE1haW4gLT4gcGFnZSk6IE1haW4gZ290IHN3ZXB0IHVwIGJ5IEhvbWUncyBsYXlvdXQgZGFuY2UuICgjMjg4NzApXHJcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbWJlZGRlZENvbnRhaW5lcnMuZ2V0KGNvbnRhaW5lclV1aWQpPy5nZXQoY2hpbGQuY29udGFpbmVySWQpO1xyXG4gICAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmtpbmQgPT09ICdzdGFibGUnKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaWR4ID0gZW50cnkudmNSZWYuaW5kZXhPZihjaGlsZC5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgICBlbnRyeS52Y1JlZi5kZXRhY2goaWR4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYW51cE9ycGhhbmVkRW1iZWRkZWRWaWV3cyhjb250YWluZXJVdWlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlZnMgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKChyZWYpID0+IHJlZi5jb250YWluZXJVdWlkID09PSBjb250YWluZXJVdWlkKTtcclxuICAgIGNvbnN0IG9ycGhhbmVkOiBTbWFydEVtYmVkZGVkVmlld1JlZltdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiByZWZzKSB7XHJcbiAgICAgIGlmIChyZWYuY29tcG9uZW50UmVmLmhvc3RWaWV3LmRlc3Ryb3llZCkge1xyXG4gICAgICAgIG9ycGhhbmVkLnB1c2gocmVmKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB2Y1JlZiA9IHRoaXMuZ2V0RW1iZWRkZWRTbG90KGNvbnRhaW5lclV1aWQsIHJlZi5jb250YWluZXJJZCk7XHJcbiAgICAgIGlmICghdmNSZWYpIHtcclxuICAgICAgICAvLyBUaGUgc2xvdCBpcyB0cnVseSBnb25lIChpdHMgbGF5b3V0IGhvc3Qgd2FzIHRvcm4gZG93biBhbmQgbm90IHJlY3JlYXRlZCk6XHJcbiAgICAgICAgLy8gYSByZWFsIG9ycGhhbiB0byBkZXN0cm95LlxyXG4gICAgICAgIG9ycGhhbmVkLnB1c2gocmVmKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBTbG90IHN0aWxsIHJlZ2lzdGVyZWQgYnV0IGl0cyB2aWV3IHdhcyBkZXRhY2hlZCBieSBkZXRhY2hBbGxFbWJlZGRlZFZpZXdzIGFuZFxyXG4gICAgICAvLyBuZXZlciByZWF0dGFjaGVkLCBiZWNhdXNlIHRoZSAqbmdGb3IgcmV1c2VkIHRoZSBzbG90IGhvc3QgKG9ubHkgYSBzaWJsaW5nXHJcbiAgICAgIC8vIHdpZGdldCBjaGFuZ2VkKSBzbyBubyByZS1yZWdpc3RlciBmaXJlZC4gUmVhdHRhY2ggc28gZXZlcnkgZGV0YWNoIGlzIHBhaXJlZC5cclxuICAgICAgaWYgKHZjUmVmLmluZGV4T2YocmVmLmNvbXBvbmVudFJlZi5ob3N0VmlldykgPCAwKSB7XHJcbiAgICAgICAgdmNSZWYuaW5zZXJ0KHJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiBvcnBoYW5lZCkge1xyXG4gICAgICBpZiAoIXJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcuZGVzdHJveWVkKSB7XHJcbiAgICAgICAgcmVmLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaWR4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZihyZWYudXVpZCk7XHJcbiAgICAgIGlmIChpZHggPj0gMCkge1xyXG4gICAgICAgIHRoaXMub3BlbmVkVmlld1V1aWRzLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgIHRoaXMub3BlbmVkVmlld0RhdGEuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuZW1iZWRkZWRWaWV3UmVmcyA9IHRoaXMuZW1iZWRkZWRWaWV3UmVmcy5maWx0ZXIoKHJlZikgPT4gIW9ycGhhbmVkLmluY2x1ZGVzKHJlZikpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29tcG9zaXRlTW9kZWwoY29udGFpbmVyVXVpZDogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XHJcbiAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbHRlcigocmVmKSA9PiByZWYuY29udGFpbmVyVXVpZCA9PT0gY29udGFpbmVyVXVpZCk7XHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XHJcbiAgICAgIHJlc3VsdFtjaGlsZC51dWlkXSA9IGNoaWxkLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5nZXRNb2RlbCgpO1xyXG4gICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgdGhpcy5nZXRDb21wb3NpdGVNb2RlbChjaGlsZC51dWlkKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgc3VibWl0RW1iZWRkZWRGb3Jtcyhjb250YWluZXJVdWlkOiBzdHJpbmcsIHZhbGlkYXRlOiBib29sZWFuKTogU21hcnRGb3JtSW52YWxpZEZpZWxkcyB7XHJcbiAgICBjb25zdCBhbGxJbnZhbGlkS2V5czogc3RyaW5nW10gPSBbXTtcclxuICAgIGNvbnN0IGFsbEludmFsaWROYW1lczogc3RyaW5nW10gPSBbXTtcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbHRlcigocmVmKSA9PiByZWYuY29udGFpbmVyVXVpZCA9PT0gY29udGFpbmVyVXVpZCk7XHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XHJcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY2hpbGQuY29tcG9uZW50UmVmLmluc3RhbmNlO1xyXG4gICAgICBpbnN0YW5jZS5zdWJtaXRGb3JtKHZhbGlkYXRlKTtcclxuICAgICAgaWYgKHZhbGlkYXRlKSB7XHJcbiAgICAgICAgY29uc3QgaW52YWxpZDogU21hcnRGb3JtSW52YWxpZEZpZWxkcyA9IGluc3RhbmNlLmdldEludmFsaWRGaWVsZHMoKTtcclxuICAgICAgICBhbGxJbnZhbGlkS2V5cy5wdXNoKC4uLmludmFsaWQuaW52YWxpZEZpZWxkS2V5cyk7XHJcbiAgICAgICAgYWxsSW52YWxpZE5hbWVzLnB1c2goLi4uaW52YWxpZC5pbnZhbGlkRmllbGROYW1lcyk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbmVzdGVkID0gdGhpcy5zdWJtaXRFbWJlZGRlZEZvcm1zKGNoaWxkLnV1aWQsIHZhbGlkYXRlKTtcclxuICAgICAgYWxsSW52YWxpZEtleXMucHVzaCguLi5uZXN0ZWQuaW52YWxpZEZpZWxkS2V5cyk7XHJcbiAgICAgIGFsbEludmFsaWROYW1lcy5wdXNoKC4uLm5lc3RlZC5pbnZhbGlkRmllbGROYW1lcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBpbnZhbGlkRmllbGRLZXlzOiBhbGxJbnZhbGlkS2V5cywgaW52YWxpZEZpZWxkTmFtZXM6IGFsbEludmFsaWROYW1lcyB9O1xyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlckVtYmVkZGVkU2xvdChjb250YWluZXJVdWlkOiBzdHJpbmcsIGNvbnRhaW5lcklkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlubmVyTWFwID0gdGhpcy5lbWJlZGRlZENvbnRhaW5lcnMuZ2V0KGNvbnRhaW5lclV1aWQpO1xyXG4gICAgaWYgKGlubmVyTWFwKSB7XHJcbiAgICAgIGlubmVyTWFwLmRlbGV0ZShjb250YWluZXJJZCk7XHJcbiAgICAgIGlmIChpbm5lck1hcC5zaXplID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5lbWJlZGRlZENvbnRhaW5lcnMuZGVsZXRlKGNvbnRhaW5lclV1aWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEVtYmVkZGVkU2xvdChcclxuICAgIGNvbnRhaW5lclV1aWQ6IHN0cmluZyxcclxuICAgIGNvbnRhaW5lcklkOiBzdHJpbmdcclxuICApOiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmVtYmVkZGVkQ29udGFpbmVycy5nZXQoY29udGFpbmVyVXVpZCk/LmdldChjb250YWluZXJJZCk/LnZjUmVmO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRoZSB2aWV3J3MgY29tcG9uZW50IGludG8gaXRzIHJlc29sdmVkIHNsb3QuIFJldHVybnMgZmFsc2UgYW5kIHF1ZXVlc1xyXG4gICAqIHRoZSB2aWV3IGlmIHRoZSBzbG90IGlzIG5vdCByZWdpc3RlcmVkIHlldCAoZHJhaW5lZCBvbiByZWdpc3RyYXRpb24pLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgaW5zZXJ0Vmlld0ludG9TbG90KHZpZXc6IFZpZXdEYXRhLCBjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgeyBjb250YWluZXJVdWlkLCBjb250YWluZXJJZCB9ID0gcmVzb2x2ZVNsb3Qodmlldyk7XHJcbiAgICBjb25zdCB2Y1JlZiA9IHRoaXMuZ2V0RW1iZWRkZWRTbG90KGNvbnRhaW5lclV1aWQsIGNvbnRhaW5lcklkKTtcclxuICAgIGlmICghdmNSZWYpIHtcclxuICAgICAgLy8gU2xvdCBub3QgcmVnaXN0ZXJlZCB5ZXQ6IHF1ZXVlIHRoZSB2aWV3IGFuZCBkcmFpbiBpdCB3aGVuIGl0cyBzbG90IHJlZ2lzdGVyc1xyXG4gICAgICAvLyAocmVnaXN0ZXJFbWJlZGRlZFNsb3QpLiBUaGUgc3luY2hyb25vdXMgZGV0ZWN0Q2hhbmdlcyBiZWxvdyByZW5kZXJzIGEgZnJlc2hseVxyXG4gICAgICAvLyBtb3VudGVkIHBhcmVudCdzIHRlbXBsYXRlIGluIHRoZSBzYW1lIHN5bmNWaWV3IHBhc3MsIHNvIGEgcGFyZW50IC0+IGNoaWxkIC0+XHJcbiAgICAgIC8vIGdyYW5kY2hpbGQgY2hhaW4gKEhvbWUgLT4gTWFpbiAtPiBwYWdlKSByZWdpc3RlcnMgZXZlcnkgc2xvdCBpbW1lZGlhdGVseSBhbmRcclxuICAgICAgLy8gdGhlIHF1ZXVlIGRyYWlucyB3aXRoaW4gdGhlIHBhc3Mg4oCUIGV2ZW4gd2hlbiByZXN0b3JlVmlld3Mgb3BlbnMgYSBjaGlsZCBiZWZvcmVcclxuICAgICAgLy8gaXRzIHBhcmVudC4gKCMyODg3MClcclxuICAgICAgdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cy5wdXNoKHZpZXcpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2Y1JlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50KTtcclxuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS51dWlkID0gdmlldy51dWlkO1xyXG4gICAgdGhpcy5lbWJlZGRlZFZpZXdSZWZzLnB1c2goeyB1dWlkOiB2aWV3LnV1aWQsIGNvbnRhaW5lclV1aWQsIGNvbnRhaW5lcklkLCBjb21wb25lbnRSZWYgfSk7XHJcbiAgICAvLyBSZW5kZXIgdGhlIGZyZXNobHkgY3JlYXRlZCBjb21wb25lbnQgc3luY2hyb25vdXNseSBzbyBpdHMgb3duIGVtYmVkZGVkLXNsb3RcclxuICAgIC8vIGRpcmVjdGl2ZXMgKHRoZSByb3V0ZXItb3V0bGV0IHNsb3Qgb2YgYSBuZXN0ZWQgTk9STUFMIHZpZXcpIHJlZ2lzdGVyIHRoZWlyXHJcbiAgICAvLyBjb250YWluZXJzIGltbWVkaWF0ZWx5LiBUaGlzIGxldHMgYSBwYXJlbnQgLT4gY2hpbGQgLT4gZ3JhbmRjaGlsZCBjaGFpblxyXG4gICAgLy8gKGUuZy4gSG9tZSAtPiBNYWluIC0+IHBhZ2UpIG1vdW50IGluIGEgc2luZ2xlIHN5bmNocm9ub3VzIHN5bmNWaWV3IHBhc3NcclxuICAgIC8vIGluc3RlYWQgb2YgZGVwZW5kaW5nIG9uIGEgY2hhbmdlLWRldGVjdGlvbiB0aWNrIGZpcmluZyBiZXR3ZWVuIGVhY2ggbGV2ZWwuXHJcbiAgICAvLyBXaXRob3V0IGl0IHRoZSBjaGlsZCBjYW5ub3QgcmVzb2x2ZSBpdHMgc2xvdCwgcXVldWVzIGludG9cclxuICAgIC8vIHBlbmRpbmdFbWJlZGRlZFZpZXdzLCBhbmQgdGhlIGRyYWluIHJhY2VzIHRoZSBhc3luYyB1cGRhdGVWaWV3Q29udGV4dFxyXG4gICAgLy8gcm91bmQtdHJpcHMg4oCUIGludGVybWl0dGVudGx5IGxlYXZpbmcgYSBwYXJlbnQgT1BFTkVEIGluIGJhY2tlbmQgYm9va2tlZXBpbmdcclxuICAgIC8vIGJ1dCBuZXZlciBtb3VudGVkIG9uIHRoZSBjbGllbnQsIHNvIGl0cyBzbG90IGNoaWxkIHN0YXlzIGJsYW5rLiAoIzI4ODcwKVxyXG4gICAgY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5ydW4oKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEFjdGlvbkRlc2NyaXB0b3JzKGFjdGlvbkRlc2NyaXB0b3JzOiBNYXA8c3RyaW5nLCBVaUFjdGlvbkRlc2NyaXB0b3I+KTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGlvbkRlc2NyaXB0b3JzID0gYWN0aW9uRGVzY3JpcHRvcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QWN0aW9uRGVzY3JpcHRvcnMoKTogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPiB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAoIXRoaXMuYWN0aW9uRGVzY3JpcHRvcnMpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignTm8gYWN0aW9uIGRlc2NyaXB0b3JzIGhhcyBiZWVuIHNldCB0byBWaWV3Q29udGV4dC4nKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmFjdGlvbkRlc2NyaXB0b3JzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpZXdIYW5kbGVycyh2aWV3SGFuZGxlcnM6IEFycmF5PFNtYXJ0Vmlld0hhbmRsZXJNb2RlbD4pOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0hhbmRsZXJzID0gdmlld0hhbmRsZXJzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpZXdBcGlFcnJvcnModmlld0FwaUVycm9yczogU21hcnRWaWV3Q29udGV4dEFwaUVycm9ycyk6IHZvaWQge1xyXG4gICAgdGhpcy5zbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzID0gdmlld0FwaUVycm9ycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRNZXNzYWdlRGlhbG9nTmFtZShtZXNzYWdlRGlhbG9nTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm1lc3NhZ2VEaWFsb2duYW1lID0gbWVzc2FnZURpYWxvZ05hbWU7XHJcbiAgICB0aGlzLnZpZXdIYW5kbGVycy5wdXNoKHtcclxuICAgICAgbmFtZTogbWVzc2FnZURpYWxvZ05hbWUsXHJcbiAgICAgIGNvbXBvbmVudDogTWVzc2FnZURpYWxvZ0NvbXBvbmVudCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVcFVybEZvclZpZXdTZXJ2aWNlKCk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3LmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSB0aGlzLnVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNb2R1bGVVUkwobW9kdWxlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLm1vZHVsZVVybHNCeU1vZHVsZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZHVsZXNNYXAgZG9lcyBub3QgZXhpc3QuJyk7XHJcbiAgICB9XHJcbiAgICBsZXQgbW9kdWxlVXJsID0gdGhpcy5tb2R1bGVVcmxzQnlNb2R1bGU/LmdldChtb2R1bGUpO1xyXG5cclxuICAgIGlmICghbW9kdWxlVXJsKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlVXJsIGRvZXMgbm90IGV4aXN0IHdpdGggdGhlIGdpdmVuIG1vZHVsZS4nKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtb2R1bGVVcmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TW9kdWxlVVJMKG1vZHVsZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcclxuICAgIHRoaXMubW9kdWxlVXJsc0J5TW9kdWxlID0gbW9kdWxlcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRVcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudXJsID0gdXJsICsgJy92aWV3JztcclxuICAgIHRoaXMuc2V0VXBVcmxGb3JWaWV3U2VydmljZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFuZFN5bmNWaWV3Q29udGV4dCh1dWlkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXV1aWQpIHtcclxuICAgICAgdXVpZCA9IHRoaXMuZ2V0Vmlld0NvbnRleHRVdWlkKCk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLmdldFZpZXdDb250ZXh0KHV1aWQpLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICBhd2FpdCB0aGlzLnN5bmNWaWV3KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3Q29udGV4dCh1dWlkOiBzdHJpbmcpOiBQcm9taXNlPFZpZXdDb250ZXh0RGF0YT4ge1xyXG4gICAgdGhpcy52aWV3Q29udGV4dCA9IGF3YWl0IHRoaXMudmlldy5nZXRWaWV3Q29udGV4dCh1dWlkKS50b1Byb21pc2UoKTtcclxuICAgIGlmICghdGhpcy52aWV3Q29udGV4dCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpZXdDb250ZXh0IGRvZXMgbm90IGV4aXN0IHdpdGggdGhlIGdpdmVuIHV1aWQuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3Q29udGV4dERhdGFCeVBhZ2VOYW1lKHBhZ2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFZpZXdEYXRhPiB7XHJcbiAgICBpZiAoIXRoaXMudmlld0NvbnRleHQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh0aGlzLmdldFZpZXdDb250ZXh0VXVpZCgpKTtcclxuICAgIH1cclxuICAgIGxldCBwYWdlVXVpZCA9IHRoaXMuZ2V0VXVpZE9mUGFnZShwYWdlTmFtZSk7XHJcblxyXG4gICAgbGV0IHZpZXdDb250ZXh0QnlQYWdlTmFtZSA9IHRoaXMudmlld0NvbnRleHQ/LnZpZXdzLmZpbmQoKHZpZXcpID0+IHZpZXcudXVpZCA9PT0gcGFnZVV1aWQpO1xyXG4gICAgaWYgKCF2aWV3Q29udGV4dEJ5UGFnZU5hbWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgVmlld0RhdGEgb2YgJHtwYWdlTmFtZX0gaXMgbm90IGZvdW5kIWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZpZXdDb250ZXh0QnlQYWdlTmFtZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWaWV3Q29udGV4dChcclxuICAgIHZpZXdDb250ZXh0VXBkYXRlOiBWaWV3Q29udGV4dFVwZGF0ZVxyXG4gICk6IFByb21pc2U8Vmlld0NvbnRleHREYXRhIHwgdW5kZWZpbmVkPiB7XHJcbiAgICB2aWV3Q29udGV4dFVwZGF0ZS5kZXZpY2VJbmZvID8/PSB7XHJcbiAgICAgIGRldmljZUlkOiAnaWQnLFxyXG4gICAgICB1c2VyQWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXHJcbiAgICAgIHBhcmFtZXRlcnM6IG5ldyBNYXAoKSxcclxuICAgIH07XHJcbiAgICB2aWV3Q29udGV4dFVwZGF0ZS5kZXZpY2VJbmZvLmNvbXBvbmVudExpYnJhcnkgPSB0aGlzLmNvbXBvbmVudExpYnJhcnk7XHJcbiAgICB2aWV3Q29udGV4dFVwZGF0ZS5kZXZpY2VJbmZvLnRoZW1lTmFtZSA9IHRoaXMudGhlbWVTZXJ2aWNlLmN1cnJlbnRUaGVtZSgpO1xyXG5cclxuICAgIHRoaXMudmlld0NvbnRleHQgPSBhd2FpdCB0aGlzLnZpZXcudXBkYXRlVmlld0NvbnRleHQodmlld0NvbnRleHRVcGRhdGUpLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclNlc3Npb25TdG9yYWdlKCk6IHZvaWQge1xyXG4gICAgc2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTtcclxuICAgIHRoaXMuY2xlYXJFbWJlZGRlZFZpZXdzKCk7XHJcbiAgICB0aGlzLm9wZW5lZFZpZXdEYXRhID0gW107XHJcbiAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGVhciBkb3duIGFsbCBzbG90LWhvc3RlZCB2aWV3IGNvbXBvbmVudHMgb24gYSB2aWV3Q29udGV4dCByZXNldCAoZS5nLiBsb2dvdXQgL1xyXG4gICAqIHZpZXdjb250ZXh0LWxvc3QpLiBXaXRob3V0IHRoaXMgdGhlIHByZXZpb3VzIHZpZXcgdHJlZSBzdGF5cyBtb3VudGVkIGluIHRoZSByb290XHJcbiAgICogc2xvdCBhbmQgdGhlIG5ldyB0cmVlIGlzIGFwcGVuZGVkIGFsb25nc2lkZSBpdC4gRGVzdHJveWluZyBhIHBhcmVudCBjYXNjYWRlcyB0b1xyXG4gICAqIGl0cyBuZXN0ZWQgc2xvdCBkaXJlY3RpdmVzICh3aGljaCB1bnJlZ2lzdGVyIHRoZWlyIGNvbnRhaW5lcnMgdmlhIG5nT25EZXN0cm95KSxcclxuICAgKiBsZWF2aW5nIG9ubHkgdGhlIGhvc3Qtb3duZWQgcm9vdCBzbG90IHJlZ2lzdGVyZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhckVtYmVkZGVkVmlld3MoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzLmVtYmVkZGVkVmlld1JlZnMpIHtcclxuICAgICAgaWYgKCFyZWYuY29tcG9uZW50UmVmLmhvc3RWaWV3LmRlc3Ryb3llZCkge1xyXG4gICAgICAgIHJlZi5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmVtYmVkZGVkVmlld1JlZnMgPSBbXTtcclxuICAgIHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MgPSBbXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzdGFydFZpZXdDb250ZXh0KCk6IFByb21pc2U8Vmlld0NvbnRleHREYXRhPiB7XHJcbiAgICB0aGlzLmNsZWFyU2Vzc2lvblN0b3JhZ2UoKTtcclxuICAgIHRoaXMuc2Vzc2lvbi5hZGRIZWFkZXJQYXJhbSh7XHJcbiAgICAgIGhlYWRlck5hbWU6IHRoaXMudmlld0NvbnRleHRVdWlkSGVhZGVyTmFtZSxcclxuICAgICAgdmFsdWU6ICcnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IG5ld1ZpZXdDb250ZXh0OiBWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQgPSBhd2FpdCB0aGlzLnZpZXdcclxuICAgICAgLmNyZWF0ZVZpZXdDb250ZXh0KClcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgaWYgKCFuZXdWaWV3Q29udGV4dCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFZpZXdDb250ZXh0IHdhcyBjcmVhdGVkJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gbmV3Vmlld0NvbnRleHQ7XHJcbiAgICB0aGlzLnNldFZpZXdDb250ZXh0VXVpZChuZXdWaWV3Q29udGV4dC51dWlkISk7XHJcbiAgICB0aGlzLmdlbmVyYXRpb24rKztcclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRHZW5lcmF0aW9uKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUodXVpZD86IHN0cmluZyk6IFByb21pc2U8Vmlld0NvbnRleHREYXRhIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBpZiAodGhpcy5pbml0aWFsaXplUnVubmluZykge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplUnVubmluZy50b1Byb21pc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcgPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAodGhpcy52aWV3SGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICAgIFwiVGhlcmUgYXJlbid0IGFueSB2aWV3SGFuZGxlcnMgaW4gU21hcnRWaWV3Q29udGV4dFNlcnZpY2UhIFByb3ZpZGUgc29tZSB0byB1c2UgaXRzIGZ1bmN0aW9ucy5cIlxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VEaWFsb2duYW1lKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBtZXNzYWdlRGlhbG9nTmFtZSBwcm92aWRlZCBieSB0aGUgYmFja2VuZCBoYXMgbm90IGJlZW4gc2V0LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXVpZCkge1xyXG4gICAgICAgICAgdGhpcy5zZXRWaWV3Q29udGV4dFV1aWQodXVpZCk7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdldFZpZXdDb250ZXh0KHV1aWQpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhcnRWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0Vmlld0NvbnRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0ITtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVSdW5uaW5nLm5leHQodGhpcy52aWV3Q29udGV4dCEpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcuY29tcGxldGUoKTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVSdW5uaW5nID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdFZpZXdDb250ZXh0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IHV1aWQ7XHJcbiAgICB0cnkge1xyXG4gICAgICB1dWlkID0gdGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG4gICAgICB1dWlkID0gdGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSh1dWlkKTtcclxuICAgIGF3YWl0IHRoaXMucmVzdG9yZVZpZXdzKHV1aWQpO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRBbmRTeW5jVmlld0NvbnRleHQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEh5ZHJhdGVzIHRoZSB2aWV3LWNvbnRleHQgc3RhdGUgZnJvbSBhbiBhbHJlYWR5LWV4aXN0aW5nIFVVSUQgcHJvdmlkZWRcclxuICAgKiBleHRlcm5hbGx5IChlLmcuIGJ5IGEgbmF0aXZlIG1vYmlsZSBzaGVsbCB2aWEgVVJMIGZyYWdtZW50KS4gVW5saWtlXHJcbiAgICogYGluaXRpYWxpemUodXVpZClgLCB0aGlzIG1ldGhvZCBkb2VzIE5PVCBmYWxsIGJhY2sgdG8gY3JlYXRpbmcgYSBmcmVzaFxyXG4gICAqIHZpZXdDb250ZXh0IGlmIHRoZSBiYWNrZW5kIHJlamVjdHMgdGhlIFVVSUQg4oCUIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG9cclxuICAgKiBzdXJmYWNlIHRoZSBmYWlsdXJlICh0eXBpY2FsbHkgdmlhIHRoZSBib290c3RyYXAncyBgb25TdGFydEVycm9yYCBob29rKS5cclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgaW5pdEZyb21FeGlzdGluZ1ZpZXdDb250ZXh0KHV1aWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zZXRWaWV3Q29udGV4dFV1aWQodXVpZCk7XHJcbiAgICBhd2FpdCB0aGlzLmdldFZpZXdDb250ZXh0KHV1aWQpO1xyXG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlVmlld3ModXVpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdE5ld1ZpZXdDb250ZXh0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZykge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbml0aU5ld0NvbnRleHRSdW5uaW5nLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbml0aU5ld0NvbnRleHRSdW5uaW5nID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0Vmlld0NvbnRleHQoKTtcclxuICAgICAgbGV0IHV1aWQgPSB0aGlzLmdldFZpZXdDb250ZXh0VXVpZCgpO1xyXG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemUodXVpZCk7XHJcbiAgICAgIGF3YWl0IHRoaXMucmVzdG9yZVZpZXdzKHV1aWQpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pbml0aU5ld0NvbnRleHRSdW5uaW5nLm5leHQoKTtcclxuICAgICAgdGhpcy5pbml0aU5ld0NvbnRleHRSdW5uaW5nLmNvbXBsZXRlKCk7XHJcbiAgICAgIHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZyA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuVmlldyh2aWV3OiBWaWV3RGF0YSk6IFZpZXdTdGF0ZVVwZGF0ZSB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgYWxyZWFkeU9wZW5lZCA9IHRoaXMub3BlbmVkVmlld1V1aWRzLnNvbWUoKHV1aWQpID0+IHV1aWQgPT09IHZpZXcudXVpZCk7XHJcbiAgICBpZiAoYWxyZWFkeU9wZW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCB2aWV3SGFuZGxlciA9IHJlc29sdmVWaWV3SGFuZGxlcih0aGlzLnZpZXdIYW5kbGVycywgdGhpcy5kZWZhdWx0Q29tcG9uZW50cywgdmlldyk7XHJcblxyXG4gICAgaWYgKCF2aWV3SGFuZGxlcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3YXMgbm90IGZvdW5kIGJ5IHZpZXcgbmFtZTogJHt2aWV3LnZpZXdOYW1lfSAoY29tcG9uZW50TmFtZTogJHt2aWV3LmNvbXBvbmVudE5hbWV9KWBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLkRJQUxPRykge1xyXG4gICAgICBpZiAoIXZpZXdIYW5kbGVyLmNvbXBvbmVudCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIGBDb21wb25lbnQgaXMgdW5kZWZpbmVkIGluIFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3aXRoIG5hbWU6ICR7dmlldy52aWV3TmFtZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgcmVmSXNBbHJhZHlBZGRlZCA9IHRoaXMuZGlhbG9nUmVmcy5zb21lKFxyXG4gICAgICAgIChyZWY6IFNtYXJ0Vmlld0RpYWxvZ1JlZikgPT4gcmVmLnV1aWQgPT09IHZpZXcudXVpZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoIXJlZklzQWxyYWR5QWRkZWQpIHtcclxuICAgICAgICBsZXQgZGlhbG9nUmVmO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5wdXNoKHZpZXcudXVpZCk7XHJcbiAgICAgICAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnB1c2godmlldyk7XHJcbiAgICAgICAgICB0aGlzLnNldFV1aWRPZlBhZ2Uodmlldy52aWV3TmFtZSwgdmlldy51dWlkLCB2aWV3SGFuZGxlci5jb21wb25lbnROYW1lKTtcclxuICAgICAgICAgIGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW5Db21wb25lbnRBc0RpYWxvZyhcclxuICAgICAgICAgICAgdmlld0hhbmRsZXIuY29tcG9uZW50LFxyXG4gICAgICAgICAgICB2aWV3SGFuZGxlci5uYW1lLFxyXG4gICAgICAgICAgICB2aWV3LnV1aWRcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZih2aWV3LnV1aWQpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyVXVpZE9mUGFnZSh2aWV3LnZpZXdOYW1lLCB2aWV3SGFuZGxlci5jb21wb25lbnROYW1lKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnNldFV1aWRPZlBhZ2Uodmlldy52aWV3TmFtZSwgdmlldy51dWlkLCB2aWV3SGFuZGxlci5jb21wb25lbnROYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRpYWxvZ0Rpc2FibGVDbG9zZSA9IHRydWU7XHJcbiAgICAgICAgbGV0IGlzTWVzc2FnZURpYWxvZyA9IHZpZXcudmlld05hbWUgPT09IHRoaXMubWVzc2FnZURpYWxvZ25hbWU7XHJcbiAgICAgICAgaWYgKCFpc01lc3NhZ2VEaWFsb2cpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRpYWxvZ0Rpc2FibGVDbG9zZSA9IHRoaXMuaW5qZWN0LmdldChESUFMT0dfRElTQUJMRV9DTE9TRSk7XHJcbiAgICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHJlYWRpbmcgRElBTE9HX0RJU0FCTEVfQ0xPU0UnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpYWxvZ1JlZiBpbnN0YW5jZW9mIE1hdERpYWxvZ1JlZikge1xyXG4gICAgICAgICAgZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IGRpYWxvZ0Rpc2FibGVDbG9zZTtcclxuICAgICAgICAgIC8vIGlmIChpc01lc3NhZ2VEaWFsb2cpIHtcclxuICAgICAgICAgIC8vICAgaWYgKHZpZXcubWVzc2FnZT8ub3B0aW9ucyAmJiB2aWV3Lm1lc3NhZ2Uub3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgaWYgKCFkaWFsb2dEaXNhYmxlQ2xvc2UpIHtcclxuICAgICAgICAgICAgZGlhbG9nUmVmXHJcbiAgICAgICAgICAgICAgLmFmdGVyQ2xvc2VkKClcclxuICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtQWN0aW9uKHZpZXcudXVpZCwgeyBjb2RlOiBEZWZhdWx0VWlBY3Rpb25Db2RlX0NMT1NFLCBwYXJhbXM6IHt9IH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGlhbG9nUmVmIGluc3RhbmNlb2YgRHluYW1pY0RpYWxvZ1JlZikge1xyXG4gICAgICAgICAgaWYgKCFkaWFsb2dEaXNhYmxlQ2xvc2UpIHtcclxuICAgICAgICAgICAgZGlhbG9nUmVmLm9uRGVzdHJveS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtQWN0aW9uKHZpZXcudXVpZCwgeyBjb2RlOiBEZWZhdWx0VWlBY3Rpb25Db2RlX0NMT1NFLCBwYXJhbXM6IHt9IH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmcy5wdXNoKHtcclxuICAgICAgICAgIHV1aWQ6IHZpZXcudXVpZCxcclxuICAgICAgICAgIGRpYWxvZ1JlZixcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLk5PUk1BTCkge1xyXG4gICAgICBpZiAoIXZpZXdIYW5kbGVyLmNvbXBvbmVudCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgIGBDb21wb25lbnQgaXMgdW5kZWZpbmVkIGluIFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3aXRoIG5hbWU6ICR7dmlldy52aWV3TmFtZX1gXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBDT01QQVRJQklMSVRZIFNISU0gKCMyODg3MCwgaW50ZW50aW9uYWwpOiBzb21lIGNoaWxkIHNlcnZpY2VzIChTbWFydHRyZWVHZW5lcmljU2VydmljZSxcclxuICAgICAgLy8gU21hcnRGaWx0ZXJFZGl0b3JTZXJ2aWNlKSBhbmQgZ2VuZXJpYyBjb21wb25lbnRzIChTZWFyY2hQYWdlQ29tcG9uZW50LCBHZW5lcmljUGFnZUNvbXBvbmVudClcclxuICAgICAgLy8gc3RpbGwgcmVzb2x2ZSB0aGVpciB2aWV3IHV1aWQgdmlhIHRoZSBwYWdlTmFtZSAtPiBnZXRVdWlkT2ZQYWdlKHNlc3Npb25TdG9yYWdlKSBpbmRpcmVjdGlvblxyXG4gICAgICAvLyBpbiB0aGVpciBDT05TVFJVQ1RPUiwgd2hpY2ggcnVucyBpbnNpZGUgY3JlYXRlQ29tcG9uZW50KCkgYmVsb3cg4oCUIGJlZm9yZSBvcGVuVmlldydzIG5vcm1hbFxyXG4gICAgICAvLyBib29ra2VlcGluZy4gU28gdGhlIG1hcHBpbmcgbXVzdCBiZSB3cml0dGVuIGhlcmUsIGFoZWFkIG9mIGNvbXBvbmVudCBjcmVhdGlvbi4gVGhlIHByb3BlclxyXG4gICAgICAvLyBmaXggKGZlZWQgdGhvc2UgY29uc3VtZXJzIHRoZSBpbmplY3RlZCB1dWlkICsgZGVmZXIgdGhlaXIgaW5pdCkgaXMgZGVmZXJyZWQgY29uc3VtZXIgcGx1bWJpbmc7XHJcbiAgICAgIC8vIHVudGlsIHRoZW4gdGhpcyB3cml0ZSBrZWVwcyB0aGUgaW5kaXJlY3Rpb24gY29ycmVjdCBpbiB0aGUgc2xvdCB3b3JsZC5cclxuICAgICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XHJcbiAgICAgIC8vIEEgTk9STUFMIHZpZXcgd2l0aCBubyBjb250YWluZXJVdWlkIGxhbmRzIGluIHRoZSBob3N0IHJvb3Qgc2xvdCAocmVzb2x2ZVNsb3QgbWFwc1xyXG4gICAgICAvLyBpdCB0byBST09UX0NPTlRBSU5FUl9VVUlEKTsgaWYgbm8gc2xvdCBpcyByZWdpc3RlcmVkIHlldCBpdCBxdWV1ZXMgYW5kIGRyYWlucyBsYXRlci5cclxuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLmluc2VydFZpZXdJbnRvU2xvdCh2aWV3LCB2aWV3SGFuZGxlci5jb21wb25lbnQpO1xyXG4gICAgICBpZiAoIWluc2VydGVkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLkVNQkVEREVEKSB7XHJcbiAgICAgIGlmICghdmlld0hhbmRsZXIuY29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgYENvbXBvbmVudCBpcyB1bmRlZmluZWQgaW4gU21hcnRWaWV3SGFuZGxlck1vZGVsIHdpdGggbmFtZTogJHt2aWV3LnZpZXdOYW1lfWBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFdyaXRlIHRoZSBwYWdlLXV1aWQgbWFwcGluZyBhaGVhZCBvZiBjb21wb25lbnQgY3JlYXRpb24gc28gY29uc3RydWN0b3ItdGltZVxyXG4gICAgICAvLyBhbmQgbmVzdGVkIGdldFV1aWRPZlBhZ2Uodmlld05hbWUpIGNvbnN1bWVycyAoZmlsdGVyLCB0cmVlKSByZXNvbHZlLiBUaGVcclxuICAgICAgLy8gcGFnZS48dmlld05hbWU+IGtleSBpcyBkaXN0aW5jdCBwZXIgdmlldywgc28gaXQgbmV2ZXIgY29sbGlkZXMuIFRoZVxyXG4gICAgICAvLyBjb21wb25lbnQuPGNvbXBvbmVudE5hbWU+IHJldmVyc2Uga2V5IENBTiBiZSBvdmVyd3JpdHRlbiBieSBhbm90aGVyXHJcbiAgICAgIC8vIGNvbmN1cnJlbnQgZHluYW1pYyB2aWV3IG9mIHRoZSBzYW1lIGRlZmF1bHQgY29tcG9uZW50LCBidXQgaXQgaXMgcmVhZCBvbmx5XHJcbiAgICAgIC8vIHN5bmNocm9ub3VzbHkgaW4gdGhlIGNvbnN0cnVjdG9yIChyaWdodCBhZnRlciB0aGlzIHdyaXRlKSBhbmQgc2xvdCB2aWV3c1xyXG4gICAgICAvLyBsb2FkIHZpYSB0aGUgaW5qZWN0ZWQgX3V1aWQgYWZ0ZXJ3YXJkcywgc28gdGhlIG92ZXJ3cml0ZSBuZXZlciBtaXMtcmVzb2x2ZXNcclxuICAgICAgLy8gYXQgcnVudGltZS4gKCMyODg3MClcclxuICAgICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XHJcbiAgICAgIGNvbnN0IGluc2VydGVkID0gdGhpcy5pbnNlcnRWaWV3SW50b1Nsb3Qodmlldywgdmlld0hhbmRsZXIuY29tcG9uZW50KTtcclxuICAgICAgaWYgKCFpbnNlcnRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHR5cGUgb2YgdGhlIHZpZXcgYW5kIGl0cyB2aWV3SGFuZGxlciBpcyBub3QgdGhlIHNhbWUhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmlldy5zdGF0ZSA9IFZpZXdTdGF0ZS5PUEVORUQ7XHJcblxyXG4gICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMucHVzaCh2aWV3LnV1aWQpO1xyXG4gICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5wdXNoKHZpZXcpO1xyXG5cclxuICAgIGlmICh2aWV3LnR5cGUgIT09IFZpZXdUeXBlLkVNQkVEREVEKSB7XHJcbiAgICAgIHRoaXMuc2V0VXVpZE9mUGFnZSh2aWV3LnZpZXdOYW1lLCB2aWV3LnV1aWQsIHZpZXdIYW5kbGVyLmNvbXBvbmVudE5hbWUpO1xyXG4gICAgICB0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZC5uZXh0KHZpZXcudmlld05hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0YXRlOiBWaWV3U3RhdGUuT1BFTkVELFxyXG4gICAgICB1dWlkOiB2aWV3LnV1aWQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlVmlldyh2aWV3OiBWaWV3RGF0YSk6IFZpZXdTdGF0ZVVwZGF0ZVtdIHtcclxuICAgIGNvbnN0IHZpZXdIYW5kbGVyID0gcmVzb2x2ZVZpZXdIYW5kbGVyKHRoaXMudmlld0hhbmRsZXJzLCB0aGlzLmRlZmF1bHRDb21wb25lbnRzLCB2aWV3KTtcclxuXHJcbiAgICBpZiAoIXZpZXdIYW5kbGVyKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgU21hcnRWaWV3SGFuZGxlck1vZGVsIHdhcyBub3QgZm91bmQgYnkgdmlldyBuYW1lOiAke3ZpZXcudmlld05hbWV9IChjb21wb25lbnROYW1lOiAke3ZpZXcuY29tcG9uZW50TmFtZX0pYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHVwZGF0ZXM6IFZpZXdTdGF0ZVVwZGF0ZVtdID0gW107XHJcblxyXG4gICAgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuRElBTE9HKSB7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZnMuZmluZChcclxuICAgICAgICAoZGlhbG9nUmVmOiBTbWFydFZpZXdEaWFsb2dSZWYpID0+IGRpYWxvZ1JlZi51dWlkID09PSB2aWV3LnV1aWRcclxuICAgICAgKTtcclxuICAgICAgaWYgKGRpYWxvZ1JlZikge1xyXG4gICAgICAgIGRpYWxvZ1JlZi5kaWFsb2dSZWYuY2xvc2UoKTtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRpYWxvZ1JlZnMuaW5kZXhPZihkaWFsb2dSZWYpO1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdEaWFsb2dSZWYgaXMgbm90IGZvdW5kIGJ5IHV1aWQuJyk7XHJcbiAgICAgIH1cclxuICAgICAgdXBkYXRlcy5wdXNoKC4uLnRoaXMuY2xlYW51cEVtYmVkZGVkQ2hpbGRyZW4odmlldy51dWlkKSk7XHJcbiAgICB9IGVsc2UgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuTk9STUFMKSB7XHJcbiAgICAgIC8vIERlc3Ryb3kgbmVzdGVkIGNoaWxkcmVuIGZpcnN0LCB0aGVuIHRoZSB2aWV3J3Mgb3duIHNsb3QgY29tcG9uZW50LlxyXG4gICAgICAvLyBkZXN0cm95Vmlld1JlZiBpcyBhIG5vLW9wIGZvciB0aGUgbGVnYWN5IHJvdXRlLXJlbmRlcmVkIChyb290bGVzcykgY2FzZS5cclxuICAgICAgdXBkYXRlcy5wdXNoKC4uLnRoaXMuY2xlYW51cEVtYmVkZGVkQ2hpbGRyZW4odmlldy51dWlkKSk7XHJcbiAgICAgIHRoaXMuZGVzdHJveVZpZXdSZWYodmlldy51dWlkKTtcclxuICAgIH0gZWxzZSBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5FTUJFRERFRCkge1xyXG4gICAgICB0aGlzLmRlc3Ryb3lWaWV3UmVmKHZpZXcudXVpZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB0eXBlIG9mIHRoZSB2aWV3IGFuZCBpdHMgdmlld0hhbmRsZXIgaXMgbm90IHRoZSBzYW1lIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHZpZXcuc3RhdGUgPSBWaWV3U3RhdGUuQ0xPU0VEO1xyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZih2aWV3LnV1aWQpO1xyXG4gICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAvLyBDbGVhciBmb3IgZXZlcnkgdHlwZTogb3BlblZpZXcgbm93IHdyaXRlcyB0aGUgcGFnZS11dWlkIG1hcHBpbmcgZm9yXHJcbiAgICAgIC8vIEVNQkVEREVEIHZpZXdzIHRvbyAoIzI4ODcwKSwgc28gdGhlIGNsZWFyIG11c3QgYmUgc3ltbWV0cmljIHRvIGF2b2lkIGFcclxuICAgICAgLy8gc3RhbGUgc2Vzc2lvblN0b3JhZ2UgZW50cnkuIGNsZWFyVXVpZE9mUGFnZSBpcyBhIG5vLW9wIGZvciBrZXlzIG5ldmVyXHJcbiAgICAgIC8vIHdyaXR0ZW4sIHNvIHRoaXMgc3RheXMgc2FmZSBmb3IgdGhlIGxlZ2FjeSByb290bGVzcyBjYXNlLlxyXG4gICAgICB0aGlzLmNsZWFyVXVpZE9mUGFnZSh2aWV3LnZpZXdOYW1lLCB2aWV3SGFuZGxlci5jb21wb25lbnROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVzLnB1c2goe1xyXG4gICAgICBzdGF0ZTogVmlld1N0YXRlLkNMT1NFRCxcclxuICAgICAgdXVpZDogdmlldy51dWlkLFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFudXBFbWJlZGRlZENoaWxkcmVuKGNvbnRhaW5lclV1aWQ6IHN0cmluZyk6IFZpZXdTdGF0ZVVwZGF0ZVtdIHtcclxuICAgIGNvbnN0IHVwZGF0ZXM6IFZpZXdTdGF0ZVVwZGF0ZVtdID0gW107XHJcblxyXG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKChyZWYpID0+IHJlZi5jb250YWluZXJVdWlkID09PSBjb250YWluZXJVdWlkKTtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcclxuICAgICAgY2hpbGQuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcclxuICAgICAgdXBkYXRlcy5wdXNoKHsgc3RhdGU6IFZpZXdTdGF0ZS5DTE9TRUQsIHV1aWQ6IGNoaWxkLnV1aWQgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVtYmVkZGVkVmlld1JlZnMgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKFxyXG4gICAgICAocmVmKSA9PiByZWYuY29udGFpbmVyVXVpZCAhPT0gY29udGFpbmVyVXVpZFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnBlbmRpbmdFbWJlZGRlZFZpZXdzID0gdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cy5maWx0ZXIoXHJcbiAgICAgICh2KSA9PiB2LmNvbnRhaW5lclV1aWQgIT09IGNvbnRhaW5lclV1aWRcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5lbWJlZGRlZENvbnRhaW5lcnMuZGVsZXRlKGNvbnRhaW5lclV1aWQpO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqIERlc3Ryb3kgdGhlIGNvbXBvbmVudCBmb3IgYSB2aWV3IGxpdmluZyBpbiBhIHNsb3QsIGlmIHByZXNlbnQgKG5vLW9wIGZvciByb3V0ZS1yZW5kZXJlZCB2aWV3cykuICovXHJcbiAgcHJpdmF0ZSBkZXN0cm95Vmlld1JlZih1dWlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJlZkluZGV4ID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbmRJbmRleCgocmVmKSA9PiByZWYudXVpZCA9PT0gdXVpZCk7XHJcbiAgICBpZiAocmVmSW5kZXggPj0gMCkge1xyXG4gICAgICB0aGlzLmVtYmVkZGVkVmlld1JlZnNbcmVmSW5kZXhdLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMuZW1iZWRkZWRWaWV3UmVmcy5zcGxpY2UocmVmSW5kZXgsIDEpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cyA9IHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MuZmlsdGVyKCh2KSA9PiB2LnV1aWQgIT09IHV1aWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZW5kVmlld0NvbnRleHRVcGRhdGVzKHVwZGF0ZXNUb1NlbmQ6IChWaWV3U3RhdGVVcGRhdGUgfCB1bmRlZmluZWQpW10pIHtcclxuICAgIGNvbnN0IHVwZGF0ZXM6IFZpZXdTdGF0ZVVwZGF0ZVtdID0gW107XHJcbiAgICB1cGRhdGVzVG9TZW5kLmZvckVhY2goKHVwZGF0ZSkgPT4ge1xyXG4gICAgICBpZiAodXBkYXRlICE9PSB1bmRlZmluZWQgJiYgdXBkYXRlICE9PSBudWxsKSB1cGRhdGVzLnB1c2godXBkYXRlKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHVwZGF0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVZpZXdDb250ZXh0KHtcclxuICAgICAgICB1cGRhdGVzLFxyXG4gICAgICAgIHV1aWQ6IHRoaXMudmlld0NvbnRleHQ/LnV1aWQsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBwdWJsaWMgYXN5bmMgcmVzdG9yZVZpZXdzKHV1aWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgdXBkYXRlczogVmlld1N0YXRlVXBkYXRlW10gPSBbXTtcclxuICAgIGlmICghdGhpcy52aWV3Q29udGV4dCkge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldFZpZXdDb250ZXh0KHV1aWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmlld0NvbnRleHQhLnZpZXdzLmZpbHRlcihcclxuICAgICAgKHZpZXcpID0+IHZpZXcuc3RhdGUgPT09IFZpZXdTdGF0ZS5PUEVORUQgfHwgdmlldy5zdGF0ZSA9PT0gVmlld1N0YXRlLlRPX09QRU5cclxuICAgICkubWFwKCh2aWV3OiBWaWV3RGF0YSkgPT4ge1xyXG4gICAgICBjb25zdCB1cGRhdGUgPSB0aGlzLm9wZW5WaWV3KHZpZXcpO1xyXG4gICAgICBpZiAodXBkYXRlKSB7XHJcbiAgICAgICAgdXBkYXRlcy5wdXNoKHVwZGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgYXdhaXQgdGhpcy5zZW5kVmlld0NvbnRleHRVcGRhdGVzKHVwZGF0ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXVzZUVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5qZWN0LmdldChSRVVTRV9ST1VURVJfU0xPVF9DT01QT05FTlQpO1xyXG4gICAgICByZXR1cm4gdmFsdWUgIT09IGZhbHNlOyAvLyBkZWZhdWx0IE9OIHdoZW4gdW5zZXQvbnVsbFxyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleGVjdXRlUmV1c2Uob2xkVmlldzogVmlld0RhdGEsIG5ld1ZpZXc6IFZpZXdEYXRhKTogVmlld1N0YXRlVXBkYXRlW10ge1xyXG4gICAgY29uc3QgcmVmID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbmQoKHIpID0+IHIudXVpZCA9PT0gb2xkVmlldy51dWlkKTtcclxuICAgIGlmICghcmVmKSB7XHJcbiAgICAgIC8vIE5vIGxpdmUgY29tcG9uZW50IHRvIHJldXNlIChlLmcuIHdhcyByb3V0ZS1yZW5kZXJlZCkg4oCUIGZhbGwgYmFjayB0byBjbG9zZSArIG9wZW4uXHJcbiAgICAgIGNvbnN0IHVwZGF0ZXMgPSBbLi4udGhpcy5jbG9zZVZpZXcob2xkVmlldyldO1xyXG4gICAgICBjb25zdCBvcGVuZWQgPSB0aGlzLm9wZW5WaWV3KG5ld1ZpZXcpO1xyXG4gICAgICBpZiAob3BlbmVkKSB1cGRhdGVzLnB1c2gob3BlbmVkKTtcclxuICAgICAgcmV0dXJuIHVwZGF0ZXM7XHJcbiAgICB9XHJcbiAgICAvLyBUaGUgcmV1c2VkIHBhcmVudCBpcyBsb2dpY2FsbHkgYSBmcmVzaCBwYWdlIChuZXcgdXVpZCk7IGl0cyBwcmV2aW91cyBlbWJlZGRlZFxyXG4gICAgLy8gY2hpbGRyZW4gZG8gbm90IGNhcnJ5IG92ZXIgKHRoZSBiYWNrZW5kIGxlYXZlcyB0aGVtIGtleWVkIHVuZGVyIHRoZSBvbGQgcGFyZW50XHJcbiAgICAvLyB1dWlkKS4gVGVhciB0aGVtIGRvd24gaGVyZSBhbmQgcmVwb3J0IHRoZW0gQ0xPU0VELlxyXG4gICAgY29uc3QgY2hpbGRVcGRhdGVzID0gdGhpcy5jbGVhbnVwRW1iZWRkZWRDaGlsZHJlbihvbGRWaWV3LnV1aWQpO1xyXG5cclxuICAgIHJlZi5jb21wb25lbnRSZWYuaW5zdGFuY2UudXVpZCA9IG5ld1ZpZXcudXVpZDsgLy8gc2V0dGVyIHJ1bnMgdW5mb2xsb3cob2xkKS9mb2xsb3cobmV3KVxyXG4gICAgcmVmLnV1aWQgPSBuZXdWaWV3LnV1aWQ7XHJcblxyXG4gICAgY29uc3Qgb2xkSWR4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZihvbGRWaWV3LnV1aWQpO1xyXG4gICAgaWYgKG9sZElkeCA+PSAwKSB7XHJcbiAgICAgIHRoaXMub3BlbmVkVmlld1V1aWRzLnNwbGljZShvbGRJZHgsIDEpO1xyXG4gICAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnNwbGljZShvbGRJZHgsIDEpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMucHVzaChuZXdWaWV3LnV1aWQpO1xyXG4gICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5wdXNoKG5ld1ZpZXcpO1xyXG5cclxuICAgIHJlZi5jb21wb25lbnRSZWYuaW5zdGFuY2UucnVuKCk7XHJcblxyXG4gICAgb2xkVmlldy5zdGF0ZSA9IFZpZXdTdGF0ZS5DTE9TRUQ7XHJcbiAgICBuZXdWaWV3LnN0YXRlID0gVmlld1N0YXRlLk9QRU5FRDtcclxuXHJcbiAgICAvLyBNaXJyb3IgdGhlIG5vcm1hbCBvcGVuVmlldyB0YWlsIHNvIGdldFV1aWRPZlBhZ2UgY29uc3VtZXJzIChlLmcuIHRyZWVzKSByZXNvbHZlIHRoZSBuZXcgdXVpZC5cclxuICAgIGNvbnN0IHZpZXdIYW5kbGVyID0gcmVzb2x2ZVZpZXdIYW5kbGVyKHRoaXMudmlld0hhbmRsZXJzLCB0aGlzLmRlZmF1bHRDb21wb25lbnRzLCBuZXdWaWV3KTtcclxuICAgIHRoaXMuc2V0VXVpZE9mUGFnZShuZXdWaWV3LnZpZXdOYW1lLCBuZXdWaWV3LnV1aWQsIHZpZXdIYW5kbGVyPy5jb21wb25lbnROYW1lKTtcclxuICAgIHRoaXMudXVpZE9mUGFnZUhhc0JlZW5DaGFuZ2VkLm5leHQobmV3Vmlldy52aWV3TmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIFtcclxuICAgICAgLi4uY2hpbGRVcGRhdGVzLFxyXG4gICAgICB7IHN0YXRlOiBWaWV3U3RhdGUuQ0xPU0VELCB1dWlkOiBvbGRWaWV3LnV1aWQgfSxcclxuICAgICAgeyBzdGF0ZTogVmlld1N0YXRlLk9QRU5FRCwgdXVpZDogbmV3Vmlldy51dWlkIH0sXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHN5bmNWaWV3KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgdXBkYXRlczogKFZpZXdTdGF0ZVVwZGF0ZSB8IHVuZGVmaW5lZClbXSA9IFtdO1xyXG4gICAgY29uc3Qgb3BzID0gYnVpbGRWaWV3T3BzKHRoaXMudmlld0NvbnRleHQ/LnZpZXdzID8/IFtdLCB0aGlzLnJldXNlRW5hYmxlZCgpKTtcclxuICAgIGZvciAoY29uc3Qgb3Agb2Ygb3BzKSB7XHJcbiAgICAgIGlmIChvcC5raW5kID09PSAnb3BlbicpIHtcclxuICAgICAgICB1cGRhdGVzLnB1c2godGhpcy5vcGVuVmlldyhvcC52aWV3KSk7XHJcbiAgICAgIH0gZWxzZSBpZiAob3Aua2luZCA9PT0gJ2Nsb3NlJykge1xyXG4gICAgICAgIHVwZGF0ZXMucHVzaCguLi50aGlzLmNsb3NlVmlldyhvcC52aWV3KSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXBkYXRlcy5wdXNoKC4uLnRoaXMuZXhlY3V0ZVJldXNlKG9wLm9sZFZpZXcsIG9wLm5ld1ZpZXcpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdEYXRhVG9DbG9zZSA9IHRoaXMub3BlbmVkVmlld0RhdGEuZmlsdGVyKFxyXG4gICAgICAodmlld0RhdGE6IFZpZXdEYXRhKSA9PlxyXG4gICAgICAgICF0aGlzLnZpZXdDb250ZXh0Py52aWV3c1xyXG4gICAgICAgICAgLmZsYXRNYXAoKHZpZXdEYXRhOiBWaWV3RGF0YSkgPT4gdmlld0RhdGEudXVpZClcclxuICAgICAgICAgIC5pbmNsdWRlcyh2aWV3RGF0YS51dWlkKVxyXG4gICAgKTtcclxuICAgIGlmICh2aWV3RGF0YVRvQ2xvc2U/Lmxlbmd0aCkge1xyXG4gICAgICB2aWV3RGF0YVRvQ2xvc2UubWFwKCh2aWV3RGF0YTogVmlld0RhdGEpID0+IHtcclxuICAgICAgICB1cGRhdGVzLnB1c2goLi4udGhpcy5jbG9zZVZpZXcodmlld0RhdGEpKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aWV3Q29udGV4dD8ubGlua3M/Lm1hcCgoZGF0YTogTGluaykgPT4ge1xyXG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICBsZXQgdGFyZ2V0ID0gJ19ibGFuayc7IC8vIGRlZmF1bHRcclxuICAgICAgc3dpdGNoIChkYXRhLnRhcmdldCA/PyBMaW5rVGFyZ2V0RW51bS5CTEFOSykge1xyXG4gICAgICAgIGNhc2UgJ1NFTEYnOlxyXG4gICAgICAgICAgdGFyZ2V0ID0gJ19zZWxmJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0JMQU5LJzpcclxuICAgICAgICAgIHRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnUEFSRU5UJzpcclxuICAgICAgICAgIHRhcmdldCA9ICdfcGFyZW50JztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ1RPUCc6XHJcbiAgICAgICAgICB0YXJnZXQgPSAnX3RvcCc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgdGFyZ2V0KTtcclxuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBkYXRhLnVybCk7XHJcbiAgICAgIGlmIChkYXRhLmRvd25sb2FkKSB7XHJcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgZGF0YS5maWxlbmFtZSA/PyAnJyk7XHJcbiAgICAgIH1cclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICBsaW5rLnJlbW92ZSgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdGFydERvd25sb2Fkc0ZpbGVzKHRoaXMudmlld0NvbnRleHQ/LmRvd25sb2FkcyB8fCBbXSk7XHJcblxyXG4gICAgY29uc3QgY2xpcGJvYXJkVGV4dCA9IHRoaXMudmlld0NvbnRleHQ/LmNsaXBib2FyZERhdGFcclxuICAgICAgPy5tYXAoKGNkOiBDbGlwYm9hcmREYXRhKSA9PiBjZC50ZXh0IHx8ICcnKVxyXG4gICAgICAuam9pbignJyk7XHJcbiAgICBpZiAoY2xpcGJvYXJkVGV4dCkge1xyXG4gICAgICBjb25zdCBjbGlwYm9hcmQgPSBuYXZpZ2F0b3IuY2xpcGJvYXJkO1xyXG4gICAgICAvLyBhdmFpbGFibGUgb25seSBpbiBzZWN1cmUgY29udGV4dHMuXHJcbiAgICAgIGlmIChjbGlwYm9hcmQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY2xpcGJvYXJkXHJcbiAgICAgICAgICAgIC53cml0ZVRleHQoY2xpcGJvYXJkVGV4dClcclxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY29weSB0ZXh0IHRvIGNsaXBib2FyZCcsIGUpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgY2xpcGJvYXJkJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLnNlbmRWaWV3Q29udGV4dFVwZGF0ZXModXBkYXRlcyk7XHJcbiAgICB0aGlzLnZpZXdDb250ZXh0SGFzQmVlblN5bmNlZC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzdGFydERvd25sb2Fkc0ZpbGVzKGRvd25sb2FkczogRG93bmxvYWRlZEZpbGVbXSkge1xyXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGRvd25sb2Fkcykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBibG9iID0gYXdhaXQgdGhpcy5kb3dubG9hZFJlc291cmNlKGZpbGUudXVpZCEsIGZpbGUuaWRlbnRpZmllciEpO1xyXG4gICAgICAgIGxldCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7XHJcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xyXG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGUuZmlsZW5hbWUhKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICBsaW5rLnJlbW92ZSgpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZG93bmxvYWRpbmcgZmlsZScsIGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFZpZXdDb250ZXh0VXVpZCh1dWlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy52aWV3Q29udGV4dFV1aWROYW1lLCB1dWlkKTtcclxuICAgIHRoaXMuc2Vzc2lvbi5hZGRIZWFkZXJQYXJhbSh7XHJcbiAgICAgIGhlYWRlck5hbWU6IHRoaXMudmlld0NvbnRleHRVdWlkSGVhZGVyTmFtZSxcclxuICAgICAgdmFsdWU6IHV1aWQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWaWV3Q29udGV4dFV1aWQoKTogc3RyaW5nIHtcclxuICAgIGxldCB2aWV3Q29udGV4dFV1aWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMudmlld0NvbnRleHRVdWlkTmFtZSk7XHJcbiAgICBpZiAoIXZpZXdDb250ZXh0VXVpZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpZXcgY29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQhJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmlld0NvbnRleHRVdWlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhc1ZpZXdDb250ZXh0VXVpZCgpOiBib29sZWFuIHtcclxuICAgIGxldCB2aWV3Q29udGV4dFV1aWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMudmlld0NvbnRleHRVdWlkTmFtZSk7XHJcbiAgICByZXR1cm4gdmlld0NvbnRleHRVdWlkICE9PSBudWxsICYmIHZpZXdDb250ZXh0VXVpZCAhPT0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFV1aWRPZlBhZ2UocGFnZU5hbWU6IHN0cmluZywgdXVpZDogc3RyaW5nLCBjb21wb25lbnROYW1lPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMucGFnZU5hbWVQcmVmaXggKyBwYWdlTmFtZSwgdXVpZCk7XHJcbiAgICBpZiAoY29tcG9uZW50TmFtZSkge1xyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHRoaXMuY29tcG9uZW50TmFtZVByZWZpeCArIGNvbXBvbmVudE5hbWUsIHBhZ2VOYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhclV1aWRPZlBhZ2UocGFnZU5hbWU6IHN0cmluZywgY29tcG9uZW50TmFtZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnBhZ2VOYW1lUHJlZml4ICsgcGFnZU5hbWUpO1xyXG4gICAgaWYgKGNvbXBvbmVudE5hbWUpIHtcclxuICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmNvbXBvbmVudE5hbWVQcmVmaXggKyBjb21wb25lbnROYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRVdWlkT2ZQYWdlKHBhZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHV1aWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMucGFnZU5hbWVQcmVmaXggKyBwYWdlTmFtZSk7XHJcbiAgICBpZiAoIXV1aWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdXVpZCBvZiAke3BhZ2VOYW1lfSBpcyBub3QgYXZhaWxhYmxlLmApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHV1aWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UGFnZU5hbWVPZkNvbXBvbmVudChjb21wb25lbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHBhZ2VOYW1lID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmNvbXBvbmVudE5hbWVQcmVmaXggKyBjb21wb25lbnROYW1lKTtcclxuICAgIGlmICghcGFnZU5hbWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGFnZU5hbWUgb2YgJHtjb21wb25lbnROYW1lfSBpcyBub3QgYXZhaWxhYmxlLmApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhZ2VOYW1lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIG1lc3NhZ2UobWVzc2FnZURhdGE6IE1lc3NhZ2VEYXRhLCBtZXNzYWdlUmVzdWx0OiBNZXNzYWdlUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXHJcbiAgICAgIGF3YWl0IHRoaXMudmlld1xyXG4gICAgICAgIC5tZXNzYWdlKG1lc3NhZ2VEYXRhLnZpZXdVdWlkID8/ICcnLCBtZXNzYWdlRGF0YS51dWlkLCBtZXNzYWdlUmVzdWx0KVxyXG4gICAgICAgIC50b1Byb21pc2UoKVxyXG4gICAgKTtcclxuICAgIC8vIGluIGZ1dHVyZSB1c2UgdGhpcy5hcGlRdWV1ZVNlcnZpY2UuYWRkVG9RdWV1ZVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvckJ5Q29kZShjb2RlOiBzdHJpbmcpOiBQcm9taXNlPFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcj4ge1xyXG4gICAgbGV0IGJ1dHRvbkxhYmVsO1xyXG4gICAgbGV0IGRpYWxvZ1RpdGxlO1xyXG4gICAgbGV0IG1lc3NhZ2U7XHJcbiAgICBpZiAodGhpcy50cmFuc2xhdGVTZXJ2aWNlKSB7XHJcbiAgICAgIGJ1dHRvbkxhYmVsID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlXHJcbiAgICAgICAgLmdldChTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dCdXR0b25MYWJlbClcclxuICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICAgIGRpYWxvZ1RpdGxlID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFNtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ01lc3NhZ2UpLnRvUHJvbWlzZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYnV0dG9uTGFiZWwgPSAnT2snO1xyXG4gICAgICBkaWFsb2dUaXRsZSA9ICdIaWJhJztcclxuICAgICAgbWVzc2FnZSA9ICdBbiBlcnJvciBoYXMgb2NjdXJlZC4nO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5zbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgY29kZSxcclxuICAgICAgICBtZXNzYWdlLFxyXG4gICAgICAgIGJ1dHRvbkxhYmVsLFxyXG4gICAgICAgIGRpYWxvZ1RpdGxlLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgbGV0IGFwaUVycm9yc1dpdGhDb2RlID0gdGhpcy5zbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzLnZpZXdDb250ZXh0QXBpRXJyb3JzLmZpbHRlcihcclxuICAgICAgKGFwaUVycm9yOiBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3IpID0+IHtcclxuICAgICAgICByZXR1cm4gYXBpRXJyb3IuY29kZSA9PT0gY29kZTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIGlmICghYXBpRXJyb3JzV2l0aENvZGUgfHwgKGFwaUVycm9yc1dpdGhDb2RlICYmICFhcGlFcnJvcnNXaXRoQ29kZS5sZW5ndGgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvciB3aXRoIGNvZGUgJHtjb2RlfSBjb3VsZCBub3QgYmUgZm91bmQuYCk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGNvZGUsXHJcbiAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICBidXR0b25MYWJlbCxcclxuICAgICAgICBkaWFsb2dUaXRsZSxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcGlFcnJvcnNXaXRoQ29kZVswXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3Q29uc3RyYWludCh1dWlkOiBzdHJpbmcpOiBQcm9taXNlPFZpZXdDb25zdHJhaW50PiB7XHJcbiAgICBsZXQgdmlld0NvbnN0cmFpbnRSZXNwb25zZSA9IGF3YWl0IHRoaXMudmlldy5nZXRWaWV3Q29uc3RyYWludCh1dWlkKS50b1Byb21pc2UoKTtcclxuICAgIGlmICghdmlld0NvbnN0cmFpbnRSZXNwb25zZSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZ2V0IFZpZXdDb25zdHJhaW50IHdpdGggdGhlIGdpdmVuIHV1aWQuJyk7XHJcbiAgICByZXR1cm4gdmlld0NvbnN0cmFpbnRSZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzaG93UHVibGlzaGVkVmlldyhjaGFubmVsOiBzdHJpbmcsIHV1aWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc09wZW5pbmdTbWFydExpbmsgPSB0cnVlO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuc2Vzc2lvbi5pbml0aWFsaXplKCk7XHJcbiAgICAvLyBUT0RPIGluaXQgdmlldyBjb250ZXh0IGF1dG9tYXRpY2FsbHlcclxuICAgIC8vIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG4gICAgYXdhaXQgdGhpcy5pbml0Vmlld0NvbnRleHQoKTtcclxuXHJcbiAgICB0aGlzLm9wZW5TbWFydExpbmsubmV4dChbY2hhbm5lbCwgdXVpZF0pO1xyXG4gICAgYXdhaXQgdGhpcy5vcGVuU21hcnRMaW5rLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMudmlldy5zaG93UHVibGlzaGVkVmlldyhjaGFubmVsLCB1dWlkKS50b1Byb21pc2UoKTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0QW5kU3luY1ZpZXdDb250ZXh0KCk7XHJcbiAgICB0aGlzLmlzT3BlbmluZ1NtYXJ0TGluayA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRvd25sb2FkUmVzb3VyY2UodXVpZDogc3RyaW5nLCBpdGVtOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudmlldy5kb3dubG9hZEl0ZW0odXVpZCwgaXRlbSkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybUFjdGlvbih1dWlkOiBzdHJpbmcsIHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyZm9ybUFjdGlvbih7XHJcbiAgICAgIHV1aWQsXHJcbiAgICAgIHVpQWN0aW9uUmVxdWVzdCxcclxuICAgIH0pO1xyXG4gICAgLy8gY29uc3QgaXNDb21wbGV0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgLy8gdGhpcy5hcGlRdWV1ZVNlcnZpY2UuYWRkVG9RdWV1ZSh7XHJcbiAgICAvLyAgIGNhbGxiYWNrOiB0aGlzLl9wZXJmb3JtQWN0aW9uLmJpbmQodGhpcyksXHJcbiAgICAvLyAgIGNvbmZpZzoge1xyXG4gICAgLy8gICAgIHV1aWQsXHJcbiAgICAvLyAgICAgdWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBpc0NvbXBsZXRlZCxcclxuICAgIC8vIH0pO1xyXG4gICAgLy8gcmV0dXJuIGF3YWl0IGlzQ29tcGxldGVkLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHBlcmZvcm1XaWRnZXRBY3Rpb24oXHJcbiAgICB1dWlkOiBzdHJpbmcsXHJcbiAgICB3aWRnZXRJZDogc3RyaW5nLFxyXG4gICAgbm9kZUlkOiBzdHJpbmcsXHJcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3BlcmZvcm1XaWRnZXRBY3Rpb24oeyB1dWlkLCB3aWRnZXRJZCwgbm9kZUlkLCB1aUFjdGlvblJlcXVlc3QgfSk7XHJcbiAgICAvLyBjb25zdCBpc0NvbXBsZXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKHtcclxuICAgIC8vICAgY2FsbGJhY2s6IHRoaXMuX3BlcmZvcm1XaWRnZXRBY3Rpb24uYmluZCh0aGlzKSxcclxuICAgIC8vICAgY29uZmlnOiB7XHJcbiAgICAvLyAgICAgdXVpZCxcclxuICAgIC8vICAgICB3aWRnZXRJZCxcclxuICAgIC8vICAgICBub2RlSWQsXHJcbiAgICAvLyAgICAgdWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBpc0NvbXBsZXRlZCxcclxuICAgIC8vIH0pO1xyXG4gICAgLy8gcmV0dXJuIGF3YWl0IGlzQ29tcGxldGVkLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHBlcmZvcm1XaWRnZXRNYWluQWN0aW9uKFxyXG4gICAgdXVpZDogc3RyaW5nLFxyXG4gICAgd2lkZ2V0SWQ6IHN0cmluZyxcclxuICAgIHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0XHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyZm9ybVdpZGdldE1haW5BY3Rpb24oeyB1dWlkLCB3aWRnZXRJZCwgdWlBY3Rpb25SZXF1ZXN0IH0pO1xyXG4gICAgLy8gY29uc3QgaXNDb21wbGV0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgLy8gdGhpcy5hcGlRdWV1ZVNlcnZpY2UuYWRkVG9RdWV1ZSh7XHJcbiAgICAvLyAgIGNhbGxiYWNrOiB0aGlzLl9wZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgLy8gICBjb25maWc6IHtcclxuICAgIC8vICAgICB1dWlkLFxyXG4gICAgLy8gICAgIHdpZGdldElkLFxyXG4gICAgLy8gICAgIHVpQWN0aW9uUmVxdWVzdCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgaXNDb21wbGV0ZWQsXHJcbiAgICAvLyB9KTtcclxuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtVXBsb2FkQWN0aW9uKFxyXG4gICAgdXVpZDogc3RyaW5nLFxyXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICBwYXJhbTogJ2lucHV0JyB8ICdpbnB1dFwiJyxcclxuICAgIGNvbnRlbnQ6IGFueVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fcGVyZm9ybVVwbG9hZEFjdGlvbih7XHJcbiAgICAgIHV1aWQsXHJcbiAgICAgIHVpQWN0aW9uUmVxdWVzdCxcclxuICAgICAgcGFyYW0sXHJcbiAgICAgIGNvbnRlbnQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtVXBsb2FkTXVsdGlwbGVBY3Rpb24oXHJcbiAgICB1dWlkOiBzdHJpbmcsXHJcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIHBhcmFtOiAnaW5wdXQnIHwgJ2lucHV0MicsXHJcbiAgICBjb250ZW50OiBhbnlbXVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fcGVyZm9ybVVwbG9hZE11bHRpcGxlQWN0aW9uKHtcclxuICAgICAgdXVpZCxcclxuICAgICAgdWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgICBwYXJhbSxcclxuICAgICAgY29udGVudCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGRhdGFDaGFuZ2VkKHV1aWQ6IHN0cmluZywgZGF0YUNoYW5nZTogRGF0YUNoYW5nZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2RhdGFDaGFuZ2VkKHsgdXVpZCwgZGF0YUNoYW5nZSB9KTtcclxuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIC8vIHRoaXMuYXBpUXVldWVTZXJ2aWNlLmFkZFRvUXVldWUoXHJcbiAgICAvLyAgIHtcclxuICAgIC8vICAgICBjYWxsYmFjazogdGhpcy5fZGF0YUNoYW5nZWQuYmluZCh0aGlzKSxcclxuICAgIC8vICAgICBjb25maWc6IHtcclxuICAgIC8vICAgICAgIHV1aWQsXHJcbiAgICAvLyAgICAgICBkYXRhQ2hhbmdlLFxyXG4gICAgLy8gICAgIH0sXHJcbiAgICAvLyAgICAgaXNDb21wbGV0ZWQsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIHRydWVcclxuICAgIC8vICk7XHJcbiAgICAvLyByZXR1cm4gYXdhaXQgaXNDb21wbGV0ZWQudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtQWN0aW9uKGNvbmZpZzogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXHJcbiAgICAgIGF3YWl0IHRoaXMudmlldy5wZXJmb3JtQWN0aW9uKGNvbmZpZy51dWlkLCBjb25maWcudWlBY3Rpb25SZXF1ZXN0KS50b1Byb21pc2UoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3BlcmZvcm1XaWRnZXRBY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcclxuICAgICAgYXdhaXQgdGhpcy52aWV3XHJcbiAgICAgICAgLnBlcmZvcm1XaWRnZXRBY3Rpb24oY29uZmlnLnV1aWQsIGNvbmZpZy53aWRnZXRJZCwgY29uZmlnLm5vZGVJZCwgY29uZmlnLnVpQWN0aW9uUmVxdWVzdClcclxuICAgICAgICAudG9Qcm9taXNlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbihjb25maWc6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxyXG4gICAgICBhd2FpdCB0aGlzLnZpZXdcclxuICAgICAgICAucGVyZm9ybVdpZGdldE1haW5BY3Rpb24oY29uZmlnLnV1aWQsIGNvbmZpZy53aWRnZXRJZCwgY29uZmlnLnVpQWN0aW9uUmVxdWVzdClcclxuICAgICAgICAudG9Qcm9taXNlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtVXBsb2FkQWN0aW9uKGNvbmZpZzogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXHJcbiAgICAgIGF3YWl0IHRoaXMudmlld1xyXG4gICAgICAgIC51cGxvYWRBY3Rpb24oXHJcbiAgICAgICAgICBjb25maWcudXVpZCxcclxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbmZpZy51aUFjdGlvblJlcXVlc3QpLFxyXG4gICAgICAgICAgY29uZmlnLnBhcmFtLFxyXG4gICAgICAgICAgY29uZmlnLmNvbnRlbnRcclxuICAgICAgICApXHJcbiAgICAgICAgLnRvUHJvbWlzZSgpXHJcbiAgICApO1xyXG4gIH1cclxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtVXBsb2FkTXVsdGlwbGVBY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcclxuICAgICAgYXdhaXQgdGhpcy52aWV3XHJcbiAgICAgICAgLnVwbG9hZE11bHRpcGxlQWN0aW9uKFxyXG4gICAgICAgICAgY29uZmlnLnV1aWQsXHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb25maWcudWlBY3Rpb25SZXF1ZXN0KSxcclxuICAgICAgICAgIGNvbmZpZy5wYXJhbSxcclxuICAgICAgICAgIGNvbmZpZy5jb250ZW50XHJcbiAgICAgICAgKVxyXG4gICAgICAgIC50b1Byb21pc2UoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2RhdGFDaGFuZ2VkKGNvbmZpZzogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcclxuICAgICAgYXdhaXQgdGhpcy52aWV3LmRhdGFDaGFuZ2VkKGNvbmZpZy51dWlkLCBjb25maWcuZGF0YUNoYW5nZSkudG9Qcm9taXNlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxyXG4gICAgdmlld0NvbnRleHRDaGFuZ2U6IFZpZXdDb250ZXh0Q2hhbmdlIHwgdW5kZWZpbmVkXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMudmlld0NvbnRleHQgPSB2aWV3Q29udGV4dENoYW5nZT8udmlld0NvbnRleHQ7XHJcbiAgICBhd2FpdCB0aGlzLnN5bmNWaWV3KCk7XHJcblxyXG4gICAgaWYgKHZpZXdDb250ZXh0Q2hhbmdlPy5jaGFuZ2VzKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlcyh2aWV3Q29udGV4dENoYW5nZS5jaGFuZ2VzKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2aWV3Q29udGV4dENoYW5nZT8ucmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVDaGFuZ2VzKGNoYW5nZXM6IEFycmF5PENvbXBvbmVudE1vZGVsQ2hhbmdlPik6IHZvaWQge1xyXG4gICAgY2hhbmdlcy5mb3JFYWNoKChjb21wb25lbnRNb2RlbENoYW5nZTogQ29tcG9uZW50TW9kZWxDaGFuZ2UpID0+IHtcclxuICAgICAgbGV0IGRldGVjdENoYW5nZTogU21hcnRTdWJqZWN0PENvbXBvbmVudE1vZGVsQ2hhbmdlPiB8IHVuZGVmaW5lZCA9IHRoaXMuc21hcnRBcGlDbGllbnRzLmdldChcclxuICAgICAgICBjb21wb25lbnRNb2RlbENoYW5nZS51dWlkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChkZXRlY3RDaGFuZ2UpIHtcclxuICAgICAgICBkZXRlY3RDaGFuZ2UubmV4dChjb21wb25lbnRNb2RlbENoYW5nZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxDb21wb25lbnRNb2RlbCB8IHVuZGVmaW5lZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudmlldy5nZXRDb21wb25lbnRNb2RlbCh1dWlkKS50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkMih1dWlkOiBzdHJpbmcpOiBQcm9taXNlPFZpZXdDb250ZXh0Q2hhbmdlIHwgdW5kZWZpbmVkPiB7XHJcbiAgICBsZXQgY2hhbmdlID0gYXdhaXQgdGhpcy52aWV3LmdldENvbXBvbmVudE1vZGVsMih1dWlkKS50b1Byb21pc2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKGNoYW5nZSk7XHJcbiAgICByZXR1cm4gY2hhbmdlO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VycmVudFZpZXdDb250ZXh0KCk6IFZpZXdDb250ZXh0RGF0YSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBJU19BU1lOQ19QQVJBTV9OQU1FID0gJ2lzQXN5bmMnO1xyXG5cclxuLyoqIEEgcmVnaXN0ZXJlZCBlbWJlZGRlZCBzbG90OiBpdHMgVmlld0NvbnRhaW5lclJlZiBwbHVzIHRoZSBsaWZlY3ljbGUgY2xhc3MgaXRzXHJcbiAqICByZWdpc3RyYW50IGRlY2xhcmVkLCBzbyB0aGUgbGF5b3V0IGRldGFjaC9jbGVhbnVwIGRhbmNlIGNhbiBza2lwICdzdGFibGUnIHNsb3RzLiAqL1xyXG5pbnRlcmZhY2UgRW1iZWRkZWRTbG90RW50cnkge1xyXG4gIHZjUmVmOiBWaWV3Q29udGFpbmVyUmVmO1xyXG4gIGtpbmQ6IFNsb3RLaW5kO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFwaVF1ZXVlQ2FsbCB7XHJcbiAgY2FsbGJhY2s6IChjb25maWc6IGFueSkgPT4gUHJvbWlzZTxhbnk+O1xyXG4gIGNvbmZpZzogYW55O1xyXG4gIGlzQ29tcGxldGVkOiBTdWJqZWN0PHZvaWQ+O1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBpUXVldWVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBwcml2YXRlIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHByaXZhdGUgcXVldWU6IEFwaVF1ZXVlQ2FsbFtdID0gW107XHJcbiAgcHJpdmF0ZSBpc1Byb2Nlc3NpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHF1ZXVlU3ViamVjdDogU3ViamVjdDx2b2lkPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMucXVldWVTdWJqZWN0LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucHJvY2Vzc1F1ZXVlKCkpO1xyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBhZGRUb1F1ZXVlKGNhbGw6IEFwaVF1ZXVlQ2FsbCwgcHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKHByaW9yaXR5KSB7XHJcbiAgICAgIHRoaXMucXVldWUudW5zaGlmdChjYWxsKTsgLy8gQWRkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlIGlmIGl0IGhhcyBoaWdoZXIgcHJpb3JpdHlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucXVldWUucHVzaChjYWxsKTsgLy8gQWRkIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlIGlmIGl0IGhhcyBsb3dlciBwcmlvcml0eVxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZykge1xyXG4gICAgICB0aGlzLnByb2Nlc3NRdWV1ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcHJvY2Vzc1F1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhcGlRdWV1ZUNhbGwgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XHJcbiAgICBpZiAoYXBpUXVldWVDYWxsKSB7XHJcbiAgICAgIGF3YWl0IGFwaVF1ZXVlQ2FsbC5jYWxsYmFjayhhcGlRdWV1ZUNhbGwuY29uZmlnKTtcclxuICAgICAgYXBpUXVldWVDYWxsLmlzQ29tcGxldGVkLmNvbXBsZXRlKCk7XHJcbiAgICAgIHRoaXMucXVldWVTdWJqZWN0Lm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|