@smartbit4all/ng-client 5.0.21 → 6.0.1

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