@pepperi-addons/ngx-lib 0.3.9-beta.21 → 0.3.9-beta.24

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 (663) hide show
  1. package/address/address.component.d.ts +27 -27
  2. package/address/address.module.d.ts +2 -2
  3. package/address/pepperi-addons-ngx-lib-address.d.ts +4 -4
  4. package/address/public-api.d.ts +2 -2
  5. package/attachment/attachment.component.d.ts +82 -82
  6. package/attachment/attachment.module.d.ts +2 -2
  7. package/attachment/pepperi-addons-ngx-lib-attachment.d.ts +4 -4
  8. package/attachment/public-api.d.ts +2 -2
  9. package/bread-crumbs/bread-crumbs.component.d.ts +23 -23
  10. package/bread-crumbs/bread-crumbs.model.d.ts +11 -11
  11. package/bread-crumbs/bread-crumbs.module.d.ts +5 -5
  12. package/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.d.ts +4 -4
  13. package/bread-crumbs/public-api.d.ts +3 -3
  14. package/bundles/pepperi-addons-ngx-lib-address.umd.js +124 -124
  15. package/bundles/pepperi-addons-ngx-lib-attachment.umd.js +247 -247
  16. package/bundles/pepperi-addons-ngx-lib-bread-crumbs.umd.js +121 -121
  17. package/bundles/pepperi-addons-ngx-lib-button.umd.js +158 -158
  18. package/bundles/pepperi-addons-ngx-lib-carousel.umd.js +788 -788
  19. package/bundles/pepperi-addons-ngx-lib-checkbox.umd.js +192 -192
  20. package/bundles/pepperi-addons-ngx-lib-color.umd.js +296 -296
  21. package/bundles/pepperi-addons-ngx-lib-date.umd.js +660 -660
  22. package/bundles/pepperi-addons-ngx-lib-dialog.umd.js +171 -171
  23. package/bundles/pepperi-addons-ngx-lib-draggable-items.umd.js +151 -151
  24. package/bundles/pepperi-addons-ngx-lib-field-title.umd.js +57 -57
  25. package/bundles/pepperi-addons-ngx-lib-files-uploader.umd.js +260 -260
  26. package/bundles/pepperi-addons-ngx-lib-form.umd.js +3237 -3229
  27. package/bundles/pepperi-addons-ngx-lib-form.umd.js.map +1 -1
  28. package/bundles/pepperi-addons-ngx-lib-group-buttons.umd.js +87 -87
  29. package/bundles/pepperi-addons-ngx-lib-icon.umd.js +681 -681
  30. package/bundles/pepperi-addons-ngx-lib-image.umd.js +322 -316
  31. package/bundles/pepperi-addons-ngx-lib-image.umd.js.map +1 -1
  32. package/bundles/pepperi-addons-ngx-lib-images-filmstrip.umd.js +413 -413
  33. package/bundles/pepperi-addons-ngx-lib-link.umd.js +464 -464
  34. package/bundles/pepperi-addons-ngx-lib-list.umd.js +3187 -3187
  35. package/bundles/pepperi-addons-ngx-lib-menu.umd.js +646 -646
  36. package/bundles/pepperi-addons-ngx-lib-page-layout.umd.js +60 -60
  37. package/bundles/pepperi-addons-ngx-lib-profile-data-views-list.umd.js +543 -543
  38. package/bundles/pepperi-addons-ngx-lib-quantity-selector.umd.js +914 -914
  39. package/bundles/pepperi-addons-ngx-lib-query-builder.umd.js +1060 -1060
  40. package/bundles/pepperi-addons-ngx-lib-rich-html-textarea.umd.js +275 -275
  41. package/bundles/pepperi-addons-ngx-lib-search.umd.js +326 -326
  42. package/bundles/pepperi-addons-ngx-lib-select.umd.js +575 -576
  43. package/bundles/pepperi-addons-ngx-lib-select.umd.js.map +1 -1
  44. package/bundles/pepperi-addons-ngx-lib-separator.umd.js +79 -79
  45. package/bundles/pepperi-addons-ngx-lib-side-bar.umd.js +163 -163
  46. package/bundles/pepperi-addons-ngx-lib-signature.umd.js +283 -283
  47. package/bundles/pepperi-addons-ngx-lib-size-detector.umd.js +113 -113
  48. package/bundles/pepperi-addons-ngx-lib-slider.umd.js +124 -124
  49. package/bundles/pepperi-addons-ngx-lib-smart-filters.umd.js +1780 -1780
  50. package/bundles/pepperi-addons-ngx-lib-textarea.umd.js +211 -211
  51. package/bundles/pepperi-addons-ngx-lib-textbox-icon.umd.js +80 -80
  52. package/bundles/pepperi-addons-ngx-lib-textbox.umd.js +506 -506
  53. package/bundles/pepperi-addons-ngx-lib-top-bar.umd.js +129 -129
  54. package/bundles/pepperi-addons-ngx-lib.umd.js +4719 -4719
  55. package/bundles/pepperi-addons-ngx-lib.umd.js.map +1 -1
  56. package/button/button.component.d.ts +99 -99
  57. package/button/button.model.d.ts +14 -14
  58. package/button/button.module.d.ts +2 -2
  59. package/button/pepperi-addons-ngx-lib-button.d.ts +4 -4
  60. package/button/public-api.d.ts +3 -3
  61. package/carousel/carousel-item.directive.d.ts +9 -9
  62. package/carousel/carousel.component.d.ts +145 -145
  63. package/carousel/carousel.module.d.ts +2 -2
  64. package/carousel/pepperi-addons-ngx-lib-carousel.d.ts +4 -4
  65. package/carousel/public-api.d.ts +3 -3
  66. package/checkbox/checkbox.component.d.ts +47 -47
  67. package/checkbox/checkbox.module.d.ts +5 -5
  68. package/checkbox/pepperi-addons-ngx-lib-checkbox.d.ts +4 -4
  69. package/checkbox/public-api.d.ts +2 -2
  70. package/color/color-picker.component.d.ts +52 -52
  71. package/color/color.component.d.ts +26 -26
  72. package/color/color.model.d.ts +1 -1
  73. package/color/color.module.d.ts +5 -5
  74. package/color/pepperi-addons-ngx-lib-color.d.ts +5 -5
  75. package/color/public-api.d.ts +3 -3
  76. package/core/clipboard/clipboard.directive.d.ts +2 -2
  77. package/core/clipboard/clipboard.service.d.ts +2 -2
  78. package/core/clipboard/index.d.ts +1 -1
  79. package/core/clipboard/public-api.d.ts +2 -2
  80. package/core/common/directives/auto-width.directive.d.ts +16 -16
  81. package/core/common/directives/button-blur.directive.d.ts +6 -6
  82. package/core/common/directives/button-loader.directive.d.ts +23 -23
  83. package/core/common/directives/data-qa.directive.d.ts +8 -8
  84. package/core/common/directives/index.d.ts +1 -1
  85. package/core/common/directives/menu-blur.directive.d.ts +7 -7
  86. package/core/common/directives/prevent-multi-click.directive.d.ts +4 -4
  87. package/core/common/directives/print.directive.d.ts +72 -72
  88. package/core/common/directives/public-api.d.ts +7 -7
  89. package/core/common/index.d.ts +1 -1
  90. package/core/common/model/index.d.ts +1 -1
  91. package/core/common/model/papi.model.d.ts +2 -2
  92. package/core/common/model/public-api.d.ts +3 -3
  93. package/core/common/model/utilities.model.d.ts +5 -5
  94. package/core/common/model/wapi.model.d.ts +200 -200
  95. package/core/common/pipes/common-pipes.d.ts +36 -36
  96. package/core/common/pipes/index.d.ts +1 -1
  97. package/core/common/pipes/public-api.d.ts +1 -1
  98. package/core/common/public-api.d.ts +4 -4
  99. package/core/common/services/addon.service.d.ts +32 -32
  100. package/core/common/services/color.service.d.ts +48 -48
  101. package/core/common/services/cookie.service.d.ts +50 -50
  102. package/core/common/services/data-convertor.service.d.ts +39 -39
  103. package/core/common/services/file.service.d.ts +24 -24
  104. package/core/common/services/index.d.ts +1 -1
  105. package/core/common/services/jwt-helper.service.d.ts +10 -10
  106. package/core/common/services/public-api.d.ts +11 -11
  107. package/core/common/services/session.service.d.ts +15 -15
  108. package/core/common/services/translate.service.d.ts +9 -9
  109. package/core/common/services/utilities.service.d.ts +18 -18
  110. package/core/common/services/validator.service.d.ts +28 -28
  111. package/core/common/services/window-scrolling.service.d.ts +7 -7
  112. package/core/customization/customization.model.d.ts +264 -264
  113. package/core/customization/customization.service.d.ts +155 -155
  114. package/core/customization/index.d.ts +1 -1
  115. package/core/customization/public-api.d.ts +2 -2
  116. package/core/http/index.d.ts +1 -1
  117. package/core/http/interceptors/error.interceptor.d.ts +5 -5
  118. package/core/http/interceptors/index.d.ts +11 -11
  119. package/core/http/interceptors/loader.interceptor.d.ts +8 -8
  120. package/core/http/interceptors/profiler.interceptor.d.ts +5 -5
  121. package/core/http/public-api.d.ts +2 -2
  122. package/core/http/services/http.service.d.ts +25 -25
  123. package/core/http/services/loader.service.d.ts +10 -10
  124. package/core/index.d.ts +1 -1
  125. package/core/layout/index.d.ts +1 -1
  126. package/core/layout/layout.service.d.ts +33 -33
  127. package/core/layout/public-api.d.ts +2 -2
  128. package/core/layout/rtl.directive.d.ts +16 -16
  129. package/core/portal/attach.directive.d.ts +10 -10
  130. package/core/portal/index.d.ts +1 -1
  131. package/core/portal/portal.service.d.ts +9 -9
  132. package/core/portal/public-api.d.ts +3 -3
  133. package/core/portal/target.directive.d.ts +9 -9
  134. package/core/public-api.d.ts +7 -7
  135. package/core/scroll-to/index.d.ts +1 -1
  136. package/core/scroll-to/public-api.d.ts +1 -1
  137. package/core/scroll-to/scroll-to.service.d.ts +8 -8
  138. package/date/date.component.d.ts +65 -65
  139. package/date/date.model.d.ts +26 -26
  140. package/date/date.module.d.ts +5 -5
  141. package/date/pepperi-addons-ngx-lib-date.d.ts +5 -5
  142. package/date/public-api.d.ts +2 -2
  143. package/dialog/default-dialog.component.d.ts +8 -8
  144. package/dialog/dialog.component.d.ts +6 -6
  145. package/dialog/dialog.model.d.ts +27 -27
  146. package/dialog/dialog.module.d.ts +5 -5
  147. package/dialog/dialog.service.d.ts +24 -24
  148. package/dialog/pepperi-addons-ngx-lib-dialog.d.ts +5 -5
  149. package/dialog/public-api.d.ts +4 -4
  150. package/draggable-items/draggable-item/draggable-item.component.d.ts +8 -8
  151. package/draggable-items/draggable-items.component.d.ts +33 -33
  152. package/draggable-items/draggable-items.model.d.ts +7 -7
  153. package/draggable-items/draggable-items.module.d.ts +5 -5
  154. package/draggable-items/pepperi-addons-ngx-lib-draggable-items.d.ts +4 -4
  155. package/draggable-items/pepperi-addons-ngx-lib-draggable-items.metadata.json +1 -1
  156. package/draggable-items/public-api.d.ts +4 -4
  157. package/esm2015/address/address.component.js +96 -96
  158. package/esm2015/address/address.module.js +30 -30
  159. package/esm2015/address/pepperi-addons-ngx-lib-address.js +4 -4
  160. package/esm2015/address/public-api.js +5 -5
  161. package/esm2015/attachment/attachment.component.js +208 -208
  162. package/esm2015/attachment/attachment.module.js +28 -28
  163. package/esm2015/attachment/pepperi-addons-ngx-lib-attachment.js +4 -4
  164. package/esm2015/attachment/public-api.js +5 -5
  165. package/esm2015/bread-crumbs/bread-crumbs.component.js +78 -78
  166. package/esm2015/bread-crumbs/bread-crumbs.model.js +6 -6
  167. package/esm2015/bread-crumbs/bread-crumbs.module.js +34 -34
  168. package/esm2015/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.js +4 -4
  169. package/esm2015/bread-crumbs/public-api.js +6 -6
  170. package/esm2015/button/button.component.js +127 -127
  171. package/esm2015/button/button.model.js +5 -5
  172. package/esm2015/button/button.module.js +26 -26
  173. package/esm2015/button/pepperi-addons-ngx-lib-button.js +4 -4
  174. package/esm2015/button/public-api.js +6 -6
  175. package/esm2015/carousel/carousel-item.directive.js +26 -26
  176. package/esm2015/carousel/carousel.component.js +699 -699
  177. package/esm2015/carousel/carousel.module.js +11 -11
  178. package/esm2015/carousel/pepperi-addons-ngx-lib-carousel.js +4 -4
  179. package/esm2015/carousel/public-api.js +7 -7
  180. package/esm2015/checkbox/checkbox.component.js +151 -151
  181. package/esm2015/checkbox/checkbox.module.js +39 -39
  182. package/esm2015/checkbox/pepperi-addons-ngx-lib-checkbox.js +4 -4
  183. package/esm2015/checkbox/public-api.js +5 -5
  184. package/esm2015/color/color-picker.component.js +194 -194
  185. package/esm2015/color/color.component.js +74 -74
  186. package/esm2015/color/color.model.js +1 -1
  187. package/esm2015/color/color.module.js +57 -57
  188. package/esm2015/color/pepperi-addons-ngx-lib-color.js +5 -5
  189. package/esm2015/color/public-api.js +6 -6
  190. package/esm2015/core/clipboard/clipboard.directive.js +19 -19
  191. package/esm2015/core/clipboard/clipboard.service.js +11 -11
  192. package/esm2015/core/clipboard/index.js +4 -4
  193. package/esm2015/core/clipboard/public-api.js +5 -5
  194. package/esm2015/core/common/directives/auto-width.directive.js +77 -77
  195. package/esm2015/core/common/directives/button-blur.directive.js +22 -22
  196. package/esm2015/core/common/directives/button-loader.directive.js +102 -102
  197. package/esm2015/core/common/directives/data-qa.directive.js +22 -22
  198. package/esm2015/core/common/directives/index.js +4 -4
  199. package/esm2015/core/common/directives/menu-blur.directive.js +28 -28
  200. package/esm2015/core/common/directives/prevent-multi-click.directive.js +21 -21
  201. package/esm2015/core/common/directives/print.directive.js +134 -134
  202. package/esm2015/core/common/directives/public-api.js +11 -11
  203. package/esm2015/core/common/index.js +4 -4
  204. package/esm2015/core/common/model/index.js +4 -4
  205. package/esm2015/core/common/model/papi.model.js +2 -2
  206. package/esm2015/core/common/model/public-api.js +6 -6
  207. package/esm2015/core/common/model/utilities.model.js +56 -56
  208. package/esm2015/core/common/model/wapi.model.js +155 -155
  209. package/esm2015/core/common/pipes/common-pipes.js +141 -141
  210. package/esm2015/core/common/pipes/index.js +4 -4
  211. package/esm2015/core/common/pipes/public-api.js +4 -4
  212. package/esm2015/core/common/public-api.js +7 -7
  213. package/esm2015/core/common/services/addon.service.js +123 -123
  214. package/esm2015/core/common/services/color.service.js +356 -356
  215. package/esm2015/core/common/services/cookie.service.js +147 -147
  216. package/esm2015/core/common/services/data-convertor.service.js +111 -111
  217. package/esm2015/core/common/services/file.service.js +211 -211
  218. package/esm2015/core/common/services/index.js +4 -4
  219. package/esm2015/core/common/services/jwt-helper.service.js +103 -103
  220. package/esm2015/core/common/services/public-api.js +14 -14
  221. package/esm2015/core/common/services/session.service.js +72 -72
  222. package/esm2015/core/common/services/translate.service.js +47 -47
  223. package/esm2015/core/common/services/utilities.service.js +123 -123
  224. package/esm2015/core/common/services/validator.service.js +272 -272
  225. package/esm2015/core/common/services/window-scrolling.service.js +30 -30
  226. package/esm2015/core/customization/customization.model.js +290 -290
  227. package/esm2015/core/customization/customization.service.js +774 -774
  228. package/esm2015/core/customization/index.js +4 -4
  229. package/esm2015/core/customization/public-api.js +5 -5
  230. package/esm2015/core/http/index.js +4 -4
  231. package/esm2015/core/http/interceptors/error.interceptor.js +23 -23
  232. package/esm2015/core/http/interceptors/index.js +23 -23
  233. package/esm2015/core/http/interceptors/loader.interceptor.js +32 -32
  234. package/esm2015/core/http/interceptors/profiler.interceptor.js +28 -28
  235. package/esm2015/core/http/public-api.js +5 -5
  236. package/esm2015/core/http/services/http.service.js +160 -160
  237. package/esm2015/core/http/services/loader.service.js +48 -48
  238. package/esm2015/core/index.js +4 -4
  239. package/esm2015/core/layout/index.js +4 -4
  240. package/esm2015/core/layout/layout.service.js +168 -168
  241. package/esm2015/core/layout/public-api.js +5 -5
  242. package/esm2015/core/layout/rtl.directive.js +46 -46
  243. package/esm2015/core/portal/attach.directive.js +26 -26
  244. package/esm2015/core/portal/index.js +4 -4
  245. package/esm2015/core/portal/portal.service.js +34 -34
  246. package/esm2015/core/portal/public-api.js +6 -6
  247. package/esm2015/core/portal/target.directive.js +23 -23
  248. package/esm2015/core/public-api.js +10 -10
  249. package/esm2015/core/scroll-to/index.js +4 -4
  250. package/esm2015/core/scroll-to/public-api.js +5 -5
  251. package/esm2015/core/scroll-to/scroll-to.service.js +81 -81
  252. package/esm2015/date/date.component.js +244 -244
  253. package/esm2015/date/date.model.js +44 -44
  254. package/esm2015/date/date.module.js +50 -50
  255. package/esm2015/date/pepperi-addons-ngx-lib-date.js +5 -5
  256. package/esm2015/date/public-api.js +5 -5
  257. package/esm2015/dialog/default-dialog.component.js +28 -28
  258. package/esm2015/dialog/dialog.component.js +21 -21
  259. package/esm2015/dialog/dialog.model.js +21 -21
  260. package/esm2015/dialog/dialog.module.js +39 -39
  261. package/esm2015/dialog/dialog.service.js +73 -73
  262. package/esm2015/dialog/pepperi-addons-ngx-lib-dialog.js +5 -5
  263. package/esm2015/dialog/public-api.js +7 -7
  264. package/esm2015/draggable-items/draggable-item/draggable-item.component.js +24 -24
  265. package/esm2015/draggable-items/draggable-items.component.js +91 -91
  266. package/esm2015/draggable-items/draggable-items.model.js +1 -1
  267. package/esm2015/draggable-items/draggable-items.module.js +42 -42
  268. package/esm2015/draggable-items/pepperi-addons-ngx-lib-draggable-items.js +4 -4
  269. package/esm2015/draggable-items/public-api.js +7 -7
  270. package/esm2015/field-title/field-title.component.js +31 -31
  271. package/esm2015/field-title/field-title.module.js +31 -31
  272. package/esm2015/field-title/pepperi-addons-ngx-lib-field-title.js +4 -4
  273. package/esm2015/field-title/public-api.js +5 -5
  274. package/esm2015/files-uploader/files-uploader.component.js +220 -220
  275. package/esm2015/files-uploader/files-uploader.module.js +49 -49
  276. package/esm2015/files-uploader/pepperi-addons-ngx-lib-files-uploader.js +4 -4
  277. package/esm2015/files-uploader/public-api.js +5 -5
  278. package/esm2015/form/field-generator.component.js +121 -121
  279. package/esm2015/form/form.component.js +1189 -1181
  280. package/esm2015/form/form.model.js +1 -1
  281. package/esm2015/form/form.module.js +107 -107
  282. package/esm2015/form/indicators.component.js +20 -20
  283. package/esm2015/form/internal-button.component.js +165 -165
  284. package/esm2015/form/internal-carusel.component.js +115 -115
  285. package/esm2015/form/internal-carusel.service.js +31 -31
  286. package/esm2015/form/internal-list.component.js +494 -494
  287. package/esm2015/form/internal-menu.component.js +54 -54
  288. package/esm2015/form/internal-page.component.js +350 -350
  289. package/esm2015/form/internal-page.service.js +120 -120
  290. package/esm2015/form/pepperi-addons-ngx-lib-form.js +13 -13
  291. package/esm2015/form/public-api.js +6 -6
  292. package/esm2015/group-buttons/group-buttons.component.js +57 -57
  293. package/esm2015/group-buttons/group-buttons.module.js +37 -37
  294. package/esm2015/group-buttons/pepperi-addons-ngx-lib-group-buttons.js +4 -4
  295. package/esm2015/group-buttons/public-api.js +5 -5
  296. package/esm2015/icon/icon-generated-all.model.js +100 -100
  297. package/esm2015/icon/icon-generated.model.js +389 -389
  298. package/esm2015/icon/icon-registry.service.js +22 -22
  299. package/esm2015/icon/icon.component.js +124 -124
  300. package/esm2015/icon/icon.module.js +14 -14
  301. package/esm2015/icon/icon.service.js +31 -31
  302. package/esm2015/icon/pepperi-addons-ngx-lib-icon.js +4 -4
  303. package/esm2015/icon/public-api.js +10 -10
  304. package/esm2015/image/image.component.js +229 -223
  305. package/esm2015/image/image.module.js +48 -48
  306. package/esm2015/image/image.service.js +54 -54
  307. package/esm2015/image/pepperi-addons-ngx-lib-image.js +4 -4
  308. package/esm2015/image/public-api.js +6 -6
  309. package/esm2015/images-filmstrip/images-filmstrip.component.js +363 -363
  310. package/esm2015/images-filmstrip/images-filmstrip.module.js +70 -70
  311. package/esm2015/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.js +4 -4
  312. package/esm2015/images-filmstrip/public-api.js +5 -5
  313. package/esm2015/link/link.component.js +390 -390
  314. package/esm2015/link/link.module.js +50 -50
  315. package/esm2015/link/link.pipes.js +14 -14
  316. package/esm2015/link/pepperi-addons-ngx-lib-link.js +5 -5
  317. package/esm2015/link/public-api.js +5 -5
  318. package/esm2015/list/list-actions.component.js +35 -35
  319. package/esm2015/list/list-carousel.component.js +94 -94
  320. package/esm2015/list/list-chooser.component.js +57 -57
  321. package/esm2015/list/list-pager.component.js +112 -112
  322. package/esm2015/list/list-sorting.component.js +54 -54
  323. package/esm2015/list/list-total.component.js +23 -23
  324. package/esm2015/list/list-views.component.js +71 -71
  325. package/esm2015/list/list.component.js +1123 -1123
  326. package/esm2015/list/list.model.js +3 -3
  327. package/esm2015/list/list.module.js +87 -87
  328. package/esm2015/list/list.pipes.js +39 -39
  329. package/esm2015/list/pepperi-addons-ngx-lib-list.js +6 -6
  330. package/esm2015/list/public-api.js +14 -14
  331. package/esm2015/list/virtual-scroller.js +1018 -1018
  332. package/esm2015/menu/menu-item.component.js +102 -102
  333. package/esm2015/menu/menu.component.js +173 -173
  334. package/esm2015/menu/menu.model.js +18 -18
  335. package/esm2015/menu/menu.module.js +39 -39
  336. package/esm2015/menu/pepperi-addons-ngx-lib-menu.js +5 -5
  337. package/esm2015/menu/public-api.js +6 -6
  338. package/esm2015/ngx-lib.module.js +76 -76
  339. package/esm2015/page-layout/page-layout.component.js +41 -41
  340. package/esm2015/page-layout/page-layout.module.js +20 -20
  341. package/esm2015/page-layout/pepperi-addons-ngx-lib-page-layout.js +4 -4
  342. package/esm2015/page-layout/public-api.js +5 -5
  343. package/esm2015/pepperi-addons-ngx-lib.js +8 -8
  344. package/esm2015/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.js +4 -4
  345. package/esm2015/profile-data-views-list/profile-data-view/profile-data-view.component.js +38 -38
  346. package/esm2015/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.js +59 -59
  347. package/esm2015/profile-data-views-list/profile-data-views-list.component.js +86 -86
  348. package/esm2015/profile-data-views-list/profile-data-views-list.model.js +1 -1
  349. package/esm2015/profile-data-views-list/profile-data-views-list.module.js +56 -56
  350. package/esm2015/profile-data-views-list/public-api.js +8 -8
  351. package/esm2015/public-api.js +5 -5
  352. package/esm2015/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.js +6 -6
  353. package/esm2015/quantity-selector/public-api.js +5 -5
  354. package/esm2015/quantity-selector/quantity-selector-validation.directive.js +43 -43
  355. package/esm2015/quantity-selector/quantity-selector.component.js +460 -460
  356. package/esm2015/quantity-selector/quantity-selector.module.js +52 -52
  357. package/esm2015/quantity-selector/quantity-selector.pipes.js +18 -18
  358. package/esm2015/query-builder/common/model/field.js +1 -1
  359. package/esm2015/query-builder/common/model/filter.js +1 -1
  360. package/esm2015/query-builder/common/model/legacy.js +1 -1
  361. package/esm2015/query-builder/common/model/operator-unit.js +41 -41
  362. package/esm2015/query-builder/common/model/operator.js +206 -206
  363. package/esm2015/query-builder/common/model/structure.js +1 -1
  364. package/esm2015/query-builder/common/model/type-map.js +26 -26
  365. package/esm2015/query-builder/common/model/type.js +5 -5
  366. package/esm2015/query-builder/common/services/output-query.service.js +110 -110
  367. package/esm2015/query-builder/common/services/type-convertor.service.js +39 -39
  368. package/esm2015/query-builder/pepperi-addons-ngx-lib-query-builder.js +8 -8
  369. package/esm2015/query-builder/public-api.js +7 -7
  370. package/esm2015/query-builder/query-builder-item/query-builder-item.component.js +115 -115
  371. package/esm2015/query-builder/query-builder-section/query-builder-section.component.js +63 -63
  372. package/esm2015/query-builder/query-builder.component.js +103 -103
  373. package/esm2015/query-builder/query-builder.module.js +34 -34
  374. package/esm2015/query-builder/query-builder.service.js +281 -281
  375. package/esm2015/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.js +4 -4
  376. package/esm2015/rich-html-textarea/public-api.js +5 -5
  377. package/esm2015/rich-html-textarea/rich-html-textarea.component.js +219 -219
  378. package/esm2015/rich-html-textarea/rich-html-textarea.module.js +56 -56
  379. package/esm2015/search/pepperi-addons-ngx-lib-search.js +4 -4
  380. package/esm2015/search/public-api.js +6 -6
  381. package/esm2015/search/search.component.js +273 -273
  382. package/esm2015/search/search.model.js +1 -1
  383. package/esm2015/search/search.module.js +44 -44
  384. package/esm2015/select/pepperi-addons-ngx-lib-select.js +4 -4
  385. package/esm2015/select/public-api.js +5 -5
  386. package/esm2015/select/select.component.js +212 -213
  387. package/esm2015/select/select.module.js +42 -42
  388. package/esm2015/separator/pepperi-addons-ngx-lib-separator.js +4 -4
  389. package/esm2015/separator/public-api.js +5 -5
  390. package/esm2015/separator/separator.component.js +62 -62
  391. package/esm2015/separator/separator.module.js +12 -12
  392. package/esm2015/side-bar/pepperi-addons-ngx-lib-side-bar.js +4 -4
  393. package/esm2015/side-bar/public-api.js +6 -6
  394. package/esm2015/side-bar/side-bar.component.js +130 -130
  395. package/esm2015/side-bar/side-bar.model.js +1 -1
  396. package/esm2015/side-bar/side-bar.module.js +33 -33
  397. package/esm2015/signature/pepperi-addons-ngx-lib-signature.js +4 -4
  398. package/esm2015/signature/public-api.js +5 -5
  399. package/esm2015/signature/signature.component.js +230 -230
  400. package/esm2015/signature/signature.module.js +54 -54
  401. package/esm2015/size-detector/pepperi-addons-ngx-lib-size-detector.js +4 -4
  402. package/esm2015/size-detector/public-api.js +5 -5
  403. package/esm2015/size-detector/size-detector.component.js +88 -88
  404. package/esm2015/size-detector/size-detector.module.js +21 -21
  405. package/esm2015/slider/pepperi-addons-ngx-lib-slider.js +4 -4
  406. package/esm2015/slider/public-api.js +5 -5
  407. package/esm2015/slider/slider.component.js +95 -95
  408. package/esm2015/slider/slider.module.js +24 -24
  409. package/esm2015/smart-filters/boolean-filter/boolean-filter.component.js +41 -41
  410. package/esm2015/smart-filters/common/filter-actions.component.js +25 -25
  411. package/esm2015/smart-filters/common/model/base-filter-component.js +259 -259
  412. package/esm2015/smart-filters/common/model/creator.js +75 -75
  413. package/esm2015/smart-filters/common/model/field.js +116 -116
  414. package/esm2015/smart-filters/common/model/filter.js +1 -1
  415. package/esm2015/smart-filters/common/model/operator.js +215 -215
  416. package/esm2015/smart-filters/common/model/type.js +1 -1
  417. package/esm2015/smart-filters/date-filter/date-filter.component.js +143 -143
  418. package/esm2015/smart-filters/multi-select-filter/multi-select-filter.component.js +152 -152
  419. package/esm2015/smart-filters/number-filter/number-filter.component.js +102 -102
  420. package/esm2015/smart-filters/pepperi-addons-ngx-lib-smart-filters.js +4 -4
  421. package/esm2015/smart-filters/public-api.js +18 -18
  422. package/esm2015/smart-filters/smart-filters.component.js +129 -129
  423. package/esm2015/smart-filters/smart-filters.module.js +90 -90
  424. package/esm2015/smart-filters/text-filter/text-filter.component.js +78 -78
  425. package/esm2015/textarea/pepperi-addons-ngx-lib-textarea.js +4 -4
  426. package/esm2015/textarea/public-api.js +5 -5
  427. package/esm2015/textarea/textarea.component.js +160 -160
  428. package/esm2015/textarea/textarea.module.js +50 -50
  429. package/esm2015/textbox/pepperi-addons-ngx-lib-textbox.js +5 -5
  430. package/esm2015/textbox/public-api.js +5 -5
  431. package/esm2015/textbox/textbox-validation.directive.js +85 -85
  432. package/esm2015/textbox/textbox.component.js +368 -368
  433. package/esm2015/textbox/textbox.module.js +44 -44
  434. package/esm2015/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.js +4 -4
  435. package/esm2015/textbox-icon/public-api.js +5 -5
  436. package/esm2015/textbox-icon/textbox-icon.component.js +40 -40
  437. package/esm2015/textbox-icon/textbox-icon.module.js +46 -46
  438. package/esm2015/top-bar/pepperi-addons-ngx-lib-top-bar.js +4 -4
  439. package/esm2015/top-bar/public-api.js +6 -6
  440. package/esm2015/top-bar/top-bar.component.js +98 -98
  441. package/esm2015/top-bar/top-bar.model.js +1 -1
  442. package/esm2015/top-bar/top-bar.module.js +40 -40
  443. package/fesm2015/pepperi-addons-ngx-lib-address.js +116 -116
  444. package/fesm2015/pepperi-addons-ngx-lib-attachment.js +227 -227
  445. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.js +109 -109
  446. package/fesm2015/pepperi-addons-ngx-lib-button.js +149 -149
  447. package/fesm2015/pepperi-addons-ngx-lib-carousel.js +731 -731
  448. package/fesm2015/pepperi-addons-ngx-lib-checkbox.js +178 -178
  449. package/fesm2015/pepperi-addons-ngx-lib-color.js +292 -292
  450. package/fesm2015/pepperi-addons-ngx-lib-date.js +313 -313
  451. package/fesm2015/pepperi-addons-ngx-lib-dialog.js +157 -157
  452. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.js +143 -143
  453. package/fesm2015/pepperi-addons-ngx-lib-field-title.js +55 -55
  454. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.js +252 -252
  455. package/fesm2015/pepperi-addons-ngx-lib-form.js +2685 -2677
  456. package/fesm2015/pepperi-addons-ngx-lib-form.js.map +1 -1
  457. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.js +84 -84
  458. package/fesm2015/pepperi-addons-ngx-lib-icon.js +662 -662
  459. package/fesm2015/pepperi-addons-ngx-lib-image.js +306 -300
  460. package/fesm2015/pepperi-addons-ngx-lib-image.js.map +1 -1
  461. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.js +400 -400
  462. package/fesm2015/pepperi-addons-ngx-lib-link.js +434 -434
  463. package/fesm2015/pepperi-addons-ngx-lib-list.js +2657 -2657
  464. package/fesm2015/pepperi-addons-ngx-lib-menu.js +314 -314
  465. package/fesm2015/pepperi-addons-ngx-lib-page-layout.js +55 -55
  466. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.js +219 -219
  467. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.js +549 -549
  468. package/fesm2015/pepperi-addons-ngx-lib-query-builder.js +976 -976
  469. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.js +256 -256
  470. package/fesm2015/pepperi-addons-ngx-lib-search.js +301 -301
  471. package/fesm2015/pepperi-addons-ngx-lib-select.js +241 -242
  472. package/fesm2015/pepperi-addons-ngx-lib-select.js.map +1 -1
  473. package/fesm2015/pepperi-addons-ngx-lib-separator.js +71 -71
  474. package/fesm2015/pepperi-addons-ngx-lib-side-bar.js +154 -154
  475. package/fesm2015/pepperi-addons-ngx-lib-signature.js +267 -267
  476. package/fesm2015/pepperi-addons-ngx-lib-size-detector.js +103 -103
  477. package/fesm2015/pepperi-addons-ngx-lib-slider.js +112 -112
  478. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.js +1351 -1351
  479. package/fesm2015/pepperi-addons-ngx-lib-textarea.js +194 -194
  480. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.js +78 -78
  481. package/fesm2015/pepperi-addons-ngx-lib-textbox.js +478 -478
  482. package/fesm2015/pepperi-addons-ngx-lib-top-bar.js +125 -125
  483. package/fesm2015/pepperi-addons-ngx-lib.js +4087 -4087
  484. package/fesm2015/pepperi-addons-ngx-lib.js.map +1 -1
  485. package/field-title/field-title.component.d.ts +11 -11
  486. package/field-title/field-title.module.d.ts +5 -5
  487. package/field-title/pepperi-addons-ngx-lib-field-title.d.ts +4 -4
  488. package/field-title/public-api.d.ts +2 -2
  489. package/files-uploader/files-uploader.component.d.ts +53 -53
  490. package/files-uploader/files-uploader.module.d.ts +5 -5
  491. package/files-uploader/pepperi-addons-ngx-lib-files-uploader.d.ts +4 -4
  492. package/files-uploader/public-api.d.ts +2 -2
  493. package/form/field-generator.component.d.ts +36 -36
  494. package/form/form.component.d.ts +88 -88
  495. package/form/form.model.d.ts +20 -20
  496. package/form/form.module.d.ts +5 -5
  497. package/form/indicators.component.d.ts +7 -7
  498. package/form/internal-button.component.d.ts +39 -39
  499. package/form/internal-carusel.component.d.ts +38 -38
  500. package/form/internal-carusel.service.d.ts +7 -7
  501. package/form/internal-list.component.d.ts +92 -92
  502. package/form/internal-menu.component.d.ts +16 -16
  503. package/form/internal-page.component.d.ts +72 -72
  504. package/form/internal-page.service.d.ts +19 -19
  505. package/form/pepperi-addons-ngx-lib-form.d.ts +13 -13
  506. package/form/public-api.d.ts +3 -3
  507. package/group-buttons/group-buttons.component.d.ts +20 -20
  508. package/group-buttons/group-buttons.module.d.ts +5 -5
  509. package/group-buttons/pepperi-addons-ngx-lib-group-buttons.d.ts +4 -4
  510. package/group-buttons/public-api.d.ts +2 -2
  511. package/icon/icon-generated-all.model.d.ts +99 -99
  512. package/icon/icon-generated.model.d.ts +394 -394
  513. package/icon/icon-registry.service.d.ts +6 -6
  514. package/icon/icon.component.d.ts +46 -46
  515. package/icon/icon.module.d.ts +2 -2
  516. package/icon/icon.service.d.ts +10 -10
  517. package/icon/pepperi-addons-ngx-lib-icon.d.ts +4 -4
  518. package/icon/public-api.d.ts +6 -6
  519. package/image/image.component.d.ts +63 -62
  520. package/image/image.module.d.ts +5 -5
  521. package/image/image.service.d.ts +11 -11
  522. package/image/pepperi-addons-ngx-lib-image.d.ts +4 -4
  523. package/image/pepperi-addons-ngx-lib-image.metadata.json +1 -1
  524. package/image/public-api.d.ts +3 -3
  525. package/images-filmstrip/images-filmstrip.component.d.ts +82 -82
  526. package/images-filmstrip/images-filmstrip.module.d.ts +5 -5
  527. package/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.d.ts +4 -4
  528. package/images-filmstrip/public-api.d.ts +2 -2
  529. package/link/link.component.d.ts +136 -136
  530. package/link/link.module.d.ts +5 -5
  531. package/link/link.pipes.d.ts +4 -4
  532. package/link/pepperi-addons-ngx-lib-link.d.ts +5 -5
  533. package/link/public-api.d.ts +2 -2
  534. package/list/list-actions.component.d.ts +14 -14
  535. package/list/list-carousel.component.d.ts +36 -36
  536. package/list/list-chooser.component.d.ts +25 -25
  537. package/list/list-pager.component.d.ts +35 -35
  538. package/list/list-sorting.component.d.ts +26 -26
  539. package/list/list-total.component.d.ts +7 -7
  540. package/list/list-views.component.d.ts +31 -31
  541. package/list/list.component.d.ts +159 -159
  542. package/list/list.model.d.ts +30 -30
  543. package/list/list.module.d.ts +5 -5
  544. package/list/list.pipes.d.ts +11 -11
  545. package/list/pepperi-addons-ngx-lib-list.d.ts +6 -6
  546. package/list/public-api.d.ts +10 -10
  547. package/list/virtual-scroller.d.ts +176 -176
  548. package/menu/menu-item.component.d.ts +25 -25
  549. package/menu/menu.component.d.ts +43 -43
  550. package/menu/menu.model.d.ts +25 -25
  551. package/menu/menu.module.d.ts +5 -5
  552. package/menu/pepperi-addons-ngx-lib-menu.d.ts +5 -5
  553. package/menu/public-api.d.ts +3 -3
  554. package/ngx-lib.module.d.ts +2 -2
  555. package/package.json +1 -1
  556. package/page-layout/page-layout.component.d.ts +16 -16
  557. package/page-layout/page-layout.module.d.ts +2 -2
  558. package/page-layout/pepperi-addons-ngx-lib-page-layout.d.ts +4 -4
  559. package/page-layout/public-api.d.ts +2 -2
  560. package/pepperi-addons-ngx-lib.d.ts +8 -8
  561. package/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.d.ts +4 -4
  562. package/profile-data-views-list/profile-data-view/profile-data-view.component.d.ts +15 -15
  563. package/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.d.ts +21 -21
  564. package/profile-data-views-list/profile-data-views-list.component.d.ts +32 -32
  565. package/profile-data-views-list/profile-data-views-list.model.d.ts +18 -18
  566. package/profile-data-views-list/profile-data-views-list.module.d.ts +5 -5
  567. package/profile-data-views-list/public-api.d.ts +5 -5
  568. package/public-api.d.ts +2 -2
  569. package/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.d.ts +6 -6
  570. package/quantity-selector/public-api.d.ts +2 -2
  571. package/quantity-selector/quantity-selector-validation.directive.d.ts +13 -13
  572. package/quantity-selector/quantity-selector.component.d.ts +96 -96
  573. package/quantity-selector/quantity-selector.module.d.ts +5 -5
  574. package/quantity-selector/quantity-selector.pipes.d.ts +4 -4
  575. package/query-builder/common/model/field.d.ts +8 -8
  576. package/query-builder/common/model/filter.d.ts +6 -6
  577. package/query-builder/common/model/legacy.d.ts +29 -29
  578. package/query-builder/common/model/operator-unit.d.ts +13 -13
  579. package/query-builder/common/model/operator.d.ts +21 -21
  580. package/query-builder/common/model/structure.d.ts +4 -4
  581. package/query-builder/common/model/type-map.d.ts +12 -12
  582. package/query-builder/common/model/type.d.ts +4 -4
  583. package/query-builder/common/services/output-query.service.d.ts +44 -44
  584. package/query-builder/common/services/type-convertor.service.d.ts +10 -10
  585. package/query-builder/pepperi-addons-ngx-lib-query-builder.d.ts +8 -8
  586. package/query-builder/public-api.d.ts +4 -4
  587. package/query-builder/query-builder-item/query-builder-item.component.d.ts +37 -37
  588. package/query-builder/query-builder-section/query-builder-section.component.d.ts +27 -27
  589. package/query-builder/query-builder.component.d.ts +35 -35
  590. package/query-builder/query-builder.module.d.ts +2 -2
  591. package/query-builder/query-builder.service.d.ts +94 -94
  592. package/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.d.ts +4 -4
  593. package/rich-html-textarea/public-api.d.ts +2 -2
  594. package/rich-html-textarea/rich-html-textarea.component.d.ts +75 -75
  595. package/rich-html-textarea/rich-html-textarea.module.d.ts +5 -5
  596. package/search/pepperi-addons-ngx-lib-search.d.ts +4 -4
  597. package/search/public-api.d.ts +3 -3
  598. package/search/search.component.d.ts +61 -61
  599. package/search/search.model.d.ts +14 -14
  600. package/search/search.module.d.ts +5 -5
  601. package/select/pepperi-addons-ngx-lib-select.d.ts +4 -4
  602. package/select/public-api.d.ts +2 -2
  603. package/select/select.component.d.ts +50 -50
  604. package/select/select.module.d.ts +5 -5
  605. package/separator/pepperi-addons-ngx-lib-separator.d.ts +4 -4
  606. package/separator/public-api.d.ts +2 -2
  607. package/separator/separator.component.d.ts +19 -19
  608. package/separator/separator.module.d.ts +2 -2
  609. package/side-bar/pepperi-addons-ngx-lib-side-bar.d.ts +4 -4
  610. package/side-bar/public-api.d.ts +3 -3
  611. package/side-bar/side-bar.component.d.ts +38 -38
  612. package/side-bar/side-bar.model.d.ts +4 -4
  613. package/side-bar/side-bar.module.d.ts +5 -5
  614. package/signature/pepperi-addons-ngx-lib-signature.d.ts +4 -4
  615. package/signature/public-api.d.ts +2 -2
  616. package/signature/signature.component.d.ts +64 -64
  617. package/signature/signature.module.d.ts +5 -5
  618. package/size-detector/pepperi-addons-ngx-lib-size-detector.d.ts +4 -4
  619. package/size-detector/public-api.d.ts +2 -2
  620. package/size-detector/size-detector.component.d.ts +26 -26
  621. package/size-detector/size-detector.module.d.ts +2 -2
  622. package/slider/pepperi-addons-ngx-lib-slider.d.ts +4 -4
  623. package/slider/public-api.d.ts +2 -2
  624. package/slider/slider.component.d.ts +36 -36
  625. package/slider/slider.module.d.ts +2 -2
  626. package/smart-filters/boolean-filter/boolean-filter.component.d.ts +12 -12
  627. package/smart-filters/common/filter-actions.component.d.ts +9 -9
  628. package/smart-filters/common/model/base-filter-component.d.ts +67 -67
  629. package/smart-filters/common/model/creator.d.ts +6 -6
  630. package/smart-filters/common/model/field.d.ts +69 -69
  631. package/smart-filters/common/model/filter.d.ts +11 -11
  632. package/smart-filters/common/model/operator.d.ts +38 -38
  633. package/smart-filters/common/model/type.d.ts +4 -4
  634. package/smart-filters/date-filter/date-filter.component.d.ts +41 -41
  635. package/smart-filters/multi-select-filter/multi-select-filter.component.d.ts +39 -39
  636. package/smart-filters/number-filter/number-filter.component.d.ts +38 -38
  637. package/smart-filters/pepperi-addons-ngx-lib-smart-filters.d.ts +4 -4
  638. package/smart-filters/public-api.d.ts +14 -14
  639. package/smart-filters/smart-filters.component.d.ts +32 -32
  640. package/smart-filters/smart-filters.module.d.ts +5 -5
  641. package/smart-filters/text-filter/text-filter.component.d.ts +17 -17
  642. package/src/core/style/abstracts/functions.scss +10 -10
  643. package/src/core/style/abstracts/mixins.scss +96 -96
  644. package/src/core/style/base/typography.scss +8 -0
  645. package/textarea/pepperi-addons-ngx-lib-textarea.d.ts +4 -4
  646. package/textarea/public-api.d.ts +2 -2
  647. package/textarea/textarea.component.d.ts +51 -51
  648. package/textarea/textarea.module.d.ts +5 -5
  649. package/textbox/pepperi-addons-ngx-lib-textbox.d.ts +5 -5
  650. package/textbox/public-api.d.ts +2 -2
  651. package/textbox/textbox-validation.directive.d.ts +18 -18
  652. package/textbox/textbox.component.d.ts +131 -131
  653. package/textbox/textbox.module.d.ts +5 -5
  654. package/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.d.ts +4 -4
  655. package/textbox-icon/public-api.d.ts +2 -2
  656. package/textbox-icon/textbox-icon.component.d.ts +10 -10
  657. package/textbox-icon/textbox-icon.module.d.ts +5 -5
  658. package/theming.scss +0 -15
  659. package/top-bar/pepperi-addons-ngx-lib-top-bar.d.ts +4 -4
  660. package/top-bar/public-api.d.ts +3 -3
  661. package/top-bar/top-bar.component.d.ts +36 -36
  662. package/top-bar/top-bar.model.d.ts +4 -4
  663. package/top-bar/top-bar.module.d.ts +5 -5
@@ -1,351 +1,351 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, ViewContainerRef, TemplateRef, ChangeDetectionStrategy, ChangeDetectorRef, } from '@angular/core';
2
- import { FormBuilder } from '@angular/forms';
3
- import { PepInternalPageService } from './internal-page.service';
4
- import { PepCustomizationService, FIELD_TYPE, } from '@pepperi-addons/ngx-lib';
5
- import { PepInternalListComponent, } from './internal-list.component';
6
- import { PepDialogService } from '@pepperi-addons/ngx-lib/dialog';
7
- import { fromEvent } from 'rxjs';
8
- import { debounceTime } from 'rxjs/operators';
9
- import { PepQuantitySelectorComponent } from '@pepperi-addons/ngx-lib/quantity-selector';
10
- export class PepInternalPageComponent {
11
- constructor(fb, dialogService, internalPageService, customizationService, elementRef, changeDetectorRef) {
12
- this.fb = fb;
13
- this.dialogService = dialogService;
14
- this.internalPageService = internalPageService;
15
- this.customizationService = customizationService;
16
- this.elementRef = elementRef;
17
- this.changeDetectorRef = changeDetectorRef;
18
- this.controlType = 'internalPage';
19
- this.layoutType = 'form';
20
- this.internalFormFieldChange = new EventEmitter();
21
- this.internalFormFieldClick = new EventEmitter();
22
- this.checkForChanges = null;
23
- this.childData = null;
24
- this.totalsRow = [];
25
- this.additionalApiNames = null;
26
- this.currentAdditionalApiName = null;
27
- this.focusedQS = false;
28
- this.fieldIdWithFocus = '';
29
- this.columnWidth = 100;
30
- this.coverChildTable = false;
31
- this.currentViewType = null;
32
- this.sumOfMinColWidth = 0;
33
- this.totalRowsWidth = 0;
34
- this.viewWidth = '100%';
35
- this.viewHeight = 'auto';
36
- this.displayQSbtns = true;
37
- this.selectedApiName = '';
38
- this.showSort = false;
39
- this.defaultRowSpan = -1;
40
- }
41
- fillData(isInDialog = false) {
42
- var _a, _b, _c, _d, _e;
43
- const view = this.matrixTemplate.createEmbeddedView(null);
44
- (_a = this.customList) === null || _a === void 0 ? void 0 : _a.clear();
45
- (_b = this.orgCont) === null || _b === void 0 ? void 0 : _b.clear();
46
- if (isInDialog) {
47
- (_c = this.dialogCont) === null || _c === void 0 ? void 0 : _c.clear();
48
- (_d = this.dialogCont) === null || _d === void 0 ? void 0 : _d.insert(view);
49
- }
50
- else {
51
- (_e = this.orgCont) === null || _e === void 0 ? void 0 : _e.insert(view);
52
- }
53
- setTimeout(() => {
54
- const viewType = this.isTableView()
55
- ? 'table'
56
- : 'lines';
57
- this.customList.initListData(this.uiControl, this.childData.TotalRows, this.childData.Rows, viewType);
58
- this.setTotalsRow();
59
- // if (!this.childModal.isShown) {
60
- const childrenCount = this.childData.Rows
61
- ? this.childData.Rows.length
62
- : 0;
63
- const isEven = childrenCount % 2 === 0;
64
- // 3 for matrix & flat matrix because the header + total is 2 more rows.
65
- const rowsToAdd = this.isMatrixView() || this.isFlatMatrixView()
66
- ? isEven
67
- ? 3
68
- : 4
69
- : 1;
70
- const formRowHeight = this.customizationService.calculateFormFieldHeight() * 16; // convert rem to pixel
71
- // Set the default only if not set yet.
72
- if (this.defaultRowSpan === -1) {
73
- this.defaultRowSpan = this.field.rowSpan;
74
- }
75
- this.sumOfMinColWidth = 0;
76
- this.totalRowsWidth = 0;
77
- this.childData.UIControl.ControlFields.forEach((uiControlField) => {
78
- this.totalRowsWidth += uiControlField.ColumnWidth;
79
- uiControlField.minFieldWidth = this.mmToPx(12); // NEED TO GET THIS PARAM FROM CUSTOMIZATION;
80
- this.sumOfMinColWidth += 12;
81
- });
82
- this.setViewCover(this.childData.Rows);
83
- if (this.coverChildTable) {
84
- this.field.rowSpan = this.defaultRowSpan;
85
- }
86
- else {
87
- // For line view Add the height of the line (form height).
88
- if (this.currentViewType.Key === 'OrderCenterFlatMatrixLine') {
89
- const maxRow = Math.max(...this.uiControl.ControlFields.map((f) => {
90
- return f.Layout.Y + f.Layout.Height;
91
- }));
92
- // * 16 convert rem to pixel
93
- const cardRowsHeight = this.customizationService.calculateCardRowsHeight(maxRow) * 16;
94
- // maxRow * 24 + 60 - 24 for each row in card + 60 for the padding of each card.
95
- // const rowSpanToAdd = Math.floor(childrenCount * ((cardRowsHeight + 56) / formRowHeight) + rowsToAdd);
96
- // + 16 is the 1rem margin outside card.
97
- const rowSpanToAdd = (childrenCount * (cardRowsHeight + 16)) /
98
- formRowHeight +
99
- rowsToAdd;
100
- this.field.rowSpan = rowSpanToAdd;
101
- }
102
- else {
103
- // const tableRowsHeight = this.customizationService.calculateTableRowsHeight(childrenCount) * 16;
104
- // this.field.rowSpan = Math.ceil((tableRowsHeight + (rowsToAdd * 40)) / formRowHeight);
105
- // * 16 convert rem to pixel
106
- const rowsToAddHeight = this.customizationService.calculateTableRowsHeight(rowsToAdd, false) * 16;
107
- const tableRowsHeight = this.customizationService.calculateTableRowsHeight(childrenCount) * 16;
108
- this.field.rowSpan =
109
- (rowsToAddHeight + tableRowsHeight) / formRowHeight;
110
- }
111
- }
112
- }, 0);
113
- this.changeDetectorRef.markForCheck();
114
- }
115
- fillChildData(res) {
116
- this.childData = res;
117
- this.uiControl = res.UIControl;
118
- this.additionalApiNames = res.AdditionalApiNames;
119
- this.fillData();
120
- }
121
- mmToPx(mm) {
122
- const height = this.my1mm.nativeElement.clientHeight;
123
- return Math.floor(mm * height); // returns sizes in PX
124
- }
125
- isMatrixView() {
126
- return (this.currentViewType &&
127
- this.currentViewType.Key === 'OrderCenterMatrix');
128
- }
129
- isFlatMatrixView() {
130
- return (this.currentViewType &&
131
- this.currentViewType.Key === 'OrderCenterFlatMatrixGrid');
132
- }
133
- isTableView() {
134
- return this.isMatrixView() || this.isFlatMatrixView();
135
- }
136
- changeChildrenViewType(viewTypeKey) {
137
- this.rows = [];
138
- this.uiControl = null;
139
- for (const vt of this.childViewTypes) {
140
- if (vt.Key === viewTypeKey) {
141
- this.currentViewType = vt;
142
- break;
143
- }
144
- }
145
- this.currentViewTypeTitle = this.currentViewType.Value;
146
- this.internalPageService.changeChildrenViewType(this.currentViewType.Key, (res) => {
147
- if (res.Rows) {
148
- this.fillChildData(res);
149
- }
150
- });
151
- }
152
- setViewCover(rows) {
153
- if (!rows) {
154
- return;
155
- }
156
- const matrixCont = this.mainViewCont.nativeElement;
157
- const viewWidth = matrixCont.clientWidth;
158
- this.viewWidth = viewWidth ? viewWidth.toString() : '100%';
159
- // if the matrix located on the bottom / there is nothing under the matrix we dont need to check the height
160
- if (parseInt(viewWidth, 10) < this.mmToPx(this.sumOfMinColWidth)) {
161
- this.coverChildTable = true;
162
- }
163
- else {
164
- this.coverChildTable = false;
165
- }
166
- this.changeDetectorRef.markForCheck();
167
- }
168
- showMatrixDialog() {
169
- const config = this.dialogService.getDialogConfig({
170
- disableClose: false,
171
- }, 'large');
172
- const dialogRef = this.dialogService.openDialog(this.matrixDialogTemplate, {}, config);
173
- dialogRef.afterOpened().subscribe(() => {
174
- this.fillData(true);
175
- });
176
- dialogRef.afterClosed().subscribe((value) => {
177
- this.fillData(false);
178
- });
179
- }
180
- ngOnInit() {
181
- // let field = this.field as PepInternalPageField;
182
- this.internalPageService.initDetails(this.field.objectId, this.field.parentId, this.field.searchCode, (resViewTypes) => {
183
- // my code DI-7134
184
- resViewTypes.Rows = resViewTypes.Rows.filter((item) => item.Key !== 'OrderCenterView1');
185
- if (resViewTypes.Rows && resViewTypes.Rows.length > 0) {
186
- if (!resViewTypes.Default) {
187
- resViewTypes.Default = resViewTypes.Rows[0].Key;
188
- }
189
- this.childViewTypes = resViewTypes.Rows;
190
- this.currentViewType = resViewTypes.Rows[0];
191
- // for (var i = 0; i < resViewTypes.Rows.length; i++) {
192
- for (const viewTypeRow of resViewTypes.Rows) {
193
- if (viewTypeRow.Value === resViewTypes.Default) {
194
- this.currentViewType = viewTypeRow;
195
- }
196
- }
197
- this.loadLastAdditionalApiName();
198
- this.changeChildrenViewType(this.currentViewType.Key);
199
- }
200
- });
201
- this.resize = fromEvent(window, 'resize')
202
- .pipe(debounceTime(10))
203
- .subscribe((event) => {
204
- this.setViewCover(this.rows);
205
- });
206
- }
207
- loadLastAdditionalApiName() {
208
- const daa = sessionStorage.getItem(PepInternalPageComponent.CURRENT_ADDITIONAL_API_NAME);
209
- if (daa && daa.length > 0) {
210
- const additionalApiName = JSON.parse(daa);
211
- this.currentAdditionalApiName = additionalApiName;
212
- this.internalPageService.additionalApiName = additionalApiName === null || additionalApiName === void 0 ? void 0 : additionalApiName.Key;
213
- }
214
- }
215
- ngOnDestroy() {
216
- if (this.resize) {
217
- this.resize.unsubscribe();
218
- }
219
- }
220
- changeAdditionalApiName(additionalApiName) {
221
- this.internalPageService.changeAdditionalApiName(additionalApiName ? additionalApiName.Key : '', (res) => {
222
- // for (let index = 0; index < res.Rows.length; index++) {
223
- for (const row of res.Rows) {
224
- this.updateChanges(row);
225
- }
226
- this.changeDetectorRef.markForCheck();
227
- });
228
- sessionStorage.setItem(PepInternalPageComponent.CURRENT_ADDITIONAL_API_NAME, JSON.stringify(additionalApiName));
229
- setTimeout(() => {
230
- this.currentAdditionalApiName = additionalApiName;
231
- }, 0);
232
- }
233
- setTotalsRow() {
234
- this.totalsRow = [];
235
- if (this.isMatrixView() || this.isFlatMatrixView()) {
236
- let totalCol = 0;
237
- const items = this.customList.items;
238
- if (items) {
239
- for (let col = 0; col < items[0].Fields.length; col++) {
240
- const field = items[0].Fields[col];
241
- if (field.FieldType === FIELD_TYPE.NumberIntegerForMatrix ||
242
- field.FieldType ===
243
- FIELD_TYPE.NumberIntegerQuantitySelector ||
244
- field.FieldType === FIELD_TYPE.NumberRealForMatrix ||
245
- field.FieldType ===
246
- FIELD_TYPE.NumberRealQuantitySelector ||
247
- field.FieldType === FIELD_TYPE.CalculatedInt ||
248
- field.FieldType === FIELD_TYPE.NumberInteger ||
249
- field.FieldType === FIELD_TYPE.CalculatedReal ||
250
- field.FieldType === FIELD_TYPE.NumberReal) {
251
- totalCol = 0;
252
- for (const listItem of items) {
253
- if (listItem.Fields[col] &&
254
- listItem.Fields[col].Value) {
255
- const num = parseFloat(listItem.Fields[col].Value);
256
- totalCol += isNaN(num) ? 0 : num;
257
- }
258
- }
259
- this.totalsRow.push(totalCol);
260
- }
261
- else {
262
- this.totalsRow.push('');
263
- }
264
- }
265
- }
266
- }
267
- }
268
- updateChanges(elementToUpdate) {
269
- this.customList.updateItem(elementToUpdate);
270
- // Update memory data
271
- for (let index = 0; index < this.childData.Rows.length; index++) {
272
- if (this.childData.Rows[index].UID === elementToUpdate.UID) {
273
- this.childData.Rows[index] = elementToUpdate;
274
- }
275
- }
276
- }
277
- setValueCallback(id, res) {
278
- if (res.Rows.length === 1) {
279
- const field = res.Rows[0].Fields.find((f) => f.ApiName === 'ObjectMenu');
280
- if (field) {
281
- // HACK : Until "Enabled" returns from the server, we set PepMenu to be
282
- // Disabled in cart on regular items and not campign items.
283
- field.Enabled = true;
284
- }
285
- this.updateChanges(res.Rows[0]);
286
- }
287
- this.setTotalsRow();
288
- this.checkForChanges = new Date();
289
- // DI-15985
290
- this.internalFormFieldChange.emit(res);
291
- this.changeDetectorRef.markForCheck();
292
- }
293
- onCustomizeObjectChanged(customizeObjectChangedData) {
294
- this.internalPageService.childValueChanged(customizeObjectChangedData.id, customizeObjectChangedData.key, customizeObjectChangedData.value, (res) => {
295
- this.setValueCallback(customizeObjectChangedData.id, res);
296
- });
297
- }
298
- onCustomizeFieldClick(fieldClickEvent) {
299
- let handledEvent = false;
300
- // For the new custom form, the plus and minus events transform in the IPepFormFieldValueChangeEvent
301
- if (fieldClickEvent.controlType === 'qs') {
302
- if (fieldClickEvent.value === PepQuantitySelectorComponent.PLUS) {
303
- handledEvent = true;
304
- this.internalPageService.childPlusClick(fieldClickEvent.id, fieldClickEvent.key, (res) => {
305
- this.setValueCallback(fieldClickEvent.id, res);
306
- });
307
- }
308
- else if (fieldClickEvent.value === PepQuantitySelectorComponent.MINUS) {
309
- handledEvent = true;
310
- this.internalPageService.childMinusClick(fieldClickEvent.id, fieldClickEvent.key, (res) => {
311
- this.setValueCallback(fieldClickEvent.id, res);
312
- });
313
- }
314
- }
315
- if (!handledEvent) {
316
- this.internalFormFieldClick.emit(fieldClickEvent);
317
- }
318
- }
319
- }
320
- PepInternalPageComponent.CURRENT_ADDITIONAL_API_NAME = 'item_details_currentAdditionalApiName';
321
- PepInternalPageComponent.decorators = [
322
- { type: Component, args: [{
323
- selector: 'pep-internal-page',
324
- template: "<ng-template #matrixHeaderTemplate>\n <div class=\"matrix-title-container pep-border-bottom align-{{\n field.xAlignment\n }}\" title=\"{{ field.label }}\">\n <span class=\"block-with-text body-md\">{{ field.label }}</span>\n\n <div class=\"buttons-container pep-spacing-element-negative pull-right flip\">\n <ng-container *ngIf=\"\n currentViewType?.Key == 'OrderCenterMatrix' &&\n additionalApiNames &&\n additionalApiNames.length > 0\n \">\n <button class=\"pep-spacing-element pep-button icon-button sm weak\" mat-button [matMenuTriggerFor]=\"menu\"\n menu-blur>\n <span class=\"pull-left flip\" *ngIf=\"currentAdditionalApiName\">&nbsp;{{\n currentAdditionalApiName?.Value }}&nbsp;</span>\n\n <mat-icon [ngClass]=\"{'pull-left flip': currentAdditionalApiName}\">\n <pep-icon name=\"system_info\"></pep-icon>\n </mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item [ngClass]=\"{\n selected: currentAdditionalApiName === null\n }\" (click)=\"changeAdditionalApiName(null)\">\n <span>{{ \"LIST.NONE\" | translate }}</span>\n </button>\n <button mat-menu-item [ngClass]=\"{\n selected:\n currentAdditionalApiName?.Key ==\n additionalApiName?.Key\n }\" *ngFor=\"let additionalApiName of additionalApiNames\"\n (click)=\"changeAdditionalApiName(additionalApiName)\">\n <span>{{ additionalApiName.Value }}</span>\n </button>\n </mat-menu>\n </ng-container>\n <ng-container *ngIf=\"childViewTypes && childViewTypes.length > 1\">\n <button class=\"pep-spacing-element pep-button icon-button sm weak\" mat-button\n [matMenuTriggerFor]=\"viewsMenu\" menu-blur>\n <mat-icon>\n <pep-icon name=\"view_card_md\"></pep-icon>\n </mat-icon>\n </button>\n\n <mat-menu #viewsMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item [ngClass]=\"{\n selected: currentViewType?.Key == viewType?.Key\n }\" *ngFor=\"let viewType of childViewTypes\" (click)=\"changeChildrenViewType(viewType?.Key)\">\n <mat-icon [ngSwitch]=\"viewType?.Key\">\n <pep-icon *ngSwitchCase=\"'OrderCenterMatrix'\" name=\"view_matrix\"></pep-icon>\n <pep-icon *ngSwitchCase=\"'OrderCenterFlatMatrixGrid'\" name=\"view_table\"></pep-icon>\n <pep-icon *ngSwitchCase=\"'OrderCenterFlatMatrixLine'\" name=\"view_line\"></pep-icon>\n </mat-icon>\n <span>{{ viewType?.Value }}</span>\n </button>\n </mat-menu>\n </ng-container>\n </div>\n </div>\n\n</ng-template>\n\n<ng-template #matrixTemplate>\n <div #matrixContainer class=\"matrix-container\">\n <pep-internal-list (valueChange)=\"onCustomizeObjectChanged($event)\" [parentScroll]=\"matrixContainer\"\n (fieldClick)=\"onCustomizeFieldClick($event)\" [totalsRow]=\"totalsRow\"></pep-internal-list>\n </div>\n</ng-template>\n\n<div #mainViewCont id=\"mainViewCont\" [ngStyle]=\"{ 'max-width': viewWidth, 'max-height': viewHeight }\">\n <div #my1mm id=\"my1_mm\" style=\"height:1mm;width:1mm;visibility: hidden;\"></div>\n <ng-container *ngIf=\"coverChildTable && uiControl != null\">\n <div class=\"table-cover\"></div>\n <button (click)=\"showMatrixDialog()\" class=\"pep-button strong sm table-cover-button\"\n [ngClass]=\"{ 'lineview-btn': currentViewType?.Key == 'OrderCenterFlatMatrixLine'}\">\n {{ \"INTERNAL_PAGE.CLICK_TO_ORDER\" | translate }}\n </button>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"matrixHeaderTemplate\"></ng-container>\n <ng-container #orgCont></ng-container>\n</div>\n\n<ng-template #matrixDialogTemplate>\n\n <div mat-dialog-title>\n <ng-container *ngTemplateOutlet=\"matrixHeaderTemplate\"></ng-container>\n </div>\n\n <div mat-dialog-content>\n <ng-container #dialogCont></ng-container>\n </div>\n</ng-template>\n\n<!-- <div id=\"childGridModal\" bsModal (onShown)=\"onShown()\" (onHidden)=\"onHidden()\" #childModal=\"bs-modal\" class=\"modal\"\n tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"gridModalLabel\" aria-hidden=\"true\">\n <div class=\"modal-dialog\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-body matrix-dialog-body\">\n <ng-container #modalCont></ng-container>\n </div>\n </div>\n </div>\n</div> -->",
325
- providers: [PepInternalPageService],
326
- changeDetection: ChangeDetectionStrategy.OnPush,
327
- styles: [":host{display:grid;width:inherit;height:inherit}.matrix-title-container{padding:0;height:2.5rem;height:var(--pep-form-field-height,2.5rem);display:flex;align-items:flex-end}.matrix-title-container .block-with-text{width:100%;max-height:inherit;font-weight:600;font-weight:var(--pep-font-weight-bold,600);display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.matrix-title-container .buttons-container{display:flex;align-self:center}.matrix-title-container .buttons-container .pep-button,.matrix-title-container .buttons-container .pepperi-button{width:-webkit-max-content;width:-moz-max-content;width:max-content}#mainViewCont{width:100%;height:inherit;overflow:hidden;padding:0 .25rem;padding:0 var(--pep-spacing-xs,.25rem)}#mainViewCont .table-cover{background-color:#fff;z-index:98;position:absolute;top:0;width:100%;height:inherit;opacity:.5}#mainViewCont .table-cover-button{position:absolute;left:50%;transform:translate(-50%,-50%);top:calc(50% + 2.5rem);top:calc(50% + var(--pep-form-field-height, 2.5rem));z-index:99}#mainViewCont .table-cover-button.lineview-btn{top:calc(2 * 2.5rem);top:calc(2 * var(--pep-form-field-height, 2.5rem));transform:translate(-50%)}#mainViewCont .underCover{max-height:inherit;overflow:hidden}#mainViewCont ::ng-deep.table-header{top:unset!important}"]
328
- },] }
329
- ];
330
- PepInternalPageComponent.ctorParameters = () => [
331
- { type: FormBuilder },
332
- { type: PepDialogService },
333
- { type: PepInternalPageService },
334
- { type: PepCustomizationService },
335
- { type: ElementRef },
336
- { type: ChangeDetectorRef }
337
- ];
338
- PepInternalPageComponent.propDecorators = {
339
- field: [{ type: Input }],
340
- layoutType: [{ type: Input }],
341
- internalFormFieldChange: [{ type: Output }],
342
- internalFormFieldClick: [{ type: Output }],
343
- my1mm: [{ type: ViewChild, args: ['my1mm',] }],
344
- mainViewCont: [{ type: ViewChild, args: ['mainViewCont',] }],
345
- orgCont: [{ type: ViewChild, args: ['orgCont', { read: ViewContainerRef },] }],
346
- dialogCont: [{ type: ViewChild, args: ['dialogCont', { read: ViewContainerRef },] }],
347
- matrixTemplate: [{ type: ViewChild, args: ['matrixTemplate',] }],
348
- matrixDialogTemplate: [{ type: ViewChild, args: ['matrixDialogTemplate', { read: TemplateRef },] }],
349
- customList: [{ type: ViewChild, args: [PepInternalListComponent,] }]
350
- };
1
+ import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, ViewContainerRef, TemplateRef, ChangeDetectionStrategy, ChangeDetectorRef, } from '@angular/core';
2
+ import { FormBuilder } from '@angular/forms';
3
+ import { PepInternalPageService } from './internal-page.service';
4
+ import { PepCustomizationService, FIELD_TYPE, } from '@pepperi-addons/ngx-lib';
5
+ import { PepInternalListComponent, } from './internal-list.component';
6
+ import { PepDialogService } from '@pepperi-addons/ngx-lib/dialog';
7
+ import { fromEvent } from 'rxjs';
8
+ import { debounceTime } from 'rxjs/operators';
9
+ import { PepQuantitySelectorComponent } from '@pepperi-addons/ngx-lib/quantity-selector';
10
+ export class PepInternalPageComponent {
11
+ constructor(fb, dialogService, internalPageService, customizationService, elementRef, changeDetectorRef) {
12
+ this.fb = fb;
13
+ this.dialogService = dialogService;
14
+ this.internalPageService = internalPageService;
15
+ this.customizationService = customizationService;
16
+ this.elementRef = elementRef;
17
+ this.changeDetectorRef = changeDetectorRef;
18
+ this.controlType = 'internalPage';
19
+ this.layoutType = 'form';
20
+ this.internalFormFieldChange = new EventEmitter();
21
+ this.internalFormFieldClick = new EventEmitter();
22
+ this.checkForChanges = null;
23
+ this.childData = null;
24
+ this.totalsRow = [];
25
+ this.additionalApiNames = null;
26
+ this.currentAdditionalApiName = null;
27
+ this.focusedQS = false;
28
+ this.fieldIdWithFocus = '';
29
+ this.columnWidth = 100;
30
+ this.coverChildTable = false;
31
+ this.currentViewType = null;
32
+ this.sumOfMinColWidth = 0;
33
+ this.totalRowsWidth = 0;
34
+ this.viewWidth = '100%';
35
+ this.viewHeight = 'auto';
36
+ this.displayQSbtns = true;
37
+ this.selectedApiName = '';
38
+ this.showSort = false;
39
+ this.defaultRowSpan = -1;
40
+ }
41
+ fillData(isInDialog = false) {
42
+ var _a, _b, _c, _d, _e;
43
+ const view = this.matrixTemplate.createEmbeddedView(null);
44
+ (_a = this.customList) === null || _a === void 0 ? void 0 : _a.clear();
45
+ (_b = this.orgCont) === null || _b === void 0 ? void 0 : _b.clear();
46
+ if (isInDialog) {
47
+ (_c = this.dialogCont) === null || _c === void 0 ? void 0 : _c.clear();
48
+ (_d = this.dialogCont) === null || _d === void 0 ? void 0 : _d.insert(view);
49
+ }
50
+ else {
51
+ (_e = this.orgCont) === null || _e === void 0 ? void 0 : _e.insert(view);
52
+ }
53
+ setTimeout(() => {
54
+ const viewType = this.isTableView()
55
+ ? 'table'
56
+ : 'lines';
57
+ this.customList.initListData(this.uiControl, this.childData.TotalRows, this.childData.Rows, viewType);
58
+ this.setTotalsRow();
59
+ // if (!this.childModal.isShown) {
60
+ const childrenCount = this.childData.Rows
61
+ ? this.childData.Rows.length
62
+ : 0;
63
+ const isEven = childrenCount % 2 === 0;
64
+ // 3 for matrix & flat matrix because the header + total is 2 more rows.
65
+ const rowsToAdd = this.isMatrixView() || this.isFlatMatrixView()
66
+ ? isEven
67
+ ? 3
68
+ : 4
69
+ : 1;
70
+ const formRowHeight = this.customizationService.calculateFormFieldHeight() * 16; // convert rem to pixel
71
+ // Set the default only if not set yet.
72
+ if (this.defaultRowSpan === -1) {
73
+ this.defaultRowSpan = this.field.rowSpan;
74
+ }
75
+ this.sumOfMinColWidth = 0;
76
+ this.totalRowsWidth = 0;
77
+ this.childData.UIControl.ControlFields.forEach((uiControlField) => {
78
+ this.totalRowsWidth += uiControlField.ColumnWidth;
79
+ uiControlField.minFieldWidth = this.mmToPx(12); // NEED TO GET THIS PARAM FROM CUSTOMIZATION;
80
+ this.sumOfMinColWidth += 12;
81
+ });
82
+ this.setViewCover(this.childData.Rows);
83
+ if (this.coverChildTable) {
84
+ this.field.rowSpan = this.defaultRowSpan;
85
+ }
86
+ else {
87
+ // For line view Add the height of the line (form height).
88
+ if (this.currentViewType.Key === 'OrderCenterFlatMatrixLine') {
89
+ const maxRow = Math.max(...this.uiControl.ControlFields.map((f) => {
90
+ return f.Layout.Y + f.Layout.Height;
91
+ }));
92
+ // * 16 convert rem to pixel
93
+ const cardRowsHeight = this.customizationService.calculateCardRowsHeight(maxRow) * 16;
94
+ // maxRow * 24 + 60 - 24 for each row in card + 60 for the padding of each card.
95
+ // const rowSpanToAdd = Math.floor(childrenCount * ((cardRowsHeight + 56) / formRowHeight) + rowsToAdd);
96
+ // + 16 is the 1rem margin outside card.
97
+ const rowSpanToAdd = (childrenCount * (cardRowsHeight + 16)) /
98
+ formRowHeight +
99
+ rowsToAdd;
100
+ this.field.rowSpan = rowSpanToAdd;
101
+ }
102
+ else {
103
+ // const tableRowsHeight = this.customizationService.calculateTableRowsHeight(childrenCount) * 16;
104
+ // this.field.rowSpan = Math.ceil((tableRowsHeight + (rowsToAdd * 40)) / formRowHeight);
105
+ // * 16 convert rem to pixel
106
+ const rowsToAddHeight = this.customizationService.calculateTableRowsHeight(rowsToAdd, false) * 16;
107
+ const tableRowsHeight = this.customizationService.calculateTableRowsHeight(childrenCount) * 16;
108
+ this.field.rowSpan =
109
+ (rowsToAddHeight + tableRowsHeight) / formRowHeight;
110
+ }
111
+ }
112
+ }, 0);
113
+ this.changeDetectorRef.markForCheck();
114
+ }
115
+ fillChildData(res) {
116
+ this.childData = res;
117
+ this.uiControl = res.UIControl;
118
+ this.additionalApiNames = res.AdditionalApiNames;
119
+ this.fillData();
120
+ }
121
+ mmToPx(mm) {
122
+ const height = this.my1mm.nativeElement.clientHeight;
123
+ return Math.floor(mm * height); // returns sizes in PX
124
+ }
125
+ isMatrixView() {
126
+ return (this.currentViewType &&
127
+ this.currentViewType.Key === 'OrderCenterMatrix');
128
+ }
129
+ isFlatMatrixView() {
130
+ return (this.currentViewType &&
131
+ this.currentViewType.Key === 'OrderCenterFlatMatrixGrid');
132
+ }
133
+ isTableView() {
134
+ return this.isMatrixView() || this.isFlatMatrixView();
135
+ }
136
+ changeChildrenViewType(viewTypeKey) {
137
+ this.rows = [];
138
+ this.uiControl = null;
139
+ for (const vt of this.childViewTypes) {
140
+ if (vt.Key === viewTypeKey) {
141
+ this.currentViewType = vt;
142
+ break;
143
+ }
144
+ }
145
+ this.currentViewTypeTitle = this.currentViewType.Value;
146
+ this.internalPageService.changeChildrenViewType(this.currentViewType.Key, (res) => {
147
+ if (res.Rows) {
148
+ this.fillChildData(res);
149
+ }
150
+ });
151
+ }
152
+ setViewCover(rows) {
153
+ if (!rows) {
154
+ return;
155
+ }
156
+ const matrixCont = this.mainViewCont.nativeElement;
157
+ const viewWidth = matrixCont.clientWidth;
158
+ this.viewWidth = viewWidth ? viewWidth.toString() : '100%';
159
+ // if the matrix located on the bottom / there is nothing under the matrix we dont need to check the height
160
+ if (parseInt(viewWidth, 10) < this.mmToPx(this.sumOfMinColWidth)) {
161
+ this.coverChildTable = true;
162
+ }
163
+ else {
164
+ this.coverChildTable = false;
165
+ }
166
+ this.changeDetectorRef.markForCheck();
167
+ }
168
+ showMatrixDialog() {
169
+ const config = this.dialogService.getDialogConfig({
170
+ disableClose: false,
171
+ }, 'large');
172
+ const dialogRef = this.dialogService.openDialog(this.matrixDialogTemplate, {}, config);
173
+ dialogRef.afterOpened().subscribe(() => {
174
+ this.fillData(true);
175
+ });
176
+ dialogRef.afterClosed().subscribe((value) => {
177
+ this.fillData(false);
178
+ });
179
+ }
180
+ ngOnInit() {
181
+ // let field = this.field as PepInternalPageField;
182
+ this.internalPageService.initDetails(this.field.objectId, this.field.parentId, this.field.searchCode, (resViewTypes) => {
183
+ // my code DI-7134
184
+ resViewTypes.Rows = resViewTypes.Rows.filter((item) => item.Key !== 'OrderCenterView1');
185
+ if (resViewTypes.Rows && resViewTypes.Rows.length > 0) {
186
+ if (!resViewTypes.Default) {
187
+ resViewTypes.Default = resViewTypes.Rows[0].Key;
188
+ }
189
+ this.childViewTypes = resViewTypes.Rows;
190
+ this.currentViewType = resViewTypes.Rows[0];
191
+ // for (var i = 0; i < resViewTypes.Rows.length; i++) {
192
+ for (const viewTypeRow of resViewTypes.Rows) {
193
+ if (viewTypeRow.Value === resViewTypes.Default) {
194
+ this.currentViewType = viewTypeRow;
195
+ }
196
+ }
197
+ this.loadLastAdditionalApiName();
198
+ this.changeChildrenViewType(this.currentViewType.Key);
199
+ }
200
+ });
201
+ this.resize = fromEvent(window, 'resize')
202
+ .pipe(debounceTime(10))
203
+ .subscribe((event) => {
204
+ this.setViewCover(this.rows);
205
+ });
206
+ }
207
+ loadLastAdditionalApiName() {
208
+ const daa = sessionStorage.getItem(PepInternalPageComponent.CURRENT_ADDITIONAL_API_NAME);
209
+ if (daa && daa.length > 0) {
210
+ const additionalApiName = JSON.parse(daa);
211
+ this.currentAdditionalApiName = additionalApiName;
212
+ this.internalPageService.additionalApiName = additionalApiName === null || additionalApiName === void 0 ? void 0 : additionalApiName.Key;
213
+ }
214
+ }
215
+ ngOnDestroy() {
216
+ if (this.resize) {
217
+ this.resize.unsubscribe();
218
+ }
219
+ }
220
+ changeAdditionalApiName(additionalApiName) {
221
+ this.internalPageService.changeAdditionalApiName(additionalApiName ? additionalApiName.Key : '', (res) => {
222
+ // for (let index = 0; index < res.Rows.length; index++) {
223
+ for (const row of res.Rows) {
224
+ this.updateChanges(row);
225
+ }
226
+ this.changeDetectorRef.markForCheck();
227
+ });
228
+ sessionStorage.setItem(PepInternalPageComponent.CURRENT_ADDITIONAL_API_NAME, JSON.stringify(additionalApiName));
229
+ setTimeout(() => {
230
+ this.currentAdditionalApiName = additionalApiName;
231
+ }, 0);
232
+ }
233
+ setTotalsRow() {
234
+ this.totalsRow = [];
235
+ if (this.isMatrixView() || this.isFlatMatrixView()) {
236
+ let totalCol = 0;
237
+ const items = this.customList.items;
238
+ if (items) {
239
+ for (let col = 0; col < items[0].Fields.length; col++) {
240
+ const field = items[0].Fields[col];
241
+ if (field.FieldType === FIELD_TYPE.NumberIntegerForMatrix ||
242
+ field.FieldType ===
243
+ FIELD_TYPE.NumberIntegerQuantitySelector ||
244
+ field.FieldType === FIELD_TYPE.NumberRealForMatrix ||
245
+ field.FieldType ===
246
+ FIELD_TYPE.NumberRealQuantitySelector ||
247
+ field.FieldType === FIELD_TYPE.CalculatedInt ||
248
+ field.FieldType === FIELD_TYPE.NumberInteger ||
249
+ field.FieldType === FIELD_TYPE.CalculatedReal ||
250
+ field.FieldType === FIELD_TYPE.NumberReal) {
251
+ totalCol = 0;
252
+ for (const listItem of items) {
253
+ if (listItem.Fields[col] &&
254
+ listItem.Fields[col].Value) {
255
+ const num = parseFloat(listItem.Fields[col].Value);
256
+ totalCol += isNaN(num) ? 0 : num;
257
+ }
258
+ }
259
+ this.totalsRow.push(totalCol);
260
+ }
261
+ else {
262
+ this.totalsRow.push('');
263
+ }
264
+ }
265
+ }
266
+ }
267
+ }
268
+ updateChanges(elementToUpdate) {
269
+ this.customList.updateItem(elementToUpdate);
270
+ // Update memory data
271
+ for (let index = 0; index < this.childData.Rows.length; index++) {
272
+ if (this.childData.Rows[index].UID === elementToUpdate.UID) {
273
+ this.childData.Rows[index] = elementToUpdate;
274
+ }
275
+ }
276
+ }
277
+ setValueCallback(id, res) {
278
+ if (res.Rows.length === 1) {
279
+ const field = res.Rows[0].Fields.find((f) => f.ApiName === 'ObjectMenu');
280
+ if (field) {
281
+ // HACK : Until "Enabled" returns from the server, we set PepMenu to be
282
+ // Disabled in cart on regular items and not campign items.
283
+ field.Enabled = true;
284
+ }
285
+ this.updateChanges(res.Rows[0]);
286
+ }
287
+ this.setTotalsRow();
288
+ this.checkForChanges = new Date();
289
+ // DI-15985
290
+ this.internalFormFieldChange.emit(res);
291
+ this.changeDetectorRef.markForCheck();
292
+ }
293
+ onCustomizeObjectChanged(customizeObjectChangedData) {
294
+ this.internalPageService.childValueChanged(customizeObjectChangedData.id, customizeObjectChangedData.key, customizeObjectChangedData.value, (res) => {
295
+ this.setValueCallback(customizeObjectChangedData.id, res);
296
+ });
297
+ }
298
+ onCustomizeFieldClick(fieldClickEvent) {
299
+ let handledEvent = false;
300
+ // For the new custom form, the plus and minus events transform in the IPepFormFieldValueChangeEvent
301
+ if (fieldClickEvent.controlType === 'qs') {
302
+ if (fieldClickEvent.value === PepQuantitySelectorComponent.PLUS) {
303
+ handledEvent = true;
304
+ this.internalPageService.childPlusClick(fieldClickEvent.id, fieldClickEvent.key, (res) => {
305
+ this.setValueCallback(fieldClickEvent.id, res);
306
+ });
307
+ }
308
+ else if (fieldClickEvent.value === PepQuantitySelectorComponent.MINUS) {
309
+ handledEvent = true;
310
+ this.internalPageService.childMinusClick(fieldClickEvent.id, fieldClickEvent.key, (res) => {
311
+ this.setValueCallback(fieldClickEvent.id, res);
312
+ });
313
+ }
314
+ }
315
+ if (!handledEvent) {
316
+ this.internalFormFieldClick.emit(fieldClickEvent);
317
+ }
318
+ }
319
+ }
320
+ PepInternalPageComponent.CURRENT_ADDITIONAL_API_NAME = 'item_details_currentAdditionalApiName';
321
+ PepInternalPageComponent.decorators = [
322
+ { type: Component, args: [{
323
+ selector: 'pep-internal-page',
324
+ template: "<ng-template #matrixHeaderTemplate>\n <div class=\"matrix-title-container pep-border-bottom align-{{\n field.xAlignment\n }}\" title=\"{{ field.label }}\">\n <span class=\"block-with-text body-md\">{{ field.label }}</span>\n\n <div class=\"buttons-container pep-spacing-element-negative pull-right flip\">\n <ng-container *ngIf=\"\n currentViewType?.Key == 'OrderCenterMatrix' &&\n additionalApiNames &&\n additionalApiNames.length > 0\n \">\n <button class=\"pep-spacing-element pep-button icon-button sm weak\" mat-button [matMenuTriggerFor]=\"menu\"\n menu-blur>\n <span class=\"pull-left flip\" *ngIf=\"currentAdditionalApiName\">&nbsp;{{\n currentAdditionalApiName?.Value }}&nbsp;</span>\n\n <mat-icon [ngClass]=\"{'pull-left flip': currentAdditionalApiName}\">\n <pep-icon name=\"system_info\"></pep-icon>\n </mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item [ngClass]=\"{\n selected: currentAdditionalApiName === null\n }\" (click)=\"changeAdditionalApiName(null)\">\n <span>{{ \"LIST.NONE\" | translate }}</span>\n </button>\n <button mat-menu-item [ngClass]=\"{\n selected:\n currentAdditionalApiName?.Key ==\n additionalApiName?.Key\n }\" *ngFor=\"let additionalApiName of additionalApiNames\"\n (click)=\"changeAdditionalApiName(additionalApiName)\">\n <span>{{ additionalApiName.Value }}</span>\n </button>\n </mat-menu>\n </ng-container>\n <ng-container *ngIf=\"childViewTypes && childViewTypes.length > 1\">\n <button class=\"pep-spacing-element pep-button icon-button sm weak\" mat-button\n [matMenuTriggerFor]=\"viewsMenu\" menu-blur>\n <mat-icon>\n <pep-icon name=\"view_card_md\"></pep-icon>\n </mat-icon>\n </button>\n\n <mat-menu #viewsMenu=\"matMenu\" xPosition=\"before\">\n <button mat-menu-item [ngClass]=\"{\n selected: currentViewType?.Key == viewType?.Key\n }\" *ngFor=\"let viewType of childViewTypes\" (click)=\"changeChildrenViewType(viewType?.Key)\">\n <mat-icon [ngSwitch]=\"viewType?.Key\">\n <pep-icon *ngSwitchCase=\"'OrderCenterMatrix'\" name=\"view_matrix\"></pep-icon>\n <pep-icon *ngSwitchCase=\"'OrderCenterFlatMatrixGrid'\" name=\"view_table\"></pep-icon>\n <pep-icon *ngSwitchCase=\"'OrderCenterFlatMatrixLine'\" name=\"view_line\"></pep-icon>\n </mat-icon>\n <span>{{ viewType?.Value }}</span>\n </button>\n </mat-menu>\n </ng-container>\n </div>\n </div>\n\n</ng-template>\n\n<ng-template #matrixTemplate>\n <div #matrixContainer class=\"matrix-container\">\n <pep-internal-list (valueChange)=\"onCustomizeObjectChanged($event)\" [parentScroll]=\"matrixContainer\"\n (fieldClick)=\"onCustomizeFieldClick($event)\" [totalsRow]=\"totalsRow\"></pep-internal-list>\n </div>\n</ng-template>\n\n<div #mainViewCont id=\"mainViewCont\" [ngStyle]=\"{ 'max-width': viewWidth, 'max-height': viewHeight }\">\n <div #my1mm id=\"my1_mm\" style=\"height:1mm;width:1mm;visibility: hidden;\"></div>\n <ng-container *ngIf=\"coverChildTable && uiControl != null\">\n <div class=\"table-cover\"></div>\n <button (click)=\"showMatrixDialog()\" class=\"pep-button strong sm table-cover-button\"\n [ngClass]=\"{ 'lineview-btn': currentViewType?.Key == 'OrderCenterFlatMatrixLine'}\">\n {{ \"INTERNAL_PAGE.CLICK_TO_ORDER\" | translate }}\n </button>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"matrixHeaderTemplate\"></ng-container>\n <ng-container #orgCont></ng-container>\n</div>\n\n<ng-template #matrixDialogTemplate>\n\n <div mat-dialog-title>\n <ng-container *ngTemplateOutlet=\"matrixHeaderTemplate\"></ng-container>\n </div>\n\n <div mat-dialog-content>\n <ng-container #dialogCont></ng-container>\n </div>\n</ng-template>\n\n<!-- <div id=\"childGridModal\" bsModal (onShown)=\"onShown()\" (onHidden)=\"onHidden()\" #childModal=\"bs-modal\" class=\"modal\"\n tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"gridModalLabel\" aria-hidden=\"true\">\n <div class=\"modal-dialog\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-body matrix-dialog-body\">\n <ng-container #modalCont></ng-container>\n </div>\n </div>\n </div>\n</div> -->",
325
+ providers: [PepInternalPageService],
326
+ changeDetection: ChangeDetectionStrategy.OnPush,
327
+ styles: [":host{display:grid;width:inherit;height:inherit}.matrix-title-container{padding:0;height:2.5rem;height:var(--pep-form-field-height,2.5rem);display:flex;align-items:flex-end}.matrix-title-container .block-with-text{width:100%;max-height:inherit;font-weight:600;font-weight:var(--pep-font-weight-bold,600);display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.matrix-title-container .buttons-container{display:flex;align-self:center}.matrix-title-container .buttons-container .pep-button,.matrix-title-container .buttons-container .pepperi-button{width:-webkit-max-content;width:-moz-max-content;width:max-content}#mainViewCont{width:100%;height:inherit;overflow:hidden;padding:0 .25rem;padding:0 var(--pep-spacing-xs,.25rem)}#mainViewCont .table-cover{background-color:#fff;z-index:98;position:absolute;top:0;width:100%;height:inherit;opacity:.5}#mainViewCont .table-cover-button{position:absolute;left:50%;transform:translate(-50%,-50%);top:calc(50% + 2.5rem);top:calc(50% + var(--pep-form-field-height, 2.5rem));z-index:99}#mainViewCont .table-cover-button.lineview-btn{top:calc(2 * 2.5rem);top:calc(2 * var(--pep-form-field-height, 2.5rem));transform:translate(-50%)}#mainViewCont .underCover{max-height:inherit;overflow:hidden}#mainViewCont ::ng-deep.table-header{top:unset!important}"]
328
+ },] }
329
+ ];
330
+ PepInternalPageComponent.ctorParameters = () => [
331
+ { type: FormBuilder },
332
+ { type: PepDialogService },
333
+ { type: PepInternalPageService },
334
+ { type: PepCustomizationService },
335
+ { type: ElementRef },
336
+ { type: ChangeDetectorRef }
337
+ ];
338
+ PepInternalPageComponent.propDecorators = {
339
+ field: [{ type: Input }],
340
+ layoutType: [{ type: Input }],
341
+ internalFormFieldChange: [{ type: Output }],
342
+ internalFormFieldClick: [{ type: Output }],
343
+ my1mm: [{ type: ViewChild, args: ['my1mm',] }],
344
+ mainViewCont: [{ type: ViewChild, args: ['mainViewCont',] }],
345
+ orgCont: [{ type: ViewChild, args: ['orgCont', { read: ViewContainerRef },] }],
346
+ dialogCont: [{ type: ViewChild, args: ['dialogCont', { read: ViewContainerRef },] }],
347
+ matrixTemplate: [{ type: ViewChild, args: ['matrixTemplate',] }],
348
+ matrixDialogTemplate: [{ type: ViewChild, args: ['matrixDialogTemplate', { read: TemplateRef },] }],
349
+ customList: [{ type: ViewChild, args: [PepInternalListComponent,] }]
350
+ };
351
351
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtcGFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2Zvcm0vaW50ZXJuYWwtcGFnZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFHVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakUsT0FBTyxFQUlILHVCQUF1QixFQUd2QixVQUFVLEdBQ2IsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0gsd0JBQXdCLEdBRTNCLE1BQU0sMkJBQTJCLENBQUM7QUFLbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFTekYsTUFBTSxPQUFPLHdCQUF3QjtJQXVEakMsWUFDYyxFQUFlLEVBQ2pCLGFBQStCLEVBQy9CLG1CQUEyQyxFQUM1QyxvQkFBNkMsRUFDNUMsVUFBc0IsRUFDdEIsaUJBQW9DO1FBTGxDLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDakIsa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBd0I7UUFDNUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUF5QjtRQUM1QyxlQUFVLEdB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QUMsTUFBTTs7YUFDbEQ7OztZQS9CbUIsV0FBVztZQW9CdEIsZ0JBQWdCO1lBbkJoQixzQkFBc0I7WUFNM0IsdUJBQXVCO1lBYnZCLFVBQVU7WUFJVixpQkFBaUI7OztvQkF3Q2hCLEtBQUs7eUJBQ0wsS0FBSztzQ0FFTCxNQUFNO3FDQUVOLE1BQU07b0JBR04sU0FBUyxTQUFDLE9BQU87MkJBQ2pCLFNBQVMsU0FBQyxjQUFjO3NCQUV4QixTQUFTLFNBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO3lCQUMvQyxTQUFTLFNBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFOzZCQUVsRCxTQUFTLFNBQUMsZ0JBQWdCO21DQUMxQixTQUFTLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO3lCQUd2RCxTQUFTLFNBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFBlcEludGVybmFsUGFnZVNlcnZpY2UgfSBmcm9tICcuL2ludGVybmFsLXBhZ2Uuc2VydmljZSc7XG5cbmltcG9ydCB7XG4gICAgUGVwTGF5b3V0VHlwZSxcbiAgICBVSUNvbnRyb2wsXG4gICAgS2V5VmFsdWVQYWlyLFxuICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLFxuICAgIFVJQ29udHJvbEZpZWxkLFxuICAgIE9iamVjdHNEYXRhLFxuICAgIEZJRUxEX1RZUEUsXG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliJztcbmltcG9ydCB7XG4gICAgUGVwSW50ZXJuYWxMaXN0Q29tcG9uZW50LFxuICAgIFBlcExpc3RWaWV3VHlwZSxcbn0gZnJvbSAnLi9pbnRlcm5hbC1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIElQZXBGb3JtRmllbGRDbGlja0V2ZW50LFxuICAgIElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50LFxufSBmcm9tICcuL2Zvcm0ubW9kZWwnO1xuaW1wb3J0IHsgUGVwRGlhbG9nU2VydmljZSB9IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2RpYWxvZyc7XG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFBlcFF1YW50aXR5U2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9xdWFudGl0eS1zZWxlY3Rvcic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncGVwLWludGVybmFsLXBhZ2UnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbnRlcm5hbC1wYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnRlcm5hbC1wYWdlLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbUGVwSW50ZXJuYWxQYWdlU2VydmljZV0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFBlcEludGVybmFsUGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBzdGF0aWMgQ1VSUkVOVF9BRERJVElPTkFMX0FQSV9OQU1FID1cbiAgICAgICAgJ2l0ZW1fZGV0YWlsc19jdXJyZW50QWRkaXRpb25hbEFwaU5hbWUnO1xuXG4gICAgY29udHJvbFR5cGUgPSAnaW50ZXJuYWxQYWdlJztcblxuICAgIEBJbnB1dCgpIGZpZWxkOiBhbnk7XG4gICAgQElucHV0KCkgbGF5b3V0VHlwZTogUGVwTGF5b3V0VHlwZSA9ICdmb3JtJztcblxuICAgIEBPdXRwdXQoKVxuICAgIGludGVybmFsRm9ybUZpZWxkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKVxuICAgIGludGVybmFsRm9ybUZpZWxkQ2xpY2s6IEV2ZW50RW1pdHRlcjxJUGVwRm9ybUZpZWxkQ2xpY2tFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRDbGlja0V2ZW50PigpO1xuXG4gICAgQFZpZXdDaGlsZCgnbXkxbW0nKSBteTFtbTogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdtYWluVmlld0NvbnQnKSBtYWluVmlld0NvbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdvcmdDb250JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIG9yZ0NvbnQ6IFZpZXdDb250YWluZXJSZWY7XG4gICAgQFZpZXdDaGlsZCgnZGlhbG9nQ29udCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICAgIGRpYWxvZ0NvbnQ6IFZpZXdDb250YWluZXJSZWY7XG4gICAgQFZpZXdDaGlsZCgnbWF0cml4VGVtcGxhdGUnKSBtYXRyaXhUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBAVmlld0NoaWxkKCdtYXRyaXhEaWFsb2dUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBtYXRyaXhEaWFsb2dUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoUGVwSW50ZXJuYWxMaXN0Q29tcG9uZW50KVxuICAgIGN1c3RvbUxpc3Q6IFBlcEludGVybmFsTGlzdENvbXBvbmVudDtcblxuICAgIHJlc2l6ZTogYW55O1xuICAgIGNoZWNrRm9yQ2hhbmdlczogYW55ID0gbnVsbDtcblxuICAgIGNoaWxkRGF0YTogYW55ID0gbnVsbDtcblxuICAgIGVtcHR5Rm9ybTogRm9ybUdyb3VwO1xuICAgIHVpQ29udHJvbDogVUlDb250cm9sO1xuICAgIHJvd3M6IGFueTtcbiAgICBsaW5lVmlld1Jvd3M6IGFueTtcbiAgICB0b3RhbHNSb3c6IGFueSA9IFtdO1xuICAgIGFkZGl0aW9uYWxBcGlOYW1lczogYW55ID0gbnVsbDtcbiAgICBjdXJyZW50QWRkaXRpb25hbEFwaU5hbWU6IGFueSA9IG51bGw7XG4gICAgZm9jdXNlZFFTID0gZmFsc2U7XG4gICAgZmllbGRJZFdpdGhGb2N1cyA9ICcnO1xuICAgIGNvbHVtbldpZHRoID0gMTAwO1xuICAgIGNvdmVyQ2hpbGRUYWJsZSA9IGZhbHNlO1xuICAgIGNoaWxkVmlld1R5cGVzOiBBcnJheTxLZXlWYWx1ZVBhaXI8c3RyaW5nPj47XG4gICAgY3VycmVudFZpZXdUeXBlOiBLZXlWYWx1ZVBhaXI8c3RyaW5nPiA9IG51bGw7XG4gICAgY3VycmVudFZpZXdUeXBlVGl0bGU6IHN0cmluZztcbiAgICBzdW1PZk1pbkNvbFdpZHRoID0gMDtcbiAgICB0b3RhbFJvd3NXaWR0aCA9IDA7XG4gICAgdmlld1dpZHRoID0gJzEwMCUnO1xuICAgIHZpZXdIZWlnaHQgPSAnYXV0byc7XG4gICAgZGlzcGxheVFTYnRucyA9IHRydWU7XG4gICAgc2VsZWN0ZWRBcGlOYW1lID0gJyc7XG4gICAgc2hvd1NvcnQgPSBmYWxzZTtcbiAgICBkZWZhdWx0Um93U3BhbiA9IC0xO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogUGVwRGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBpbnRlcm5hbFBhZ2VTZXJ2aWNlOiBQZXBJbnRlcm5hbFBhZ2VTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY3VzdG9taXphdGlvblNlcnZpY2U6IFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICAgKSB7IH1cblxuICAgIHByaXZhdGUgZmlsbERhdGEoaXNJbkRpYWxvZyA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLm1hdHJpeFRlbXBsYXRlLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcblxuICAgICAgICB0aGlzLmN1c3RvbUxpc3Q/LmNsZWFyKCk7XG4gICAgICAgIHRoaXMub3JnQ29udD8uY2xlYXIoKTtcblxuICAgICAgICBpZiAoaXNJbkRpYWxvZykge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dDb250Py5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dDb250Py5pbnNlcnQodmlldyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9yZ0NvbnQ/Lmluc2VydCh2aWV3KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgdmlld1R5cGU6IFBlcExpc3RWaWV3VHlwZSA9IHRoaXMuaXNUYWJsZVZpZXcoKVxuICAgICAgICAgICAgICAgID8gJ3RhYmxlJ1xuICAgICAgICAgICAgICAgIDogJ2xpbmVzJztcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tTGlzdC5pbml0TGlzdERhdGEoXG4gICAgICAgICAgICAgICAgdGhpcy51aUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZERhdGEuVG90YWxSb3dzLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGREYXRhLlJvd3MsXG4gICAgICAgICAgICAgICAgdmlld1R5cGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnNldFRvdGFsc1JvdygpO1xuXG4gICAgICAgICAgICAvLyBpZiAoIXRoaXMuY2hpbGRNb2RhbC5pc1Nob3duKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbkNvdW50ID0gdGhpcy5jaGlsZERhdGEuUm93c1xuICAgICAgICAgICAgICAgID8gdGhpcy5jaGlsZERhdGEuUm93cy5sZW5ndGhcbiAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICBjb25zdCBpc0V2ZW4gPSBjaGlsZHJlbkNvdW50ICUgMiA9PT0gMDtcbiAgICAgICAgICAgIC8vIDMgZm9yIG1hdHJpeCAmIGZsYXQgbWF0cml4IGJlY2F1c2UgdGhlIGhlYWRlciArIHRvdGFsIGlzIDIgbW9yZSByb3dzLlxuICAgICAgICAgICAgY29uc3Qgcm93c1RvQWRkID1cbiAgICAgICAgICAgICAgICB0aGlzLmlzTWF0cml4VmlldygpIHx8IHRoaXMuaXNGbGF0TWF0cml4VmlldygpXG4gICAgICAgICAgICAgICAgICAgID8gaXNFdmVuXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDNcbiAgICAgICAgICAgICAgICAgICAgICAgIDogNFxuICAgICAgICAgICAgICAgICAgICA6IDE7XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1Sb3dIZWlnaHQgPVxuICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2UuY2FsY3VsYXRlRm9ybUZpZWxkSGVpZ2h0KCkgKiAxNjsgLy8gY29udmVydCByZW0gdG8gcGl4ZWxcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IG9ubHkgaWYgbm90IHNldCB5ZXQuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0Um93U3BhbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRSb3dTcGFuID0gdGhpcy5maWVsZC5yb3dTcGFuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN1bU9mTWluQ29sV2lkdGggPSAwO1xuICAgICAgICAgICAgdGhpcy50b3RhbFJvd3NXaWR0aCA9IDA7XG5cbiAgICAgICAgICAgIHRoaXMuY2hpbGREYXRhLlVJQ29udHJvbC5Db250cm9sRmllbGRzLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKHVpQ29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsUm93c1dpZHRoICs9IHVpQ29udHJvbEZpZWxkLkNvbHVtbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5taW5GaWVsZFdpZHRoID0gdGhpcy5tbVRvUHgoMTIpOyAvLyBORUVEIFRPIEdFVCBUSElTIFBBUkFNIEZST00gQ1VTVE9NSVpBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdW1PZk1pbkNvbFdpZHRoICs9IDEyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Vmlld0NvdmVyKHRoaXMuY2hpbGREYXRhLlJvd3MpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jb3ZlckNoaWxkVGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkLnJvd1NwYW4gPSB0aGlzLmRlZmF1bHRSb3dTcGFuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgbGluZSB2aWV3IEFkZCB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lIChmb3JtIGhlaWdodCkuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXdUeXBlLktleSA9PT0gJ09yZGVyQ2VudGVyRmxhdE1hdHJpeExpbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJvdyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy51aUNvbnRyb2wuQ29udHJvbEZpZWxkcy5tYXAoKGYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5MYXlvdXQuWSArIGYuTGF5b3V0LkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gKiAxNiBjb252ZXJ0IHJlbSB0byBwaXhlbFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXJkUm93c0hlaWdodCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmNhbGN1bGF0ZUNhcmRSb3dzSGVpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgKSAqIDE2O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIG1heFJvdyAqIDI0ICsgNjAgLSAyNCBmb3IgZWFjaCByb3cgaW4gY2FyZCArIDYwIGZvciB0aGUgcGFkZGluZyBvZiBlYWNoIGNhcmQuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJvd1NwYW5Ub0FkZCA9IE1hdGguZmxvb3IoY2hpbGRyZW5Db3VudCAqICgoY2FyZFJvd3NIZWlnaHQgKyA1NikgLyBmb3JtUm93SGVpZ2h0KSArIHJvd3NUb0FkZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vICsgMTYgaXMgdGhlIDFyZW0gbWFyZ2luIG91dHNpZGUgY2FyZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93U3BhblRvQWRkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGlsZHJlbkNvdW50ICogKGNhcmRSb3dzSGVpZ2h0ICsgMTYpKSAvXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUm93SGVpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3NUb0FkZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZC5yb3dTcGFuID0gcm93U3BhblRvQWRkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHRhYmxlUm93c0hlaWdodCA9IHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2UuY2FsY3VsYXRlVGFibGVSb3dzSGVpZ2h0KGNoaWxkcmVuQ291bnQpICogMTY7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZmllbGQucm93U3BhbiA9IE1hdGguY2VpbCgodGFibGVSb3dzSGVpZ2h0ICsgKHJvd3NUb0FkZCAqIDQwKSkgLyBmb3JtUm93SGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gKiAxNiBjb252ZXJ0IHJlbSB0byBwaXhlbFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dzVG9BZGRIZWlnaHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXN0b21pemF0aW9uU2VydmljZS5jYWxjdWxhdGVUYWJsZVJvd3NIZWlnaHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93c1RvQWRkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICApICogMTY7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlUm93c0hlaWdodCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmNhbGN1bGF0ZVRhYmxlUm93c0hlaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbkNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICApICogMTY7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGQucm93U3BhbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAocm93c1RvQWRkSGVpZ2h0ICsgdGFibGVSb3dzSGVpZ2h0KSAvIGZvcm1Sb3dIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcblxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsbENoaWxkRGF0YShyZXM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoaWxkRGF0YSA9IHJlcztcbiAgICAgICAgdGhpcy51aUNvbnRyb2wgPSByZXMuVUlDb250cm9sO1xuICAgICAgICB0aGlzLmFkZGl0aW9uYWxBcGlOYW1lcyA9IHJlcy5BZGRpdGlvbmFsQXBpTmFtZXM7XG5cbiAgICAgICAgdGhpcy5maWxsRGF0YSgpO1xuICAgIH1cblxuICAgIG1tVG9QeChtbSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMubXkxbW0ubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKG1tICogaGVpZ2h0KTsgLy8gcmV0dXJucyBzaXplcyBpbiBQWFxuICAgIH1cblxuICAgIHByaXZhdGUgaXNNYXRyaXhWaWV3KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Vmlld1R5cGUgJiZcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdUeXBlLktleSA9PT0gJ09yZGVyQ2VudGVyTWF0cml4J1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNGbGF0TWF0cml4VmlldygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdUeXBlICYmXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3VHlwZS5LZXkgPT09ICdPcmRlckNlbnRlckZsYXRNYXRyaXhHcmlkJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzVGFibGVWaWV3KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc01hdHJpeFZpZXcoKSB8fCB0aGlzLmlzRmxhdE1hdHJpeFZpZXcoKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VDaGlsZHJlblZpZXdUeXBlKHZpZXdUeXBlS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb3dzID0gW107XG4gICAgICAgIHRoaXMudWlDb250cm9sID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IHZ0IG9mIHRoaXMuY2hpbGRWaWV3VHlwZXMpIHtcbiAgICAgICAgICAgIGlmICh2dC5LZXkgPT09IHZpZXdUeXBlS2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Vmlld1R5cGUgPSB2dDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudFZpZXdUeXBlVGl0bGUgPSB0aGlzLmN1cnJlbnRWaWV3VHlwZS5WYWx1ZTtcblxuICAgICAgICB0aGlzLmludGVybmFsUGFnZVNlcnZpY2UuY2hhbmdlQ2hpbGRyZW5WaWV3VHlwZShcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdUeXBlLktleSxcbiAgICAgICAgICAgIChyZXM6IE9iamVjdHNEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5Sb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsbENoaWxkRGF0YShyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXRWaWV3Q292ZXIocm93cyk6IHZvaWQge1xuICAgICAgICBpZiAoIXJvd3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdHJpeENvbnQgPSB0aGlzLm1haW5WaWV3Q29udC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCB2aWV3V2lkdGggPSBtYXRyaXhDb250LmNsaWVudFdpZHRoO1xuXG4gICAgICAgIHRoaXMudmlld1dpZHRoID0gdmlld1dpZHRoID8gdmlld1dpZHRoLnRvU3RyaW5nKCkgOiAnMTAwJSc7XG5cbiAgICAgICAgLy8gaWYgdGhlIG1hdHJpeCBsb2NhdGVkIG9uIHRoZSBib3R0b20gLyB0aGVyZSBpcyBub3RoaW5nIHVuZGVyIHRoZSBtYXRyaXggd2UgZG9udCBuZWVkIHRvIGNoZWNrIHRoZSBoZWlnaHRcbiAgICAgICAgaWYgKHBhcnNlSW50KHZpZXdXaWR0aCwgMTApIDwgdGhpcy5tbVRvUHgodGhpcy5zdW1PZk1pbkNvbFdpZHRoKSkge1xuICAgICAgICAgICAgdGhpcy5jb3ZlckNoaWxkVGFibGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb3ZlckNoaWxkVGFibGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgc2hvd01hdHJpeERpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5kaWFsb2dTZXJ2aWNlLmdldERpYWxvZ0NvbmZpZyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdsYXJnZSdcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkRpYWxvZyhcbiAgICAgICAgICAgIHRoaXMubWF0cml4RGlhbG9nVGVtcGxhdGUsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICApO1xuXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlck9wZW5lZCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbGxEYXRhKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbGxEYXRhKGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIGxldCBmaWVsZCA9IHRoaXMuZmllbGQgYXMgUGVwSW50ZXJuYWxQYWdlRmllbGQ7XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbFBhZ2VTZXJ2aWNlLmluaXREZXRhaWxzKFxuICAgICAgICAgICAgdGhpcy5maWVsZC5vYmplY3RJZCxcbiAgICAgICAgICAgIHRoaXMuZmllbGQucGFyZW50SWQsXG4gICAgICAgICAgICB0aGlzLmZpZWxkLnNlYXJjaENvZGUsXG4gICAgICAgICAgICAocmVzVmlld1R5cGVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBteSBjb2RlIERJLTcxMzRcbiAgICAgICAgICAgICAgICByZXNWaWV3VHlwZXMuUm93cyA9IHJlc1ZpZXdUeXBlcy5Sb3dzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uS2V5ICE9PSAnT3JkZXJDZW50ZXJWaWV3MSdcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc1ZpZXdUeXBlcy5Sb3dzICYmIHJlc1ZpZXdUeXBlcy5Sb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNWaWV3VHlwZXMuRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzVmlld1R5cGVzLkRlZmF1bHQgPSByZXNWaWV3VHlwZXMuUm93c1swXS5LZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZFZpZXdUeXBlcyA9IHJlc1ZpZXdUeXBlcy5Sb3dzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3VHlwZSA9IHJlc1ZpZXdUeXBlcy5Sb3dzWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzVmlld1R5cGVzLlJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2aWV3VHlwZVJvdyBvZiByZXNWaWV3VHlwZXMuUm93cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdUeXBlUm93LlZhbHVlID09PSByZXNWaWV3VHlwZXMuRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdUeXBlID0gdmlld1R5cGVSb3c7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRMYXN0QWRkaXRpb25hbEFwaU5hbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDaGlsZHJlblZpZXdUeXBlKHRoaXMuY3VycmVudFZpZXdUeXBlLktleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucmVzaXplID0gZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTApKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpZXdDb3Zlcih0aGlzLnJvd3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZExhc3RBZGRpdGlvbmFsQXBpTmFtZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGFhID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcbiAgICAgICAgICAgIFBlcEludGVybmFsUGFnZUNvbXBvbmVudC5DVVJSRU5UX0FERElUSU9OQUxfQVBJX05BTUVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRhYSAmJiBkYWEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbEFwaU5hbWUgPSBKU09OLnBhcnNlKGRhYSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBZGRpdGlvbmFsQXBpTmFtZSA9IGFkZGl0aW9uYWxBcGlOYW1lO1xuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFBhZ2VTZXJ2aWNlLmFkZGl0aW9uYWxBcGlOYW1lID0gYWRkaXRpb25hbEFwaU5hbWU/LktleTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZXNpemUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGFuZ2VBZGRpdGlvbmFsQXBpTmFtZShhZGRpdGlvbmFsQXBpTmFtZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmludGVybmFsUGFnZVNlcnZpY2UuY2hhbmdlQWRkaXRpb25hbEFwaU5hbWUoXG4gICAgICAgICAgICBhZGRpdGlvbmFsQXBpTmFtZSA/IGFkZGl0aW9uYWxBcGlOYW1lLktleSA6ICcnLFxuICAgICAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJlcy5Sb3dzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJlcy5Sb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hhbmdlcyhyb3cpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgIFBlcEludGVybmFsUGFnZUNvbXBvbmVudC5DVVJSRU5UX0FERElUSU9OQUxfQVBJX05BTUUsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShhZGRpdGlvbmFsQXBpTmFtZSlcbiAgICAgICAgKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEFkZGl0aW9uYWxBcGlOYW1lID0gYWRkaXRpb25hbEFwaU5hbWU7XG4gICAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIHNldFRvdGFsc1JvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b3RhbHNSb3cgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5pc01hdHJpeFZpZXcoKSB8fCB0aGlzLmlzRmxhdE1hdHJpeFZpZXcoKSkge1xuICAgICAgICAgICAgbGV0IHRvdGFsQ29sID0gMDtcblxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmN1c3RvbUxpc3QuaXRlbXM7XG4gICAgICAgICAgICBpZiAoaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBpdGVtc1swXS5GaWVsZHMubGVuZ3RoOyBjb2wrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGl0ZW1zWzBdLkZpZWxkc1tjb2xdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlckZvck1hdHJpeCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgRklFTERfVFlQRS5OdW1iZXJJbnRlZ2VyUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlclJlYWxGb3JNYXRyaXggfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLkZpZWxkVHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX1RZUEUuTnVtYmVyUmVhbFF1YW50aXR5U2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5DYWxjdWxhdGVkSW50IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLkNhbGN1bGF0ZWRSZWFsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ29sID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdEl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLkZpZWxkc1tjb2xdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLkZpZWxkc1tjb2xdLlZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbS5GaWVsZHNbY29sXS5WYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENvbCArPSBpc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsc1Jvdy5wdXNoKHRvdGFsQ29sKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxzUm93LnB1c2goJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQ2hhbmdlcyhlbGVtZW50VG9VcGRhdGU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1c3RvbUxpc3QudXBkYXRlSXRlbShlbGVtZW50VG9VcGRhdGUpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBtZW1vcnkgZGF0YVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jaGlsZERhdGEuUm93cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkRGF0YS5Sb3dzW2luZGV4XS5VSUQgPT09IGVsZW1lbnRUb1VwZGF0ZS5VSUQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkRGF0YS5Sb3dzW2luZGV4XSA9IGVsZW1lbnRUb1VwZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFZhbHVlQ2FsbGJhY2soaWQ6IGFueSwgcmVzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHJlcy5Sb3dzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSByZXMuUm93c1swXS5GaWVsZHMuZmluZCgoZikgPT4gZi5BcGlOYW1lID09PSAnT2JqZWN0TWVudScpO1xuICAgICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgLy8gSEFDSyA6IFVudGlsIFwiRW5hYmxlZFwiIHJldHVybnMgZnJvbSB0aGUgc2VydmVyLCB3ZSBzZXQgUGVwTWVudSB0byBiZVxuICAgICAgICAgICAgICAgIC8vICAgICAgICBEaXNhYmxlZCBpbiBjYXJ0IG9uIHJlZ3VsYXIgaXRlbXMgYW5kIG5vdCBjYW1waWduIGl0ZW1zLlxuICAgICAgICAgICAgICAgIGZpZWxkLkVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoYW5nZXMocmVzLlJvd3NbMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRUb3RhbHNSb3coKTtcbiAgICAgICAgdGhpcy5jaGVja0ZvckNoYW5nZXMgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIC8vIERJLTE1OTg1XG4gICAgICAgIHRoaXMuaW50ZXJuYWxGb3JtRmllbGRDaGFuZ2UuZW1pdChyZXMpO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgb25DdXN0b21pemVPYmplY3RDaGFuZ2VkKFxuICAgICAgICBjdXN0b21pemVPYmplY3RDaGFuZ2VkRGF0YTogSVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnRcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFBhZ2VTZXJ2aWNlLmNoaWxkVmFsdWVDaGFuZ2VkKFxuICAgICAgICAgICAgY3VzdG9taXplT2JqZWN0Q2hhbmdlZERhdGEuaWQsXG4gICAgICAgICAgICBjdXN0b21pemVPYmplY3RDaGFuZ2VkRGF0YS5rZXksXG4gICAgICAgICAgICBjdXN0b21pemVPYmplY3RDaGFuZ2VkRGF0YS52YWx1ZSxcbiAgICAgICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVDYWxsYmFjayhjdXN0b21pemVPYmplY3RDaGFuZ2VkRGF0YS5pZCwgcmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkN1c3RvbWl6ZUZpZWxkQ2xpY2soZmllbGRDbGlja0V2ZW50OiBJUGVwRm9ybUZpZWxkQ2xpY2tFdmVudCk6IHZvaWQge1xuICAgICAgICBsZXQgaGFuZGxlZEV2ZW50ID0gZmFsc2U7XG5cbiAgICAgICAgLy8gRm9yIHRoZSBuZXcgY3VzdG9tIGZvcm0sIHRoZSBwbHVzIGFuZCBtaW51cyBldmVudHMgdHJhbnNmb3JtIGluIHRoZSBJUGVwRm9ybUZpZWxkVmFsdWVDaGFuZ2VFdmVudFxuICAgICAgICBpZiAoZmllbGRDbGlja0V2ZW50LmNvbnRyb2xUeXBlID09PSAncXMnKSB7XG4gICAgICAgICAgICBpZiAoZmllbGRDbGlja0V2ZW50LnZhbHVlID09PSBQZXBRdWFudGl0eVNlbGVjdG9yQ29tcG9uZW50LlBMVVMpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxQYWdlU2VydmljZS5jaGlsZFBsdXNDbGljayhcbiAgICAgICAgICAgICAgICAgICAgZmllbGRDbGlja0V2ZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZENsaWNrRXZlbnQua2V5LFxuICAgICAgICAgICAgICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVDYWxsYmFjayhmaWVsZENsaWNrRXZlbnQuaWQsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBmaWVsZENsaWNrRXZlbnQudmFsdWUgPT09IFBlcFF1YW50aXR5U2VsZWN0b3JDb21wb25lbnQuTUlOVVNcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGhhbmRsZWRFdmVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFBhZ2VTZXJ2aWNlLmNoaWxkTWludXNDbGljayhcbiAgICAgICAgICAgICAgICAgICAgZmllbGRDbGlja0V2ZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZENsaWNrRXZlbnQua2V5LFxuICAgICAgICAgICAgICAgICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVDYWxsYmFjayhmaWVsZENsaWNrRXZlbnQuaWQsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYW5kbGVkRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxGb3JtRmllbGRDbGljay5lbWl0KGZpZWxkQ2xpY2tFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=