@pepperi-addons/ngx-lib 0.3.15-loader.9 → 0.4.0-angular14.11

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 (1370) hide show
  1. package/address/address.component.d.ts +30 -27
  2. package/address/address.module.d.ts +15 -2
  3. package/address/index.d.ts +5 -0
  4. package/address/public-api.d.ts +2 -2
  5. package/attachment/attachment.component.d.ts +85 -82
  6. package/attachment/attachment.module.d.ts +14 -2
  7. package/attachment/index.d.ts +5 -0
  8. package/attachment/public-api.d.ts +2 -2
  9. package/bread-crumbs/bread-crumbs.component.d.ts +27 -23
  10. package/bread-crumbs/bread-crumbs.model.d.ts +11 -11
  11. package/bread-crumbs/bread-crumbs.module.d.ts +15 -5
  12. package/bread-crumbs/index.d.ts +5 -0
  13. package/bread-crumbs/public-api.d.ts +3 -3
  14. package/button/button.component.d.ts +102 -99
  15. package/button/button.model.d.ts +14 -14
  16. package/button/button.module.d.ts +13 -2
  17. package/button/index.d.ts +5 -0
  18. package/button/public-api.d.ts +3 -3
  19. package/carousel/carousel-item.directive.d.ts +12 -9
  20. package/carousel/carousel.component.d.ts +148 -145
  21. package/carousel/carousel.module.d.ts +8 -2
  22. package/carousel/index.d.ts +5 -0
  23. package/carousel/public-api.d.ts +3 -3
  24. package/checkbox/checkbox.component.d.ts +50 -47
  25. package/checkbox/checkbox.module.d.ts +19 -5
  26. package/checkbox/index.d.ts +5 -0
  27. package/checkbox/public-api.d.ts +2 -2
  28. package/color/color-picker.component.d.ts +57 -54
  29. package/color/color.component.d.ts +30 -27
  30. package/color/color.model.d.ts +1 -1
  31. package/color/color.module.d.ts +26 -5
  32. package/color/index.d.ts +5 -0
  33. package/color/public-api.d.ts +3 -3
  34. package/core/clipboard/clipboard.directive.d.ts +5 -2
  35. package/core/clipboard/clipboard.service.d.ts +5 -2
  36. package/core/clipboard/index.d.ts +1 -1
  37. package/core/clipboard/public-api.d.ts +2 -2
  38. package/core/common/directives/auto-width.directive.d.ts +19 -16
  39. package/core/common/directives/button-blur.directive.d.ts +9 -6
  40. package/core/common/directives/button-loader.directive.d.ts +26 -23
  41. package/core/common/directives/data-qa.directive.d.ts +11 -8
  42. package/core/common/directives/index.d.ts +1 -1
  43. package/core/common/directives/menu-blur.directive.d.ts +10 -7
  44. package/core/common/directives/prevent-multi-click.directive.d.ts +7 -4
  45. package/core/common/directives/print.directive.d.ts +75 -72
  46. package/core/common/directives/public-api.d.ts +7 -7
  47. package/core/common/index.d.ts +1 -1
  48. package/core/common/model/index.d.ts +1 -1
  49. package/core/common/model/papi.model.d.ts +2 -2
  50. package/core/common/model/public-api.d.ts +3 -3
  51. package/core/common/model/utilities.model.d.ts +5 -5
  52. package/core/common/model/wapi.model.d.ts +200 -200
  53. package/core/common/pipes/common-pipes.d.ts +57 -36
  54. package/core/common/pipes/date-ago.pipe.d.ts +11 -8
  55. package/core/common/pipes/index.d.ts +1 -1
  56. package/core/common/pipes/public-api.d.ts +2 -2
  57. package/core/common/public-api.d.ts +4 -4
  58. package/core/common/services/addon.service.d.ts +41 -38
  59. package/core/common/services/color.service.d.ts +51 -48
  60. package/core/common/services/cookie.service.d.ts +53 -50
  61. package/core/common/services/data-convertor.service.d.ts +44 -41
  62. package/core/common/services/file.service.d.ts +27 -24
  63. package/core/common/services/index.d.ts +1 -1
  64. package/core/common/services/jwt-helper.service.d.ts +13 -10
  65. package/core/common/services/public-api.d.ts +11 -11
  66. package/core/common/services/session.service.d.ts +18 -15
  67. package/core/common/services/translate.service.d.ts +12 -9
  68. package/core/common/services/utilities.service.d.ts +36 -33
  69. package/core/common/services/validator.service.d.ts +31 -28
  70. package/core/common/services/window-scrolling.service.d.ts +10 -7
  71. package/core/customization/customization.model.d.ts +264 -264
  72. package/core/customization/customization.service.d.ts +159 -156
  73. package/core/customization/index.d.ts +1 -1
  74. package/core/customization/public-api.d.ts +2 -2
  75. package/core/http/index.d.ts +1 -1
  76. package/core/http/interceptors/error.interceptor.d.ts +8 -5
  77. package/core/http/interceptors/index.d.ts +11 -11
  78. package/core/http/interceptors/loader.interceptor.d.ts +11 -8
  79. package/core/http/interceptors/profiler.interceptor.d.ts +8 -5
  80. package/core/http/public-api.d.ts +2 -2
  81. package/core/http/services/http.service.d.ts +28 -25
  82. package/core/http/services/loader.service.d.ts +13 -10
  83. package/core/index.d.ts +1 -1
  84. package/core/layout/index.d.ts +1 -1
  85. package/core/layout/layout.service.d.ts +36 -33
  86. package/core/layout/public-api.d.ts +2 -2
  87. package/core/layout/rtl.directive.d.ts +21 -16
  88. package/core/portal/attach.directive.d.ts +13 -10
  89. package/core/portal/index.d.ts +1 -1
  90. package/core/portal/portal.service.d.ts +12 -9
  91. package/core/portal/public-api.d.ts +3 -3
  92. package/core/portal/target.directive.d.ts +12 -9
  93. package/core/public-api.d.ts +7 -7
  94. package/core/scroll-to/index.d.ts +1 -1
  95. package/core/scroll-to/public-api.d.ts +1 -1
  96. package/core/scroll-to/scroll-to.service.d.ts +11 -8
  97. package/date/date.component.d.ts +69 -66
  98. package/date/date.model.d.ts +31 -26
  99. package/date/date.module.d.ts +23 -5
  100. package/date/index.d.ts +5 -0
  101. package/date/public-api.d.ts +2 -2
  102. package/dialog/default-dialog.component.d.ts +12 -9
  103. package/dialog/dialog.component.d.ts +13 -10
  104. package/dialog/dialog.model.d.ts +31 -31
  105. package/dialog/dialog.module.d.ts +18 -5
  106. package/dialog/dialog.service.d.ts +27 -24
  107. package/dialog/index.d.ts +5 -0
  108. package/dialog/public-api.d.ts +4 -4
  109. package/draggable-items/draggable-item/draggable-item.component.d.ts +11 -8
  110. package/draggable-items/draggable-items.component.d.ts +36 -33
  111. package/draggable-items/draggable-items.model.d.ts +11 -11
  112. package/draggable-items/draggable-items.module.d.ts +18 -5
  113. package/draggable-items/index.d.ts +5 -0
  114. package/draggable-items/public-api.d.ts +4 -4
  115. package/esm2020/address/address.component.mjs +109 -0
  116. package/esm2020/address/address.module.mjs +54 -0
  117. package/esm2020/address/pepperi-addons-ngx-lib-address.mjs +5 -0
  118. package/esm2020/address/public-api.mjs +6 -0
  119. package/esm2020/attachment/attachment.component.mjs +220 -0
  120. package/esm2020/attachment/attachment.module.mjs +50 -0
  121. package/esm2020/attachment/pepperi-addons-ngx-lib-attachment.mjs +5 -0
  122. package/esm2020/attachment/public-api.mjs +6 -0
  123. package/esm2020/bread-crumbs/bread-crumbs.component.mjs +85 -0
  124. package/esm2020/bread-crumbs/bread-crumbs.model.mjs +7 -0
  125. package/esm2020/bread-crumbs/bread-crumbs.module.mjs +50 -0
  126. package/esm2020/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.mjs +5 -0
  127. package/esm2020/bread-crumbs/public-api.mjs +7 -0
  128. package/esm2020/button/button.component.mjs +138 -0
  129. package/esm2020/button/button.model.mjs +6 -0
  130. package/esm2020/button/button.module.mjs +46 -0
  131. package/esm2020/button/pepperi-addons-ngx-lib-button.mjs +5 -0
  132. package/esm2020/button/public-api.mjs +7 -0
  133. package/esm2020/carousel/carousel-item.directive.mjs +33 -0
  134. package/esm2020/carousel/carousel.component.mjs +745 -0
  135. package/esm2020/carousel/carousel.module.mjs +17 -0
  136. package/esm2020/carousel/pepperi-addons-ngx-lib-carousel.mjs +5 -0
  137. package/esm2020/carousel/public-api.mjs +8 -0
  138. package/esm2020/checkbox/checkbox.component.mjs +168 -0
  139. package/esm2020/checkbox/checkbox.module.mjs +63 -0
  140. package/esm2020/checkbox/pepperi-addons-ngx-lib-checkbox.mjs +5 -0
  141. package/esm2020/checkbox/public-api.mjs +6 -0
  142. package/esm2020/color/color-picker.component.mjs +224 -0
  143. package/esm2020/color/color.component.mjs +90 -0
  144. package/esm2020/color/color.model.mjs +2 -0
  145. package/esm2020/color/color.module.mjs +93 -0
  146. package/esm2020/color/pepperi-addons-ngx-lib-color.mjs +5 -0
  147. package/esm2020/color/public-api.mjs +7 -0
  148. package/esm2020/core/clipboard/clipboard.directive.mjs +24 -0
  149. package/esm2020/core/clipboard/clipboard.service.mjs +14 -0
  150. package/esm2020/core/clipboard/index.mjs +5 -0
  151. package/esm2020/core/clipboard/public-api.mjs +6 -0
  152. package/esm2020/core/common/directives/auto-width.directive.mjs +77 -0
  153. package/esm2020/core/common/directives/button-blur.directive.mjs +24 -0
  154. package/esm2020/core/common/directives/button-loader.directive.mjs +112 -0
  155. package/esm2020/core/common/directives/data-qa.directive.mjs +23 -0
  156. package/esm2020/core/common/directives/index.mjs +5 -0
  157. package/esm2020/core/common/directives/menu-blur.directive.mjs +32 -0
  158. package/esm2020/core/common/directives/prevent-multi-click.directive.mjs +27 -0
  159. package/esm2020/core/common/directives/print.directive.mjs +170 -0
  160. package/esm2020/core/common/directives/public-api.mjs +12 -0
  161. package/esm2020/core/common/index.mjs +5 -0
  162. package/esm2020/core/common/model/index.mjs +5 -0
  163. package/esm2020/core/common/model/papi.model.mjs +3 -0
  164. package/esm2020/core/common/model/public-api.mjs +7 -0
  165. package/esm2020/core/common/model/utilities.model.mjs +57 -0
  166. package/esm2020/core/common/model/wapi.model.mjs +156 -0
  167. package/esm2020/core/common/pipes/common-pipes.mjs +167 -0
  168. package/esm2020/core/common/pipes/date-ago.pipe.mjs +46 -0
  169. package/esm2020/core/common/pipes/index.mjs +5 -0
  170. package/esm2020/core/common/pipes/public-api.mjs +6 -0
  171. package/esm2020/core/common/public-api.mjs +8 -0
  172. package/esm2020/core/common/services/addon.service.mjs +148 -0
  173. package/esm2020/core/common/services/color.service.mjs +359 -0
  174. package/esm2020/core/common/services/cookie.service.mjs +153 -0
  175. package/esm2020/core/common/services/data-convertor.service.mjs +119 -0
  176. package/esm2020/core/common/services/file.service.mjs +213 -0
  177. package/esm2020/core/common/services/index.mjs +5 -0
  178. package/esm2020/core/common/services/jwt-helper.service.mjs +106 -0
  179. package/esm2020/core/common/services/public-api.mjs +15 -0
  180. package/esm2020/core/common/services/session.service.mjs +71 -0
  181. package/esm2020/core/common/services/translate.service.mjs +46 -0
  182. package/esm2020/core/common/services/utilities.service.mjs +210 -0
  183. package/esm2020/core/common/services/validator.service.mjs +272 -0
  184. package/esm2020/core/common/services/window-scrolling.service.mjs +36 -0
  185. package/esm2020/core/customization/customization.model.mjs +289 -0
  186. package/esm2020/core/customization/customization.service.mjs +771 -0
  187. package/esm2020/core/customization/index.mjs +5 -0
  188. package/esm2020/core/customization/public-api.mjs +6 -0
  189. package/esm2020/core/http/index.mjs +5 -0
  190. package/esm2020/core/http/interceptors/error.interceptor.mjs +27 -0
  191. package/esm2020/core/http/interceptors/index.mjs +24 -0
  192. package/esm2020/core/http/interceptors/loader.interceptor.mjs +33 -0
  193. package/esm2020/core/http/interceptors/profiler.interceptor.mjs +32 -0
  194. package/esm2020/core/http/public-api.mjs +6 -0
  195. package/esm2020/core/http/services/http.service.mjs +155 -0
  196. package/esm2020/core/http/services/loader.service.mjs +50 -0
  197. package/esm2020/core/index.mjs +5 -0
  198. package/esm2020/core/layout/index.mjs +5 -0
  199. package/esm2020/core/layout/layout.service.mjs +168 -0
  200. package/esm2020/core/layout/public-api.mjs +6 -0
  201. package/esm2020/core/layout/rtl.directive.mjs +44 -0
  202. package/esm2020/core/portal/attach.directive.mjs +27 -0
  203. package/esm2020/core/portal/index.mjs +5 -0
  204. package/esm2020/core/portal/portal.service.mjs +36 -0
  205. package/esm2020/core/portal/public-api.mjs +7 -0
  206. package/esm2020/core/portal/target.directive.mjs +24 -0
  207. package/esm2020/core/public-api.mjs +11 -0
  208. package/esm2020/core/scroll-to/index.mjs +5 -0
  209. package/esm2020/core/scroll-to/public-api.mjs +6 -0
  210. package/esm2020/core/scroll-to/scroll-to.service.mjs +84 -0
  211. package/esm2020/date/date.component.mjs +295 -0
  212. package/esm2020/date/date.model.mjs +54 -0
  213. package/esm2020/date/date.module.mjs +88 -0
  214. package/esm2020/date/pepperi-addons-ngx-lib-date.mjs +5 -0
  215. package/esm2020/date/public-api.mjs +6 -0
  216. package/esm2020/dialog/default-dialog.component.mjs +37 -0
  217. package/esm2020/dialog/dialog.component.mjs +36 -0
  218. package/esm2020/dialog/dialog.model.mjs +33 -0
  219. package/esm2020/dialog/dialog.module.mjs +59 -0
  220. package/esm2020/dialog/dialog.service.mjs +82 -0
  221. package/esm2020/dialog/pepperi-addons-ngx-lib-dialog.mjs +5 -0
  222. package/esm2020/dialog/public-api.mjs +8 -0
  223. package/esm2020/draggable-items/draggable-item/draggable-item.component.mjs +27 -0
  224. package/esm2020/draggable-items/draggable-items.component.mjs +102 -0
  225. package/esm2020/draggable-items/draggable-items.model.mjs +2 -0
  226. package/esm2020/draggable-items/draggable-items.module.mjs +60 -0
  227. package/esm2020/draggable-items/pepperi-addons-ngx-lib-draggable-items.mjs +5 -0
  228. package/esm2020/draggable-items/public-api.mjs +8 -0
  229. package/esm2020/field-title/field-title.component.mjs +42 -0
  230. package/esm2020/field-title/field-title.module.mjs +47 -0
  231. package/esm2020/field-title/pepperi-addons-ngx-lib-field-title.mjs +5 -0
  232. package/esm2020/field-title/public-api.mjs +6 -0
  233. package/esm2020/files-uploader/files-uploader.component.mjs +241 -0
  234. package/esm2020/files-uploader/files-uploader.module.mjs +79 -0
  235. package/esm2020/files-uploader/pepperi-addons-ngx-lib-files-uploader.mjs +5 -0
  236. package/esm2020/files-uploader/public-api.mjs +6 -0
  237. package/esm2020/form/field-generator.component.mjs +153 -0
  238. package/esm2020/form/form.component.mjs +1218 -0
  239. package/esm2020/form/form.model.mjs +2 -0
  240. package/esm2020/form/form.module.mjs +176 -0
  241. package/esm2020/form/indicators.component.mjs +23 -0
  242. package/esm2020/form/internal-button.component.mjs +184 -0
  243. package/esm2020/form/internal-carusel.component.mjs +117 -0
  244. package/esm2020/form/internal-carusel.service.mjs +32 -0
  245. package/esm2020/form/internal-field-generator.component.mjs +147 -0
  246. package/esm2020/form/internal-form.component.mjs +1214 -0
  247. package/esm2020/form/internal-list.component.mjs +510 -0
  248. package/esm2020/form/internal-menu.component.mjs +66 -0
  249. package/esm2020/form/internal-page.component.mjs +362 -0
  250. package/esm2020/form/internal-page.service.mjs +120 -0
  251. package/esm2020/form/pepperi-addons-ngx-lib-form.mjs +5 -0
  252. package/esm2020/form/public-api.mjs +7 -0
  253. package/esm2020/group-buttons/group-buttons.component.mjs +67 -0
  254. package/esm2020/group-buttons/group-buttons.module.mjs +59 -0
  255. package/esm2020/group-buttons/pepperi-addons-ngx-lib-group-buttons.mjs +5 -0
  256. package/esm2020/group-buttons/public-api.mjs +6 -0
  257. package/esm2020/icon/icon-generated-all.model.mjs +101 -0
  258. package/esm2020/icon/icon-generated.model.mjs +390 -0
  259. package/esm2020/icon/icon-registry.service.mjs +26 -0
  260. package/esm2020/icon/icon.component.mjs +91 -0
  261. package/esm2020/icon/icon.module.mjs +20 -0
  262. package/esm2020/icon/icon.service.mjs +31 -0
  263. package/esm2020/icon/pepperi-addons-ngx-lib-icon.mjs +5 -0
  264. package/esm2020/icon/public-api.mjs +11 -0
  265. package/esm2020/image/image.component.mjs +247 -0
  266. package/esm2020/image/image.module.mjs +74 -0
  267. package/esm2020/image/image.service.mjs +52 -0
  268. package/esm2020/image/pepperi-addons-ngx-lib-image.mjs +5 -0
  269. package/esm2020/image/public-api.mjs +7 -0
  270. package/esm2020/images-filmstrip/images-filmstrip.component.mjs +425 -0
  271. package/esm2020/images-filmstrip/images-filmstrip.module.mjs +138 -0
  272. package/esm2020/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.mjs +5 -0
  273. package/esm2020/images-filmstrip/public-api.mjs +6 -0
  274. package/esm2020/link/link.component.mjs +339 -0
  275. package/esm2020/link/link.module.mjs +80 -0
  276. package/esm2020/link/link.pipes.mjs +18 -0
  277. package/esm2020/link/pepperi-addons-ngx-lib-link.mjs +5 -0
  278. package/esm2020/link/public-api.mjs +6 -0
  279. package/esm2020/list/list-actions.component.mjs +44 -0
  280. package/esm2020/list/list-carousel.component.mjs +107 -0
  281. package/esm2020/list/list-chooser.component.mjs +64 -0
  282. package/esm2020/list/list-pager.component.mjs +120 -0
  283. package/esm2020/list/list-sorting.component.mjs +61 -0
  284. package/esm2020/list/list-total.component.mjs +30 -0
  285. package/esm2020/list/list-views.component.mjs +85 -0
  286. package/esm2020/list/list.component.mjs +1160 -0
  287. package/esm2020/list/list.model.mjs +4 -0
  288. package/esm2020/list/list.module.mjs +144 -0
  289. package/esm2020/list/list.pipes.mjs +47 -0
  290. package/esm2020/list/pepperi-addons-ngx-lib-list.mjs +5 -0
  291. package/esm2020/list/public-api.mjs +15 -0
  292. package/esm2020/list/virtual-scroller.mjs +1071 -0
  293. package/esm2020/menu/menu-item.component.mjs +115 -0
  294. package/esm2020/menu/menu.component.mjs +205 -0
  295. package/esm2020/menu/menu.model.mjs +19 -0
  296. package/esm2020/menu/menu.module.mjs +59 -0
  297. package/esm2020/menu/pepperi-addons-ngx-lib-menu.mjs +5 -0
  298. package/esm2020/menu/public-api.mjs +7 -0
  299. package/esm2020/ngx-lib.module.mjs +158 -0
  300. package/esm2020/page-layout/page-layout.component.mjs +35 -0
  301. package/esm2020/page-layout/page-layout.module.mjs +34 -0
  302. package/esm2020/page-layout/pepperi-addons-ngx-lib-page-layout.mjs +5 -0
  303. package/esm2020/page-layout/public-api.mjs +6 -0
  304. package/esm2020/pepperi-addons-ngx-lib.mjs +5 -0
  305. package/esm2020/plugin/pepperi-addons-ngx-lib-plugin.mjs +5 -0
  306. package/esm2020/plugin/plugin-proxy.component.mjs +97 -0
  307. package/esm2020/plugin/plugin.model.mjs +2 -0
  308. package/esm2020/plugin/public-api.mjs +6 -0
  309. package/esm2020/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.mjs +5 -0
  310. package/esm2020/profile-data-views-list/profile-data-view/profile-data-view.component.mjs +45 -0
  311. package/esm2020/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.mjs +65 -0
  312. package/esm2020/profile-data-views-list/profile-data-views-list.component.mjs +95 -0
  313. package/esm2020/profile-data-views-list/profile-data-views-list.model.mjs +2 -0
  314. package/esm2020/profile-data-views-list/profile-data-views-list.module.mjs +88 -0
  315. package/esm2020/profile-data-views-list/public-api.mjs +9 -0
  316. package/esm2020/public-api.mjs +6 -0
  317. package/esm2020/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.mjs +5 -0
  318. package/esm2020/quantity-selector/public-api.mjs +6 -0
  319. package/esm2020/quantity-selector/quantity-selector-validation.directive.mjs +47 -0
  320. package/esm2020/quantity-selector/quantity-selector.component.mjs +511 -0
  321. package/esm2020/quantity-selector/quantity-selector.module.mjs +82 -0
  322. package/esm2020/quantity-selector/quantity-selector.pipes.mjs +23 -0
  323. package/esm2020/query-builder/common/model/field.mjs +2 -0
  324. package/esm2020/query-builder/common/model/filter.mjs +2 -0
  325. package/esm2020/query-builder/common/model/legacy.mjs +2 -0
  326. package/esm2020/query-builder/common/model/operator-unit.mjs +42 -0
  327. package/esm2020/query-builder/common/model/operator.mjs +266 -0
  328. package/esm2020/query-builder/common/model/structure.mjs +2 -0
  329. package/esm2020/query-builder/common/model/type-map.mjs +27 -0
  330. package/esm2020/query-builder/common/model/type.mjs +6 -0
  331. package/esm2020/query-builder/common/services/output-query.service.mjs +114 -0
  332. package/esm2020/query-builder/common/services/query-structure.service.mjs +226 -0
  333. package/esm2020/query-builder/common/services/type-convertor.service.mjs +42 -0
  334. package/esm2020/query-builder/pepperi-addons-ngx-lib-query-builder.mjs +5 -0
  335. package/esm2020/query-builder/public-api.mjs +9 -0
  336. package/esm2020/query-builder/query-builder-item/query-builder-item.component.mjs +125 -0
  337. package/esm2020/query-builder/query-builder-section/query-builder-section.component.mjs +71 -0
  338. package/esm2020/query-builder/query-builder.component.mjs +110 -0
  339. package/esm2020/query-builder/query-builder.module.mjs +59 -0
  340. package/esm2020/query-builder/query-builder.service.mjs +102 -0
  341. package/esm2020/remote-loader/addon-block-loader.component.mjs +84 -0
  342. package/esm2020/remote-loader/addon-block-loader.service.mjs +61 -0
  343. package/esm2020/remote-loader/pepperi-addons-ngx-lib-remote-loader.mjs +5 -0
  344. package/esm2020/remote-loader/public-api.mjs +10 -0
  345. package/esm2020/remote-loader/remote-loader.component.mjs +137 -0
  346. package/esm2020/remote-loader/remote-loader.model.mjs +2 -0
  347. package/esm2020/remote-loader/remote-loader.module.mjs +60 -0
  348. package/esm2020/remote-loader/remote-loader.service.mjs +57 -0
  349. package/esm2020/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.mjs +5 -0
  350. package/esm2020/rich-html-textarea/public-api.mjs +6 -0
  351. package/esm2020/rich-html-textarea/rich-html-textarea.component.mjs +245 -0
  352. package/esm2020/rich-html-textarea/rich-html-textarea.module.mjs +95 -0
  353. package/esm2020/search/pepperi-addons-ngx-lib-search.mjs +5 -0
  354. package/esm2020/search/public-api.mjs +7 -0
  355. package/esm2020/search/search.component.mjs +317 -0
  356. package/esm2020/search/search.model.mjs +2 -0
  357. package/esm2020/search/search.module.mjs +70 -0
  358. package/esm2020/select/pepperi-addons-ngx-lib-select.mjs +5 -0
  359. package/esm2020/select/public-api.mjs +6 -0
  360. package/esm2020/select/select.component.mjs +238 -0
  361. package/esm2020/select/select.module.mjs +70 -0
  362. package/esm2020/separator/pepperi-addons-ngx-lib-separator.mjs +5 -0
  363. package/esm2020/separator/public-api.mjs +6 -0
  364. package/esm2020/separator/separator.component.mjs +63 -0
  365. package/esm2020/separator/separator.module.mjs +18 -0
  366. package/esm2020/side-bar/pepperi-addons-ngx-lib-side-bar.mjs +5 -0
  367. package/esm2020/side-bar/public-api.mjs +7 -0
  368. package/esm2020/side-bar/side-bar.component.mjs +138 -0
  369. package/esm2020/side-bar/side-bar.model.mjs +2 -0
  370. package/esm2020/side-bar/side-bar.module.mjs +51 -0
  371. package/esm2020/signature/pepperi-addons-ngx-lib-signature.mjs +5 -0
  372. package/esm2020/signature/public-api.mjs +6 -0
  373. package/esm2020/signature/signature.component.mjs +254 -0
  374. package/esm2020/signature/signature.module.mjs +90 -0
  375. package/esm2020/size-detector/pepperi-addons-ngx-lib-size-detector.mjs +5 -0
  376. package/esm2020/size-detector/public-api.mjs +6 -0
  377. package/esm2020/size-detector/size-detector.component.mjs +92 -0
  378. package/esm2020/size-detector/size-detector.module.mjs +35 -0
  379. package/esm2020/slider/pepperi-addons-ngx-lib-slider.mjs +5 -0
  380. package/esm2020/slider/public-api.mjs +6 -0
  381. package/esm2020/slider/slider.component.mjs +101 -0
  382. package/esm2020/slider/slider.module.mjs +42 -0
  383. package/esm2020/smart-filters/boolean-filter/boolean-filter.component.mjs +75 -0
  384. package/esm2020/smart-filters/common/filter-actions.component.mjs +29 -0
  385. package/esm2020/smart-filters/common/model/base-filter-component.mjs +295 -0
  386. package/esm2020/smart-filters/common/model/creator.mjs +76 -0
  387. package/esm2020/smart-filters/common/model/field.mjs +117 -0
  388. package/esm2020/smart-filters/common/model/filter.mjs +2 -0
  389. package/esm2020/smart-filters/common/model/operator.mjs +271 -0
  390. package/esm2020/smart-filters/common/model/type.mjs +2 -0
  391. package/esm2020/smart-filters/date-filter/date-filter.component.mjs +172 -0
  392. package/esm2020/smart-filters/multi-select-filter/multi-select-filter.component.mjs +200 -0
  393. package/esm2020/smart-filters/number-filter/number-filter.component.mjs +116 -0
  394. package/esm2020/smart-filters/pepperi-addons-ngx-lib-smart-filters.mjs +5 -0
  395. package/esm2020/smart-filters/public-api.mjs +19 -0
  396. package/esm2020/smart-filters/smart-filters.component.mjs +141 -0
  397. package/esm2020/smart-filters/smart-filters.module.mjs +158 -0
  398. package/esm2020/smart-filters/text-filter/text-filter.component.mjs +92 -0
  399. package/esm2020/snack-bar/default-snack-bar.component.mjs +29 -0
  400. package/esm2020/snack-bar/pepperi-addons-ngx-lib-snack-bar.mjs +5 -0
  401. package/esm2020/snack-bar/public-api.mjs +8 -0
  402. package/esm2020/snack-bar/snack-bar.component.mjs +26 -0
  403. package/esm2020/snack-bar/snack-bar.model.mjs +7 -0
  404. package/esm2020/snack-bar/snack-bar.module.mjs +63 -0
  405. package/esm2020/snack-bar/snack-bar.service.mjs +60 -0
  406. package/esm2020/textarea/pepperi-addons-ngx-lib-textarea.mjs +5 -0
  407. package/esm2020/textarea/public-api.mjs +6 -0
  408. package/esm2020/textarea/textarea.component.mjs +182 -0
  409. package/esm2020/textarea/textarea.module.mjs +82 -0
  410. package/esm2020/textbox/pepperi-addons-ngx-lib-textbox.mjs +5 -0
  411. package/esm2020/textbox/public-api.mjs +6 -0
  412. package/esm2020/textbox/textbox-validation.directive.mjs +89 -0
  413. package/esm2020/textbox/textbox.component.mjs +442 -0
  414. package/esm2020/textbox/textbox.module.mjs +72 -0
  415. package/esm2020/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.mjs +5 -0
  416. package/esm2020/textbox-icon/public-api.mjs +6 -0
  417. package/esm2020/textbox-icon/textbox-icon.component.mjs +48 -0
  418. package/esm2020/textbox-icon/textbox-icon.module.mjs +64 -0
  419. package/esm2020/top-bar/pepperi-addons-ngx-lib-top-bar.mjs +5 -0
  420. package/esm2020/top-bar/public-api.mjs +7 -0
  421. package/esm2020/top-bar/top-bar.component.mjs +112 -0
  422. package/esm2020/top-bar/top-bar.model.mjs +2 -0
  423. package/esm2020/top-bar/top-bar.module.mjs +62 -0
  424. package/fesm2015/pepperi-addons-ngx-lib-address.mjs +170 -0
  425. package/fesm2015/pepperi-addons-ngx-lib-address.mjs.map +1 -0
  426. package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs +277 -0
  427. package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs.map +1 -0
  428. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs +147 -0
  429. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs.map +1 -0
  430. package/fesm2015/pepperi-addons-ngx-lib-button.mjs +197 -0
  431. package/fesm2015/pepperi-addons-ngx-lib-button.mjs.map +1 -0
  432. package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs +804 -0
  433. package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs.map +1 -0
  434. package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs +237 -0
  435. package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs.map +1 -0
  436. package/fesm2015/pepperi-addons-ngx-lib-color.mjs +404 -0
  437. package/fesm2015/pepperi-addons-ngx-lib-color.mjs.map +1 -0
  438. package/fesm2015/pepperi-addons-ngx-lib-date.mjs +441 -0
  439. package/fesm2015/pepperi-addons-ngx-lib-date.mjs.map +1 -0
  440. package/fesm2015/pepperi-addons-ngx-lib-dialog.mjs +242 -0
  441. package/fesm2015/pepperi-addons-ngx-lib-dialog.mjs.map +1 -0
  442. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs +192 -0
  443. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs.map +1 -0
  444. package/fesm2015/pepperi-addons-ngx-lib-field-title.mjs +96 -0
  445. package/fesm2015/pepperi-addons-ngx-lib-field-title.mjs.map +1 -0
  446. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs +326 -0
  447. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs.map +1 -0
  448. package/fesm2015/pepperi-addons-ngx-lib-form.mjs +4204 -0
  449. package/fesm2015/pepperi-addons-ngx-lib-form.mjs.map +1 -0
  450. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs +132 -0
  451. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs.map +1 -0
  452. package/fesm2015/pepperi-addons-ngx-lib-icon.mjs +661 -0
  453. package/fesm2015/pepperi-addons-ngx-lib-icon.mjs.map +1 -0
  454. package/fesm2015/pepperi-addons-ngx-lib-image.mjs +374 -0
  455. package/fesm2015/pepperi-addons-ngx-lib-image.mjs.map +1 -0
  456. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs +552 -0
  457. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs.map +1 -0
  458. package/fesm2015/pepperi-addons-ngx-lib-link.mjs +438 -0
  459. package/fesm2015/pepperi-addons-ngx-lib-link.mjs.map +1 -0
  460. package/fesm2015/pepperi-addons-ngx-lib-list.mjs +2896 -0
  461. package/fesm2015/pepperi-addons-ngx-lib-list.mjs.map +1 -0
  462. package/fesm2015/pepperi-addons-ngx-lib-menu.mjs +391 -0
  463. package/fesm2015/pepperi-addons-ngx-lib-menu.mjs.map +1 -0
  464. package/fesm2015/pepperi-addons-ngx-lib-page-layout.mjs +77 -0
  465. package/fesm2015/pepperi-addons-ngx-lib-page-layout.mjs.map +1 -0
  466. package/fesm2015/pepperi-addons-ngx-lib-plugin.mjs +114 -0
  467. package/fesm2015/pepperi-addons-ngx-lib-plugin.mjs.map +1 -0
  468. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs +289 -0
  469. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs.map +1 -0
  470. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.mjs +662 -0
  471. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.mjs.map +1 -0
  472. package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs +1167 -0
  473. package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs.map +1 -0
  474. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs +404 -0
  475. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs.map +1 -0
  476. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs +344 -0
  477. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs.map +1 -0
  478. package/fesm2015/pepperi-addons-ngx-lib-search.mjs +393 -0
  479. package/fesm2015/pepperi-addons-ngx-lib-search.mjs.map +1 -0
  480. package/fesm2015/pepperi-addons-ngx-lib-select.mjs +314 -0
  481. package/fesm2015/pepperi-addons-ngx-lib-select.mjs.map +1 -0
  482. package/fesm2015/pepperi-addons-ngx-lib-separator.mjs +89 -0
  483. package/fesm2015/pepperi-addons-ngx-lib-separator.mjs.map +1 -0
  484. package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs +194 -0
  485. package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs.map +1 -0
  486. package/fesm2015/pepperi-addons-ngx-lib-signature.mjs +350 -0
  487. package/fesm2015/pepperi-addons-ngx-lib-signature.mjs.map +1 -0
  488. package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs +134 -0
  489. package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs.map +1 -0
  490. package/fesm2015/pepperi-addons-ngx-lib-slider.mjs +151 -0
  491. package/fesm2015/pepperi-addons-ngx-lib-slider.mjs.map +1 -0
  492. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs +1676 -0
  493. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -0
  494. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs +183 -0
  495. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs.map +1 -0
  496. package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs +271 -0
  497. package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs.map +1 -0
  498. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.mjs +118 -0
  499. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.mjs.map +1 -0
  500. package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs +604 -0
  501. package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs.map +1 -0
  502. package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs +180 -0
  503. package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs.map +1 -0
  504. package/fesm2015/pepperi-addons-ngx-lib.mjs +4579 -0
  505. package/fesm2015/pepperi-addons-ngx-lib.mjs.map +1 -0
  506. package/fesm2020/pepperi-addons-ngx-lib-address.mjs +170 -0
  507. package/fesm2020/pepperi-addons-ngx-lib-address.mjs.map +1 -0
  508. package/fesm2020/pepperi-addons-ngx-lib-attachment.mjs +277 -0
  509. package/fesm2020/pepperi-addons-ngx-lib-attachment.mjs.map +1 -0
  510. package/fesm2020/pepperi-addons-ngx-lib-bread-crumbs.mjs +147 -0
  511. package/fesm2020/pepperi-addons-ngx-lib-bread-crumbs.mjs.map +1 -0
  512. package/fesm2020/pepperi-addons-ngx-lib-button.mjs +197 -0
  513. package/fesm2020/pepperi-addons-ngx-lib-button.mjs.map +1 -0
  514. package/fesm2020/pepperi-addons-ngx-lib-carousel.mjs +800 -0
  515. package/fesm2020/pepperi-addons-ngx-lib-carousel.mjs.map +1 -0
  516. package/fesm2020/pepperi-addons-ngx-lib-checkbox.mjs +237 -0
  517. package/fesm2020/pepperi-addons-ngx-lib-checkbox.mjs.map +1 -0
  518. package/fesm2020/pepperi-addons-ngx-lib-color.mjs +401 -0
  519. package/fesm2020/pepperi-addons-ngx-lib-color.mjs.map +1 -0
  520. package/fesm2020/pepperi-addons-ngx-lib-date.mjs +437 -0
  521. package/fesm2020/pepperi-addons-ngx-lib-date.mjs.map +1 -0
  522. package/fesm2020/pepperi-addons-ngx-lib-dialog.mjs +237 -0
  523. package/fesm2020/pepperi-addons-ngx-lib-dialog.mjs.map +1 -0
  524. package/fesm2020/pepperi-addons-ngx-lib-draggable-items.mjs +191 -0
  525. package/fesm2020/pepperi-addons-ngx-lib-draggable-items.mjs.map +1 -0
  526. package/fesm2020/pepperi-addons-ngx-lib-field-title.mjs +96 -0
  527. package/fesm2020/pepperi-addons-ngx-lib-field-title.mjs.map +1 -0
  528. package/fesm2020/pepperi-addons-ngx-lib-files-uploader.mjs +323 -0
  529. package/fesm2020/pepperi-addons-ngx-lib-files-uploader.mjs.map +1 -0
  530. package/fesm2020/pepperi-addons-ngx-lib-form.mjs +4200 -0
  531. package/fesm2020/pepperi-addons-ngx-lib-form.mjs.map +1 -0
  532. package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs +132 -0
  533. package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs.map +1 -0
  534. package/fesm2020/pepperi-addons-ngx-lib-icon.mjs +659 -0
  535. package/fesm2020/pepperi-addons-ngx-lib-icon.mjs.map +1 -0
  536. package/fesm2020/pepperi-addons-ngx-lib-image.mjs +372 -0
  537. package/fesm2020/pepperi-addons-ngx-lib-image.mjs.map +1 -0
  538. package/fesm2020/pepperi-addons-ngx-lib-images-filmstrip.mjs +549 -0
  539. package/fesm2020/pepperi-addons-ngx-lib-images-filmstrip.mjs.map +1 -0
  540. package/fesm2020/pepperi-addons-ngx-lib-link.mjs +438 -0
  541. package/fesm2020/pepperi-addons-ngx-lib-link.mjs.map +1 -0
  542. package/fesm2020/pepperi-addons-ngx-lib-list.mjs +2882 -0
  543. package/fesm2020/pepperi-addons-ngx-lib-list.mjs.map +1 -0
  544. package/fesm2020/pepperi-addons-ngx-lib-menu.mjs +391 -0
  545. package/fesm2020/pepperi-addons-ngx-lib-menu.mjs.map +1 -0
  546. package/fesm2020/pepperi-addons-ngx-lib-page-layout.mjs +77 -0
  547. package/fesm2020/pepperi-addons-ngx-lib-page-layout.mjs.map +1 -0
  548. package/fesm2020/pepperi-addons-ngx-lib-plugin.mjs +108 -0
  549. package/fesm2020/pepperi-addons-ngx-lib-plugin.mjs.map +1 -0
  550. package/fesm2020/pepperi-addons-ngx-lib-profile-data-views-list.mjs +288 -0
  551. package/fesm2020/pepperi-addons-ngx-lib-profile-data-views-list.mjs.map +1 -0
  552. package/fesm2020/pepperi-addons-ngx-lib-quantity-selector.mjs +661 -0
  553. package/fesm2020/pepperi-addons-ngx-lib-quantity-selector.mjs.map +1 -0
  554. package/fesm2020/pepperi-addons-ngx-lib-query-builder.mjs +1156 -0
  555. package/fesm2020/pepperi-addons-ngx-lib-query-builder.mjs.map +1 -0
  556. package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs +393 -0
  557. package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs.map +1 -0
  558. package/fesm2020/pepperi-addons-ngx-lib-rich-html-textarea.mjs +344 -0
  559. package/fesm2020/pepperi-addons-ngx-lib-rich-html-textarea.mjs.map +1 -0
  560. package/fesm2020/pepperi-addons-ngx-lib-search.mjs +392 -0
  561. package/fesm2020/pepperi-addons-ngx-lib-search.mjs.map +1 -0
  562. package/fesm2020/pepperi-addons-ngx-lib-select.mjs +314 -0
  563. package/fesm2020/pepperi-addons-ngx-lib-select.mjs.map +1 -0
  564. package/fesm2020/pepperi-addons-ngx-lib-separator.mjs +89 -0
  565. package/fesm2020/pepperi-addons-ngx-lib-separator.mjs.map +1 -0
  566. package/fesm2020/pepperi-addons-ngx-lib-side-bar.mjs +194 -0
  567. package/fesm2020/pepperi-addons-ngx-lib-side-bar.mjs.map +1 -0
  568. package/fesm2020/pepperi-addons-ngx-lib-signature.mjs +350 -0
  569. package/fesm2020/pepperi-addons-ngx-lib-signature.mjs.map +1 -0
  570. package/fesm2020/pepperi-addons-ngx-lib-size-detector.mjs +134 -0
  571. package/fesm2020/pepperi-addons-ngx-lib-size-detector.mjs.map +1 -0
  572. package/fesm2020/pepperi-addons-ngx-lib-slider.mjs +150 -0
  573. package/fesm2020/pepperi-addons-ngx-lib-slider.mjs.map +1 -0
  574. package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs +1669 -0
  575. package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -0
  576. package/fesm2020/pepperi-addons-ngx-lib-snack-bar.mjs +180 -0
  577. package/fesm2020/pepperi-addons-ngx-lib-snack-bar.mjs.map +1 -0
  578. package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs +270 -0
  579. package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs.map +1 -0
  580. package/fesm2020/pepperi-addons-ngx-lib-textbox-icon.mjs +118 -0
  581. package/fesm2020/pepperi-addons-ngx-lib-textbox-icon.mjs.map +1 -0
  582. package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs +604 -0
  583. package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs.map +1 -0
  584. package/fesm2020/pepperi-addons-ngx-lib-top-bar.mjs +179 -0
  585. package/fesm2020/pepperi-addons-ngx-lib-top-bar.mjs.map +1 -0
  586. package/fesm2020/pepperi-addons-ngx-lib.mjs +4561 -0
  587. package/fesm2020/pepperi-addons-ngx-lib.mjs.map +1 -0
  588. package/field-title/field-title.component.d.ts +14 -11
  589. package/field-title/field-title.module.d.ts +15 -5
  590. package/field-title/index.d.ts +5 -0
  591. package/field-title/public-api.d.ts +2 -2
  592. package/files-uploader/files-uploader.component.d.ts +57 -53
  593. package/files-uploader/files-uploader.module.d.ts +21 -5
  594. package/files-uploader/index.d.ts +5 -0
  595. package/files-uploader/public-api.d.ts +2 -2
  596. package/form/field-generator.component.d.ts +39 -45
  597. package/form/form.component.d.ts +93 -90
  598. package/form/form.model.d.ts +20 -20
  599. package/form/form.module.d.ts +49 -5
  600. package/form/index.d.ts +5 -0
  601. package/form/indicators.component.d.ts +10 -7
  602. package/form/internal-button.component.d.ts +42 -39
  603. package/form/internal-carusel.component.d.ts +39 -38
  604. package/form/internal-carusel.service.d.ts +10 -7
  605. package/form/internal-field-generator.component.d.ts +35 -0
  606. package/form/internal-form.component.d.ts +89 -0
  607. package/form/internal-list.component.d.ts +95 -92
  608. package/form/internal-menu.component.d.ts +19 -16
  609. package/form/internal-page.component.d.ts +73 -72
  610. package/form/internal-page.service.d.ts +22 -19
  611. package/form/public-api.d.ts +3 -3
  612. package/group-buttons/group-buttons.component.d.ts +23 -20
  613. package/group-buttons/group-buttons.module.d.ts +18 -5
  614. package/group-buttons/index.d.ts +5 -0
  615. package/group-buttons/public-api.d.ts +2 -2
  616. package/icon/icon-generated-all.model.d.ts +99 -99
  617. package/icon/icon-generated.model.d.ts +394 -394
  618. package/icon/icon-registry.service.d.ts +9 -6
  619. package/icon/icon.component.d.ts +49 -46
  620. package/icon/icon.module.d.ts +7 -2
  621. package/icon/icon.service.d.ts +13 -10
  622. package/icon/index.d.ts +5 -0
  623. package/icon/public-api.d.ts +6 -6
  624. package/image/image.component.d.ts +66 -63
  625. package/image/image.module.d.ts +20 -5
  626. package/image/image.service.d.ts +14 -11
  627. package/image/index.d.ts +5 -0
  628. package/image/public-api.d.ts +3 -3
  629. package/images-filmstrip/images-filmstrip.component.d.ts +87 -87
  630. package/images-filmstrip/images-filmstrip.module.d.ts +22 -5
  631. package/images-filmstrip/index.d.ts +5 -0
  632. package/images-filmstrip/public-api.d.ts +2 -2
  633. package/index.d.ts +5 -0
  634. package/link/index.d.ts +5 -0
  635. package/link/link.component.d.ts +133 -131
  636. package/link/link.module.d.ts +22 -5
  637. package/link/link.pipes.d.ts +7 -4
  638. package/link/public-api.d.ts +2 -2
  639. package/list/index.d.ts +5 -0
  640. package/list/list-actions.component.d.ts +18 -14
  641. package/list/list-carousel.component.d.ts +40 -36
  642. package/list/list-chooser.component.d.ts +29 -25
  643. package/list/list-pager.component.d.ts +39 -35
  644. package/list/list-sorting.component.d.ts +30 -26
  645. package/list/list-total.component.d.ts +11 -7
  646. package/list/list-views.component.d.ts +35 -31
  647. package/list/list.component.d.ts +164 -161
  648. package/list/list.model.d.ts +31 -31
  649. package/list/list.module.d.ts +34 -5
  650. package/list/list.pipes.d.ts +16 -11
  651. package/list/public-api.d.ts +10 -10
  652. package/list/virtual-scroller.d.ts +183 -176
  653. package/menu/index.d.ts +5 -0
  654. package/menu/menu-item.component.d.ts +28 -25
  655. package/menu/menu.component.d.ts +46 -43
  656. package/menu/menu.model.d.ts +25 -25
  657. package/menu/menu.module.d.ts +18 -5
  658. package/menu/public-api.d.ts +3 -3
  659. package/ngx-lib.module.d.ts +23 -2
  660. package/package.json +353 -20
  661. package/page-layout/index.d.ts +5 -0
  662. package/page-layout/page-layout.component.d.ts +19 -16
  663. package/page-layout/page-layout.module.d.ts +10 -2
  664. package/page-layout/public-api.d.ts +2 -2
  665. package/plugin/index.d.ts +5 -0
  666. package/plugin/plugin-proxy.component.d.ts +25 -0
  667. package/plugin/plugin.model.d.ts +6 -0
  668. package/plugin/public-api.d.ts +2 -0
  669. package/profile-data-views-list/index.d.ts +5 -0
  670. package/profile-data-views-list/profile-data-view/profile-data-view.component.d.ts +18 -15
  671. package/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.d.ts +24 -21
  672. package/profile-data-views-list/profile-data-views-list.component.d.ts +35 -32
  673. package/profile-data-views-list/profile-data-views-list.model.d.ts +18 -18
  674. package/profile-data-views-list/profile-data-views-list.module.d.ts +23 -5
  675. package/profile-data-views-list/public-api.d.ts +5 -5
  676. package/public-api.d.ts +2 -2
  677. package/quantity-selector/index.d.ts +5 -0
  678. package/quantity-selector/public-api.d.ts +2 -2
  679. package/quantity-selector/quantity-selector-validation.directive.d.ts +16 -13
  680. package/quantity-selector/quantity-selector.component.d.ts +101 -98
  681. package/quantity-selector/quantity-selector.module.d.ts +23 -5
  682. package/quantity-selector/quantity-selector.pipes.d.ts +7 -4
  683. package/query-builder/common/model/field.d.ts +8 -8
  684. package/query-builder/common/model/filter.d.ts +6 -6
  685. package/query-builder/common/model/legacy.d.ts +29 -29
  686. package/query-builder/common/model/operator-unit.d.ts +13 -13
  687. package/query-builder/common/model/operator.d.ts +21 -21
  688. package/query-builder/common/model/structure.d.ts +4 -4
  689. package/query-builder/common/model/type-map.d.ts +12 -12
  690. package/query-builder/common/model/type.d.ts +4 -4
  691. package/query-builder/common/services/output-query.service.d.ts +47 -44
  692. package/query-builder/common/services/query-structure.service.d.ts +82 -78
  693. package/query-builder/common/services/type-convertor.service.d.ts +13 -10
  694. package/query-builder/index.d.ts +5 -0
  695. package/query-builder/public-api.d.ts +5 -5
  696. package/query-builder/query-builder-item/query-builder-item.component.d.ts +41 -38
  697. package/query-builder/query-builder-section/query-builder-section.component.d.ts +30 -27
  698. package/query-builder/query-builder.component.d.ts +39 -36
  699. package/query-builder/query-builder.module.d.ts +16 -2
  700. package/query-builder/query-builder.service.d.ts +30 -27
  701. package/remote-loader/addon-block-loader.component.d.ts +32 -29
  702. package/remote-loader/addon-block-loader.service.d.ts +16 -13
  703. package/remote-loader/index.d.ts +5 -0
  704. package/remote-loader/public-api.d.ts +6 -6
  705. package/remote-loader/remote-loader.component.d.ts +27 -24
  706. package/remote-loader/remote-loader.model.d.ts +36 -36
  707. package/remote-loader/remote-loader.module.d.ts +13 -2
  708. package/remote-loader/remote-loader.service.d.ts +17 -14
  709. package/rich-html-textarea/index.d.ts +5 -0
  710. package/rich-html-textarea/public-api.d.ts +2 -2
  711. package/rich-html-textarea/rich-html-textarea.component.d.ts +78 -75
  712. package/rich-html-textarea/rich-html-textarea.module.d.ts +25 -5
  713. package/search/index.d.ts +5 -0
  714. package/search/public-api.d.ts +3 -3
  715. package/search/search.component.d.ts +65 -61
  716. package/search/search.model.d.ts +14 -14
  717. package/search/search.module.d.ts +20 -5
  718. package/select/index.d.ts +5 -0
  719. package/select/public-api.d.ts +2 -2
  720. package/select/select.component.d.ts +53 -50
  721. package/select/select.module.d.ts +20 -5
  722. package/separator/index.d.ts +5 -0
  723. package/separator/public-api.d.ts +2 -2
  724. package/separator/separator.component.d.ts +22 -19
  725. package/separator/separator.module.d.ts +8 -2
  726. package/side-bar/index.d.ts +5 -0
  727. package/side-bar/public-api.d.ts +3 -3
  728. package/side-bar/side-bar.component.d.ts +42 -38
  729. package/side-bar/side-bar.model.d.ts +4 -4
  730. package/side-bar/side-bar.module.d.ts +16 -5
  731. package/signature/index.d.ts +5 -0
  732. package/signature/public-api.d.ts +2 -2
  733. package/signature/signature.component.d.ts +68 -65
  734. package/signature/signature.module.d.ts +24 -5
  735. package/size-detector/index.d.ts +5 -0
  736. package/size-detector/public-api.d.ts +2 -2
  737. package/size-detector/size-detector.component.d.ts +29 -26
  738. package/size-detector/size-detector.module.d.ts +11 -2
  739. package/slider/index.d.ts +5 -0
  740. package/slider/public-api.d.ts +2 -2
  741. package/slider/slider.component.d.ts +39 -36
  742. package/slider/slider.module.d.ts +12 -2
  743. package/smart-filters/boolean-filter/boolean-filter.component.d.ts +28 -25
  744. package/smart-filters/common/filter-actions.component.d.ts +12 -9
  745. package/smart-filters/common/model/base-filter-component.d.ts +73 -70
  746. package/smart-filters/common/model/creator.d.ts +6 -6
  747. package/smart-filters/common/model/field.d.ts +69 -69
  748. package/smart-filters/common/model/filter.d.ts +11 -11
  749. package/smart-filters/common/model/operator.d.ts +51 -51
  750. package/smart-filters/common/model/type.d.ts +4 -4
  751. package/smart-filters/date-filter/date-filter.component.d.ts +59 -56
  752. package/smart-filters/index.d.ts +5 -0
  753. package/smart-filters/multi-select-filter/multi-select-filter.component.d.ts +56 -53
  754. package/smart-filters/number-filter/number-filter.component.d.ts +51 -48
  755. package/smart-filters/public-api.d.ts +14 -14
  756. package/smart-filters/smart-filters.component.d.ts +35 -32
  757. package/smart-filters/smart-filters.module.d.ts +37 -5
  758. package/smart-filters/text-filter/text-filter.component.d.ts +28 -25
  759. package/snack-bar/default-snack-bar.component.d.ts +13 -10
  760. package/snack-bar/index.d.ts +5 -0
  761. package/snack-bar/public-api.d.ts +4 -4
  762. package/snack-bar/snack-bar.component.d.ts +12 -9
  763. package/snack-bar/snack-bar.model.d.ts +8 -8
  764. package/snack-bar/snack-bar.module.d.ts +19 -5
  765. package/snack-bar/snack-bar.service.d.ts +24 -21
  766. package/src/core/style/themes/black-theme.scss +1 -1
  767. package/src/core/style/themes/default-theme.scss +1 -1
  768. package/src/core/style/themes/light-theme.scss +1 -1
  769. package/src/core/style/themes/nature-theme.scss +1 -1
  770. package/textarea/index.d.ts +5 -0
  771. package/textarea/public-api.d.ts +2 -2
  772. package/textarea/textarea.component.d.ts +54 -51
  773. package/textarea/textarea.module.d.ts +23 -5
  774. package/textbox/index.d.ts +5 -0
  775. package/textbox/public-api.d.ts +2 -2
  776. package/textbox/textbox-validation.directive.d.ts +21 -18
  777. package/textbox/textbox.component.d.ts +143 -141
  778. package/textbox/textbox.module.d.ts +22 -5
  779. package/textbox-icon/index.d.ts +5 -0
  780. package/textbox-icon/public-api.d.ts +2 -2
  781. package/textbox-icon/textbox-icon.component.d.ts +13 -10
  782. package/textbox-icon/textbox-icon.module.d.ts +16 -5
  783. package/theming.scss +1 -1
  784. package/top-bar/index.d.ts +5 -0
  785. package/top-bar/public-api.d.ts +3 -3
  786. package/top-bar/top-bar.component.d.ts +39 -36
  787. package/top-bar/top-bar.model.d.ts +4 -4
  788. package/top-bar/top-bar.module.d.ts +18 -5
  789. package/address/package.json +0 -11
  790. package/address/pepperi-addons-ngx-lib-address.d.ts +0 -4
  791. package/address/pepperi-addons-ngx-lib-address.metadata.json +0 -1
  792. package/attachment/package.json +0 -11
  793. package/attachment/pepperi-addons-ngx-lib-attachment.d.ts +0 -4
  794. package/attachment/pepperi-addons-ngx-lib-attachment.metadata.json +0 -1
  795. package/bread-crumbs/package.json +0 -11
  796. package/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.d.ts +0 -4
  797. package/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.metadata.json +0 -1
  798. package/bundles/pepperi-addons-ngx-lib-address.umd.js +0 -145
  799. package/bundles/pepperi-addons-ngx-lib-address.umd.js.map +0 -1
  800. package/bundles/pepperi-addons-ngx-lib-attachment.umd.js +0 -268
  801. package/bundles/pepperi-addons-ngx-lib-attachment.umd.js.map +0 -1
  802. package/bundles/pepperi-addons-ngx-lib-bread-crumbs.umd.js +0 -145
  803. package/bundles/pepperi-addons-ngx-lib-bread-crumbs.umd.js.map +0 -1
  804. package/bundles/pepperi-addons-ngx-lib-button.umd.js +0 -182
  805. package/bundles/pepperi-addons-ngx-lib-button.umd.js.map +0 -1
  806. package/bundles/pepperi-addons-ngx-lib-carousel.umd.js +0 -812
  807. package/bundles/pepperi-addons-ngx-lib-carousel.umd.js.map +0 -1
  808. package/bundles/pepperi-addons-ngx-lib-checkbox.umd.js +0 -213
  809. package/bundles/pepperi-addons-ngx-lib-checkbox.umd.js.map +0 -1
  810. package/bundles/pepperi-addons-ngx-lib-color.umd.js +0 -326
  811. package/bundles/pepperi-addons-ngx-lib-color.umd.js.map +0 -1
  812. package/bundles/pepperi-addons-ngx-lib-date.umd.js +0 -698
  813. package/bundles/pepperi-addons-ngx-lib-date.umd.js.map +0 -1
  814. package/bundles/pepperi-addons-ngx-lib-dialog.umd.js +0 -578
  815. package/bundles/pepperi-addons-ngx-lib-dialog.umd.js.map +0 -1
  816. package/bundles/pepperi-addons-ngx-lib-draggable-items.umd.js +0 -175
  817. package/bundles/pepperi-addons-ngx-lib-draggable-items.umd.js.map +0 -1
  818. package/bundles/pepperi-addons-ngx-lib-field-title.umd.js +0 -78
  819. package/bundles/pepperi-addons-ngx-lib-field-title.umd.js.map +0 -1
  820. package/bundles/pepperi-addons-ngx-lib-files-uploader.umd.js +0 -281
  821. package/bundles/pepperi-addons-ngx-lib-files-uploader.umd.js.map +0 -1
  822. package/bundles/pepperi-addons-ngx-lib-form.umd.js +0 -3401
  823. package/bundles/pepperi-addons-ngx-lib-form.umd.js.map +0 -1
  824. package/bundles/pepperi-addons-ngx-lib-group-buttons.umd.js +0 -108
  825. package/bundles/pepperi-addons-ngx-lib-group-buttons.umd.js.map +0 -1
  826. package/bundles/pepperi-addons-ngx-lib-icon.umd.js +0 -834
  827. package/bundles/pepperi-addons-ngx-lib-icon.umd.js.map +0 -1
  828. package/bundles/pepperi-addons-ngx-lib-image.umd.js +0 -372
  829. package/bundles/pepperi-addons-ngx-lib-image.umd.js.map +0 -1
  830. package/bundles/pepperi-addons-ngx-lib-images-filmstrip.umd.js +0 -446
  831. package/bundles/pepperi-addons-ngx-lib-images-filmstrip.umd.js.map +0 -1
  832. package/bundles/pepperi-addons-ngx-lib-link.umd.js +0 -412
  833. package/bundles/pepperi-addons-ngx-lib-link.umd.js.map +0 -1
  834. package/bundles/pepperi-addons-ngx-lib-list.umd.js +0 -3274
  835. package/bundles/pepperi-addons-ngx-lib-list.umd.js.map +0 -1
  836. package/bundles/pepperi-addons-ngx-lib-menu.umd.js +0 -676
  837. package/bundles/pepperi-addons-ngx-lib-menu.umd.js.map +0 -1
  838. package/bundles/pepperi-addons-ngx-lib-page-layout.umd.js +0 -81
  839. package/bundles/pepperi-addons-ngx-lib-page-layout.umd.js.map +0 -1
  840. package/bundles/pepperi-addons-ngx-lib-profile-data-views-list.umd.js +0 -572
  841. package/bundles/pepperi-addons-ngx-lib-profile-data-views-list.umd.js.map +0 -1
  842. package/bundles/pepperi-addons-ngx-lib-quantity-selector.umd.js +0 -959
  843. package/bundles/pepperi-addons-ngx-lib-quantity-selector.umd.js.map +0 -1
  844. package/bundles/pepperi-addons-ngx-lib-query-builder.umd.js +0 -1250
  845. package/bundles/pepperi-addons-ngx-lib-query-builder.umd.js.map +0 -1
  846. package/bundles/pepperi-addons-ngx-lib-remote-loader.umd.js +0 -738
  847. package/bundles/pepperi-addons-ngx-lib-remote-loader.umd.js.map +0 -1
  848. package/bundles/pepperi-addons-ngx-lib-rich-html-textarea.umd.js +0 -296
  849. package/bundles/pepperi-addons-ngx-lib-rich-html-textarea.umd.js.map +0 -1
  850. package/bundles/pepperi-addons-ngx-lib-search.umd.js +0 -347
  851. package/bundles/pepperi-addons-ngx-lib-search.umd.js.map +0 -1
  852. package/bundles/pepperi-addons-ngx-lib-select.umd.js +0 -598
  853. package/bundles/pepperi-addons-ngx-lib-select.umd.js.map +0 -1
  854. package/bundles/pepperi-addons-ngx-lib-separator.umd.js +0 -100
  855. package/bundles/pepperi-addons-ngx-lib-separator.umd.js.map +0 -1
  856. package/bundles/pepperi-addons-ngx-lib-side-bar.umd.js +0 -184
  857. package/bundles/pepperi-addons-ngx-lib-side-bar.umd.js.map +0 -1
  858. package/bundles/pepperi-addons-ngx-lib-signature.umd.js +0 -307
  859. package/bundles/pepperi-addons-ngx-lib-signature.umd.js.map +0 -1
  860. package/bundles/pepperi-addons-ngx-lib-size-detector.umd.js +0 -134
  861. package/bundles/pepperi-addons-ngx-lib-size-detector.umd.js.map +0 -1
  862. package/bundles/pepperi-addons-ngx-lib-slider.umd.js +0 -145
  863. package/bundles/pepperi-addons-ngx-lib-slider.umd.js.map +0 -1
  864. package/bundles/pepperi-addons-ngx-lib-smart-filters.umd.js +0 -2044
  865. package/bundles/pepperi-addons-ngx-lib-smart-filters.umd.js.map +0 -1
  866. package/bundles/pepperi-addons-ngx-lib-snack-bar.umd.js +0 -202
  867. package/bundles/pepperi-addons-ngx-lib-snack-bar.umd.js.map +0 -1
  868. package/bundles/pepperi-addons-ngx-lib-textarea.umd.js +0 -232
  869. package/bundles/pepperi-addons-ngx-lib-textarea.umd.js.map +0 -1
  870. package/bundles/pepperi-addons-ngx-lib-textbox-icon.umd.js +0 -101
  871. package/bundles/pepperi-addons-ngx-lib-textbox-icon.umd.js.map +0 -1
  872. package/bundles/pepperi-addons-ngx-lib-textbox.umd.js +0 -577
  873. package/bundles/pepperi-addons-ngx-lib-textbox.umd.js.map +0 -1
  874. package/bundles/pepperi-addons-ngx-lib-top-bar.umd.js +0 -150
  875. package/bundles/pepperi-addons-ngx-lib-top-bar.umd.js.map +0 -1
  876. package/bundles/pepperi-addons-ngx-lib.umd.js +0 -5183
  877. package/bundles/pepperi-addons-ngx-lib.umd.js.map +0 -1
  878. package/button/package.json +0 -11
  879. package/button/pepperi-addons-ngx-lib-button.d.ts +0 -4
  880. package/button/pepperi-addons-ngx-lib-button.metadata.json +0 -1
  881. package/carousel/package.json +0 -11
  882. package/carousel/pepperi-addons-ngx-lib-carousel.d.ts +0 -4
  883. package/carousel/pepperi-addons-ngx-lib-carousel.metadata.json +0 -1
  884. package/checkbox/package.json +0 -14
  885. package/checkbox/pepperi-addons-ngx-lib-checkbox.d.ts +0 -4
  886. package/checkbox/pepperi-addons-ngx-lib-checkbox.metadata.json +0 -1
  887. package/color/package.json +0 -14
  888. package/color/pepperi-addons-ngx-lib-color.d.ts +0 -5
  889. package/color/pepperi-addons-ngx-lib-color.metadata.json +0 -1
  890. package/date/package.json +0 -18
  891. package/date/pepperi-addons-ngx-lib-date.d.ts +0 -5
  892. package/date/pepperi-addons-ngx-lib-date.metadata.json +0 -1
  893. package/dialog/package.json +0 -15
  894. package/dialog/pepperi-addons-ngx-lib-dialog.d.ts +0 -5
  895. package/dialog/pepperi-addons-ngx-lib-dialog.metadata.json +0 -1
  896. package/draggable-items/package.json +0 -14
  897. package/draggable-items/pepperi-addons-ngx-lib-draggable-items.d.ts +0 -4
  898. package/draggable-items/pepperi-addons-ngx-lib-draggable-items.metadata.json +0 -1
  899. package/esm2015/address/address.component.js +0 -97
  900. package/esm2015/address/address.module.js +0 -31
  901. package/esm2015/address/pepperi-addons-ngx-lib-address.js +0 -5
  902. package/esm2015/address/public-api.js +0 -6
  903. package/esm2015/attachment/attachment.component.js +0 -209
  904. package/esm2015/attachment/attachment.module.js +0 -29
  905. package/esm2015/attachment/pepperi-addons-ngx-lib-attachment.js +0 -5
  906. package/esm2015/attachment/public-api.js +0 -6
  907. package/esm2015/bread-crumbs/bread-crumbs.component.js +0 -79
  908. package/esm2015/bread-crumbs/bread-crumbs.model.js +0 -7
  909. package/esm2015/bread-crumbs/bread-crumbs.module.js +0 -35
  910. package/esm2015/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.js +0 -5
  911. package/esm2015/bread-crumbs/public-api.js +0 -7
  912. package/esm2015/button/button.component.js +0 -128
  913. package/esm2015/button/button.model.js +0 -6
  914. package/esm2015/button/button.module.js +0 -27
  915. package/esm2015/button/pepperi-addons-ngx-lib-button.js +0 -5
  916. package/esm2015/button/public-api.js +0 -7
  917. package/esm2015/carousel/carousel-item.directive.js +0 -27
  918. package/esm2015/carousel/carousel.component.js +0 -714
  919. package/esm2015/carousel/carousel.module.js +0 -12
  920. package/esm2015/carousel/pepperi-addons-ngx-lib-carousel.js +0 -5
  921. package/esm2015/carousel/public-api.js +0 -8
  922. package/esm2015/checkbox/checkbox.component.js +0 -152
  923. package/esm2015/checkbox/checkbox.module.js +0 -40
  924. package/esm2015/checkbox/pepperi-addons-ngx-lib-checkbox.js +0 -5
  925. package/esm2015/checkbox/public-api.js +0 -6
  926. package/esm2015/color/color-picker.component.js +0 -224
  927. package/esm2015/color/color.component.js +0 -78
  928. package/esm2015/color/color.model.js +0 -2
  929. package/esm2015/color/color.module.js +0 -58
  930. package/esm2015/color/pepperi-addons-ngx-lib-color.js +0 -6
  931. package/esm2015/color/public-api.js +0 -7
  932. package/esm2015/core/clipboard/clipboard.directive.js +0 -20
  933. package/esm2015/core/clipboard/clipboard.service.js +0 -12
  934. package/esm2015/core/clipboard/index.js +0 -5
  935. package/esm2015/core/clipboard/public-api.js +0 -6
  936. package/esm2015/core/common/directives/auto-width.directive.js +0 -78
  937. package/esm2015/core/common/directives/button-blur.directive.js +0 -23
  938. package/esm2015/core/common/directives/button-loader.directive.js +0 -103
  939. package/esm2015/core/common/directives/data-qa.directive.js +0 -23
  940. package/esm2015/core/common/directives/index.js +0 -5
  941. package/esm2015/core/common/directives/menu-blur.directive.js +0 -29
  942. package/esm2015/core/common/directives/prevent-multi-click.directive.js +0 -22
  943. package/esm2015/core/common/directives/print.directive.js +0 -160
  944. package/esm2015/core/common/directives/public-api.js +0 -12
  945. package/esm2015/core/common/index.js +0 -5
  946. package/esm2015/core/common/model/index.js +0 -5
  947. package/esm2015/core/common/model/papi.model.js +0 -3
  948. package/esm2015/core/common/model/public-api.js +0 -7
  949. package/esm2015/core/common/model/utilities.model.js +0 -57
  950. package/esm2015/core/common/model/wapi.model.js +0 -156
  951. package/esm2015/core/common/pipes/common-pipes.js +0 -142
  952. package/esm2015/core/common/pipes/date-ago.pipe.js +0 -45
  953. package/esm2015/core/common/pipes/index.js +0 -5
  954. package/esm2015/core/common/pipes/public-api.js +0 -6
  955. package/esm2015/core/common/public-api.js +0 -8
  956. package/esm2015/core/common/services/addon.service.js +0 -161
  957. package/esm2015/core/common/services/color.service.js +0 -357
  958. package/esm2015/core/common/services/cookie.service.js +0 -148
  959. package/esm2015/core/common/services/data-convertor.service.js +0 -118
  960. package/esm2015/core/common/services/file.service.js +0 -212
  961. package/esm2015/core/common/services/index.js +0 -5
  962. package/esm2015/core/common/services/jwt-helper.service.js +0 -104
  963. package/esm2015/core/common/services/public-api.js +0 -15
  964. package/esm2015/core/common/services/session.service.js +0 -73
  965. package/esm2015/core/common/services/translate.service.js +0 -48
  966. package/esm2015/core/common/services/utilities.service.js +0 -211
  967. package/esm2015/core/common/services/validator.service.js +0 -273
  968. package/esm2015/core/common/services/window-scrolling.service.js +0 -35
  969. package/esm2015/core/customization/customization.model.js +0 -290
  970. package/esm2015/core/customization/customization.service.js +0 -778
  971. package/esm2015/core/customization/index.js +0 -5
  972. package/esm2015/core/customization/public-api.js +0 -6
  973. package/esm2015/core/http/index.js +0 -5
  974. package/esm2015/core/http/interceptors/error.interceptor.js +0 -24
  975. package/esm2015/core/http/interceptors/index.js +0 -24
  976. package/esm2015/core/http/interceptors/loader.interceptor.js +0 -39
  977. package/esm2015/core/http/interceptors/profiler.interceptor.js +0 -29
  978. package/esm2015/core/http/public-api.js +0 -6
  979. package/esm2015/core/http/services/http.service.js +0 -161
  980. package/esm2015/core/http/services/loader.service.js +0 -49
  981. package/esm2015/core/index.js +0 -5
  982. package/esm2015/core/layout/index.js +0 -5
  983. package/esm2015/core/layout/layout.service.js +0 -169
  984. package/esm2015/core/layout/public-api.js +0 -6
  985. package/esm2015/core/layout/rtl.directive.js +0 -47
  986. package/esm2015/core/portal/attach.directive.js +0 -27
  987. package/esm2015/core/portal/index.js +0 -5
  988. package/esm2015/core/portal/portal.service.js +0 -35
  989. package/esm2015/core/portal/public-api.js +0 -7
  990. package/esm2015/core/portal/target.directive.js +0 -24
  991. package/esm2015/core/public-api.js +0 -11
  992. package/esm2015/core/scroll-to/index.js +0 -5
  993. package/esm2015/core/scroll-to/public-api.js +0 -6
  994. package/esm2015/core/scroll-to/scroll-to.service.js +0 -82
  995. package/esm2015/date/date.component.js +0 -252
  996. package/esm2015/date/date.model.js +0 -45
  997. package/esm2015/date/date.module.js +0 -51
  998. package/esm2015/date/pepperi-addons-ngx-lib-date.js +0 -6
  999. package/esm2015/date/public-api.js +0 -6
  1000. package/esm2015/dialog/default-dialog.component.js +0 -32
  1001. package/esm2015/dialog/dialog.component.js +0 -29
  1002. package/esm2015/dialog/dialog.model.js +0 -35
  1003. package/esm2015/dialog/dialog.module.js +0 -40
  1004. package/esm2015/dialog/dialog.service.js +0 -88
  1005. package/esm2015/dialog/pepperi-addons-ngx-lib-dialog.js +0 -6
  1006. package/esm2015/dialog/public-api.js +0 -8
  1007. package/esm2015/draggable-items/draggable-item/draggable-item.component.js +0 -25
  1008. package/esm2015/draggable-items/draggable-items.component.js +0 -92
  1009. package/esm2015/draggable-items/draggable-items.model.js +0 -2
  1010. package/esm2015/draggable-items/draggable-items.module.js +0 -43
  1011. package/esm2015/draggable-items/pepperi-addons-ngx-lib-draggable-items.js +0 -5
  1012. package/esm2015/draggable-items/public-api.js +0 -8
  1013. package/esm2015/field-title/field-title.component.js +0 -32
  1014. package/esm2015/field-title/field-title.module.js +0 -32
  1015. package/esm2015/field-title/pepperi-addons-ngx-lib-field-title.js +0 -5
  1016. package/esm2015/field-title/public-api.js +0 -6
  1017. package/esm2015/files-uploader/files-uploader.component.js +0 -221
  1018. package/esm2015/files-uploader/files-uploader.module.js +0 -50
  1019. package/esm2015/files-uploader/pepperi-addons-ngx-lib-files-uploader.js +0 -5
  1020. package/esm2015/files-uploader/public-api.js +0 -6
  1021. package/esm2015/form/field-generator.component.js +0 -220
  1022. package/esm2015/form/form.component.js +0 -1197
  1023. package/esm2015/form/form.model.js +0 -2
  1024. package/esm2015/form/form.module.js +0 -108
  1025. package/esm2015/form/indicators.component.js +0 -21
  1026. package/esm2015/form/internal-button.component.js +0 -166
  1027. package/esm2015/form/internal-carusel.component.js +0 -116
  1028. package/esm2015/form/internal-carusel.service.js +0 -32
  1029. package/esm2015/form/internal-list.component.js +0 -495
  1030. package/esm2015/form/internal-menu.component.js +0 -55
  1031. package/esm2015/form/internal-page.component.js +0 -351
  1032. package/esm2015/form/internal-page.service.js +0 -121
  1033. package/esm2015/form/pepperi-addons-ngx-lib-form.js +0 -14
  1034. package/esm2015/form/public-api.js +0 -7
  1035. package/esm2015/group-buttons/group-buttons.component.js +0 -58
  1036. package/esm2015/group-buttons/group-buttons.module.js +0 -38
  1037. package/esm2015/group-buttons/pepperi-addons-ngx-lib-group-buttons.js +0 -5
  1038. package/esm2015/group-buttons/public-api.js +0 -6
  1039. package/esm2015/icon/icon-generated-all.model.js +0 -101
  1040. package/esm2015/icon/icon-generated.model.js +0 -390
  1041. package/esm2015/icon/icon-registry.service.js +0 -24
  1042. package/esm2015/icon/icon.component.js +0 -125
  1043. package/esm2015/icon/icon.module.js +0 -15
  1044. package/esm2015/icon/icon.service.js +0 -32
  1045. package/esm2015/icon/pepperi-addons-ngx-lib-icon.js +0 -5
  1046. package/esm2015/icon/public-api.js +0 -11
  1047. package/esm2015/image/image.component.js +0 -229
  1048. package/esm2015/image/image.module.js +0 -49
  1049. package/esm2015/image/image.service.js +0 -57
  1050. package/esm2015/image/pepperi-addons-ngx-lib-image.js +0 -5
  1051. package/esm2015/image/public-api.js +0 -7
  1052. package/esm2015/images-filmstrip/images-filmstrip.component.js +0 -375
  1053. package/esm2015/images-filmstrip/images-filmstrip.module.js +0 -71
  1054. package/esm2015/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.js +0 -5
  1055. package/esm2015/images-filmstrip/public-api.js +0 -6
  1056. package/esm2015/link/link.component.js +0 -316
  1057. package/esm2015/link/link.module.js +0 -51
  1058. package/esm2015/link/link.pipes.js +0 -14
  1059. package/esm2015/link/pepperi-addons-ngx-lib-link.js +0 -6
  1060. package/esm2015/link/public-api.js +0 -6
  1061. package/esm2015/list/list-actions.component.js +0 -36
  1062. package/esm2015/list/list-carousel.component.js +0 -95
  1063. package/esm2015/list/list-chooser.component.js +0 -58
  1064. package/esm2015/list/list-pager.component.js +0 -113
  1065. package/esm2015/list/list-sorting.component.js +0 -55
  1066. package/esm2015/list/list-total.component.js +0 -24
  1067. package/esm2015/list/list-views.component.js +0 -72
  1068. package/esm2015/list/list.component.js +0 -1128
  1069. package/esm2015/list/list.model.js +0 -4
  1070. package/esm2015/list/list.module.js +0 -88
  1071. package/esm2015/list/list.pipes.js +0 -40
  1072. package/esm2015/list/pepperi-addons-ngx-lib-list.js +0 -7
  1073. package/esm2015/list/public-api.js +0 -15
  1074. package/esm2015/list/virtual-scroller.js +0 -1079
  1075. package/esm2015/menu/menu-item.component.js +0 -103
  1076. package/esm2015/menu/menu.component.js +0 -174
  1077. package/esm2015/menu/menu.model.js +0 -19
  1078. package/esm2015/menu/menu.module.js +0 -40
  1079. package/esm2015/menu/pepperi-addons-ngx-lib-menu.js +0 -6
  1080. package/esm2015/menu/public-api.js +0 -7
  1081. package/esm2015/ngx-lib.module.js +0 -94
  1082. package/esm2015/page-layout/page-layout.component.js +0 -42
  1083. package/esm2015/page-layout/page-layout.module.js +0 -21
  1084. package/esm2015/page-layout/pepperi-addons-ngx-lib-page-layout.js +0 -5
  1085. package/esm2015/page-layout/public-api.js +0 -6
  1086. package/esm2015/pepperi-addons-ngx-lib.js +0 -9
  1087. package/esm2015/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.js +0 -5
  1088. package/esm2015/profile-data-views-list/profile-data-view/profile-data-view.component.js +0 -39
  1089. package/esm2015/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.js +0 -60
  1090. package/esm2015/profile-data-views-list/profile-data-views-list.component.js +0 -87
  1091. package/esm2015/profile-data-views-list/profile-data-views-list.model.js +0 -2
  1092. package/esm2015/profile-data-views-list/profile-data-views-list.module.js +0 -57
  1093. package/esm2015/profile-data-views-list/public-api.js +0 -9
  1094. package/esm2015/public-api.js +0 -6
  1095. package/esm2015/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.js +0 -7
  1096. package/esm2015/quantity-selector/public-api.js +0 -6
  1097. package/esm2015/quantity-selector/quantity-selector-validation.directive.js +0 -44
  1098. package/esm2015/quantity-selector/quantity-selector.component.js +0 -473
  1099. package/esm2015/quantity-selector/quantity-selector.module.js +0 -53
  1100. package/esm2015/quantity-selector/quantity-selector.pipes.js +0 -19
  1101. package/esm2015/query-builder/common/model/field.js +0 -2
  1102. package/esm2015/query-builder/common/model/filter.js +0 -2
  1103. package/esm2015/query-builder/common/model/legacy.js +0 -2
  1104. package/esm2015/query-builder/common/model/operator-unit.js +0 -42
  1105. package/esm2015/query-builder/common/model/operator.js +0 -266
  1106. package/esm2015/query-builder/common/model/structure.js +0 -2
  1107. package/esm2015/query-builder/common/model/type-map.js +0 -27
  1108. package/esm2015/query-builder/common/model/type.js +0 -6
  1109. package/esm2015/query-builder/common/services/output-query.service.js +0 -113
  1110. package/esm2015/query-builder/common/services/query-structure.service.js +0 -229
  1111. package/esm2015/query-builder/common/services/type-convertor.service.js +0 -40
  1112. package/esm2015/query-builder/pepperi-addons-ngx-lib-query-builder.js +0 -10
  1113. package/esm2015/query-builder/public-api.js +0 -9
  1114. package/esm2015/query-builder/query-builder-item/query-builder-item.component.js +0 -118
  1115. package/esm2015/query-builder/query-builder-section/query-builder-section.component.js +0 -64
  1116. package/esm2015/query-builder/query-builder.component.js +0 -108
  1117. package/esm2015/query-builder/query-builder.module.js +0 -35
  1118. package/esm2015/query-builder/query-builder.service.js +0 -103
  1119. package/esm2015/remote-loader/addon-block-loader.component.js +0 -78
  1120. package/esm2015/remote-loader/addon-block-loader.service.js +0 -62
  1121. package/esm2015/remote-loader/pepperi-addons-ngx-lib-remote-loader.js +0 -5
  1122. package/esm2015/remote-loader/public-api.js +0 -10
  1123. package/esm2015/remote-loader/remote-loader.component.js +0 -118
  1124. package/esm2015/remote-loader/remote-loader.model.js +0 -2
  1125. package/esm2015/remote-loader/remote-loader.module.js +0 -38
  1126. package/esm2015/remote-loader/remote-loader.service.js +0 -66
  1127. package/esm2015/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.js +0 -5
  1128. package/esm2015/rich-html-textarea/public-api.js +0 -6
  1129. package/esm2015/rich-html-textarea/rich-html-textarea.component.js +0 -220
  1130. package/esm2015/rich-html-textarea/rich-html-textarea.module.js +0 -57
  1131. package/esm2015/search/pepperi-addons-ngx-lib-search.js +0 -5
  1132. package/esm2015/search/public-api.js +0 -7
  1133. package/esm2015/search/search.component.js +0 -274
  1134. package/esm2015/search/search.model.js +0 -2
  1135. package/esm2015/search/search.module.js +0 -45
  1136. package/esm2015/select/pepperi-addons-ngx-lib-select.js +0 -5
  1137. package/esm2015/select/public-api.js +0 -6
  1138. package/esm2015/select/select.component.js +0 -212
  1139. package/esm2015/select/select.module.js +0 -43
  1140. package/esm2015/separator/pepperi-addons-ngx-lib-separator.js +0 -5
  1141. package/esm2015/separator/public-api.js +0 -6
  1142. package/esm2015/separator/separator.component.js +0 -63
  1143. package/esm2015/separator/separator.module.js +0 -13
  1144. package/esm2015/side-bar/pepperi-addons-ngx-lib-side-bar.js +0 -5
  1145. package/esm2015/side-bar/public-api.js +0 -7
  1146. package/esm2015/side-bar/side-bar.component.js +0 -131
  1147. package/esm2015/side-bar/side-bar.model.js +0 -2
  1148. package/esm2015/side-bar/side-bar.module.js +0 -34
  1149. package/esm2015/signature/pepperi-addons-ngx-lib-signature.js +0 -5
  1150. package/esm2015/signature/public-api.js +0 -6
  1151. package/esm2015/signature/signature.component.js +0 -234
  1152. package/esm2015/signature/signature.module.js +0 -55
  1153. package/esm2015/size-detector/pepperi-addons-ngx-lib-size-detector.js +0 -5
  1154. package/esm2015/size-detector/public-api.js +0 -6
  1155. package/esm2015/size-detector/size-detector.component.js +0 -89
  1156. package/esm2015/size-detector/size-detector.module.js +0 -22
  1157. package/esm2015/slider/pepperi-addons-ngx-lib-slider.js +0 -5
  1158. package/esm2015/slider/public-api.js +0 -6
  1159. package/esm2015/slider/slider.component.js +0 -96
  1160. package/esm2015/slider/slider.module.js +0 -25
  1161. package/esm2015/smart-filters/boolean-filter/boolean-filter.component.js +0 -71
  1162. package/esm2015/smart-filters/common/filter-actions.component.js +0 -26
  1163. package/esm2015/smart-filters/common/model/base-filter-component.js +0 -292
  1164. package/esm2015/smart-filters/common/model/creator.js +0 -76
  1165. package/esm2015/smart-filters/common/model/field.js +0 -117
  1166. package/esm2015/smart-filters/common/model/filter.js +0 -2
  1167. package/esm2015/smart-filters/common/model/operator.js +0 -271
  1168. package/esm2015/smart-filters/common/model/type.js +0 -2
  1169. package/esm2015/smart-filters/date-filter/date-filter.component.js +0 -164
  1170. package/esm2015/smart-filters/multi-select-filter/multi-select-filter.component.js +0 -191
  1171. package/esm2015/smart-filters/number-filter/number-filter.component.js +0 -110
  1172. package/esm2015/smart-filters/pepperi-addons-ngx-lib-smart-filters.js +0 -5
  1173. package/esm2015/smart-filters/public-api.js +0 -19
  1174. package/esm2015/smart-filters/smart-filters.component.js +0 -130
  1175. package/esm2015/smart-filters/smart-filters.module.js +0 -91
  1176. package/esm2015/smart-filters/text-filter/text-filter.component.js +0 -86
  1177. package/esm2015/snack-bar/default-snack-bar.component.js +0 -28
  1178. package/esm2015/snack-bar/pepperi-addons-ngx-lib-snack-bar.js +0 -6
  1179. package/esm2015/snack-bar/public-api.js +0 -8
  1180. package/esm2015/snack-bar/snack-bar.component.js +0 -26
  1181. package/esm2015/snack-bar/snack-bar.model.js +0 -7
  1182. package/esm2015/snack-bar/snack-bar.module.js +0 -42
  1183. package/esm2015/snack-bar/snack-bar.service.js +0 -63
  1184. package/esm2015/textarea/pepperi-addons-ngx-lib-textarea.js +0 -5
  1185. package/esm2015/textarea/public-api.js +0 -6
  1186. package/esm2015/textarea/textarea.component.js +0 -161
  1187. package/esm2015/textarea/textarea.module.js +0 -51
  1188. package/esm2015/textbox/pepperi-addons-ngx-lib-textbox.js +0 -6
  1189. package/esm2015/textbox/public-api.js +0 -6
  1190. package/esm2015/textbox/textbox-validation.directive.js +0 -86
  1191. package/esm2015/textbox/textbox.component.js +0 -412
  1192. package/esm2015/textbox/textbox.module.js +0 -45
  1193. package/esm2015/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.js +0 -5
  1194. package/esm2015/textbox-icon/public-api.js +0 -6
  1195. package/esm2015/textbox-icon/textbox-icon.component.js +0 -41
  1196. package/esm2015/textbox-icon/textbox-icon.module.js +0 -47
  1197. package/esm2015/top-bar/pepperi-addons-ngx-lib-top-bar.js +0 -5
  1198. package/esm2015/top-bar/public-api.js +0 -7
  1199. package/esm2015/top-bar/top-bar.component.js +0 -99
  1200. package/esm2015/top-bar/top-bar.model.js +0 -2
  1201. package/esm2015/top-bar/top-bar.module.js +0 -41
  1202. package/fesm2015/pepperi-addons-ngx-lib-address.js +0 -136
  1203. package/fesm2015/pepperi-addons-ngx-lib-address.js.map +0 -1
  1204. package/fesm2015/pepperi-addons-ngx-lib-attachment.js +0 -246
  1205. package/fesm2015/pepperi-addons-ngx-lib-attachment.js.map +0 -1
  1206. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.js +0 -128
  1207. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.js.map +0 -1
  1208. package/fesm2015/pepperi-addons-ngx-lib-button.js +0 -169
  1209. package/fesm2015/pepperi-addons-ngx-lib-button.js.map +0 -1
  1210. package/fesm2015/pepperi-addons-ngx-lib-carousel.js +0 -760
  1211. package/fesm2015/pepperi-addons-ngx-lib-carousel.js.map +0 -1
  1212. package/fesm2015/pepperi-addons-ngx-lib-checkbox.js +0 -200
  1213. package/fesm2015/pepperi-addons-ngx-lib-checkbox.js.map +0 -1
  1214. package/fesm2015/pepperi-addons-ngx-lib-color.js +0 -353
  1215. package/fesm2015/pepperi-addons-ngx-lib-color.js.map +0 -1
  1216. package/fesm2015/pepperi-addons-ngx-lib-date.js +0 -350
  1217. package/fesm2015/pepperi-addons-ngx-lib-date.js.map +0 -1
  1218. package/fesm2015/pepperi-addons-ngx-lib-dialog.js +0 -223
  1219. package/fesm2015/pepperi-addons-ngx-lib-dialog.js.map +0 -1
  1220. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.js +0 -166
  1221. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.js.map +0 -1
  1222. package/fesm2015/pepperi-addons-ngx-lib-field-title.js +0 -73
  1223. package/fesm2015/pepperi-addons-ngx-lib-field-title.js.map +0 -1
  1224. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.js +0 -276
  1225. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.js.map +0 -1
  1226. package/fesm2015/pepperi-addons-ngx-lib-form.js +0 -2854
  1227. package/fesm2015/pepperi-addons-ngx-lib-form.js.map +0 -1
  1228. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.js +0 -104
  1229. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.js.map +0 -1
  1230. package/fesm2015/pepperi-addons-ngx-lib-icon.js +0 -688
  1231. package/fesm2015/pepperi-addons-ngx-lib-icon.js.map +0 -1
  1232. package/fesm2015/pepperi-addons-ngx-lib-image.js +0 -337
  1233. package/fesm2015/pepperi-addons-ngx-lib-image.js.map +0 -1
  1234. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.js +0 -438
  1235. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.js.map +0 -1
  1236. package/fesm2015/pepperi-addons-ngx-lib-link.js +0 -384
  1237. package/fesm2015/pepperi-addons-ngx-lib-link.js.map +0 -1
  1238. package/fesm2015/pepperi-addons-ngx-lib-list.js +0 -2770
  1239. package/fesm2015/pepperi-addons-ngx-lib-list.js.map +0 -1
  1240. package/fesm2015/pepperi-addons-ngx-lib-menu.js +0 -338
  1241. package/fesm2015/pepperi-addons-ngx-lib-menu.js.map +0 -1
  1242. package/fesm2015/pepperi-addons-ngx-lib-page-layout.js +0 -70
  1243. package/fesm2015/pepperi-addons-ngx-lib-page-layout.js.map +0 -1
  1244. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.js +0 -247
  1245. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.js.map +0 -1
  1246. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.js +0 -592
  1247. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.js.map +0 -1
  1248. package/fesm2015/pepperi-addons-ngx-lib-query-builder.js +0 -1128
  1249. package/fesm2015/pepperi-addons-ngx-lib-query-builder.js.map +0 -1
  1250. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.js +0 -358
  1251. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.js.map +0 -1
  1252. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.js +0 -284
  1253. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.js.map +0 -1
  1254. package/fesm2015/pepperi-addons-ngx-lib-search.js +0 -326
  1255. package/fesm2015/pepperi-addons-ngx-lib-search.js.map +0 -1
  1256. package/fesm2015/pepperi-addons-ngx-lib-select.js +0 -263
  1257. package/fesm2015/pepperi-addons-ngx-lib-select.js.map +0 -1
  1258. package/fesm2015/pepperi-addons-ngx-lib-separator.js +0 -85
  1259. package/fesm2015/pepperi-addons-ngx-lib-separator.js.map +0 -1
  1260. package/fesm2015/pepperi-addons-ngx-lib-side-bar.js +0 -172
  1261. package/fesm2015/pepperi-addons-ngx-lib-side-bar.js.map +0 -1
  1262. package/fesm2015/pepperi-addons-ngx-lib-signature.js +0 -296
  1263. package/fesm2015/pepperi-addons-ngx-lib-signature.js.map +0 -1
  1264. package/fesm2015/pepperi-addons-ngx-lib-size-detector.js +0 -119
  1265. package/fesm2015/pepperi-addons-ngx-lib-size-detector.js.map +0 -1
  1266. package/fesm2015/pepperi-addons-ngx-lib-slider.js +0 -129
  1267. package/fesm2015/pepperi-addons-ngx-lib-slider.js.map +0 -1
  1268. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.js +0 -1595
  1269. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.js.map +0 -1
  1270. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.js +0 -166
  1271. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.js.map +0 -1
  1272. package/fesm2015/pepperi-addons-ngx-lib-textarea.js +0 -219
  1273. package/fesm2015/pepperi-addons-ngx-lib-textarea.js.map +0 -1
  1274. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.js +0 -96
  1275. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.js.map +0 -1
  1276. package/fesm2015/pepperi-addons-ngx-lib-textbox.js +0 -547
  1277. package/fesm2015/pepperi-addons-ngx-lib-textbox.js.map +0 -1
  1278. package/fesm2015/pepperi-addons-ngx-lib-top-bar.js +0 -146
  1279. package/fesm2015/pepperi-addons-ngx-lib-top-bar.js.map +0 -1
  1280. package/fesm2015/pepperi-addons-ngx-lib.js +0 -4461
  1281. package/fesm2015/pepperi-addons-ngx-lib.js.map +0 -1
  1282. package/field-title/package.json +0 -11
  1283. package/field-title/pepperi-addons-ngx-lib-field-title.d.ts +0 -4
  1284. package/field-title/pepperi-addons-ngx-lib-field-title.metadata.json +0 -1
  1285. package/files-uploader/package.json +0 -15
  1286. package/files-uploader/pepperi-addons-ngx-lib-files-uploader.d.ts +0 -4
  1287. package/files-uploader/pepperi-addons-ngx-lib-files-uploader.metadata.json +0 -1
  1288. package/form/package.json +0 -15
  1289. package/form/pepperi-addons-ngx-lib-form.d.ts +0 -13
  1290. package/form/pepperi-addons-ngx-lib-form.metadata.json +0 -1
  1291. package/group-buttons/package.json +0 -11
  1292. package/group-buttons/pepperi-addons-ngx-lib-group-buttons.d.ts +0 -4
  1293. package/group-buttons/pepperi-addons-ngx-lib-group-buttons.metadata.json +0 -1
  1294. package/icon/package.json +0 -11
  1295. package/icon/pepperi-addons-ngx-lib-icon.d.ts +0 -4
  1296. package/icon/pepperi-addons-ngx-lib-icon.metadata.json +0 -1
  1297. package/image/package.json +0 -14
  1298. package/image/pepperi-addons-ngx-lib-image.d.ts +0 -4
  1299. package/image/pepperi-addons-ngx-lib-image.metadata.json +0 -1
  1300. package/images-filmstrip/package.json +0 -17
  1301. package/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.d.ts +0 -4
  1302. package/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.metadata.json +0 -1
  1303. package/link/package.json +0 -14
  1304. package/link/pepperi-addons-ngx-lib-link.d.ts +0 -5
  1305. package/link/pepperi-addons-ngx-lib-link.metadata.json +0 -1
  1306. package/list/package.json +0 -15
  1307. package/list/pepperi-addons-ngx-lib-list.d.ts +0 -6
  1308. package/list/pepperi-addons-ngx-lib-list.metadata.json +0 -1
  1309. package/menu/package.json +0 -11
  1310. package/menu/pepperi-addons-ngx-lib-menu.d.ts +0 -5
  1311. package/menu/pepperi-addons-ngx-lib-menu.metadata.json +0 -1
  1312. package/page-layout/package.json +0 -11
  1313. package/page-layout/pepperi-addons-ngx-lib-page-layout.d.ts +0 -4
  1314. package/page-layout/pepperi-addons-ngx-lib-page-layout.metadata.json +0 -1
  1315. package/pepperi-addons-ngx-lib.d.ts +0 -8
  1316. package/pepperi-addons-ngx-lib.metadata.json +0 -1
  1317. package/profile-data-views-list/package.json +0 -15
  1318. package/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.d.ts +0 -4
  1319. package/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.metadata.json +0 -1
  1320. package/quantity-selector/package.json +0 -15
  1321. package/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.d.ts +0 -6
  1322. package/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.metadata.json +0 -1
  1323. package/query-builder/package.json +0 -14
  1324. package/query-builder/pepperi-addons-ngx-lib-query-builder.d.ts +0 -9
  1325. package/query-builder/pepperi-addons-ngx-lib-query-builder.metadata.json +0 -1
  1326. package/remote-loader/package.json +0 -14
  1327. package/remote-loader/pepperi-addons-ngx-lib-remote-loader.d.ts +0 -4
  1328. package/remote-loader/pepperi-addons-ngx-lib-remote-loader.metadata.json +0 -1
  1329. package/rich-html-textarea/package.json +0 -15
  1330. package/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.d.ts +0 -4
  1331. package/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.metadata.json +0 -1
  1332. package/search/package.json +0 -14
  1333. package/search/pepperi-addons-ngx-lib-search.d.ts +0 -4
  1334. package/search/pepperi-addons-ngx-lib-search.metadata.json +0 -1
  1335. package/select/package.json +0 -14
  1336. package/select/pepperi-addons-ngx-lib-select.d.ts +0 -4
  1337. package/select/pepperi-addons-ngx-lib-select.metadata.json +0 -1
  1338. package/separator/package.json +0 -11
  1339. package/separator/pepperi-addons-ngx-lib-separator.d.ts +0 -4
  1340. package/separator/pepperi-addons-ngx-lib-separator.metadata.json +0 -1
  1341. package/side-bar/package.json +0 -11
  1342. package/side-bar/pepperi-addons-ngx-lib-side-bar.d.ts +0 -4
  1343. package/side-bar/pepperi-addons-ngx-lib-side-bar.metadata.json +0 -1
  1344. package/signature/package.json +0 -15
  1345. package/signature/pepperi-addons-ngx-lib-signature.d.ts +0 -4
  1346. package/signature/pepperi-addons-ngx-lib-signature.metadata.json +0 -1
  1347. package/size-detector/package.json +0 -14
  1348. package/size-detector/pepperi-addons-ngx-lib-size-detector.d.ts +0 -4
  1349. package/size-detector/pepperi-addons-ngx-lib-size-detector.metadata.json +0 -1
  1350. package/slider/package.json +0 -11
  1351. package/slider/pepperi-addons-ngx-lib-slider.d.ts +0 -4
  1352. package/slider/pepperi-addons-ngx-lib-slider.metadata.json +0 -1
  1353. package/smart-filters/package.json +0 -20
  1354. package/smart-filters/pepperi-addons-ngx-lib-smart-filters.d.ts +0 -4
  1355. package/smart-filters/pepperi-addons-ngx-lib-smart-filters.metadata.json +0 -1
  1356. package/snack-bar/package.json +0 -15
  1357. package/snack-bar/pepperi-addons-ngx-lib-snack-bar.d.ts +0 -5
  1358. package/snack-bar/pepperi-addons-ngx-lib-snack-bar.metadata.json +0 -1
  1359. package/textarea/package.json +0 -14
  1360. package/textarea/pepperi-addons-ngx-lib-textarea.d.ts +0 -4
  1361. package/textarea/pepperi-addons-ngx-lib-textarea.metadata.json +0 -1
  1362. package/textbox/package.json +0 -14
  1363. package/textbox/pepperi-addons-ngx-lib-textbox.d.ts +0 -5
  1364. package/textbox/pepperi-addons-ngx-lib-textbox.metadata.json +0 -1
  1365. package/textbox-icon/package.json +0 -11
  1366. package/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.d.ts +0 -4
  1367. package/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.metadata.json +0 -1
  1368. package/top-bar/package.json +0 -11
  1369. package/top-bar/pepperi-addons-ngx-lib-top-bar.d.ts +0 -4
  1370. package/top-bar/pepperi-addons-ngx-lib-top-bar.metadata.json +0 -1
@@ -0,0 +1,1218 @@
1
+ import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, } from '@angular/core';
2
+ import { Validators, } from '@angular/forms';
3
+ import { PepDialogData, } from '@pepperi-addons/ngx-lib/dialog';
4
+ import { FIELD_TYPE, PepCustomizationService, PepTextboxField, PepSelectField, PepInternalMenuField, PepQuantitySelectorField, PepAddressField, PepIndicatorsField, PepInternalPageField, PepInternalCaruselField, PepInternalButtonField, PepAttachmentField, PepSignatureField, PepImageField, PepImagesField, PepLinkField, PepTextareaField, PepRichHtmlTextareaField, PepDateField, PepCheckboxField, PepSeparatorField, PepPlaceholderField, X_ALIGNMENT_TYPE, Y_ALIGNMENT_TYPE, DEFAULT_VERTICAL_ALIGNMENT, DEFAULT_HORIZONTAL_ALIGNMENT, } from '@pepperi-addons/ngx-lib';
5
+ import { BehaviorSubject } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@pepperi-addons/ngx-lib/dialog";
8
+ import * as i2 from "@pepperi-addons/ngx-lib";
9
+ import * as i3 from "@angular/forms";
10
+ import * as i4 from "@ngx-translate/core";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "@angular/material/grid-list";
13
+ import * as i7 from "@pepperi-addons/ngx-lib/checkbox";
14
+ import * as i8 from "@pepperi-addons/ngx-lib/date";
15
+ import * as i9 from "@pepperi-addons/ngx-lib/image";
16
+ import * as i10 from "@pepperi-addons/ngx-lib/quantity-selector";
17
+ import * as i11 from "@pepperi-addons/ngx-lib/signature";
18
+ import * as i12 from "@pepperi-addons/ngx-lib/textarea";
19
+ import * as i13 from "./field-generator.component";
20
+ import * as i14 from "./internal-button.component";
21
+ export class PepFormComponent {
22
+ // eventServiceSub: Subscription;
23
+ // public jsonLib = JSON;
24
+ constructor(dialogService, customizationService, layoutService, fb, differs, translate) {
25
+ this.dialogService = dialogService;
26
+ this.customizationService = customizationService;
27
+ this.layoutService = layoutService;
28
+ this.fb = fb;
29
+ this.translate = translate;
30
+ this.isInternal = true;
31
+ this.isReport = false;
32
+ this.lockEvents = false;
33
+ this.canEditObject = true;
34
+ this._data = null;
35
+ this.isActive = false;
36
+ this.layoutType = 'card';
37
+ // @Input() listType = '';
38
+ this.objectId = '0';
39
+ this.parentId = '0';
40
+ this.searchCode = '0';
41
+ this.showTitle = true;
42
+ this.firstFieldAsLink = false;
43
+ this.checkForChanges = null;
44
+ this.valueChange = new EventEmitter();
45
+ this.formValidationChange = new EventEmitter();
46
+ this.fieldClick = new EventEmitter();
47
+ this.internalFormFieldClick = new EventEmitter();
48
+ this.internalFormFieldChange = new EventEmitter();
49
+ this.isLocked = false;
50
+ // payLoad = '';
51
+ this.rows = [];
52
+ this.fields = [];
53
+ this._fieldsSubject = new BehaviorSubject([]);
54
+ this.columns = 1;
55
+ this.hasMenuFloatingOnOtherField = false;
56
+ this.indicatorsDataField = null;
57
+ this._shouldReloadForm = false;
58
+ // store the initial value to compare with
59
+ this.differ = differs.find({}).create();
60
+ }
61
+ set data(value) {
62
+ const shouldReload = this.shouldReloadForm || !this._data;
63
+ this._data = value;
64
+ if (shouldReload) {
65
+ this._shouldReloadForm = false;
66
+ this.initForm();
67
+ }
68
+ else {
69
+ this.updateForm();
70
+ }
71
+ }
72
+ get data() {
73
+ return this._data;
74
+ }
75
+ set lockFields(value) {
76
+ this.isLocked = value;
77
+ }
78
+ get fields$() {
79
+ return this._fieldsSubject.asObservable();
80
+ }
81
+ get shouldReloadForm() {
82
+ return this._shouldReloadForm;
83
+ }
84
+ convertXAlignToHorizontalAlign(xAlign) {
85
+ let res = DEFAULT_HORIZONTAL_ALIGNMENT;
86
+ if (xAlign === X_ALIGNMENT_TYPE.None ||
87
+ xAlign === X_ALIGNMENT_TYPE.Left) {
88
+ res = 'left';
89
+ }
90
+ else if (xAlign === X_ALIGNMENT_TYPE.Right) {
91
+ res = 'right';
92
+ }
93
+ else {
94
+ res = 'center';
95
+ }
96
+ return res;
97
+ }
98
+ convertYAlignToVerticalAlign(yAlign) {
99
+ let res = DEFAULT_VERTICAL_ALIGNMENT;
100
+ if (yAlign === Y_ALIGNMENT_TYPE.None ||
101
+ yAlign === Y_ALIGNMENT_TYPE.Top) {
102
+ res = 'top';
103
+ }
104
+ else if (yAlign === Y_ALIGNMENT_TYPE.Bottom) {
105
+ res = 'bottom';
106
+ }
107
+ else {
108
+ res = 'middle';
109
+ }
110
+ return res;
111
+ }
112
+ convertOptionalValues(optionalValues) {
113
+ if (optionalValues && optionalValues.length > 0) {
114
+ return optionalValues.map((ov) => {
115
+ return { key: ov.Key, value: ov.Value };
116
+ });
117
+ }
118
+ else {
119
+ return [];
120
+ }
121
+ }
122
+ convertAddressFields(controlField, addressFields, canEditObject) {
123
+ const fields = [];
124
+ addressFields.forEach((field) => {
125
+ let customField;
126
+ const placeholder = field.ApiName;
127
+ if (field.ApiName.toLowerCase().indexOf('street') >= 0) {
128
+ customField = new PepTextboxField({
129
+ key: field.ApiName,
130
+ label: field.ApiName,
131
+ type: 'text',
132
+ placeholder,
133
+ readonly: !canEditObject,
134
+ disabled: !field.Enabled || !canEditObject,
135
+ hidden: false,
136
+ mandatory: false,
137
+ value: field.Value,
138
+ formattedValue: field.FormattedValue,
139
+ row: 0,
140
+ rowSpan: 1,
141
+ col: 0,
142
+ colSpan: 2,
143
+ xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
144
+ yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
145
+ order: 0,
146
+ });
147
+ }
148
+ else if (field.ApiName.toLowerCase().indexOf('city') >= 0) {
149
+ customField = new PepTextboxField({
150
+ key: field.ApiName,
151
+ label: field.ApiName,
152
+ type: 'text',
153
+ placeholder,
154
+ readonly: !canEditObject,
155
+ disabled: !field.Enabled || !canEditObject,
156
+ hidden: false,
157
+ mandatory: false,
158
+ value: field.Value,
159
+ formattedValue: field.FormattedValue,
160
+ row: 0,
161
+ rowSpan: 1,
162
+ col: 2,
163
+ colSpan: 1,
164
+ xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
165
+ yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
166
+ order: 1,
167
+ });
168
+ }
169
+ else if (field.ApiName.toLowerCase().indexOf('state') >= 0) {
170
+ customField = new PepSelectField({
171
+ key: field.ApiName,
172
+ label: field.ApiName,
173
+ placeholder,
174
+ options: this.convertOptionalValues(field.OptionalValues),
175
+ readonly: !canEditObject,
176
+ disabled: !field.Enabled || !canEditObject,
177
+ hidden: false,
178
+ mandatory: false,
179
+ value: field.Value,
180
+ formattedValue: field.FormattedValue,
181
+ row: 1,
182
+ rowSpan: 1,
183
+ col: 0,
184
+ colSpan: 1,
185
+ xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
186
+ yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
187
+ order: 2,
188
+ });
189
+ }
190
+ else if (field.ApiName.toLowerCase().indexOf('zipcode') >= 0) {
191
+ customField = new PepTextboxField({
192
+ key: field.ApiName,
193
+ label: field.ApiName,
194
+ type: 'text',
195
+ placeholder,
196
+ readonly: !canEditObject,
197
+ disabled: !field.Enabled || !canEditObject,
198
+ hidden: false,
199
+ mandatory: false,
200
+ value: field.Value,
201
+ formattedValue: field.FormattedValue,
202
+ row: 1,
203
+ rowSpan: 1,
204
+ col: 1,
205
+ colSpan: 1,
206
+ xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
207
+ yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
208
+ order: 3,
209
+ });
210
+ }
211
+ else if (field.ApiName.toLowerCase().indexOf('country') >= 0) {
212
+ customField = new PepSelectField({
213
+ key: field.ApiName,
214
+ label: field.ApiName,
215
+ placeholder,
216
+ options: this.convertOptionalValues(field.OptionalValues),
217
+ readonly: !canEditObject,
218
+ disabled: !field.Enabled || !canEditObject,
219
+ hidden: false,
220
+ mandatory: false,
221
+ value: field.Value,
222
+ formattedValue: field.FormattedValue,
223
+ row: 2,
224
+ rowSpan: 1,
225
+ col: 2,
226
+ colSpan: 1,
227
+ xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
228
+ yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
229
+ order: 4,
230
+ });
231
+ }
232
+ fields.push(customField);
233
+ });
234
+ return fields.sort((n1, n2) => n1.order > n2.order ? 1 : n1.order < n2.order ? -1 : 0);
235
+ }
236
+ isMatrixField(apiNameToCheck) {
237
+ return apiNameToCheck.indexOf('Matrix') >= 0;
238
+ }
239
+ doesFieldHavaFloatingField(controlField, floatingField) {
240
+ let hasFloatingField = false;
241
+ if (floatingField.Layout.Y >= controlField.Layout.Y &&
242
+ floatingField.Layout.Y <
243
+ controlField.Layout.Y + controlField.Layout.Height &&
244
+ floatingField.Layout.X >= controlField.Layout.X &&
245
+ floatingField.Layout.X <
246
+ controlField.Layout.X + controlField.Layout.Width) {
247
+ hasFloatingField = true;
248
+ }
249
+ return hasFloatingField;
250
+ }
251
+ getOptionsForCustomField(controlField, dataField, canEditObject) {
252
+ if (!controlField || !dataField) {
253
+ return;
254
+ }
255
+ const placeholder = controlField.ReadOnly || !canEditObject ? '' : controlField.Title;
256
+ return {
257
+ key: controlField.ApiName,
258
+ label: controlField.Title,
259
+ accessory: dataField.Accessory,
260
+ placeholder,
261
+ readonly: controlField.ReadOnly || !canEditObject,
262
+ disabled: !dataField.Enabled || !canEditObject,
263
+ hidden: controlField.Hidden,
264
+ mandatory: controlField.Mandatory,
265
+ value: dataField.Value,
266
+ formattedValue: dataField.FormattedValue,
267
+ additionalValue: dataField.AdditionalValue,
268
+ row: controlField.Layout.Y,
269
+ rowSpan: controlField.Layout.Height,
270
+ col: controlField.Layout.X,
271
+ colSpan: controlField.Layout.Width,
272
+ xAlignment: this.convertXAlignToHorizontalAlign(controlField.Layout.XAlignment),
273
+ yAlignment: this.convertYAlignToVerticalAlign(controlField.Layout.YAlignment),
274
+ options: this.convertOptionalValues(dataField.OptionalValues),
275
+ groupFields: undefined,
276
+ maxFieldCharacters: controlField.MaxFieldCharacters,
277
+ minValue: controlField.MinValue,
278
+ maxValue: controlField.MaxValue,
279
+ // hasMenu: hasMenu,
280
+ // hasCampaign: hasCampaign,
281
+ // hasIndicators: hasIndicators,
282
+ textColor: dataField.TextColor,
283
+ visible: dataField.Visible,
284
+ };
285
+ }
286
+ convertToCustomField(controlField, dataField, canEditObject, menuField, hasCampaignField, indicatorsField, objectId, parentId, searchCode) {
287
+ let customField;
288
+ const options = this.getOptionsForCustomField(controlField, dataField, canEditObject);
289
+ if (controlField.ApiName === 'ObjectMenu') {
290
+ options.type = 'menu';
291
+ customField = new PepInternalMenuField(options);
292
+ }
293
+ else if (controlField.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
294
+ controlField.FieldType ===
295
+ FIELD_TYPE.NumberIntegerQuantitySelector ||
296
+ controlField.ApiName === 'QuantitySelector' ||
297
+ controlField.ApiName === 'UnitsQuantity' ||
298
+ controlField.ApiName.indexOf('size_') === 0) {
299
+ if (dataField.FieldType === FIELD_TYPE.InternalLink) {
300
+ options.type = 'button';
301
+ }
302
+ else if (dataField.FieldType === FIELD_TYPE.Package) {
303
+ options.type = 'packageButton';
304
+ }
305
+ else if (dataField.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
306
+ dataField.FieldType === FIELD_TYPE.NumberReal) {
307
+ options.type = 'qs';
308
+ options.allowDecimal = true;
309
+ }
310
+ else if (dataField.FieldType ===
311
+ FIELD_TYPE.NumberIntegerQuantitySelector ||
312
+ dataField.FieldType === FIELD_TYPE.NumberInteger) {
313
+ options.type = 'qs';
314
+ options.allowDecimal = false;
315
+ }
316
+ else if (dataField.FieldType === FIELD_TYPE.NumberIntegerForMatrix) {
317
+ options.type = 'qsForMatrix';
318
+ options.allowDecimal = false;
319
+ }
320
+ else if (dataField.FieldType === FIELD_TYPE.NumberRealForMatrix) {
321
+ options.type = 'qsForMatrix';
322
+ options.allowDecimal = true;
323
+ }
324
+ options.notificationInfo = dataField.NotificationInfo;
325
+ customField = new PepQuantitySelectorField(options);
326
+ }
327
+ else {
328
+ // HACK: need to remove this..
329
+ if (dataField.FieldType === FIELD_TYPE.Indicators &&
330
+ this.isMatrixField(dataField.ApiName)) {
331
+ dataField.FieldType = FIELD_TYPE.InternalPage;
332
+ }
333
+ switch (dataField.FieldType) {
334
+ case FIELD_TYPE.Address: {
335
+ const canEditGroupObject = controlField.ReadOnly
336
+ ? false
337
+ : canEditObject;
338
+ options.groupFields = this.convertAddressFields(controlField, dataField.GroupFields, canEditGroupObject);
339
+ customField = new PepAddressField(options);
340
+ break;
341
+ }
342
+ case FIELD_TYPE.Indicators: {
343
+ // options['type'] = 'indicators'; // Not needed this is PepIndicatorsField.
344
+ customField = new PepIndicatorsField(options);
345
+ break;
346
+ }
347
+ case FIELD_TYPE.InternalPage: {
348
+ if (this.isMatrixField(controlField.ApiName)) {
349
+ options.rowSpan = controlField.Layout.Height;
350
+ options.objectId = objectId;
351
+ options.parentId = parentId;
352
+ options.searchCode = searchCode;
353
+ customField = new PepInternalPageField(options);
354
+ }
355
+ else {
356
+ // Not supported
357
+ }
358
+ break;
359
+ }
360
+ case FIELD_TYPE.RelatedObjectsCards: {
361
+ options.rowSpan = controlField.Layout.Height;
362
+ options.searchCode = searchCode;
363
+ options.pageInfo = dataField.UIPageInfo;
364
+ customField = new PepInternalCaruselField(options);
365
+ break;
366
+ }
367
+ case FIELD_TYPE.Link: {
368
+ options.type = 'link';
369
+ customField = new PepLinkField(options);
370
+ break;
371
+ }
372
+ case FIELD_TYPE.InternalLink:
373
+ case FIELD_TYPE.Button: {
374
+ options.type = 'button';
375
+ customField = new PepInternalButtonField(options);
376
+ break;
377
+ }
378
+ case FIELD_TYPE.Attachment: {
379
+ // options.type = 'attachment';
380
+ customField = new PepAttachmentField(options);
381
+ break;
382
+ }
383
+ case FIELD_TYPE.Signature: {
384
+ // options.type = 'signature';
385
+ customField = new PepSignatureField(options);
386
+ break;
387
+ }
388
+ case FIELD_TYPE.Image:
389
+ case FIELD_TYPE.ImageURL: {
390
+ // options.type = 'image';
391
+ options.menuField =
392
+ menuField &&
393
+ this.doesFieldHavaFloatingField(controlField, menuField)
394
+ ? menuField
395
+ : null;
396
+ options.hasCampaignField =
397
+ hasCampaignField &&
398
+ this.doesFieldHavaFloatingField(controlField, hasCampaignField)
399
+ ? hasCampaignField
400
+ : null;
401
+ options.indicatorsField =
402
+ indicatorsField &&
403
+ this.doesFieldHavaFloatingField(controlField, indicatorsField)
404
+ ? indicatorsField
405
+ : null;
406
+ customField = new PepImageField(options);
407
+ break;
408
+ }
409
+ case FIELD_TYPE.Images: {
410
+ // options.type = 'images';
411
+ customField = new PepImagesField(options);
412
+ break;
413
+ }
414
+ case FIELD_TYPE.Email: {
415
+ options.type = 'email';
416
+ customField = new PepLinkField(options);
417
+ break;
418
+ }
419
+ case FIELD_TYPE.Phone: {
420
+ options.type = 'phone';
421
+ customField = new PepLinkField(options);
422
+ break;
423
+ }
424
+ case FIELD_TYPE.Duration: {
425
+ options.type = 'duration';
426
+ customField = new PepTextboxField(options);
427
+ break;
428
+ }
429
+ case FIELD_TYPE.Default:
430
+ case FIELD_TYPE.TextBox:
431
+ case FIELD_TYPE.LimitedLengthTextBox:
432
+ case FIELD_TYPE.TextHeader:
433
+ case FIELD_TYPE.CalculatedString:
434
+ case FIELD_TYPE.MapDataString: {
435
+ customField = new PepTextboxField(options);
436
+ break;
437
+ }
438
+ case FIELD_TYPE.TextArea: {
439
+ customField = new PepTextareaField(options);
440
+ break;
441
+ }
442
+ case FIELD_TYPE.RichTextHTML: {
443
+ customField = new PepRichHtmlTextareaField(options);
444
+ break;
445
+ }
446
+ case FIELD_TYPE.Date:
447
+ case FIELD_TYPE.LimitedDate:
448
+ case FIELD_TYPE.CalculatedDate:
449
+ case FIELD_TYPE.DateAndTime: {
450
+ options.type =
451
+ dataField.FieldType === FIELD_TYPE.DateAndTime
452
+ ? 'datetime'
453
+ : 'date';
454
+ customField = new PepDateField(options);
455
+ break;
456
+ }
457
+ case FIELD_TYPE.NumberInteger:
458
+ case FIELD_TYPE.CalculatedInt:
459
+ case FIELD_TYPE.MapDataInt: {
460
+ options.type = 'int';
461
+ customField = new PepTextboxField(options);
462
+ break;
463
+ }
464
+ case FIELD_TYPE.Percentage: {
465
+ options.type = 'percentage';
466
+ customField = new PepTextboxField(options);
467
+ break;
468
+ }
469
+ case FIELD_TYPE.Currency: {
470
+ options.type = 'currency';
471
+ customField = new PepTextboxField(options);
472
+ break;
473
+ }
474
+ case FIELD_TYPE.NumberReal:
475
+ case FIELD_TYPE.CalculatedReal:
476
+ case FIELD_TYPE.MapDataReal:
477
+ case FIELD_TYPE.Sum:
478
+ case FIELD_TYPE.Totals: {
479
+ options.type = 'real';
480
+ customField = new PepTextboxField(options);
481
+ break;
482
+ }
483
+ case FIELD_TYPE.Boolean:
484
+ case FIELD_TYPE.CalculatedBool: {
485
+ customField = new PepCheckboxField(options);
486
+ break;
487
+ }
488
+ case FIELD_TYPE.BooleanText: {
489
+ options.type = 'booleanText';
490
+ customField = new PepCheckboxField(options);
491
+ break;
492
+ }
493
+ case FIELD_TYPE.ComboBox:
494
+ case FIELD_TYPE.EmptyComboBox:
495
+ case FIELD_TYPE.MapDataDropDown: {
496
+ // options.type = 'select';
497
+ customField = new PepSelectField(options);
498
+ break;
499
+ }
500
+ case FIELD_TYPE.MultiTickBox:
501
+ case FIELD_TYPE.MultiTickBoxToComboBox:
502
+ case FIELD_TYPE.EmptyMultiTickBox: {
503
+ options.type = 'multi';
504
+ customField = new PepSelectField(options);
505
+ break;
506
+ }
507
+ case FIELD_TYPE.GuidReferenceType: {
508
+ options.type = 'reference';
509
+ options.referenceObjectType = dataField.ReferenceObjectType;
510
+ options.referenceObjectSubType =
511
+ dataField.ReferenceObjectSubType;
512
+ options.referenceObjectInternalType =
513
+ dataField.ReferenceObjectInternalType;
514
+ customField = new PepInternalButtonField(options);
515
+ break;
516
+ }
517
+ case FIELD_TYPE.ListOfObjects: {
518
+ options.type = 'listofobjects';
519
+ customField = new PepInternalButtonField(options);
520
+ break;
521
+ }
522
+ case FIELD_TYPE.Separator: {
523
+ customField = new PepSeparatorField(options);
524
+ break;
525
+ }
526
+ /*
527
+ case FIELD_TYPE.Images: return that.field(value);
528
+ */
529
+ case FIELD_TYPE.NumberRealQuantitySelector:
530
+ case FIELD_TYPE.NumberIntegerQuantitySelector: {
531
+ options.type = 'qs';
532
+ options.allowDecimal =
533
+ dataField.FieldType ===
534
+ FIELD_TYPE.NumberRealQuantitySelector;
535
+ options.notificationInfo = dataField.NotificationInfo;
536
+ customField = new PepQuantitySelectorField(options);
537
+ break;
538
+ }
539
+ case FIELD_TYPE.Package: {
540
+ options.type = 'packageButton';
541
+ options.notificationInfo = dataField.NotificationInfo;
542
+ customField = new PepQuantitySelectorField(options);
543
+ break;
544
+ }
545
+ }
546
+ }
547
+ if (!customField) {
548
+ options.label = controlField.ApiName + ' is not supported!!!';
549
+ customField = new PepSeparatorField(options);
550
+ }
551
+ return customField;
552
+ }
553
+ getFieldFormattedValue(field) {
554
+ let fieldFormattedValue = field.formattedValue;
555
+ // Fix for the custom check box component.
556
+ if (field.controlType === 'checkbox') {
557
+ fieldFormattedValue = fieldFormattedValue === 'true';
558
+ }
559
+ // Fix for the custom button component.
560
+ if (field.controlType === 'button') {
561
+ fieldFormattedValue =
562
+ fieldFormattedValue === '0' ? '' : fieldFormattedValue;
563
+ }
564
+ return fieldFormattedValue;
565
+ }
566
+ toControlGroup(fields) {
567
+ const group = {};
568
+ if (fields && fields.length > 0) {
569
+ fields.forEach((field) => {
570
+ if (field.groupFields && field.groupFields.length > 0) {
571
+ const subGroup = {};
572
+ field.groupFields.forEach((groupField) => {
573
+ if (groupField.mandatory &&
574
+ !field.readonly &&
575
+ !field.disabled) {
576
+ subGroup[groupField.key] = [
577
+ {
578
+ value: groupField.formattedValue || '',
579
+ disabled: field.readonly ||
580
+ field.disabled ||
581
+ groupField.disabled,
582
+ },
583
+ [Validators.required],
584
+ ];
585
+ }
586
+ else {
587
+ subGroup[groupField.key] = [
588
+ {
589
+ value: groupField.formattedValue || '',
590
+ disabled: field.readonly ||
591
+ field.disabled ||
592
+ groupField.disabled,
593
+ },
594
+ [Validators.nullValidator],
595
+ ];
596
+ }
597
+ });
598
+ group[field.key] = this.fb.group(subGroup);
599
+ }
600
+ else {
601
+ const validators = field.getValidators();
602
+ const fieldFormattedValue = this.getFieldFormattedValue(field);
603
+ group[field.key] = [
604
+ {
605
+ value: fieldFormattedValue || '',
606
+ disabled: field.disabled,
607
+ },
608
+ validators,
609
+ ];
610
+ }
611
+ });
612
+ }
613
+ return this.fb.group(group);
614
+ }
615
+ createBaseField(uiControlField, dataField) {
616
+ const customField = this.convertToCustomField(uiControlField, dataField, this.canEditObject, this.menuDataField, this.hasCampaignDataField, this.indicatorsDataField, this.objectId, this.parentId, this.searchCode);
617
+ return customField;
618
+ }
619
+ showFormValidationMessage() {
620
+ const fields = this.fields;
621
+ let emptyMandatoryFieldsMsg = '';
622
+ let notValidFieldsMsg = '';
623
+ // for (let i: number = 0; i < fields.length; i++) {
624
+ // let field = fields[i];
625
+ for (const field of fields) {
626
+ const formControl = this.form && this.form.get(field.key);
627
+ if (formControl) {
628
+ // Mandatory is empty.
629
+ if (field.mandatory &&
630
+ formControl.value.toString().trim().length === 0) {
631
+ emptyMandatoryFieldsMsg +=
632
+ '<li><small>' + field.label + '</small></li>';
633
+ }
634
+ else if (!field.disabled && !formControl.valid) {
635
+ notValidFieldsMsg +=
636
+ '<li><small>' + field.label + '</small></li>';
637
+ }
638
+ }
639
+ }
640
+ // Add the header message of the empty mandatory fields
641
+ if (emptyMandatoryFieldsMsg.length > 0) {
642
+ emptyMandatoryFieldsMsg =
643
+ '<div>' +
644
+ this.translate.instant('MESSAGES.ERROR_MANDATORY_FIELDS') +
645
+ "</div><ul style='padding: 0 20px;'>" +
646
+ emptyMandatoryFieldsMsg +
647
+ '</ul><br/>';
648
+ }
649
+ // Add the header message of the empty mandatory fields
650
+ if (notValidFieldsMsg.length > 0) {
651
+ notValidFieldsMsg =
652
+ '<div>' +
653
+ this.translate.instant('MESSAGES.ERROR_INVALID_FIELDS') +
654
+ "</div><ul style='padding: 0 20px;'>" +
655
+ notValidFieldsMsg +
656
+ '</ul>';
657
+ }
658
+ const title = this.translate.instant('MESSAGES.TITLE_NOTICE');
659
+ const data = new PepDialogData({
660
+ title,
661
+ content: emptyMandatoryFieldsMsg + notValidFieldsMsg,
662
+ });
663
+ this.dialogService.openDefaultDialog(data);
664
+ }
665
+ ngOnInit() {
666
+ const themeVars = this.customizationService.getThemeVariables();
667
+ // convert rem to pixel
668
+ const RemToPixel = 16;
669
+ this.formGutterSize =
670
+ this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_SPACEING_KEY) * RemToPixel;
671
+ this.cardGutterSize =
672
+ this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.CARD_SPACEING_KEY) * RemToPixel;
673
+ }
674
+ ngDoCheck() {
675
+ const changes = this.differ.diff(this.data); // check for changes
676
+ if (changes) {
677
+ this.updateForm();
678
+ this.checkForChanges = new Date();
679
+ }
680
+ }
681
+ ngOnChanges(changes) {
682
+ // if (changes.data && changes.data.currentValue) {
683
+ // // Load changes
684
+ // if (!this.shouldReloadForm && changes.data.previousValue) {
685
+ // this.data = changes.data.currentValue;
686
+ // this.updateForm();
687
+ // } else {
688
+ // this._shouldReloadForm = false;
689
+ // this.initForm();
690
+ // }
691
+ // }
692
+ // if (this.shouldReloadForm || !changes?.data?.previousValue) {
693
+ // this._shouldReloadForm = false;
694
+ // this.initForm();
695
+ // this.checkForChanges = new Date();
696
+ // }
697
+ }
698
+ ngOnDestroy() {
699
+ //
700
+ }
701
+ getUiControlFields() {
702
+ return this.layout ? this.layout.ControlFields : [];
703
+ }
704
+ initFieldsStructure(fields, maxRow) {
705
+ const themeVars = this.customizationService.getThemeVariables();
706
+ // Set form row height.
707
+ if (this.layoutType === 'card') {
708
+ const cardFieldHeight = this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.CARD_FIELD_HEIGHT_KEY);
709
+ this.rowHeight = cardFieldHeight;
710
+ }
711
+ else {
712
+ const rowFieldHeight = this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_FIELD_HEIGHT_KEY);
713
+ const rowFieldTitleHeight = this.customizationService.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_FIELD_TITLE_HEIGHT_KEY);
714
+ this.rowHeight = rowFieldHeight + rowFieldTitleHeight;
715
+ }
716
+ // Create the fields structure (the fields must be sorted!!!).
717
+ if (fields.length > 0) {
718
+ // Init the layout.
719
+ if (
720
+ // this.layoutType === 'form' ||
721
+ this.layoutType === 'table') {
722
+ this.fields = fields;
723
+ this._fieldsSubject.next(fields);
724
+ this.rows = [];
725
+ for (let i = 0; i <= maxRow; i++) {
726
+ this.rows[i] = [];
727
+ }
728
+ // for (let i = 0; i < fields.length; i++) {
729
+ // const field = fields[i]
730
+ for (const field of fields) {
731
+ this.rows[field.row].push(field);
732
+ }
733
+ }
734
+ else {
735
+ const doesfieldExistIn = new Array(maxRow);
736
+ for (let i = 0; i < doesfieldExistIn.length; i++) {
737
+ doesfieldExistIn[i] = new Array(this.columns);
738
+ for (let j = 0; j < doesfieldExistIn[i].length; j++) {
739
+ doesfieldExistIn[i][j] = false;
740
+ }
741
+ }
742
+ // Run in squere (row - colspan, col - rowspan) and put true where it should.
743
+ // for (let index = 0; index < fields.length; index++) {
744
+ // const currentField = fields[index];
745
+ for (const currentField of fields) {
746
+ if (currentField.rowSpan > 1) {
747
+ for (let row = currentField.row; row < currentField.row + currentField.rowSpan; row++) {
748
+ if (currentField.colSpan > 1) {
749
+ for (let col = currentField.col; col <
750
+ currentField.col + currentField.colSpan; col++) {
751
+ if (doesfieldExistIn.length > row &&
752
+ doesfieldExistIn[0].length > col) {
753
+ doesfieldExistIn[row][col] = true;
754
+ }
755
+ }
756
+ }
757
+ else {
758
+ if (doesfieldExistIn.length > row &&
759
+ doesfieldExistIn[0].length >
760
+ currentField.col) {
761
+ doesfieldExistIn[row][currentField.col] = true;
762
+ }
763
+ }
764
+ }
765
+ }
766
+ else if (currentField.colSpan > 1) {
767
+ for (let col = currentField.col; col < currentField.col + currentField.colSpan; col++) {
768
+ if (doesfieldExistIn.length > currentField.row &&
769
+ doesfieldExistIn[0].length > col) {
770
+ doesfieldExistIn[currentField.row][col] = true;
771
+ }
772
+ }
773
+ }
774
+ else {
775
+ if (doesfieldExistIn.length > currentField.row &&
776
+ doesfieldExistIn[0].length > currentField.col) {
777
+ doesfieldExistIn[currentField.row][currentField.col] = true;
778
+ }
779
+ }
780
+ }
781
+ // Create empty fields where doesfieldExistIn is false (For the md-grid-list UI Component).
782
+ for (let i = 0; i < doesfieldExistIn.length; i++) {
783
+ for (let j = 0; j < doesfieldExistIn[i].length; j++) {
784
+ if (!doesfieldExistIn[i][j]) {
785
+ // Create empty field and add it to the fields list.
786
+ fields.push(new PepPlaceholderField({
787
+ key: i + '_' + j,
788
+ label: '',
789
+ placeholder: '',
790
+ readonly: false,
791
+ disabled: false,
792
+ hidden: false,
793
+ mandatory: false,
794
+ value: '',
795
+ formattedValue: '',
796
+ row: i,
797
+ rowSpan: 1,
798
+ col: j,
799
+ colSpan: 1,
800
+ order: 1,
801
+ }));
802
+ }
803
+ }
804
+ }
805
+ // Sort the fields again.
806
+ this.fields = fields.sort((f1, f2) => f1.row > f2.row
807
+ ? 1
808
+ : f1.row < f2.row
809
+ ? -1
810
+ : f1.col > f2.col
811
+ ? 1
812
+ : f1.col < f2.col
813
+ ? -1
814
+ : 0);
815
+ this._fieldsSubject.next(fields);
816
+ }
817
+ }
818
+ }
819
+ setForm(isForUpdate = false) {
820
+ let allFieldsAreReadOnly = true;
821
+ if (!isForUpdate) {
822
+ const fields = [];
823
+ for (const currentField of this.fields) {
824
+ // Add all fields except 'internalPage' (for children).
825
+ if (currentField.controlType !== 'internalPage') {
826
+ fields.push(currentField);
827
+ }
828
+ if (!currentField.readonly) {
829
+ allFieldsAreReadOnly = false;
830
+ }
831
+ }
832
+ this.form = this.toControlGroup(fields);
833
+ }
834
+ else {
835
+ // Update form values if changed by calculated fields.
836
+ for (let i = 0; i < this.fields.length; i++) {
837
+ let currentField = this.fields[i];
838
+ if (currentField.controlType === 'internalCarusel') {
839
+ // Hack to override (update) the field.
840
+ const uiControlField = this.getUiControlFields().find(cf => cf.ApiName === currentField.key);
841
+ const dataField = this.data.Fields.find(df => df.ApiName === currentField.key);
842
+ currentField = this.createBaseField(uiControlField, dataField);
843
+ this._fieldsSubject.value[i] = currentField;
844
+ }
845
+ else if (currentField.controlType !== 'internalPage') {
846
+ if (currentField.groupFields &&
847
+ currentField.groupFields.length > 0) {
848
+ // for (let j = 0; j < currentField.groupFields.length; j++) {
849
+ // let currentGroupField = currentField.groupFields[j];
850
+ for (const currentGroupField of currentField.groupFields) {
851
+ const fieldFormattedValue = this.getFieldFormattedValue(currentGroupField);
852
+ this.customizationService.updateFormField(this.form, currentGroupField, fieldFormattedValue, currentField);
853
+ }
854
+ }
855
+ else {
856
+ const fieldFormattedValue = this.getFieldFormattedValue(currentField);
857
+ // this.form.controls[currentField.key].setValue(fieldFormattedValue);
858
+ this.customizationService.updateFormField(this.form, currentField, fieldFormattedValue);
859
+ }
860
+ }
861
+ if (!currentField.readonly) {
862
+ allFieldsAreReadOnly = false;
863
+ }
864
+ }
865
+ }
866
+ let isFormValid = this.form?.valid;
867
+ // Change validation to true if all fields are read only.
868
+ if (!isFormValid && allFieldsAreReadOnly) {
869
+ isFormValid = true;
870
+ }
871
+ this.onFormValidationChanged(isFormValid);
872
+ // Set it to false to enable all fields.
873
+ if (this.isInternal && this.isLocked) {
874
+ this.isLocked = false;
875
+ }
876
+ }
877
+ initForm() {
878
+ if (this.data && this.data.Fields) {
879
+ const fields = this.convertCustomFields(this.getUiControlFields(), this.data.Fields);
880
+ const maxRow = Math.max(...fields.map((f) => {
881
+ return f.row + f.rowSpan;
882
+ }));
883
+ this.columns = Math.max(...fields.map((f) => {
884
+ return f.col + f.colSpan;
885
+ }));
886
+ this.initFieldsStructure(fields, maxRow);
887
+ this.setForm();
888
+ }
889
+ }
890
+ updateField(customField, updatedField) {
891
+ const options = {
892
+ disabled: !updatedField.Enabled || !this.canEditObject,
893
+ readonly: !updatedField.Enabled || !this.canEditObject,
894
+ visible: updatedField.Visible,
895
+ value: updatedField.Value,
896
+ additionalValue: updatedField.AdditionalValue,
897
+ formattedValue: updatedField.FormattedValue,
898
+ textColor: updatedField.TextColor,
899
+ };
900
+ if (customField instanceof PepQuantitySelectorField) {
901
+ const notificationInfo = updatedField.NotificationInfo;
902
+ options.notificationInfo = notificationInfo;
903
+ // Change type if it's change (only for allowDecimal).
904
+ let allowDecimal = false;
905
+ if (updatedField.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
906
+ updatedField.FieldType === FIELD_TYPE.NumberReal ||
907
+ updatedField.FieldType === FIELD_TYPE.NumberRealForMatrix) {
908
+ allowDecimal = true;
909
+ }
910
+ options.allowDecimal = allowDecimal;
911
+ }
912
+ else if (customField instanceof PepSelectField) {
913
+ options.options = this.convertOptionalValues(updatedField.OptionalValues);
914
+ if (!options.options || options.options.length === 0) {
915
+ options.options.push({
916
+ key: options.value,
917
+ value: options.formattedValue,
918
+ });
919
+ }
920
+ }
921
+ else if (customField instanceof PepInternalCaruselField) {
922
+ options.pageInfo = updatedField.UIPageInfo;
923
+ }
924
+ customField.update(options);
925
+ }
926
+ updateForm() {
927
+ if (this.data && this.data.Fields) {
928
+ for (const currentField of this.data.Fields) {
929
+ const customField = this.fields.filter((f) => f.key === currentField.ApiName)[0];
930
+ // Update all fields except 'internalPage' type (for children).
931
+ if (customField && customField.controlType !== 'internalPage') {
932
+ this.updateField(customField, currentField);
933
+ // Update the group fields.
934
+ if (customField.controlType === 'address' &&
935
+ currentField.GroupFields) {
936
+ // for (let j = 0; j < currentField.GroupFields.length; j++) {
937
+ // let currentGroupField = currentField.GroupFields[j];
938
+ for (const currentGroupField of currentField.GroupFields) {
939
+ currentGroupField.Enabled = !currentField.Enabled
940
+ ? false
941
+ : currentGroupField.Enabled;
942
+ const customGroupField = customField.groupFields.filter((f) => f.key === currentGroupField.ApiName)[0];
943
+ this.updateField(customGroupField, currentGroupField);
944
+ }
945
+ }
946
+ }
947
+ }
948
+ this.setForm(true);
949
+ }
950
+ }
951
+ ReloadForm() {
952
+ this._shouldReloadForm = true;
953
+ }
954
+ // onSubmit() {
955
+ // if (this.form.valid) {
956
+ // this.payLoad = JSON.stringify(this.form.value);
957
+ // //this.submitted.emit(this.form.value);
958
+ // }
959
+ // }
960
+ getFormControlById(key) {
961
+ let formControl = null;
962
+ this.fields.forEach((field) => {
963
+ if (field.key === key) {
964
+ formControl = this.form.get(field.key);
965
+ return;
966
+ }
967
+ else if (field.groupFields && field.groupFields.length > 0) {
968
+ field.groupFields.forEach((groupField) => {
969
+ if (groupField.key === key) {
970
+ formControl = this.form.get(field.key + '.' + groupField.key);
971
+ return;
972
+ }
973
+ });
974
+ }
975
+ });
976
+ return formControl;
977
+ }
978
+ setSpecialFields(controlFields, dataFields) {
979
+ // let cf;
980
+ // for (let index = 0; index < controlFields.length; index++) {
981
+ // cf = controlFields[index];
982
+ for (const cf of controlFields) {
983
+ if (cf.ApiName === 'ObjectMenu') {
984
+ this.menuField = cf;
985
+ }
986
+ else if (cf.ApiName === 'ItemHasActiveCampaign') {
987
+ this.hasCampaignField = cf;
988
+ }
989
+ else if (cf.ApiName === 'ItemIndicatorsWithoutCampaign') {
990
+ this.indicatorsField = cf;
991
+ }
992
+ }
993
+ // let df;
994
+ // for (let index = 0; index < dataFields.length; index++) {
995
+ // df = dataFields[index];
996
+ for (const df of dataFields) {
997
+ if (df.ApiName === 'ObjectMenu') {
998
+ this.menuDataField = df;
999
+ }
1000
+ else if (df.ApiName === 'ItemHasActiveCampaign') {
1001
+ this.hasCampaignDataField = df;
1002
+ }
1003
+ else if (df.ApiName === 'ItemIndicatorsWithoutCampaign') {
1004
+ this.indicatorsDataField = df;
1005
+ }
1006
+ }
1007
+ if (this.menuField && this.menuDataField) {
1008
+ this.menuDataField.Layout = this.menuField.Layout;
1009
+ }
1010
+ if (this.hasCampaignField && this.hasCampaignDataField) {
1011
+ this.hasCampaignDataField.Layout = this.hasCampaignField.Layout;
1012
+ }
1013
+ if (this.indicatorsField && this.indicatorsDataField) {
1014
+ this.indicatorsDataField.Layout = this.indicatorsField.Layout;
1015
+ }
1016
+ // Check if menu is floating on other field.
1017
+ // for (let index = 0; index < controlFields.length; index++) {
1018
+ // cf = controlFields[index];
1019
+ for (const cf of controlFields) {
1020
+ if (this.menuField && cf.ApiName !== 'ObjectMenu') {
1021
+ this.hasMenuFloatingOnOtherField = this.doesFieldHavaFloatingField(cf, this.menuField);
1022
+ if (this.hasMenuFloatingOnOtherField) {
1023
+ break;
1024
+ }
1025
+ }
1026
+ }
1027
+ }
1028
+ convertCustomFields(controlFields, dataFields) {
1029
+ if (this.layoutType !== 'table') {
1030
+ this.setSpecialFields(controlFields, dataFields);
1031
+ }
1032
+ else {
1033
+ // HACK: convert to center alignment if table view & special fields)
1034
+ controlFields.forEach((field, index) => {
1035
+ if (field.ApiName === 'UnitsQuantity' ||
1036
+ field.ApiName === 'QuantitySelector' ||
1037
+ field.ApiName === 'ObjectMenu' ||
1038
+ field.FieldType === FIELD_TYPE.Image ||
1039
+ field.FieldType === FIELD_TYPE.ImageURL ||
1040
+ field.FieldType === FIELD_TYPE.Indicators ||
1041
+ field.FieldType === FIELD_TYPE.Boolean ||
1042
+ field.FieldType === FIELD_TYPE.CalculatedBool ||
1043
+ field.FieldType === FIELD_TYPE.Signature ||
1044
+ field.FieldType ===
1045
+ FIELD_TYPE.NumberIntegerQuantitySelector ||
1046
+ field.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
1047
+ field.FieldType === FIELD_TYPE.Package ||
1048
+ field.FieldType === FIELD_TYPE.NumberIntegerForMatrix ||
1049
+ field.FieldType === FIELD_TYPE.NumberRealForMatrix) {
1050
+ field.Layout.XAlignment = X_ALIGNMENT_TYPE.Center;
1051
+ }
1052
+ else {
1053
+ // HACK: align the rest of the fields by the culture.
1054
+ // field.Layout.XAlignment = this.layoutService.isRtl() ? X_ALIGNMENT_TYPE.Right : X_ALIGNMENT_TYPE.Left;
1055
+ }
1056
+ });
1057
+ }
1058
+ const fields = [];
1059
+ controlFields.forEach((field, index) => {
1060
+ const dataField = dataFields.filter((df) => df.ApiName === field.ApiName)[0];
1061
+ if (!dataField) {
1062
+ return;
1063
+ }
1064
+ // If current view is not table view and those fields are special.
1065
+ if (this.layoutType !== 'table' &&
1066
+ ((this.hasMenuFloatingOnOtherField &&
1067
+ this.menuField &&
1068
+ this.menuField.ApiName === field.ApiName) ||
1069
+ (this.indicatorsField &&
1070
+ this.indicatorsField.ApiName === field.ApiName) ||
1071
+ (this.hasCampaignField &&
1072
+ this.hasCampaignField.ApiName === field.ApiName))) {
1073
+ return;
1074
+ }
1075
+ // Set type to link
1076
+ if (index === 0 && this.firstFieldAsLink) {
1077
+ dataField.FieldType = FIELD_TYPE.InternalLink;
1078
+ // dataField.Value = this.getInternalLinkHref();
1079
+ }
1080
+ if (field.ApiName === 'ObjectMenu') {
1081
+ dataField.Enabled = true;
1082
+ // HACK : Until "Enabled" returns from the server, we set PepMenu to be
1083
+ // Disabled in cart on regular items and not campign items.
1084
+ }
1085
+ const customField = this.createBaseField(field, dataField);
1086
+ fields.push(customField);
1087
+ });
1088
+ return fields.sort((f1, f2) => f1.row > f2.row
1089
+ ? 1
1090
+ : f1.row < f2.row
1091
+ ? -1
1092
+ : f1.col > f2.col
1093
+ ? 1
1094
+ : f1.col < f2.col
1095
+ ? -1
1096
+ : 0);
1097
+ }
1098
+ onFormValidationChanged(formValidationChange) {
1099
+ this.formValidationChange.emit(formValidationChange);
1100
+ }
1101
+ onValueChanged(event) {
1102
+ this.onFormValidationChanged(this.form.valid);
1103
+ const formControl = this.getFormControlById(event.key);
1104
+ const isValid = formControl ? formControl.valid : true;
1105
+ // const isValid = true;
1106
+ if (isValid) {
1107
+ // Set it to false to disable all fields.
1108
+ if (this.isInternal && this.layoutType === 'form') {
1109
+ this.isLocked = true;
1110
+ }
1111
+ // Update the current field value.
1112
+ const currentField = this.fields.find((f) => f.key === event.key);
1113
+ if (currentField) {
1114
+ currentField.formattedValue = currentField.value = event.value;
1115
+ }
1116
+ this.valueChange.emit({
1117
+ id: this.data.UID.toString(),
1118
+ uiObjectKey: this.data.Key,
1119
+ key: event.key,
1120
+ value: event.value,
1121
+ controlType: event.controlType,
1122
+ });
1123
+ }
1124
+ }
1125
+ onClick(fieldClickEvent) {
1126
+ const clickedUiControlField = this.data.Fields.filter((f) => f.ApiName === fieldClickEvent.key)[0];
1127
+ const idType = this.data.Type ? this.data.Type.toString() : '';
1128
+ if (clickedUiControlField) {
1129
+ this.fieldClick.emit({
1130
+ id: this.data.UID.toString(),
1131
+ uiObjectKey: this.data.Key,
1132
+ key: fieldClickEvent.key,
1133
+ idType,
1134
+ which: fieldClickEvent.eventWhich,
1135
+ value: fieldClickEvent.value,
1136
+ controlType: fieldClickEvent.controlType,
1137
+ fieldType: clickedUiControlField.FieldType,
1138
+ otherData: fieldClickEvent.otherData,
1139
+ });
1140
+ }
1141
+ else {
1142
+ // For other api names (like enter children etc).
1143
+ this.fieldClick.emit({
1144
+ id: this.data.UID.toString(),
1145
+ uiObjectKey: this.data.Key,
1146
+ key: fieldClickEvent.key,
1147
+ idType,
1148
+ which: fieldClickEvent.eventWhich,
1149
+ value: fieldClickEvent.value,
1150
+ controlType: fieldClickEvent.controlType,
1151
+ otherData: fieldClickEvent.otherData,
1152
+ });
1153
+ }
1154
+ }
1155
+ // This event is for handle the internal page events.
1156
+ onInternalFormFieldClicked(internalFormFieldClick) {
1157
+ this.internalFormFieldClick.emit(internalFormFieldClick);
1158
+ }
1159
+ // This event is for handle the internal page events.
1160
+ onInternalFormFieldChanged(internalFormFieldChange) {
1161
+ this.internalFormFieldChange.emit(internalFormFieldChange);
1162
+ }
1163
+ // This event is for handle the related items change events.
1164
+ onFormValueChanged(event) {
1165
+ // this.valueChange.emit(event);
1166
+ }
1167
+ // This event is for handle the related items change events.
1168
+ onFormFieldClick(event) {
1169
+ this.fieldClick.emit(event);
1170
+ }
1171
+ }
1172
+ PepFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepFormComponent, deps: [{ token: i1.PepDialogService }, { token: i2.PepCustomizationService }, { token: i2.PepLayoutService }, { token: i3.FormBuilder }, { token: i0.KeyValueDiffers }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
1173
+ PepFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: PepFormComponent, selector: "pep-form", inputs: { isInternal: "isInternal", isReport: "isReport", layout: "layout", lockEvents: "lockEvents", canEditObject: "canEditObject", data: "data", lockFields: "lockFields", isActive: "isActive", layoutType: "layoutType", objectId: "objectId", parentId: "parentId", searchCode: "searchCode", showTitle: "showTitle", firstFieldAsLink: "firstFieldAsLink", checkForChanges: "checkForChanges" }, outputs: { valueChange: "valueChange", formValidationChange: "formValidationChange", fieldClick: "fieldClick", internalFormFieldClick: "internalFormFieldClick", internalFormFieldChange: "internalFormFieldChange" }, usesOnChanges: true, ngImport: i0, template: "<fieldset *ngIf=\"form\" [formGroup]=\"form\" [disabled]=\"isLocked\" class=\"pep-form\"\n [ngStyle]=\"{ 'background-color': layoutType == 'card' && data?.BackgroundColor }\">\n <!-- New Form -->\n <mat-grid-list *ngIf=\"layoutType == 'form'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"formGutterSize\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\">\n <pep-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [checkForChanges]=\"checkForChanges\" [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\"\n (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\"\n (internalFormFieldClick)=\"onInternalFormFieldClicked($event)\"\n (internalFormFieldChange)=\"onInternalFormFieldChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n (formValidationChange)=\"onFormValidationChanged($event)\">\n </pep-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <!-- Thumbnails -->\n <mat-grid-list *ngIf=\"layoutType == 'card'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"cardGutterSize\" class=\"card-spacing\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\"\n [ngStyle]=\"{ overflow: field.type == 'qs' ? 'unset' : 'hidden' }\">\n <pep-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [ngClass]=\"{ 'lock-events': lockEvents }\" [isActive]=\"isActive\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\" (valueChange)=\"onValueChanged($event)\"\n (elementClick)=\"onClick($event)\" (internalFormFieldClick)=\"onInternalFormFieldClicked($event)\"\n (internalFormFieldChange)=\"onInternalFormFieldChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\">\n </pep-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <ng-container *ngIf=\"layoutType == 'table'\">\n <ng-container *ngIf=\"isReport; then reportBlock; else notReportBlock\"></ng-container>\n <ng-template #reportBlock>\n <ng-container *ngTemplateOutlet=\"report\"></ng-container>\n </ng-template>\n <ng-template #notReportBlock>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip table-cell \"\n [ngClass]=\"['text-align-' + field.xAlignment]\" style=\"height: 100%\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString}\">\n <pep-field-generator *ngIf=\"field.controlType != 'placeholder'\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [form]=\"form\" [layoutType]=\"layoutType\" [showTitle]=\"false\"\n (elementClick)=\"onClick($event)\" (valueChange)=\"onValueChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n [isActive]=\"isActive\">\n </pep-field-generator>\n </div>\n </ng-template>\n </ng-container>\n\n <!------- For testing ------------\n {{ form.value | json }}\n {{ form.valid }}\n ---------------------------------->\n</fieldset>\n\n<ng-template #report>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip pep-report-fields\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString }\"\n [ngClass]=\"['text-align-' + field.xAlignment]\">\n <ng-container [ngSwitch]=\"field.controlType\">\n <pep-image *ngSwitchCase=\"'image'\" [uid]=\"data?.UID\" [form]=\"form\" [key]=\"field.key\"\n [src]=\"field.formattedValue\" [srcLarge]=\"field.value\" [options]=\"field.options\" [label]=\"field.label\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\" [layoutType]=\"layoutType\"\n (elementClick)=\"onClick($event)\">\n </pep-image>\n\n <pep-signature *ngSwitchCase=\"'signature'\" [form]=\"form\" [key]=\"field.key\" [src]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-signature>\n\n <pep-checkbox *ngSwitchCase=\"'checkbox'\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"(field.value | lowercase) == 'true' || field.value == '1' ? true : false\" [label]=\"field.label\"\n [type]=\"field.type\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [additionalValue]=\"field.additionalValue\" [layoutType]=\"layoutType\">\n </pep-checkbox>\n\n <pep-date *ngSwitchCase=\"'date'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [minValue]=\"field.minValue\" [maxValue]=\"field.maxValue\" [layoutType]=\"layoutType\">\n </pep-date>\n\n <pep-internal-button *ngSwitchCase=\"'button'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [disabled]=\"field.disabled\" [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\"\n [layoutType]=\"layoutType\" (elementClick)=\"onClick($event)\">\n </pep-internal-button>\n\n <pep-textarea *ngSwitchCase=\"'textarea'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [maxFieldCharacters]=\"field.maxFieldCharacters\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-textarea>\n\n <pep-quantity-selector *ngSwitchCase=\"'qs'\" [id]=\"field.key\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"field.value\" [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\" (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\">\n </pep-quantity-selector>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"field.formattedValue?.length > 0; then notEmptyBlock; else emptyBlock\">\n </ng-container>\n <ng-template #notEmptyBlock>\n <ng-container\n *ngIf=\"field.controlType === 'attachment' || field.type === 'link'; then linkBlock; else notLinkBlock\">\n </ng-container>\n <ng-template #linkBlock>\n <a [id]=\"field.key\" class=\"color-link body-sm pep-report-input readonly\"\n *ngIf=\"field.formattedValue != null\" title=\"{{ field.formattedValue }}\" target=\"_blank\"\n href=\"{{ field.value }}\">{{ field.formattedValue }}</a>\n </ng-template>\n <ng-template #notLinkBlock>\n <span [id]=\"field.key\" class=\"body-sm pep-report-input readonly\"\n title=\"{{ field.formattedValue }}\" [ngStyle]=\"{ color: field.textColor }\">{{\n field.formattedValue }}</span>\n </ng-template>\n </ng-template>\n <ng-template #emptyBlock>\n <span>&nbsp;</span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>", styles: [":host{display:grid}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { kind: "component", type: i6.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { kind: "component", type: i7.PepCheckboxComponent, selector: "pep-checkbox", inputs: ["key", "value", "label", "type", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "additionalValue", "form", "isActive", "showTitle", "renderTitle", "layoutType", "visible"], outputs: ["valueChange"] }, { kind: "component", type: i8.PepDateComponent, selector: "pep-date", inputs: ["key", "value", "formattedValue", "label", "type", "mandatory", "disabled", "readonly", "textColor", "xAlignment", "rowSpan", "visible", "minValue", "maxValue", "minDateValue", "maxDateValue", "form", "isActive", "showTitle", "renderTitle", "renderError", "renderSymbol", "layoutType"], outputs: ["valueChange"] }, { kind: "component", type: i9.PepImageComponent, selector: "pep-image", inputs: ["key", "srcLarge", "src", "options", "label", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "indicatorsField", "menuField", "hasCampaignField", "visible", "form", "uid", "showTitle", "renderTitle", "layoutType", "isActive", "sizeLimitMB", "acceptImagesType"], outputs: ["fileChange", "elementClick"] }, { kind: "component", type: i10.PepQuantitySelectorComponent, selector: "pep-quantity-selector", inputs: ["key", "value", "formattedValue", "label", "type", "mandatory", "disabled", "readonly", "textColor", "xAlignment", "rowSpan", "allowDecimal", "additionalValue", "notificationInfo", "visible", "form", "showTitle", "renderTitle", "layoutType", "isActive", "styleType"], outputs: ["valueChange", "elementClick"] }, { kind: "component", type: i11.PepSignatureComponent, selector: "pep-signature", inputs: ["key", "src", "label", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "signatureURL", "visible", "form", "showTitle", "renderTitle", "layoutType", "isActive"], outputs: ["fileChange"] }, { kind: "component", type: i12.PepTextareaComponent, selector: "pep-textarea", inputs: ["key", "value", "label", "mandatory", "disabled", "readonly", "maxFieldCharacters", "textColor", "xAlignment", "rowSpan", "visible", "form", "isActive", "showTitle", "renderTitle", "layoutType"], outputs: ["valueChange"] }, { kind: "component", type: i13.PepFieldGeneratorComponent, selector: "pep-field-generator", inputs: ["field", "isActive", "uid", "form", "layoutType", "showTitle", "checkForChanges"], outputs: ["valueChange", "formValidationChange", "elementClick", "internalFormFieldChange", "internalFormFieldClick", "formValueChange", "formFieldClick"] }, { kind: "component", type: i14.PepInternalButtonComponent, selector: "pep-internal-button", inputs: ["key", "value", "formattedValue", "label", "referenceObjectInternalType", "type", "mandatory", "disabled", "readonly", "xAlignment", "rowSpan", "visible", "form", "showTitle", "layoutType"], outputs: ["elementClick", "valueChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.LowerCasePipe, name: "lowercase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepFormComponent, decorators: [{
1175
+ type: Component,
1176
+ args: [{ selector: 'pep-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<fieldset *ngIf=\"form\" [formGroup]=\"form\" [disabled]=\"isLocked\" class=\"pep-form\"\n [ngStyle]=\"{ 'background-color': layoutType == 'card' && data?.BackgroundColor }\">\n <!-- New Form -->\n <mat-grid-list *ngIf=\"layoutType == 'form'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"formGutterSize\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\">\n <pep-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [checkForChanges]=\"checkForChanges\" [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\"\n (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\"\n (internalFormFieldClick)=\"onInternalFormFieldClicked($event)\"\n (internalFormFieldChange)=\"onInternalFormFieldChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n (formValidationChange)=\"onFormValidationChanged($event)\">\n </pep-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <!-- Thumbnails -->\n <mat-grid-list *ngIf=\"layoutType == 'card'\" [cols]=\"columns\" [rowHeight]=\"rowHeight + 'rem'\"\n [gutterSize]=\"cardGutterSize\" class=\"card-spacing\">\n <mat-grid-tile *ngFor=\"let field of fields$ | async\" [rowspan]=\"field.rowSpan\" [colspan]=\"field.colSpan\"\n [ngStyle]=\"{ overflow: field.type == 'qs' ? 'unset' : 'hidden' }\">\n <pep-field-generator *ngIf=\"field.controlType != 'placeholder'\" [form]=\"form\" [layoutType]=\"layoutType\"\n [ngClass]=\"{ 'lock-events': lockEvents }\" [isActive]=\"isActive\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [showTitle]=\"showTitle\" (valueChange)=\"onValueChanged($event)\"\n (elementClick)=\"onClick($event)\" (internalFormFieldClick)=\"onInternalFormFieldClicked($event)\"\n (internalFormFieldChange)=\"onInternalFormFieldChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\">\n </pep-field-generator>\n </mat-grid-tile>\n </mat-grid-list>\n\n <ng-container *ngIf=\"layoutType == 'table'\">\n <ng-container *ngIf=\"isReport; then reportBlock; else notReportBlock\"></ng-container>\n <ng-template #reportBlock>\n <ng-container *ngTemplateOutlet=\"report\"></ng-container>\n </ng-template>\n <ng-template #notReportBlock>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip table-cell \"\n [ngClass]=\"['text-align-' + field.xAlignment]\" style=\"height: 100%\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString}\">\n <pep-field-generator *ngIf=\"field.controlType != 'placeholder'\" [checkForChanges]=\"checkForChanges\"\n [uid]=\"data?.UID\" [field]=\"field\" [form]=\"form\" [layoutType]=\"layoutType\" [showTitle]=\"false\"\n (elementClick)=\"onClick($event)\" (valueChange)=\"onValueChanged($event)\"\n (formValueChange)=\"onFormValueChanged($event)\" (formFieldClick)=\"onFormFieldClick($event)\"\n [isActive]=\"isActive\">\n </pep-field-generator>\n </div>\n </ng-template>\n </ng-container>\n\n <!------- For testing ------------\n {{ form.value | json }}\n {{ form.valid }}\n ---------------------------------->\n</fieldset>\n\n<ng-template #report>\n <div *ngFor=\"let field of fields$ | async; let j = index\" class=\"pull-left flip pep-report-fields\"\n [ngStyle]=\"{ width: (layout?.ControlFields)[j]?.calcColumnWidthString }\"\n [ngClass]=\"['text-align-' + field.xAlignment]\">\n <ng-container [ngSwitch]=\"field.controlType\">\n <pep-image *ngSwitchCase=\"'image'\" [uid]=\"data?.UID\" [form]=\"form\" [key]=\"field.key\"\n [src]=\"field.formattedValue\" [srcLarge]=\"field.value\" [options]=\"field.options\" [label]=\"field.label\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\" [layoutType]=\"layoutType\"\n (elementClick)=\"onClick($event)\">\n </pep-image>\n\n <pep-signature *ngSwitchCase=\"'signature'\" [form]=\"form\" [key]=\"field.key\" [src]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-signature>\n\n <pep-checkbox *ngSwitchCase=\"'checkbox'\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"(field.value | lowercase) == 'true' || field.value == '1' ? true : false\" [label]=\"field.label\"\n [type]=\"field.type\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [additionalValue]=\"field.additionalValue\" [layoutType]=\"layoutType\">\n </pep-checkbox>\n\n <pep-date *ngSwitchCase=\"'date'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [minValue]=\"field.minValue\" [maxValue]=\"field.maxValue\" [layoutType]=\"layoutType\">\n </pep-date>\n\n <pep-internal-button *ngSwitchCase=\"'button'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [disabled]=\"field.disabled\" [readonly]=\"field.readonly\" [xAlignment]=\"field.xAlignment\"\n [layoutType]=\"layoutType\" (elementClick)=\"onClick($event)\">\n </pep-internal-button>\n\n <pep-textarea *ngSwitchCase=\"'textarea'\" [form]=\"form\" [key]=\"field.key\" [value]=\"field.value\"\n [label]=\"field.label\" [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\"\n [readonly]=\"field.readonly\" [maxFieldCharacters]=\"field.maxFieldCharacters\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\">\n </pep-textarea>\n\n <pep-quantity-selector *ngSwitchCase=\"'qs'\" [id]=\"field.key\" [form]=\"form\" [key]=\"field.key\"\n [value]=\"field.value\" [formattedValue]=\"field.formattedValue\" [label]=\"field.label\" [type]=\"field.type\"\n [mandatory]=\"field.mandatory\" [disabled]=\"field.disabled\" [readonly]=\"field.readonly\"\n [textColor]=\"field.textColor\" [xAlignment]=\"field.xAlignment\" [rowSpan]=\"field.rowSpan\"\n [layoutType]=\"layoutType\" (valueChange)=\"onValueChanged($event)\" (elementClick)=\"onClick($event)\">\n </pep-quantity-selector>\n\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"field.formattedValue?.length > 0; then notEmptyBlock; else emptyBlock\">\n </ng-container>\n <ng-template #notEmptyBlock>\n <ng-container\n *ngIf=\"field.controlType === 'attachment' || field.type === 'link'; then linkBlock; else notLinkBlock\">\n </ng-container>\n <ng-template #linkBlock>\n <a [id]=\"field.key\" class=\"color-link body-sm pep-report-input readonly\"\n *ngIf=\"field.formattedValue != null\" title=\"{{ field.formattedValue }}\" target=\"_blank\"\n href=\"{{ field.value }}\">{{ field.formattedValue }}</a>\n </ng-template>\n <ng-template #notLinkBlock>\n <span [id]=\"field.key\" class=\"body-sm pep-report-input readonly\"\n title=\"{{ field.formattedValue }}\" [ngStyle]=\"{ color: field.textColor }\">{{\n field.formattedValue }}</span>\n </ng-template>\n </ng-template>\n <ng-template #emptyBlock>\n <span>&nbsp;</span>\n </ng-template>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>", styles: [":host{display:grid}\n"] }]
1177
+ }], ctorParameters: function () { return [{ type: i1.PepDialogService }, { type: i2.PepCustomizationService }, { type: i2.PepLayoutService }, { type: i3.FormBuilder }, { type: i0.KeyValueDiffers }, { type: i4.TranslateService }]; }, propDecorators: { isInternal: [{
1178
+ type: Input
1179
+ }], isReport: [{
1180
+ type: Input
1181
+ }], layout: [{
1182
+ type: Input
1183
+ }], lockEvents: [{
1184
+ type: Input
1185
+ }], canEditObject: [{
1186
+ type: Input
1187
+ }], data: [{
1188
+ type: Input
1189
+ }], lockFields: [{
1190
+ type: Input
1191
+ }], isActive: [{
1192
+ type: Input
1193
+ }], layoutType: [{
1194
+ type: Input
1195
+ }], objectId: [{
1196
+ type: Input
1197
+ }], parentId: [{
1198
+ type: Input
1199
+ }], searchCode: [{
1200
+ type: Input
1201
+ }], showTitle: [{
1202
+ type: Input
1203
+ }], firstFieldAsLink: [{
1204
+ type: Input
1205
+ }], checkForChanges: [{
1206
+ type: Input
1207
+ }], valueChange: [{
1208
+ type: Output
1209
+ }], formValidationChange: [{
1210
+ type: Output
1211
+ }], fieldClick: [{
1212
+ type: Output
1213
+ }], internalFormFieldClick: [{
1214
+ type: Output
1215
+ }], internalFormFieldChange: [{
1216
+ type: Output
1217
+ }] } });
1218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULHVCQUF1QixFQUd2QixLQUFLLEVBRUwsTUFBTSxFQUNOLFlBQVksR0FJZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0gsVUFBVSxHQUViLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUVILGFBQWEsR0FDaEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBSUgsVUFBVSxFQUNWLHVCQUF1QixFQU92QixlQUFlLEVBQ2YsY0FBYyxFQUNkLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixjQUFjLEVBQ2QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsbUJBQW1CLEVBR25CLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsMEJBQTBCLEVBQzFCLDRCQUE0QixHQUcvQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTbkQsTUFBTSxPQUFPLGdCQUFnQjtJQW1GekIsaUNBQWlDO0lBQ2pDLHlCQUF5QjtJQUV6QixZQUNZLGFBQStCLEVBQy9CLG9CQUE2QyxFQUM3QyxhQUErQixFQUMvQixFQUFlLEVBQ3ZCLE9BQXdCLEVBQ2hCLFNBQTJC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S0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7NkdBNzdDUSxnQkFBZ0I7aUdBQWhCLGdCQUFnQixvcUJDMUU3QixpOFJBcUljOzJGRDNERCxnQkFBZ0I7a0JBTjVCLFNBQVM7K0JBQ0ksVUFBVSxtQkFHSCx1QkFBdUIsQ0FBQyxNQUFNO21RQUd0QyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFJRixJQUFJO3NCQURQLEtBQUs7Z0JBaUJGLFVBQVU7c0JBRGIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFHTixXQUFXO3NCQURWLE1BQU07Z0JBR1Asb0JBQW9CO3NCQURuQixNQUFNO2dCQUlQLFVBQVU7c0JBRFQsTUFBTTtnQkFHRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csdUJBQXVCO3NCQUFoQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgT25Jbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBJbnB1dCxcbiAgICBLZXlWYWx1ZURpZmZlcnMsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPbkNoYW5nZXMsXG4gICAgRG9DaGVjayxcbiAgICBPcHRpb25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEZvcm1Hcm91cCxcbiAgICBGb3JtQnVpbGRlcixcbiAgICBWYWxpZGF0b3JzLFxuICAgIEFic3RyYWN0Q29udHJvbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBQZXBEaWFsb2dTZXJ2aWNlLFxuICAgIFBlcERpYWxvZ0RhdGEsXG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2RpYWxvZyc7XG5pbXBvcnQge1xuICAgIElQZXBGaWVsZFZhbHVlQ2hhbmdlRXZlbnQsXG4gICAgSVBlcEZpZWxkQ2xpY2tFdmVudCxcbiAgICBQZXBMYXlvdXRUeXBlLFxuICAgIEZJRUxEX1RZUEUsXG4gICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UsXG4gICAgUGVwTGF5b3V0U2VydmljZSxcbiAgICBVSUNvbnRyb2wsXG4gICAgVUlDb250cm9sRmllbGQsXG4gICAgT2JqZWN0c0RhdGFSb3csXG4gICAgT2JqZWN0c0RhdGFSb3dDZWxsLFxuICAgIFBlcEZpZWxkQmFzZSxcbiAgICBQZXBUZXh0Ym94RmllbGQsXG4gICAgUGVwU2VsZWN0RmllbGQsXG4gICAgUGVwSW50ZXJuYWxNZW51RmllbGQsXG4gICAgUGVwUXVhbnRpdHlTZWxlY3RvckZpZWxkLFxuICAgIFBlcEFkZHJlc3NGaWVsZCxcbiAgICBQZXBJbmRpY2F0b3JzRmllbGQsXG4gICAgUGVwSW50ZXJuYWxQYWdlRmllbGQsXG4gICAgUGVwSW50ZXJuYWxDYXJ1c2VsRmllbGQsXG4gICAgUGVwSW50ZXJuYWxCdXR0b25GaWVsZCxcbiAgICBQZXBBdHRhY2htZW50RmllbGQsXG4gICAgUGVwU2lnbmF0dXJlRmllbGQsXG4gICAgUGVwSW1hZ2VGaWVsZCxcbiAgICBQZXBJbWFnZXNGaWVsZCxcbiAgICBQZXBMaW5rRmllbGQsXG4gICAgUGVwVGV4dGFyZWFGaWVsZCxcbiAgICBQZXBSaWNoSHRtbFRleHRhcmVhRmllbGQsXG4gICAgUGVwRGF0ZUZpZWxkLFxuICAgIFBlcENoZWNrYm94RmllbGQsXG4gICAgUGVwU2VwYXJhdG9yRmllbGQsXG4gICAgUGVwUGxhY2Vob2xkZXJGaWVsZCxcbiAgICBQZXBIb3Jpem9udGFsQWxpZ25tZW50LFxuICAgIFBlcFZlcnRpY2FsQWxpZ25tZW50LFxuICAgIFhfQUxJR05NRU5UX1RZUEUsXG4gICAgWV9BTElHTk1FTlRfVFlQRSxcbiAgICBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOTUVOVCxcbiAgICBERUZBVUxUX0hPUklaT05UQUxfQUxJR05NRU5ULFxuICAgIEtleVZhbHVlUGFpcixcbiAgICBJUGVwT3B0aW9uLFxufSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50LCBJUGVwRm9ybUZpZWxkQ2xpY2tFdmVudCB9IGZyb20gJy4vZm9ybS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncGVwLWZvcm0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFBlcEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIERvQ2hlY2ssIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSBpc0ludGVybmFsID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBpc1JlcG9ydCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGxheW91dDogVUlDb250cm9sO1xuICAgIEBJbnB1dCgpIGxvY2tFdmVudHMgPSBmYWxzZTsgICBcbiAgICBASW5wdXQoKSBjYW5FZGl0T2JqZWN0ID0gdHJ1ZTtcblxuICAgIHByaXZhdGUgX2RhdGE6IE9iamVjdHNEYXRhUm93ID0gbnVsbDtcbiAgICBASW5wdXQoKVxuICAgIHNldCBkYXRhKHZhbHVlOiBPYmplY3RzRGF0YVJvdykge1xuICAgICAgICBjb25zdCBzaG91bGRSZWxvYWQgPSB0aGlzLnNob3VsZFJlbG9hZEZvcm0gfHwgIXRoaXMuX2RhdGE7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcblxuICAgICAgICBpZiAoc2hvdWxkUmVsb2FkKSB7XG4gICAgICAgICAgICB0aGlzLl9zaG91bGRSZWxvYWRGb3JtID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmluaXRGb3JtKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGF0YSgpOiBPYmplY3RzRGF0YVJvdyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGxvY2tGaWVsZHModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5pc0xvY2tlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIGlzQWN0aXZlID0gZmFsc2U7XG4gICAgQElucHV0KCkgbGF5b3V0VHlwZTogUGVwTGF5b3V0VHlwZSA9ICdjYXJkJztcbiAgICAvLyBASW5wdXQoKSBsaXN0VHlwZSA9ICcnO1xuICAgIEBJbnB1dCgpIG9iamVjdElkID0gJzAnO1xuICAgIEBJbnB1dCgpIHBhcmVudElkID0gJzAnO1xuICAgIEBJbnB1dCgpIHNlYXJjaENvZGUgPSAnMCc7XG4gICAgQElucHV0KCkgc2hvd1RpdGxlID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBmaXJzdEZpZWxkQXNMaW5rID0gZmFsc2U7XG4gICAgQElucHV0KCkgY2hlY2tGb3JDaGFuZ2VzOiBhbnkgPSBudWxsO1xuXG4gICAgQE91dHB1dCgpXG4gICAgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJUGVwRm9ybUZpZWxkVmFsdWVDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50PigpO1xuICAgIEBPdXRwdXQoKVxuICAgIGZvcm1WYWxpZGF0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBmaWVsZENsaWNrOiBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZENsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwRm9ybUZpZWxkQ2xpY2tFdmVudD4oKTtcblxuICAgIEBPdXRwdXQoKSBpbnRlcm5hbEZvcm1GaWVsZENsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBpbnRlcm5hbEZvcm1GaWVsZENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIGlzTG9ja2VkID0gZmFsc2U7XG4gICAgZm9ybUd1dHRlclNpemU7XG4gICAgY2FyZEd1dHRlclNpemU7XG4gICAgcm93SGVpZ2h0O1xuICAgIC8vIHByaXZhdGUgbWF0cml4SXNMYXN0ID0gZmFsc2U7XG4gICAgLy8gbGFzdFVwZGF0ZWRGaWVsZEFwaU5hbWU6IHN0cmluZyA9ICcnO1xuICAgIGZvcm06IEZvcm1Hcm91cDtcbiAgICBkaWZmZXI6IGFueTtcblxuICAgIC8vIHBheUxvYWQgPSAnJztcbiAgICBwcml2YXRlIHJvd3M6IEFycmF5PFBlcEZpZWxkQmFzZVtdPiA9IFtdO1xuICAgIGZpZWxkczogUGVwRmllbGRCYXNlW10gPSBbXTtcblxuICAgIHByaXZhdGUgX2ZpZWxkc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxQZXBGaWVsZEJhc2VbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBlcEZpZWxkQmFzZVtdPihbXSk7XG4gICAgZ2V0IGZpZWxkcyQoKTogT2JzZXJ2YWJsZTxQZXBGaWVsZEJhc2VbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBjb2x1bW5zID0gMTtcblxuICAgIHByaXZhdGUgaGFzTWVudUZsb2F0aW5nT25PdGhlckZpZWxkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBtZW51RmllbGQ6IGFueTtcbiAgICBwcml2YXRlIG1lbnVEYXRhRmllbGQ6IGFueTtcbiAgICBwcml2YXRlIGhhc0NhbXBhaWduRmllbGQ6IGFueTtcbiAgICBwcml2YXRlIGhhc0NhbXBhaWduRGF0YUZpZWxkOiBhbnk7XG4gICAgcHJpdmF0ZSBpbmRpY2F0b3JzRmllbGQ6IGFueTtcbiAgICBwcml2YXRlIGluZGljYXRvcnNEYXRhRmllbGQ6IGFueSA9IG51bGw7XG5cbiAgICBwcml2YXRlIF9zaG91bGRSZWxvYWRGb3JtID0gZmFsc2U7XG4gICAgZ2V0IHNob3VsZFJlbG9hZEZvcm0oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG91bGRSZWxvYWRGb3JtO1xuICAgIH1cblxuICAgIC8vIGV2ZW50U2VydmljZVN1YjogU3Vic2NyaXB0aW9uO1xuICAgIC8vIHB1YmxpYyBqc29uTGliID0gSlNPTjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IFBlcERpYWxvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY3VzdG9taXphdGlvblNlcnZpY2U6IFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxheW91dFNlcnZpY2U6IFBlcExheW91dFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBkaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlIHRvIGNvbXBhcmUgd2l0aFxuICAgICAgICB0aGlzLmRpZmZlciA9IGRpZmZlcnMuZmluZCh7fSkuY3JlYXRlKCk7XG4gICAgfVxuXG4gICAgY29udmVydFhBbGlnblRvSG9yaXpvbnRhbEFsaWduKFxuICAgICAgICB4QWxpZ246IFhfQUxJR05NRU5UX1RZUEVcbiAgICApOiBQZXBIb3Jpem9udGFsQWxpZ25tZW50IHtcbiAgICAgICAgbGV0IHJlcyA9IERFRkFVTFRfSE9SSVpPTlRBTF9BTElHTk1FTlQ7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgeEFsaWduID09PSBYX0FMSUdOTUVOVF9UWVBFLk5vbmUgfHxcbiAgICAgICAgICAgIHhBbGlnbiA9PT0gWF9BTElHTk1FTlRfVFlQRS5MZWZ0XG4gICAgICAgICkge1xuICAgICAgICAgICAgcmVzID0gJ2xlZnQnO1xuICAgICAgICB9IGVsc2UgaWYgKHhBbGlnbiA9PT0gWF9BTElHTk1FTlRfVFlQRS5SaWdodCkge1xuICAgICAgICAgICAgcmVzID0gJ3JpZ2h0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9ICdjZW50ZXInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBjb252ZXJ0WUFsaWduVG9WZXJ0aWNhbEFsaWduKFxuICAgICAgICB5QWxpZ246IFlfQUxJR05NRU5UX1RZUEVcbiAgICApOiBQZXBWZXJ0aWNhbEFsaWdubWVudCB7XG4gICAgICAgIGxldCByZXMgPSBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOTUVOVDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB5QWxpZ24gPT09IFlfQUxJR05NRU5UX1RZUEUuTm9uZSB8fFxuICAgICAgICAgICAgeUFsaWduID09PSBZX0FMSUdOTUVOVF9UWVBFLlRvcFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJlcyA9ICd0b3AnO1xuICAgICAgICB9IGVsc2UgaWYgKHlBbGlnbiA9PT0gWV9BTElHTk1FTlRfVFlQRS5Cb3R0b20pIHtcbiAgICAgICAgICAgIHJlcyA9ICdib3R0b20nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzID0gJ21pZGRsZSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGNvbnZlcnRPcHRpb25hbFZhbHVlcyhcbiAgICAgICAgb3B0aW9uYWxWYWx1ZXM6IEFycmF5PEtleVZhbHVlUGFpcjxzdHJpbmc+PlxuICAgICk6IElQZXBPcHRpb25bXSB7XG4gICAgICAgIGlmIChvcHRpb25hbFZhbHVlcyAmJiBvcHRpb25hbFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uYWxWYWx1ZXMubWFwKChvdikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGtleTogb3YuS2V5LCB2YWx1ZTogb3YuVmFsdWUgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udmVydEFkZHJlc3NGaWVsZHMoXG4gICAgICAgIGNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQsXG4gICAgICAgIGFkZHJlc3NGaWVsZHM6IEFycmF5PE9iamVjdHNEYXRhUm93Q2VsbD4sXG4gICAgICAgIGNhbkVkaXRPYmplY3Q6IGJvb2xlYW5cbiAgICApOiBQZXBGaWVsZEJhc2VbXSB7XG4gICAgICAgIGNvbnN0IGZpZWxkczogUGVwRmllbGRCYXNlW10gPSBbXTtcblxuICAgICAgICBhZGRyZXNzRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBsZXQgY3VzdG9tRmllbGQ6IFBlcEZpZWxkQmFzZTtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gZmllbGQuQXBpTmFtZTtcblxuICAgICAgICAgICAgaWYgKGZpZWxkLkFwaU5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdzdHJlZXQnKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwVGV4dGJveEZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBmaWVsZC5BcGlOYW1lLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZmllbGQuQXBpTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk6ICFjYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWZpZWxkLkVuYWJsZWQgfHwgIWNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZC5WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IGZpZWxkLkZvcm1hdHRlZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICByb3c6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICAgICAgICAgIGNvbDogMCxcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbjogMixcbiAgICAgICAgICAgICAgICAgICAgeEFsaWdubWVudDogdGhpcy5jb252ZXJ0WEFsaWduVG9Ib3Jpem9udGFsQWxpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sRmllbGQuTGF5b3V0LlhBbGlnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgeUFsaWdubWVudDogdGhpcy5jb252ZXJ0WUFsaWduVG9WZXJ0aWNhbEFsaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbEZpZWxkLkxheW91dC5ZQWxpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5BcGlOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY2l0eScpID49IDApIHtcbiAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBUZXh0Ym94RmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGZpZWxkLkFwaU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5BcGlOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICByZWFkb25seTogIWNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhZmllbGQuRW5hYmxlZCB8fCAhY2FuRWRpdE9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkLlZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogZmllbGQuRm9ybWF0dGVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgICAgICAgICAgY29sOiAyLFxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICAgICAgICB4QWxpZ25tZW50OiB0aGlzLmNvbnZlcnRYQWxpZ25Ub0hvcml6b250YWxBbGlnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWEFsaWdubWVudFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB5QWxpZ25tZW50OiB0aGlzLmNvbnZlcnRZQWxpZ25Ub1ZlcnRpY2FsQWxpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sRmllbGQuTGF5b3V0LllBbGlnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLkFwaU5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdzdGF0ZScpID49IDApIHtcbiAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBTZWxlY3RGaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogZmllbGQuQXBpTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGZpZWxkLkFwaU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLmNvbnZlcnRPcHRpb25hbFZhbHVlcyhmaWVsZC5PcHRpb25hbFZhbHVlcyksXG4gICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiAhY2FuRWRpdE9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFmaWVsZC5FbmFibGVkIHx8ICFjYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGQuVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlOiBmaWVsZC5Gb3JtYXR0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcm93OiAxLFxuICAgICAgICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICAgICAgICBjb2w6IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICAgICAgICAgIHhBbGlnbm1lbnQ6IHRoaXMuY29udmVydFhBbGlnblRvSG9yaXpvbnRhbEFsaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbEZpZWxkLkxheW91dC5YQWxpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHlBbGlnbm1lbnQ6IHRoaXMuY29udmVydFlBbGlnblRvVmVydGljYWxBbGlnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWUFsaWdubWVudFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcjogMixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuQXBpTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3ppcGNvZGUnKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwVGV4dGJveEZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBmaWVsZC5BcGlOYW1lLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZmllbGQuQXBpTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk6ICFjYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWZpZWxkLkVuYWJsZWQgfHwgIWNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZC5WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6IGZpZWxkLkZvcm1hdHRlZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgICAgIHJvd1NwYW46IDEsXG4gICAgICAgICAgICAgICAgICAgIGNvbDogMSxcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgICAgICAgICAgICAgeEFsaWdubWVudDogdGhpcy5jb252ZXJ0WEFsaWduVG9Ib3Jpem9udGFsQWxpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sRmllbGQuTGF5b3V0LlhBbGlnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgeUFsaWdubWVudDogdGhpcy5jb252ZXJ0WUFsaWduVG9WZXJ0aWNhbEFsaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbEZpZWxkLkxheW91dC5ZQWxpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiAzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5BcGlOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY291bnRyeScpID49IDApIHtcbiAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBTZWxlY3RGaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogZmllbGQuQXBpTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGZpZWxkLkFwaU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLmNvbnZlcnRPcHRpb25hbFZhbHVlcyhmaWVsZC5PcHRpb25hbFZhbHVlcyksXG4gICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiAhY2FuRWRpdE9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFmaWVsZC5FbmFibGVkIHx8ICFjYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGQuVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlOiBmaWVsZC5Gb3JtYXR0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICByb3dTcGFuOiAxLFxuICAgICAgICAgICAgICAgICAgICBjb2w6IDIsXG4gICAgICAgICAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICAgICAgICAgIHhBbGlnbm1lbnQ6IHRoaXMuY29udmVydFhBbGlnblRvSG9yaXpvbnRhbEFsaWduKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbEZpZWxkLkxheW91dC5YQWxpZ25tZW50XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHlBbGlnbm1lbnQ6IHRoaXMuY29udmVydFlBbGlnblRvVmVydGljYWxBbGlnbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWUFsaWdubWVudFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcjogNCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmllbGRzLnB1c2goY3VzdG9tRmllbGQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmllbGRzLnNvcnQoKG4xLCBuMikgPT5cbiAgICAgICAgICAgIG4xLm9yZGVyID4gbjIub3JkZXIgPyAxIDogbjEub3JkZXIgPCBuMi5vcmRlciA/IC0xIDogMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlzTWF0cml4RmllbGQoYXBpTmFtZVRvQ2hlY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gYXBpTmFtZVRvQ2hlY2suaW5kZXhPZignTWF0cml4JykgPj0gMDtcbiAgICB9XG5cbiAgICBkb2VzRmllbGRIYXZhRmxvYXRpbmdGaWVsZChcbiAgICAgICAgY29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCxcbiAgICAgICAgZmxvYXRpbmdGaWVsZDogYW55XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBoYXNGbG9hdGluZ0ZpZWxkID0gZmFsc2U7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZsb2F0aW5nRmllbGQuTGF5b3V0LlkgPj0gY29udHJvbEZpZWxkLkxheW91dC5ZICYmXG4gICAgICAgICAgICBmbG9hdGluZ0ZpZWxkLkxheW91dC5ZIDxcbiAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWSArIGNvbnRyb2xGaWVsZC5MYXlvdXQuSGVpZ2h0ICYmXG4gICAgICAgICAgICBmbG9hdGluZ0ZpZWxkLkxheW91dC5YID49IGNvbnRyb2xGaWVsZC5MYXlvdXQuWCAmJlxuICAgICAgICAgICAgZmxvYXRpbmdGaWVsZC5MYXlvdXQuWCA8XG4gICAgICAgICAgICBjb250cm9sRmllbGQuTGF5b3V0LlggKyBjb250cm9sRmllbGQuTGF5b3V0LldpZHRoXG4gICAgICAgICkge1xuICAgICAgICAgICAgaGFzRmxvYXRpbmdGaWVsZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzRmxvYXRpbmdGaWVsZDtcbiAgICB9XG5cbiAgICBnZXRPcHRpb25zRm9yQ3VzdG9tRmllbGQoXG4gICAgICAgIGNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQsXG4gICAgICAgIGRhdGFGaWVsZDogYW55LFxuICAgICAgICBjYW5FZGl0T2JqZWN0OiBib29sZWFuXG4gICAgKTogYW55IHtcbiAgICAgICAgaWYgKCFjb250cm9sRmllbGQgfHwgIWRhdGFGaWVsZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPVxuICAgICAgICAgICAgY29udHJvbEZpZWxkLlJlYWRPbmx5IHx8ICFjYW5FZGl0T2JqZWN0ID8gJycgOiBjb250cm9sRmllbGQuVGl0bGU7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogY29udHJvbEZpZWxkLkFwaU5hbWUsXG4gICAgICAgICAgICBsYWJlbDogY29udHJvbEZpZWxkLlRpdGxlLFxuICAgICAgICAgICAgYWNjZXNzb3J5OiBkYXRhRmllbGQuQWNjZXNzb3J5LFxuICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICByZWFkb25seTogY29udHJvbEZpZWxkLlJlYWRPbmx5IHx8ICFjYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgZGlzYWJsZWQ6ICFkYXRhRmllbGQuRW5hYmxlZCB8fCAhY2FuRWRpdE9iamVjdCxcbiAgICAgICAgICAgIGhpZGRlbjogY29udHJvbEZpZWxkLkhpZGRlbixcbiAgICAgICAgICAgIG1hbmRhdG9yeTogY29udHJvbEZpZWxkLk1hbmRhdG9yeSxcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhRmllbGQuVmFsdWUsXG4gICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogZGF0YUZpZWxkLkZvcm1hdHRlZFZhbHVlLFxuICAgICAgICAgICAgYWRkaXRpb25hbFZhbHVlOiBkYXRhRmllbGQuQWRkaXRpb25hbFZhbHVlLFxuICAgICAgICAgICAgcm93OiBjb250cm9sRmllbGQuTGF5b3V0LlksXG4gICAgICAgICAgICByb3dTcGFuOiBjb250cm9sRmllbGQuTGF5b3V0LkhlaWdodCxcbiAgICAgICAgICAgIGNvbDogY29udHJvbEZpZWxkLkxheW91dC5YLFxuICAgICAgICAgICAgY29sU3BhbjogY29udHJvbEZpZWxkLkxheW91dC5XaWR0aCxcbiAgICAgICAgICAgIHhBbGlnbm1lbnQ6IHRoaXMuY29udmVydFhBbGlnblRvSG9yaXpvbnRhbEFsaWduKFxuICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5MYXlvdXQuWEFsaWdubWVudFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHlBbGlnbm1lbnQ6IHRoaXMuY29udmVydFlBbGlnblRvVmVydGljYWxBbGlnbihcbiAgICAgICAgICAgICAgICBjb250cm9sRmllbGQuTGF5b3V0LllBbGlnbm1lbnRcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLmNvbnZlcnRPcHRpb25hbFZhbHVlcyhkYXRhRmllbGQuT3B0aW9uYWxWYWx1ZXMpLFxuICAgICAgICAgICAgZ3JvdXBGaWVsZHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1heEZpZWxkQ2hhcmFjdGVyczogY29udHJvbEZpZWxkLk1heEZpZWxkQ2hhcmFjdGVycyxcbiAgICAgICAgICAgIG1pblZhbHVlOiBjb250cm9sRmllbGQuTWluVmFsdWUsXG4gICAgICAgICAgICBtYXhWYWx1ZTogY29udHJvbEZpZWxkLk1heFZhbHVlLFxuICAgICAgICAgICAgLy8gaGFzTWVudTogaGFzTWVudSxcbiAgICAgICAgICAgIC8vIGhhc0NhbXBhaWduOiBoYXNDYW1wYWlnbixcbiAgICAgICAgICAgIC8vIGhhc0luZGljYXRvcnM6IGhhc0luZGljYXRvcnMsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IGRhdGFGaWVsZC5UZXh0Q29sb3IsXG4gICAgICAgICAgICB2aXNpYmxlOiBkYXRhRmllbGQuVmlzaWJsZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb252ZXJ0VG9DdXN0b21GaWVsZChcbiAgICAgICAgY29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCxcbiAgICAgICAgZGF0YUZpZWxkOiBhbnksXG4gICAgICAgIGNhbkVkaXRPYmplY3Q6IGJvb2xlYW4sXG4gICAgICAgIG1lbnVGaWVsZDogYW55LFxuICAgICAgICBoYXNDYW1wYWlnbkZpZWxkOiBhbnksXG4gICAgICAgIGluZGljYXRvcnNGaWVsZDogYW55LFxuICAgICAgICBvYmplY3RJZDogYW55LFxuICAgICAgICBwYXJlbnRJZDogYW55LFxuICAgICAgICBzZWFyY2hDb2RlOiBhbnlcbiAgICApOiBQZXBGaWVsZEJhc2Uge1xuICAgICAgICBsZXQgY3VzdG9tRmllbGQ6IFBlcEZpZWxkQmFzZTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9uc0ZvckN1c3RvbUZpZWxkKFxuICAgICAgICAgICAgY29udHJvbEZpZWxkLFxuICAgICAgICAgICAgZGF0YUZpZWxkLFxuICAgICAgICAgICAgY2FuRWRpdE9iamVjdFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb250cm9sRmllbGQuQXBpTmFtZSA9PT0gJ09iamVjdE1lbnUnKSB7XG4gICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnbWVudSc7XG4gICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBJbnRlcm5hbE1lbnVGaWVsZChvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbFF1YW50aXR5U2VsZWN0b3IgfHxcbiAgICAgICAgICAgIGNvbnRyb2xGaWVsZC5GaWVsZFR5cGUgPT09XG4gICAgICAgICAgICBGSUVMRF9UWVBFLk51bWJlckludGVnZXJRdWFudGl0eVNlbGVjdG9yIHx8XG4gICAgICAgICAgICBjb250cm9sRmllbGQuQXBpTmFtZSA9PT0gJ1F1YW50aXR5U2VsZWN0b3InIHx8XG4gICAgICAgICAgICBjb250cm9sRmllbGQuQXBpTmFtZSA9PT0gJ1VuaXRzUXVhbnRpdHknIHx8XG4gICAgICAgICAgICBjb250cm9sRmllbGQuQXBpTmFtZS5pbmRleE9mKCdzaXplXycpID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuSW50ZXJuYWxMaW5rKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuUGFja2FnZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdwYWNrYWdlQnV0dG9uJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3FzJztcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93RGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09XG4gICAgICAgICAgICAgICAgRklFTERfVFlQRS5OdW1iZXJJbnRlZ2VyUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlclxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3FzJztcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93RGVjaW1hbCA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlckludGVnZXJGb3JNYXRyaXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdxc0Zvck1hdHJpeCc7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hbGxvd0RlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsRm9yTWF0cml4KSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3FzRm9yTWF0cml4JztcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93RGVjaW1hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9wdGlvbnMubm90aWZpY2F0aW9uSW5mbyA9IGRhdGFGaWVsZC5Ob3RpZmljYXRpb25JbmZvO1xuICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwUXVhbnRpdHlTZWxlY3RvckZpZWxkKG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSEFDSzogbmVlZCB0byByZW1vdmUgdGhpcy4uXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5JbmRpY2F0b3JzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5pc01hdHJpeEZpZWxkKGRhdGFGaWVsZC5BcGlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZpZWxkVHlwZSA9IEZJRUxEX1RZUEUuSW50ZXJuYWxQYWdlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGRhdGFGaWVsZC5GaWVsZFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQWRkcmVzczoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5FZGl0R3JvdXBPYmplY3QgPSBjb250cm9sRmllbGQuUmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuRWRpdE9iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ncm91cEZpZWxkcyA9IHRoaXMuY29udmVydEFkZHJlc3NGaWVsZHMoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmllbGQuR3JvdXBGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5FZGl0R3JvdXBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwQWRkcmVzc0ZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkluZGljYXRvcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uc1sndHlwZSddID0gJ2luZGljYXRvcnMnOyAvLyBOb3QgbmVlZGVkIHRoaXMgaXMgUGVwSW5kaWNhdG9yc0ZpZWxkLlxuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBJbmRpY2F0b3JzRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuSW50ZXJuYWxQYWdlOiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTWF0cml4RmllbGQoY29udHJvbEZpZWxkLkFwaU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJvd1NwYW4gPSBjb250cm9sRmllbGQuTGF5b3V0LkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub2JqZWN0SWQgPSBvYmplY3RJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyZW50SWQgPSBwYXJlbnRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQ29kZSA9IHNlYXJjaENvZGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsUGFnZUZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuUmVsYXRlZE9iamVjdHNDYXJkczoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJvd1NwYW4gPSBjb250cm9sRmllbGQuTGF5b3V0LkhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZWFyY2hDb2RlID0gc2VhcmNoQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYWdlSW5mbyA9IGRhdGFGaWVsZC5VSVBhZ2VJbmZvO1xuXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsQ2FydXNlbEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkxpbms6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ2xpbmsnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBMaW5rRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuSW50ZXJuYWxMaW5rOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5CdXR0b246IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsQnV0dG9uRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQXR0YWNobWVudDoge1xuICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25zLnR5cGUgPSAnYXR0YWNobWVudCc7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEF0dGFjaG1lbnRGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5TaWduYXR1cmU6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9ucy50eXBlID0gJ3NpZ25hdHVyZSc7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFNpZ25hdHVyZUZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkltYWdlOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5JbWFnZVVSTDoge1xuICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25zLnR5cGUgPSAnaW1hZ2UnO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1lbnVGaWVsZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51RmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvZXNGaWVsZEhhdmFGbG9hdGluZ0ZpZWxkKGNvbnRyb2xGaWVsZCwgbWVudUZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbWVudUZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhhc0NhbXBhaWduRmllbGQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2FtcGFpZ25GaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9lc0ZpZWxkSGF2YUZsb2F0aW5nRmllbGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2FtcGFpZ25GaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGhhc0NhbXBhaWduRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kaWNhdG9yc0ZpZWxkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvcnNGaWVsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9lc0ZpZWxkSGF2YUZsb2F0aW5nRmllbGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yc0ZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW5kaWNhdG9yc0ZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEltYWdlRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuSW1hZ2VzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMudHlwZSA9ICdpbWFnZXMnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBJbWFnZXNGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5FbWFpbDoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnZW1haWwnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBMaW5rRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuUGhvbmU6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3Bob25lJztcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwTGlua0ZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkR1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdkdXJhdGlvbic7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFRleHRib3hGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5EZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5UZXh0Qm94OlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5MaW1pdGVkTGVuZ3RoVGV4dEJveDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuVGV4dEhlYWRlcjpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQ2FsY3VsYXRlZFN0cmluZzpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTWFwRGF0YVN0cmluZzoge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBUZXh0Ym94RmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuVGV4dEFyZWE6IHtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwVGV4dGFyZWFGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLlJpY2hUZXh0SFRNTDoge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBSaWNoSHRtbFRleHRhcmVhRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuRGF0ZTpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTGltaXRlZERhdGU6XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkNhbGN1bGF0ZWREYXRlOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5EYXRlQW5kVGltZToge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5EYXRlQW5kVGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2RhdGV0aW1lJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2RhdGUnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBEYXRlRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlcjpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQ2FsY3VsYXRlZEludDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTWFwRGF0YUludDoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnaW50JztcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwVGV4dGJveEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLlBlcmNlbnRhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3BlcmNlbnRhZ2UnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBUZXh0Ym94RmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQ3VycmVuY3k6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ2N1cnJlbmN5JztcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwVGV4dGJveEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLk51bWJlclJlYWw6XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkNhbGN1bGF0ZWRSZWFsOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5NYXBEYXRhUmVhbDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuU3VtOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5Ub3RhbHM6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3JlYWwnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBUZXh0Ym94RmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuQ2FsY3VsYXRlZEJvb2w6IHtcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwQ2hlY2tib3hGaWVsZChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5Cb29sZWFuVGV4dDoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnYm9vbGVhblRleHQnO1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBDaGVja2JveEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkNvbWJvQm94OlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5FbXB0eUNvbWJvQm94OlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5NYXBEYXRhRHJvcERvd246IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9ucy50eXBlID0gJ3NlbGVjdCc7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFNlbGVjdEZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLk11bHRpVGlja0JveDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTXVsdGlUaWNrQm94VG9Db21ib0JveDpcbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuRW1wdHlNdWx0aVRpY2tCb3g6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ211bHRpJztcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwU2VsZWN0RmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuR3VpZFJlZmVyZW5jZVR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3JlZmVyZW5jZSc7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmVmZXJlbmNlT2JqZWN0VHlwZSA9IGRhdGFGaWVsZC5SZWZlcmVuY2VPYmplY3RUeXBlO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJlZmVyZW5jZU9iamVjdFN1YlR5cGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpZWxkLlJlZmVyZW5jZU9iamVjdFN1YlR5cGU7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmVmZXJlbmNlT2JqZWN0SW50ZXJuYWxUeXBlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZC5SZWZlcmVuY2VPYmplY3RJbnRlcm5hbFR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsQnV0dG9uRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuTGlzdE9mT2JqZWN0czoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnbGlzdG9mb2JqZWN0cyc7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcEludGVybmFsQnV0dG9uRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEX1RZUEUuU2VwYXJhdG9yOiB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkID0gbmV3IFBlcFNlcGFyYXRvckZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLkltYWdlczogcmV0dXJuIHRoYXQuZmllbGQodmFsdWUpO1xuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLk51bWJlclJlYWxRdWFudGl0eVNlbGVjdG9yOlxuICAgICAgICAgICAgICAgIGNhc2UgRklFTERfVFlQRS5OdW1iZXJJbnRlZ2VyUXVhbnRpdHlTZWxlY3Rvcjoge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAncXMnO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93RGVjaW1hbCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmllbGQuRmllbGRUeXBlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgRklFTERfVFlQRS5OdW1iZXJSZWFsUXVhbnRpdHlTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ub3RpZmljYXRpb25JbmZvID0gZGF0YUZpZWxkLk5vdGlmaWNhdGlvbkluZm87XG5cbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmllbGQgPSBuZXcgUGVwUXVhbnRpdHlTZWxlY3RvckZpZWxkKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBGSUVMRF9UWVBFLlBhY2thZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ3BhY2thZ2VCdXR0b24nO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vdGlmaWNhdGlvbkluZm8gPSBkYXRhRmllbGQuTm90aWZpY2F0aW9uSW5mbztcblxuICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBRdWFudGl0eVNlbGVjdG9yRmllbGQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY3VzdG9tRmllbGQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMubGFiZWwgPSBjb250cm9sRmllbGQuQXBpTmFtZSArICcgaXMgbm90IHN1cHBvcnRlZCEhISc7XG4gICAgICAgICAgICBjdXN0b21GaWVsZCA9IG5ldyBQZXBTZXBhcmF0b3JGaWVsZChvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXN0b21GaWVsZDtcbiAgICB9XG5cbiAgICBnZXRGaWVsZEZvcm1hdHRlZFZhbHVlKGZpZWxkOiBQZXBGaWVsZEJhc2UpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZmllbGRGb3JtYXR0ZWRWYWx1ZSA9IGZpZWxkLmZvcm1hdHRlZFZhbHVlO1xuXG4gICAgICAgIC8vIEZpeCBmb3IgdGhlIGN1c3RvbSBjaGVjayBib3ggY29tcG9uZW50LlxuICAgICAgICBpZiAoZmllbGQuY29udHJvbFR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgIGZpZWxkRm9ybWF0dGVkVmFsdWUgPSBmaWVsZEZvcm1hdHRlZFZhbHVlID09PSAndHJ1ZSc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXggZm9yIHRoZSBjdXN0b20gYnV0dG9uIGNvbXBvbmVudC5cbiAgICAgICAgaWYgKGZpZWxkLmNvbnRyb2xUeXBlID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgZmllbGRGb3JtYXR0ZWRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgZmllbGRGb3JtYXR0ZWRWYWx1ZSA9PT0gJzAnID8gJycgOiBmaWVsZEZvcm1hdHRlZFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkRm9ybWF0dGVkVmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b0NvbnRyb2xHcm91cChmaWVsZHM6IFBlcEZpZWxkQmFzZVtdKTogRm9ybUdyb3VwIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB7fTtcbiAgICAgICAgaWYgKGZpZWxkcyAmJiBmaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdyb3VwRmllbGRzICYmIGZpZWxkLmdyb3VwRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViR3JvdXAgPSB7fTtcblxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5ncm91cEZpZWxkcy5mb3JFYWNoKChncm91cEZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZC5tYW5kYXRvcnkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZmllbGQucmVhZG9ubHkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZmllbGQuZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ykdyb3VwW2dyb3VwRmllbGQua2V5XSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdyb3VwRmllbGQuZm9ybWF0dGVkVmFsdWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWFkb25seSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmRpc2FibGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZC5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ykdyb3VwW2dyb3VwRmllbGQua2V5XSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdyb3VwRmllbGQuZm9ybWF0dGVkVmFsdWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZWFkb25seSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmRpc2FibGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBGaWVsZC5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZmllbGQua2V5XSA9IHRoaXMuZmIuZ3JvdXAoc3ViR3JvdXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBmaWVsZC5nZXRWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkRm9ybWF0dGVkVmFsdWUgPSB0aGlzLmdldEZpZWxkRm9ybWF0dGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwW2ZpZWxkLmtleV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkRm9ybWF0dGVkVmFsdWUgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZpZWxkLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMsXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5mYi5ncm91cChncm91cCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCYXNlRmllbGQodWlDb250cm9sRmllbGQ6IFVJQ29udHJvbEZpZWxkLCBkYXRhRmllbGQ6IGFueSkge1xuICAgICAgICBjb25zdCBjdXN0b21GaWVsZDogUGVwRmllbGRCYXNlID0gdGhpcy5jb252ZXJ0VG9DdXN0b21GaWVsZChcbiAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLFxuICAgICAgICAgICAgZGF0YUZpZWxkLFxuICAgICAgICAgICAgdGhpcy5jYW5FZGl0T2JqZWN0LFxuICAgICAgICAgICAgdGhpcy5tZW51RGF0YUZpZWxkLFxuICAgICAgICAgICAgdGhpcy5oYXNDYW1wYWlnbkRhdGFGaWVsZCxcbiAgICAgICAgICAgIHRoaXMuaW5kaWNhdG9yc0RhdGFGaWVsZCxcbiAgICAgICAgICAgIHRoaXMub2JqZWN0SWQsXG4gICAgICAgICAgICB0aGlzLnBhcmVudElkLFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hDb2RlXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGN1c3RvbUZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93Rm9ybVZhbGlkYXRpb25NZXNzYWdlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZHM6IFBlcEZpZWxkQmFzZVtdID0gdGhpcy5maWVsZHM7XG4gICAgICAgIGxldCBlbXB0eU1hbmRhdG9yeUZpZWxkc01zZyA9ICcnO1xuICAgICAgICBsZXQgbm90VmFsaWRGaWVsZHNNc2cgPSAnJztcblxuICAgICAgICAvLyBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vICAgICBsZXQgZmllbGQgPSBmaWVsZHNbaV07XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybSAmJiB0aGlzLmZvcm0uZ2V0KGZpZWxkLmtleSk7XG5cbiAgICAgICAgICAgIGlmIChmb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIC8vIE1hbmRhdG9yeSBpcyBlbXB0eS5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLm1hbmRhdG9yeSAmJlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbC52YWx1ZS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZW1wdHlNYW5kYXRvcnlGaWVsZHNNc2cgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGk+PHNtYWxsPicgKyBmaWVsZC5sYWJlbCArICc8L3NtYWxsPjwvbGk+JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaWVsZC5kaXNhYmxlZCAmJiAhZm9ybUNvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm90VmFsaWRGaWVsZHNNc2cgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICc8bGk+PHNtYWxsPicgKyBmaWVsZC5sYWJlbCArICc8L3NtYWxsPjwvbGk+JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGhlIGhlYWRlciBtZXNzYWdlIG9mIHRoZSBlbXB0eSBtYW5kYXRvcnkgZmllbGRzXG4gICAgICAgIGlmIChlbXB0eU1hbmRhdG9yeUZpZWxkc01zZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBlbXB0eU1hbmRhdG9yeUZpZWxkc01zZyA9XG4gICAgICAgICAgICAgICAgJzxkaXY+JyArXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTUVTU0FHRVMuRVJST1JfTUFOREFUT1JZX0ZJRUxEUycpICtcbiAgICAgICAgICAgICAgICBcIjwvZGl2Pjx1bCBzdHlsZT0ncGFkZGluZzogMCAyMHB4Oyc+XCIgK1xuICAgICAgICAgICAgICAgIGVtcHR5TWFuZGF0b3J5RmllbGRzTXNnICtcbiAgICAgICAgICAgICAgICAnPC91bD48YnIvPic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGhlIGhlYWRlciBtZXNzYWdlIG9mIHRoZSBlbXB0eSBtYW5kYXRvcnkgZmllbGRzXG4gICAgICAgIGlmIChub3RWYWxpZEZpZWxkc01zZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBub3RWYWxpZEZpZWxkc01zZyA9XG4gICAgICAgICAgICAgICAgJzxkaXY+JyArXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTUVTU0FHRVMuRVJST1JfSU5WQUxJRF9GSUVMRFMnKSArXG4gICAgICAgICAgICAgICAgXCI8L2Rpdj48dWwgc3R5bGU9J3BhZGRpbmc6IDAgMjBweDsnPlwiICtcbiAgICAgICAgICAgICAgICBub3RWYWxpZEZpZWxkc01zZyArXG4gICAgICAgICAgICAgICAgJzwvdWw+JztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnTUVTU0FHRVMuVElUTEVfTk9USUNFJyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgUGVwRGlhbG9nRGF0YSh7XG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGVtcHR5TWFuZGF0b3J5RmllbGRzTXNnICsgbm90VmFsaWRGaWVsZHNNc2csXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbkRlZmF1bHREaWFsb2coZGF0YSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRoZW1lVmFycyA9IHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2UuZ2V0VGhlbWVWYXJpYWJsZXMoKTtcbiAgICAgICAgLy8gY29udmVydCByZW0gdG8gcGl4ZWxcbiAgICAgICAgY29uc3QgUmVtVG9QaXhlbCA9IDE2O1xuICAgICAgICB0aGlzLmZvcm1HdXR0ZXJTaXplID1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2UuZ2V0TnVtYmVyVGhlbWVWYXJpYWJsZShcbiAgICAgICAgICAgICAgICB0aGVtZVZhcnMsXG4gICAgICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9STV9TUEFDRUlOR19LRVlcbiAgICAgICAgICAgICkgKiBSZW1Ub1BpeGVsO1xuICAgICAgICB0aGlzLmNhcmRHdXR0ZXJTaXplID1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9taXphdGlvblNlcnZpY2UuZ2V0TnVtYmVyVGhlbWVWYXJpYWJsZShcbiAgICAgICAgICAgICAgICB0aGVtZVZhcnMsXG4gICAgICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ0FSRF9TUEFDRUlOR19LRVlcbiAgICAgICAgICAgICkgKiBSZW1Ub1BpeGVsO1xuICAgIH1cblxuICAgIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuZGlmZmVyLmRpZmYodGhpcy5kYXRhKTsgLy8gY2hlY2sgZm9yIGNoYW5nZXNcbiAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybSgpO1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckNoYW5nZXMgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcyk6IHZvaWQge1xuICAgICAgICAvLyBpZiAoY2hhbmdlcy5kYXRhICYmIGNoYW5nZXMuZGF0YS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgLy8gICAgIC8vIExvYWQgY2hhbmdlc1xuICAgICAgICAvLyAgICAgaWYgKCF0aGlzLnNob3VsZFJlbG9hZEZvcm0gJiYgY2hhbmdlcy5kYXRhLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmRhdGEgPSBjaGFuZ2VzLmRhdGEuY3VycmVudFZhbHVlO1xuICAgICAgICAvLyAgICAgICAgIHRoaXMudXBkYXRlRm9ybSgpO1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl9zaG91bGRSZWxvYWRGb3JtID0gZmFsc2U7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGlmICh0aGlzLnNob3VsZFJlbG9hZEZvcm0gfHwgIWNoYW5nZXM/LmRhdGE/LnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgLy8gICAgIHRoaXMuX3Nob3VsZFJlbG9hZEZvcm0gPSBmYWxzZTtcbiAgICAgICAgLy8gICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICAgICAgLy8gICAgIHRoaXMuY2hlY2tGb3JDaGFuZ2VzID0gbmV3IERhdGUoKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvL1xuICAgIH1cblxuICAgIGdldFVpQ29udHJvbEZpZWxkcygpOiBBcnJheTxVSUNvbnRyb2xGaWVsZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQgPyB0aGlzLmxheW91dC5Db250cm9sRmllbGRzIDogW107XG4gICAgfVxuXG4gICAgaW5pdEZpZWxkc1N0cnVjdHVyZShmaWVsZHM6IFBlcEZpZWxkQmFzZVtdLCBtYXhSb3c6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB0aGVtZVZhcnMgPSB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmdldFRoZW1lVmFyaWFibGVzKCk7XG5cbiAgICAgICAgLy8gU2V0IGZvcm0gcm93IGhlaWdodC5cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0VHlwZSA9PT0gJ2NhcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBjYXJkRmllbGRIZWlnaHQgPSB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNBUkRfRklFTERfSEVJR0hUX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucm93SGVpZ2h0ID0gY2FyZEZpZWxkSGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgcm93RmllbGRIZWlnaHQgPSB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkZPUk1fRklFTERfSEVJR0hUX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJvd0ZpZWxkVGl0bGVIZWlnaHQgPSB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkZPUk1fRklFTERfVElUTEVfSEVJR0hUX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucm93SGVpZ2h0ID0gcm93RmllbGRIZWlnaHQgKyByb3dGaWVsZFRpdGxlSGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWVsZHMgc3RydWN0dXJlICh0aGUgZmllbGRzIG11c3QgYmUgc29ydGVkISEhKS5cbiAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBJbml0IHRoZSBsYXlvdXQuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5sYXlvdXRUeXBlID09PSAnZm9ybScgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dFR5cGUgPT09ICd0YWJsZSdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpZWxkc1N1YmplY3QubmV4dChmaWVsZHMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dzID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBtYXhSb3c7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd3NbaV0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGZpZWxkID0gZmllbGRzW2ldXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dzW2ZpZWxkLnJvd10ucHVzaChmaWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2VzZmllbGRFeGlzdEluOiBib29sZWFuW11bXSA9IG5ldyBBcnJheShtYXhSb3cpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2VzZmllbGRFeGlzdEluLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5baV0gPSBuZXcgQXJyYXkodGhpcy5jb2x1bW5zKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRvZXNmaWVsZEV4aXN0SW5baV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5baV1bal0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJ1biBpbiBzcXVlcmUgKHJvdyAtIGNvbHNwYW4sIGNvbCAtIHJvd3NwYW4pIGFuZCBwdXQgdHJ1ZSB3aGVyZSBpdCBzaG91bGQuXG4gICAgICAgICAgICAgICAgLy8gZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29uc3QgY3VycmVudEZpZWxkID0gZmllbGRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRGaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5yb3dTcGFuID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93OiBudW1iZXIgPSBjdXJyZW50RmllbGQucm93O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8IGN1cnJlbnRGaWVsZC5yb3cgKyBjdXJyZW50RmllbGQucm93U3BhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3crK1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5jb2xTcGFuID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbDogbnVtYmVyID0gY3VycmVudEZpZWxkLmNvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuY29sICsgY3VycmVudEZpZWxkLmNvbFNwYW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wrK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzZmllbGRFeGlzdEluLmxlbmd0aCA+IHJvdyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bMF0ubGVuZ3RoID4gY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzZmllbGRFeGlzdEluW3Jvd11bY29sXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzZmllbGRFeGlzdEluLmxlbmd0aCA+IHJvdyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc2ZpZWxkRXhpc3RJblswXS5sZW5ndGggPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkLmNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bcm93XVtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RmllbGQuY29sU3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbDogbnVtYmVyID0gY3VycmVudEZpZWxkLmNvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPCBjdXJyZW50RmllbGQuY29sICsgY3VycmVudEZpZWxkLmNvbFNwYW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sKytcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc2ZpZWxkRXhpc3RJbi5sZW5ndGggPiBjdXJyZW50RmllbGQucm93ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bMF0ubGVuZ3RoID4gY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bY3VycmVudEZpZWxkLnJvd11bY29sXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW4ubGVuZ3RoID4gY3VycmVudEZpZWxkLnJvdyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNmaWVsZEV4aXN0SW5bMF0ubGVuZ3RoID4gY3VycmVudEZpZWxkLmNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc2ZpZWxkRXhpc3RJbltjdXJyZW50RmllbGQucm93XVtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkLmNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGVtcHR5IGZpZWxkcyB3aGVyZSBkb2VzZmllbGRFeGlzdEluIGlzIGZhbHNlIChGb3IgdGhlIG1kLWdyaWQtbGlzdCBVSSBDb21wb25lbnQpLlxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9lc2ZpZWxkRXhpc3RJbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRvZXNmaWVsZEV4aXN0SW5baV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9lc2ZpZWxkRXhpc3RJbltpXVtqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBlbXB0eSBmaWVsZCBhbmQgYWRkIGl0IHRvIHRoZSBmaWVsZHMgbGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBlcFBsYWNlaG9sZGVyRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBpICsgJ18nICsgaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5kYXRvcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U3BhbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbDogaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbFNwYW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU29ydCB0aGUgZmllbGRzIGFnYWluLlxuICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzLnNvcnQoKGYxLCBmMikgPT5cbiAgICAgICAgICAgICAgICAgICAgZjEucm93ID4gZjIucm93XG4gICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZjEucm93IDwgZjIucm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZjEuY29sID4gZjIuY29sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGYxLmNvbCA8IGYyLmNvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWVsZHNTdWJqZWN0Lm5leHQoZmllbGRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEZvcm0oaXNGb3JVcGRhdGUgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBsZXQgYWxsRmllbGRzQXJlUmVhZE9ubHkgPSB0cnVlO1xuXG4gICAgICAgIGlmICghaXNGb3JVcGRhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjdXJyZW50RmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgYWxsIGZpZWxkcyBleGNlcHQgJ2ludGVybmFsUGFnZScgKGZvciBjaGlsZHJlbikuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5jb250cm9sVHlwZSAhPT0gJ2ludGVybmFsUGFnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzLnB1c2goY3VycmVudEZpZWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRGaWVsZC5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxGaWVsZHNBcmVSZWFkT25seSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy50b0NvbnRyb2xHcm91cChmaWVsZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXBkYXRlIGZvcm0gdmFsdWVzIGlmIGNoYW5nZWQgYnkgY2FsY3VsYXRlZCBmaWVsZHMuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRGaWVsZCA9IHRoaXMuZmllbGRzW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZC5jb250cm9sVHlwZSA9PT0gJ2ludGVybmFsQ2FydXNlbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFjayB0byBvdmVycmlkZSAodXBkYXRlKSB0aGUgZmllbGQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbEZpZWxkID0gdGhpcy5nZXRVaUNvbnRyb2xGaWVsZHMoKS5maW5kKGNmID0+IGNmLkFwaU5hbWUgPT09IGN1cnJlbnRGaWVsZC5rZXkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhRmllbGQgPSB0aGlzLmRhdGEuRmllbGRzLmZpbmQoZGYgPT4gZGYuQXBpTmFtZSA9PT0gY3VycmVudEZpZWxkLmtleSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCA9IHRoaXMuY3JlYXRlQmFzZUZpZWxkKHVpQ29udHJvbEZpZWxkLCBkYXRhRmllbGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWVsZHNTdWJqZWN0LnZhbHVlW2ldID0gY3VycmVudEZpZWxkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEZpZWxkLmNvbnRyb2xUeXBlICE9PSAnaW50ZXJuYWxQYWdlJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuZ3JvdXBGaWVsZHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5ncm91cEZpZWxkcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RmllbGQuZ3JvdXBGaWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsZXQgY3VycmVudEdyb3VwRmllbGQgPSBjdXJyZW50RmllbGQuZ3JvdXBGaWVsZHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRHcm91cEZpZWxkIG9mIGN1cnJlbnRGaWVsZC5ncm91cEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkRm9ybWF0dGVkVmFsdWUgPSB0aGlzLmdldEZpZWxkRm9ybWF0dGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbWl6YXRpb25TZXJ2aWNlLnVwZGF0ZUZvcm1GaWVsZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXBGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGb3JtYXR0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkRm9ybWF0dGVkVmFsdWUgPSB0aGlzLmdldEZpZWxkRm9ybWF0dGVkVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5mb3JtLmNvbnRyb2xzW2N1cnJlbnRGaWVsZC5rZXldLnNldFZhbHVlKGZpZWxkRm9ybWF0dGVkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXN0b21pemF0aW9uU2VydmljZS51cGRhdGVGb3JtRmllbGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZvcm1hdHRlZFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50RmllbGQucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRmllbGRzQXJlUmVhZE9ubHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNGb3JtVmFsaWQgPSB0aGlzLmZvcm0/LnZhbGlkO1xuXG4gICAgICAgIC8vIENoYW5nZSB2YWxpZGF0aW9uIHRvIHRydWUgaWYgYWxsIGZpZWxkcyBhcmUgcmVhZCBvbmx5LlxuICAgICAgICBpZiAoIWlzRm9ybVZhbGlkICYmIGFsbEZpZWxkc0FyZVJlYWRPbmx5KSB7XG4gICAgICAgICAgICBpc0Zvcm1WYWxpZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRm9ybVZhbGlkYXRpb25DaGFuZ2VkKGlzRm9ybVZhbGlkKTtcblxuICAgICAgICAvLyBTZXQgaXQgdG8gZmFsc2UgdG8gZW5hYmxlIGFsbCBmaWVsZHMuXG4gICAgICAgIGlmICh0aGlzLmlzSW50ZXJuYWwgJiYgdGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5pc0xvY2tlZCA9IGZhbHNlOyBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRGb3JtKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5GaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkczogUGVwRmllbGRCYXNlW10gPSB0aGlzLmNvbnZlcnRDdXN0b21GaWVsZHMoXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRVaUNvbnRyb2xGaWVsZHMoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuRmllbGRzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBtYXhSb3cgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAuLi5maWVsZHMubWFwKChmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmLnJvdyArIGYucm93U3BhbjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgIC4uLmZpZWxkcy5tYXAoKGYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYuY29sICsgZi5jb2xTcGFuO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLmluaXRGaWVsZHNTdHJ1Y3R1cmUoZmllbGRzLCBtYXhSb3cpO1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZpZWxkKFxuICAgICAgICBjdXN0b21GaWVsZDogUGVwRmllbGRCYXNlLFxuICAgICAgICB1cGRhdGVkRmllbGQ6IE9iamVjdHNEYXRhUm93Q2VsbFxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgICAgICAgICBkaXNhYmxlZDogIXVwZGF0ZWRGaWVsZC5FbmFibGVkIHx8ICF0aGlzLmNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICByZWFkb25seTogIXVwZGF0ZWRGaWVsZC5FbmFibGVkIHx8ICF0aGlzLmNhbkVkaXRPYmplY3QsXG4gICAgICAgICAgICB2aXNpYmxlOiB1cGRhdGVkRmllbGQuVmlzaWJsZSxcbiAgICAgICAgICAgIHZhbHVlOiB1cGRhdGVkRmllbGQuVmFsdWUsXG4gICAgICAgICAgICBhZGRpdGlvbmFsVmFsdWU6IHVwZGF0ZWRGaWVsZC5BZGRpdGlvbmFsVmFsdWUsXG4gICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogdXBkYXRlZEZpZWxkLkZvcm1hdHRlZFZhbHVlLFxuICAgICAgICAgICAgdGV4dENvbG9yOiB1cGRhdGVkRmllbGQuVGV4dENvbG9yLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjdXN0b21GaWVsZCBpbnN0YW5jZW9mIFBlcFF1YW50aXR5U2VsZWN0b3JGaWVsZCkge1xuICAgICAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uSW5mbyA9IHVwZGF0ZWRGaWVsZC5Ob3RpZmljYXRpb25JbmZvO1xuICAgICAgICAgICAgb3B0aW9ucy5ub3RpZmljYXRpb25JbmZvID0gbm90aWZpY2F0aW9uSW5mbztcblxuICAgICAgICAgICAgLy8gQ2hhbmdlIHR5cGUgaWYgaXQncyBjaGFuZ2UgKG9ubHkgZm9yIGFsbG93RGVjaW1hbCkuXG4gICAgICAgICAgICBsZXQgYWxsb3dEZWNpbWFsID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodXBkYXRlZEZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbCB8fFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRGaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbEZvck1hdHJpeFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYWxsb3dEZWNpbWFsID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dEZWNpbWFsID0gYWxsb3dEZWNpbWFsO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY3VzdG9tRmllbGQgaW5zdGFuY2VvZiBQZXBTZWxlY3RGaWVsZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5vcHRpb25zID0gdGhpcy5jb252ZXJ0T3B0aW9uYWxWYWx1ZXMoXG4gICAgICAgICAgICAgICAgdXBkYXRlZEZpZWxkLk9wdGlvbmFsVmFsdWVzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMub3B0aW9ucyB8fCBvcHRpb25zLm9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmZvcm1hdHRlZFZhbHVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUZpZWxkIGluc3RhbmNlb2YgUGVwSW50ZXJuYWxDYXJ1c2VsRmllbGQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucGFnZUluZm8gPSB1cGRhdGVkRmllbGQuVUlQYWdlSW5mbztcbiAgICAgICAgfVxuXG4gICAgICAgIGN1c3RvbUZpZWxkLnVwZGF0ZShvcHRpb25zKTtcbiAgICB9XG5cbiAgICB1cGRhdGVGb3JtKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5GaWVsZHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudEZpZWxkIG9mIHRoaXMuZGF0YS5GaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21GaWVsZCA9IHRoaXMuZmllbGRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKGYpID0+IGYua2V5ID09PSBjdXJyZW50RmllbGQuQXBpTmFtZVxuICAgICAgICAgICAgICAgIClbMF07XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGFsbCBmaWVsZHMgZXhjZXB0ICdpbnRlcm5hbFBhZ2UnIHR5cGUgKGZvciBjaGlsZHJlbikuXG4gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUZpZWxkICYmIGN1c3RvbUZpZWxkLmNvbnRyb2xUeXBlICE9PSAnaW50ZXJuYWxQYWdlJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkKGN1c3RvbUZpZWxkLCBjdXJyZW50RmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZ3JvdXAgZmllbGRzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZC5jb250cm9sVHlwZSA9PT0gJ2FkZHJlc3MnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuR3JvdXBGaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgKGxldCBqID0gMDsgaiA8IGN1cnJlbnRGaWVsZC5Hcm91cEZpZWxkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGN1cnJlbnRHcm91cEZpZWxkID0gY3VycmVudEZpZWxkLkdyb3VwRmllbGRzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjdXJyZW50R3JvdXBGaWVsZCBvZiBjdXJyZW50RmllbGQuR3JvdXBGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXBGaWVsZC5FbmFibGVkID0gIWN1cnJlbnRGaWVsZC5FbmFibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50R3JvdXBGaWVsZC5FbmFibGVkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tR3JvdXBGaWVsZCA9IGN1c3RvbUZpZWxkLmdyb3VwRmllbGRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGYpID0+IGYua2V5ID09PSBjdXJyZW50R3JvdXBGaWVsZC5BcGlOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21Hcm91cEZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50R3JvdXBGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Rm9ybSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBSZWxvYWRGb3JtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zaG91bGRSZWxvYWRGb3JtID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBvblN1Ym1pdCgpIHtcbiAgICAvLyAgICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgIC8vICAgICAgICAgdGhpcy5wYXlMb2FkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5mb3JtLnZhbHVlKTtcbiAgICAvLyAgICAgICAgIC8vdGhpcy5zdWJtaXR0ZWQuZW1pdCh0aGlzLmZvcm0udmFsdWUpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgcHJpdmF0ZSBnZXRGb3JtQ29udHJvbEJ5SWQoa2V5OiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICAgICAgbGV0IGZvcm1Db250cm9sID0gbnVsbDtcblxuICAgICAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkLmtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5ncm91cEZpZWxkcyAmJiBmaWVsZC5ncm91cEZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuZ3JvdXBGaWVsZHMuZm9yRWFjaCgoZ3JvdXBGaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBGaWVsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmtleSArICcuJyArIGdyb3VwRmllbGQua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmb3JtQ29udHJvbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFNwZWNpYWxGaWVsZHMoXG4gICAgICAgIGNvbnRyb2xGaWVsZHM6IEFycmF5PGFueT4sXG4gICAgICAgIGRhdGFGaWVsZHM6IEFycmF5PGFueT5cbiAgICApOiB2b2lkIHtcbiAgICAgICAgLy8gbGV0IGNmO1xuICAgICAgICAvLyBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udHJvbEZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgLy8gICAgIGNmID0gY29udHJvbEZpZWxkc1tpbmRleF07XG4gICAgICAgIGZvciAoY29uc3QgY2Ygb2YgY29udHJvbEZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGNmLkFwaU5hbWUgPT09ICdPYmplY3RNZW51Jykge1xuICAgICAgICAgICAgICAgIHRoaXMubWVudUZpZWxkID0gY2Y7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNmLkFwaU5hbWUgPT09ICdJdGVtSGFzQWN0aXZlQ2FtcGFpZ24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNDYW1wYWlnbkZpZWxkID0gY2Y7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNmLkFwaU5hbWUgPT09ICdJdGVtSW5kaWNhdG9yc1dpdGhvdXRDYW1wYWlnbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGljYXRvcnNGaWVsZCA9IGNmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGV0IGRmO1xuICAgICAgICAvLyBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YUZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgLy8gICAgIGRmID0gZGF0YUZpZWxkc1tpbmRleF07XG4gICAgICAgIGZvciAoY29uc3QgZGYgb2YgZGF0YUZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGRmLkFwaU5hbWUgPT09ICdPYmplY3RNZW51Jykge1xuICAgICAgICAgICAgICAgIHRoaXMubWVudURhdGFGaWVsZCA9IGRmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZi5BcGlOYW1lID09PSAnSXRlbUhhc0FjdGl2ZUNhbXBhaWduJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQ2FtcGFpZ25EYXRhRmllbGQgPSBkZjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGYuQXBpTmFtZSA9PT0gJ0l0ZW1JbmRpY2F0b3JzV2l0aG91dENhbXBhaWduJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kaWNhdG9yc0RhdGFGaWVsZCA9IGRmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWVudUZpZWxkICYmIHRoaXMubWVudURhdGFGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5tZW51RGF0YUZpZWxkLkxheW91dCA9IHRoaXMubWVudUZpZWxkLkxheW91dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0NhbXBhaWduRmllbGQgJiYgdGhpcy5oYXNDYW1wYWlnbkRhdGFGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5oYXNDYW1wYWlnbkRhdGFGaWVsZC5MYXlvdXQgPSB0aGlzLmhhc0NhbXBhaWduRmllbGQuTGF5b3V0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5kaWNhdG9yc0ZpZWxkICYmIHRoaXMuaW5kaWNhdG9yc0RhdGFGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5pbmRpY2F0b3JzRGF0YUZpZWxkLkxheW91dCA9IHRoaXMuaW5kaWNhdG9yc0ZpZWxkLkxheW91dDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIG1lbnUgaXMgZmxvYXRpbmcgb24gb3RoZXIgZmllbGQuXG4gICAgICAgIC8vIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250cm9sRmllbGRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAvLyAgICAgY2YgPSBjb250cm9sRmllbGRzW2luZGV4XTtcbiAgICAgICAgZm9yIChjb25zdCBjZiBvZiBjb250cm9sRmllbGRzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZW51RmllbGQgJiYgY2YuQXBpTmFtZSAhPT0gJ09iamVjdE1lbnUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNNZW51RmxvYXRpbmdPbk90aGVyRmllbGQgPSB0aGlzLmRvZXNGaWVsZEhhdmFGbG9hdGluZ0ZpZWxkKFxuICAgICAgICAgICAgICAgICAgICBjZixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW51RmllbGRcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTWVudUZsb2F0aW5nT25PdGhlckZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnZlcnRDdXN0b21GaWVsZHMoXG4gICAgICAgIGNvbnRyb2xGaWVsZHM6IEFycmF5PGFueT4sXG4gICAgICAgIGRhdGFGaWVsZHM6IEFycmF5PGFueT5cbiAgICApOiBQZXBGaWVsZEJhc2VbXSB7XG4gICAgICAgIGlmICh0aGlzLmxheW91dFR5cGUgIT09ICd0YWJsZScpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3BlY2lhbEZpZWxkcyhjb250cm9sRmllbGRzLCBkYXRhRmllbGRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEhBQ0s6IGNvbnZlcnQgdG8gY2VudGVyIGFsaWdubWVudCBpZiB0YWJsZSB2aWV3ICYgc3BlY2lhbCBmaWVsZHMpXG4gICAgICAgICAgICBjb250cm9sRmllbGRzLmZvckVhY2goKGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuQXBpTmFtZSA9PT0gJ1VuaXRzUXVhbnRpdHknIHx8XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkFwaU5hbWUgPT09ICdRdWFudGl0eVNlbGVjdG9yJyB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5BcGlOYW1lID09PSAnT2JqZWN0TWVudScgfHxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLkltYWdlIHx8XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5JbWFnZVVSTCB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuSW5kaWNhdG9ycyB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuQm9vbGVhbiB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuQ2FsY3VsYXRlZEJvb2wgfHxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLlNpZ25hdHVyZSB8fFxuICAgICAgICAgICAgICAgICAgICBmaWVsZC5GaWVsZFR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgIEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlclF1YW50aXR5U2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlclJlYWxRdWFudGl0eVNlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5QYWNrYWdlIHx8XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJJbnRlZ2VyRm9yTWF0cml4IHx8XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsRm9yTWF0cml4XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLkxheW91dC5YQWxpZ25tZW50ID0gWF9BTElHTk1FTlRfVFlQRS5DZW50ZXI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSEFDSzogYWxpZ24gdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcyBieSB0aGUgY3VsdHVyZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQuTGF5b3V0LlhBbGlnbm1lbnQgPSB0aGlzLmxheW91dFNlcnZpY2UuaXNSdGwoKSA/IFhfQUxJR05NRU5UX1RZUEUuUmlnaHQgOiBYX0FMSUdOTUVOVF9UWVBFLkxlZnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZHM6IFBlcEZpZWxkQmFzZVtdID0gW107XG5cbiAgICAgICAgY29udHJvbEZpZWxkcy5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFGaWVsZCA9IGRhdGFGaWVsZHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChkZikgPT4gZGYuQXBpTmFtZSA9PT0gZmllbGQuQXBpTmFtZVxuICAgICAgICAgICAgKVswXTtcblxuICAgICAgICAgICAgaWYgKCFkYXRhRmllbGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIGN1cnJlbnQgdmlldyBpcyBub3QgdGFibGUgdmlldyBhbmQgdGhvc2UgZmllbGRzIGFyZSBzcGVjaWFsLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0VHlwZSAhPT0gJ3RhYmxlJyAmJlxuICAgICAgICAgICAgICAgICgodGhpcy5oYXNNZW51RmxvYXRpbmdPbk90aGVyRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW51RmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW51RmllbGQuQXBpTmFtZSA9PT0gZmllbGQuQXBpTmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuaW5kaWNhdG9yc0ZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGljYXRvcnNGaWVsZC5BcGlOYW1lID09PSBmaWVsZC5BcGlOYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAodGhpcy5oYXNDYW1wYWlnbkZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc0NhbXBhaWduRmllbGQuQXBpTmFtZSA9PT0gZmllbGQuQXBpTmFtZSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCB0eXBlIHRvIGxpbmtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCAmJiB0aGlzLmZpcnN0RmllbGRBc0xpbmspIHtcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQuRmllbGRUeXBlID0gRklFTERfVFlQRS5JbnRlcm5hbExpbms7XG4gICAgICAgICAgICAgICAgLy8gZGF0YUZpZWxkLlZhbHVlID0gdGhpcy5nZXRJbnRlcm5hbExpbmtIcmVmKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC5BcGlOYW1lID09PSAnT2JqZWN0TWVudScpIHtcbiAgICAgICAgICAgICAgICBkYXRhRmllbGQuRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gSEFDSyA6IFVudGlsIFwiRW5hYmxlZFwiIHJldHVybnMgZnJvbSB0aGUgc2VydmVyLCB3ZSBzZXQgUGVwTWVudSB0byBiZVxuICAgICAgICAgICAgICAgIC8vICAgICAgICBEaXNhYmxlZCBpbiBjYXJ0IG9uIHJlZ3VsYXIgaXRlbXMgYW5kIG5vdCBjYW1waWduIGl0ZW1zLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3VzdG9tRmllbGQ6IFBlcEZpZWxkQmFzZSA9IHRoaXMuY3JlYXRlQmFzZUZpZWxkKGZpZWxkLCBkYXRhRmllbGQpO1xuICAgICAgICAgICAgZmllbGRzLnB1c2goY3VzdG9tRmllbGQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmllbGRzLnNvcnQoKGYxLCBmMikgPT5cbiAgICAgICAgICAgIGYxLnJvdyA+IGYyLnJvd1xuICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgIDogZjEucm93IDwgZjIucm93XG4gICAgICAgICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgICAgICAgOiBmMS5jb2wgPiBmMi5jb2xcbiAgICAgICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmMS5jb2wgPCBmMi5jb2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb25Gb3JtVmFsaWRhdGlvbkNoYW5nZWQoZm9ybVZhbGlkYXRpb25DaGFuZ2U6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1WYWxpZGF0aW9uQ2hhbmdlLmVtaXQoZm9ybVZhbGlkYXRpb25DaGFuZ2UpO1xuICAgIH1cblxuICAgIG9uVmFsdWVDaGFuZ2VkKGV2ZW50OiBJUGVwRmllbGRWYWx1ZUNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Gb3JtVmFsaWRhdGlvbkNoYW5nZWQodGhpcy5mb3JtLnZhbGlkKTtcblxuICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZ2V0Rm9ybUNvbnRyb2xCeUlkKGV2ZW50LmtleSk7XG5cbiAgICAgICAgY29uc3QgaXNWYWxpZCA9IGZvcm1Db250cm9sID8gZm9ybUNvbnRyb2wudmFsaWQgOiB0cnVlO1xuICAgICAgICAvLyBjb25zdCBpc1ZhbGlkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgICAgICAgLy8gU2V0IGl0IHRvIGZhbHNlIHRvIGRpc2FibGUgYWxsIGZpZWxkcy5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW50ZXJuYWwgJiYgdGhpcy5sYXlvdXRUeXBlID09PSAnZm9ybScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IGZpZWxkIHZhbHVlLlxuICAgICAgICAgICAgY29uc3QgY3VycmVudEZpZWxkID0gdGhpcy5maWVsZHMuZmluZCgoZikgPT4gZi5rZXkgPT09IGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEZpZWxkLmZvcm1hdHRlZFZhbHVlID0gY3VycmVudEZpZWxkLnZhbHVlID0gZXZlbnQudmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuZGF0YS5VSUQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB1aU9iamVjdEtleTogdGhpcy5kYXRhLktleSxcbiAgICAgICAgICAgICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQudmFsdWUsXG4gICAgICAgICAgICAgICAgY29udHJvbFR5cGU6IGV2ZW50LmNvbnRyb2xUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNsaWNrKGZpZWxkQ2xpY2tFdmVudDogSVBlcEZpZWxkQ2xpY2tFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGlja2VkVWlDb250cm9sRmllbGQgPSB0aGlzLmRhdGEuRmllbGRzLmZpbHRlcihcbiAgICAgICAgICAgIChmKSA9PiBmLkFwaU5hbWUgPT09IGZpZWxkQ2xpY2tFdmVudC5rZXlcbiAgICAgICAgKVswXTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gdGhpcy5kYXRhLlR5cGUgPyB0aGlzLmRhdGEuVHlwZS50b1N0cmluZygpIDogJyc7XG5cbiAgICAgICAgaWYgKGNsaWNrZWRVaUNvbnRyb2xGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5maWVsZENsaWNrLmVtaXQoe1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuVUlELnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgdWlPYmplY3RLZXk6IHRoaXMuZGF0YS5LZXksXG4gICAgICAgICAgICAgICAga2V5OiBmaWVsZENsaWNrRXZlbnQua2V5LFxuICAgICAgICAgICAgICAgIGlkVHlwZSxcbiAgICAgICAgICAgICAgICB3aGljaDogZmllbGRDbGlja0V2ZW50LmV2ZW50V2hpY2gsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkQ2xpY2tFdmVudC52YWx1ZSxcbiAgICAgICAgICAgICAgICBjb250cm9sVHlwZTogZmllbGRDbGlja0V2ZW50LmNvbnRyb2xUeXBlLFxuICAgICAgICAgICAgICAgIGZpZWxkVHlwZTogY2xpY2tlZFVpQ29udHJvbEZpZWxkLkZpZWxkVHlwZSxcbiAgICAgICAgICAgICAgICBvdGhlckRhdGE6IGZpZWxkQ2xpY2tFdmVudC5vdGhlckRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvciBvdGhlciBhcGkgbmFtZXMgKGxpa2UgZW50ZXIgY2hpbGRyZW4gZXRjKS5cbiAgICAgICAgICAgIHRoaXMuZmllbGRDbGljay5lbWl0KHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5kYXRhLlVJRC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHVpT2JqZWN0S2V5OiB0aGlzLmRhdGEuS2V5LFxuICAgICAgICAgICAgICAgIGtleTogZmllbGRDbGlja0V2ZW50LmtleSxcbiAgICAgICAgICAgICAgICBpZFR5cGUsXG4gICAgICAgICAgICAgICAgd2hpY2g6IGZpZWxkQ2xpY2tFdmVudC5ldmVudFdoaWNoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZENsaWNrRXZlbnQudmFsdWUsXG4gICAgICAgICAgICAgICAgY29udHJvbFR5cGU6IGZpZWxkQ2xpY2tFdmVudC5jb250cm9sVHlwZSxcbiAgICAgICAgICAgICAgICBvdGhlckRhdGE6IGZpZWxkQ2xpY2tFdmVudC5vdGhlckRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgZXZlbnQgaXMgZm9yIGhhbmRsZSB0aGUgaW50ZXJuYWwgcGFnZSBldmVudHMuXG4gICAgb25JbnRlcm5hbEZvcm1GaWVsZENsaWNrZWQoaW50ZXJuYWxGb3JtRmllbGRDbGljazogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxGb3JtRmllbGRDbGljay5lbWl0KGludGVybmFsRm9ybUZpZWxkQ2xpY2spO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZXZlbnQgaXMgZm9yIGhhbmRsZSB0aGUgaW50ZXJuYWwgcGFnZSBldmVudHMuXG4gICAgb25JbnRlcm5hbEZvcm1GaWVsZENoYW5nZWQoaW50ZXJuYWxGb3JtRmllbGRDaGFuZ2U6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmludGVybmFsRm9ybUZpZWxkQ2hhbmdlLmVtaXQoaW50ZXJuYWxGb3JtRmllbGRDaGFuZ2UpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZXZlbnQgaXMgZm9yIGhhbmRsZSB0aGUgcmVsYXRlZCBpdGVtcyBjaGFuZ2UgZXZlbnRzLlxuICAgIG9uRm9ybVZhbHVlQ2hhbmdlZChldmVudDogSVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGV2ZW50IGlzIGZvciBoYW5kbGUgdGhlIHJlbGF0ZWQgaXRlbXMgY2hhbmdlIGV2ZW50cy5cbiAgICBvbkZvcm1GaWVsZENsaWNrKGV2ZW50OiBJUGVwRm9ybUZpZWxkQ2xpY2tFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpZWxkQ2xpY2suZW1pdChldmVudCk7XG4gICAgfVxufVxuIiwiPGZpZWxkc2V0ICpuZ0lmPVwiZm9ybVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIFtkaXNhYmxlZF09XCJpc0xvY2tlZFwiIGNsYXNzPVwicGVwLWZvcm1cIlxuICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiBsYXlvdXRUeXBlID09ICdjYXJkJyAmJiBkYXRhPy5CYWNrZ3JvdW5kQ29sb3IgfVwiPlxuICAgIDwhLS0gTmV3IEZvcm0gLS0+XG4gICAgPG1hdC1ncmlkLWxpc3QgKm5nSWY9XCJsYXlvdXRUeXBlID09ICdmb3JtJ1wiIFtjb2xzXT1cImNvbHVtbnNcIiBbcm93SGVpZ2h0XT1cInJvd0hlaWdodCArICdyZW0nXCJcbiAgICAgICAgW2d1dHRlclNpemVdPVwiZm9ybUd1dHRlclNpemVcIj5cbiAgICAgICAgPG1hdC1ncmlkLXRpbGUgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpZWxkcyQgfCBhc3luY1wiIFtyb3dzcGFuXT1cImZpZWxkLnJvd1NwYW5cIiBbY29sc3Bhbl09XCJmaWVsZC5jb2xTcGFuXCI+XG4gICAgICAgICAgICA8cGVwLWZpZWxkLWdlbmVyYXRvciAqbmdJZj1cImZpZWxkLmNvbnRyb2xUeXBlICE9ICdwbGFjZWhvbGRlcidcIiBbZm9ybV09XCJmb3JtXCIgW2xheW91dFR5cGVdPVwibGF5b3V0VHlwZVwiXG4gICAgICAgICAgICAgICAgW2NoZWNrRm9yQ2hhbmdlc109XCJjaGVja0ZvckNoYW5nZXNcIiBbdWlkXT1cImRhdGE/LlVJRFwiIFtmaWVsZF09XCJmaWVsZFwiIFtzaG93VGl0bGVdPVwic2hvd1RpdGxlXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChlbGVtZW50Q2xpY2spPVwib25DbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoaW50ZXJuYWxGb3JtRmllbGRDbGljayk9XCJvbkludGVybmFsRm9ybUZpZWxkQ2xpY2tlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoaW50ZXJuYWxGb3JtRmllbGRDaGFuZ2UpPVwib25JbnRlcm5hbEZvcm1GaWVsZENoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZvcm1WYWx1ZUNoYW5nZSk9XCJvbkZvcm1WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChmb3JtRmllbGRDbGljayk9XCJvbkZvcm1GaWVsZENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChmb3JtVmFsaWRhdGlvbkNoYW5nZSk9XCJvbkZvcm1WYWxpZGF0aW9uQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L3BlcC1maWVsZC1nZW5lcmF0b3I+XG4gICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICA8L21hdC1ncmlkLWxpc3Q+XG5cbiAgICA8IS0tIFRodW1ibmFpbHMgLS0+XG4gICAgPG1hdC1ncmlkLWxpc3QgKm5nSWY9XCJsYXlvdXRUeXBlID09ICdjYXJkJ1wiIFtjb2xzXT1cImNvbHVtbnNcIiBbcm93SGVpZ2h0XT1cInJvd0hlaWdodCArICdyZW0nXCJcbiAgICAgICAgW2d1dHRlclNpemVdPVwiY2FyZEd1dHRlclNpemVcIiBjbGFzcz1cImNhcmQtc3BhY2luZ1wiPlxuICAgICAgICA8bWF0LWdyaWQtdGlsZSAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzJCB8IGFzeW5jXCIgW3Jvd3NwYW5dPVwiZmllbGQucm93U3BhblwiIFtjb2xzcGFuXT1cImZpZWxkLmNvbFNwYW5cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyBvdmVyZmxvdzogZmllbGQudHlwZSA9PSAncXMnID8gJ3Vuc2V0JyA6ICdoaWRkZW4nIH1cIj5cbiAgICAgICAgICAgIDxwZXAtZmllbGQtZ2VuZXJhdG9yICpuZ0lmPVwiZmllbGQuY29udHJvbFR5cGUgIT0gJ3BsYWNlaG9sZGVyJ1wiIFtmb3JtXT1cImZvcm1cIiBbbGF5b3V0VHlwZV09XCJsYXlvdXRUeXBlXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdsb2NrLWV2ZW50cyc6IGxvY2tFdmVudHMgfVwiIFtpc0FjdGl2ZV09XCJpc0FjdGl2ZVwiIFtjaGVja0ZvckNoYW5nZXNdPVwiY2hlY2tGb3JDaGFuZ2VzXCJcbiAgICAgICAgICAgICAgICBbdWlkXT1cImRhdGE/LlVJRFwiIFtmaWVsZF09XCJmaWVsZFwiIFtzaG93VGl0bGVdPVwic2hvd1RpdGxlXCIgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChlbGVtZW50Q2xpY2spPVwib25DbGljaygkZXZlbnQpXCIgKGludGVybmFsRm9ybUZpZWxkQ2xpY2spPVwib25JbnRlcm5hbEZvcm1GaWVsZENsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGludGVybmFsRm9ybUZpZWxkQ2hhbmdlKT1cIm9uSW50ZXJuYWxGb3JtRmllbGRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChmb3JtVmFsdWVDaGFuZ2UpPVwib25Gb3JtVmFsdWVDaGFuZ2VkKCRldmVudClcIiAoZm9ybUZpZWxkQ2xpY2spPVwib25Gb3JtRmllbGRDbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L3BlcC1maWVsZC1nZW5lcmF0b3I+XG4gICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICA8L21hdC1ncmlkLWxpc3Q+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGF5b3V0VHlwZSA9PSAndGFibGUnXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1JlcG9ydDsgdGhlbiByZXBvcnRCbG9jazsgZWxzZSBub3RSZXBvcnRCbG9ja1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3JlcG9ydEJsb2NrPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlcG9ydFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgI25vdFJlcG9ydEJsb2NrPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzJCB8IGFzeW5jOyBsZXQgaiA9IGluZGV4XCIgY2xhc3M9XCJwdWxsLWxlZnQgZmxpcCB0YWJsZS1jZWxsIFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiWyd0ZXh0LWFsaWduLScgKyBmaWVsZC54QWxpZ25tZW50XVwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiAobGF5b3V0Py5Db250cm9sRmllbGRzKVtqXT8uY2FsY0NvbHVtbldpZHRoU3RyaW5nfVwiPlxuICAgICAgICAgICAgICAgIDxwZXAtZmllbGQtZ2VuZXJhdG9yICpuZ0lmPVwiZmllbGQuY29udHJvbFR5cGUgIT0gJ3BsYWNlaG9sZGVyJ1wiIFtjaGVja0ZvckNoYW5nZXNdPVwiY2hlY2tGb3JDaGFuZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgW3VpZF09XCJkYXRhPy5VSURcIiBbZmllbGRdPVwiZmllbGRcIiBbZm9ybV09XCJmb3JtXCIgW2xheW91dFR5cGVdPVwibGF5b3V0VHlwZVwiIFtzaG93VGl0bGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAoZWxlbWVudENsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiICh2YWx1ZUNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGZvcm1WYWx1ZUNoYW5nZSk9XCJvbkZvcm1WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChmb3JtRmllbGRDbGljayk9XCJvbkZvcm1GaWVsZENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbaXNBY3RpdmVdPVwiaXNBY3RpdmVcIj5cbiAgICAgICAgICAgICAgICA8L3BlcC1maWVsZC1nZW5lcmF0b3I+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0tLS0tLSBGb3IgdGVzdGluZyAtLS0tLS0tLS0tLS1cbiAgICB7eyBmb3JtLnZhbHVlIHwganNvbiB9fVxuICAgIHt7IGZvcm0udmFsaWQgfX1cbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPC9maWVsZHNldD5cblxuPG5nLXRlbXBsYXRlICNyZXBvcnQ+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzJCB8IGFzeW5jOyBsZXQgaiA9IGluZGV4XCIgY2xhc3M9XCJwdWxsLWxlZnQgZmxpcCBwZXAtcmVwb3J0LWZpZWxkc1wiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IChsYXlvdXQ/LkNvbnRyb2xGaWVsZHMpW2pdPy5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgfVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIlsndGV4dC1hbGlnbi0nICsgZmllbGQueEFsaWdubWVudF1cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZmllbGQuY29udHJvbFR5cGVcIj5cbiAgICAgICAgICAgIDxwZXAtaW1hZ2UgKm5nU3dpdGNoQ2FzZT1cIidpbWFnZSdcIiBbdWlkXT1cImRhdGE/LlVJRFwiIFtmb3JtXT1cImZvcm1cIiBba2V5XT1cImZpZWxkLmtleVwiXG4gICAgICAgICAgICAgICAgW3NyY109XCJmaWVsZC5mb3JtYXR0ZWRWYWx1ZVwiIFtzcmNMYXJnZV09XCJmaWVsZC52YWx1ZVwiIFtvcHRpb25zXT1cImZpZWxkLm9wdGlvbnNcIiBbbGFiZWxdPVwiZmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgIFttYW5kYXRvcnldPVwiZmllbGQubWFuZGF0b3J5XCIgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkXCIgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICBbeEFsaWdubWVudF09XCJmaWVsZC54QWxpZ25tZW50XCIgW3Jvd1NwYW5dPVwiZmllbGQucm93U3BhblwiIFtsYXlvdXRUeXBlXT1cImxheW91dFR5cGVcIlxuICAgICAgICAgICAgICAgIChlbGVtZW50Q2xpY2spPVwib25DbGljaygkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L3BlcC1pbWFnZT5cblxuICAgICAgICAgICAgPHBlcC1zaWduYXR1cmUgKm5nU3dpdGNoQ2FzZT1cIidzaWduYXR1cmUnXCIgW2Zvcm1dPVwiZm9ybVwiIFtrZXldPVwiZmllbGQua2V5XCIgW3NyY109XCJmaWVsZC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkLmxhYmVsXCIgW21hbmRhdG9yeV09XCJmaWVsZC5tYW5kYXRvcnlcIiBbZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkb25seVwiIFt4QWxpZ25tZW50XT1cImZpZWxkLnhBbGlnbm1lbnRcIiBbcm93U3Bhbl09XCJmaWVsZC5yb3dTcGFuXCJcbiAgICAgICAgICAgICAgICBbbGF5b3V0VHlwZV09XCJsYXlvdXRUeXBlXCI+XG4gICAgICAgICAgICA8L3BlcC1zaWduYXR1cmU+XG5cbiAgICAgICAgICAgIDxwZXAtY2hlY2tib3ggKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIiBbZm9ybV09XCJmb3JtXCIgW2tleV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCIoZmllbGQudmFsdWUgfCBsb3dlcmNhc2UpID09ICd0cnVlJyB8fCBmaWVsZC52YWx1ZSA9PSAnMScgPyB0cnVlIDogZmFsc2VcIiBbbGFiZWxdPVwiZmllbGQubGFiZWxcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImZpZWxkLnR5cGVcIiBbbWFuZGF0b3J5XT1cImZpZWxkLm1hbmRhdG9yeVwiIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCIgW3hBbGlnbm1lbnRdPVwiZmllbGQueEFsaWdubWVudFwiIFtyb3dTcGFuXT1cImZpZWxkLnJvd1NwYW5cIlxuICAgICAgICAgICAgICAgIFthZGRpdGlvbmFsVmFsdWVdPVwiZmllbGQuYWRkaXRpb25hbFZhbHVlXCIgW2xheW91dFR5cGVdPVwibGF5b3V0VHlwZVwiPlxuICAgICAgICAgICAgPC9wZXAtY2hlY2tib3g+XG5cbiAgICAgICAgICAgIDxwZXAtZGF0ZSAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCIgW2Zvcm1dPVwiZm9ybVwiIFtrZXldPVwiZmllbGQua2V5XCIgW3ZhbHVlXT1cImZpZWxkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0dGVkVmFsdWVdPVwiZmllbGQuZm9ybWF0dGVkVmFsdWVcIiBbbGFiZWxdPVwiZmllbGQubGFiZWxcIiBbdHlwZV09XCJmaWVsZC50eXBlXCJcbiAgICAgICAgICAgICAgICBbbWFuZGF0b3J5XT1cImZpZWxkLm1hbmRhdG9yeVwiIFtkaXNhYmxlZF09XCJmaWVsZC5kaXNhYmxlZFwiIFtyZWFkb25seV09XCJmaWVsZC5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgW3RleHRDb2xvcl09XCJmaWVsZC50ZXh0Q29sb3JcIiBbeEFsaWdubWVudF09XCJmaWVsZC54QWxpZ25tZW50XCIgW3Jvd1NwYW5dPVwiZmllbGQucm93U3BhblwiXG4gICAgICAgICAgICAgICAgW21pblZhbHVlXT1cImZpZWxkLm1pblZhbHVlXCIgW21heFZhbHVlXT1cImZpZWxkLm1heFZhbHVlXCIgW2xheW91dFR5cGVdPVwibGF5b3V0VHlwZVwiPlxuICAgICAgICAgICAgPC9wZXAtZGF0ZT5cblxuICAgICAgICAgICAgPHBlcC1pbnRlcm5hbC1idXR0b24gKm5nU3dpdGNoQ2FzZT1cIididXR0b24nXCIgW2Zvcm1dPVwiZm9ybVwiIFtrZXldPVwiZmllbGQua2V5XCIgW3ZhbHVlXT1cImZpZWxkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0dGVkVmFsdWVdPVwiZmllbGQuZm9ybWF0dGVkVmFsdWVcIiBbbGFiZWxdPVwiZmllbGQubGFiZWxcIiBbdHlwZV09XCJmaWVsZC50eXBlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWRcIiBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIiBbeEFsaWdubWVudF09XCJmaWVsZC54QWxpZ25tZW50XCJcbiAgICAgICAgICAgICAgICBbbGF5b3V0VHlwZV09XCJsYXlvdXRUeXBlXCIgKGVsZW1lbnRDbGljayk9XCJvbkNsaWNrKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvcGVwLWludGVybmFsLWJ1dHRvbj5cblxuICAgICAgICAgICAgPHBlcC10ZXh0YXJlYSAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiIFtmb3JtXT1cImZvcm1cIiBba2V5XT1cImZpZWxkLmtleVwiIFt2YWx1ZV09XCJmaWVsZC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImZpZWxkLmxhYmVsXCIgW21hbmRhdG9yeV09XCJmaWVsZC5tYW5kYXRvcnlcIiBbZGlzYWJsZWRdPVwiZmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkb25seVwiIFttYXhGaWVsZENoYXJhY3RlcnNdPVwiZmllbGQubWF4RmllbGRDaGFyYWN0ZXJzXCJcbiAgICAgICAgICAgICAgICBbdGV4dENvbG9yXT1cImZpZWxkLnRleHRDb2xvclwiIFt4QWxpZ25tZW50XT1cImZpZWxkLnhBbGlnbm1lbnRcIiBbcm93U3Bhbl09XCJmaWVsZC5yb3dTcGFuXCJcbiAgICAgICAgICAgICAgICBbbGF5b3V0VHlwZV09XCJsYXlvdXRUeXBlXCI+XG4gICAgICAgICAgICA8L3BlcC10ZXh0YXJlYT5cblxuICAgICAgICAgICAgPHBlcC1xdWFudGl0eS1zZWxlY3RvciAqbmdTd2l0Y2hDYXNlPVwiJ3FzJ1wiIFtpZF09XCJmaWVsZC5rZXlcIiBbZm9ybV09XCJmb3JtXCIgW2tleV09XCJmaWVsZC5rZXlcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmaWVsZC52YWx1ZVwiIFtmb3JtYXR0ZWRWYWx1ZV09XCJmaWVsZC5mb3JtYXR0ZWRWYWx1ZVwiIFtsYWJlbF09XCJmaWVsZC5sYWJlbFwiIFt0eXBlXT1cImZpZWxkLnR5cGVcIlxuICAgICAgICAgICAgICAgIFttYW5kYXRvcnldPVwiZmllbGQubWFuZGF0b3J5XCIgW2Rpc2FibGVkXT1cImZpZWxkLmRpc2FibGVkXCIgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICBbdGV4dENvbG9yXT1cImZpZWxkLnRleHRDb2xvclwiIFt4QWxpZ25tZW50XT1cImZpZWxkLnhBbGlnbm1lbnRcIiBbcm93U3Bhbl09XCJmaWVsZC5yb3dTcGFuXCJcbiAgICAgICAgICAgICAgICBbbGF5b3V0VHlwZV09XCJsYXlvdXRUeXBlXCIgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiAoZWxlbWVudENsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9wZXAtcXVhbnRpdHktc2VsZWN0b3I+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuZm9ybWF0dGVkVmFsdWU/Lmxlbmd0aCA+IDA7IHRoZW4gbm90RW1wdHlCbG9jazsgZWxzZSBlbXB0eUJsb2NrXCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3RFbXB0eUJsb2NrPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkLmNvbnRyb2xUeXBlID09PSAnYXR0YWNobWVudCcgfHwgZmllbGQudHlwZSA9PT0gJ2xpbmsnOyB0aGVuIGxpbmtCbG9jazsgZWxzZSBub3RMaW5rQmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGlua0Jsb2NrPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgW2lkXT1cImZpZWxkLmtleVwiIGNsYXNzPVwiY29sb3ItbGluayBib2R5LXNtIHBlcC1yZXBvcnQtaW5wdXQgcmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmllbGQuZm9ybWF0dGVkVmFsdWUgIT0gbnVsbFwiIHRpdGxlPVwie3sgZmllbGQuZm9ybWF0dGVkVmFsdWUgfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJ7eyBmaWVsZC52YWx1ZSB9fVwiPnt7IGZpZWxkLmZvcm1hdHRlZFZhbHVlIH19PC9hPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vdExpbmtCbG9jaz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpZF09XCJmaWVsZC5rZXlcIiBjbGFzcz1cImJvZHktc20gcGVwLXJlcG9ydC1pbnB1dCByZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBmaWVsZC5mb3JtYXR0ZWRWYWx1ZSB9fVwiIFtuZ1N0eWxlXT1cInsgY29sb3I6IGZpZWxkLnRleHRDb2xvciB9XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5mb3JtYXR0ZWRWYWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlCbG9jaz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==