ngx-bimplus-components 0.0.148-28792-2 → 0.0.149

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 (320) hide show
  1. package/assets/images/default/27_Center_Menu.svg +3 -3
  2. package/assets/images/default/27_Center_Menu_active.svg +3 -3
  3. package/assets/images/default/27_Center_Menu_opened.svg +14 -14
  4. package/assets/images/default/3_dots.svg +10 -10
  5. package/assets/images/default/3_dots_active.svg +10 -10
  6. package/assets/images/default/6-dots-gray.svg +10 -10
  7. package/assets/images/default/6_dots_gray.svg +8 -8
  8. package/assets/images/default/Add_Issue_active.svg +12 -12
  9. package/assets/images/default/Add_Issue_disabled.svg +12 -12
  10. package/assets/images/default/Allplan-Cloud-Viewer-Logo.svg +17 -17
  11. package/assets/images/default/Allplan-Cloud-Viewer-Logo_black.svg +16 -16
  12. package/assets/images/default/Allplan-Connexis-Logo.svg +8 -8
  13. package/assets/images/default/Allplan-Connexis-Logo_black.svg +11 -11
  14. package/assets/images/default/Allplan_Bimplus_Logo.svg +14 -14
  15. package/assets/images/default/Fullscreen_active.svg +6 -6
  16. package/assets/images/default/Fullscreen_disabled.svg +8 -8
  17. package/assets/images/default/GetTeam.svg +7 -7
  18. package/assets/images/default/Hide_active.svg +12 -12
  19. package/assets/images/default/Hide_disabled.svg +12 -12
  20. package/assets/images/default/IsolateMenuClipped.svg +19 -19
  21. package/assets/images/default/IsolateMenuClipped_maincolor.svg +19 -19
  22. package/assets/images/default/IsolateMenuHidden.svg +8 -8
  23. package/assets/images/default/IsolateMenuHidden_maincolor.svg +5 -5
  24. package/assets/images/default/IsolateMenuNormal.svg +29 -29
  25. package/assets/images/default/IsolateMenuNormal_maincolor.svg +29 -29
  26. package/assets/images/default/IsolationMenuParams.svg +5 -5
  27. package/assets/images/default/IsolationMenuParamsmaincolor.svg +5 -5
  28. package/assets/images/default/Isolation_active.svg +12 -12
  29. package/assets/images/default/Isolation_disabled.svg +12 -12
  30. package/assets/images/default/Markup_active.svg +11 -11
  31. package/assets/images/default/Markup_disabled.svg +11 -11
  32. package/assets/images/default/Navigation_Map_active.svg +3 -3
  33. package/assets/images/default/Navigation_Map_disabled.svg +5 -5
  34. package/assets/images/default/Pipette_18_maincolor.svg +3 -3
  35. package/assets/images/default/ProjectNavigation_20_maincolor.svg +10 -10
  36. package/assets/images/default/Project_Navigation_active.svg +10 -10
  37. package/assets/images/default/Project_Navigation_disabled.svg +10 -10
  38. package/assets/images/default/Properties_18_gray.svg +3 -3
  39. package/assets/images/default/Properties_18_maincolor.svg +3 -3
  40. package/assets/images/default/Quantity_active.svg +3 -3
  41. package/assets/images/default/Quantity_disabled.svg +5 -5
  42. package/assets/images/default/Reset_active.svg +10 -10
  43. package/assets/images/default/Reset_disabled.svg +10 -10
  44. package/assets/images/default/Section_active.svg +3 -3
  45. package/assets/images/default/Section_disabled.svg +5 -5
  46. package/assets/images/default/Spinner_18_disabled.svg +15 -15
  47. package/assets/images/default/View_active.svg +4 -4
  48. package/assets/images/default/View_disabled.svg +6 -6
  49. package/assets/images/default/bimplus_Components_Account_Settings.svg +14 -14
  50. package/assets/images/default/bimplus_Components_Add_Ins.svg +3 -3
  51. package/assets/images/default/bimplus_Components_Autoconverter.svg +14 -14
  52. package/assets/images/default/bimplus_Components_Autoconverter_Active.svg +14 -14
  53. package/assets/images/default/bimplus_Components_Autoconverter_Disabled.svg +14 -14
  54. package/assets/images/default/bimplus_Components_BIM_Explorer.svg +4 -4
  55. package/assets/images/default/bimplus_Components_BIM_Explorer_Active.svg +4 -4
  56. package/assets/images/default/bimplus_Components_BIM_Explorer_Disabled.svg +4 -4
  57. package/assets/images/default/bimplus_Components_Clear_Cache.svg +16 -16
  58. package/assets/images/default/bimplus_Components_Close.svg +3 -3
  59. package/assets/images/default/bimplus_Components_Connexis.svg +4 -4
  60. package/assets/images/default/bimplus_Components_Connexis_Active.svg +4 -4
  61. package/assets/images/default/bimplus_Components_Connexis_Disabled.svg +4 -4
  62. package/assets/images/default/bimplus_Components_Desktop_Mode.svg +15 -15
  63. package/assets/images/default/bimplus_Components_Documents.svg +6 -6
  64. package/assets/images/default/bimplus_Components_Documents_Active.svg +4 -4
  65. package/assets/images/default/bimplus_Components_Documents_Disabled.svg +6 -6
  66. package/assets/images/default/bimplus_Components_Edit_Profile.svg +8 -8
  67. package/assets/images/default/bimplus_Components_Forum.svg +10 -10
  68. package/assets/images/default/bimplus_Components_IFC_viewer.svg +9 -9
  69. package/assets/images/default/bimplus_Components_IFC_viewer_Active.svg +16 -16
  70. package/assets/images/default/bimplus_Components_IFC_viewer_Disabled.svg +9 -9
  71. package/assets/images/default/bimplus_Components_ISO.svg +3 -3
  72. package/assets/images/default/bimplus_Components_ISO_Active.svg +3 -3
  73. package/assets/images/default/bimplus_Components_ISO_Disabled.svg +3 -3
  74. package/assets/images/default/bimplus_Components_Info.svg +10 -10
  75. package/assets/images/default/bimplus_Components_Info_Active.svg +10 -10
  76. package/assets/images/default/bimplus_Components_Languages.svg +5 -5
  77. package/assets/images/default/bimplus_Components_Logo_Black.svg +17 -17
  78. package/assets/images/default/bimplus_Components_Logout.svg +12 -12
  79. package/assets/images/default/bimplus_Components_Models.svg +10 -10
  80. package/assets/images/default/bimplus_Components_Models_Active.svg +10 -10
  81. package/assets/images/default/bimplus_Components_Models_Disabled.svg +10 -10
  82. package/assets/images/default/bimplus_Components_Notify_Alert.svg +6 -6
  83. package/assets/images/default/bimplus_Components_Notify_Close.svg +3 -3
  84. package/assets/images/default/bimplus_Components_Notify_Empty.svg +5 -5
  85. package/assets/images/default/bimplus_Components_Notify_Main.svg +5 -5
  86. package/assets/images/default/bimplus_Components_Notify_Tick_Up.svg +3 -3
  87. package/assets/images/default/bimplus_Components_Overlay_Dialog_Cross_White.svg +3 -3
  88. package/assets/images/default/bimplus_Components_Overlay_Dialog_Error_Title.svg +4 -4
  89. package/assets/images/default/bimplus_Components_Overlay_Dialog_Icon.svg +3 -3
  90. package/assets/images/default/bimplus_Components_Overlay_Dialog_Warning_Title.svg +3 -3
  91. package/assets/images/default/bimplus_Components_Projects_Folder.svg +10 -10
  92. package/assets/images/default/bimplus_Components_Projects_Folder_Active.svg +10 -10
  93. package/assets/images/default/bimplus_Components_Projects_Folder_Disabled.svg +10 -10
  94. package/assets/images/default/bimplus_Components_Setting_Active.svg +10 -10
  95. package/assets/images/default/bimplus_Components_Settings.svg +10 -10
  96. package/assets/images/default/bimplus_Components_Settings_Disabled.svg +10 -10
  97. package/assets/images/default/bimplus_Components_Shop.svg +13 -13
  98. package/assets/images/default/bimplus_Components_Shop_Disabled.svg +13 -13
  99. package/assets/images/default/bimplus_Components_Support.svg +21 -21
  100. package/assets/images/default/bimplus_Components_Team_Members.svg +5 -5
  101. package/assets/images/default/bimplus_Components_Team_Members_Active.svg +5 -5
  102. package/assets/images/default/bimplus_Components_Touch_Mode.svg +16 -16
  103. package/assets/images/default/bimplus_Components_User_Guide.svg +17 -17
  104. package/assets/images/default/bimplus_Components_Users.svg +4 -4
  105. package/assets/images/default/bimplus_Components_Users_Active.svg +4 -4
  106. package/assets/images/default/bimplus_Components_Users_Disabled.svg +4 -4
  107. package/assets/images/default/bimplus_Components_Zoom.svg +5 -5
  108. package/assets/images/default/bimplus_Components_navbar_menu.svg +6 -6
  109. package/assets/images/default/bimplus_Components_navbar_menu_active.svg +6 -6
  110. package/assets/images/default/bimplus_Components_navbar_menu_disabled.svg +6 -6
  111. package/assets/images/default/bimplus_Components_submenu_arrow.svg +4 -4
  112. package/assets/images/default/bimplus_Remove_Conection.svg +15 -15
  113. package/assets/images/default/bimplus_WebIcons_Cross.svg +1 -1
  114. package/assets/images/default/checkbox_mixed.svg +4 -4
  115. package/assets/images/default/checkbox_off.svg +3 -3
  116. package/assets/images/default/checkbox_off_disabled.svg +3 -3
  117. package/assets/images/default/checkbox_off_hovered.svg +3 -3
  118. package/assets/images/default/checkbox_off_pressed.svg +3 -3
  119. package/assets/images/default/checkbox_on.svg +4 -4
  120. package/assets/images/default/checkbox_on_disabled.svg +4 -4
  121. package/assets/images/default/checkbox_on_hovered.svg +4 -4
  122. package/assets/images/default/checkbox_on_pressed.svg +4 -4
  123. package/assets/images/default/cm_view_front_black.svg +4 -4
  124. package/assets/images/default/cm_view_front_maincolor.svg +4 -4
  125. package/assets/images/default/cm_view_perspective_black.svg +3 -3
  126. package/assets/images/default/cm_view_perspective_maincolor.svg +3 -3
  127. package/assets/images/default/cm_view_side_black.svg +4 -4
  128. package/assets/images/default/cm_view_side_maincolor.svg +4 -4
  129. package/assets/images/default/cm_view_top_black.svg +4 -4
  130. package/assets/images/default/cm_view_top_maincolor.svg +4 -4
  131. package/assets/images/default/collapsed_18.svg +3 -3
  132. package/assets/images/default/collapsed_18_small.svg +3 -3
  133. package/assets/images/default/expanded_18.svg +3 -3
  134. package/assets/images/default/expanded_18_small.svg +3 -3
  135. package/assets/images/default/eye_active.svg +4 -4
  136. package/assets/images/default/eye_semiactive.svg +4 -4
  137. package/assets/images/default/ic_drag.svg +8 -8
  138. package/assets/images/default/ic_eye_black.svg +5 -5
  139. package/assets/images/default/ic_eye_maincolor.svg +5 -5
  140. package/assets/images/default/ic_make_transparent.svg +4 -4
  141. package/assets/images/default/ic_make_transparent_active.svg +4 -4
  142. package/assets/images/default/ic_property_manager.svg +10 -10
  143. package/assets/images/default/ic_property_manager_active.svg +10 -10
  144. package/assets/images/default/ic_property_manager_disabled.svg +10 -10
  145. package/assets/images/default/ic_reset.svg +3 -3
  146. package/assets/images/default/ic_thin_arrow_left.svg +3 -3
  147. package/assets/images/default/ic_toggle_off_gray.svg +4 -4
  148. package/assets/images/default/ic_toggle_on_green.svg +4 -4
  149. package/assets/images/default/ic_toggle_on_light_green.svg +4 -4
  150. package/assets/images/default/icon-hide-param-maincolor.svg +5 -5
  151. package/assets/images/default/icon-hide-param-white.svg +5 -5
  152. package/assets/images/default/resize_handle_ne.svg +4 -4
  153. package/assets/images/default/resize_handle_se.svg +4 -4
  154. package/assets/images/default/switcher_active.svg +4 -4
  155. package/assets/images/default/switcher_inactive.svg +4 -4
  156. package/assets/images/default/switcher_semiactive.svg +4 -4
  157. package/assets/images/default/visibility_active.svg +4 -4
  158. package/assets/images/default/visibility_inactive.svg +4 -4
  159. package/assets/images/default/visibility_semiactive.svg +4 -4
  160. package/assets/languages/strings_cs.json +2311 -2359
  161. package/assets/languages/strings_de.json +2348 -2359
  162. package/assets/languages/strings_en.json +2385 -2385
  163. package/assets/languages/strings_es.json +2311 -2359
  164. package/assets/languages/strings_fr.json +2315 -2359
  165. package/assets/languages/strings_it.json +2311 -2359
  166. package/assets/languages/strings_ro.json +2311 -2359
  167. package/assets/languages/strings_ru.json +2311 -2359
  168. package/assets/languages/strings_tr.json +2311 -2359
  169. package/assets/languages/strings_us.json +2323 -2359
  170. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.mjs +7 -20
  171. package/esm2022/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.mjs +2 -5
  172. package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.component.mjs +7 -7
  173. package/esm2022/lib/components/bimplus-connection-designer/bimplus-connection-designer.service.mjs +3 -3
  174. package/esm2022/lib/components/bimplus-connection-designer-results/bimplus-connection-designer-results.component.mjs +5 -5
  175. package/esm2022/lib/components/bimplus-contact/bimplus-contact.component.mjs +3 -3
  176. package/esm2022/lib/components/bimplus-context-menu/bimplus-context-menu.component.mjs +5 -5
  177. package/esm2022/lib/components/bimplus-flat-tree/bimplus-flat-tree.component.mjs +5 -5
  178. package/esm2022/lib/components/bimplus-floating-bar/bimplus-floating-bar.component.mjs +5 -5
  179. package/esm2022/lib/components/bimplus-floating-bar-body/bimplus-floating-bar-body.component.mjs +3 -3
  180. package/esm2022/lib/components/bimplus-floating-bar-dragger/bimplus-floating-bar-dragger.component.mjs +5 -5
  181. package/esm2022/lib/components/bimplus-floating-bar-header-content/bimplus-floating-bar-header-content.component.mjs +6 -6
  182. package/esm2022/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.mjs +6 -6
  183. package/esm2022/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.mjs +5 -5
  184. package/esm2022/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.mjs +5 -5
  185. package/esm2022/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.mjs +5 -5
  186. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-dialog-config-settings.mjs +1 -1
  187. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.component.mjs +5 -5
  188. package/esm2022/lib/components/bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service.mjs +4 -4
  189. package/esm2022/lib/components/bimplus-language-menu/bimplus-language-menu.component.mjs +5 -5
  190. package/esm2022/lib/components/bimplus-localized-widget/bimplus-localized-widget.component.mjs +5 -5
  191. package/esm2022/lib/components/bimplus-main-menu/bimplus-main-menu.component.mjs +5 -5
  192. package/esm2022/lib/components/bimplus-navbar/bimplus-navbar.component.mjs +5 -5
  193. package/esm2022/lib/components/bimplus-navbar/logo-state.enum.mjs +1 -1
  194. package/esm2022/lib/components/bimplus-notify/bimplus-notify.component.mjs +5 -5
  195. package/esm2022/lib/components/bimplus-object-complex-properties/bimplus-object-complex-properties.component.mjs +5 -5
  196. package/esm2022/lib/components/bimplus-object-navigator/bimplus-object-navigator.component.mjs +5 -5
  197. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.mjs +5 -5
  198. package/esm2022/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.mjs +1 -1
  199. package/esm2022/lib/components/bimplus-object-navigator/filter-criterium/filter-criterium.component.mjs +4 -4
  200. package/esm2022/lib/components/bimplus-object-navigator/object-filter-result/object-filter-result.component.mjs +5 -5
  201. package/esm2022/lib/components/bimplus-object-structure/bimplus-object-structure.component.mjs +5 -5
  202. package/esm2022/lib/components/bimplus-overlay-dialog-error/bimplus-overlay-dialog-error.component.mjs +5 -5
  203. package/esm2022/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.mjs +7 -10
  204. package/esm2022/lib/components/bimplus-panel-toolbar/bimplus-panel-toolbar.component.mjs +3 -3
  205. package/esm2022/lib/components/bimplus-project-menu/bimplus-project-menu.component.mjs +5 -5
  206. package/esm2022/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.mjs +4 -4
  207. package/esm2022/lib/components/bimplus-sidenav/bimplus-sidenav.component.mjs +5 -5
  208. package/esm2022/lib/components/bimplus-sidenav-drawer-content/bimplus-sidenav-drawer-content.component.mjs +5 -5
  209. package/esm2022/lib/components/bimplus-storage-info/bimplus-storage-info.component.mjs +5 -5
  210. package/esm2022/lib/components/bimplus-text-message/bimplus-text-message.component.mjs +5 -5
  211. package/esm2022/lib/components/bimplus-tool-hub/bimplus-tool-hub.component.mjs +5 -5
  212. package/esm2022/lib/components/bimplus-tool-hub/tool-hub-item/tool-hub-item.component.mjs +5 -5
  213. package/esm2022/lib/components/bimplus-tool-hub/tool-hub-sub-item/tool-hub-sub-item.component.mjs +5 -5
  214. package/esm2022/lib/components/bimplus-tooltip-message/bimplus-tooltip-message.component.mjs +3 -3
  215. package/esm2022/lib/components/bimplus-touch-menu/bimplus-touch-menu.component.mjs +5 -5
  216. package/esm2022/lib/components/bimplus-user-menu/bimplus-user-menu.component.mjs +5 -5
  217. package/esm2022/lib/components/bimplus-zoom/bimplus-zoom.component.mjs +5 -5
  218. package/esm2022/lib/components/expansion-panel/expansion-panel.component.mjs +5 -5
  219. package/esm2022/lib/components/expansion-panel-header/expansion-panel-header.component.mjs +3 -3
  220. package/esm2022/lib/components/expansion-panel-header-actions/expansion-panel-header-actions.component.mjs +3 -3
  221. package/esm2022/lib/components/loading-spinner/loading-spinner.component.mjs +5 -5
  222. package/esm2022/lib/components/object-properties-header/object-properties-header.component.mjs +6 -21
  223. package/esm2022/lib/components/object-properties-header/object-properties-header.interface.mjs +1 -1
  224. package/esm2022/lib/components/project-models/project-models.component.mjs +5 -5
  225. package/esm2022/lib/components/resizable-panel/resizable-panel.component.mjs +5 -5
  226. package/esm2022/lib/directives/click-outside/click-outside.directive.mjs +3 -3
  227. package/esm2022/lib/directives/component-draggable/componentsDraggable.directive.mjs +4 -4
  228. package/esm2022/lib/directives/draggable.directive.mjs +3 -3
  229. package/esm2022/lib/directives/resizable.directive.mjs +3 -3
  230. package/esm2022/lib/directives/x-draggable.directive.mjs +3 -3
  231. package/esm2022/lib/ngx-bimplus-components.component.mjs +3 -3
  232. package/esm2022/lib/ngx-bimplus-components.service.mjs +3 -3
  233. package/esm2022/lib/pipes/pxsuffix.pipe.mjs +3 -3
  234. package/esm2022/lib/services/cursors.service.mjs +4 -4
  235. package/esm2022/lib/services/language-strings.service.mjs +3 -3
  236. package/esm2022/lib/services/layout-manager.service.mjs +4 -4
  237. package/esm2022/lib/services/local-storage.service.mjs +3 -3
  238. package/esm2022/lib/services/resize-observer.service.mjs +3 -3
  239. package/esm2022/public-api.mjs +1 -17
  240. package/fesm2022/ngx-bimplus-components.mjs +268 -2342
  241. package/fesm2022/ngx-bimplus-components.mjs.map +1 -1
  242. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.component.d.ts +3 -9
  243. package/lib/components/bimplus-buttons-row/bimplus-buttons-row.interface.d.ts +0 -5
  244. package/lib/components/bimplus-floating-bar-header-logo/bimplus-floating-bar-header-logo.component.d.ts +1 -1
  245. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.component.d.ts +7 -7
  246. package/lib/components/bimplus-object-navigator/criteria-select-object-properties/criteria-select-object-properties.interface.d.ts +3 -3
  247. package/lib/components/bimplus-overlay-dialog-warning/bimplus-overlay-dialog-warning.component.d.ts +0 -3
  248. package/lib/components/bimplus-scrollable-container/bimplus-scrollable-container.component.d.ts +1 -1
  249. package/lib/components/object-properties-header/object-properties-header.component.d.ts +3 -5
  250. package/lib/components/object-properties-header/object-properties-header.interface.d.ts +0 -1
  251. package/package.json +4 -11
  252. package/public-api.d.ts +0 -16
  253. package/assets/images/default/Attachment_18_gray.svg +0 -1
  254. package/assets/images/default/Attachment_18_maincolor.svg +0 -3
  255. package/assets/images/default/Attachmentlink_18_gray.svg +0 -7
  256. package/assets/images/default/Attachmentlink_18_maincolor.svg +0 -7
  257. package/assets/images/default/Comments_18_gray.svg +0 -1
  258. package/assets/images/default/Comments_18_maincolor.svg +0 -4
  259. package/assets/images/default/Links_18_gray.svg +0 -1
  260. package/assets/images/default/Links_18_maincolor.svg +0 -4
  261. package/assets/images/default/ic_models.svg +0 -3
  262. package/assets/images/default/ic_models_maincolor.svg +0 -3
  263. package/assets/images/default/icn_grid_attachments.png +0 -0
  264. package/assets/images/default/icn_grid_hyperlinks.png +0 -0
  265. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.component.mjs +0 -69
  266. package/esm2022/lib/components/bimplus-attachments/bimplus-attachments.interface.mjs +0 -34
  267. package/esm2022/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.mjs +0 -82
  268. package/esm2022/lib/components/bimplus-attachments/services/bimplus-attachments.service.mjs +0 -49
  269. package/esm2022/lib/components/bimplus-comment/bimplus-comment.component.mjs +0 -68
  270. package/esm2022/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.mjs +0 -58
  271. package/esm2022/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.mjs +0 -242
  272. package/esm2022/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.mjs +0 -2
  273. package/esm2022/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.mjs +0 -76
  274. package/esm2022/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.mjs +0 -78
  275. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.mjs +0 -38
  276. package/esm2022/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.mjs +0 -10
  277. package/esm2022/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.mjs +0 -89
  278. package/esm2022/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.mjs +0 -33
  279. package/esm2022/lib/components/bimplus-textarea/autoResizeTextarea.directive.mjs +0 -83
  280. package/esm2022/lib/components/bimplus-textarea/bimplus-textarea.component.mjs +0 -122
  281. package/esm2022/lib/components/links-to-documents/links-to-documents.component.interface.mjs +0 -2
  282. package/esm2022/lib/components/links-to-documents/links-to-documents.component.mjs +0 -337
  283. package/esm2022/lib/components/object-hyperlinks/object-hyperlinks.component.mjs +0 -141
  284. package/esm2022/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.mjs +0 -36
  285. package/esm2022/lib/components/object-properties/object-properties.component.mjs +0 -261
  286. package/esm2022/lib/components/object-properties/object-properties.interface.mjs +0 -2
  287. package/esm2022/lib/components/object-properties-group/object-properties-group.component.mjs +0 -40
  288. package/esm2022/lib/components/object-properties-group/object-property-value/object-property-value.component.mjs +0 -55
  289. package/esm2022/lib/pipes/bit-converter.pipe.mjs +0 -46
  290. package/esm2022/lib/pipes/get-attribute-value.pipe.mjs +0 -110
  291. package/esm2022/lib/pipes/round.pipe.mjs +0 -20
  292. package/esm2022/lib/utils/objectProperties.mjs +0 -9
  293. package/lib/components/bimplus-attachments/bimplus-attachments.component.d.ts +0 -25
  294. package/lib/components/bimplus-attachments/bimplus-attachments.interface.d.ts +0 -19
  295. package/lib/components/bimplus-attachments/components/bimplus-attachment-item/bimplus-attachment-item.component.d.ts +0 -26
  296. package/lib/components/bimplus-attachments/services/bimplus-attachments.service.d.ts +0 -12
  297. package/lib/components/bimplus-comment/bimplus-comment.component.d.ts +0 -34
  298. package/lib/components/bimplus-input-text-field/bimplus-input-text-field.component.d.ts +0 -17
  299. package/lib/components/bimplus-object-comments-list/bimplus-object-comments-list.component.d.ts +0 -51
  300. package/lib/components/bimplus-object-comments-list/bimplusObjectCommentsI.d.ts +0 -11
  301. package/lib/components/bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component.d.ts +0 -31
  302. package/lib/components/bimplus-overlay-dialog-delete/bimplus-overlay-dialog-delete.component.d.ts +0 -26
  303. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.component.d.ts +0 -16
  304. package/lib/components/bimplus-tabs-switcher/bimplus-tabs-switcher.interface.d.ts +0 -18
  305. package/lib/components/bimplus-tabs-switcher/components/bimplus-tab/bimplus-tab.component.d.ts +0 -36
  306. package/lib/components/bimplus-tabs-switcher/services/bimplus-tabs-switcher.service.d.ts +0 -15
  307. package/lib/components/bimplus-textarea/autoResizeTextarea.directive.d.ts +0 -24
  308. package/lib/components/bimplus-textarea/bimplus-textarea.component.d.ts +0 -42
  309. package/lib/components/links-to-documents/links-to-documents.component.d.ts +0 -55
  310. package/lib/components/links-to-documents/links-to-documents.component.interface.d.ts +0 -11
  311. package/lib/components/object-hyperlinks/object-hyperlinks.component.d.ts +0 -32
  312. package/lib/components/object-hyperlinks-item/object-hyperlinks-item.component.d.ts +0 -15
  313. package/lib/components/object-properties/object-properties.component.d.ts +0 -45
  314. package/lib/components/object-properties/object-properties.interface.d.ts +0 -21
  315. package/lib/components/object-properties-group/object-properties-group.component.d.ts +0 -11
  316. package/lib/components/object-properties-group/object-property-value/object-property-value.component.d.ts +0 -14
  317. package/lib/pipes/bit-converter.pipe.d.ts +0 -17
  318. package/lib/pipes/get-attribute-value.pipe.d.ts +0 -23
  319. package/lib/pipes/round.pipe.d.ts +0 -7
  320. package/lib/utils/objectProperties.d.ts +0 -2
@@ -1,337 +0,0 @@
1
- import { Component, ViewEncapsulation, Input } from '@angular/core';
2
- import { BimplusLocalizedWidgetComponent } from '../bimplus-localized-widget/bimplus-localized-widget.component';
3
- import { TranslateModule } from '@ngx-translate/core';
4
- import { from, BehaviorSubject, switchMap, forkJoin } from 'rxjs';
5
- import { concatMap } from 'rxjs/operators';
6
- import { BimplusScrollableContainerComponent } from '../bimplus-scrollable-container/bimplus-scrollable-container.component';
7
- import { BimplusButtonsRowComponent } from "../bimplus-buttons-row/bimplus-buttons-row.component";
8
- import { BimplusOverlayDialogConfirmComponent } from "../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component";
9
- import * as WebClient from 'bimplus-webclient';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@ngx-translate/core";
12
- import * as i2 from "../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service";
13
- export const EMBEDDED_MODAL_DIALOGE_TYPE_FILE = 'file';
14
- export class LinksToDocumentsComponent extends BimplusLocalizedWidgetComponent {
15
- constructor(translateService, dialogService, renderer, el) {
16
- super(translateService);
17
- this.dialogService = dialogService;
18
- this.renderer = renderer;
19
- this.el = el;
20
- this._rootObjectId = "";
21
- this.isDestroyed = false;
22
- this.localWormHole = true;
23
- //When is true then it means the creation of link is in progress
24
- this.inProgress = false;
25
- this.api = null;
26
- this.canCreateAttachmentLink = true;
27
- this.canDeleteAttachmentLink = true;
28
- this.project = null;
29
- this.wormholeSelector = "localEmbeddedModalId"; // calling application can provide a place where the iframe for documents selection will be rendered
30
- this.env = 'dev';
31
- this._currentObjectId$ = new BehaviorSubject("");
32
- this._attachmentCount = 0;
33
- this._attachments = [];
34
- this.buttonRowItems = [
35
- {
36
- id: "add-documents",
37
- title: this.translateService.instant('_Add_document'),
38
- tooltip: this.translateService.instant('_Add_document'),
39
- disabled: !this.canCreateAttachmentLink,
40
- buttonStyle: 'primary'
41
- }
42
- ];
43
- this.documentSelection = null;
44
- this.isOpened = false;
45
- this.embeddedModalContainer = 'embedded-modal';
46
- this.shadowRootElement = this.el.nativeElement.shadowRoot;
47
- }
48
- set rootObjectId(id) {
49
- this._currentObjectId$.next(id);
50
- this._rootObjectId = id;
51
- }
52
- get rootObjectId() {
53
- return this._rootObjectId;
54
- }
55
- ngOnInit() {
56
- this._currentObjectId$.subscribe({
57
- next: (id) => {
58
- this._createAttachmentLinkStructure(id);
59
- }
60
- });
61
- }
62
- ;
63
- ngOnDestroy() {
64
- this.isDestroyed = true;
65
- }
66
- fmt(string, ...formats) {
67
- let index = 0;
68
- return string.replace(/%@(\d+)?/g, (match, argumentIndex) => {
69
- const argumentIndexN = argumentIndex ? parseInt(argumentIndex, 10) - 1 : index++;
70
- const _match = formats[argumentIndexN];
71
- if (_match === null) {
72
- return '(null)';
73
- }
74
- if (_match === undefined) {
75
- return '';
76
- }
77
- return _match.toString();
78
- });
79
- }
80
- /**--------------------------------------------------------------------------
81
- * decorate link
82
- --------------------------------------------------------------------------*/
83
- _decorateLink(api, link) {
84
- const retval = {
85
- id: link.id,
86
- name: link.name,
87
- fileName: link.fileName,
88
- size: link.size,
89
- link: link.link,
90
- fileNameShort: '',
91
- extension: '',
92
- objectId: '',
93
- version: link.version
94
- };
95
- const access_token = api.getAccessToken();
96
- const attVersion = "attachments/%@/versions/%@/download";
97
- const url = api.getApiTeamUrl() + attVersion;
98
- const isEmbeddedAllplanMode = false;
99
- retval.size = parseFloat((link.size / 1000).toFixed(2));
100
- retval.link = `${this.fmt(url, link.id, link.version)}?api-token=${access_token}${isEmbeddedAllplanMode ? '' : '&openInBrowser=true'}`;
101
- if (link.fileName.length > 20) {
102
- const fileParts = link.fileName.split('.');
103
- if (fileParts.length > 1) {
104
- retval.fileNameShort = fileParts.slice(0, -1).join('.');
105
- retval.extension = "." + fileParts.slice(-1);
106
- }
107
- else {
108
- retval.fileNameShort = link.fileName;
109
- }
110
- }
111
- else {
112
- retval.fileNameShort = link.fileName;
113
- }
114
- retval.objectId = this._currentObjectId$.value;
115
- return retval;
116
- }
117
- decorateAttachmentLinks(api, links) {
118
- const decoratedLinks = links.map((link) => this._decorateLink(api, link));
119
- decoratedLinks.sort((a, b) => {
120
- if (a.fileName.toLowerCase() < b.fileName.toLowerCase())
121
- return -1;
122
- if (a.fileName.toLowerCase() > b.fileName.toLowerCase())
123
- return 1;
124
- return 0;
125
- });
126
- return decoratedLinks;
127
- }
128
- _createAttachmentLinkStructure(objectId) {
129
- this._loadAttachmentLinkStructure(objectId)?.subscribe({
130
- next: (structureData) => {
131
- if (structureData) {
132
- //this._attachmentLinkStructure = _attachmentLink StructureBuilder.createFromResponse(structureData);
133
- this._attachmentCount = structureData?.length;
134
- if (this.api) {
135
- const retval = this.decorateAttachmentLinks(this.api, structureData);
136
- if (retval) {
137
- this._attachments = retval;
138
- }
139
- }
140
- }
141
- }
142
- });
143
- }
144
- _loadAttachmentLinkStructure(objectId) {
145
- if (!this.api) {
146
- return;
147
- }
148
- if (!objectId) {
149
- return;
150
- }
151
- return from(this.api.objects.getAttachmentLinks(objectId));
152
- }
153
- // show or hide embedded modal
154
- setModalVisibility(opened = true) {
155
- if (!this.wormholeSelector) {
156
- return;
157
- }
158
- const element = this.localWormHole ? this.shadowRootElement.querySelector("#" + this.wormholeSelector) :
159
- document.getElementById(this.wormholeSelector);
160
- if (!element) {
161
- return;
162
- }
163
- if (this.localWormHole) {
164
- if (element.parentElement) {
165
- this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
166
- }
167
- }
168
- else {
169
- this.renderer.setStyle(element.parentElement, 'display', opened ? 'block' : 'none');
170
- }
171
- ///containerEl.fadeIn("fast") : containerEl.fadeOut("fast");
172
- this.isOpened = opened;
173
- }
174
- closeEmbeddedModalFileSelection() {
175
- this.setModalVisibility(false);
176
- }
177
- _addLink(api, ids) {
178
- // filter out already existing attachment links
179
- const newAttachmentIDs = ids.filter(item => !this._attachments.find(n => n.id === item));
180
- if (!newAttachmentIDs.length) {
181
- return;
182
- }
183
- if (this.inProgress) {
184
- console.log('in progress');
185
- return;
186
- }
187
- this.inProgress = true;
188
- newAttachmentIDs.forEach((id) => {
189
- console.log('new attachment id:', id);
190
- });
191
- // Create an array of observables for each post request
192
- const postRequests = newAttachmentIDs.map((id) => from(api.objects.postAttachmentLink(this._rootObjectId, JSON.stringify({ attachmentId: id }))));
193
- // Use forkJoin to wait for all post requests to complete in parallel
194
- forkJoin(postRequests)
195
- .pipe(
196
- // After all posts are complete, switch to the next call to get updated links
197
- concatMap(() => from(api.objects.getAttachmentLinks(this._rootObjectId))))
198
- .subscribe({
199
- next: (updatedAttachments) => {
200
- this._attachments = this.decorateAttachmentLinks(api, updatedAttachments); // Update attachments in component
201
- this.inProgress = false;
202
- },
203
- error: (err) => {
204
- console.error('Failed to add or reload attachments:', err);
205
- this.inProgress = false;
206
- }
207
- });
208
- }
209
- createAttachmentLink(api) {
210
- this.localWormHole = this.wormholeSelector === "localEmbeddedModalId";
211
- const callbackF = (docIDs) => {
212
- const ids = (typeof docIDs === 'string') ? [docIDs] : docIDs;
213
- const foundDocuments = ids && ids.length > 0;
214
- if (!this.isDestroyed) {
215
- this.closeEmbeddedModalFileSelection();
216
- if (foundDocuments) {
217
- this._addLink(api, ids);
218
- }
219
- }
220
- };
221
- if (typeof callbackF !== "function" || !this.project || !this.api) {
222
- return;
223
- }
224
- setTimeout(() => {
225
- const isLocalhost = window.location.href.includes("localhost");
226
- let access_token = '';
227
- if (isLocalhost) {
228
- access_token = this.api?.getAccessToken();
229
- if (!access_token) {
230
- return;
231
- }
232
- }
233
- const newClient = new WebClient.ExternalClient('BImplusNGXComponentClient');
234
- newClient?.initialize();
235
- // Make embedded windows pointing to the current feature branch with baseUrl setup
236
- const options = {};
237
- // In case of localhost ommit explicit setup of baseUrl
238
- if (!isLocalhost) {
239
- // Remove '/viewer/' from the end of pathname
240
- let filteredPathname = window.location.pathname.replace(/\/viewer\/$/, '/');
241
- // Remove '/connexis/' from the end of pathname if we use temporary url for connexis like https://portal-dev.bimplus.net/connexis/?embedded...
242
- filteredPathname = filteredPathname.replace(/\/connexis\/$/, '/');
243
- options.baseUrl = window.location.origin + filteredPathname;
244
- }
245
- ///const env:string="dev"; ///!!! to-do introduce env variable into components
246
- const clientModule = WebClient.BimFilesSelect;
247
- if (this.wormholeSelector) {
248
- const documentSelection = new clientModule(this.wormholeSelector, access_token, newClient, this.env, options);
249
- if (!documentSelection) {
250
- return;
251
- }
252
- documentSelection.onAttachmentSelected = callbackF;
253
- if (this.project) {
254
- if (this.localWormHole) {
255
- documentSelection.loadShadowRoot(this.shadowRootElement, this.project.teamSlug, this.project.id);
256
- }
257
- else {
258
- documentSelection.load(this.project.teamSlug, this.project.id);
259
- }
260
- }
261
- this.setModalVisibility(true);
262
- }
263
- }, 200);
264
- }
265
- _deleteAttachmentLink(api, id, $event) {
266
- $event.stopPropagation();
267
- $event.preventDefault();
268
- const objects = api.objects;
269
- const objectId = this._currentObjectId$.value;
270
- from(api.objects.deleteAttachmentLink(this.rootObjectId, id)).pipe(switchMap(() => from(objects.getAttachmentLinks(objectId)))).subscribe({
271
- next: (updatedAttachments) => {
272
- if (this.api) {
273
- this._attachments = this.decorateAttachmentLinks(this.api, updatedAttachments); // Update attachments in component
274
- }
275
- },
276
- error: (err) => {
277
- console.error('Failed to delete or reload attachments:', err);
278
- }
279
- });
280
- }
281
- deleteAttachmentLink(attachment, $event) {
282
- if (!this.api) {
283
- return;
284
- }
285
- if (!attachment) {
286
- return;
287
- }
288
- const api = this.api;
289
- this.dialogService.open(BimplusOverlayDialogConfirmComponent, {
290
- options: {
291
- width: '400px', height: '200px', position: 'middle',
292
- positionOptions: {}, overlayClickEnabled: false, overlayVisibilityEnabled: true, draggable: false
293
- }, data: {
294
- title: this.translateService.instant('_Delete_attachmentlink'),
295
- message: this.translateService.instant('_Attachmentlink_delete_confirmation_message'),
296
- acceptButtonLocalizedString: "_Delete",
297
- acceptCallback: () => {
298
- this._deleteAttachmentLink(api, attachment.id, $event);
299
- }
300
- }
301
- });
302
- }
303
- buttonClicked($event) {
304
- if (!this.api) {
305
- return;
306
- }
307
- const api = this.api;
308
- if ($event.id == "add-documents") {
309
- this.createAttachmentLink(api);
310
- }
311
- }
312
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: LinksToDocumentsComponent, deps: [{ token: i1.TranslateService }, { token: i2.DialogService }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
313
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: LinksToDocumentsComponent, isStandalone: true, selector: "lib-links-to-documents", inputs: { api: "api", canCreateAttachmentLink: "canCreateAttachmentLink", canDeleteAttachmentLink: "canDeleteAttachmentLink", project: "project", wormholeSelector: "wormholeSelector", env: "env", rootObjectId: "rootObjectId" }, usesInheritance: true, ngImport: i0, template: "@if (canCreateAttachmentLink) {\n <lib-bimplus-buttons-row\n [items]=\"buttonRowItems\"\n (buttonClicked)=\"buttonClicked($event)\"\n />\n}\n@if (wormholeSelector === 'localEmbeddedModalId'){\n <div class='embedded-modal-container'>\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\n </div> \n}\n<lib-bimplus-scrollable-container>\n @for (attachment of _attachments; track attachment; let i = $index) {\n <div class=\"attachment-row\">\n @if (canDeleteAttachmentLink) {\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\n <div\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\n >\n &#10005;&#xFE0E;\n </div>\n </span>\n }\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\n {{attachment.name ? attachment.name : attachment.fileName}}\n </div>\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\n ({{attachment.size}} kB)\n </div>\n </a>\n </div>\n }\n @if (_attachments.length === 0) {\n <div class=\"bim-attachment-not-found\">\n {{ '_No attachments found' | translate }}\n </div>\n }\n</lib-bimplus-scrollable-container>\n\n", styles: [".text-selected{color:var(--text-highlight-text-color-enabled)}.ui-icon22px{width:2.2rem;height:2.2rem;display:inline-block;float:right;border-radius:.4rem;background-position:center center;background-repeat:no-repeat;cursor:pointer}.ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat}.touch-ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat;width:3.2rem;height:3.2rem}.ui-icon-sidemenu-important{width:2.4rem!important;height:2.4rem!important;background-size:1.8rem 1.8rem!important;background-position:center center;background-repeat:no-repeat}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.attachment-row{margin-left:.8rem;margin-right:.8rem;border-bottom:solid .1rem var(--details-controls-attachment-item-border-color)}.bim-attachment-delete-button{color:var(--details-controls-attachment-delete-button-text-color);float:right;margin-left:auto;cursor:pointer;margin-top:.2rem}.bim-attachment-delete-button:hover{color:var(--ui-text-1-color)}.bim-attachment-delete-button div{width:3.2rem;text-align:center}a.bim-attachmentlink-item,a.bim-attachmentlink-item:hover,a.bim-attachmentlink-item:visited{color:var(--dark-gray-color)}.bim-attachment-item,.bim-attachmentlink-item{display:flex;cursor:pointer;line-height:2.5rem;padding-left:2.6rem;background-repeat:no-repeat;background-position:.8rem center;background-image:url(data:image/png;base64,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);text-decoration:none!important}.bim-attachment-item .bim-attachment-name,.bim-attachmentlink-item .bim-attachment-name{padding-left:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bim-attachment-item .bim-attachment-extension,.bim-attachmentlink-item .bim-attachment-extension{white-space:nowrap}.bim-attachment-item .bim-attachment-size,.bim-attachmentlink-item .bim-attachment-size{padding-left:.5rem;white-space:nowrap;margin-right:.4rem}.bim-attachment-not-found{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.embedded-modal-container{display:none;box-sizing:content-box;position:fixed;inset:0;background-color:var(--portal-modal-background-color-overlay);padding:6% 9%}.embedded-modal-container iframe{width:100%;height:100%;outline:0;border:0;-webkit-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);-moz-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color)}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: BimplusScrollableContainerComponent, selector: "lib-bimplus-scrollable-container" }, { kind: "component", type: BimplusButtonsRowComponent, selector: "lib-bimplus-buttons-row", inputs: ["items"], outputs: ["fileChanged", "buttonClicked"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
314
- }
315
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: LinksToDocumentsComponent, decorators: [{
316
- type: Component,
317
- args: [{ selector: 'lib-links-to-documents', standalone: true, imports: [
318
- TranslateModule,
319
- BimplusScrollableContainerComponent,
320
- BimplusButtonsRowComponent
321
- ], encapsulation: ViewEncapsulation.ShadowDom, template: "@if (canCreateAttachmentLink) {\n <lib-bimplus-buttons-row\n [items]=\"buttonRowItems\"\n (buttonClicked)=\"buttonClicked($event)\"\n />\n}\n@if (wormholeSelector === 'localEmbeddedModalId'){\n <div class='embedded-modal-container'>\n <iframe id={{wormholeSelector}} [title]=\"\"></iframe>\n </div> \n}\n<lib-bimplus-scrollable-container>\n @for (attachment of _attachments; track attachment; let i = $index) {\n <div class=\"attachment-row\">\n @if (canDeleteAttachmentLink) {\n <span class=\"bim-attachment-delete-button\" (click)=\"deleteAttachmentLink(attachment,$event)\" (keydown)=\"deleteAttachmentLink(attachment,$event)\">\n <div\n title=\"{{ '_Delete_attachmentlink' | translate }}\"\n >\n &#10005;&#xFE0E;\n </div>\n </span>\n }\n <a class=\"bim-attachmentlink-item\" href={{attachment.link}} target='_blank' rel='noopener noreferrer'>\n <div class=\"bim-attachment-name\" title={{attachment.fileName}}>\n {{attachment.name ? attachment.name : attachment.fileName}}\n </div>\n <div class=\"bim-attachment-size\" title={{attachment.name}}>\n ({{attachment.size}} kB)\n </div>\n </a>\n </div>\n }\n @if (_attachments.length === 0) {\n <div class=\"bim-attachment-not-found\">\n {{ '_No attachments found' | translate }}\n </div>\n }\n</lib-bimplus-scrollable-container>\n\n", styles: [".text-selected{color:var(--text-highlight-text-color-enabled)}.ui-icon22px{width:2.2rem;height:2.2rem;display:inline-block;float:right;border-radius:.4rem;background-position:center center;background-repeat:no-repeat;cursor:pointer}.ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat}.touch-ui-icon-sidemenu{width:2.4rem;height:2.4rem;background-size:1.8rem 1.8rem;background-position:center center;background-repeat:no-repeat;width:3.2rem;height:3.2rem}.ui-icon-sidemenu-important{width:2.4rem!important;height:2.4rem!important;background-size:1.8rem 1.8rem!important;background-position:center center;background-repeat:no-repeat}lib-bimplus-buttons-row{flex:0;--button-row-margin-right: .8rem}.attachment-row{margin-left:.8rem;margin-right:.8rem;border-bottom:solid .1rem var(--details-controls-attachment-item-border-color)}.bim-attachment-delete-button{color:var(--details-controls-attachment-delete-button-text-color);float:right;margin-left:auto;cursor:pointer;margin-top:.2rem}.bim-attachment-delete-button:hover{color:var(--ui-text-1-color)}.bim-attachment-delete-button div{width:3.2rem;text-align:center}a.bim-attachmentlink-item,a.bim-attachmentlink-item:hover,a.bim-attachmentlink-item:visited{color:var(--dark-gray-color)}.bim-attachment-item,.bim-attachmentlink-item{display:flex;cursor:pointer;line-height:2.5rem;padding-left:2.6rem;background-repeat:no-repeat;background-position:.8rem center;background-image:url(data:image/png;base64,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);text-decoration:none!important}.bim-attachment-item .bim-attachment-name,.bim-attachmentlink-item .bim-attachment-name{padding-left:1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bim-attachment-item .bim-attachment-extension,.bim-attachmentlink-item .bim-attachment-extension{white-space:nowrap}.bim-attachment-item .bim-attachment-size,.bim-attachmentlink-item .bim-attachment-size{padding-left:.5rem;white-space:nowrap;margin-right:.4rem}.bim-attachment-not-found{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.embedded-modal-container{display:none;box-sizing:content-box;position:fixed;inset:0;background-color:var(--portal-modal-background-color-overlay);padding:6% 9%}.embedded-modal-container iframe{width:100%;height:100%;outline:0;border:0;-webkit-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);-moz-box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color);box-shadow:0 0 .5rem var(--embedded-modal-shadow-color),0 0 .5rem var(--embedded-modal-shadow-color)}\n"] }]
322
- }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.DialogService }, { type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { api: [{
323
- type: Input
324
- }], canCreateAttachmentLink: [{
325
- type: Input
326
- }], canDeleteAttachmentLink: [{
327
- type: Input
328
- }], project: [{
329
- type: Input
330
- }], wormholeSelector: [{
331
- type: Input
332
- }], env: [{
333
- type: Input
334
- }], rootObjectId: [{
335
- type: Input
336
- }] } });
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy9saW5rcy10by1kb2N1bWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvbGlua3MtdG8tZG9jdW1lbnRzL2xpbmtzLXRvLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUcsU0FBUyxFQUFJLGlCQUFpQixFQUFJLEtBQUssRUFBNkMsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDakgsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RSxPQUFPLEVBQUcsSUFBSSxFQUFJLGVBQWUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSx3RUFBd0UsQ0FBQTtBQUc1SCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUVsRyxPQUFPLEVBQ0wsb0NBQW9DLEVBQ3JDLE1BQU0sNEVBQTRFLENBQUM7QUFFcEYsT0FBTyxLQUFLLFNBQVMsTUFBTSxtQkFBbUIsQ0FBQzs7OztBQUUvQyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxNQUFNLENBQUM7QUFjdkQsTUFBTSxPQUFPLHlCQUEwQixTQUFRLCtCQUErQjtJQUU1RSxZQUFZLGdCQUFtQyxFQUNuQixhQUE0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LE1BQStCO1FBQzNDLElBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFDLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdEIsSUFBRyxNQUFNLENBQUMsRUFBRSxJQUFJLGVBQWUsRUFBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQzsrR0FwVlUseUJBQXlCO21HQUF6Qix5QkFBeUIsNlVDL0J0QyxxNkNBd0NBLCswTkRqQkssZUFBZSw0RkFDZixtQ0FBbUMsNkVBQ25DLDBCQUEwQjs7NEZBTWxCLHlCQUF5QjtrQkFackMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQO3dCQUNOLGVBQWU7d0JBQ2YsbUNBQW1DO3dCQUNuQywwQkFBMEI7cUJBQzVCLGlCQUdjLGlCQUFpQixDQUFDLFNBQVM7a0tBb0JqQyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFHRixZQUFZO3NCQURmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyAgQ29tcG9uZW50ICAsIFZpZXdFbmNhcHN1bGF0aW9uICAsIElucHV0ICAsIE9uSW5pdCwgUmVuZGVyZXIyLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmltcGx1c0xvY2FsaXplZFdpZGdldENvbXBvbmVudCB9IGZyb20gJy4uL2JpbXBsdXMtbG9jYWxpemVkLXdpZGdldC9iaW1wbHVzLWxvY2FsaXplZC13aWRnZXQuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0ICogYXMgV2ViU2RrIGZyb20gJ2JpbXBsdXMtd2Vic2RrJztcbmltcG9ydCB7ICBmcm9tICAsIEJlaGF2aW9yU3ViamVjdCwgc3dpdGNoTWFwLCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY29uY2F0TWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmltcGx1c1Njcm9sbGFibGVDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuLi9iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyL2JpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXIuY29tcG9uZW50J1xuaW1wb3J0IHsgQXR0YWNobWVudExpbmtJdGVtfSBmcm9tIFwiLi9saW5rcy10by1kb2N1bWVudHMuY29tcG9uZW50LmludGVyZmFjZVwiO1xuaW1wb3J0IHsgUHJvamVjdE5hdmlnYXRvclByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LW1vZGVscy9wcm9qZWN0LW1vZGVscy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQmltcGx1c0J1dHRvbnNSb3dDb21wb25lbnQgfSBmcm9tIFwiLi4vYmltcGx1cy1idXR0b25zLXJvdy9iaW1wbHVzLWJ1dHRvbnMtcm93LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQmltcGx1c0J1dHRvbkNsaWNrRXZlbnQsIEJpbXBsdXNCdXR0b25Sb3dJdGVtIH0gZnJvbSAnLi4vYmltcGx1cy1idXR0b25zLXJvdy9iaW1wbHVzLWJ1dHRvbnMtcm93LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBCaW1wbHVzT3ZlcmxheURpYWxvZ0NvbmZpcm1Db21wb25lbnRcbn0gZnJvbSBcIi4uL2JpbXBsdXMtb3ZlcmxheS1kaWFsb2ctY29uZmlybS9iaW1wbHVzLW92ZXJsYXktZGlhbG9nLWNvbmZpcm0uY29tcG9uZW50XCI7XG5pbXBvcnQge0RpYWxvZ1NlcnZpY2V9IGZyb20gXCIuLi9iaW1wbHVzLWdlbmVyYWwtb3ZlcmxheS1kaWFsb2cvYmltcGx1cy1nZW5lcmFsLW92ZXJsYXktZGlhbG9nLnNlcnZpY2VcIjtcbmltcG9ydCAqIGFzIFdlYkNsaWVudCBmcm9tICdiaW1wbHVzLXdlYmNsaWVudCc7XG5cbmV4cG9ydCBjb25zdCBFTUJFRERFRF9NT0RBTF9ESUFMT0dFX1RZUEVfRklMRSA9ICdmaWxlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWxpbmtzLXRvLWRvY3VtZW50cycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICBCaW1wbHVzU2Nyb2xsYWJsZUNvbnRhaW5lckNvbXBvbmVudCxcbiAgICAgQmltcGx1c0J1dHRvbnNSb3dDb21wb25lbnQgICAgIFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vbGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlua3MtdG8tZG9jdW1lbnRzLmNvbXBvbmVudC5sZXNzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLlNoYWRvd0RvbVxufSlcbmV4cG9ydCBjbGFzcyBMaW5rc1RvRG9jdW1lbnRzQ29tcG9uZW50IGV4dGVuZHMgQmltcGx1c0xvY2FsaXplZFdpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBjb25zdHJ1Y3Rvcih0cmFuc2xhdGVTZXJ2aWNlOiAgVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgc3VwZXIodHJhbnNsYXRlU2VydmljZSlcbiAgICB0aGlzLnNoYWRvd1Jvb3RFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNoYWRvd1Jvb3Q7XG5cbiAgfVxuICBwcml2YXRlIHNoYWRvd1Jvb3RFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfcm9vdE9iamVjdElkIDogc3RyaW5nID0gXCJcIjtcbiAgaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgbG9jYWxXb3JtSG9sZTpib29sZWFuICA9IHRydWU7XG4gICAgLy9XaGVuIGlzIHRydWUgdGhlbiBpdCBtZWFucyB0aGUgY3JlYXRpb24gb2YgbGluayBpcyBpbiBwcm9ncmVzc1xuICBpblByb2dyZXNzOmJvb2xlYW49IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGFwaSA6IFdlYlNkay5BcGkgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgY2FuQ3JlYXRlQXR0YWNobWVudExpbms6Ym9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNhbkRlbGV0ZUF0dGFjaG1lbnRMaW5rOmJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwcm9qZWN0IDogUHJvamVjdE5hdmlnYXRvclByb2plY3QgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgd29ybWhvbGVTZWxlY3RvciA6IHN0cmluZyB8IHVuZGVmaW5lZD0gXCJsb2NhbEVtYmVkZGVkTW9kYWxJZFwiOyAgLy8gY2FsbGluZyBhcHBsaWNhdGlvbiBjYW4gcHJvdmlkZSBhIHBsYWNlIHdoZXJlIHRoZSBpZnJhbWUgZm9yIGRvY3VtZW50cyBzZWxlY3Rpb24gd2lsbCBiZSByZW5kZXJlZFxuICBASW5wdXQoKSBlbnYgOiBzdHJpbmcgPSAnZGV2JztcblxuICBASW5wdXQoKVxuICBzZXQgcm9vdE9iamVjdElkKGlkIDogc3RyaW5nKXtcbiAgICB0aGlzLl9jdXJyZW50T2JqZWN0SWQkLm5leHQoaWQpO1xuICAgIHRoaXMuX3Jvb3RPYmplY3RJZCA9IGlkO1xuICB9XG5cbiAgZ2V0IHJvb3RPYmplY3RJZCgpIDogc3RyaW5ne1xuICAgIHJldHVybiB0aGlzLl9yb290T2JqZWN0SWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXJyZW50T2JqZWN0SWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+IChcIlwiKTtcbiAgX2F0dGFjaG1lbnRDb3VudCA6IG51bWJlciA9IDA7XG4gIF9hdHRhY2htZW50cyA6IEF0dGFjaG1lbnRMaW5rSXRlbVtdID0gW107XG4gIGJ1dHRvblJvd0l0ZW1zOiBBcnJheTxCaW1wbHVzQnV0dG9uUm93SXRlbT4gPSBbXG4gICAge1xuICAgICAgaWQ6IFwiYWRkLWRvY3VtZW50c1wiXG4gICAgICAsIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0FkZF9kb2N1bWVudCcpXG4gICAgICAsIHRvb2x0aXA6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfQWRkX2RvY3VtZW50JylcbiAgICAgICwgZGlzYWJsZWQ6ICF0aGlzLmNhbkNyZWF0ZUF0dGFjaG1lbnRMaW5rXG4gICAgICAsIGJ1dHRvblN0eWxlOiAncHJpbWFyeSdcbiAgICB9XG4gIF07XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fY3VycmVudE9iamVjdElkJC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGlkKSA9PiB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZUF0dGFjaG1lbnRMaW5rU3RydWN0dXJlKGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgZm10KHN0cmluZzogc3RyaW5nLCAuLi5mb3JtYXRzOiB1bmtub3duW10pOiBzdHJpbmcge1xuICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyVAKFxcZCspPy9nLCAobWF0Y2g6IHN0cmluZywgYXJndW1lbnRJbmRleDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhcmd1bWVudEluZGV4TiA9IGFyZ3VtZW50SW5kZXggPyBwYXJzZUludChhcmd1bWVudEluZGV4LCAxMCkgLSAxIDogaW5kZXgrKztcbiAgICAgIGNvbnN0IF9tYXRjaCA9IGZvcm1hdHNbYXJndW1lbnRJbmRleE5dO1xuXG4gICAgICBpZiAoX21hdGNoID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnKG51bGwpJztcbiAgICAgIH1cbiAgICAgIGlmIChfbWF0Y2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gX21hdGNoLnRvU3RyaW5nKCk7XG4gICAgfSk7XG4gIH1cblxuLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogZGVjb3JhdGUgbGlua1xuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gIF9kZWNvcmF0ZUxpbmsoYXBpOldlYlNkay5BcGksbGluazpXZWJTZGsuQXR0YWNobWVudExpbmspOkF0dGFjaG1lbnRMaW5rSXRlbXtcblxuICAgIGNvbnN0IHJldHZhbDpBdHRhY2htZW50TGlua0l0ZW0gPSB7XG4gICAgICBpZDogbGluay5pZCxcbiAgICAgIG5hbWU6IGxpbmsubmFtZSxcbiAgICAgIGZpbGVOYW1lOiBsaW5rLmZpbGVOYW1lLFxuICAgICAgc2l6ZTogbGluay5zaXplLFxuICAgICAgbGluazogbGluay5saW5rLFxuICAgICAgZmlsZU5hbWVTaG9ydDogJycsXG4gICAgICBleHRlbnNpb246ICcnLFxuICAgICAgb2JqZWN0SWQ6ICcnLFxuICAgICAgdmVyc2lvbjogbGluay52ZXJzaW9uXG4gICAgfTtcbiAgICBjb25zdCBhY2Nlc3NfdG9rZW4gPSBhcGkuZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBjb25zdCBhdHRWZXJzaW9uID0gXCJhdHRhY2htZW50cy8lQC92ZXJzaW9ucy8lQC9kb3dubG9hZFwiO1xuICAgIGNvbnN0IHVybCA9IGFwaS5nZXRBcGlUZWFtVXJsKCkrYXR0VmVyc2lvbjtcbiAgICBjb25zdCBpc0VtYmVkZGVkQWxscGxhbk1vZGUgPSBmYWxzZTtcbiAgICByZXR2YWwuc2l6ZSA9IHBhcnNlRmxvYXQoKGxpbmsuc2l6ZSAvIDEwMDApLnRvRml4ZWQoMikpO1xuICAgIHJldHZhbC5saW5rID0gYCR7dGhpcy5mbXQodXJsLCBsaW5rLmlkLCBsaW5rLnZlcnNpb24pfT9hcGktdG9rZW49JHthY2Nlc3NfdG9rZW59JHsgaXNFbWJlZGRlZEFsbHBsYW5Nb2RlID8gJycgOiAnJm9wZW5JbkJyb3dzZXI9dHJ1ZSd9YDtcbiAgICBpZiAobGluay5maWxlTmFtZS5sZW5ndGggPiAyMCkge1xuICAgICAgY29uc3QgZmlsZVBhcnRzID0gbGluay5maWxlTmFtZS5zcGxpdCgnLicpO1xuICAgICAgaWYgKGZpbGVQYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHZhbC5maWxlTmFtZVNob3J0ID0gZmlsZVBhcnRzLnNsaWNlKDAsIC0xKS5qb2luKCcuJyk7XG4gICAgICAgIHJldHZhbC5leHRlbnNpb24gPSBcIi5cIiArIGZpbGVQYXJ0cy5zbGljZSgtMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR2YWwuZmlsZU5hbWVTaG9ydCA9IGxpbmsuZmlsZU5hbWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHZhbC5maWxlTmFtZVNob3J0ID0gbGluay5maWxlTmFtZTtcbiAgICB9XG4gICAgcmV0dmFsLm9iamVjdElkID0gdGhpcy5fY3VycmVudE9iamVjdElkJC52YWx1ZTtcblxuICAgIHJldHVybiByZXR2YWw7XG4gIH1cblxuICBwcml2YXRlIGRlY29yYXRlQXR0YWNobWVudExpbmtzKGFwaTpXZWJTZGsuQXBpLCBsaW5rczpXZWJTZGsuQXR0YWNobWVudExpbmtzUmVzcG9uc2UpOkF0dGFjaG1lbnRMaW5rSXRlbVtde1xuICAgIGNvbnN0IGRlY29yYXRlZExpbmtzID0gbGlua3MubWFwKChsaW5rKSA9PiB0aGlzLl9kZWNvcmF0ZUxpbmsoYXBpLGxpbmspKTtcbiAgICBkZWNvcmF0ZWRMaW5rcy5zb3J0KChhLGIpID0+IHtcbiAgICAgIGlmKGEuZmlsZU5hbWUudG9Mb3dlckNhc2UoKSA8IGIuZmlsZU5hbWUudG9Mb3dlckNhc2UoKSApIHJldHVybiAtMTtcbiAgICAgIGlmKGEuZmlsZU5hbWUudG9Mb3dlckNhc2UoKSAgPiBiLmZpbGVOYW1lLnRvTG93ZXJDYXNlKCkgKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuICAgIHJldHVybiBkZWNvcmF0ZWRMaW5rcztcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUF0dGFjaG1lbnRMaW5rU3RydWN0dXJlKG9iamVjdElkIDogc3RyaW5nKXtcblxuICAgIHRoaXMuX2xvYWRBdHRhY2htZW50TGlua1N0cnVjdHVyZShvYmplY3RJZCk/LnN1YnNjcmliZSh7XG4gICAgICBuZXh0IDooc3RydWN0dXJlRGF0YSkgPT4ge1xuICAgICAgICBpZihzdHJ1Y3R1cmVEYXRhKXtcbiAgICAgICAgICAvL3RoaXMuX2F0dGFjaG1lbnRMaW5rU3RydWN0dXJlID0gX2F0dGFjaG1lbnRMaW5rIFN0cnVjdHVyZUJ1aWxkZXIuY3JlYXRlRnJvbVJlc3BvbnNlKHN0cnVjdHVyZURhdGEpO1xuICAgICAgICAgIHRoaXMuX2F0dGFjaG1lbnRDb3VudCA9IHN0cnVjdHVyZURhdGE/Lmxlbmd0aDtcbiAgICAgICAgICBpZih0aGlzLmFwaSl7XG4gICAgICAgICAgICBjb25zdCByZXR2YWwgPSB0aGlzLmRlY29yYXRlQXR0YWNobWVudExpbmtzKHRoaXMuYXBpLHN0cnVjdHVyZURhdGEpO1xuICAgICAgICAgICAgaWYocmV0dmFsKXtcbiAgICAgICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSByZXR2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgX2xvYWRBdHRhY2htZW50TGlua1N0cnVjdHVyZShvYmplY3RJZCA6IHN0cmluZyl7XG4gICAgaWYoIXRoaXMuYXBpKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZighb2JqZWN0SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGZyb20odGhpcy5hcGkub2JqZWN0cy5nZXRBdHRhY2htZW50TGlua3Mob2JqZWN0SWQpKTtcbiAgfVxuXG4gIGRvY3VtZW50U2VsZWN0aW9uIDpzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICBpc09wZW5lZDpib29sZWFuID0gZmFsc2U7XG4gIGVtYmVkZGVkTW9kYWxDb250YWluZXI6c3RyaW5nID0gJ2VtYmVkZGVkLW1vZGFsJztcbiAgXG4gIC8vIHNob3cgb3IgaGlkZSBlbWJlZGRlZCBtb2RhbFxuICBzZXRNb2RhbFZpc2liaWxpdHkob3BlbmVkID0gdHJ1ZSkge1xuICAgIGlmKCF0aGlzLndvcm1ob2xlU2VsZWN0b3Ipe1xuICAgICAgcmV0dXJuOyAgICBcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudCA9ICB0aGlzLmxvY2FsV29ybUhvbGUgPyB0aGlzLnNoYWRvd1Jvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjXCIgKyB0aGlzLndvcm1ob2xlU2VsZWN0b3IpOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMud29ybWhvbGVTZWxlY3Rvcik7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKHRoaXMubG9jYWxXb3JtSG9sZSl7XG4gICAgICBpZihlbGVtZW50LnBhcmVudEVsZW1lbnQpe1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQucGFyZW50RWxlbWVudCwnZGlzcGxheScsb3BlbmVkPydibG9jayc6J25vbmUnKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQucGFyZW50RWxlbWVudCwnZGlzcGxheScsb3BlbmVkPydibG9jayc6J25vbmUnKVxuICAgIH1cbiAgICBcbiAgICAvLy9jb250YWluZXJFbC5mYWRlSW4oXCJmYXN0XCIpIDogY29udGFpbmVyRWwuZmFkZU91dChcImZhc3RcIik7XG4gICAgdGhpcy5pc09wZW5lZCA9IG9wZW5lZDtcbiAgfVxuXG5cbiAgY2xvc2VFbWJlZGRlZE1vZGFsRmlsZVNlbGVjdGlvbigpIHsgICAgXG4gICAgdGhpcy5zZXRNb2RhbFZpc2liaWxpdHkoZmFsc2UpOyAgICBcbiAgfVxuXG4gIF9hZGRMaW5rKGFwaTpXZWJTZGsuQXBpLGlkczpzdHJpbmdbXSl7XG4gICAgLy8gZmlsdGVyIG91dCBhbHJlYWR5IGV4aXN0aW5nIGF0dGFjaG1lbnQgbGlua3MgXG4gICAgY29uc3QgbmV3QXR0YWNobWVudElEcyA9IGlkcy5maWx0ZXIoIGl0ZW0gPT4gIXRoaXMuX2F0dGFjaG1lbnRzLmZpbmQobiA9PiBuLmlkID09PSBpdGVtKSApO1xuICAgIGlmKCAhbmV3QXR0YWNobWVudElEcy5sZW5ndGggKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYodGhpcy5pblByb2dyZXNzKXtcbiAgICAgIGNvbnNvbGUubG9nKCdpbiBwcm9ncmVzcycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgbmV3QXR0YWNobWVudElEcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ25ldyBhdHRhY2htZW50IGlkOicsaWQpO1xuICAgIH0pO1xuICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBvYnNlcnZhYmxlcyBmb3IgZWFjaCBwb3N0IHJlcXVlc3RcbiAgICBjb25zdCBwb3N0UmVxdWVzdHMgPSBuZXdBdHRhY2htZW50SURzLm1hcCgoaWQpID0+ICAgICAgICAgICAgXG4gICAgICBmcm9tKGFwaS5vYmplY3RzLnBvc3RBdHRhY2htZW50TGluayh0aGlzLl9yb290T2JqZWN0SWQsSlNPTi5zdHJpbmdpZnkoeyBhdHRhY2htZW50SWQ6IGlkfSkpKSAgICAgIFxuICAgICk7XG5cbiAgICAvLyBVc2UgZm9ya0pvaW4gdG8gd2FpdCBmb3IgYWxsIHBvc3QgcmVxdWVzdHMgdG8gY29tcGxldGUgaW4gcGFyYWxsZWxcbiAgICBmb3JrSm9pbihwb3N0UmVxdWVzdHMpXG4gICAgLnBpcGUoXG4gICAgICAvLyBBZnRlciBhbGwgcG9zdHMgYXJlIGNvbXBsZXRlLCBzd2l0Y2ggdG8gdGhlIG5leHQgY2FsbCB0byBnZXQgdXBkYXRlZCBsaW5rc1xuICAgICAgY29uY2F0TWFwKCgpID0+IGZyb20oYXBpLm9iamVjdHMuZ2V0QXR0YWNobWVudExpbmtzKHRoaXMuX3Jvb3RPYmplY3RJZCkpKVxuICAgIClcbiAgICAuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh1cGRhdGVkQXR0YWNobWVudHMpID0+IHtcbiAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSB0aGlzLmRlY29yYXRlQXR0YWNobWVudExpbmtzKFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgICB1cGRhdGVkQXR0YWNobWVudHNcbiAgICAgICAgKTsgLy8gVXBkYXRlIGF0dGFjaG1lbnRzIGluIGNvbXBvbmVudCAgIFxuICAgICAgICB0aGlzLmluUHJvZ3Jlc3MgPSBmYWxzZTsgICAgIFxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBhZGQgb3IgcmVsb2FkIGF0dGFjaG1lbnRzOicsIGVycik7XG4gICAgICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlOyAgICAgXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGNyZWF0ZUF0dGFjaG1lbnRMaW5rKGFwaTpXZWJTZGsuQXBpKXtcbiAgICB0aGlzLmxvY2FsV29ybUhvbGUgPSB0aGlzLndvcm1ob2xlU2VsZWN0b3IgPT09IFwibG9jYWxFbWJlZGRlZE1vZGFsSWRcIjtcbiAgICBjb25zdCBjYWxsYmFja0YgPSAoZG9jSURzOnN0cmluZ1tdKTp2b2lkID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9ICh0eXBlb2YgZG9jSURzID09PSAnc3RyaW5nJykgPyBbZG9jSURzXSA6IGRvY0lEcztcbiAgICAgIGNvbnN0IGZvdW5kRG9jdW1lbnRzID0gaWRzICYmIGlkcy5sZW5ndGggPiAwO1xuICAgICAgaWYoIXRoaXMuaXNEZXN0cm95ZWQpe1xuICAgICAgICB0aGlzLmNsb3NlRW1iZWRkZWRNb2RhbEZpbGVTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKGZvdW5kRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5fYWRkTGluayhhcGksaWRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2tGICE9PSBcImZ1bmN0aW9uXCIgIHx8ICF0aGlzLnByb2plY3QgfHwgIXRoaXMuYXBpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBpc0xvY2FsaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKFwibG9jYWxob3N0XCIpO1xuICAgICAgbGV0IGFjY2Vzc190b2tlbiA6c3RyaW5nfG51bGwgfHVuZGVmaW5lZD0gJyc7XG4gICAgICBpZiAoaXNMb2NhbGhvc3QpIHtcbiAgICAgICAgYWNjZXNzX3Rva2VuID0gdGhpcy5hcGk/LmdldEFjY2Vzc1Rva2VuKCk7XG4gICAgICAgIGlmICghYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0NsaWVudCA9ICBuZXcgV2ViQ2xpZW50LkV4dGVybmFsQ2xpZW50KCdCSW1wbHVzTkdYQ29tcG9uZW50Q2xpZW50Jyk7XG4gICAgICBuZXdDbGllbnQ/LmluaXRpYWxpemUoKTtcbiAgICAgIC8vIE1ha2UgZW1iZWRkZWQgd2luZG93cyBwb2ludGluZyB0byB0aGUgY3VycmVudCBmZWF0dXJlIGJyYW5jaCB3aXRoIGJhc2VVcmwgc2V0dXBcbiAgICAgIGNvbnN0IG9wdGlvbnM6e2Jhc2VVcmw/OnN0cmluZ30gPSB7fTtcbiAgICAgIC8vIEluIGNhc2Ugb2YgbG9jYWxob3N0IG9tbWl0IGV4cGxpY2l0IHNldHVwIG9mIGJhc2VVcmxcbiAgICAgIGlmICghaXNMb2NhbGhvc3QpIHtcbiAgICAgICAgLy8gUmVtb3ZlICcvdmlld2VyLycgZnJvbSB0aGUgZW5kIG9mIHBhdGhuYW1lXG4gICAgICAgIGxldCBmaWx0ZXJlZFBhdGhuYW1lID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1xcL3ZpZXdlclxcLyQvLCAnLycpO1xuICAgICAgICAvLyBSZW1vdmUgJy9jb25uZXhpcy8nIGZyb20gdGhlIGVuZCBvZiBwYXRobmFtZSBpZiB3ZSB1c2UgdGVtcG9yYXJ5IHVybCBmb3IgY29ubmV4aXMgbGlrZSAgaHR0cHM6Ly9wb3J0YWwtZGV2LmJpbXBsdXMubmV0L2Nvbm5leGlzLz9lbWJlZGRlZC4uLlxuICAgICAgICBmaWx0ZXJlZFBhdGhuYW1lID0gZmlsdGVyZWRQYXRobmFtZS5yZXBsYWNlKC9cXC9jb25uZXhpc1xcLyQvLCAnLycpO1xuICAgICAgICBvcHRpb25zLmJhc2VVcmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgZmlsdGVyZWRQYXRobmFtZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8vY29uc3QgZW52OnN0cmluZz1cImRldlwiOyAgLy8vISEhIHRvLWRvIGludHJvZHVjZSBlbnYgdmFyaWFibGUgaW50byBjb21wb25lbnRzXG4gICAgICBjb25zdCBjbGllbnRNb2R1bGUgPSBXZWJDbGllbnQuQmltRmlsZXNTZWxlY3Q7XG4gICAgICBpZih0aGlzLndvcm1ob2xlU2VsZWN0b3Ipe1xuICAgICAgICBjb25zdCBkb2N1bWVudFNlbGVjdGlvbiA9IG5ldyBjbGllbnRNb2R1bGUodGhpcy53b3JtaG9sZVNlbGVjdG9yLCBhY2Nlc3NfdG9rZW4sIG5ld0NsaWVudCwgdGhpcy5lbnYsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIWRvY3VtZW50U2VsZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRvY3VtZW50U2VsZWN0aW9uLm9uQXR0YWNobWVudFNlbGVjdGVkID0gY2FsbGJhY2tGO1xuICAgICAgICBcbiAgICAgICAgaWYodGhpcy5wcm9qZWN0KXtcbiAgICAgICAgICBpZih0aGlzLmxvY2FsV29ybUhvbGUpe1xuICAgICAgICAgICAgZG9jdW1lbnRTZWxlY3Rpb24ubG9hZFNoYWRvd1Jvb3QodGhpcy5zaGFkb3dSb290RWxlbWVudCx0aGlzLnByb2plY3QudGVhbVNsdWcgLCB0aGlzLnByb2plY3QuaWQpO1xuICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgZG9jdW1lbnRTZWxlY3Rpb24ubG9hZCh0aGlzLnByb2plY3QudGVhbVNsdWcgLCB0aGlzLnByb2plY3QuaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldE1vZGFsVmlzaWJpbGl0eSh0cnVlKTtcbiAgICAgIH1cbiAgICB9LDIwMCk7ICBcblxuICB9XG5cbiAgX2RlbGV0ZUF0dGFjaG1lbnRMaW5rKGFwaTpXZWJTZGsuQXBpICxpZDpzdHJpbmcsJGV2ZW50OkV2ZW50KXtcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3Qgb2JqZWN0cyA9IGFwaS5vYmplY3RzO1xuICAgIGNvbnN0IG9iamVjdElkID0gdGhpcy5fY3VycmVudE9iamVjdElkJC52YWx1ZTtcbiAgICBmcm9tKGFwaS5vYmplY3RzLmRlbGV0ZUF0dGFjaG1lbnRMaW5rKHRoaXMucm9vdE9iamVjdElkLGlkKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBmcm9tKG9iamVjdHMuZ2V0QXR0YWNobWVudExpbmtzKG9iamVjdElkKSkpXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHVwZGF0ZWRBdHRhY2htZW50cykgPT4ge1xuICAgICAgICBpZih0aGlzLmFwaSl7XG4gICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSB0aGlzLmRlY29yYXRlQXR0YWNobWVudExpbmtzKHRoaXMuYXBpLHVwZGF0ZWRBdHRhY2htZW50cyk7ICAvLyBVcGRhdGUgYXR0YWNobWVudHMgaW4gY29tcG9uZW50XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZGVsZXRlIG9yIHJlbG9hZCBhdHRhY2htZW50czonLCBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlQXR0YWNobWVudExpbmsoYXR0YWNobWVudDpBdHRhY2htZW50TGlua0l0ZW0sJGV2ZW50OkV2ZW50KXtcbiAgICBpZighdGhpcy5hcGkpe1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZighYXR0YWNobWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhcGkgID0gdGhpcy5hcGk7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oQmltcGx1c092ZXJsYXlEaWFsb2dDb25maXJtQ29tcG9uZW50LCB7XG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHdpZHRoOiAnNDAwcHgnLCBoZWlnaHQ6ICcyMDBweCcsIHBvc2l0aW9uOiAnbWlkZGxlJyxcbiAgICAgICAgcG9zaXRpb25PcHRpb25zOiB7fSwgb3ZlcmxheUNsaWNrRW5hYmxlZDogZmFsc2UsIG92ZXJsYXlWaXNpYmlsaXR5RW5hYmxlZDogdHJ1ZSwgZHJhZ2dhYmxlOiBmYWxzZVxuICAgICAgfSwgZGF0YToge1xuICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19EZWxldGVfYXR0YWNobWVudGxpbmsnKSxcbiAgICAgICAgbWVzc2FnZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19BdHRhY2htZW50bGlua19kZWxldGVfY29uZmlybWF0aW9uX21lc3NhZ2UnKSxcbiAgICAgICAgYWNjZXB0QnV0dG9uTG9jYWxpemVkU3RyaW5nOiBcIl9EZWxldGVcIixcbiAgICAgICAgYWNjZXB0Q2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9kZWxldGVBdHRhY2htZW50TGluayhhcGksYXR0YWNobWVudC5pZCwkZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGJ1dHRvbkNsaWNrZWQoJGV2ZW50OiBCaW1wbHVzQnV0dG9uQ2xpY2tFdmVudCl7XG4gICAgaWYoIXRoaXMuYXBpKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYXBpICA9IHRoaXMuYXBpO1xuICAgIGlmKCRldmVudC5pZCA9PSBcImFkZC1kb2N1bWVudHNcIil7XG4gICAgICB0aGlzLmNyZWF0ZUF0dGFjaG1lbnRMaW5rKGFwaSk7ICAgIFxuICAgIH1cbiAgfVxufVxuIiwiQGlmIChjYW5DcmVhdGVBdHRhY2htZW50TGluaykge1xuICA8bGliLWJpbXBsdXMtYnV0dG9ucy1yb3dcbiAgW2l0ZW1zXT1cImJ1dHRvblJvd0l0ZW1zXCJcbiAgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ2xpY2tlZCgkZXZlbnQpXCJcbiAgLz5cbn1cbkBpZiAod29ybWhvbGVTZWxlY3RvciA9PT0gJ2xvY2FsRW1iZWRkZWRNb2RhbElkJyl7XG4gIDxkaXYgY2xhc3M9J2VtYmVkZGVkLW1vZGFsLWNvbnRhaW5lcic+XG4gICAgPGlmcmFtZSBpZD17e3dvcm1ob2xlU2VsZWN0b3J9fSBbdGl0bGVdPVwiXCI+PC9pZnJhbWU+XG4gIDwvZGl2PiAgXG59XG48bGliLWJpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXI+XG4gIEBmb3IgKGF0dGFjaG1lbnQgb2YgX2F0dGFjaG1lbnRzOyB0cmFjayBhdHRhY2htZW50OyBsZXQgIGkgPSAkaW5kZXgpIHtcbiAgICA8ZGl2IGNsYXNzPVwiYXR0YWNobWVudC1yb3dcIj5cbiAgICAgIEBpZiAoY2FuRGVsZXRlQXR0YWNobWVudExpbmspIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJiaW0tYXR0YWNobWVudC1kZWxldGUtYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZUF0dGFjaG1lbnRMaW5rKGF0dGFjaG1lbnQsJGV2ZW50KVwiIChrZXlkb3duKT1cImRlbGV0ZUF0dGFjaG1lbnRMaW5rKGF0dGFjaG1lbnQsJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ19EZWxldGVfYXR0YWNobWVudGxpbmsnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAmIzEwMDA1OyYjeEZFMEU7XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIH1cbiAgICAgIDxhIGNsYXNzPVwiYmltLWF0dGFjaG1lbnRsaW5rLWl0ZW1cIiBocmVmPXt7YXR0YWNobWVudC5saW5rfX0gdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9vcGVuZXIgbm9yZWZlcnJlcic+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiaW0tYXR0YWNobWVudC1uYW1lXCIgdGl0bGU9e3thdHRhY2htZW50LmZpbGVOYW1lfX0+XG4gICAgICAgICAge3thdHRhY2htZW50Lm5hbWUgPyBhdHRhY2htZW50Lm5hbWUgOiBhdHRhY2htZW50LmZpbGVOYW1lfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiaW0tYXR0YWNobWVudC1zaXplXCIgdGl0bGU9e3thdHRhY2htZW50Lm5hbWV9fT5cbiAgICAgICAgICAoe3thdHRhY2htZW50LnNpemV9fSBrQilcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChfYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgPGRpdiBjbGFzcz1cImJpbS1hdHRhY2htZW50LW5vdC1mb3VuZFwiPlxuICAgICAge3sgJ19ObyBhdHRhY2htZW50cyBmb3VuZCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgfVxuPC9saWItYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lcj5cblxuIl19
@@ -1,141 +0,0 @@
1
- import { Component, Input, ViewEncapsulation } from '@angular/core';
2
- import { BimplusButtonsRowComponent } from "../bimplus-buttons-row/bimplus-buttons-row.component";
3
- import { BimplusLocalizedWidgetComponent } from "../bimplus-localized-widget/bimplus-localized-widget.component";
4
- import { TranslateModule } from "@ngx-translate/core";
5
- import { BimplusScrollableContainerComponent } from "../bimplus-scrollable-container/bimplus-scrollable-container.component";
6
- import { ObjectHyperlinksItemComponent } from "../object-hyperlinks-item/object-hyperlinks-item.component";
7
- import { BehaviorSubject } from "rxjs";
8
- import { NgForOf, NgIf } from "@angular/common";
9
- import { BimplusOverlayDialogConfirmComponent } from "../bimplus-overlay-dialog-confirm/bimplus-overlay-dialog-confirm.component";
10
- import { ReactiveFormsModule, Validators } from "@angular/forms";
11
- import { BimplusInputTextFieldComponent } from "../bimplus-input-text-field/bimplus-input-text-field.component";
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@ngx-translate/core";
14
- import * as i2 from "../bimplus-general-overlay-dialog/bimplus-general-overlay-dialog.service";
15
- import * as i3 from "@angular/forms";
16
- export class ObjectHyperlinksComponent extends BimplusLocalizedWidgetComponent {
17
- constructor(translateService, dialogService, formBuilder) {
18
- super(translateService);
19
- this.dialogService = dialogService;
20
- this.formBuilder = formBuilder;
21
- this.api = null;
22
- this._currentObjectId$ = new BehaviorSubject("");
23
- this._currentPropertiesObjectId$ = new BehaviorSubject("");
24
- this._rootObjectId = "";
25
- this.buttonRowItems = [];
26
- this.canCreateHyperlinks = true;
27
- this.canDeleteHyperlinks = true;
28
- this.hyperlinks = [];
29
- this.hyperlinkForm = this.formBuilder.group({
30
- name: ['', []],
31
- url: ['',
32
- [
33
- Validators.required,
34
- Validators.pattern(/^[^<>]*$/), // Do not allow < or >
35
- Validators.pattern(/^(?!\s*$).+/) // Do not allow all empty string, but allow text after spaces
36
- ]
37
- ]
38
- });
39
- this.hyperlinkForm.statusChanges.subscribe(status => {
40
- this.buttonRowItems[0].disabled = status !== 'VALID';
41
- });
42
- }
43
- set rootObjectId(id) {
44
- this._currentObjectId$.next(id);
45
- this.loadHyperlinks(id);
46
- this._rootObjectId = id;
47
- }
48
- get rootObjectId() {
49
- return this._rootObjectId;
50
- }
51
- ngOnInit() {
52
- this.buttonRowItems.push({
53
- id: "add-hyperlink",
54
- title: this.translateService.instant('_Add hyperlink'),
55
- tooltip: this.translateService.instant('_Add hyperlink'),
56
- disabled: true,
57
- buttonStyle: 'primary'
58
- });
59
- }
60
- buttonRowButtonClicked($event) {
61
- if ($event.id === "add-hyperlink") {
62
- if (this.hyperlinkForm.valid) {
63
- this.addHyperlink(this.hyperlinkForm.value['name'], this.hyperlinkForm.value['url'], this._rootObjectId).then(() => {
64
- this.loadHyperlinks(this._rootObjectId);
65
- this.hyperlinkForm.reset();
66
- });
67
- }
68
- }
69
- }
70
- loadHyperlinks(objectId) {
71
- if (!this.api)
72
- return;
73
- this.api.objects.getHyperlinks(objectId).then((response) => {
74
- this.hyperlinks = response;
75
- });
76
- }
77
- addHyperlink(name, url, objectId) {
78
- if (!this.api)
79
- return Promise.reject(new Error('API not available'));
80
- let sanitizedUrl = url.trim();
81
- if (!RegExp(/^http(s?):\/\//).exec(sanitizedUrl)) {
82
- sanitizedUrl = 'https://' + sanitizedUrl;
83
- }
84
- let sanitizedName = name?.trim() ?? '';
85
- if (sanitizedName === '') {
86
- sanitizedName = sanitizedUrl;
87
- }
88
- const data = JSON.stringify({
89
- name: sanitizedName,
90
- url: sanitizedUrl,
91
- objectId: objectId
92
- });
93
- return this.api.objects.postHyperlink(objectId, data);
94
- }
95
- onHyperlinkItemDeleteButtonClicked(hyperlink) {
96
- this.dialogService.open(BimplusOverlayDialogConfirmComponent, {
97
- options: {
98
- width: '400px', height: '200px', position: 'middle',
99
- positionOptions: {}, overlayClickEnabled: false, overlayVisibilityEnabled: true, draggable: false
100
- }, data: {
101
- title: this.translateService.instant('_Delete hyperlink'),
102
- message: this.translateService.instant('_Hyperlink delete confirmation message'),
103
- acceptButtonLocalizedString: "_Delete",
104
- acceptCallback: () => {
105
- this.deleteHyperlink(hyperlink.id);
106
- }
107
- }
108
- });
109
- }
110
- deleteHyperlink(id) {
111
- if (!this.api)
112
- return;
113
- this.api.hyperlinks.delete(id).then(() => {
114
- this.loadHyperlinks(this._rootObjectId);
115
- });
116
- }
117
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ObjectHyperlinksComponent, deps: [{ token: i1.TranslateService }, { token: i2.DialogService }, { token: i3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
118
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ObjectHyperlinksComponent, isStandalone: true, selector: "lib-object-hyperlinks", inputs: { api: "api", rootObjectId: "rootObjectId", canCreateHyperlinks: "canCreateHyperlinks", canDeleteHyperlinks: "canDeleteHyperlinks" }, usesInheritance: true, ngImport: i0, template: "@if (canCreateHyperlinks) {\n <form [formGroup]=\"hyperlinkForm\" class=\"input-form\">\n <div>\n <lib-bimplus-input-text-field formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\"/>\n </div>\n <div>\n <lib-bimplus-input-text-field formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\"/>\n </div>\n\n <lib-bimplus-buttons-row [items]=\"buttonRowItems\" (buttonClicked)=\"buttonRowButtonClicked($event)\"/>\n </form>\n}\n\n<div class=\"list-anchor\">\n <div class=\"list\">\n <lib-bimplus-scrollable-container>\n @if (hyperlinks.length > 0) {\n <div style=\"padding-left: 8px\" *ngFor=\"let hyperlink of hyperlinks\">\n <lib-object-hyperlinks-item [hyperlink]=\"hyperlink\" [deleteButtonEnabled]=\"canDeleteHyperlinks\"\n (deleteButtonClicked)=\"onHyperlinkItemDeleteButtonClicked(hyperlink)\"/>\n </div>\n } @else {\n <div class=\"no-links\">{{ \"_No hyperlinks found\" | translate }}</div>\n }\n </lib-bimplus-scrollable-container>\n </div>\n</div>\n", styles: [":host{height:100%;display:flex;flex-direction:column;flex:1}.list-anchor{position:relative;flex:1}.list{position:absolute;top:0;bottom:0;width:100%}.no-links{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.input-form{padding-left:.8rem;padding-right:.8rem;display:flex;flex-direction:column;gap:.2rem}\n"], dependencies: [{ kind: "component", type: BimplusButtonsRowComponent, selector: "lib-bimplus-buttons-row", inputs: ["items"], outputs: ["fileChanged", "buttonClicked"] }, { kind: "component", type: BimplusScrollableContainerComponent, selector: "lib-bimplus-scrollable-container" }, { kind: "component", type: ObjectHyperlinksItemComponent, selector: "lib-object-hyperlinks-item", inputs: ["hyperlink", "deleteButtonEnabled"], outputs: ["deleteButtonClicked"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: BimplusInputTextFieldComponent, selector: "lib-bimplus-input-text-field", inputs: ["placeholder"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
119
- }
120
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ObjectHyperlinksComponent, decorators: [{
121
- type: Component,
122
- args: [{ selector: 'lib-object-hyperlinks', standalone: true, imports: [
123
- BimplusButtonsRowComponent,
124
- BimplusScrollableContainerComponent,
125
- ObjectHyperlinksItemComponent,
126
- NgForOf,
127
- TranslateModule,
128
- ReactiveFormsModule,
129
- NgIf,
130
- BimplusInputTextFieldComponent
131
- ], encapsulation: ViewEncapsulation.ShadowDom, template: "@if (canCreateHyperlinks) {\n <form [formGroup]=\"hyperlinkForm\" class=\"input-form\">\n <div>\n <lib-bimplus-input-text-field formControlName=\"name\" placeholder=\"{{ '_Name' | translate }}\"/>\n </div>\n <div>\n <lib-bimplus-input-text-field formControlName=\"url\" placeholder=\"{{ '_URL' | translate }}\"/>\n </div>\n\n <lib-bimplus-buttons-row [items]=\"buttonRowItems\" (buttonClicked)=\"buttonRowButtonClicked($event)\"/>\n </form>\n}\n\n<div class=\"list-anchor\">\n <div class=\"list\">\n <lib-bimplus-scrollable-container>\n @if (hyperlinks.length > 0) {\n <div style=\"padding-left: 8px\" *ngFor=\"let hyperlink of hyperlinks\">\n <lib-object-hyperlinks-item [hyperlink]=\"hyperlink\" [deleteButtonEnabled]=\"canDeleteHyperlinks\"\n (deleteButtonClicked)=\"onHyperlinkItemDeleteButtonClicked(hyperlink)\"/>\n </div>\n } @else {\n <div class=\"no-links\">{{ \"_No hyperlinks found\" | translate }}</div>\n }\n </lib-bimplus-scrollable-container>\n </div>\n</div>\n", styles: [":host{height:100%;display:flex;flex-direction:column;flex:1}.list-anchor{position:relative;flex:1}.list{position:absolute;top:0;bottom:0;width:100%}.no-links{padding:2.5rem .5rem;color:var(--details-controls-details-not-found-text-color);text-align:center}.input-form{padding-left:.8rem;padding-right:.8rem;display:flex;flex-direction:column;gap:.2rem}\n"] }]
132
- }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.DialogService }, { type: i3.FormBuilder }], propDecorators: { api: [{
133
- type: Input
134
- }], rootObjectId: [{
135
- type: Input
136
- }], canCreateHyperlinks: [{
137
- type: Input
138
- }], canDeleteHyperlinks: [{
139
- type: Input
140
- }] } });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LWh5cGVybGlua3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvb2JqZWN0LWh5cGVybGlua3Mvb2JqZWN0LWh5cGVybGlua3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJpbXBsdXMtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvb2JqZWN0LWh5cGVybGlua3Mvb2JqZWN0LWh5cGVybGlua3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQVUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFFaEcsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7QUFDL0csT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsbUNBQW1DLEVBQ3BDLE1BQU0sd0VBQXdFLENBQUM7QUFDaEYsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sNERBQTRELENBQUM7QUFFekcsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTlDLE9BQU8sRUFDTCxvQ0FBb0MsRUFDckMsTUFBTSw0RUFBNEUsQ0FBQztBQUNwRixPQUFPLEVBQXlCLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZGLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLGdFQUFnRSxDQUFDOzs7OztBQW1COUcsTUFBTSxPQUFPLHlCQUEw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QkFDZixtQkFBbUI7d0JBQ25CLElBQUk7d0JBQ0osOEJBQThCO3FCQUMvQixpQkFHYyxpQkFBaUIsQ0FBQyxTQUFTOzJJQXdCakMsR0FBRztzQkFBWCxLQUFLO2dCQUdGLFlBQVk7c0JBRGYsS0FBSztnQkFrQkcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0JpbXBsdXNCdXR0b25zUm93Q29tcG9uZW50fSBmcm9tIFwiLi4vYmltcGx1cy1idXR0b25zLXJvdy9iaW1wbHVzLWJ1dHRvbnMtcm93LmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCaW1wbHVzQnV0dG9uQ2xpY2tFdmVudCwgQmltcGx1c0J1dHRvblJvd0l0ZW19IGZyb20gXCIuLi9iaW1wbHVzLWJ1dHRvbnMtcm93L2JpbXBsdXMtYnV0dG9ucy1yb3cuaW50ZXJmYWNlXCI7XG5pbXBvcnQge0JpbXBsdXNMb2NhbGl6ZWRXaWRnZXRDb21wb25lbnR9IGZyb20gXCIuLi9iaW1wbHVzLWxvY2FsaXplZC13aWRnZXQvYmltcGx1cy1sb2NhbGl6ZWQtd2lkZ2V0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge1xuICBCaW1wbHVzU2Nyb2xsYWJsZUNvbnRhaW5lckNvbXBvbmVudFxufSBmcm9tIFwiLi4vYmltcGx1cy1zY3JvbGxhYmxlLWNvbnRhaW5lci9iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtPYmplY3RIeXBlcmxpbmtzSXRlbUNvbXBvbmVudH0gZnJvbSBcIi4uL29iamVjdC1oeXBlcmxpbmtzLWl0ZW0vb2JqZWN0LWh5cGVybGlua3MtaXRlbS5jb21wb25lbnRcIjtcbmltcG9ydCBXZWJTZGsgZnJvbSBcImJpbXBsdXMtd2Vic2RrXCI7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7TmdGb3JPZiwgTmdJZn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtEaWFsb2dTZXJ2aWNlfSBmcm9tIFwiLi4vYmltcGx1cy1nZW5lcmFsLW92ZXJsYXktZGlhbG9nL2JpbXBsdXMtZ2VuZXJhbC1vdmVybGF5LWRpYWxvZy5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBCaW1wbHVzT3ZlcmxheURpYWxvZ0NvbmZpcm1Db21wb25lbnRcbn0gZnJvbSBcIi4uL2JpbXBsdXMtb3ZlcmxheS1kaWFsb2ctY29uZmlybS9iaW1wbHVzLW92ZXJsYXktZGlhbG9nLWNvbmZpcm0uY29tcG9uZW50XCI7XG5pbXBvcnQge0Zvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnN9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtCaW1wbHVzSW5wdXRUZXh0RmllbGRDb21wb25lbnR9IGZyb20gXCIuLi9iaW1wbHVzLWlucHV0LXRleHQtZmllbGQvYmltcGx1cy1pbnB1dC10ZXh0LWZpZWxkLmNvbXBvbmVudFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItb2JqZWN0LWh5cGVybGlua3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQmltcGx1c0J1dHRvbnNSb3dDb21wb25lbnQsXG4gICAgQmltcGx1c1Njcm9sbGFibGVDb250YWluZXJDb21wb25lbnQsXG4gICAgT2JqZWN0SHlwZXJsaW5rc0l0ZW1Db21wb25lbnQsXG4gICAgTmdGb3JPZixcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBOZ0lmLFxuICAgIEJpbXBsdXNJbnB1dFRleHRGaWVsZENvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vb2JqZWN0LWh5cGVybGlua3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb2JqZWN0LWh5cGVybGlua3MuY29tcG9uZW50Lmxlc3MnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb21cbn0pXG5leHBvcnQgY2xhc3MgT2JqZWN0SHlwZXJsaW5rc0NvbXBvbmVudCBleHRlbmRzIEJpbXBsdXNMb2NhbGl6ZWRXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBoeXBlcmxpbmtGb3JtOiBGb3JtR3JvdXA7XG5cbiAgY29uc3RydWN0b3IodHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSwgcHJpdmF0ZSByZWFkb25seSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLCBwcml2YXRlIHJlYWRvbmx5IGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcikge1xuICAgIHN1cGVyKHRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gICAgdGhpcy5oeXBlcmxpbmtGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBuYW1lOiBbJycsIFtdXSxcbiAgICAgIHVybDogWycnLFxuICAgICAgICBbXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oL15bXjw+XSokLyksIC8vIERvIG5vdCBhbGxvdyA8IG9yID5cbiAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4oL14oPyFcXHMqJCkuKy8pIC8vIERvIG5vdCBhbGxvdyBhbGwgZW1wdHkgc3RyaW5nLCBidXQgYWxsb3cgdGV4dCBhZnRlciBzcGFjZXNcbiAgICAgICAgXVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgdGhpcy5oeXBlcmxpbmtGb3JtLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XG4gICAgICB0aGlzLmJ1dHRvblJvd0l0ZW1zWzBdLmRpc2FibGVkID0gc3RhdHVzICE9PSAnVkFMSUQnO1xuICAgIH0pO1xuICB9XG5cbiAgQElucHV0KCkgYXBpOiBXZWJTZGsuQXBpIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KClcbiAgc2V0IHJvb3RPYmplY3RJZChpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3VycmVudE9iamVjdElkJC5uZXh0KGlkKTtcbiAgICB0aGlzLmxvYWRIeXBlcmxpbmtzKGlkKTtcblxuICAgIHRoaXMuX3Jvb3RPYmplY3RJZCA9IGlkO1xuICB9XG5cbiAgZ2V0IHJvb3RPYmplY3RJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yb290T2JqZWN0SWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXJyZW50T2JqZWN0SWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFwiXCIpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdXJyZW50UHJvcGVydGllc09iamVjdElkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcIlwiKTtcbiAgcHJpdmF0ZSBfcm9vdE9iamVjdElkOiBzdHJpbmcgPSBcIlwiO1xuXG4gIGJ1dHRvblJvd0l0ZW1zOiBBcnJheTxCaW1wbHVzQnV0dG9uUm93SXRlbT4gPSBbXTtcblxuICBASW5wdXQoKSBjYW5DcmVhdGVIeXBlcmxpbmtzOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgY2FuRGVsZXRlSHlwZXJsaW5rczogYm9vbGVhbiA9IHRydWU7XG5cbiAgaHlwZXJsaW5rczogQXJyYXk8V2ViU2RrLkh5cGVybGluaz4gPSBbXTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmJ1dHRvblJvd0l0ZW1zLnB1c2goXG4gICAgICB7XG4gICAgICAgIGlkOiBcImFkZC1oeXBlcmxpbmtcIlxuICAgICAgICAsIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnX0FkZCBoeXBlcmxpbmsnKVxuICAgICAgICAsIHRvb2x0aXA6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfQWRkIGh5cGVybGluaycpXG4gICAgICAgICwgZGlzYWJsZWQ6IHRydWVcbiAgICAgICAgLCBidXR0b25TdHlsZTogJ3ByaW1hcnknXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGJ1dHRvblJvd0J1dHRvbkNsaWNrZWQoJGV2ZW50OiBCaW1wbHVzQnV0dG9uQ2xpY2tFdmVudCkge1xuICAgIGlmICgkZXZlbnQuaWQgPT09IFwiYWRkLWh5cGVybGlua1wiKSB7XG4gICAgICBpZiAodGhpcy5oeXBlcmxpbmtGb3JtLnZhbGlkKSB7XG4gICAgICAgIHRoaXMuYWRkSHlwZXJsaW5rKHRoaXMuaHlwZXJsaW5rRm9ybS52YWx1ZVsnbmFtZSddLCB0aGlzLmh5cGVybGlua0Zvcm0udmFsdWVbJ3VybCddLCB0aGlzLl9yb290T2JqZWN0SWQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEh5cGVybGlua3ModGhpcy5fcm9vdE9iamVjdElkKTtcbiAgICAgICAgICB0aGlzLmh5cGVybGlua0Zvcm0ucmVzZXQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkSHlwZXJsaW5rcyhvYmplY3RJZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmFwaSlcbiAgICAgIHJldHVybjtcblxuICAgIHRoaXMuYXBpLm9iamVjdHMuZ2V0SHlwZXJsaW5rcyhvYmplY3RJZCkudGhlbigocmVzcG9uc2U6IFdlYlNkay5IeXBlcmxpbmtzUmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuaHlwZXJsaW5rcyA9IHJlc3BvbnNlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRIeXBlcmxpbmsobmFtZTogc3RyaW5nLCB1cmw6IHN0cmluZywgb2JqZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8V2ViU2RrLkh5cGVybGluaz4ge1xuICAgIGlmICghdGhpcy5hcGkpXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdBUEkgbm90IGF2YWlsYWJsZScpKTtcblxuICAgIGxldCBzYW5pdGl6ZWRVcmw6IHN0cmluZyA9IHVybC50cmltKCk7XG5cbiAgICBpZiAoIVJlZ0V4cCgvXmh0dHAocz8pOlxcL1xcLy8pLmV4ZWMoc2FuaXRpemVkVXJsKSkge1xuICAgICAgc2FuaXRpemVkVXJsID0gJ2h0dHBzOi8vJyArIHNhbml0aXplZFVybDtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkTmFtZSA9IG5hbWU/LnRyaW0oKSA/PyAnJztcblxuICAgIGlmIChzYW5pdGl6ZWROYW1lID09PSAnJykge1xuICAgICAgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplZFVybDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgIHVybDogc2FuaXRpemVkVXJsLFxuICAgICAgb2JqZWN0SWQ6IG9iamVjdElkXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hcGkub2JqZWN0cy5wb3N0SHlwZXJsaW5rKG9iamVjdElkLCBkYXRhKTtcbiAgfVxuXG4gIG9uSHlwZXJsaW5rSXRlbURlbGV0ZUJ1dHRvbkNsaWNrZWQoaHlwZXJsaW5rOiBXZWJTZGsuSHlwZXJsaW5rKSB7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oQmltcGx1c092ZXJsYXlEaWFsb2dDb25maXJtQ29tcG9uZW50LCB7XG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHdpZHRoOiAnNDAwcHgnLCBoZWlnaHQ6ICcyMDBweCcsIHBvc2l0aW9uOiAnbWlkZGxlJyxcbiAgICAgICAgcG9zaXRpb25PcHRpb25zOiB7fSwgb3ZlcmxheUNsaWNrRW5hYmxlZDogZmFsc2UsIG92ZXJsYXlWaXNpYmlsaXR5RW5hYmxlZDogdHJ1ZSwgZHJhZ2dhYmxlOiBmYWxzZVxuICAgICAgfSwgZGF0YToge1xuICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ19EZWxldGUgaHlwZXJsaW5rJyksXG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdfSHlwZXJsaW5rIGRlbGV0ZSBjb25maXJtYXRpb24gbWVzc2FnZScpLFxuICAgICAgICBhY2NlcHRCdXR0b25Mb2NhbGl6ZWRTdHJpbmc6IFwiX0RlbGV0ZVwiLFxuICAgICAgICBhY2NlcHRDYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVsZXRlSHlwZXJsaW5rKGh5cGVybGluay5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlSHlwZXJsaW5rKGlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYXBpKVxuICAgICAgcmV0dXJuO1xuXG4gICAgdGhpcy5hcGkuaHlwZXJsaW5rcy5kZWxldGUoaWQpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkSHlwZXJsaW5rcyh0aGlzLl9yb290T2JqZWN0SWQpO1xuICAgIH0pO1xuICB9XG59XG4iLCJAaWYgKGNhbkNyZWF0ZUh5cGVybGlua3MpIHtcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJoeXBlcmxpbmtGb3JtXCIgY2xhc3M9XCJpbnB1dC1mb3JtXCI+XG4gICAgPGRpdj5cbiAgICAgIDxsaWItYmltcGx1cy1pbnB1dC10ZXh0LWZpZWxkIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cInt7ICdfTmFtZScgfCB0cmFuc2xhdGUgfX1cIi8+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxsaWItYmltcGx1cy1pbnB1dC10ZXh0LWZpZWxkIGZvcm1Db250cm9sTmFtZT1cInVybFwiIHBsYWNlaG9sZGVyPVwie3sgJ19VUkwnIHwgdHJhbnNsYXRlIH19XCIvPlxuICAgIDwvZGl2PlxuXG4gICAgPGxpYi1iaW1wbHVzLWJ1dHRvbnMtcm93IFtpdGVtc109XCJidXR0b25Sb3dJdGVtc1wiIChidXR0b25DbGlja2VkKT1cImJ1dHRvblJvd0J1dHRvbkNsaWNrZWQoJGV2ZW50KVwiLz5cbiAgPC9mb3JtPlxufVxuXG48ZGl2IGNsYXNzPVwibGlzdC1hbmNob3JcIj5cbiAgPGRpdiBjbGFzcz1cImxpc3RcIj5cbiAgICA8bGliLWJpbXBsdXMtc2Nyb2xsYWJsZS1jb250YWluZXI+XG4gICAgICBAaWYgKGh5cGVybGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZy1sZWZ0OiA4cHhcIiAqbmdGb3I9XCJsZXQgaHlwZXJsaW5rIG9mIGh5cGVybGlua3NcIj5cbiAgICAgICAgICA8bGliLW9iamVjdC1oeXBlcmxpbmtzLWl0ZW0gW2h5cGVybGlua109XCJoeXBlcmxpbmtcIiBbZGVsZXRlQnV0dG9uRW5hYmxlZF09XCJjYW5EZWxldGVIeXBlcmxpbmtzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZUJ1dHRvbkNsaWNrZWQpPVwib25IeXBlcmxpbmtJdGVtRGVsZXRlQnV0dG9uQ2xpY2tlZChoeXBlcmxpbmspXCIvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibm8tbGlua3NcIj57eyBcIl9ObyBoeXBlcmxpbmtzIGZvdW5kXCIgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgIH1cbiAgICA8L2xpYi1iaW1wbHVzLXNjcm9sbGFibGUtY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19