tin-spa 2.13.14 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/README.md +2 -2
  2. package/__ivy_ngcc__/fesm2015/tin-spa.js +6813 -0
  3. package/__ivy_ngcc__/fesm2015/tin-spa.js.map +1 -0
  4. package/bundles/tin-spa.umd.js +3867 -0
  5. package/bundles/tin-spa.umd.js.map +1 -0
  6. package/bundles/tin-spa.umd.min.js +16 -0
  7. package/bundles/tin-spa.umd.min.js.map +1 -0
  8. package/esm2015/lib/classes/Classes.js +241 -0
  9. package/esm2015/lib/components/activity/activity.component.js +26 -0
  10. package/esm2015/lib/components/attach/attach.component.js +107 -0
  11. package/esm2015/lib/components/change-password/change-password.component.js +91 -0
  12. package/esm2015/lib/components/check/check.component.js +63 -0
  13. package/esm2015/lib/components/chips/chips.component.js +67 -0
  14. package/esm2015/lib/components/create-account/create-account.component.js +78 -0
  15. package/esm2015/lib/components/date/date.component.js +45 -0
  16. package/esm2015/lib/components/datetime/datetime.component.js +44 -0
  17. package/esm2015/lib/components/html/html.component.js +97 -0
  18. package/esm2015/lib/components/label/label.component.js +29 -0
  19. package/esm2015/lib/components/loader/loader.component.js +30 -0
  20. package/esm2015/lib/components/login/login.component.js +122 -0
  21. package/esm2015/lib/components/logs/logs.component.js +43 -0
  22. package/esm2015/lib/components/message/messageDialog.component.js +31 -0
  23. package/esm2015/lib/components/money/money.component.js +50 -0
  24. package/esm2015/lib/components/nav-menu/nav-menu.component.js +51 -0
  25. package/esm2015/lib/components/option/option.component.js +62 -0
  26. package/esm2015/lib/components/profile/profile.component.js +108 -0
  27. package/esm2015/lib/components/profiles/profiles.component.js +16 -0
  28. package/esm2015/lib/components/recover-account/recover-account.component.js +52 -0
  29. package/esm2015/lib/components/roles/addRoleDialog.component.js +59 -0
  30. package/esm2015/lib/components/roles/editRoleDialog.component.js +57 -0
  31. package/esm2015/lib/components/roles/roles.component.js +131 -0
  32. package/esm2015/lib/components/roles/viewRoleDialog.component.js +38 -0
  33. package/esm2015/lib/components/select/select.component.js +73 -0
  34. package/esm2015/lib/components/settings/settings.component.js +63 -0
  35. package/esm2015/lib/components/signup/signup.component.js +56 -0
  36. package/esm2015/lib/components/steps/steps.component.js +98 -0
  37. package/esm2015/lib/components/table/table.component.js +109 -0
  38. package/esm2015/lib/components/text/text.component.js +165 -0
  39. package/esm2015/lib/components/tiles/tiles.component.js +41 -0
  40. package/esm2015/lib/components/timeout/timeout.component.js +90 -0
  41. package/esm2015/lib/components/tin-spa.component.js +19 -0
  42. package/esm2015/lib/components/users/addUserDialog.component.js +53 -0
  43. package/esm2015/lib/components/users/editUserDialog.component.js +96 -0
  44. package/esm2015/lib/components/users/users.component.js +130 -0
  45. package/esm2015/lib/components/viewer/viewer.component.js +67 -0
  46. package/esm2015/lib/components/viewer/viewerDialog.component.js +76 -0
  47. package/esm2015/lib/dnd.directive.js +51 -0
  48. package/esm2015/lib/modules/spa-admin.module.js +67 -0
  49. package/esm2015/lib/modules/spa-index.module.js +33 -0
  50. package/esm2015/lib/modules/spa-mat.module.js +53 -0
  51. package/esm2015/lib/modules/spa-user.module.js +31 -0
  52. package/esm2015/lib/services/auth.service.js +153 -0
  53. package/esm2015/lib/services/data.service.js +78 -0
  54. package/esm2015/lib/services/export.service.js +29 -0
  55. package/esm2015/lib/services/loader-interceptor.service.js +77 -0
  56. package/esm2015/lib/services/loader.service.js +17 -0
  57. package/esm2015/lib/services/log.service.js +76 -0
  58. package/esm2015/lib/services/message.service.js +58 -0
  59. package/esm2015/lib/services/storage.service.js +42 -0
  60. package/esm2015/lib/services/tin-spa.service.js +14 -0
  61. package/esm2015/lib/tin-spa.module.js +91 -0
  62. package/esm2015/public-api.js +58 -0
  63. package/esm2015/tin-spa.js +9 -0
  64. package/esm5/lib/classes/Classes.js +298 -0
  65. package/esm5/lib/components/activity/activity.component.js +27 -0
  66. package/esm5/lib/components/attach/attach.component.js +119 -0
  67. package/esm5/lib/components/change-password/change-password.component.js +93 -0
  68. package/esm5/lib/components/check/check.component.js +64 -0
  69. package/esm5/lib/components/chips/chips.component.js +69 -0
  70. package/esm5/lib/components/create-account/create-account.component.js +80 -0
  71. package/esm5/lib/components/date/date.component.js +46 -0
  72. package/esm5/lib/components/datetime/datetime.component.js +45 -0
  73. package/esm5/lib/components/html/html.component.js +98 -0
  74. package/esm5/lib/components/label/label.component.js +30 -0
  75. package/esm5/lib/components/loader/loader.component.js +32 -0
  76. package/esm5/lib/components/login/login.component.js +125 -0
  77. package/esm5/lib/components/logs/logs.component.js +45 -0
  78. package/esm5/lib/components/message/messageDialog.component.js +32 -0
  79. package/esm5/lib/components/money/money.component.js +51 -0
  80. package/esm5/lib/components/nav-menu/nav-menu.component.js +53 -0
  81. package/esm5/lib/components/option/option.component.js +63 -0
  82. package/esm5/lib/components/profile/profile.component.js +112 -0
  83. package/esm5/lib/components/profiles/profiles.component.js +18 -0
  84. package/esm5/lib/components/recover-account/recover-account.component.js +54 -0
  85. package/esm5/lib/components/roles/addRoleDialog.component.js +61 -0
  86. package/esm5/lib/components/roles/editRoleDialog.component.js +59 -0
  87. package/esm5/lib/components/roles/roles.component.js +138 -0
  88. package/esm5/lib/components/roles/viewRoleDialog.component.js +39 -0
  89. package/esm5/lib/components/select/select.component.js +75 -0
  90. package/esm5/lib/components/settings/settings.component.js +66 -0
  91. package/esm5/lib/components/signup/signup.component.js +58 -0
  92. package/esm5/lib/components/steps/steps.component.js +110 -0
  93. package/esm5/lib/components/table/table.component.js +111 -0
  94. package/esm5/lib/components/text/text.component.js +168 -0
  95. package/esm5/lib/components/tiles/tiles.component.js +42 -0
  96. package/esm5/lib/components/timeout/timeout.component.js +92 -0
  97. package/esm5/lib/components/tin-spa.component.js +17 -0
  98. package/esm5/lib/components/users/addUserDialog.component.js +55 -0
  99. package/esm5/lib/components/users/editUserDialog.component.js +99 -0
  100. package/esm5/lib/components/users/users.component.js +135 -0
  101. package/esm5/lib/components/viewer/viewer.component.js +68 -0
  102. package/esm5/lib/components/viewer/viewerDialog.component.js +77 -0
  103. package/esm5/lib/dnd.directive.js +52 -0
  104. package/esm5/lib/modules/spa-admin.module.js +70 -0
  105. package/esm5/lib/modules/spa-index.module.js +36 -0
  106. package/esm5/lib/modules/spa-mat.module.js +56 -0
  107. package/esm5/lib/modules/spa-user.module.js +34 -0
  108. package/esm5/lib/services/auth.service.js +155 -0
  109. package/esm5/lib/services/data.service.js +79 -0
  110. package/esm5/lib/services/export.service.js +30 -0
  111. package/esm5/lib/services/loader-interceptor.service.js +79 -0
  112. package/esm5/lib/services/loader.service.js +18 -0
  113. package/esm5/lib/services/log.service.js +112 -0
  114. package/esm5/lib/services/message.service.js +59 -0
  115. package/esm5/lib/services/storage.service.js +74 -0
  116. package/esm5/lib/services/tin-spa.service.js +16 -0
  117. package/esm5/lib/tin-spa.module.js +94 -0
  118. package/esm5/public-api.js +58 -0
  119. package/esm5/tin-spa.js +9 -0
  120. package/fesm2015/tin-spa.js +3398 -0
  121. package/fesm2015/tin-spa.js.map +1 -0
  122. package/fesm5/tin-spa.js +3623 -0
  123. package/fesm5/tin-spa.js.map +1 -0
  124. package/lib/classes/Classes.d.ts +216 -374
  125. package/lib/components/activity/activity.component.d.ts +5 -3
  126. package/lib/components/activity/activity.component.d.ts.__ivy_ngcc_bak +8 -0
  127. package/lib/components/attach/attach.component.d.ts +30 -16
  128. package/lib/components/attach/attach.component.d.ts.__ivy_ngcc_bak +39 -0
  129. package/lib/components/change-password/change-password.component.d.ts +25 -0
  130. package/lib/components/change-password/change-password.component.d.ts.__ivy_ngcc_bak +20 -0
  131. package/lib/components/check/check.component.d.ts +6 -9
  132. package/lib/components/check/check.component.d.ts.__ivy_ngcc_bak +16 -0
  133. package/lib/components/chips/chips.component.d.ts +5 -3
  134. package/lib/components/chips/chips.component.d.ts.__ivy_ngcc_bak +15 -0
  135. package/lib/components/create-account/create-account.component.d.ts +30 -0
  136. package/lib/components/create-account/create-account.component.d.ts.__ivy_ngcc_bak +25 -0
  137. package/lib/components/date/date.component.d.ts +15 -26
  138. package/lib/components/date/date.component.d.ts.__ivy_ngcc_bak +13 -0
  139. package/lib/components/datetime/datetime.component.d.ts +5 -7
  140. package/lib/components/datetime/datetime.component.d.ts.__ivy_ngcc_bak +12 -0
  141. package/lib/components/html/html.component.d.ts +13 -12
  142. package/lib/components/html/html.component.d.ts.__ivy_ngcc_bak +12 -0
  143. package/lib/components/label/label.component.d.ts +5 -5
  144. package/lib/components/label/label.component.d.ts.__ivy_ngcc_bak +8 -0
  145. package/lib/components/loader/loader.component.d.ts +5 -3
  146. package/lib/components/loader/loader.component.d.ts.__ivy_ngcc_bak +9 -0
  147. package/lib/components/login/login.component.d.ts +34 -0
  148. package/lib/components/login/login.component.d.ts.__ivy_ngcc_bak +29 -0
  149. package/lib/components/logs/logs.component.d.ts +22 -0
  150. package/lib/components/logs/logs.component.d.ts.__ivy_ngcc_bak +17 -0
  151. package/lib/components/message/messageDialog.component.d.ts +5 -3
  152. package/lib/components/message/messageDialog.component.d.ts.__ivy_ngcc_bak +12 -0
  153. package/lib/components/money/money.component.d.ts +8 -29
  154. package/lib/components/money/money.component.d.ts.__ivy_ngcc_bak +14 -0
  155. package/lib/components/nav-menu/nav-menu.component.d.ts +7 -23
  156. package/lib/components/nav-menu/nav-menu.component.d.ts.__ivy_ngcc_bak +17 -0
  157. package/lib/components/option/option.component.d.ts +6 -16
  158. package/lib/components/option/option.component.d.ts.__ivy_ngcc_bak +17 -0
  159. package/lib/components/profile/profile.component.d.ts +35 -0
  160. package/lib/components/profile/profile.component.d.ts.__ivy_ngcc_bak +30 -0
  161. package/lib/components/profiles/profiles.component.d.ts +10 -0
  162. package/lib/components/profiles/profiles.component.d.ts.__ivy_ngcc_bak +5 -0
  163. package/lib/components/recover-account/recover-account.component.d.ts +20 -0
  164. package/lib/components/recover-account/recover-account.component.d.ts.__ivy_ngcc_bak +15 -0
  165. package/lib/components/roles/addRoleDialog.component.d.ts +24 -0
  166. package/lib/components/roles/addRoleDialog.component.d.ts.__ivy_ngcc_bak +19 -0
  167. package/lib/components/roles/editRoleDialog.component.d.ts +24 -0
  168. package/lib/components/roles/editRoleDialog.component.d.ts.__ivy_ngcc_bak +19 -0
  169. package/lib/components/roles/roles.component.d.ts +34 -0
  170. package/lib/components/roles/roles.component.d.ts.__ivy_ngcc_bak +29 -0
  171. package/lib/components/roles/viewRoleDialog.component.d.ts +20 -0
  172. package/lib/components/roles/viewRoleDialog.component.d.ts.__ivy_ngcc_bak +15 -0
  173. package/lib/components/select/select.component.d.ts +23 -21
  174. package/lib/components/select/select.component.d.ts.__ivy_ngcc_bak +20 -0
  175. package/lib/components/settings/settings.component.d.ts +21 -0
  176. package/lib/{pages/settings/settings.component.d.ts → components/settings/settings.component.d.ts.__ivy_ngcc_bak} +2 -5
  177. package/lib/components/signup/signup.component.d.ts +25 -0
  178. package/lib/{pages/signup/signup.component.d.ts → components/signup/signup.component.d.ts.__ivy_ngcc_bak} +4 -7
  179. package/lib/components/steps/steps.component.d.ts +13 -20
  180. package/lib/components/steps/steps.component.d.ts.__ivy_ngcc_bak +15 -0
  181. package/lib/components/table/table.component.d.ts +24 -85
  182. package/lib/components/table/table.component.d.ts.__ivy_ngcc_bak +25 -0
  183. package/lib/components/text/text.component.d.ts +17 -38
  184. package/lib/components/text/text.component.d.ts.__ivy_ngcc_bak +37 -0
  185. package/lib/components/tiles/tiles.component.d.ts +10 -22
  186. package/lib/components/tiles/tiles.component.d.ts.__ivy_ngcc_bak +11 -0
  187. package/lib/components/timeout/timeout.component.d.ts +26 -0
  188. package/lib/components/timeout/timeout.component.d.ts.__ivy_ngcc_bak +21 -0
  189. package/lib/components/tin-spa.component.d.ts +9 -4
  190. package/lib/components/tin-spa.component.d.ts.__ivy_ngcc_bak +5 -0
  191. package/lib/components/users/addUserDialog.component.d.ts +21 -0
  192. package/lib/components/users/addUserDialog.component.d.ts.__ivy_ngcc_bak +16 -0
  193. package/lib/components/users/editUserDialog.component.d.ts +32 -0
  194. package/lib/components/users/editUserDialog.component.d.ts.__ivy_ngcc_bak +27 -0
  195. package/lib/components/users/users.component.d.ts +40 -0
  196. package/lib/components/users/users.component.d.ts.__ivy_ngcc_bak +35 -0
  197. package/lib/components/viewer/viewer.component.d.ts +8 -12
  198. package/lib/components/viewer/viewer.component.d.ts.__ivy_ngcc_bak +16 -0
  199. package/lib/components/viewer/viewerDialog.component.d.ts +8 -8
  200. package/lib/components/viewer/viewerDialog.component.d.ts.__ivy_ngcc_bak +19 -0
  201. package/lib/dnd.directive.d.ts +13 -0
  202. package/lib/dnd.directive.d.ts.__ivy_ngcc_bak +8 -0
  203. package/lib/modules/spa-admin.module.d.ts +19 -13
  204. package/lib/modules/spa-admin.module.d.ts.__ivy_ngcc_bak +2 -0
  205. package/lib/modules/spa-index.module.d.ts +11 -11
  206. package/lib/modules/spa-index.module.d.ts.__ivy_ngcc_bak +2 -0
  207. package/lib/modules/spa-mat.module.d.ts +32 -36
  208. package/lib/modules/spa-mat.module.d.ts.__ivy_ngcc_bak +2 -0
  209. package/lib/modules/spa-user.module.d.ts +10 -9
  210. package/lib/modules/spa-user.module.d.ts.__ivy_ngcc_bak +2 -0
  211. package/lib/services/auth.service.d.ts +15 -27
  212. package/lib/services/auth.service.d.ts.__ivy_ngcc_bak +45 -0
  213. package/lib/services/data.service.d.ts +27 -0
  214. package/lib/services/data.service.d.ts.__ivy_ngcc_bak +23 -0
  215. package/lib/services/export.service.d.ts +8 -3
  216. package/lib/services/export.service.d.ts.__ivy_ngcc_bak +7 -0
  217. package/lib/services/loader-interceptor.service.d.ts +6 -5
  218. package/lib/services/loader-interceptor.service.d.ts.__ivy_ngcc_bak +18 -0
  219. package/lib/services/loader.service.d.ts +4 -3
  220. package/lib/services/loader.service.d.ts.__ivy_ngcc_bak +5 -0
  221. package/lib/services/log.service.d.ts +5 -4
  222. package/lib/services/log.service.d.ts.__ivy_ngcc_bak +16 -0
  223. package/lib/services/message.service.d.ts +5 -5
  224. package/lib/services/message.service.d.ts.__ivy_ngcc_bak +12 -0
  225. package/lib/services/storage.service.d.ts +4 -3
  226. package/lib/services/storage.service.d.ts.__ivy_ngcc_bak +7 -0
  227. package/lib/services/tin-spa.service.d.ts +4 -3
  228. package/lib/services/tin-spa.service.d.ts.__ivy_ngcc_bak +3 -0
  229. package/lib/tin-spa.module.d.ts +35 -84
  230. package/lib/tin-spa.module.d.ts.__ivy_ngcc_bak +2 -0
  231. package/package.json +23 -23
  232. package/public-api.d.ts +21 -50
  233. package/tin-spa.d.ts +10 -0
  234. package/tin-spa.d.ts.__ivy_ngcc_bak +8 -0
  235. package/tin-spa.metadata.json +1 -0
  236. package/esm2020/lib/classes/Classes.mjs +0 -112
  237. package/esm2020/lib/classes/LibClasses.mjs +0 -180
  238. package/esm2020/lib/classes/TinCore.mjs +0 -569
  239. package/esm2020/lib/components/activity/activity.component.mjs +0 -24
  240. package/esm2020/lib/components/alert/alert.component.mjs +0 -43
  241. package/esm2020/lib/components/attach/attach.component.mjs +0 -102
  242. package/esm2020/lib/components/capsules/capsules.component.mjs +0 -63
  243. package/esm2020/lib/components/cards/cards.component.mjs +0 -103
  244. package/esm2020/lib/components/check/check.component.mjs +0 -67
  245. package/esm2020/lib/components/chips/chips.component.mjs +0 -58
  246. package/esm2020/lib/components/date/date.component.mjs +0 -106
  247. package/esm2020/lib/components/datetime/datetime.component.mjs +0 -55
  248. package/esm2020/lib/components/email/email.component.mjs +0 -133
  249. package/esm2020/lib/components/filter/filter.component.mjs +0 -58
  250. package/esm2020/lib/components/form/form.component.mjs +0 -293
  251. package/esm2020/lib/components/html/html.component.mjs +0 -34
  252. package/esm2020/lib/components/label/label.component.mjs +0 -31
  253. package/esm2020/lib/components/list-dialog/list-dialog.component.mjs +0 -68
  254. package/esm2020/lib/components/loader/loader.component.mjs +0 -25
  255. package/esm2020/lib/components/message/messageDialog.component.mjs +0 -33
  256. package/esm2020/lib/components/money/currency-input-mask.directive.mjs +0 -185
  257. package/esm2020/lib/components/money/currency-input-mask.module.mjs +0 -28
  258. package/esm2020/lib/components/money/money.component.mjs +0 -137
  259. package/esm2020/lib/components/multi-select/multi-select.component.mjs +0 -165
  260. package/esm2020/lib/components/multi-text/multi-text.component.mjs +0 -208
  261. package/esm2020/lib/components/nav-menu/nav-menu.component.mjs +0 -88
  262. package/esm2020/lib/components/notes/notes.component.mjs +0 -62
  263. package/esm2020/lib/components/number/number.component.mjs +0 -131
  264. package/esm2020/lib/components/option/option.component.mjs +0 -92
  265. package/esm2020/lib/components/page/page.component.mjs +0 -101
  266. package/esm2020/lib/components/search/search.component.mjs +0 -36
  267. package/esm2020/lib/components/select/select.component.mjs +0 -75
  268. package/esm2020/lib/components/select-bitwise/select-bitwise.component.mjs +0 -87
  269. package/esm2020/lib/components/select-common/select-common.component.mjs +0 -206
  270. package/esm2020/lib/components/select-internal/select-internal.component.mjs +0 -75
  271. package/esm2020/lib/components/select-lite/select-lite.component.mjs +0 -18
  272. package/esm2020/lib/components/statuses/statuses.component.mjs +0 -44
  273. package/esm2020/lib/components/steps/steps.component.mjs +0 -112
  274. package/esm2020/lib/components/suffix/suffix.component.mjs +0 -70
  275. package/esm2020/lib/components/table/detailsDialog.component.mjs +0 -406
  276. package/esm2020/lib/components/table/table.component.mjs +0 -440
  277. package/esm2020/lib/components/table-action/table-action.component.mjs +0 -80
  278. package/esm2020/lib/components/table-header/table-header.component.mjs +0 -148
  279. package/esm2020/lib/components/table-internal/detailsDialog-internal.component.mjs +0 -406
  280. package/esm2020/lib/components/table-internal/table-internal.component.mjs +0 -441
  281. package/esm2020/lib/components/table-lite/detailsDialog-lite.component.mjs +0 -404
  282. package/esm2020/lib/components/table-lite/table-lite.component.mjs +0 -441
  283. package/esm2020/lib/components/table-row/table-row.component.mjs +0 -93
  284. package/esm2020/lib/components/tabs/tabs.component.mjs +0 -74
  285. package/esm2020/lib/components/text/text.component.mjs +0 -259
  286. package/esm2020/lib/components/tiles/tiles.component.mjs +0 -99
  287. package/esm2020/lib/components/tin-spa.component.mjs +0 -19
  288. package/esm2020/lib/components/viewer/viewer.component.mjs +0 -83
  289. package/esm2020/lib/components/viewer/viewerDialog.component.mjs +0 -95
  290. package/esm2020/lib/modules/admin/admin-routing.module.mjs +0 -71
  291. package/esm2020/lib/modules/admin/admin.module.mjs +0 -26
  292. package/esm2020/lib/modules/index/index-routing.module.mjs +0 -27
  293. package/esm2020/lib/modules/index/index.module.mjs +0 -26
  294. package/esm2020/lib/modules/spa-admin.module.mjs +0 -71
  295. package/esm2020/lib/modules/spa-index.module.mjs +0 -54
  296. package/esm2020/lib/modules/spa-mat.module.mjs +0 -84
  297. package/esm2020/lib/modules/spa-user.module.mjs +0 -47
  298. package/esm2020/lib/modules/user/user-routing.module.mjs +0 -23
  299. package/esm2020/lib/modules/user/user.module.mjs +0 -26
  300. package/esm2020/lib/pages/accounts/accountDialog.component.mjs +0 -56
  301. package/esm2020/lib/pages/accounts/accounts.component.mjs +0 -70
  302. package/esm2020/lib/pages/app-models/app-models.component.mjs +0 -56
  303. package/esm2020/lib/pages/approvals/approvals.component.mjs +0 -19
  304. package/esm2020/lib/pages/approvals-config/approvals-config.component.mjs +0 -165
  305. package/esm2020/lib/pages/bug/bug.component.mjs +0 -14
  306. package/esm2020/lib/pages/change-password/change-password.component.mjs +0 -92
  307. package/esm2020/lib/pages/create-account/create-account.component.mjs +0 -110
  308. package/esm2020/lib/pages/customers/customers.component.mjs +0 -21
  309. package/esm2020/lib/pages/departments/departments.component.mjs +0 -22
  310. package/esm2020/lib/pages/employees/employees.component.mjs +0 -20
  311. package/esm2020/lib/pages/grades/grades.component.mjs +0 -14
  312. package/esm2020/lib/pages/inventory/inventory.component.mjs +0 -99
  313. package/esm2020/lib/pages/inventory/quantityDialog.component.mjs +0 -53
  314. package/esm2020/lib/pages/invitations-table/invitations-table.component.mjs +0 -71
  315. package/esm2020/lib/pages/login/login.component.mjs +0 -166
  316. package/esm2020/lib/pages/logs/logs.component.mjs +0 -42
  317. package/esm2020/lib/pages/membership/membership.component.mjs +0 -44
  318. package/esm2020/lib/pages/notifications/notifications.component.mjs +0 -90
  319. package/esm2020/lib/pages/notifications-config/notifications-config.component.mjs +0 -113
  320. package/esm2020/lib/pages/plans/plans.component.mjs +0 -44
  321. package/esm2020/lib/pages/positions/positions.component.mjs +0 -21
  322. package/esm2020/lib/pages/profile/profile.component.mjs +0 -94
  323. package/esm2020/lib/pages/recover-account/recover-account.component.mjs +0 -46
  324. package/esm2020/lib/pages/roles/addRoleDialog.component.mjs +0 -60
  325. package/esm2020/lib/pages/roles/roles.component.mjs +0 -151
  326. package/esm2020/lib/pages/settings/settings.component.mjs +0 -54
  327. package/esm2020/lib/pages/signup/signup.component.mjs +0 -50
  328. package/esm2020/lib/pages/suppliers/suppliers.component.mjs +0 -22
  329. package/esm2020/lib/pages/tasks/tasks.component.mjs +0 -86
  330. package/esm2020/lib/pages/tenant-settings/tenant-settings.component.mjs +0 -228
  331. package/esm2020/lib/pages/tenants/tenants.component.mjs +0 -47
  332. package/esm2020/lib/pages/transactions/transactDialog.component.mjs +0 -80
  333. package/esm2020/lib/pages/transactions/transactions.component.mjs +0 -101
  334. package/esm2020/lib/pages/users/users.component.mjs +0 -141
  335. package/esm2020/lib/pages/welcome/welcome.component.mjs +0 -86
  336. package/esm2020/lib/pipes/camelToWords.pipe.mjs +0 -17
  337. package/esm2020/lib/select-context.directive.mjs +0 -23
  338. package/esm2020/lib/services/auth.service.mjs +0 -175
  339. package/esm2020/lib/services/button.service.mjs +0 -162
  340. package/esm2020/lib/services/condition.service.mjs +0 -32
  341. package/esm2020/lib/services/csv.service.mjs +0 -49
  342. package/esm2020/lib/services/datalib.service.mjs +0 -861
  343. package/esm2020/lib/services/dialog.service.mjs +0 -125
  344. package/esm2020/lib/services/export.service.mjs +0 -16
  345. package/esm2020/lib/services/http.service.mjs +0 -79
  346. package/esm2020/lib/services/loader-interceptor.service.mjs +0 -86
  347. package/esm2020/lib/services/loader.service.mjs +0 -17
  348. package/esm2020/lib/services/log.service.mjs +0 -77
  349. package/esm2020/lib/services/message.service.mjs +0 -59
  350. package/esm2020/lib/services/notifications.service.mjs +0 -33
  351. package/esm2020/lib/services/storage.service.mjs +0 -34
  352. package/esm2020/lib/services/table-config.service.mjs +0 -78
  353. package/esm2020/lib/services/tin-spa.service.mjs +0 -14
  354. package/esm2020/lib/tin-spa.module.mjs +0 -225
  355. package/esm2020/public-api.mjs +0 -90
  356. package/esm2020/tin-spa.mjs +0 -5
  357. package/fesm2015/tin-spa.mjs +0 -11711
  358. package/fesm2015/tin-spa.mjs.map +0 -1
  359. package/fesm2020/tin-spa.mjs +0 -11718
  360. package/fesm2020/tin-spa.mjs.map +0 -1
  361. package/index.d.ts +0 -5
  362. package/lib/classes/LibClasses.d.ts +0 -173
  363. package/lib/classes/TinCore.d.ts +0 -59
  364. package/lib/components/alert/alert.component.d.ts +0 -15
  365. package/lib/components/capsules/capsules.component.d.ts +0 -26
  366. package/lib/components/cards/cards.component.d.ts +0 -39
  367. package/lib/components/email/email.component.d.ts +0 -40
  368. package/lib/components/filter/filter.component.d.ts +0 -20
  369. package/lib/components/form/form.component.d.ts +0 -47
  370. package/lib/components/list-dialog/list-dialog.component.d.ts +0 -23
  371. package/lib/components/money/currency-input-mask.directive.d.ts +0 -41
  372. package/lib/components/money/currency-input-mask.module.d.ts +0 -9
  373. package/lib/components/multi-select/multi-select.component.d.ts +0 -47
  374. package/lib/components/multi-text/multi-text.component.d.ts +0 -56
  375. package/lib/components/notes/notes.component.d.ts +0 -19
  376. package/lib/components/number/number.component.d.ts +0 -41
  377. package/lib/components/page/page.component.d.ts +0 -38
  378. package/lib/components/search/search.component.d.ts +0 -15
  379. package/lib/components/select-bitwise/select-bitwise.component.d.ts +0 -31
  380. package/lib/components/select-common/select-common.component.d.ts +0 -53
  381. package/lib/components/select-internal/select-internal.component.d.ts +0 -23
  382. package/lib/components/select-lite/select-lite.component.d.ts +0 -8
  383. package/lib/components/statuses/statuses.component.d.ts +0 -12
  384. package/lib/components/suffix/suffix.component.d.ts +0 -23
  385. package/lib/components/table/detailsDialog.component.d.ts +0 -86
  386. package/lib/components/table-action/table-action.component.d.ts +0 -25
  387. package/lib/components/table-header/table-header.component.d.ts +0 -46
  388. package/lib/components/table-internal/detailsDialog-internal.component.d.ts +0 -86
  389. package/lib/components/table-internal/table-internal.component.d.ts +0 -91
  390. package/lib/components/table-lite/detailsDialog-lite.component.d.ts +0 -86
  391. package/lib/components/table-lite/table-lite.component.d.ts +0 -91
  392. package/lib/components/table-row/table-row.component.d.ts +0 -31
  393. package/lib/components/tabs/tabs.component.d.ts +0 -32
  394. package/lib/modules/admin/admin-routing.module.d.ts +0 -7
  395. package/lib/modules/admin/admin.module.d.ts +0 -9
  396. package/lib/modules/index/index-routing.module.d.ts +0 -7
  397. package/lib/modules/index/index.module.d.ts +0 -9
  398. package/lib/modules/user/user-routing.module.d.ts +0 -7
  399. package/lib/modules/user/user.module.d.ts +0 -9
  400. package/lib/pages/accounts/accountDialog.component.d.ts +0 -27
  401. package/lib/pages/accounts/accounts.component.d.ts +0 -25
  402. package/lib/pages/app-models/app-models.component.d.ts +0 -15
  403. package/lib/pages/approvals/approvals.component.d.ts +0 -10
  404. package/lib/pages/approvals-config/approvals-config.component.d.ts +0 -24
  405. package/lib/pages/bug/bug.component.d.ts +0 -8
  406. package/lib/pages/change-password/change-password.component.d.ts +0 -27
  407. package/lib/pages/create-account/create-account.component.d.ts +0 -34
  408. package/lib/pages/customers/customers.component.d.ts +0 -12
  409. package/lib/pages/departments/departments.component.d.ts +0 -14
  410. package/lib/pages/employees/employees.component.d.ts +0 -12
  411. package/lib/pages/grades/grades.component.d.ts +0 -8
  412. package/lib/pages/inventory/inventory.component.d.ts +0 -25
  413. package/lib/pages/inventory/quantityDialog.component.d.ts +0 -23
  414. package/lib/pages/invitations-table/invitations-table.component.d.ts +0 -19
  415. package/lib/pages/login/login.component.d.ts +0 -46
  416. package/lib/pages/logs/logs.component.d.ts +0 -14
  417. package/lib/pages/membership/membership.component.d.ts +0 -13
  418. package/lib/pages/notifications/notifications.component.d.ts +0 -16
  419. package/lib/pages/notifications-config/notifications-config.component.d.ts +0 -17
  420. package/lib/pages/plans/plans.component.d.ts +0 -13
  421. package/lib/pages/positions/positions.component.d.ts +0 -12
  422. package/lib/pages/profile/profile.component.d.ts +0 -35
  423. package/lib/pages/recover-account/recover-account.component.d.ts +0 -18
  424. package/lib/pages/roles/addRoleDialog.component.d.ts +0 -24
  425. package/lib/pages/roles/roles.component.d.ts +0 -42
  426. package/lib/pages/suppliers/suppliers.component.d.ts +0 -14
  427. package/lib/pages/tasks/tasks.component.d.ts +0 -27
  428. package/lib/pages/tenant-settings/tenant-settings.component.d.ts +0 -47
  429. package/lib/pages/tenants/tenants.component.d.ts +0 -17
  430. package/lib/pages/transactions/transactDialog.component.d.ts +0 -26
  431. package/lib/pages/transactions/transactions.component.d.ts +0 -31
  432. package/lib/pages/users/users.component.d.ts +0 -28
  433. package/lib/pages/welcome/welcome.component.d.ts +0 -25
  434. package/lib/pipes/camelToWords.pipe.d.ts +0 -7
  435. package/lib/select-context.directive.d.ts +0 -10
  436. package/lib/services/button.service.d.ts +0 -30
  437. package/lib/services/condition.service.d.ts +0 -10
  438. package/lib/services/csv.service.d.ts +0 -10
  439. package/lib/services/datalib.service.d.ts +0 -125
  440. package/lib/services/dialog.service.d.ts +0 -20
  441. package/lib/services/http.service.d.ts +0 -22
  442. package/lib/services/notifications.service.d.ts +0 -12
  443. package/lib/services/table-config.service.d.ts +0 -17
@@ -1,569 +0,0 @@
1
- import { DetailsSource, RoleAccess } from "./Classes";
2
- export class Core {
3
- static deepClone(obj) {
4
- if (obj === null || typeof obj !== 'object') {
5
- return obj;
6
- }
7
- if (Array.isArray(obj)) {
8
- const arrCopy = [];
9
- obj.forEach((item, index) => {
10
- arrCopy[index] = this.deepClone(item);
11
- });
12
- return arrCopy;
13
- }
14
- const objCopy = {};
15
- Object.keys(obj).forEach(key => {
16
- objCopy[key] = this.deepClone(obj[key]);
17
- });
18
- return objCopy;
19
- }
20
- static deepClone2(obj) {
21
- // Create new WeakMap for each clone operation
22
- const cloneVisited = new WeakMap();
23
- // Inner function that has access to the cloneVisited map
24
- const clone = (value) => {
25
- // Handle null, undefined and primitives
26
- if (value === null || typeof value !== 'object') {
27
- return value;
28
- }
29
- // Check if object was already cloned
30
- if (cloneVisited.has(value)) {
31
- return cloneVisited.get(value);
32
- }
33
- // Handle arrays
34
- if (Array.isArray(value)) {
35
- const arrCopy = [];
36
- cloneVisited.set(value, arrCopy);
37
- value.forEach((item, index) => {
38
- arrCopy[index] = clone(item);
39
- });
40
- return arrCopy;
41
- }
42
- // Handle dates
43
- if (value instanceof Date) {
44
- return new Date(value);
45
- }
46
- // Handle regular objects
47
- const objCopy = Object.create(Object.getPrototypeOf(value));
48
- cloneVisited.set(value, objCopy);
49
- Object.entries(value).forEach(([key, val]) => {
50
- if (Object.prototype.hasOwnProperty.call(value, key)) {
51
- objCopy[key] = clone(val);
52
- }
53
- });
54
- return objCopy;
55
- };
56
- // Start the clone operation with a fresh WeakMap
57
- return clone(obj);
58
- }
59
- static camelToWords(value) {
60
- if (!value)
61
- return value;
62
- if (typeof value !== 'string')
63
- return value;
64
- if (value.length == 0)
65
- return value;
66
- let v = value.charAt(0).toUpperCase() + value.substring(1);
67
- return v.replace(/([A-Z]+)*([A-Z][a-z])/g, "$1 $2");
68
- }
69
- static generateObject(fields) {
70
- let data = {};
71
- fields.forEach(field => {
72
- if (field.type != 'section' && field.type != 'blank') {
73
- data[field.name] = this.getInitialValue(field);
74
- }
75
- });
76
- // console.log(data)
77
- return data;
78
- }
79
- static resetObject(fields, data) {
80
- fields.forEach(field => {
81
- if (field.type != 'section' && field.type != 'blank') {
82
- data[field.name] = this.getInitialValue(field);
83
- }
84
- });
85
- }
86
- static checkSecurity(security, currentRole) {
87
- if (!security) {
88
- return true;
89
- }
90
- if (security.deny?.some(role => currentRole[role.name])) {
91
- return false;
92
- }
93
- if (!security.allow || security.allow.length === 0) {
94
- return true;
95
- }
96
- return security.allow.some(role => currentRole[role.name]);
97
- }
98
- static hasFormAccess(formConfig, currentRole) {
99
- return this.getFormAccess(formConfig, currentRole) > RoleAccess.None;
100
- }
101
- static getFormAccess(formConfig, currentRole) {
102
- if (!formConfig?.security?.allow) {
103
- return RoleAccess.Full; // Full access if no restrictions
104
- }
105
- // Check deny first
106
- if (formConfig.security.deny?.some(role => this.getRoleAccess(currentRole, role.name) > RoleAccess.None)) {
107
- return RoleAccess.None;
108
- }
109
- // Get highest level of access from allowed capabilities
110
- let maxAccess = RoleAccess.None;
111
- formConfig.security.allow.forEach(role => {
112
- const access = this.getRoleAccess(currentRole, role.name);
113
- if (access > maxAccess) {
114
- maxAccess = access;
115
- }
116
- });
117
- return maxAccess;
118
- }
119
- static getRoleAccess(role, capName) {
120
- if (!role || !capName)
121
- return RoleAccess.None;
122
- return role[capName] ?? RoleAccess.None;
123
- }
124
- static testVisible(config, data, field, currentRole) {
125
- if ((field.type == 'section' || field.type == 'blank') && field.hidden)
126
- return false;
127
- // First check form level security if exists
128
- if (config.security && !this.hasFormAccess(config, currentRole)) {
129
- return false;
130
- }
131
- if (field.section) {
132
- const sectionField = config.fields.find(f => f.type === 'section' && f.name === field.section);
133
- if (sectionField) {
134
- // Inherit section's conditions
135
- if (!this.checkSecurity(sectionField.securityConfig, currentRole)) {
136
- return false;
137
- }
138
- // if (sectionField.hidden) return false;
139
- if (sectionField.hideOnCreate && config.mode == 'create')
140
- return false;
141
- if (sectionField.hideOnExists && config.mode != 'create')
142
- return false;
143
- if (sectionField.hiddenCondition && sectionField.hiddenCondition(data))
144
- return false;
145
- }
146
- }
147
- // Then check field level security if exists
148
- if (!this.checkSecurity(field.securityConfig, currentRole)) {
149
- return false;
150
- }
151
- if (field.hidden)
152
- return false;
153
- if (config.mode == 'create' && field.hideOnCreate) {
154
- return false;
155
- }
156
- if (config.mode != 'create' && field.hideOnExists) {
157
- return false;
158
- }
159
- if (field.hiddenCondition) {
160
- return !field.hiddenCondition(data);
161
- }
162
- return true;
163
- }
164
- static testReadOnly(config, data, field) {
165
- // Default readonly conditions
166
- if (config.mode == 'create') {
167
- return false;
168
- }
169
- if (field.readonly) {
170
- return true;
171
- }
172
- if (config.mode == 'view') {
173
- return true;
174
- }
175
- // Check section readonly condition first
176
- if (field.section) {
177
- const sectionField = config.fields.find(f => f.type === 'section' && f.name === field.section);
178
- if (sectionField?.readonlyCondition && sectionField.readonlyCondition(data)) {
179
- return true;
180
- }
181
- }
182
- // Check field level readonly condition last
183
- if (field.readonlyCondition) {
184
- return field.readonlyCondition(data);
185
- }
186
- return false;
187
- }
188
- static testVisibleHeaderButton(data, btn) {
189
- if (btn.hiddenCondition) {
190
- return !btn.hiddenCondition(data);
191
- }
192
- return true;
193
- }
194
- static getVisibleSubfields(config, data, field, currentRole) {
195
- return field.subfields?.filter(subfield => Core.testVisible(config, data, subfield, currentRole)) || [];
196
- }
197
- static validateObject(fields, data) {
198
- console.log("Validations");
199
- for (let field of fields) {
200
- if (field.type == 'file' || field.type == 'file-view' || field.type == 'blank' || field.type == 'section')
201
- continue;
202
- let name = field.alias ?? this.camelToWords(field.name);
203
- let d = data[field.name];
204
- let isRequired = field.required;
205
- if (!isRequired && field.requiredCondition) {
206
- isRequired = field.requiredCondition(data);
207
- }
208
- console.log(name + ' ' + d);
209
- if (isRequired) {
210
- if (d == undefined || d == null)
211
- return `${name} is required`;
212
- if (field.type == 'text') {
213
- if (d == '')
214
- return `Please enter ${name}`;
215
- if (field.min && d.length < field.min)
216
- return `Minimum ${name} length is ${field.min}`;
217
- if (field.max && d.length > field.max)
218
- return `Maximum ${name} length is ${field.max}`;
219
- }
220
- else if (field.type == 'number' || field.type == 'money' || field.type == 'date') {
221
- if (field.min && d < field.min)
222
- return `Minimum ${name} is ${field.min}`;
223
- if (field.max && d > field.max)
224
- return `Maximum ${name} is ${field.max}`;
225
- }
226
- else if (field.type == 'select') {
227
- if (typeof (d) == 'string' && d == '')
228
- return `Please select ${name}`;
229
- }
230
- }
231
- // Changed: Added regex validation for text fields - only validate if field has content
232
- if (field.type == 'text' && field.regex && d && d.toString().trim() !== '') {
233
- const regexPattern = new RegExp(field.regex.pattern);
234
- if (!regexPattern.test(d)) {
235
- return field.regex.message;
236
- }
237
- }
238
- }
239
- ;
240
- return '';
241
- }
242
- static testRequired(config, data, field) {
243
- if (field.required) {
244
- return true;
245
- }
246
- if (field.requiredCondition) {
247
- return field.requiredCondition(data);
248
- }
249
- return false;
250
- }
251
- static getInitialValue(field) {
252
- if (field.defaultValue) {
253
- if ((field.type == 'date' || field.type == 'datetime') && field.defaultValue == 'now')
254
- return this.nowDate(true);
255
- return field.defaultValue;
256
- }
257
- if (field.type == 'select' && (field.hidden || field.hideOnCreate))
258
- return 0;
259
- switch (field.type) {
260
- case 'text':
261
- return '';
262
- case 'money':
263
- return 0;
264
- case 'number':
265
- return 0;
266
- case 'date':
267
- return this.nowDate(true);
268
- case 'checkbox':
269
- return false;
270
- case 'select':
271
- return null;
272
- default:
273
- return null;
274
- }
275
- }
276
- static getClone(x) {
277
- return this.deepClone2(x);
278
- }
279
- static getNumber(value) {
280
- if (value == null || value == "") {
281
- return 0;
282
- }
283
- const onlyNumbers = value.replace(/[^\d.-]/g, '');
284
- return onlyNumbers;
285
- }
286
- static getFirstDayOfMonth() {
287
- const date = new Date();
288
- return new Date(date.getFullYear(), date.getMonth(), 1);
289
- }
290
- static emailIsValid(email) {
291
- // return /\S+@\S+\.\S+/.test(email)
292
- return false;
293
- }
294
- static isValidUNCPath(path) {
295
- // return /\\\\([a-zA-Z0-9_.$●-]+)\\([a-zA-Z0-9_.$●-]+).*/.test(path)
296
- return false;
297
- }
298
- static isValidDate(date) {
299
- var parsedDate = Date.parse(date);
300
- if (isNaN(date) && !isNaN(parsedDate)) {
301
- return true;
302
- }
303
- else {
304
- return false;
305
- }
306
- }
307
- static isValidEmailList(list) {
308
- if (list.includes(";")) {
309
- let emails = list.split(";");
310
- for (var email of emails) {
311
- if (this.emailIsValid(email) == false) {
312
- return false;
313
- }
314
- }
315
- }
316
- else {
317
- if (this.emailIsValid(list) == false) {
318
- return false;
319
- }
320
- }
321
- return true;
322
- }
323
- static isNumber(value) {
324
- return ((value != null) &&
325
- (value !== '') &&
326
- !isNaN(Number(value.toString())));
327
- }
328
- static getDiff(startDate, endDate = Date()) {
329
- var eventStartTime = new Date(startDate);
330
- var eventEndTime = new Date(endDate);
331
- var milliseconds = eventEndTime.valueOf() - eventStartTime.valueOf();
332
- function numberEnding(number) {
333
- if (number.toFixed() == '1') {
334
- return '';
335
- }
336
- else {
337
- return 's';
338
- }
339
- }
340
- var minutes = (milliseconds / (1000 * 60));
341
- var hours = (milliseconds / (1000 * 60 * 60));
342
- var days = (milliseconds / (1000 * 60 * 60 * 24));
343
- var weeks = (milliseconds / (1000 * 60 * 60 * 24 * 7));
344
- var months = (milliseconds / (1000 * 60 * 60 * 24 * 7 * 4));
345
- var years = (milliseconds / (1000 * 60 * 60 * 24 * 365));
346
- if (years >= 1) {
347
- return years.toFixed() + ' year' + numberEnding(years);
348
- }
349
- else if (months >= 1) {
350
- return months.toFixed() + ' month' + numberEnding(months);
351
- }
352
- else if (weeks >= 1) {
353
- return weeks.toFixed() + ' week' + numberEnding(weeks);
354
- }
355
- else if (days >= 1) {
356
- return days.toFixed() + ' day' + numberEnding(days);
357
- }
358
- else if (hours >= 1) {
359
- return hours.toFixed() + ' hour' + numberEnding(hours);
360
- }
361
- else if (minutes >= 1) {
362
- return minutes.toFixed() + ' minute' + numberEnding(minutes);
363
- }
364
- else if (milliseconds >= (-1000 * 60)) {
365
- return 'a minute';
366
- }
367
- else {
368
- return 'N/A';
369
- }
370
- }
371
- static nowDate(NoTime = false) {
372
- if (NoTime) {
373
- return this.getFormatedDate(Date(), true);
374
- }
375
- else {
376
- return this.getFormatedDate(Date());
377
- }
378
- }
379
- static getFormatedDate(dateString, NoTime = false) {
380
- let d = new Date(dateString);
381
- d.setHours(d.getHours() + 2);
382
- if (NoTime == true) {
383
- return d.toISOString().split('T')[0];
384
- }
385
- else {
386
- return d.toISOString().split('.')[0];
387
- }
388
- }
389
- static getFormatedDate2(d, NoTime = false) {
390
- d.setHours(d.getHours() + 2);
391
- if (NoTime == true) {
392
- return d.toISOString().split('T')[0];
393
- }
394
- else {
395
- return d.toISOString().split('.')[0];
396
- }
397
- }
398
- static getBusinessDatesCount(startDate, endDate) {
399
- var count = 0;
400
- var _startDate = new Date(startDate);
401
- var _endDate = new Date(endDate);
402
- var curDate = _startDate;
403
- while (curDate < _endDate) {
404
- var dayOfWeek = curDate.getDay();
405
- if (!(dayOfWeek == 6 || dayOfWeek == 0))
406
- count++;
407
- curDate.setDate(curDate.getDate() + 1);
408
- }
409
- return count;
410
- }
411
- }
412
- Core.nullDate = "01 Jan 1969";
413
- export class DetailsDialogProcessor {
414
- static processDetailsConfig(detailsConfig, row) {
415
- const updatedDetailsConfig = Core.getClone(detailsConfig); //{...detailsConfig}
416
- updatedDetailsConfig.details = row;
417
- //Form Config
418
- updatedDetailsConfig.formConfig.mode = updatedDetailsConfig.mode ?? "view";
419
- if (updatedDetailsConfig.heroField && row) {
420
- updatedDetailsConfig.heroValue = row[updatedDetailsConfig.heroField];
421
- }
422
- //Table configs
423
- if (updatedDetailsConfig.tableConfig) {
424
- updateTableConfig(updatedDetailsConfig.tableConfig);
425
- }
426
- if (updatedDetailsConfig.tableConfigs) {
427
- updatedDetailsConfig.tableConfigs.forEach(updateTableConfig);
428
- }
429
- function updateTableConfig(tableConfig) {
430
- tableConfig.heroField = updatedDetailsConfig?.heroField;
431
- tableConfig.heroValue = updatedDetailsConfig?.heroValue;
432
- // tableConfig.setHero = updatedDetailsConfig.setHero;
433
- tableConfig.searchConfig = null;
434
- tableConfig.tileConfig = null;
435
- tableConfig.parentData = updatedDetailsConfig.details;
436
- tableConfig.elevation = 'none';
437
- }
438
- //URL
439
- if (updatedDetailsConfig.tableConfig) {
440
- transformLoadUrl(updatedDetailsConfig.tableConfig);
441
- }
442
- if (updatedDetailsConfig.tableConfigs) {
443
- updatedDetailsConfig.tableConfigs.forEach(transformLoadUrl);
444
- }
445
- if (updatedDetailsConfig.stepConfig?.loadAction) {
446
- transformStepUrl(updatedDetailsConfig.stepConfig);
447
- }
448
- function transformLoadUrl(tableConfig) {
449
- if (tableConfig.loadAction && tableConfig.loadCriteria && tableConfig.loadIDField) {
450
- tableConfig.loadAction.url = `${tableConfig.loadAction.url.split('/')[0]}/${tableConfig.loadCriteria}/${updatedDetailsConfig.details[tableConfig.loadIDField]}`;
451
- console.log("Transformed", tableConfig.loadAction.url);
452
- }
453
- else {
454
- console.log("NOT Transformed");
455
- }
456
- }
457
- function transformStepUrl(stepConfig) {
458
- if (stepConfig.loadAction && stepConfig.loadIDField) {
459
- // let heroId = updatedDetailsConfig.details[updatedDetailsConfig.heroField];
460
- stepConfig.loadAction.url = `${stepConfig.loadAction.url.replace('{id}', updatedDetailsConfig.details[stepConfig.loadIDField])}`;
461
- // console.log("Transformed step URL", stepConfig.loadAction.url);
462
- }
463
- }
464
- return updatedDetailsConfig;
465
- }
466
- static initializeConfigs(detailsConfig) {
467
- const tableConfig = detailsConfig.tableConfig;
468
- const tableConfigs = detailsConfig.tableConfigs;
469
- const formConfig = detailsConfig.formConfig;
470
- const stepConfig = detailsConfig.stepConfig;
471
- const statusConfig = detailsConfig.statusConfig;
472
- const buttons = detailsConfig.buttons;
473
- formConfig.mode = formConfig.mode ?? "view";
474
- return { tableConfig, tableConfigs, formConfig, stepConfig, statusConfig, buttons };
475
- }
476
- static setHeroValue(detailsConfig, details) {
477
- if ((detailsConfig.formConfig.mode == "create") && detailsConfig.heroField && detailsConfig.heroValue) {
478
- details[detailsConfig.heroField] = detailsConfig.heroValue;
479
- // Ensure hero values are set in form config
480
- detailsConfig.formConfig.heroField = detailsConfig.heroField;
481
- detailsConfig.formConfig.heroValue = detailsConfig.heroValue;
482
- return;
483
- }
484
- }
485
- static handleFormMode(detailsConfig, formConfig) {
486
- let details;
487
- let action;
488
- let loadByAction = false;
489
- if (formConfig.mode === "create") {
490
- details = Core.generateObject(formConfig.fields);
491
- }
492
- else {
493
- let resp = this.loadDetailsData(detailsConfig, formConfig);
494
- details = resp.details;
495
- action = resp.action;
496
- loadByAction = resp.loadByAction;
497
- }
498
- return { details, loadByAction, action };
499
- }
500
- static loadDetailsData(detailsConfig, formConfig) {
501
- let details;
502
- let action;
503
- let loadByAction = false;
504
- //Choose source
505
- if (detailsConfig.detailsSource == DetailsSource.Row) {
506
- console.log("Data from Details - Row option");
507
- details = detailsConfig.details;
508
- }
509
- else if (detailsConfig.detailsSource == DetailsSource.Url) {
510
- console.log("Data from Url option");
511
- action = this.loadDetailsFromUrl(detailsConfig, formConfig);
512
- loadByAction = true;
513
- }
514
- else {
515
- //new logic
516
- if (formConfig.loadAction) {
517
- console.log("Data from Url - Guessed");
518
- action = this.loadDetailsFromUrl(detailsConfig, formConfig);
519
- loadByAction = true;
520
- }
521
- else {
522
- console.log("Data from Details - Guessed");
523
- details = detailsConfig.details;
524
- }
525
- }
526
- return { details, loadByAction, action };
527
- }
528
- static loadDetailsFromUrl(detailsConfig, formConfig) {
529
- let action;
530
- if (formConfig.loadAction) {
531
- if (detailsConfig.heroField && detailsConfig.details) {
532
- console.log("DetailsConfig Hero ID Field " + detailsConfig.heroField);
533
- action = { url: `${formConfig.loadAction.url}/${detailsConfig.details[detailsConfig.heroField]}` };
534
- }
535
- else if (formConfig.heroField && detailsConfig.details) {
536
- console.log("FormConfig Hero ID Field " + formConfig.heroField);
537
- action = { url: `${formConfig.loadAction.url}/${detailsConfig.details[formConfig.heroField]}` };
538
- }
539
- else if (detailsConfig.heroValue) {
540
- console.log("Defined Hero Value " + detailsConfig.heroValue);
541
- action = { url: `${formConfig.loadAction.url}/${detailsConfig.heroValue}` };
542
- }
543
- else {
544
- console.log("url source failed : setup hero field or hero value");
545
- }
546
- action.cacheDurationMinutes = formConfig.loadAction.cacheDurationMinutes ?? 0;
547
- action.skipCache = formConfig.loadAction.skipCache ?? false;
548
- action.successMessage = formConfig.loadAction.successMessage ?? null;
549
- }
550
- else {
551
- console.log("No load action set");
552
- }
553
- return action;
554
- }
555
- static setFileField(formConfig) {
556
- return formConfig.fields.find(x => x.type === 'file');
557
- }
558
- static setupButtons(buttons) {
559
- let extraButtons, createButton, editButton, deleteButton;
560
- if (buttons) {
561
- extraButtons = buttons.filter(x => x.name !== "create" && x.name !== "edit" && x.name !== "delete" && x.name !== "view" && x.inDialog);
562
- createButton = buttons.find(x => x.name === "create");
563
- editButton = buttons.find(x => x.name === "edit");
564
- deleteButton = buttons.find(x => x.name === "delete");
565
- }
566
- return { extraButtons, createButton, editButton, deleteButton };
567
- }
568
- }
569
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGluQ29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rpbi1zcGEvc3JjL2xpYi9jbGFzc2VzL1RpbkNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUErQixhQUFhLEVBQXFCLFVBQVUsRUFBa0IsTUFBTSxXQUFXLENBQUM7QUFFdEgsTUFBTSxPQUFPLElBQUk7SUFHUixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUc7UUFDekIsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUMzQyxPQUFPLEdBQUcsQ0FBQztTQUNaO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBUTtRQUMvQiw4Q0FBOEM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUVuQyx5REFB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eyBBY3Rpb24sIERldGFpbHNEaWFsb2dDb25maWcsIERldGFpbHNTb3VyY2UsIEZpZWxkLCBGb3JtQ29uZmlnLCBSb2xlQWNjZXNzLCBTZWN1cml0eUNvbmZpZyB9IGZyb20gXCIuL0NsYXNzZXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDb3JlIHtcclxuXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZGVlcENsb25lKG9iaikge1xyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcclxuICAgICAgY29uc3QgYXJyQ29weSA9IFtdO1xyXG4gICAgICBvYmouZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICBhcnJDb3B5W2luZGV4XSA9IHRoaXMuZGVlcENsb25lKGl0ZW0pO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGFyckNvcHk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb2JqQ29weSA9IHt9O1xyXG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIG9iakNvcHlba2V5XSA9IHRoaXMuZGVlcENsb25lKG9ialtrZXldKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG9iakNvcHk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGRlZXBDbG9uZTIob2JqOiBhbnkpOiBhbnkge1xyXG4gICAgLy8gQ3JlYXRlIG5ldyBXZWFrTWFwIGZvciBlYWNoIGNsb25lIG9wZXJhdGlvblxyXG4gICAgY29uc3QgY2xvbmVWaXNpdGVkID0gbmV3IFdlYWtNYXAoKTtcclxuXHJcbiAgICAvLyBJbm5lciBmdW5jdGlvbiB0aGF0IGhhcyBhY2Nlc3MgdG8gdGhlIGNsb25lVmlzaXRlZCBtYXBcclxuICAgIGNvbnN0IGNsb25lID0gKHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAvLyBIYW5kbGUgbnVsbCwgdW5kZWZpbmVkIGFuZCBwcmltaXRpdmVzXHJcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDaGVjayBpZiBvYmplY3Qgd2FzIGFscmVhZHkgY2xvbmVkXHJcbiAgICAgIGlmIChjbG9uZVZpc2l0ZWQuaGFzKHZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiBjbG9uZVZpc2l0ZWQuZ2V0KHZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICBjb25zdCBhcnJDb3B5ID0gW107XHJcbiAgICAgICAgY2xvbmVWaXNpdGVkLnNldCh2YWx1ZSwgYXJyQ29weSk7XHJcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgIGFyckNvcHlbaW5kZXhdID0gY2xvbmUoaXRlbSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGFyckNvcHk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEhhbmRsZSBkYXRlc1xyXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGFuZGxlIHJlZ3VsYXIgb2JqZWN0c1xyXG4gICAgICBjb25zdCBvYmpDb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpKTtcclxuICAgICAgY2xvbmVWaXNpdGVkLnNldCh2YWx1ZSwgb2JqQ29weSk7XHJcblxyXG4gICAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcclxuICAgICAgICAgIG9iakNvcHlba2V5XSA9IGNsb25lKHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBvYmpDb3B5O1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBTdGFydCB0aGUgY2xvbmUgb3BlcmF0aW9uIHdpdGggYSBmcmVzaCBXZWFrTWFwXHJcbiAgICByZXR1cm4gY2xvbmUob2JqKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjYW1lbFRvV29yZHModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdmFsdWU7XHJcblxyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcclxuXHJcbiAgICBpZiAodmFsdWUubGVuZ3RoID09IDApIHJldHVybiB2YWx1ZTtcclxuXHJcbiAgICBsZXQgdiA9IHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc3Vic3RyaW5nKDEpXHJcbiAgICByZXR1cm4gdi5yZXBsYWNlKC8oW0EtWl0rKSooW0EtWl1bYS16XSkvZywgXCIkMSAkMlwiKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVPYmplY3QoZmllbGRzOiBGaWVsZFtdKSB7XHJcblxyXG4gICAgbGV0IGRhdGEgPSB7fTtcclxuICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuXHJcbiAgICAgIGlmIChmaWVsZC50eXBlICE9ICdzZWN0aW9uJyAmJiBmaWVsZC50eXBlICE9ICdibGFuaycgKXtcclxuICAgICAgICBkYXRhW2ZpZWxkLm5hbWVdID0gdGhpcy5nZXRJbml0aWFsVmFsdWUoZmllbGQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coZGF0YSlcclxuXHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRPYmplY3QoZmllbGRzOiBGaWVsZFtdLCBkYXRhKSB7XHJcblxyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBpZiAoZmllbGQudHlwZSAhPSAnc2VjdGlvbicgJiYgZmllbGQudHlwZSAhPSAnYmxhbmsnKSB7XHJcbiAgICAgICAgZGF0YVtmaWVsZC5uYW1lXSA9IHRoaXMuZ2V0SW5pdGlhbFZhbHVlKGZpZWxkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBjaGVja1NlY3VyaXR5KHNlY3VyaXR5OiBTZWN1cml0eUNvbmZpZywgY3VycmVudFJvbGU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWN1cml0eSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2VjdXJpdHkuZGVueT8uc29tZShyb2xlID0+IGN1cnJlbnRSb2xlW3JvbGUubmFtZV0pKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXNlY3VyaXR5LmFsbG93IHx8IHNlY3VyaXR5LmFsbG93Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2VjdXJpdHkuYWxsb3cuc29tZShyb2xlID0+IGN1cnJlbnRSb2xlW3JvbGUubmFtZV0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBoYXNGb3JtQWNjZXNzKGZvcm1Db25maWc6IEZvcm1Db25maWcsIGN1cnJlbnRSb2xlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmdldEZvcm1BY2Nlc3MoZm9ybUNvbmZpZywgY3VycmVudFJvbGUpID4gUm9sZUFjY2Vzcy5Ob25lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRGb3JtQWNjZXNzKGZvcm1Db25maWc6IEZvcm1Db25maWcsIGN1cnJlbnRSb2xlOiBhbnkpOiBSb2xlQWNjZXNzIHtcclxuICAgIGlmICghZm9ybUNvbmZpZz8uc2VjdXJpdHk/LmFsbG93KSB7XHJcbiAgICAgIHJldHVybiBSb2xlQWNjZXNzLkZ1bGw7IC8vIEZ1bGwgYWNjZXNzIGlmIG5vIHJlc3RyaWN0aW9uc1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGRlbnkgZmlyc3RcclxuICAgIGlmIChmb3JtQ29uZmlnLnNlY3VyaXR5LmRlbnk/LnNvbWUocm9sZSA9PiB0aGlzLmdldFJvbGVBY2Nlc3MoY3VycmVudFJvbGUsIHJvbGUubmFtZSkgPiBSb2xlQWNjZXNzLk5vbmUpKSB7XHJcbiAgICAgIHJldHVybiBSb2xlQWNjZXNzLk5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IGhpZ2hlc3QgbGV2ZWwgb2YgYWNjZXNzIGZyb20gYWxsb3dlZCBjYXBhYmlsaXRpZXNcclxuICAgIGxldCBtYXhBY2Nlc3MgPSBSb2xlQWNjZXNzLk5vbmU7XHJcbiAgICBmb3JtQ29uZmlnLnNlY3VyaXR5LmFsbG93LmZvckVhY2gocm9sZSA9PiB7XHJcbiAgICAgIGNvbnN0IGFjY2VzcyA9IHRoaXMuZ2V0Um9sZUFjY2VzcyhjdXJyZW50Um9sZSwgcm9sZS5uYW1lKTtcclxuICAgICAgaWYgKGFjY2VzcyA+IG1heEFjY2Vzcykge1xyXG4gICAgICAgIG1heEFjY2VzcyA9IGFjY2VzcztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1heEFjY2VzcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGdldFJvbGVBY2Nlc3Mocm9sZTogYW55LCBjYXBOYW1lOiBzdHJpbmcpOiBSb2xlQWNjZXNzIHtcclxuICAgIGlmICghcm9sZSB8fCAhY2FwTmFtZSkgcmV0dXJuIFJvbGVBY2Nlc3MuTm9uZTtcclxuICAgIHJldHVybiByb2xlW2NhcE5hbWVdID8/IFJvbGVBY2Nlc3MuTm9uZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdGVzdFZpc2libGUoY29uZmlnOiBGb3JtQ29uZmlnLCBkYXRhLCBmaWVsZDogRmllbGQsIGN1cnJlbnRSb2xlOiBhbnkpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAoKGZpZWxkLnR5cGUgPT0gJ3NlY3Rpb24nIHx8IGZpZWxkLnR5cGUgPT0gJ2JsYW5rJykgJiYgZmllbGQuaGlkZGVuKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gRmlyc3QgY2hlY2sgZm9ybSBsZXZlbCBzZWN1cml0eSBpZiBleGlzdHNcclxuICAgIGlmIChjb25maWcuc2VjdXJpdHkgJiYgIXRoaXMuaGFzRm9ybUFjY2Vzcyhjb25maWcsIGN1cnJlbnRSb2xlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpZWxkLnNlY3Rpb24pIHtcclxuICAgICAgY29uc3Qgc2VjdGlvbkZpZWxkID0gY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi50eXBlID09PSAnc2VjdGlvbicgJiYgZi5uYW1lID09PSBmaWVsZC5zZWN0aW9uKTtcclxuICAgICAgaWYgKHNlY3Rpb25GaWVsZCkge1xyXG4gICAgICAgIC8vIEluaGVyaXQgc2VjdGlvbidzIGNvbmRpdGlvbnNcclxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tTZWN1cml0eShzZWN0aW9uRmllbGQuc2VjdXJpdHlDb25maWcsIGN1cnJlbnRSb2xlKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiAoc2VjdGlvbkZpZWxkLmhpZGRlbikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChzZWN0aW9uRmllbGQuaGlkZU9uQ3JlYXRlICYmIGNvbmZpZy5tb2RlID09ICdjcmVhdGUnKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKHNlY3Rpb25GaWVsZC5oaWRlT25FeGlzdHMgJiYgY29uZmlnLm1vZGUgIT0gJ2NyZWF0ZScpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoc2VjdGlvbkZpZWxkLmhpZGRlbkNvbmRpdGlvbiAmJiBzZWN0aW9uRmllbGQuaGlkZGVuQ29uZGl0aW9uKGRhdGEpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGVuIGNoZWNrIGZpZWxkIGxldmVsIHNlY3VyaXR5IGlmIGV4aXN0c1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrU2VjdXJpdHkoZmllbGQuc2VjdXJpdHlDb25maWcsIGN1cnJlbnRSb2xlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpZWxkLmhpZGRlbikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChjb25maWcubW9kZSA9PSAnY3JlYXRlJyAmJiBmaWVsZC5oaWRlT25DcmVhdGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpZiAoY29uZmlnLm1vZGUgIT0gJ2NyZWF0ZScgJiYgZmllbGQuaGlkZU9uRXhpc3RzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIGlmIChmaWVsZC5oaWRkZW5Db25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuICFmaWVsZC5oaWRkZW5Db25kaXRpb24oZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHRlc3RSZWFkT25seShjb25maWc6IEZvcm1Db25maWcsIGRhdGEsIGZpZWxkOiBGaWVsZCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gRGVmYXVsdCByZWFkb25seSBjb25kaXRpb25zXHJcbiAgICBpZiAoY29uZmlnLm1vZGUgPT0gJ2NyZWF0ZScpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZC5yZWFkb25seSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZmlnLm1vZGUgPT0gJ3ZpZXcnKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIHNlY3Rpb24gcmVhZG9ubHkgY29uZGl0aW9uIGZpcnN0XHJcbiAgICBpZiAoZmllbGQuc2VjdGlvbikge1xyXG4gICAgICBjb25zdCBzZWN0aW9uRmllbGQgPSBjb25maWcuZmllbGRzLmZpbmQoZiA9PiBmLnR5cGUgPT09ICdzZWN0aW9uJyAmJiBmLm5hbWUgPT09IGZpZWxkLnNlY3Rpb24pO1xyXG4gICAgICBpZiAoc2VjdGlvbkZpZWxkPy5yZWFkb25seUNvbmRpdGlvbiAmJiBzZWN0aW9uRmllbGQucmVhZG9ubHlDb25kaXRpb24oZGF0YSkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGZpZWxkIGxldmVsIHJlYWRvbmx5IGNvbmRpdGlvbiBsYXN0XHJcbiAgICBpZiAoZmllbGQucmVhZG9ubHlDb25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuIGZpZWxkLnJlYWRvbmx5Q29uZGl0aW9uKGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdGVzdFZpc2libGVIZWFkZXJCdXR0b24oZGF0YSwgYnRuKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKGJ0bi5oaWRkZW5Db25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuICFidG4uaGlkZGVuQ29uZGl0aW9uKGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRWaXNpYmxlU3ViZmllbGRzKGNvbmZpZzogRm9ybUNvbmZpZywgZGF0YSwgZmllbGQ6IEZpZWxkLCBjdXJyZW50Um9sZTogYW55ICk6IEZpZWxkW10ge1xyXG4gICAgcmV0dXJuIGZpZWxkLnN1YmZpZWxkcz8uZmlsdGVyKHN1YmZpZWxkID0+IENvcmUudGVzdFZpc2libGUoY29uZmlnLCBkYXRhLCBzdWJmaWVsZCxjdXJyZW50Um9sZSApKSB8fCBbXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVPYmplY3QoZmllbGRzOiBGaWVsZFtdLCBkYXRhKTogc3RyaW5nIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlZhbGlkYXRpb25zXCIpXHJcblxyXG4gICAgZm9yIChsZXQgZmllbGQgb2YgZmllbGRzKSB7XHJcblxyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PSAnZmlsZScgfHwgZmllbGQudHlwZSA9PSAnZmlsZS12aWV3JyB8fCBmaWVsZC50eXBlID09ICdibGFuaycgfHwgZmllbGQudHlwZSA9PSAnc2VjdGlvbicgKSBjb250aW51ZVxyXG5cclxuXHJcblxyXG4gICAgICBsZXQgbmFtZSA9IGZpZWxkLmFsaWFzID8/IHRoaXMuY2FtZWxUb1dvcmRzKGZpZWxkLm5hbWUpO1xyXG4gICAgICBsZXQgZCA9IGRhdGFbZmllbGQubmFtZV07XHJcblxyXG4gICAgICBsZXQgaXNSZXF1aXJlZCA9IGZpZWxkLnJlcXVpcmVkO1xyXG5cclxuICAgICAgaWYgKCFpc1JlcXVpcmVkICYmIGZpZWxkLnJlcXVpcmVkQ29uZGl0aW9uKSB7XHJcbiAgICAgICAgaXNSZXF1aXJlZCA9IGZpZWxkLnJlcXVpcmVkQ29uZGl0aW9uKGRhdGEpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgY29uc29sZS5sb2cobmFtZSArICcgJyArIGQpXHJcblxyXG4gICAgICBpZiAoaXNSZXF1aXJlZCl7XHJcblxyXG4gICAgICAgIGlmIChkID09IHVuZGVmaW5lZCB8fCBkID09IG51bGwpIHJldHVybiBgJHtuYW1lfSBpcyByZXF1aXJlZGA7XHJcblxyXG4gICAgICAgIGlmIChmaWVsZC50eXBlID09ICd0ZXh0Jyl7XHJcblxyXG4gICAgICAgICAgaWYgKGQgPT0gJycpIHJldHVybiBgUGxlYXNlIGVudGVyICR7bmFtZX1gO1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZC5taW4gJiYgZC5sZW5ndGggPCBmaWVsZC5taW4pIHJldHVybiBgTWluaW11bSAgJHtuYW1lfSBsZW5ndGggaXMgJHtmaWVsZC5taW59YFxyXG5cclxuICAgICAgICAgIGlmIChmaWVsZC5tYXggJiYgZC5sZW5ndGggPiBmaWVsZC5tYXgpIHJldHVybiBgTWF4aW11bSAke25hbWV9IGxlbmd0aCBpcyAke2ZpZWxkLm1heH1gXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChmaWVsZC50eXBlID09ICdudW1iZXInIHx8IGZpZWxkLnR5cGUgPT0gJ21vbmV5JyB8fCBmaWVsZC50eXBlID09ICdkYXRlJyl7XHJcblxyXG4gICAgICAgICAgaWYgKGZpZWxkLm1pbiAmJiBkIDwgZmllbGQubWluKSByZXR1cm4gYE1pbmltdW0gICR7bmFtZX0gaXMgJHtmaWVsZC5taW59YFxyXG5cclxuICAgICAgICAgIGlmIChmaWVsZC5tYXggJiYgZCA+IGZpZWxkLm1heCkgcmV0dXJuIGBNYXhpbXVtICR7bmFtZX0gaXMgJHtmaWVsZC5tYXh9YFxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZmllbGQudHlwZSA9PSAnc2VsZWN0Jykge1xyXG5cclxuICAgICAgICAgIGlmICh0eXBlb2YoZCkgPT0gJ3N0cmluZycgJiYgZCA9PSAnJykgcmV0dXJuIGBQbGVhc2Ugc2VsZWN0ICR7bmFtZX1gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENoYW5nZWQ6IEFkZGVkIHJlZ2V4IHZhbGlkYXRpb24gZm9yIHRleHQgZmllbGRzIC0gb25seSB2YWxpZGF0ZSBpZiBmaWVsZCBoYXMgY29udGVudFxyXG4gICAgICBpZiAoZmllbGQudHlwZSA9PSAndGV4dCcgJiYgZmllbGQucmVnZXggJiYgZCAmJiBkLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoZmllbGQucmVnZXgucGF0dGVybik7XHJcbiAgICAgICAgaWYgKCFyZWdleFBhdHRlcm4udGVzdChkKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZpZWxkLnJlZ2V4Lm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIHRlc3RSZXF1aXJlZChjb25maWc6IEZvcm1Db25maWcsIGRhdGEsIGZpZWxkOiBGaWVsZCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGZpZWxkLnJlcXVpcmVkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoZmllbGQucmVxdWlyZWRDb25kaXRpb24pIHtcclxuICAgICAgcmV0dXJuIGZpZWxkLnJlcXVpcmVkQ29uZGl0aW9uKGRhdGEpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEluaXRpYWxWYWx1ZShmaWVsZDogRmllbGQpIHtcclxuXHJcbiAgICBpZiAoZmllbGQuZGVmYXVsdFZhbHVlKXtcclxuXHJcbiAgICAgIGlmICgoZmllbGQudHlwZSA9PSAnZGF0ZScgfHwgZmllbGQudHlwZSA9PSAnZGF0ZXRpbWUnKSAmJiBmaWVsZC5kZWZhdWx0VmFsdWUgPT0gJ25vdycpIHJldHVybiB0aGlzLm5vd0RhdGUodHJ1ZSk7XHJcblxyXG4gICAgICByZXR1cm4gZmllbGQuZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZC50eXBlID09ICdzZWxlY3QnICYmIChmaWVsZC5oaWRkZW4gfHwgZmllbGQuaGlkZU9uQ3JlYXRlKSkgcmV0dXJuIDA7XHJcblxyXG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3RleHQnOlxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgY2FzZSAnbW9uZXknOlxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5ub3dEYXRlKHRydWUpO1xyXG4gICAgICBjYXNlICdjaGVja2JveCc6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBjYXNlICdzZWxlY3QnOlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldENsb25lKHgpIHtcclxuICAgIHJldHVybiB0aGlzLmRlZXBDbG9uZTIoeCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldE51bWJlcih2YWx1ZTogc3RyaW5nKSB7XHJcblxyXG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvbmx5TnVtYmVycyA9IHZhbHVlLnJlcGxhY2UoL1teXFxkLi1dL2csICcnKTtcclxuICAgIHJldHVybiBvbmx5TnVtYmVyc1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXRGaXJzdERheU9mTW9udGgoKSB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGVtYWlsSXNWYWxpZChlbWFpbCkge1xyXG4gICAgLy8gcmV0dXJuIC9cXFMrQFxcUytcXC5cXFMrLy50ZXN0KGVtYWlsKVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBpc1ZhbGlkVU5DUGF0aChwYXRoOiBzdHJpbmcpIHtcclxuICAgIC8vIHJldHVybiAvXFxcXFxcXFwoW2EtekEtWjAtOV8uJOKXjy1dKylcXFxcKFthLXpBLVowLTlfLiTil48tXSspLiovLnRlc3QocGF0aClcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWxpZERhdGUoZGF0ZSkge1xyXG5cclxuICAgIHZhciBwYXJzZWREYXRlID0gRGF0ZS5wYXJzZShkYXRlKTtcclxuXHJcblxyXG4gICAgaWYgKGlzTmFOKGRhdGUpICYmICFpc05hTihwYXJzZWREYXRlKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRFbWFpbExpc3QobGlzdDogc3RyaW5nKSB7XHJcblxyXG4gICAgaWYgKGxpc3QuaW5jbHVkZXMoXCI7XCIpKSB7XHJcblxyXG4gICAgICBsZXQgZW1haWxzID0gbGlzdC5zcGxpdChcIjtcIilcclxuXHJcbiAgICAgIGZvciAodmFyIGVtYWlsIG9mIGVtYWlscykge1xyXG4gICAgICAgIGlmICh0aGlzLmVtYWlsSXNWYWxpZChlbWFpbCkgPT0gZmFsc2UpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLmVtYWlsSXNWYWxpZChsaXN0KSA9PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIG51bGxEYXRlID0gXCIwMSBKYW4gMTk2OVwiXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICgodmFsdWUgIT0gbnVsbCkgJiZcclxuICAgICAgKHZhbHVlICE9PSAnJykgJiZcclxuICAgICAgIWlzTmFOKE51bWJlcih2YWx1ZS50b1N0cmluZygpKSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBnZXREaWZmKHN0YXJ0RGF0ZSwgZW5kRGF0ZSA9IERhdGUoKSkge1xyXG5cclxuICAgIHZhciBldmVudFN0YXJ0VGltZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICB2YXIgZXZlbnRFbmRUaW1lID0gbmV3IERhdGUoZW5kRGF0ZSk7XHJcbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gZXZlbnRFbmRUaW1lLnZhbHVlT2YoKSAtIGV2ZW50U3RhcnRUaW1lLnZhbHVlT2YoKTtcclxuXHJcbiAgICBmdW5jdGlvbiBudW1iZXJFbmRpbmcobnVtYmVyOiBudW1iZXIpIHtcclxuXHJcbiAgICAgIGlmIChudW1iZXIudG9GaXhlZCgpID09ICcxJykge1xyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAncyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFyIG1pbnV0ZXMgPSAobWlsbGlzZWNvbmRzIC8gKDEwMDAgKiA2MCkpO1xyXG5cclxuICAgIHZhciBob3VyczogbnVtYmVyID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCkpO1xyXG5cclxuICAgIHZhciBkYXlzID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7XHJcblxyXG4gICAgdmFyIHdlZWtzOiBudW1iZXIgPSAobWlsbGlzZWNvbmRzIC8gKDEwMDAgKiA2MCAqIDYwICogMjQgKiA3KSk7XHJcblxyXG4gICAgdmFyIG1vbnRocyA9IChtaWxsaXNlY29uZHMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCAqIDcgKiA0KSk7XHJcblxyXG4gICAgdmFyIHllYXJzID0gKG1pbGxpc2Vjb25kcyAvICgxMDAwICogNjAgKiA2MCAqIDI0ICogMzY1KSk7XHJcblxyXG5cclxuICAgIGlmICh5ZWFycyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4geWVhcnMudG9GaXhlZCgpICsgJyB5ZWFyJyArIG51bWJlckVuZGluZyh5ZWFycyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChtb250aHMgPj0gMSkge1xyXG5cclxuICAgICAgcmV0dXJuIG1vbnRocy50b0ZpeGVkKCkgKyAnIG1vbnRoJyArIG51bWJlckVuZGluZyhtb250aHMpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAod2Vla3MgPj0gMSkge1xyXG5cclxuICAgICAgcmV0dXJuIHdlZWtzLnRvRml4ZWQoKSArICcgd2VlaycgKyBudW1iZXJFbmRpbmcod2Vla3MpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoZGF5cyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4gZGF5cy50b0ZpeGVkKCkgKyAnIGRheScgKyBudW1iZXJFbmRpbmcoZGF5cyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxKSB7XHJcblxyXG4gICAgICByZXR1cm4gaG91cnMudG9GaXhlZCgpICsgJyBob3VyJyArIG51bWJlckVuZGluZyhob3Vycyk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChtaW51dGVzID49IDEpIHtcclxuXHJcbiAgICAgIHJldHVybiBtaW51dGVzLnRvRml4ZWQoKSArICcgbWludXRlJyArIG51bWJlckVuZGluZyhtaW51dGVzKTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKG1pbGxpc2Vjb25kcyA+PSAoLTEwMDAgKiA2MCkpIHtcclxuXHJcbiAgICAgIHJldHVybiAnYSBtaW51dGUnO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICByZXR1cm4gJ04vQSc7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgbm93RGF0ZShOb1RpbWU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgIGlmIChOb1RpbWUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybWF0ZWREYXRlKERhdGUoKSwgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGb3JtYXRlZERhdGUoRGF0ZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rm9ybWF0ZWREYXRlKGRhdGVTdHJpbmc6IHN0cmluZywgTm9UaW1lOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcbiAgICBsZXQgZDogRGF0ZSA9IG5ldyBEYXRlKGRhdGVTdHJpbmcpO1xyXG4gICAgZC5zZXRIb3VycyhkLmdldEhvdXJzKCkgKyAyKTtcclxuXHJcbiAgICBpZiAoTm9UaW1lID09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnLicpWzBdO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0Rm9ybWF0ZWREYXRlMihkIDogRGF0ZSwgTm9UaW1lOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHJcblxyXG4gICAgZC5zZXRIb3VycyhkLmdldEhvdXJzKCkgKyAyKTtcclxuXHJcbiAgICBpZiAoTm9UaW1lID09IHRydWUpIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zcGxpdCgnLicpWzBdO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QnVzaW5lc3NEYXRlc0NvdW50KHN0YXJ0RGF0ZTogc3RyaW5nLCBlbmREYXRlOiBzdHJpbmcpIHtcclxuICAgIHZhciBjb3VudCA9IDA7XHJcbiAgICB2YXIgX3N0YXJ0RGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcbiAgICB2YXIgX2VuZERhdGUgPSBuZXcgRGF0ZShlbmREYXRlKTtcclxuXHJcbiAgICB2YXIgY3VyRGF0ZSA9IF9zdGFydERhdGU7XHJcblxyXG4gICAgd2hpbGUgKGN1ckRhdGUgPCBfZW5kRGF0ZSkge1xyXG4gICAgICB2YXIgZGF5T2ZXZWVrID0gY3VyRGF0ZS5nZXREYXkoKTtcclxuICAgICAgaWYgKCEoZGF5T2ZXZWVrID09IDYgfHwgZGF5T2ZXZWVrID09IDApKSBjb3VudCsrO1xyXG4gICAgICBjdXJEYXRlLnNldERhdGUoY3VyRGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY291bnQ7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBEZXRhaWxzRGlhbG9nUHJvY2Vzc29yIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBwcm9jZXNzRGV0YWlsc0NvbmZpZyhkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCByb3c6IGFueSk6IERldGFpbHNEaWFsb2dDb25maWcge1xyXG5cclxuICAgIGNvbnN0IHVwZGF0ZWREZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0gQ29yZS5nZXRDbG9uZShkZXRhaWxzQ29uZmlnKTsgLy97Li4uZGV0YWlsc0NvbmZpZ31cclxuICAgIHVwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHMgPSByb3c7XHJcblxyXG5cclxuICAgIC8vRm9ybSBDb25maWdcclxuICAgIHVwZGF0ZWREZXRhaWxzQ29uZmlnLmZvcm1Db25maWcubW9kZSA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnLm1vZGUgPz8gXCJ2aWV3XCI7XHJcblxyXG5cclxuXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcuaGVyb0ZpZWxkICYmIHJvdykge1xyXG4gICAgICB1cGRhdGVkRGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUgPSByb3dbdXBkYXRlZERldGFpbHNDb25maWcuaGVyb0ZpZWxkXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9UYWJsZSBjb25maWdzXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWcpIHtcclxuICAgICAgdXBkYXRlVGFibGVDb25maWcodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZ3MpIHtcclxuICAgICAgdXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWdzLmZvckVhY2godXBkYXRlVGFibGVDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRhYmxlQ29uZmlnKHRhYmxlQ29uZmlnKSB7XHJcbiAgICAgIHRhYmxlQ29uZmlnLmhlcm9GaWVsZCA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnPy5oZXJvRmllbGQ7XHJcbiAgICAgIHRhYmxlQ29uZmlnLmhlcm9WYWx1ZSA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnPy5oZXJvVmFsdWU7XHJcbiAgICAgIC8vIHRhYmxlQ29uZmlnLnNldEhlcm8gPSB1cGRhdGVkRGV0YWlsc0NvbmZpZy5zZXRIZXJvO1xyXG4gICAgICB0YWJsZUNvbmZpZy5zZWFyY2hDb25maWcgPSBudWxsO1xyXG4gICAgICB0YWJsZUNvbmZpZy50aWxlQ29uZmlnID0gbnVsbDtcclxuICAgICAgdGFibGVDb25maWcucGFyZW50RGF0YSA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHM7XHJcbiAgICAgIHRhYmxlQ29uZmlnLmVsZXZhdGlvbiA9ICdub25lJztcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vVVJMXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcudGFibGVDb25maWcpIHtcclxuICAgICAgdHJhbnNmb3JtTG9hZFVybCh1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHVwZGF0ZWREZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlncykge1xyXG4gICAgICB1cGRhdGVkRGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZ3MuZm9yRWFjaCh0cmFuc2Zvcm1Mb2FkVXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodXBkYXRlZERldGFpbHNDb25maWcuc3RlcENvbmZpZz8ubG9hZEFjdGlvbikge1xyXG4gICAgICB0cmFuc2Zvcm1TdGVwVXJsKHVwZGF0ZWREZXRhaWxzQ29uZmlnLnN0ZXBDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUxvYWRVcmwodGFibGVDb25maWcpIHtcclxuICAgICAgaWYgKHRhYmxlQ29uZmlnLmxvYWRBY3Rpb24gJiYgdGFibGVDb25maWcubG9hZENyaXRlcmlhICYmIHRhYmxlQ29uZmlnLmxvYWRJREZpZWxkKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcubG9hZEFjdGlvbi51cmwgPSBgJHt0YWJsZUNvbmZpZy5sb2FkQWN0aW9uLnVybC5zcGxpdCgnLycpWzBdfS8ke3RhYmxlQ29uZmlnLmxvYWRDcml0ZXJpYX0vJHt1cGRhdGVkRGV0YWlsc0NvbmZpZy5kZXRhaWxzW3RhYmxlQ29uZmlnLmxvYWRJREZpZWxkXX1gO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIlRyYW5zZm9ybWVkXCIsIHRhYmxlQ29uZmlnLmxvYWRBY3Rpb24udXJsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIk5PVCBUcmFuc2Zvcm1lZFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVN0ZXBVcmwoc3RlcENvbmZpZykge1xyXG4gICAgICBpZiAoc3RlcENvbmZpZy5sb2FkQWN0aW9uICYmIHN0ZXBDb25maWcubG9hZElERmllbGQgKSB7XHJcbiAgICAgICAgLy8gbGV0IGhlcm9JZCA9IHVwZGF0ZWREZXRhaWxzQ29uZmlnLmRldGFpbHNbdXBkYXRlZERldGFpbHNDb25maWcuaGVyb0ZpZWxkXTtcclxuICAgICAgICBzdGVwQ29uZmlnLmxvYWRBY3Rpb24udXJsID0gYCR7c3RlcENvbmZpZy5sb2FkQWN0aW9uLnVybC5yZXBsYWNlKCd7aWR9JywgdXBkYXRlZERldGFpbHNDb25maWcuZGV0YWlsc1tzdGVwQ29uZmlnLmxvYWRJREZpZWxkXSl9YDtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYW5zZm9ybWVkIHN0ZXAgVVJMXCIsIHN0ZXBDb25maWcubG9hZEFjdGlvbi51cmwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICByZXR1cm4gdXBkYXRlZERldGFpbHNDb25maWc7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhdGljIGluaXRpYWxpemVDb25maWdzKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcpIHtcclxuICAgIGNvbnN0IHRhYmxlQ29uZmlnID0gZGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZztcclxuICAgIGNvbnN0IHRhYmxlQ29uZmlncyA9IGRldGFpbHNDb25maWcudGFibGVDb25maWdzO1xyXG4gICAgY29uc3QgZm9ybUNvbmZpZyA9IGRldGFpbHNDb25maWcuZm9ybUNvbmZpZztcclxuICAgIGNvbnN0IHN0ZXBDb25maWcgPSBkZXRhaWxzQ29uZmlnLnN0ZXBDb25maWc7XHJcbiAgICBjb25zdCBzdGF0dXNDb25maWcgPSBkZXRhaWxzQ29uZmlnLnN0YXR1c0NvbmZpZzsgXHJcbiAgICBjb25zdCBidXR0b25zID0gZGV0YWlsc0NvbmZpZy5idXR0b25zO1xyXG4gICAgZm9ybUNvbmZpZy5tb2RlID0gZm9ybUNvbmZpZy5tb2RlID8/IFwidmlld1wiO1xyXG4gICAgcmV0dXJuIHsgdGFibGVDb25maWcsIHRhYmxlQ29uZmlncywgZm9ybUNvbmZpZywgc3RlcENvbmZpZywgc3RhdHVzQ29uZmlnLCBidXR0b25zIH07XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0SGVyb1ZhbHVlKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcsIGRldGFpbHM6IGFueSkge1xyXG5cclxuXHJcbiAgICBpZiAoKGRldGFpbHNDb25maWcuZm9ybUNvbmZpZy5tb2RlID09IFwiY3JlYXRlXCIgICkgJiYgZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQgJiYgZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUpIHtcclxuICAgICAgZGV0YWlsc1tkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZF0gPSBkZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZTtcclxuXHJcbiAgICAgIC8vIEVuc3VyZSBoZXJvIHZhbHVlcyBhcmUgc2V0IGluIGZvcm0gY29uZmlnXHJcbiAgICAgIGRldGFpbHNDb25maWcuZm9ybUNvbmZpZy5oZXJvRmllbGQgPSBkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZDtcclxuICAgICAgZGV0YWlsc0NvbmZpZy5mb3JtQ29uZmlnLmhlcm9WYWx1ZSA9IGRldGFpbHNDb25maWcuaGVyb1ZhbHVlO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaGFuZGxlRm9ybU1vZGUoZGV0YWlsc0NvbmZpZzogRGV0YWlsc0RpYWxvZ0NvbmZpZywgZm9ybUNvbmZpZzogRm9ybUNvbmZpZywpIHtcclxuICAgIGxldCBkZXRhaWxzO1xyXG4gICAgbGV0IGFjdGlvbjtcclxuICAgIGxldCBsb2FkQnlBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm9ybUNvbmZpZy5tb2RlID09PSBcImNyZWF0ZVwiKSB7XHJcblxyXG4gICAgICBkZXRhaWxzID0gQ29yZS5nZW5lcmF0ZU9iamVjdChmb3JtQ29uZmlnLmZpZWxkcyk7XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHJlc3AgPSB0aGlzLmxvYWREZXRhaWxzRGF0YShkZXRhaWxzQ29uZmlnLCBmb3JtQ29uZmlnKTtcclxuICAgICAgZGV0YWlscyA9IHJlc3AuZGV0YWlscztcclxuXHJcbiAgICAgIGFjdGlvbiA9IHJlc3AuYWN0aW9uO1xyXG4gICAgICBsb2FkQnlBY3Rpb24gPSByZXNwLmxvYWRCeUFjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBkZXRhaWxzLCBsb2FkQnlBY3Rpb24sIGFjdGlvbiB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgbG9hZERldGFpbHNEYXRhKGRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcsIGZvcm1Db25maWc6IEZvcm1Db25maWcpIHtcclxuXHJcbiAgICBsZXQgZGV0YWlscztcclxuICAgIGxldCBhY3Rpb247XHJcbiAgICBsZXQgbG9hZEJ5QWN0aW9uID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8vQ2hvb3NlIHNvdXJjZVxyXG4gICAgaWYgKGRldGFpbHNDb25maWcuZGV0YWlsc1NvdXJjZSA9PSBEZXRhaWxzU291cmNlLlJvdykge1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXCJEYXRhIGZyb20gRGV0YWlscyAtIFJvdyBvcHRpb25cIilcclxuICAgICAgZGV0YWlscyA9IGRldGFpbHNDb25maWcuZGV0YWlscztcclxuXHJcbiAgICB9IGVsc2UgaWYgKGRldGFpbHNDb25maWcuZGV0YWlsc1NvdXJjZSA9PSBEZXRhaWxzU291cmNlLlVybCkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkRhdGEgZnJvbSBVcmwgb3B0aW9uXCIpXHJcbiAgICAgIGFjdGlvbiA9IHRoaXMubG9hZERldGFpbHNGcm9tVXJsKGRldGFpbHNDb25maWcsIGZvcm1Db25maWcpO1xyXG4gICAgICBsb2FkQnlBY3Rpb24gPSB0cnVlO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAvL25ldyBsb2dpY1xyXG4gICAgICBpZiAoZm9ybUNvbmZpZy5sb2FkQWN0aW9uKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGEgZnJvbSBVcmwgLSBHdWVzc2VkXCIpO1xyXG4gICAgICAgICAgYWN0aW9uID0gdGhpcy5sb2FkRGV0YWlsc0Zyb21VcmwoZGV0YWlsc0NvbmZpZywgZm9ybUNvbmZpZyk7XHJcbiAgICAgICAgICBsb2FkQnlBY3Rpb24gPSB0cnVlO1xyXG5cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRhdGEgZnJvbSBEZXRhaWxzIC0gR3Vlc3NlZFwiKTtcclxuICAgICAgICAgIGRldGFpbHMgPSBkZXRhaWxzQ29uZmlnLmRldGFpbHM7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgZGV0YWlscywgbG9hZEJ5QWN0aW9uLCBhY3Rpb24gfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGxvYWREZXRhaWxzRnJvbVVybChkZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnLCBmb3JtQ29uZmlnOiBGb3JtQ29uZmlnKSB7XHJcbiAgICBsZXQgYWN0aW9uIDogQWN0aW9uO1xyXG5cclxuICAgIGlmIChmb3JtQ29uZmlnLmxvYWRBY3Rpb24pIHtcclxuXHJcbiAgICAgIGlmIChkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZCAmJiBkZXRhaWxzQ29uZmlnLmRldGFpbHMpIHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEZXRhaWxzQ29uZmlnIEhlcm8gSUQgRmllbGQgXCIgKyBkZXRhaWxzQ29uZmlnLmhlcm9GaWVsZCk7XHJcbiAgICAgICAgYWN0aW9uID0geyB1cmw6IGAke2Zvcm1Db25maWcubG9hZEFjdGlvbi51cmx9LyR7ZGV0YWlsc0NvbmZpZy5kZXRhaWxzW2RldGFpbHNDb25maWcuaGVyb0ZpZWxkXX1gIH07XHJcblxyXG4gICAgICB9IGVsc2UgaWYgKGZvcm1Db25maWcuaGVyb0ZpZWxkICYmIGRldGFpbHNDb25maWcuZGV0YWlscykge1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIkZvcm1Db25maWcgSGVybyBJRCBGaWVsZCBcIiArIGZvcm1Db25maWcuaGVyb0ZpZWxkKTtcclxuICAgICAgICBhY3Rpb24gPSB7IHVybDogYCR7Zm9ybUNvbmZpZy5sb2FkQWN0aW9uLnVybH0vJHtkZXRhaWxzQ29uZmlnLmRldGFpbHNbZm9ybUNvbmZpZy5oZXJvRmllbGRdfWAgfTtcclxuXHJcbiAgICAgIH0gZWxzZSBpZiAoZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUpIHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEZWZpbmVkIEhlcm8gVmFsdWUgXCIgKyBkZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZSk7XHJcbiAgICAgICAgYWN0aW9uID0geyB1cmw6IGAke2Zvcm1Db25maWcubG9hZEFjdGlvbi51cmx9LyR7ZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWV9YCB9O1xyXG5cclxuICAgICAgfVxyXG4gICAgICBlbHNle1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidXJsIHNvdXJjZSBmYWlsZWQgOiBzZXR1cCBoZXJvIGZpZWxkIG9yIGhlcm8gdmFsdWVcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGFjdGlvbi5jYWNoZUR1cmF0aW9uTWludXRlcyA9IGZvcm1Db25maWcubG9hZEFjdGlvbi5jYWNoZUR1cmF0aW9uTWludXRlcyA/PyAwO1xyXG4gICAgICBhY3Rpb24uc2tpcENhY2hlID0gZm9ybUNvbmZpZy5sb2FkQWN0aW9uLnNraXBDYWNoZSA/PyBmYWxzZTtcclxuICAgICAgYWN0aW9uLnN1Y2Nlc3NNZXNzYWdlID0gZm9ybUNvbmZpZy5sb2FkQWN0aW9uLnN1Y2Nlc3NNZXNzYWdlID8/IG51bGw7XHJcblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiTm8gbG9hZCBhY3Rpb24gc2V0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhY3Rpb247XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0RmlsZUZpZWxkKGZvcm1Db25maWc6IEZvcm1Db25maWcpIHtcclxuICAgIHJldHVybiBmb3JtQ29uZmlnLmZpZWxkcy5maW5kKHggPT4geC50eXBlID09PSAnZmlsZScpO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0YXRpYyBzZXR1cEJ1dHRvbnMoYnV0dG9uczogYW55KSB7XHJcbiAgICBsZXQgZXh0cmFCdXR0b25zLCBjcmVhdGVCdXR0b24sIGVkaXRCdXR0b24sIGRlbGV0ZUJ1dHRvbjtcclxuXHJcbiAgICBpZiAoYnV0dG9ucykge1xyXG4gICAgICBleHRyYUJ1dHRvbnMgPSBidXR0b25zLmZpbHRlcih4ID0+IHgubmFtZSAhPT0gXCJjcmVhdGVcIiAmJiB4Lm5hbWUgIT09IFwiZWRpdFwiICYmIHgubmFtZSAhPT0gXCJkZWxldGVcIiAmJiB4Lm5hbWUgIT09IFwidmlld1wiICYmIHguaW5EaWFsb2cpO1xyXG4gICAgICBjcmVhdGVCdXR0b24gPSBidXR0b25zLmZpbmQoeCA9PiB4Lm5hbWUgPT09IFwiY3JlYXRlXCIpO1xyXG4gICAgICBlZGl0QnV0dG9uID0gYnV0dG9ucy5maW5kKHggPT4geC5uYW1lID09PSBcImVkaXRcIik7XHJcbiAgICAgIGRlbGV0ZUJ1dHRvbiA9IGJ1dHRvbnMuZmluZCh4ID0+IHgubmFtZSA9PT0gXCJkZWxldGVcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBleHRyYUJ1dHRvbnMsIGNyZWF0ZUJ1dHRvbiwgZWRpdEJ1dHRvbiwgZGVsZXRlQnV0dG9uIH07XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==