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,861 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { AppConfig, CapItem } from '../classes/Classes';
3
- import { BehaviorSubject, finalize, of, share, tap, timeout } from 'rxjs';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "./http.service";
6
- import * as i2 from "@angular/router";
7
- import * as i3 from "./auth.service";
8
- export class DataServiceLib {
9
- constructor(httpService, router, route, authService) {
10
- this.httpService = httpService;
11
- this.router = router;
12
- this.route = route;
13
- this.authService = authService;
14
- this.appConfig = new AppConfig();
15
- this.appConfigSource = new BehaviorSubject(this.appConfig);
16
- this.appConfigObserv = this.appConfigSource.asObservable();
17
- this.capHome = new CapItem;
18
- this.capAdmin = new CapItem;
19
- this.capUsers = new CapItem;
20
- this.capRoles = new CapItem;
21
- this.capLogs = new CapItem;
22
- this.capSettings = new CapItem;
23
- this.capMultitenant = new CapItem;
24
- this.capTenants = new CapItem;
25
- this.capMembership = new CapItem;
26
- this.capPlans = new CapItem;
27
- this.capGeneral = new CapItem;
28
- this.capCustomers = new CapItem;
29
- this.capInventory = new CapItem;
30
- this.capAccounts = new CapItem;
31
- this.capSuppliers = new CapItem;
32
- this.capTasks = new CapItem;
33
- this.capHR = new CapItem;
34
- this.capEmployees = new CapItem;
35
- this.capDepartments = new CapItem;
36
- this.capPositions = new CapItem;
37
- this.capGrades = new CapItem;
38
- this.capApprovals = new CapItem;
39
- this.capApprovalsConfig = new CapItem;
40
- this.capNotifications = new CapItem;
41
- this.capSelfApproval = new CapItem;
42
- this.capAppModels = new CapItem;
43
- this.capNotificationsConfig = new CapItem;
44
- this.tmpProfileuserName = "";
45
- this.isProcessing = false;
46
- //--------------------------Departmemts Form-------------------------
47
- this.departmentFormConfig = {
48
- security: { allow: [this.capDepartments] },
49
- title: 'Department',
50
- fields: [
51
- { name: 'name', type: 'text', required: true },
52
- ],
53
- loadAction: { url: 'departments/id' },
54
- heroField: 'departmentID',
55
- includeAudit: true,
56
- };
57
- this.editDepartmentButton = { name: 'edit', dialog: true, action: { url: 'departments?action=edit', method: 'post', successMessage: 'Edited Successfully' } };
58
- this.departmentDetailsConfig = {
59
- formConfig: this.departmentFormConfig,
60
- heroField: 'departmentID',
61
- buttons: [this.editDepartmentButton],
62
- };
63
- //--------------------------Positions Form-------------------------
64
- this.positionFormConfig = {
65
- security: { allow: [this.capPositions] },
66
- title: 'Position',
67
- fields: [
68
- { name: 'name', type: 'text', required: true },
69
- { name: 'description', type: 'text', },
70
- { name: 'departmentID', alias: 'Department', type: 'select', loadAction: { url: 'departments/list/x' }, detailsConfig: this.departmentDetailsConfig },
71
- ],
72
- loadAction: { url: 'positions/id' },
73
- heroField: 'positionID',
74
- includeAudit: true,
75
- };
76
- this.editPositionButton = { name: 'edit', dialog: true, action: { url: 'positions?action=edit', method: 'post', successMessage: 'Edited Successfully' } };
77
- this.positionDetailsConfig = {
78
- formConfig: this.positionFormConfig,
79
- heroField: 'positionID',
80
- buttons: [this.editPositionButton],
81
- };
82
- //--------------------------Employees-------------------------
83
- this.genders = [
84
- { name: 'Male', value: 1 },
85
- { name: 'Female', value: 2 }
86
- ];
87
- this.employeeFormConfig = {
88
- security: { allow: [this.capEmployees] },
89
- fields: [
90
- { name: 'nationalID', type: 'text', alias: 'National ID', required: true },
91
- { name: 'gender', alias: 'Gender', type: 'select', options: this.genders, required: true },
92
- { name: 'firstName', type: 'text', required: true },
93
- { name: 'lastName', type: 'text', required: true },
94
- { name: 'dateOfBirth', type: 'date', alias: 'Date of Birth', required: true },
95
- { name: 'employmentDate', type: 'date', alias: 'Employment Date', required: true },
96
- { name: 'departmentID', alias: 'Department', type: 'select', loadAction: { url: 'departments/list/x' }, detailsConfig: this.departmentDetailsConfig },
97
- { name: 'positionID', alias: 'Position', type: 'select', loadAction: { url: 'positions/list/x' }, masterField: 'departmentID', detailsConfig: this.positionDetailsConfig },
98
- { name: 'employmentStatus', alias: 'Employment Status', type: 'select', loadAction: { url: 'employees/list/employment-status' } },
99
- { name: 'activeStatus', alias: 'Active Status', type: 'select', loadAction: { url: 'employees/list/active-status' } },
100
- { name: 'passportNumber', type: 'text', alias: 'Passport Number' },
101
- { name: 'userName', type: 'select', alias: 'User', loadAction: { url: 'user/list/x' }, optionDisplay: 'name', optionValue: 'value', nullable: true, infoMessage: 'Related user account' },
102
- { name: 'address', type: 'text', rows: 2, span: true },
103
- { name: 'phone', type: 'text' },
104
- { name: 'email', type: 'text' },
105
- { name: 'note', type: 'text', rows: 2, span: true },
106
- ],
107
- loadAction: { url: 'employees/id' },
108
- heroField: 'employeeID',
109
- includeAudit: true,
110
- };
111
- this.employeesTableConfig = {
112
- showFilter: true,
113
- minColumns: ['name', 'departmentName', 'positionName'],
114
- flatButtons: true,
115
- logResponse: true,
116
- columns: [
117
- { name: 'name', type: 'text' },
118
- { name: 'genderName', type: 'text', alias: 'Gender' },
119
- { name: 'departmentName', type: 'text', alias: 'Department' },
120
- { name: 'positionName', type: 'text', alias: 'Position' },
121
- { name: 'employmentStatusName', type: 'text', alias: 'Employment Status' },
122
- { name: 'activeStatusName', type: 'text', alias: 'Active Status' },
123
- { name: 'isLinked', type: 'checkbox', alias: 'Linked' },
124
- ],
125
- buttons: [
126
- { name: 'create', display: 'Create', dialog: true, action: { url: 'employees?action=create', method: 'post' } },
127
- { name: 'view', dialog: true },
128
- { name: 'edit', dialog: true, action: { url: 'employees?action=edit', method: 'post' } },
129
- { name: 'delete', dialog: true, action: { url: 'employees?action=delete', method: 'post' } },
130
- ],
131
- loadAction: { url: 'employees/all/x' },
132
- formConfig: this.employeeFormConfig
133
- };
134
- //--------------------------Positions-------------------------
135
- this.positionsTableConfig = {
136
- showFilter: true,
137
- flatButtons: true,
138
- columns: [
139
- { name: 'name', type: 'text' },
140
- { name: 'description', type: 'text' },
141
- { name: 'departmentName', type: 'chip', detailsConfig: this.departmentDetailsConfig, alias: 'Department' },
142
- ],
143
- buttons: [
144
- { name: 'create', display: 'Create', dialog: true, action: { url: 'positions?action=create', method: 'post' } },
145
- {
146
- name: 'view',
147
- dialog: true,
148
- detailsConfig: {
149
- formConfig: this.positionFormConfig,
150
- heroField: 'positionID',
151
- buttons: [this.editPositionButton],
152
- tableConfigs: [
153
- {
154
- ...this.employeesTableConfig,
155
- loadAction: { url: 'employees/x/x' }, loadCriteria: 'position', loadIDField: 'positionID',
156
- columns: this.employeesTableConfig.columns.filter(x => ['departmentName', 'positionName'].includes(x.name) == false),
157
- tabTitle: 'Employees',
158
- elevation: 'none',
159
- }
160
- ],
161
- }
162
- },
163
- this.editPositionButton,
164
- { name: 'delete', dialog: true, action: { url: 'positions?action=delete', method: 'post' } },
165
- ],
166
- loadAction: { url: 'positions/all/x' },
167
- formConfig: this.positionFormConfig
168
- };
169
- //--------------------------Departments-------------------------
170
- this.departmentTableConfig = {
171
- showFilter: true,
172
- minColumns: ['name'],
173
- flatButtons: true,
174
- columns: [
175
- // { name: 'departmentID', type: 'number', alias: 'ID' },
176
- { name: 'name', type: 'text' },
177
- ],
178
- buttons: [
179
- { name: 'create', display: 'Create', dialog: true, action: { url: 'departments?action=create', method: 'post' } },
180
- {
181
- name: 'view',
182
- dialog: true,
183
- detailsConfig: {
184
- formConfig: this.departmentFormConfig,
185
- heroField: 'departmentID',
186
- buttons: [this.editDepartmentButton],
187
- tableConfigs: [
188
- {
189
- ...this.employeesTableConfig,
190
- loadAction: { url: 'employees/x/x' }, loadCriteria: 'department', loadIDField: 'departmentID',
191
- columns: this.employeesTableConfig.columns.filter(x => ['departmentName', 'positionName'].includes(x.name) == false),
192
- tabTitle: 'Employees',
193
- elevation: 'none',
194
- },
195
- {
196
- ...this.positionsTableConfig,
197
- loadAction: { url: 'positions/x/x' }, loadCriteria: 'department', loadIDField: 'departmentID',
198
- tabTitle: 'Positions',
199
- elevation: 'none',
200
- }
201
- ],
202
- }
203
- },
204
- this.editDepartmentButton,
205
- { name: 'delete', dialog: true, action: { url: 'departments?action=delete', method: 'post' } },
206
- ],
207
- loadAction: { url: 'departments/all/x' },
208
- formConfig: this.departmentFormConfig
209
- };
210
- //--------------------------Contact Persons-------------------------
211
- this.contactPersonFormConfig = {
212
- title: 'Contact Person',
213
- includeAudit: true,
214
- fields: [
215
- { name: 'name', type: 'text', span: true },
216
- { name: 'mobile', type: 'text' },
217
- { name: 'email', type: 'text' },
218
- { name: 'contactMethods', type: 'composite', span: true, subfields: [
219
- { name: 'canCall', type: 'checkbox', alias: 'Call' },
220
- { name: 'canSMS', type: 'checkbox', alias: 'SMS' },
221
- { name: 'canWhatsApp', type: 'checkbox', alias: 'WhatsApp' }
222
- ] },
223
- ],
224
- reset: true
225
- };
226
- this.contactPersonTableConfig = {
227
- tabTitle: 'Contacts',
228
- showFilter: true,
229
- minColumns: ['name', 'contactMethods'],
230
- elevation: 'none',
231
- flatButtons: true,
232
- columns: [
233
- { name: 'name', type: 'text', },
234
- { name: 'mobile', type: 'text' },
235
- { name: 'email', type: 'text' },
236
- {
237
- name: 'contactMethods',
238
- type: 'icon',
239
- icons: [
240
- { name: 'call', color: 'green', condition: x => x.canCall, tip: 'Available for Calls' },
241
- { name: 'sms', color: 'green', condition: x => x.canSMS, tip: 'Available for SMS' },
242
- { name: 'forum', color: 'green', condition: x => x.canWhatsApp, tip: 'Available on WhatsApp' }
243
- ]
244
- }
245
- ],
246
- buttons: [
247
- { name: 'create', display: 'Add', dialog: true, action: { url: 'contactpersons?action=create', method: 'post' }, confirm: { message: 'Add contact person?' } },
248
- { name: 'edit', dialog: true, action: { url: 'contactpersons?action=edit', method: 'post' } },
249
- { name: 'delete', dialog: true, action: { url: 'contactpersons?action=delete', method: 'post' } }
250
- ],
251
- formConfig: this.contactPersonFormConfig
252
- };
253
- //--------------------------Customers-------------------------
254
- this.customerFormConfig = {
255
- security: { allow: [this.capCustomers] },
256
- includeAudit: true,
257
- title: 'Customer',
258
- fields: [
259
- { name: 'name', type: 'text', required: true },
260
- { name: 'phone', type: 'text' },
261
- { name: 'contactPerson', type: 'text' },
262
- { name: 'email', type: 'text' },
263
- { name: 'address', type: 'text', rows: 2, span: true },
264
- { name: 'customerTenantID', alias: 'Customer Tenant', type: 'text', loadAction: { url: 'tenants/list/x' }, nullable: true },
265
- ],
266
- loadAction: { url: 'customers/id' },
267
- heroField: 'customerID',
268
- reset: true,
269
- };
270
- this.customerCreateButton = { name: 'create', display: 'Create', dialog: true, action: { url: 'customers?action=create', method: 'post' } };
271
- this.customerEditButton = { name: 'edit', dialog: true, action: { url: 'customers?action=edit', method: 'post' } };
272
- this.customerDetailsConfig = {
273
- formConfig: this.customerFormConfig,
274
- heroField: 'customerID',
275
- tableConfigs: [
276
- {
277
- ...this.contactPersonTableConfig,
278
- loadAction: { url: 'contactpersons/customer/x' },
279
- loadCriteria: 'customer',
280
- loadIDField: 'customerID'
281
- }
282
- ],
283
- buttons: [
284
- this.customerCreateButton,
285
- this.customerEditButton
286
- ]
287
- };
288
- this.customersTableConfig = {
289
- showFilter: true,
290
- minColumns: ['name'],
291
- flatButtons: true,
292
- logResponse: true,
293
- maxButtonsCount: 3,
294
- collapseButtons: true,
295
- columns: [
296
- { name: 'name', type: 'text' },
297
- { name: 'phone', type: 'text' },
298
- { name: 'contactPerson', type: 'text' },
299
- { name: 'isLinked', type: 'checkbox', alias: 'Linked' },
300
- ],
301
- buttons: [
302
- this.customerCreateButton,
303
- { name: 'view', dialog: true, detailsConfig: this.customerDetailsConfig },
304
- { name: 'edit', dialog: true, detailsConfig: this.customerDetailsConfig },
305
- { name: 'delete', dialog: true, action: { url: 'customers?action=delete', method: 'post' } },
306
- ],
307
- loadAction: { url: 'customers/all/x' },
308
- formConfig: this.customerFormConfig
309
- };
310
- //--------------------------Suppliers-------------------------
311
- this.supplierFormConfig = {
312
- security: { allow: [this.capSuppliers] },
313
- includeAudit: true,
314
- title: 'Supplier',
315
- fields: [
316
- { name: 'name', type: 'text', required: true },
317
- { name: 'phone', type: 'text' },
318
- { name: 'contactPerson', type: 'text' },
319
- { name: 'email', type: 'text' },
320
- { name: 'address', type: 'text', rows: 2, span: true },
321
- ],
322
- loadAction: { url: 'suppliers/id' },
323
- heroField: 'supplierID',
324
- };
325
- this.supplierCreateButton = { name: 'create', display: 'Create', dialog: true, action: { url: 'suppliers?action=create', method: 'post' } };
326
- this.supplierEditButton = { name: 'edit', dialog: true, action: { url: 'suppliers?action=edit', method: 'post' } };
327
- this.supplierDetailsConfig = {
328
- formConfig: this.supplierFormConfig,
329
- heroField: 'supplierID',
330
- tableConfigs: [
331
- {
332
- ...this.contactPersonTableConfig,
333
- loadAction: { url: 'contactpersons/supplier/x' },
334
- loadCriteria: 'supplier',
335
- loadIDField: 'supplierID'
336
- }
337
- ],
338
- buttons: [
339
- this.supplierCreateButton,
340
- this.supplierEditButton,
341
- ]
342
- };
343
- this.suppliersTableConfig = {
344
- showFilter: true,
345
- minColumns: ['name'],
346
- flatButtons: true,
347
- columns: [
348
- { name: 'name', type: 'text' },
349
- { name: 'phone', type: 'text' },
350
- { name: 'contactPerson', type: 'text' },
351
- ],
352
- buttons: [
353
- this.supplierCreateButton,
354
- { name: 'view', dialog: true, detailsConfig: this.supplierDetailsConfig },
355
- { name: 'edit', dialog: true, detailsConfig: this.supplierDetailsConfig },
356
- { name: 'delete', dialog: true, action: { url: 'suppliers?action=delete', method: 'post' } },
357
- ],
358
- loadAction: { url: 'suppliers/all/x' },
359
- formConfig: this.supplierFormConfig
360
- };
361
- //--------------------------Notifications-------------------------
362
- this.notificationOptions = [
363
- { name: 'UI Only', value: 1 },
364
- { name: 'UI + Email', value: 3 },
365
- // { name: 'UI + Email + SMS', value: 7 },
366
- { name: 'UI + WhatsApp', value: 9 },
367
- { name: 'UI + Telegram', value: 17 },
368
- { name: 'UI + Telegram + WhatsApp', value: 25 },
369
- { name: 'All Channels', value: 31 }
370
- ];
371
- //--------------------------Approvals-------------------------
372
- this.approvalHistoryFormConfig = {
373
- title: 'Approval History',
374
- fields: [
375
- { name: 'levelName', type: 'text', readonly: true, alias: 'Level' },
376
- { name: 'statusName', type: 'text', readonly: true, alias: 'Status' },
377
- { name: 'comments', type: 'text', readonly: true, span: true, rows: 3, copyContent: true },
378
- ],
379
- includeAudit: true
380
- };
381
- //Approval History
382
- this.approvalHistoryTableConfig = {
383
- tabTitle: 'Trail',
384
- elevation: 'none',
385
- minColumns: ['createdDate', 'levelName', 'statusName'],
386
- flatButtons: true,
387
- showFilter: true,
388
- columns: [
389
- { name: 'createdDate', type: 'datetime', alias: 'Date' },
390
- { name: 'levelName', type: 'text', alias: 'Level' },
391
- {
392
- name: 'statusName', type: 'text', alias: 'Status',
393
- colors: [
394
- { name: '#90A4AE', condition: x => x.status === 0 },
395
- { name: '#66BB6A', condition: x => x.status === 1 },
396
- { name: '#F44336', condition: x => x.status === 2 }
397
- ]
398
- },
399
- { name: 'comments', type: 'text', },
400
- { name: 'createdByName', type: 'text', alias: 'By' },
401
- ],
402
- buttons: [
403
- { name: 'view', dialog: true }
404
- ],
405
- formConfig: this.approvalHistoryFormConfig,
406
- loadAction: { url: 'approvalhistory/approval/x' },
407
- loadCriteria: 'approval',
408
- loadIDField: 'approvalID'
409
- };
410
- //approvals form
411
- this.approvalFormConfig = {
412
- title: 'Approval',
413
- fields: [
414
- { name: 'blank', type: 'blank', span: true },
415
- { name: 'statusName', type: 'label', alias: 'Status', span: true },
416
- { name: 'message', type: 'text', required: true, span: true, rows: 3 },
417
- ],
418
- loadAction: { url: 'approvals/id' },
419
- heroField: 'approvalID'
420
- };
421
- // approval action dialog
422
- this.approvalActionFormConfig = {
423
- title: 'Approval Action',
424
- fixedTitle: true,
425
- fields: [
426
- {
427
- name: 'comments', type: 'text', required: false, span: true, rows: 3,
428
- infoMessage: 'Enter your comments about this approval action. This will be visible in the approval history.'
429
- }
430
- ]
431
- };
432
- this.approveActionDetailsConfig = {
433
- formConfig: {
434
- ...this.approvalActionFormConfig,
435
- fields: [
436
- {
437
- name: 'comments', type: 'text', required: false, span: true, rows: 3,
438
- infoMessage: 'Enter your comments about this approval action. This will be visible in the approval history.'
439
- }
440
- ],
441
- },
442
- mode: 'edit',
443
- buttons: [
444
- { name: 'edit', display: 'Approve', color: 'green', action: { url: 'approve', method: 'post' } } //url preconfigured to be dynamic
445
- ]
446
- };
447
- this.declineActionDetailsConfig = {
448
- formConfig: { ...this.approvalActionFormConfig,
449
- fields: [
450
- {
451
- name: 'comments', type: 'text', required: true, span: true, rows: 3,
452
- infoMessage: 'Enter your comments about this approval action. This will be visible in the approval history.',
453
- hint: 'Decline comment is required !'
454
- }
455
- ],
456
- },
457
- mode: 'edit',
458
- buttons: [
459
- { name: 'edit', display: 'Decline', color: 'red', action: { url: 'decline', method: 'post' } } //url preconfigured to be dynamic
460
- ]
461
- };
462
- this.approveButton = {
463
- name: 'approve', tip: 'Approve Request', dialog: true, inDialog: true, icon: { name: 'done' }, color: 'green', detailsConfig: this.approveActionDetailsConfig, ignorePendingApproval: true,
464
- visible: x => x && x.canAction && (!x.isMyApprovalRequest || this.myRole[this.capSelfApproval.name]),
465
- };
466
- this.declineButton = {
467
- name: 'decline', tip: 'Decline Request', dialog: true, inDialog: true, icon: { name: 'close' }, color: 'red', detailsConfig: this.declineActionDetailsConfig, ignorePendingApproval: true,
468
- visible: x => x && x.canAction && (!x.isMyApprovalRequest || this.myRole[this.capSelfApproval.name]),
469
- };
470
- this.cancelButton = {
471
- name: 'cancel', tip: 'Cancel Approval', inDialog: true, icon: { name: 'cancel' }, color: 'red', action: { url: 'cancel', method: 'post', }, ignorePendingApproval: true,
472
- confirm: { message: 'Cancel approval request? This will revert changes and stop the approval process.' },
473
- visible: x => x && x.canCancel
474
- };
475
- this.approvalDetailsConfig = {
476
- formConfig: this.approvalFormConfig,
477
- heroField: 'approvalID',
478
- tableConfigs: [this.approvalHistoryTableConfig],
479
- stepConfig: {
480
- steps: [],
481
- loadAction: { url: `approvals/steps/{id}` },
482
- loadIDField: 'approvalID',
483
- valueField: 'currentLevel'
484
- },
485
- buttons: [
486
- this.approveButton,
487
- this.declineButton,
488
- this.cancelButton
489
- ]
490
- };
491
- this.viewApprovalButton = {
492
- name: 'info', tip: 'Approval Information', dialog: true, icon: { name: 'info', }, detailsConfig: this.approvalDetailsConfig, ignorePendingApproval: true,
493
- visible: x => x.canAction || x.canCancel
494
- };
495
- //received approvals
496
- this.receivedApprovalsTableConfig = {
497
- showFilter: true,
498
- minColumns: ['message', 'statusName'],
499
- minButtons: ['view', 'approve', 'decline'],
500
- flatButtons: true,
501
- greyOut: (x) => x.isGreyedOut,
502
- // logResponse: true,
503
- collapseButtons: true,
504
- columns: [
505
- { name: 'createdDate', type: 'datetime', alias: 'Date' },
506
- { name: 'createdByName', alias: 'Request By', type: 'text' },
507
- { name: 'message', type: 'text' },
508
- {
509
- name: 'typeName', alias: 'Type', type: 'chip',
510
- colors: [
511
- { name: '#66BB6A', condition: x => x.type === 0 },
512
- { name: 'orange', condition: x => x.type === 1 },
513
- { name: '#F44336', condition: x => x.type === 2 }
514
- ]
515
- },
516
- {
517
- name: 'statusName', alias: 'Status', type: 'chip', detailsConfig: this.approvalDetailsConfig,
518
- colors: [
519
- { name: '#90A4AE', condition: x => x.status === 0 },
520
- { name: '#66BB6A', condition: x => x.status === 1 },
521
- { name: '#F44336', condition: x => x.status === 2 }
522
- ]
523
- },
524
- {
525
- name: 'currentLevelName', type: 'text', alias: 'Current Level',
526
- icons: [
527
- { name: 'done', color: '#66BB6A', condition: x => x.status === 'Approved', tip: 'Approved' },
528
- { name: 'close', color: '#F44336', condition: x => x.status === 'Declined', tip: 'Declined' },
529
- { name: 'schedule', color: '#FFC107', condition: x => x.status === 'Pending', tip: 'Pending' }
530
- ]
531
- },
532
- { name: 'updatedByName', alias: 'Actioned By', type: 'text' },
533
- { name: 'updatedDateDisplay', type: 'datetime', alias: 'Actioned Date' },
534
- ],
535
- buttons: [
536
- this.viewApprovalButton,
537
- this.approveButton,
538
- this.declineButton,
539
- this.cancelButton,
540
- ],
541
- loadAction: { url: 'approvals/all/x' }
542
- };
543
- //send approvals
544
- this.sentApprovalsTableConfig = {
545
- ...this.receivedApprovalsTableConfig,
546
- buttons: [
547
- this.viewApprovalButton,
548
- this.cancelButton,
549
- ],
550
- loadAction: { url: 'approvals/sent/x' }
551
- };
552
- //---------------------------Other code
553
- this.listCache = {};
554
- this.cacheTimestamps = {};
555
- this.ongoingRequests = {};
556
- this.appConfig.appName = "App-Name";
557
- this.appConfig.logo = "./assets/logo.png";
558
- this.appConfig.ADAuth = true;
559
- this.appConfig.capItems = [this.capMultitenant, this.capAdmin, this.capHome];
560
- this.capHome.name = "cap1";
561
- this.capHome.display = "Home";
562
- this.capHome.link = "home";
563
- this.capHome.icon = "home";
564
- this.capAdmin.name = "cap2";
565
- this.capAdmin.display = "Admin";
566
- this.capAdmin.icon = "security";
567
- this.capAdmin.capSubItems = [this.capUsers, this.capRoles, this.capLogs, this.capSettings];
568
- this.capUsers.name = "cap3";
569
- this.capUsers.display = "Users";
570
- this.capUsers.link = "home/admin/users";
571
- this.capUsers.icon = "group";
572
- this.capRoles.name = "cap4";
573
- this.capRoles.display = "Roles";
574
- this.capRoles.link = "home/admin/roles";
575
- this.capRoles.icon = "work";
576
- this.capLogs.name = "cap5";
577
- this.capLogs.display = "Logs";
578
- this.capLogs.link = "home/admin/logs";
579
- this.capLogs.icon = "text_snippet";
580
- this.capSettings.name = "cap6";
581
- this.capSettings.display = "Settings";
582
- this.capSettings.link = "home/admin/settings";
583
- this.capSettings.icon = "settings";
584
- this.capMultitenant.name = "cap7";
585
- this.capMultitenant.display = "Multitenant";
586
- this.capMultitenant.icon = "apartment";
587
- this.capMultitenant.capSubItems = [this.capTenants, this.capMembership, this.capPlans];
588
- this.capTenants.name = "cap8";
589
- this.capTenants.display = "Tenants";
590
- this.capTenants.link = "home/admin/tenants";
591
- this.capMembership.name = "cap9";
592
- this.capMembership.display = "Membership";
593
- this.capMembership.link = "home/admin/membership";
594
- this.capPlans.name = "cap10";
595
- this.capPlans.display = "Plans";
596
- this.capPlans.link = "home/admin/plans";
597
- this.capGeneral.name = "cap11";
598
- this.capGeneral.display = "General";
599
- this.capGeneral.capSubItems = [this.capNotifications, this.capApprovals, this.capCustomers, this.capInventory, this.capAccounts, this.capSuppliers, this.capTasks];
600
- this.capCustomers.name = "cap12";
601
- this.capCustomers.display = "Customers";
602
- this.capCustomers.link = "home/admin/customers";
603
- this.capCustomers.icon = "group";
604
- this.capInventory.name = "cap13";
605
- this.capInventory.display = "Inventory";
606
- this.capInventory.link = "home/admin/inventory";
607
- this.capInventory.icon = "storefront";
608
- this.capAccounts.name = "cap14";
609
- this.capAccounts.display = "Accounts";
610
- this.capAccounts.link = "home/admin/accounts";
611
- this.capAccounts.icon = "account_balance_wallet";
612
- this.capSuppliers.name = "cap15";
613
- this.capSuppliers.display = "Suppliers";
614
- this.capSuppliers.link = "home/admin/suppliers";
615
- this.capSuppliers.icon = "groups";
616
- this.capTasks.name = "cap16";
617
- this.capTasks.display = "Tasks";
618
- this.capTasks.link = "home/admin/tasks";
619
- this.capTasks.icon = "check_box";
620
- this.capHR.name = "cap17";
621
- this.capHR.display = "HR";
622
- this.capHR.link = "home/admin/hr";
623
- this.capHR.icon = "diversity_3";
624
- this.capHR.capSubItems = [this.capDepartments, this.capPositions, this.capEmployees,];
625
- this.capEmployees.name = "cap18";
626
- this.capEmployees.display = "Employees";
627
- this.capEmployees.link = "home/admin/employees";
628
- this.capEmployees.icon = "group";
629
- this.capDepartments.name = "cap19";
630
- this.capDepartments.display = "Departments";
631
- this.capDepartments.link = "home/admin/departments";
632
- this.capDepartments.icon = "business_center";
633
- this.capPositions.name = "cap20";
634
- this.capPositions.display = "Positions";
635
- this.capPositions.link = "home/admin/positions";
636
- this.capPositions.icon = "picture_in_picture_medium";
637
- this.capApprovals.name = "cap21";
638
- this.capApprovals.display = "Approvals";
639
- this.capApprovals.link = "home/admin/approvals";
640
- this.capApprovals.icon = "rule";
641
- this.capApprovalsConfig.name = "cap22";
642
- this.capApprovalsConfig.display = "Approvals Config";
643
- this.capApprovalsConfig.link = "home/admin/approvals-config";
644
- this.capApprovalsConfig.icon = "published_with_changes";
645
- this.capApprovalsConfig.capSubItems = [this.capSelfApproval];
646
- this.capSelfApproval.name = "cap23";
647
- this.capSelfApproval.display = "Self Approvals";
648
- this.capSelfApproval.isBool = true;
649
- this.capNotifications.name = "cap24";
650
- this.capNotifications.display = "Notifications";
651
- this.capNotifications.link = "home/admin/notifications";
652
- this.capNotifications.icon = "notifications";
653
- this.capAppModels.name = "cap25";
654
- this.capAppModels.display = "App Models";
655
- this.capAppModels.link = "home/admin/appmodels";
656
- // this.capAppModels.icon = "notifications"
657
- this.capNotificationsConfig.name = "cap26";
658
- this.capNotificationsConfig.display = "Notif Config";
659
- this.capNotificationsConfig.link = "home/admin/notifications-config";
660
- this.authService.myRoleObserv.subscribe((role) => {
661
- this.myRole = role;
662
- });
663
- }
664
- UpdateAppConfig(config) {
665
- this.appConfigSource.next(config);
666
- this.appConfig = config;
667
- }
668
- CallApi(action, data = '') {
669
- if (!action?.url) {
670
- console.warn('Invalid action or missing URL');
671
- return of({ success: false, message: 'Invalid action configuration' });
672
- }
673
- console.log("calling", action);
674
- if (!action.method || action.method === 'get') {
675
- return this.handleCachedCall(action);
676
- }
677
- else if (action.method === 'post') {
678
- if (action.isFormData) {
679
- return this.httpService.Post_FormData(action.url, data);
680
- }
681
- else if (action.url === 'approve' || action.url === 'decline' || action.url === 'cancel') {
682
- return this.httpService.Post(`${data.endpoint}/approve?action=${action.url}`, data);
683
- }
684
- else {
685
- return this.httpService.Post(action.url, data);
686
- }
687
- }
688
- else {
689
- return this.httpService.Post(action.url, data);
690
- }
691
- }
692
- handleCachedCall(action) {
693
- const cacheKey = this.generateCacheKey(action.url);
694
- const currentTime = Date.now();
695
- // Check if we should use cache
696
- if (!action.skipCache && this.isCacheValid(cacheKey, action)) {
697
- console.log('Using cache:', cacheKey);
698
- return of({
699
- success: true,
700
- message: 'success',
701
- data: this.listCache[cacheKey]
702
- });
703
- }
704
- // Check if there's an ongoing request for the same URL
705
- if (this.ongoingRequests[cacheKey]) {
706
- console.log('Using ongoing request for:', cacheKey);
707
- return this.ongoingRequests[cacheKey];
708
- }
709
- // Determine cache duration
710
- const cacheDuration = this.getCacheDuration(action);
711
- // Only cache if duration is specified or it's a list endpoint
712
- if (cacheDuration > 0) {
713
- // Create and store the ongoing request
714
- this.ongoingRequests[cacheKey] = this.httpService.Get(action.url).pipe(timeout(60000), // 1 minute timeout for waiting requests
715
- tap((response) => {
716
- if (response.success && response?.data) {
717
- this.listCache[cacheKey] = response.data;
718
- this.cacheTimestamps[cacheKey] = currentTime;
719
- }
720
- }), finalize(() => {
721
- delete this.ongoingRequests[cacheKey];
722
- }), share());
723
- return this.ongoingRequests[cacheKey];
724
- }
725
- else {
726
- // No caching, just make the request
727
- console.log('No caching for:', cacheKey);
728
- return this.httpService.Get(action.url);
729
- }
730
- }
731
- generateCacheKey(url) {
732
- return url; // URL already includes query params
733
- }
734
- isCacheValid(cacheKey, action) {
735
- if (!this.listCache[cacheKey] || !this.cacheTimestamps[cacheKey]) {
736
- return false;
737
- }
738
- const cacheDuration = this.getCacheDuration(action);
739
- const currentTime = Date.now();
740
- const cacheAge = currentTime - this.cacheTimestamps[cacheKey];
741
- return cacheAge < (cacheDuration * 60 * 1000);
742
- }
743
- getCacheDuration(action) {
744
- // If explicitly specified in action, use that
745
- if (action.cacheDurationMinutes !== undefined) {
746
- return action.cacheDurationMinutes;
747
- }
748
- // Default to 1 minute for list endpoints
749
- if (action.url.includes('/list/')) {
750
- return 1;
751
- }
752
- // No caching by default
753
- return 0;
754
- }
755
- ClearCache() {
756
- this.listCache = {};
757
- this.cacheTimestamps = {};
758
- // Added: Clear ongoing requests as well
759
- Object.keys(this.ongoingRequests).forEach(key => {
760
- delete this.ongoingRequests[key];
761
- });
762
- }
763
- invalidateListCache(entityUrl) {
764
- Object.keys(this.listCache).forEach(key => {
765
- if (key.includes(entityUrl)) {
766
- delete this.listCache[key];
767
- delete this.cacheTimestamps[key];
768
- delete this.ongoingRequests[key];
769
- }
770
- });
771
- }
772
- CheckWelcomed(path = 'home/admin/welcome') {
773
- this.CallApi({ url: 'tenant/welcome/x' }).subscribe((x) => {
774
- if (!x.data) {
775
- this.Navigate(path);
776
- }
777
- });
778
- }
779
- Navigate(path) {
780
- this.router.navigate([path]);
781
- }
782
- NavigateWithValue(path, value) {
783
- this.router.navigate([path], {
784
- queryParams: { v: value },
785
- queryParamsHandling: 'merge',
786
- skipLocationChange: false
787
- });
788
- }
789
- GetNavigationValue() {
790
- if (this.route.snapshot.queryParams["v"] != undefined) {
791
- return this.route.snapshot.queryParams["v"];
792
- }
793
- else {
794
- return "";
795
- }
796
- }
797
- //Users
798
- GetUser() {
799
- return this.httpService.Get("User/all/x");
800
- }
801
- RegisterAccount(u) {
802
- return this.httpService.Post("User/register", u);
803
- }
804
- GetUserByID(val) {
805
- return this.httpService.Get(`User/id/${val}`);
806
- }
807
- UpdateUser(profile) {
808
- return this.httpService.Post("User/edit", profile);
809
- }
810
- UnlockUser(user) {
811
- return this.httpService.Post("User/unlock", user);
812
- }
813
- LockUser(user) {
814
- return this.httpService.Post("User/lock", user);
815
- }
816
- DeleteUser(user) {
817
- return this.httpService.Post("User/delete", user);
818
- }
819
- Login(u) {
820
- return this.httpService.Post("User/login", u);
821
- }
822
- ChangePassword(u) {
823
- return this.httpService.Post("User/changepassword-self", u);
824
- }
825
- ChangePasswordAdmin(u) {
826
- return this.httpService.Post("User/changepassword-admin", u);
827
- }
828
- SelfReset(u) {
829
- return this.httpService.Post("Basic/SelfReset", u);
830
- }
831
- //Roles
832
- PostRole(role, action) {
833
- return this.httpService.Post(`Role?action=${action}`, role);
834
- }
835
- PutRole(role) {
836
- return this.httpService.Put("Role", role);
837
- }
838
- GetRole(by, val) {
839
- return this.httpService.Get("Role/all/x");
840
- }
841
- //Logs
842
- GetLog(by, val) {
843
- return this.httpService.Get("Log/all/x");
844
- }
845
- //Settings
846
- GetSetting(by, val) {
847
- return this.httpService.Get("Setting/all/x");
848
- }
849
- UpdateSetting(setting, action) {
850
- return this.httpService.Post(`Setting?action=${action}`, setting);
851
- }
852
- }
853
- DataServiceLib.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DataServiceLib, deps: [{ token: i1.HttpService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.AuthService }], target: i0.ɵɵFactoryTarget.Injectable });
854
- DataServiceLib.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DataServiceLib, providedIn: 'root' });
855
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DataServiceLib, decorators: [{
856
- type: Injectable,
857
- args: [{
858
- providedIn: 'root'
859
- }]
860
- }], ctorParameters: function () { return [{ type: i1.HttpService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.AuthService }]; } });
861
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWxpYi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL3NlcnZpY2VzL2RhdGFsaWIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBdUIsU0FBUyxFQUFVLE9BQU8sRUFBZ0QsTUFBTSxvQkFBb0IsQ0FBQztBQUNuSSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBU3RGLE1BQU0sT0FBTyxjQUFjO0lBRXpCLFlBQW9CLFdBQXdCLEVBQVMsTUFBYyxFQUFVLEtBQXFCLEVBQVUsV0FBd0I7UUFBaEgsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQW9KcEksY0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDcEIsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkQsb0JBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBUTdELFlBQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQztRQUN0QixhQUFRLEdBQUcsSUFBSSxPQUFPLENBQUM7UUFDdkIsYUFBUSxHQUFHLElBQUksT0FBTyxDQUFDO1FBQ3ZCLGFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQztRQUN2QixZQUFPLEdBQUcsSUFBSSxPQUFPLENBQUM7UUFDdEIsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQztRQUUxQixtQkFBYyxHQUFHLElBQUksT0FBTyxDQUFDO1FBQzdCLGVB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OlsiXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aW9uLCBBcGlSZXNwb25zZSwgQXBwQ29uZmlnLCBCdXR0b24sIENhcEl0ZW0sIERldGFpbHNEaWFsb2dDb25maWcsIEZvcm1Db25maWcsIFRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vY2xhc3Nlcy9DbGFzc2VzJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaW5hbGl6ZSwgT2JzZXJ2YWJsZSwgb2YsIHNoYXJlLCB0YXAsIHRpbWVvdXQgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2UgfSBmcm9tICcuL2h0dHAuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vY2xhc3Nlcy9MaWJDbGFzc2VzJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhU2VydmljZUxpYiB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cFNlcnZpY2U6IEh0dHBTZXJ2aWNlLCBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSkge1xyXG5cclxuICAgIHRoaXMuYXBwQ29uZmlnLmFwcE5hbWUgPSBcIkFwcC1OYW1lXCI7XHJcbiAgICB0aGlzLmFwcENvbmZpZy5sb2dvID0gXCIuL2Fzc2V0cy9sb2dvLnBuZ1wiXHJcbiAgICB0aGlzLmFwcENvbmZpZy5BREF1dGggPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuYXBwQ29uZmlnLmNhcEl0ZW1zID0gW3RoaXMuY2FwTXVsdGl0ZW5hbnQsIHRoaXMuY2FwQWRtaW4sIHRoaXMuY2FwSG9tZV07XHJcblxyXG5cclxuICAgIHRoaXMuY2FwSG9tZS5uYW1lID0gXCJjYXAxXCI7XHJcbiAgICB0aGlzLmNhcEhvbWUuZGlzcGxheSA9IFwiSG9tZVwiO1xyXG4gICAgdGhpcy5jYXBIb21lLmxpbmsgPSBcImhvbWVcIjtcclxuICAgIHRoaXMuY2FwSG9tZS5pY29uID1cImhvbWVcIjtcclxuXHJcblxyXG4gICAgdGhpcy5jYXBBZG1pbi5uYW1lID0gXCJjYXAyXCI7XHJcbiAgICB0aGlzLmNhcEFkbWluLmRpc3BsYXkgPSBcIkFkbWluXCI7XHJcbiAgICB0aGlzLmNhcEFkbWluLmljb24gPSBcInNlY3VyaXR5XCJcclxuICAgIHRoaXMuY2FwQWRtaW4uY2FwU3ViSXRlbXMgPSBbdGhpcy5jYXBVc2VycywgdGhpcy5jYXBSb2xlcywgdGhpcy5jYXBMb2dzLCB0aGlzLmNhcFNldHRpbmdzXTtcclxuXHJcbiAgICB0aGlzLmNhcFVzZXJzLm5hbWUgPSBcImNhcDNcIjtcclxuICAgIHRoaXMuY2FwVXNlcnMuZGlzcGxheSA9IFwiVXNlcnNcIjtcclxuICAgIHRoaXMuY2FwVXNlcnMubGluayA9IFwiaG9tZS9hZG1pbi91c2Vyc1wiO1xyXG4gICAgdGhpcy5jYXBVc2Vycy5pY29uID0gXCJncm91cFwiO1xyXG5cclxuICAgIHRoaXMuY2FwUm9sZXMubmFtZSA9IFwiY2FwNFwiXHJcbiAgICB0aGlzLmNhcFJvbGVzLmRpc3BsYXkgPSBcIlJvbGVzXCI7XHJcbiAgICB0aGlzLmNhcFJvbGVzLmxpbmsgPSBcImhvbWUvYWRtaW4vcm9sZXNcIjtcclxuICAgIHRoaXMuY2FwUm9sZXMuaWNvbiA9IFwid29ya1wiO1xyXG5cclxuICAgIHRoaXMuY2FwTG9ncy5uYW1lID0gXCJjYXA1XCJcclxuICAgIHRoaXMuY2FwTG9ncy5kaXNwbGF5ID0gXCJMb2dzXCI7XHJcbiAgICB0aGlzLmNhcExvZ3MubGluayA9IFwiaG9tZS9hZG1pbi9sb2dzXCI7XHJcbiAgICB0aGlzLmNhcExvZ3MuaWNvbiA9IFwidGV4dF9zbmlwcGV0XCI7XHJcblxyXG4gICAgdGhpcy5jYXBTZXR0aW5ncy5uYW1lID0gXCJjYXA2XCJcclxuICAgIHRoaXMuY2FwU2V0dGluZ3MuZGlzcGxheSA9IFwiU2V0dGluZ3NcIjtcclxuICAgIHRoaXMuY2FwU2V0dGluZ3MubGluayA9IFwiaG9tZS9hZG1pbi9zZXR0aW5nc1wiO1xyXG4gICAgdGhpcy5jYXBTZXR0aW5ncy5pY29uID1cInNldHRpbmdzXCI7XHJcblxyXG5cclxuICAgIHRoaXMuY2FwTXVsdGl0ZW5hbnQubmFtZSA9IFwiY2FwN1wiXHJcbiAgICB0aGlzLmNhcE11bHRpdGVuYW50LmRpc3BsYXkgPSBcIk11bHRpdGVuYW50XCI7XHJcbiAgICB0aGlzLmNhcE11bHRpdGVuYW50Lmljb24gPSBcImFwYXJ0bWVudFwiXHJcbiAgICB0aGlzLmNhcE11bHRpdGVuYW50LmNhcFN1Ykl0ZW1zID0gW3RoaXMuY2FwVGVuYW50cywgdGhpcy5jYXBNZW1iZXJzaGlwLCB0aGlzLmNhcFBsYW5zIF07XHJcblxyXG4gICAgdGhpcy5jYXBUZW5hbnRzLm5hbWUgPSBcImNhcDhcIlxyXG4gICAgdGhpcy5jYXBUZW5hbnRzLmRpc3BsYXkgPSBcIlRlbmFudHNcIjtcclxuICAgIHRoaXMuY2FwVGVuYW50cy5saW5rID0gXCJob21lL2FkbWluL3RlbmFudHNcIjtcclxuXHJcbiAgICB0aGlzLmNhcE1lbWJlcnNoaXAubmFtZSA9IFwiY2FwOVwiXHJcbiAgICB0aGlzLmNhcE1lbWJlcnNoaXAuZGlzcGxheSA9IFwiTWVtYmVyc2hpcFwiO1xyXG4gICAgdGhpcy5jYXBNZW1iZXJzaGlwLmxpbmsgPSBcImhvbWUvYWRtaW4vbWVtYmVyc2hpcFwiO1xyXG5cclxuICAgIHRoaXMuY2FwUGxhbnMubmFtZSA9IFwiY2FwMTBcIlxyXG4gICAgdGhpcy5jYXBQbGFucy5kaXNwbGF5ID0gXCJQbGFuc1wiO1xyXG4gICAgdGhpcy5jYXBQbGFucy5saW5rID0gXCJob21lL2FkbWluL3BsYW5zXCI7XHJcblxyXG5cclxuICAgIHRoaXMuY2FwR2VuZXJhbC5uYW1lID0gXCJjYXAxMVwiXHJcbiAgICB0aGlzLmNhcEdlbmVyYWwuZGlzcGxheSA9IFwiR2VuZXJhbFwiO1xyXG4gICAgdGhpcy5jYXBHZW5lcmFsLmNhcFN1Ykl0ZW1zID0gW3RoaXMuY2FwTm90aWZpY2F0aW9ucyx0aGlzLmNhcEFwcHJvdmFscyx0aGlzLmNhcEN1c3RvbWVycywgdGhpcy5jYXBJbnZlbnRvcnksIHRoaXMuY2FwQWNjb3VudHMsIHRoaXMuY2FwU3VwcGxpZXJzLCB0aGlzLmNhcFRhc2tzXTtcclxuXHJcblxyXG5cclxuICAgIHRoaXMuY2FwQ3VzdG9tZXJzLm5hbWUgPSBcImNhcDEyXCJcclxuICAgIHRoaXMuY2FwQ3VzdG9tZXJzLmRpc3BsYXkgPSBcIkN1c3RvbWVyc1wiO1xyXG4gICAgdGhpcy5jYXBDdXN0b21lcnMubGluayA9IFwiaG9tZS9hZG1pbi9jdXN0b21lcnNcIjtcclxuICAgIHRoaXMuY2FwQ3VzdG9tZXJzLmljb24gPSBcImdyb3VwXCJcclxuXHJcbiAgICB0aGlzLmNhcEludmVudG9yeS5uYW1lID0gXCJjYXAxM1wiXHJcbiAgICB0aGlzLmNhcEludmVudG9yeS5kaXNwbGF5ID0gXCJJbnZlbnRvcnlcIjtcclxuICAgIHRoaXMuY2FwSW52ZW50b3J5LmxpbmsgPSBcImhvbWUvYWRtaW4vaW52ZW50b3J5XCI7XHJcbiAgICB0aGlzLmNhcEludmVudG9yeS5pY29uID0gXCJzdG9yZWZyb250XCJcclxuXHJcbiAgICB0aGlzLmNhcEFjY291bnRzLm5hbWUgPSBcImNhcDE0XCJcclxuICAgIHRoaXMuY2FwQWNjb3VudHMuZGlzcGxheSA9IFwiQWNjb3VudHNcIjtcclxuICAgIHRoaXMuY2FwQWNjb3VudHMubGluayA9IFwiaG9tZS9hZG1pbi9hY2NvdW50c1wiO1xyXG4gICAgdGhpcy5jYXBBY2NvdW50cy5pY29uID0gXCJhY2NvdW50X2JhbGFuY2Vfd2FsbGV0XCJcclxuXHJcbiAgICB0aGlzLmNhcFN1cHBsaWVycy5uYW1lID0gXCJjYXAxNVwiXHJcbiAgICB0aGlzLmNhcFN1cHBsaWVycy5kaXNwbGF5ID0gXCJTdXBwbGllcnNcIjtcclxuICAgIHRoaXMuY2FwU3VwcGxpZXJzLmxpbmsgPSBcImhvbWUvYWRtaW4vc3VwcGxpZXJzXCI7XHJcbiAgICB0aGlzLmNhcFN1cHBsaWVycy5pY29uID0gXCJncm91cHNcIlxyXG5cclxuICAgIHRoaXMuY2FwVGFza3MubmFtZSA9IFwiY2FwMTZcIlxyXG4gICAgdGhpcy5jYXBUYXNrcy5kaXNwbGF5ID0gXCJUYXNrc1wiO1xyXG4gICAgdGhpcy5jYXBUYXNrcy5saW5rID0gXCJob21lL2FkbWluL3Rhc2tzXCI7XHJcbiAgICB0aGlzLmNhcFRhc2tzLmljb24gPSBcImNoZWNrX2JveFwiXHJcblxyXG5cclxuICAgIHRoaXMuY2FwSFIubmFtZSA9IFwiY2FwMTdcIlxyXG4gICAgdGhpcy5jYXBIUi5kaXNwbGF5ID0gXCJIUlwiO1xyXG4gICAgdGhpcy5jYXBIUi5saW5rID0gXCJob21lL2FkbWluL2hyXCI7XHJcbiAgICB0aGlzLmNhcEhSLmljb24gPSBcImRpdmVyc2l0eV8zXCJcclxuICAgIHRoaXMuY2FwSFIuY2FwU3ViSXRlbXMgPSBbdGhpcy5jYXBEZXBhcnRtZW50cywgdGhpcy5jYXBQb3NpdGlvbnMsIHRoaXMuY2FwRW1wbG95ZWVzLF1cclxuXHJcbiAgICB0aGlzLmNhcEVtcGxveWVlcy5uYW1lID0gXCJjYXAxOFwiXHJcbiAgICB0aGlzLmNhcEVtcGxveWVlcy5kaXNwbGF5ID0gXCJFbXBsb3llZXNcIjtcclxuICAgIHRoaXMuY2FwRW1wbG95ZWVzLmxpbmsgPSBcImhvbWUvYWRtaW4vZW1wbG95ZWVzXCI7XHJcbiAgICB0aGlzLmNhcEVtcGxveWVlcy5pY29uID0gXCJncm91cFwiXHJcblxyXG4gICAgdGhpcy5jYXBEZXBhcnRtZW50cy5uYW1lID0gXCJjYXAxOVwiXHJcbiAgICB0aGlzLmNhcERlcGFydG1lbnRzLmRpc3BsYXkgPSBcIkRlcGFydG1lbnRzXCI7XHJcbiAgICB0aGlzLmNhcERlcGFydG1lbnRzLmxpbmsgPSBcImhvbWUvYWRtaW4vZGVwYXJ0bWVudHNcIjtcclxuICAgIHRoaXMuY2FwRGVwYXJ0bWVudHMuaWNvbiA9IFwiYnVzaW5lc3NfY2VudGVyXCJcclxuXHJcbiAgICB0aGlzLmNhcFBvc2l0aW9ucy5uYW1lID0gXCJjYXAyMFwiXHJcbiAgICB0aGlzLmNhcFBvc2l0aW9ucy5kaXNwbGF5ID0gXCJQb3NpdGlvbnNcIjtcclxuICAgIHRoaXMuY2FwUG9zaXRpb25zLmxpbmsgPSBcImhvbWUvYWRtaW4vcG9zaXRpb25zXCI7XHJcbiAgICB0aGlzLmNhcFBvc2l0aW9ucy5pY29uID0gXCJwaWN0dXJlX2luX3BpY3R1cmVfbWVkaXVtXCJcclxuXHJcbiAgICB0aGlzLmNhcEFwcHJvdmFscy5uYW1lID0gXCJjYXAyMVwiXHJcbiAgICB0aGlzLmNhcEFwcHJvdmFscy5kaXNwbGF5ID0gXCJBcHByb3ZhbHNcIjtcclxuICAgIHRoaXMuY2FwQXBwcm92YWxzLmxpbmsgPSBcImhvbWUvYWRtaW4vYXBwcm92YWxzXCI7XHJcbiAgICB0aGlzLmNhcEFwcHJvdmFscy5pY29uID0gXCJydWxlXCJcclxuXHJcbiAgICB0aGlzLmNhcEFwcHJvdmFsc0NvbmZpZy5uYW1lID0gXCJjYXAyMlwiXHJcbiAgICB0aGlzLmNhcEFwcHJvdmFsc0NvbmZpZy5kaXNwbGF5ID0gXCJBcHByb3ZhbHMgQ29uZmlnXCI7XHJcbiAgICB0aGlzLmNhcEFwcHJvdmFsc0NvbmZpZy5saW5rID0gXCJob21lL2FkbWluL2FwcHJvdmFscy1jb25maWdcIjtcclxuICAgIHRoaXMuY2FwQXBwcm92YWxzQ29uZmlnLmljb24gPSBcInB1Ymxpc2hlZF93aXRoX2NoYW5nZXNcIlxyXG4gICAgdGhpcy5jYXBBcHByb3ZhbHNDb25maWcuY2FwU3ViSXRlbXMgPSBbdGhpcy5jYXBTZWxmQXBwcm92YWxdXHJcblxyXG4gICAgdGhpcy5jYXBTZWxmQXBwcm92YWwubmFtZSA9IFwiY2FwMjNcIlxyXG4gICAgdGhpcy5jYXBTZWxmQXBwcm92YWwuZGlzcGxheSA9IFwiU2VsZiBBcHByb3ZhbHNcIjtcclxuICAgIHRoaXMuY2FwU2VsZkFwcHJvdmFsLmlzQm9vbCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5jYXBOb3RpZmljYXRpb25zLm5hbWUgPSBcImNhcDI0XCJcclxuICAgIHRoaXMuY2FwTm90aWZpY2F0aW9ucy5kaXNwbGF5ID0gXCJOb3RpZmljYXRpb25zXCI7XHJcbiAgICB0aGlzLmNhcE5vdGlmaWNhdGlvbnMubGluayA9IFwiaG9tZS9hZG1pbi9ub3RpZmljYXRpb25zXCI7XHJcbiAgICB0aGlzLmNhcE5vdGlmaWNhdGlvbnMuaWNvbiA9IFwibm90aWZpY2F0aW9uc1wiXHJcblxyXG4gICAgdGhpcy5jYXBBcHBNb2RlbHMubmFtZSA9IFwiY2FwMjVcIlxyXG4gICAgdGhpcy5jYXBBcHBNb2RlbHMuZGlzcGxheSA9IFwiQXBwIE1vZGVsc1wiO1xyXG4gICAgdGhpcy5jYXBBcHBNb2RlbHMubGluayA9IFwiaG9tZS9hZG1pbi9hcHBtb2RlbHNcIjtcclxuICAgIC8vIHRoaXMuY2FwQXBwTW9kZWxzLmljb24gPSBcIm5vdGlmaWNhdGlvbnNcIlxyXG5cclxuICAgIHRoaXMuY2FwTm90aWZpY2F0aW9uc0NvbmZpZy5uYW1lID0gXCJjYXAyNlwiXHJcbiAgICB0aGlzLmNhcE5vdGlmaWNhdGlvbnNDb25maWcuZGlzcGxheSA9IFwiTm90aWYgQ29uZmlnXCI7XHJcbiAgICB0aGlzLmNhcE5vdGlmaWNhdGlvbnNDb25maWcubGluayA9IFwiaG9tZS9hZG1pbi9ub3RpZmljYXRpb25zLWNvbmZpZ1wiO1xyXG5cclxuXHJcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLm15Um9sZU9ic2Vydi5zdWJzY3JpYmUoKHJvbGU6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLm15Um9sZSA9IHJvbGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBhcHBDb25maWcgPSBuZXcgQXBwQ29uZmlnKCk7XHJcbiAgcHJpdmF0ZSBhcHBDb25maWdTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuYXBwQ29uZmlnKTtcclxuICBwdWJsaWMgYXBwQ29uZmlnT2JzZXJ2ID0gdGhpcy5hcHBDb25maWdTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgVXBkYXRlQXBwQ29uZmlnKGNvbmZpZzogQXBwQ29uZmlnKSB7XHJcbiAgICB0aGlzLmFwcENvbmZpZ1NvdXJjZS5uZXh0KGNvbmZpZyk7XHJcbiAgICB0aGlzLmFwcENvbmZpZyA9IGNvbmZpZztcclxuICB9XHJcblxyXG4gIG15Um9sZTtcclxuXHJcbiAgY2FwSG9tZSA9IG5ldyBDYXBJdGVtO1xyXG4gIGNhcEFkbWluID0gbmV3IENhcEl0ZW07XHJcbiAgY2FwVXNlcnMgPSBuZXcgQ2FwSXRlbTtcclxuICBjYXBSb2xlcyA9IG5ldyBDYXBJdGVtO1xyXG4gIGNhcExvZ3MgPSBuZXcgQ2FwSXRlbTtcclxuICBjYXBTZXR0aW5ncyA9IG5ldyBDYXBJdGVtO1xyXG5cclxuICBjYXBNdWx0aXRlbmFudCA9IG5ldyBDYXBJdGVtO1xyXG4gIGNhcFRlbmFudHMgPSBuZXcgQ2FwSXRlbTtcclxuICBjYXBNZW1iZXJzaGlwID0gbmV3IENhcEl0ZW07XHJcbiAgY2FwUGxhbnMgPSBuZXcgQ2FwSXRlbTtcclxuXHJcbiAgY2FwR2VuZXJhbCA9IG5ldyBDYXBJdGVtO1xyXG4gIGNhcEN1c3RvbWVycyA9IG5ldyBDYXBJdGVtO1xyXG4gIGNhcEludmVudG9yeSA9IG5ldyBDYXBJdGVtO1xyXG4gIGNhcEFjY291bnRzID0gbmV3IENhcEl0ZW07XHJcbiAgY2FwU3VwcGxpZXJzID0gbmV3IENhcEl0ZW07XHJcbiAgY2FwVGFza3MgPSBuZXcgQ2FwSXRlbTtcclxuXHJcbiAgY2FwSFIgPSBuZXcgQ2FwSXRlbTtcclxuICBjYXBFbXBsb3llZXMgPSBuZXcgQ2FwSXRlbTtcclxuICBjYXBEZXBhcnRtZW50cyA9IG5ldyBDYXBJdGVtO1xyXG4gIGNhcFBvc2l0aW9ucyA9IG5ldyBDYXBJdGVtO1xyXG4gIGNhcEdyYWRlcyA9IG5ldyBDYXBJdGVtO1xyXG5cclxuICBjYXBBcHByb3ZhbHMgPSBuZXcgQ2FwSXRlbTtcclxuICBjYXBBcHByb3ZhbHNDb25maWcgPSBuZXcgQ2FwSXRlbTtcclxuICBjYXBOb3RpZmljYXRpb25zID0gbmV3IENhcEl0ZW07XHJcbiAgY2FwU2VsZkFwcHJvdmFsID0gbmV3IENhcEl0ZW07XHJcbiAgY2FwQXBwTW9kZWxzID0gbmV3IENhcEl0ZW07XHJcbiAgY2FwTm90aWZpY2F0aW9uc0NvbmZpZyA9IG5ldyBDYXBJdGVtO1xyXG5cclxuICBwdWJsaWMgdG1wUHJvZmlsZXVzZXJOYW1lID0gXCJcIjtcclxuXHJcblxyXG4gIGlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG5cclxuXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlcGFydG1lbXRzIEZvcm0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgZGVwYXJ0bWVudEZvcm1Db25maWc6IEZvcm1Db25maWcgPSB7XHJcbiAgICBzZWN1cml0eTogeyBhbGxvdzogW3RoaXMuY2FwRGVwYXJ0bWVudHNdIH0sXHJcbiAgICB0aXRsZSA6ICdEZXBhcnRtZW50JyxcclxuICAgIGZpZWxkczogW1xyXG4gICAgICB7IG5hbWU6ICduYW1lJywgdHlwZTogJ3RleHQnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgXSxcclxuICAgIGxvYWRBY3Rpb246IHsgdXJsOiAnZGVwYXJ0bWVudHMvaWQnIH0sXHJcbiAgICBoZXJvRmllbGQ6ICdkZXBhcnRtZW50SUQnLFxyXG4gICAgaW5jbHVkZUF1ZGl0OiB0cnVlLFxyXG4gIH1cclxuXHJcbiAgZWRpdERlcGFydG1lbnRCdXR0b246IEJ1dHRvbiA9IHsgbmFtZTogJ2VkaXQnLCBkaWFsb2c6IHRydWUsIGFjdGlvbjogeyB1cmw6ICdkZXBhcnRtZW50cz9hY3Rpb249ZWRpdCcsIG1ldGhvZDogJ3Bvc3QnLCBzdWNjZXNzTWVzc2FnZTogJ0VkaXRlZCBTdWNjZXNzZnVsbHknIH0gfVxyXG5cclxuICBkZXBhcnRtZW50RGV0YWlsc0NvbmZpZzogRGV0YWlsc0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgIGZvcm1Db25maWc6IHRoaXMuZGVwYXJ0bWVudEZvcm1Db25maWcsXHJcbiAgICBoZXJvRmllbGQ6ICdkZXBhcnRtZW50SUQnLFxyXG4gICAgYnV0dG9uczogW3RoaXMuZWRpdERlcGFydG1lbnRCdXR0b25dLFxyXG4gIH1cclxuXHJcblxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Qb3NpdGlvbnMgRm9ybS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBwb3NpdGlvbkZvcm1Db25maWc6IEZvcm1Db25maWcgPSB7XHJcbiAgICBzZWN1cml0eTogeyBhbGxvdzogW3RoaXMuY2FwUG9zaXRpb25zXSB9LFxyXG4gICAgdGl0bGU6ICdQb3NpdGlvbicsXHJcbiAgICBmaWVsZHM6IFtcclxuICAgICAgeyBuYW1lOiAnbmFtZScsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IHRydWUgfSxcclxuICAgICAgeyBuYW1lOiAnZGVzY3JpcHRpb24nLCB0eXBlOiAndGV4dCcsIH0sXHJcbiAgICAgIHsgbmFtZTogJ2RlcGFydG1lbnRJRCcsIGFsaWFzOiAnRGVwYXJ0bWVudCcsIHR5cGU6ICdzZWxlY3QnLCBsb2FkQWN0aW9uOiB7IHVybDogJ2RlcGFydG1lbnRzL2xpc3QveCcgfSwgZGV0YWlsc0NvbmZpZzogdGhpcy5kZXBhcnRtZW50RGV0YWlsc0NvbmZpZyB9LFxyXG5cclxuICAgIF0sXHJcbiAgICBsb2FkQWN0aW9uOiB7IHVybDogJ3Bvc2l0aW9ucy9pZCcgfSxcclxuICAgIGhlcm9GaWVsZDogJ3Bvc2l0aW9uSUQnLFxyXG4gICAgaW5jbHVkZUF1ZGl0OiB0cnVlLFxyXG4gIH1cclxuXHJcbiAgZWRpdFBvc2l0aW9uQnV0dG9uOiBCdXR0b24gPSB7IG5hbWU6ICdlZGl0JywgZGlhbG9nOiB0cnVlLCBhY3Rpb246IHsgdXJsOiAncG9zaXRpb25zP2FjdGlvbj1lZGl0JywgbWV0aG9kOiAncG9zdCcsIHN1Y2Nlc3NNZXNzYWdlOiAnRWRpdGVkIFN1Y2Nlc3NmdWxseScgfSB9XHJcblxyXG4gIHBvc2l0aW9uRGV0YWlsc0NvbmZpZyA6IERldGFpbHNEaWFsb2dDb25maWcgPSB7XHJcbiAgICBmb3JtQ29uZmlnIDogdGhpcy5wb3NpdGlvbkZvcm1Db25maWcsXHJcbiAgICBoZXJvRmllbGQgOiAncG9zaXRpb25JRCcsXHJcbiAgICBidXR0b25zOiBbdGhpcy5lZGl0UG9zaXRpb25CdXR0b25dLFxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRW1wbG95ZWVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBnZW5kZXJzID0gW1xyXG4gICAgeyBuYW1lOiAnTWFsZScsIHZhbHVlOiAxIH0sXHJcbiAgICB7IG5hbWU6ICdGZW1hbGUnLCB2YWx1ZTogMiB9XHJcbiAgXVxyXG5cclxuICBlbXBsb3llZUZvcm1Db25maWc6IEZvcm1Db25maWcgPSB7XHJcbiAgICBzZWN1cml0eSA6IHthbGxvdyA6IFt0aGlzLmNhcEVtcGxveWVlc119LFxyXG4gICAgZmllbGRzOiBbXHJcbiAgICAgIHsgbmFtZTogJ25hdGlvbmFsSUQnLCB0eXBlOiAndGV4dCcsIGFsaWFzOiAnTmF0aW9uYWwgSUQnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgICB7IG5hbWU6ICdnZW5kZXInLCBhbGlhczogJ0dlbmRlcicsIHR5cGU6ICdzZWxlY3QnLCBvcHRpb25zOiB0aGlzLmdlbmRlcnMsIHJlcXVpcmVkOiB0cnVlIH0sXHJcbiAgICAgIHsgbmFtZTogJ2ZpcnN0TmFtZScsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IHRydWUgfSxcclxuICAgICAgeyBuYW1lOiAnbGFzdE5hbWUnLCB0eXBlOiAndGV4dCcsIHJlcXVpcmVkOiB0cnVlIH0sXHJcbiAgICAgIHsgbmFtZTogJ2RhdGVPZkJpcnRoJywgdHlwZTogJ2RhdGUnLCBhbGlhczogJ0RhdGUgb2YgQmlydGgnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgICB7IG5hbWU6ICdlbXBsb3ltZW50RGF0ZScsIHR5cGU6ICdkYXRlJywgYWxpYXM6ICdFbXBsb3ltZW50IERhdGUnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgICB7IG5hbWU6ICdkZXBhcnRtZW50SUQnLCBhbGlhczogJ0RlcGFydG1lbnQnLCB0eXBlOiAnc2VsZWN0JywgbG9hZEFjdGlvbiA6IHsgdXJsIDogJ2RlcGFydG1lbnRzL2xpc3QveCd9LCBkZXRhaWxzQ29uZmlnOiB0aGlzLmRlcGFydG1lbnREZXRhaWxzQ29uZmlnIH0sXHJcbiAgICAgIHsgbmFtZTogJ3Bvc2l0aW9uSUQnLCBhbGlhczogJ1Bvc2l0aW9uJywgdHlwZTogJ3NlbGVjdCcsIGxvYWRBY3Rpb246IHsgdXJsOiAncG9zaXRpb25zL2xpc3QveCcgfSwgbWFzdGVyRmllbGQ6ICdkZXBhcnRtZW50SUQnLCBkZXRhaWxzQ29uZmlnOiB0aGlzLnBvc2l0aW9uRGV0YWlsc0NvbmZpZyB9LFxyXG4gICAgICB7IG5hbWU6ICdlbXBsb3ltZW50U3RhdHVzJywgYWxpYXM6ICdFbXBsb3ltZW50IFN0YXR1cycsIHR5cGU6ICdzZWxlY3QnLCBsb2FkQWN0aW9uOiB7IHVybDogJ2VtcGxveWVlcy9saXN0L2VtcGxveW1lbnQtc3RhdHVzJyB9IH0sXHJcbiAgICAgIHsgbmFtZTogJ2FjdGl2ZVN0YXR1cycsIGFsaWFzOiAnQWN0aXZlIFN0YXR1cycsIHR5cGU6ICdzZWxlY3QnLCBsb2FkQWN0aW9uOiB7IHVybDogJ2VtcGxveWVlcy9saXN0L2FjdGl2ZS1zdGF0dXMnIH0gfSxcclxuICAgICAgeyBuYW1lOiAncGFzc3BvcnROdW1iZXInLCB0eXBlOiAndGV4dCcsIGFsaWFzOiAnUGFzc3BvcnQgTnVtYmVyJyB9LFxyXG4gICAgICB7IG5hbWU6ICd1c2VyTmFtZScsIHR5cGU6ICdzZWxlY3QnLCBhbGlhczogJ1VzZXInLCBsb2FkQWN0aW9uOiB7IHVybDogJ3VzZXIvbGlzdC94JyB9LCBvcHRpb25EaXNwbGF5OiAnbmFtZScsIG9wdGlvblZhbHVlOiAndmFsdWUnLCBudWxsYWJsZSA6IHRydWUsIGluZm9NZXNzYWdlIDogJ1JlbGF0ZWQgdXNlciBhY2NvdW50JyB9LFxyXG4gICAgICB7IG5hbWU6ICdhZGRyZXNzJywgdHlwZTogJ3RleHQnLCByb3dzOiAyLCBzcGFuOiB0cnVlIH0sXHJcbiAgICAgIHsgbmFtZTogJ3Bob25lJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ25vdGUnLCB0eXBlOiAndGV4dCcsIHJvd3M6IDIsIHNwYW46IHRydWUgfSxcclxuICAgIF0sXHJcbiAgICBsb2FkQWN0aW9uOiB7IHVybDogJ2VtcGxveWVlcy9pZCcgfSxcclxuICAgIGhlcm9GaWVsZDogJ2VtcGxveWVlSUQnLFxyXG4gICAgaW5jbHVkZUF1ZGl0IDogdHJ1ZSxcclxuICB9XHJcblxyXG4gIGVtcGxveWVlc1RhYmxlQ29uZmlnOiBUYWJsZUNvbmZpZyA9IHtcclxuICAgIHNob3dGaWx0ZXI6IHRydWUsXHJcbiAgICBtaW5Db2x1bW5zOiBbJ25hbWUnLCAnZGVwYXJ0bWVudE5hbWUnLCAncG9zaXRpb25OYW1lJ10sXHJcbiAgICBmbGF0QnV0dG9uczogdHJ1ZSxcclxuICAgIGxvZ1Jlc3BvbnNlIDogdHJ1ZSxcclxuICAgIGNvbHVtbnM6IFtcclxuICAgICAgeyBuYW1lOiAnbmFtZScsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7IG5hbWU6ICdnZW5kZXJOYW1lJywgdHlwZTogJ3RleHQnLCBhbGlhczogJ0dlbmRlcicgfSxcclxuICAgICAgeyBuYW1lOiAnZGVwYXJ0bWVudE5hbWUnLCB0eXBlOiAndGV4dCcsIGFsaWFzOiAnRGVwYXJ0bWVudCcgfSxcclxuICAgICAgeyBuYW1lOiAncG9zaXRpb25OYW1lJywgdHlwZTogJ3RleHQnLCBhbGlhczogJ1Bvc2l0aW9uJyB9LFxyXG4gICAgICB7IG5hbWU6ICdlbXBsb3ltZW50U3RhdHVzTmFtZScsIHR5cGU6ICd0ZXh0JywgYWxpYXM6ICdFbXBsb3ltZW50IFN0YXR1cycgfSxcclxuICAgICAgeyBuYW1lOiAnYWN0aXZlU3RhdHVzTmFtZScsIHR5cGU6ICd0ZXh0JywgYWxpYXM6ICdBY3RpdmUgU3RhdHVzJyB9LFxyXG4gICAgICB7IG5hbWU6ICdpc0xpbmtlZCcsIHR5cGU6ICdjaGVja2JveCcsIGFsaWFzOiAnTGlua2VkJyB9LFxyXG4gICAgXSxcclxuICAgIGJ1dHRvbnM6IFtcclxuICAgICAgeyBuYW1lOiAnY3JlYXRlJywgZGlzcGxheTogJ0NyZWF0ZScsIGRpYWxvZzogdHJ1ZSwgYWN0aW9uOiB7IHVybDogJ2VtcGxveWVlcz9hY3Rpb249Y3JlYXRlJywgbWV0aG9kOiAncG9zdCcgfSB9LFxyXG4gICAgICB7IG5hbWU6ICd2aWV3JywgZGlhbG9nOiB0cnVlIH0sXHJcbiAgICAgIHsgbmFtZTogJ2VkaXQnLCBkaWFsb2c6IHRydWUsIGFjdGlvbjogeyB1cmw6ICdlbXBsb3llZXM/YWN0aW9uPWVkaXQnLCBtZXRob2Q6ICdwb3N0JyB9IH0sXHJcbiAgICAgIHsgbmFtZTogJ2RlbGV0ZScsIGRpYWxvZzogdHJ1ZSwgYWN0aW9uOiB7IHVybDogJ2VtcGxveWVlcz9hY3Rpb249ZGVsZXRlJywgbWV0aG9kOiAncG9zdCcgfSB9LFxyXG4gICAgXSxcclxuICAgIGxvYWRBY3Rpb246IHsgdXJsOiAnZW1wbG95ZWVzL2FsbC94JyB9LFxyXG4gICAgZm9ybUNvbmZpZzogdGhpcy5lbXBsb3llZUZvcm1Db25maWdcclxuICB9XHJcblxyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUG9zaXRpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIHBvc2l0aW9uc1RhYmxlQ29uZmlnOiBUYWJsZUNvbmZpZyA9IHtcclxuICAgIHNob3dGaWx0ZXI6IHRydWUsXHJcbiAgICBmbGF0QnV0dG9uczogdHJ1ZSxcclxuICAgIGNvbHVtbnM6IFtcclxuICAgICAgeyBuYW1lOiAnbmFtZScsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7IG5hbWU6ICdkZXNjcmlwdGlvbicsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7IG5hbWU6ICdkZXBhcnRtZW50TmFtZScsIHR5cGU6ICdjaGlwJywgZGV0YWlsc0NvbmZpZzogdGhpcy5kZXBhcnRtZW50RGV0YWlsc0NvbmZpZywgYWxpYXM6ICdEZXBhcnRtZW50JyB9LFxyXG4gICAgXSxcclxuICAgIGJ1dHRvbnM6IFtcclxuICAgICAgeyBuYW1lOiAnY3JlYXRlJywgZGlzcGxheTogJ0NyZWF0ZScsIGRpYWxvZzogdHJ1ZSwgYWN0aW9uOiB7IHVybDogJ3Bvc2l0aW9ucz9hY3Rpb249Y3JlYXRlJywgbWV0aG9kOiAncG9zdCcgfSB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ3ZpZXcnLFxyXG4gICAgICAgIGRpYWxvZzogdHJ1ZSxcclxuICAgICAgICBkZXRhaWxzQ29uZmlnOiB7XHJcbiAgICAgICAgICBmb3JtQ29uZmlnOiB0aGlzLnBvc2l0aW9uRm9ybUNvbmZpZyAsXHJcbiAgICAgICAgICBoZXJvRmllbGQ6ICdwb3NpdGlvbklEJyxcclxuICAgICAgICAgIGJ1dHRvbnM6IFt0aGlzLmVkaXRQb3NpdGlvbkJ1dHRvbl0sXHJcbiAgICAgICAgICB0YWJsZUNvbmZpZ3M6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC4uLnRoaXMuZW1wbG95ZWVzVGFibGVDb25maWcsXHJcbiAgICAgICAgICAgICAgbG9hZEFjdGlvbjogeyB1cmw6ICdlbXBsb3llZXMveC94JyB9LCBsb2FkQ3JpdGVyaWE6ICdwb3NpdGlvbicsIGxvYWRJREZpZWxkOiAncG9zaXRpb25JRCcsXHJcbiAgICAgICAgICAgICAgY29sdW1uczogdGhpcy5lbXBsb3llZXNUYWJsZUNvbmZpZy5jb2x1bW5zLmZpbHRlcih4ID0+IFsnZGVwYXJ0bWVudE5hbWUnLCAncG9zaXRpb25OYW1lJ10uaW5jbHVkZXMoeC5uYW1lKSA9PSBmYWxzZSksXHJcbiAgICAgICAgICAgICAgdGFiVGl0bGU6ICdFbXBsb3llZXMnLFxyXG4gICAgICAgICAgICAgIGVsZXZhdGlvbjogJ25vbmUnLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgdGhpcy5lZGl0UG9zaXRpb25CdXR0b24sXHJcbiAgICAgIHsgbmFtZTogJ2RlbGV0ZScsIGRpYWxvZzogdHJ1ZSwgYWN0aW9uOiB7IHVybDogJ3Bvc2l0aW9ucz9hY3Rpb249ZGVsZXRlJywgbWV0aG9kOiAncG9zdCcgfSB9LFxyXG4gICAgXSxcclxuICAgIGxvYWRBY3Rpb246IHsgdXJsOiAncG9zaXRpb25zL2FsbC94JyB9LFxyXG4gICAgZm9ybUNvbmZpZzogdGhpcy5wb3NpdGlvbkZvcm1Db25maWdcclxuICB9XHJcblxyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVwYXJ0bWVudHMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIGRlcGFydG1lbnRUYWJsZUNvbmZpZzogVGFibGVDb25maWcgPSB7XHJcbiAgICBzaG93RmlsdGVyOiB0cnVlLFxyXG4gICAgbWluQ29sdW1uczogWyduYW1lJ10sXHJcbiAgICBmbGF0QnV0dG9uczogdHJ1ZSxcclxuICAgIGNvbHVtbnM6IFtcclxuICAgICAgLy8geyBuYW1lOiAnZGVwYXJ0bWVudElEJywgdHlwZTogJ251bWJlcicsIGFsaWFzOiAnSUQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ25hbWUnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgIF0sXHJcbiAgICBidXR0b25zOiBbXHJcbiAgICAgIHsgbmFtZTogJ2NyZWF0ZScsIGRpc3BsYXk6ICdDcmVhdGUnLCBkaWFsb2c6IHRydWUsIGFjdGlvbjogeyB1cmw6ICdkZXBhcnRtZW50cz9hY3Rpb249Y3JlYXRlJywgbWV0aG9kOiAncG9zdCcgfSB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ3ZpZXcnLFxyXG4gICAgICAgIGRpYWxvZzogdHJ1ZSxcclxuICAgICAgICBkZXRhaWxzQ29uZmlnOiB7XHJcbiAgICAgICAgICBmb3JtQ29uZmlnOiB0aGlzLmRlcGFydG1lbnRGb3JtQ29uZmlnLFxyXG4gICAgICAgICAgaGVyb0ZpZWxkOiAnZGVwYXJ0bWVudElEJyxcclxuICAgICAgICAgIGJ1dHRvbnM6IFt0aGlzLmVkaXREZXBhcnRtZW50QnV0dG9uXSxcclxuICAgICAgICAgIHRhYmxlQ29uZmlnczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5lbXBsb3llZXNUYWJsZUNvbmZpZyxcclxuICAgICAgICAgICAgICBsb2FkQWN0aW9uOiB7IHVybDogJ2VtcGxveWVlcy94L3gnIH0sIGxvYWRDcml0ZXJpYTogJ2RlcGFydG1lbnQnLCBsb2FkSURGaWVsZDogJ2RlcGFydG1lbnRJRCcsXHJcbiAgICAgICAgICAgICAgY29sdW1uczogdGhpcy5lbXBsb3llZXNUYWJsZUNvbmZpZy5jb2x1bW5zLmZpbHRlcih4ID0+IFsnZGVwYXJ0bWVudE5hbWUnLCAncG9zaXRpb25OYW1lJ10uaW5jbHVkZXMoeC5uYW1lKSA9PSBmYWxzZSksXHJcbiAgICAgICAgICAgICAgdGFiVGl0bGU6ICdFbXBsb3llZXMnLFxyXG4gICAgICAgICAgICAgIGVsZXZhdGlvbjogJ25vbmUnLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLi4udGhpcy5wb3NpdGlvbnNUYWJsZUNvbmZpZyxcclxuICAgICAgICAgICAgICBsb2FkQWN0aW9uOiB7IHVybDogJ3Bvc2l0aW9ucy94L3gnIH0sIGxvYWRDcml0ZXJpYTogJ2RlcGFydG1lbnQnLCBsb2FkSURGaWVsZDogJ2RlcGFydG1lbnRJRCcsXHJcbiAgICAgICAgICAgICAgdGFiVGl0bGU6ICdQb3NpdGlvbnMnLFxyXG4gICAgICAgICAgICAgIGVsZXZhdGlvbjogJ25vbmUnLFxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHRoaXMuZWRpdERlcGFydG1lbnRCdXR0b24sXHJcbiAgICAgIHsgbmFtZTogJ2RlbGV0ZScsIGRpYWxvZzogdHJ1ZSwgYWN0aW9uOiB7IHVybDogJ2RlcGFydG1lbnRzP2FjdGlvbj1kZWxldGUnLCBtZXRob2Q6ICdwb3N0JyB9IH0sXHJcbiAgICBdLFxyXG4gICAgbG9hZEFjdGlvbjogeyB1cmw6ICdkZXBhcnRtZW50cy9hbGwveCcgfSxcclxuICAgIGZvcm1Db25maWc6IHRoaXMuZGVwYXJ0bWVudEZvcm1Db25maWdcclxuICB9XHJcblxyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQ29udGFjdCBQZXJzb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIGNvbnRhY3RQZXJzb25Gb3JtQ29uZmlnOiBGb3JtQ29uZmlnID0ge1xyXG4gICAgdGl0bGU6ICdDb250YWN0IFBlcnNvbicsXHJcbiAgICBpbmNsdWRlQXVkaXQ6IHRydWUsXHJcbiAgICBmaWVsZHM6IFtcclxuICAgICAgeyBuYW1lOiAnbmFtZScsIHR5cGU6ICd0ZXh0Jywgc3BhbiA6IHRydWUgfSxcclxuICAgICAgeyBuYW1lOiAnbW9iaWxlJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2NvbnRhY3RNZXRob2RzJywgdHlwZTogJ2NvbXBvc2l0ZScsIHNwYW46IHRydWUsIHN1YmZpZWxkcyA6W1xyXG4gICAgICAgIHsgbmFtZTogJ2NhbkNhbGwnLCB0eXBlOiAnY2hlY2tib3gnLCBhbGlhczogJ0NhbGwnIH0sXHJcbiAgICAgICAgeyBuYW1lOiAnY2FuU01TJywgdHlwZTogJ2NoZWNrYm94JywgYWxpYXM6ICdTTVMnIH0sXHJcbiAgICAgICAgeyBuYW1lOiAnY2FuV2hhdHNBcHAnLCB0eXBlOiAnY2hlY2tib3gnLCBhbGlhczogJ1doYXRzQXBwJyB9XHJcbiAgICAgIF0gfSxcclxuXHJcbiAgICBdLFxyXG4gICAgcmVzZXQ6IHRydWVcclxuICB9O1xyXG5cclxuICBjb250YWN0UGVyc29uVGFibGVDb25maWc6IFRhYmxlQ29uZmlnID0ge1xyXG4gICAgdGFiVGl0bGU6ICdDb250YWN0cycsXHJcbiAgICBzaG93RmlsdGVyOiB0cnVlLFxyXG4gICAgbWluQ29sdW1uczogWyduYW1lJywgJ2NvbnRhY3RNZXRob2RzJ10sXHJcbiAgICBlbGV2YXRpb246ICdub25lJyxcclxuICAgIGZsYXRCdXR0b25zOiB0cnVlLFxyXG4gICAgY29sdW1uczogW1xyXG4gICAgICB7IG5hbWU6ICduYW1lJywgdHlwZTogJ3RleHQnLCB9LFxyXG4gICAgICB7IG5hbWU6ICdtb2JpbGUnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgeyBuYW1lOiAnZW1haWwnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdjb250YWN0TWV0aG9kcycsXHJcbiAgICAgICAgdHlwZTogJ2ljb24nLFxyXG4gICAgICAgIGljb25zOiBbXHJcbiAgICAgICAgICB7IG5hbWU6ICdjYWxsJywgY29sb3I6ICdncmVlbicsIGNvbmRpdGlvbjogeCA9PiB4LmNhbkNhbGwsIHRpcDogJ0F2YWlsYWJsZSBmb3IgQ2FsbHMnIH0sXHJcbiAgICAgICAgICB7IG5hbWU6ICdzbXMnLCBjb2xvcjogJ2dyZWVuJywgY29uZGl0aW9uOiB4ID0+IHguY2FuU01TLCB0aXA6ICdBdmFpbGFibGUgZm9yIFNNUycgfSxcclxuICAgICAgICAgIHsgbmFtZTogJ2ZvcnVtJywgY29sb3I6ICdncmVlbicsIGNvbmRpdGlvbjogeCA9PiB4LmNhbldoYXRzQXBwLCB0aXA6ICdBdmFpbGFibGUgb24gV2hhdHNBcHAnIH1cclxuICAgICAgICBdXHJcbiAgICAgIH1cclxuICAgIF0sXHJcbiAgICBidXR0b25zOiBbXHJcbiAgICAgIHsgbmFtZTogJ2NyZWF0ZScsIGRpc3BsYXk6ICdBZGQnLCBkaWFsb2c6IHRydWUsIGFjdGlvbjogeyB1cmw6ICdjb250YWN0cGVyc29ucz9hY3Rpb249Y3JlYXRlJywgbWV0aG9kOiAncG9zdCcgfSwgY29uZmlybTogeyBtZXNzYWdlOiAnQWRkIGNvbnRhY3QgcGVyc29uPycgfSB9LFxyXG4gICAgICB7IG5hbWU6ICdlZGl0JywgZGlhbG9nOiB0cnVlLCBhY3Rpb246IHsgdXJsOiAnY29udGFjdHBlcnNvbnM/YWN0aW9uPWVkaXQnLCBtZXRob2Q6ICdwb3N0JyB9IH0sXHJcbiAgICAgIHsgbmFtZTogJ2RlbGV0ZScsIGRpYWxvZzogdHJ1ZSwgYWN0aW9uOiB7IHVybDogJ2NvbnRhY3RwZXJzb25zP2FjdGlvbj1kZWxldGUnLCBtZXRob2Q6ICdwb3N0JyB9IH1cclxuICAgIF0sXHJcbiAgICBmb3JtQ29uZmlnOiB0aGlzLmNvbnRhY3RQZXJzb25Gb3JtQ29uZmlnXHJcbiAgfTtcclxuXHJcblxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1DdXN0b21lcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgY3VzdG9tZXJGb3JtQ29uZmlnOiBGb3JtQ29uZmlnID0ge1xyXG4gICAgc2VjdXJpdHk6IHsgYWxsb3c6IFt0aGlzLmNhcEN1c3RvbWVyc10gfSxcclxuICAgIGluY2x1ZGVBdWRpdDogdHJ1ZSxcclxuICAgIHRpdGxlIDogJ0N1c3RvbWVyJyxcclxuICAgIGZpZWxkczogW1xyXG4gICAgICB7IG5hbWU6ICduYW1lJywgdHlwZTogJ3RleHQnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgICB7IG5hbWU6ICdwaG9uZScsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7IG5hbWU6ICdjb250YWN0UGVyc29uJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2FkZHJlc3MnLCB0eXBlOiAndGV4dCcsIHJvd3M6IDIsIHNwYW46IHRydWUgfSxcclxuICAgICAgeyBuYW1lOiAnY3VzdG9tZXJUZW5hbnRJRCcsIGFsaWFzOiAnQ3VzdG9tZXIgVGVuYW50JywgdHlwZTogJ3RleHQnLCBsb2FkQWN0aW9uOiB7IHVybDogJ3RlbmFudHMvbGlzdC94JyB9ICwgbnVsbGFibGU6IHRydWUgfSxcclxuICAgIF0sXHJcbiAgICBsb2FkQWN0aW9uOiB7IHVybDogJ2N1c3RvbWVycy9pZCcgfSxcclxuICAgIGhlcm9GaWVsZDogJ2N1c3RvbWVySUQnLFxyXG5cclxuICAgIHJlc2V0OiB0cnVlLFxyXG4gIH1cclxuXHJcbiAgY3VzdG9tZXJDcmVhdGVCdXR0b24gOiBCdXR0b24gPSB7IG5hbWU6ICdjcmVhdGUnLCBkaXNwbGF5OiAnQ3JlYXRlJywgZGlhbG9nOiB0cnVlLCBhY3Rpb246IHsgdXJsOiAnY3VzdG9tZXJzP2FjdGlvbj1jcmVhdGUnLCBtZXRob2Q6ICdwb3N0JyB9IH1cclxuICBjdXN0b21lckVkaXRCdXR0b246IEJ1dHRvbiA9IHsgbmFtZTogJ2VkaXQnLCBkaWFsb2c6IHRydWUsIGFjdGlvbjogeyB1cmw6ICdjdXN0b21lcnM/YWN0aW9uPWVkaXQnLCBtZXRob2Q6ICdwb3N0JyB9IH1cclxuXHJcbiAgY3VzdG9tZXJEZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgZm9ybUNvbmZpZyA6IHRoaXMuY3VzdG9tZXJGb3JtQ29uZmlnLFxyXG4gICAgaGVyb0ZpZWxkIDogJ2N1c3RvbWVySUQnLFxyXG4gICAgdGFibGVDb25maWdzOiBbXHJcbiAgICAgIHtcclxuICAgICAgICAuLi50aGlzLmNvbnRhY3RQZXJzb25UYWJsZUNvbmZpZyxcclxuICAgICAgICBsb2FkQWN0aW9uOiB7IHVybDogJ2NvbnRhY3RwZXJzb25zL2N1c3RvbWVyL3gnIH0sXHJcbiAgICAgICAgbG9hZENyaXRlcmlhOiAnY3VzdG9tZXInLFxyXG4gICAgICAgIGxvYWRJREZpZWxkOiAnY3VzdG9tZXJJRCdcclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIGJ1dHRvbnM6IFtcclxuICAgICAgdGhpcy5jdXN0b21lckNyZWF0ZUJ1dHRvbixcclxuICAgICAgdGhpcy5jdXN0b21lckVkaXRCdXR0b25cclxuICAgIF1cclxuICB9O1xyXG5cclxuICBjdXN0b21lcnNUYWJsZUNvbmZpZzogVGFibGVDb25maWcgPSB7XHJcbiAgICBzaG93RmlsdGVyOiB0cnVlLFxyXG4gICAgbWluQ29sdW1uczogWyduYW1lJ10sXHJcbiAgICBmbGF0QnV0dG9uczogdHJ1ZSxcclxuICAgIGxvZ1Jlc3BvbnNlOiB0cnVlLFxyXG4gICAgbWF4QnV0dG9uc0NvdW50OiAzLFxyXG4gICAgY29sbGFwc2VCdXR0b25zIDogdHJ1ZSxcclxuXHJcbiAgICBjb2x1bW5zOiBbXHJcblxyXG4gICAgICB7IG5hbWU6ICduYW1lJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ3Bob25lJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2NvbnRhY3RQZXJzb24nLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgeyBuYW1lOiAnaXNMaW5rZWQnLCB0eXBlOiAnY2hlY2tib3gnLCBhbGlhczogJ0xpbmtlZCcgfSxcclxuXHJcbiAgICBdLFxyXG5cclxuICAgIGJ1dHRvbnM6IFtcclxuICAgICAgdGhpcy5jdXN0b21lckNyZWF0ZUJ1dHRvbixcclxuICAgICAgeyBuYW1lOiAndmlldycsIGRpYWxvZzogdHJ1ZSwgZGV0YWlsc0NvbmZpZzogdGhpcy5jdXN0b21lckRldGFpbHNDb25maWcgfSxcclxuICAgICAgeyBuYW1lOiAnZWRpdCcsIGRpYWxvZzogdHJ1ZSwgZGV0YWlsc0NvbmZpZzogdGhpcy5jdXN0b21lckRldGFpbHNDb25maWcgfSxcclxuICAgICAgeyBuYW1lOiAnZGVsZXRlJywgZGlhbG9nOiB0cnVlLCBhY3Rpb246IHsgdXJsOiAnY3VzdG9tZXJzP2FjdGlvbj1kZWxldGUnLCBtZXRob2Q6ICdwb3N0JyB9IH0sXHJcbiAgICBdLFxyXG5cclxuICAgIGxvYWRBY3Rpb246IHsgdXJsOiAnY3VzdG9tZXJzL2FsbC94JyB9LFxyXG4gICAgZm9ybUNvbmZpZzogdGhpcy5jdXN0b21lckZvcm1Db25maWdcclxuICB9XHJcblxyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU3VwcGxpZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIHN1cHBsaWVyRm9ybUNvbmZpZzogRm9ybUNvbmZpZyA9IHtcclxuICAgIHNlY3VyaXR5OiB7IGFsbG93OiBbdGhpcy5jYXBTdXBwbGllcnNdIH0sXHJcbiAgICBpbmNsdWRlQXVkaXQ6IHRydWUsXHJcbiAgICB0aXRsZTogJ1N1cHBsaWVyJyxcclxuICAgIGZpZWxkczogW1xyXG4gICAgICB7IG5hbWU6ICduYW1lJywgdHlwZTogJ3RleHQnLCByZXF1aXJlZDogdHJ1ZSB9LFxyXG4gICAgICB7IG5hbWU6ICdwaG9uZScsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7IG5hbWU6ICdjb250YWN0UGVyc29uJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2FkZHJlc3MnLCB0eXBlOiAndGV4dCcsIHJvd3M6IDIsIHNwYW46IHRydWUgfSxcclxuICAgIF0sXHJcblxyXG4gICAgbG9hZEFjdGlvbjogeyB1cmw6ICdzdXBwbGllcnMvaWQnIH0sXHJcbiAgICBoZXJvRmllbGQ6ICdzdXBwbGllcklEJyxcclxuICB9XHJcblxyXG4gIHN1cHBsaWVyQ3JlYXRlQnV0dG9uIDogQnV0dG9uID0geyBuYW1lOiAnY3JlYXRlJywgZGlzcGxheTogJ0NyZWF0ZScsIGRpYWxvZzogdHJ1ZSwgYWN0aW9uOiB7IHVybDogJ3N1cHBsaWVycz9hY3Rpb249Y3JlYXRlJywgbWV0aG9kOiAncG9zdCcgfSB9XHJcbiAgc3VwcGxpZXJFZGl0QnV0dG9uIDogQnV0dG9uID0geyBuYW1lOiAnZWRpdCcsIGRpYWxvZzogdHJ1ZSwgYWN0aW9uOiB7IHVybDogJ3N1cHBsaWVycz9hY3Rpb249ZWRpdCcsIG1ldGhvZDogJ3Bvc3QnIH0gfVxyXG5cclxuICBzdXBwbGllckRldGFpbHNDb25maWc6IERldGFpbHNEaWFsb2dDb25maWcgPSB7XHJcbiAgICBmb3JtQ29uZmlnIDogdGhpcy5zdXBwbGllckZvcm1Db25maWcsXHJcbiAgICBoZXJvRmllbGQgOiAnc3VwcGxpZXJJRCcsXHJcbiAgICB0YWJsZUNvbmZpZ3M6IFtcclxuICAgICAge1xyXG4gICAgICAgIC4uLnRoaXMuY29udGFjdFBlcnNvblRhYmxlQ29uZmlnLFxyXG4gICAgICAgIGxvYWRBY3Rpb246IHsgdXJsOiAnY29udGFjdHBlcnNvbnMvc3VwcGxpZXIveCcgfSxcclxuICAgICAgICBsb2FkQ3JpdGVyaWE6ICdzdXBwbGllcicsXHJcbiAgICAgICAgbG9hZElERmllbGQ6ICdzdXBwbGllcklEJ1xyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgYnV0dG9ucyA6IFtcclxuICAgICAgdGhpcy5zdXBwbGllckNyZWF0ZUJ1dHRvbixcclxuICAgICAgdGhpcy5zdXBwbGllckVkaXRCdXR0b24sXHJcbiAgICBdXHJcbiAgfTtcclxuXHJcbiAgc3VwcGxpZXJzVGFibGVDb25maWc6IFRhYmxlQ29uZmlnID0ge1xyXG4gICAgc2hvd0ZpbHRlcjogdHJ1ZSxcclxuICAgIG1pbkNvbHVtbnM6IFsnbmFtZSddLFxyXG4gICAgZmxhdEJ1dHRvbnM6IHRydWUsXHJcbiAgICBjb2x1bW5zOiBbXHJcbiAgICAgIHsgbmFtZTogJ25hbWUnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgeyBuYW1lOiAncGhvbmUnLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgeyBuYW1lOiAnY29udGFjdFBlcnNvbicsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgXSxcclxuXHJcbiAgICBidXR0b25zOiBbXHJcbiAgICAgIHRoaXMuc3VwcGxpZXJDcmVhdGVCdXR0b24sXHJcbiAgICAgIHsgbmFtZTogJ3ZpZXcnLCBkaWFsb2c6IHRydWUsIGRldGFpbHNDb25maWc6IHRoaXMuc3VwcGxpZXJEZXRhaWxzQ29uZmlnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2VkaXQnLCBkaWFsb2c6IHRydWUsICBkZXRhaWxzQ29uZmlnOiB0aGlzLnN1cHBsaWVyRGV0YWlsc0NvbmZpZyB9LFxyXG4gICAgICB7IG5hbWU6ICdkZWxldGUnLCBkaWFsb2c6IHRydWUsIGFjdGlvbjogeyB1cmw6ICdzdXBwbGllcnM/YWN0aW9uPWRlbGV0ZScsIG1ldGhvZDogJ3Bvc3QnIH0gfSxcclxuICAgIF0sXHJcblxyXG4gICAgbG9hZEFjdGlvbjogeyB1cmw6ICdzdXBwbGllcnMvYWxsL3gnIH0sXHJcbiAgICBmb3JtQ29uZmlnOiB0aGlzLnN1cHBsaWVyRm9ybUNvbmZpZ1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Ob3RpZmljYXRpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBub3RpZmljYXRpb25PcHRpb25zID0gW1xyXG4gICAgeyBuYW1lOiAnVUkgT25seScsIHZhbHVlOiAxIH0sXHJcbiAgICB7IG5hbWU6ICdVSSArIEVtYWlsJywgdmFsdWU6IDMgfSxcclxuICAgIC8vIHsgbmFtZTogJ1VJICsgRW1haWwgKyBTTVMnLCB2YWx1ZTogNyB9LFxyXG4gICAgeyBuYW1lOiAnVUkgKyBXaGF0c0FwcCcsIHZhbHVlOiA5IH0sXHJcbiAgICB7IG5hbWU6ICdVSSArIFRlbGVncmFtJywgdmFsdWU6IDE3IH0sXHJcbiAgICB7IG5hbWU6ICdVSSArIFRlbGVncmFtICsgV2hhdHNBcHAnLCB2YWx1ZTogMjUgfSxcclxuICAgIHsgbmFtZTogJ0FsbCBDaGFubmVscycsIHZhbHVlOiAzMSB9XHJcbiAgXVxyXG5cclxuXHJcblxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1BcHByb3ZhbHMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cclxuICBhcHByb3ZhbEhpc3RvcnlGb3JtQ29uZmlnIDogRm9ybUNvbmZpZyA9IHtcclxuICAgIHRpdGxlOiAnQXBwcm92YWwgSGlzdG9yeScsXHJcbiAgICBmaWVsZHM6IFtcclxuICAgICAgeyBuYW1lOiAnbGV2ZWxOYW1lJywgdHlwZTogJ3RleHQnLCByZWFkb25seTogdHJ1ZSwgYWxpYXM6ICdMZXZlbCcgfSxcclxuICAgICAgeyBuYW1lOiAnc3RhdHVzTmFtZScsIHR5cGU6ICd0ZXh0JywgcmVhZG9ubHk6IHRydWUsIGFsaWFzOiAnU3RhdHVzJyB9LFxyXG4gICAgICB7IG5hbWU6ICdjb21tZW50cycsIHR5cGU6ICd0ZXh0JywgcmVhZG9ubHk6IHRydWUsIHNwYW46IHRydWUsIHJvd3M6IDMsIGNvcHlDb250ZW50OiB0cnVlIH0sXHJcbiAgICBdLFxyXG4gICAgaW5jbHVkZUF1ZGl0OiB0cnVlXHJcbiAgfVxyXG5cclxuICAvL0FwcHJvdmFsIEhpc3RvcnlcclxuICBhcHByb3ZhbEhpc3RvcnlUYWJsZUNvbmZpZzogVGFibGVDb25maWcgPSB7XHJcbiAgICB0YWJUaXRsZTogJ1RyYWlsJyxcclxuICAgIGVsZXZhdGlvbjogJ25vbmUnLFxyXG4gICAgbWluQ29sdW1uczogWydjcmVhdGVkRGF0ZScsICdsZXZlbE5hbWUnLCAnc3RhdHVzTmFtZSddLFxyXG4gICAgZmxhdEJ1dHRvbnM6IHRydWUsXHJcbiAgICBzaG93RmlsdGVyIDogdHJ1ZSxcclxuICAgIGNvbHVtbnM6IFtcclxuICAgICAgeyBuYW1lOiAnY3JlYXRlZERhdGUnLCB0eXBlOiAnZGF0ZXRpbWUnLCBhbGlhcyA6ICdEYXRlJyB9LFxyXG4gICAgICB7IG5hbWU6ICdsZXZlbE5hbWUnLCB0eXBlOiAndGV4dCcsIGFsaWFzOiAnTGV2ZWwnIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnc3RhdHVzTmFtZScsIHR5cGU6ICd0ZXh0JywgYWxpYXM6ICdTdGF0dXMnLFxyXG4gICAgICAgIGNvbG9yczogW1xyXG4gICAgICAgICAgeyBuYW1lOiAnIzkwQTRBRScsIGNvbmRpdGlvbjogeCA9PiB4LnN0YXR1cyA9PT0gMCB9LFxyXG4gICAgICAgICAgeyBuYW1lOiAnIzY2QkI2QScsIGNvbmRpdGlvbjogeCA9PiB4LnN0YXR1cyA9PT0gMSB9LFxyXG4gICAgICAgICAgeyBuYW1lOiAnI0Y0NDMzNicsIGNvbmRpdGlvbjogeCA9PiB4LnN0YXR1cyA9PT0gMiB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9LFxyXG4gICAgICB7IG5hbWU6ICdjb21tZW50cycsIHR5cGU6ICd0ZXh0JywgfSxcclxuICAgICAgeyBuYW1lOiAnY3JlYXRlZEJ5TmFtZScsIHR5cGU6ICd0ZXh0JywgYWxpYXM6ICdCeScgfSxcclxuXHJcbiAgICBdLFxyXG4gICAgYnV0dG9uczogW1xyXG4gICAgICB7IG5hbWU6ICd2aWV3JywgZGlhbG9nOiB0cnVlIH1cclxuICAgIF0sXHJcblxyXG4gICAgZm9ybUNvbmZpZyA6IHRoaXMuYXBwcm92YWxIaXN0b3J5Rm9ybUNvbmZpZyxcclxuXHJcbiAgICBsb2FkQWN0aW9uOiB7IHVybDogJ2FwcHJvdmFsaGlzdG9yeS9hcHByb3ZhbC94JyB9LFxyXG4gICAgbG9hZENyaXRlcmlhOiAnYXBwcm92YWwnLFxyXG4gICAgbG9hZElERmllbGQ6ICdhcHByb3ZhbElEJ1xyXG4gIH07XHJcblxyXG5cclxuXHJcbiAgLy9hcHByb3ZhbHMgZm9ybVxyXG4gIGFwcHJvdmFsRm9ybUNvbmZpZzogRm9ybUNvbmZpZyA9IHtcclxuICAgIHRpdGxlOiAnQXBwcm92YWwnLFxyXG4gICAgZmllbGRzOiBbXHJcbiAgICAgIHsgbmFtZTogJ2JsYW5rJywgdHlwZTogJ2JsYW5rJywgc3BhbjogdHJ1ZSB9LFxyXG4gICAgICB7IG5hbWU6ICdzdGF0dXNOYW1lJywgdHlwZTogJ2xhYmVsJywgYWxpYXM6ICdTdGF0dXMnLCBzcGFuOiB0cnVlIH0sXHJcbiAgICAgIHsgbmFtZTogJ21lc3NhZ2UnLCB0eXBlOiAndGV4dCcsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiB0cnVlLCByb3dzOiAzIH0sXHJcblxyXG4gICAgXSxcclxuICAgIGxvYWRBY3Rpb246IHsgdXJsOiAnYXBwcm92YWxzL2lkJyB9LFxyXG4gICAgaGVyb0ZpZWxkOiAnYXBwcm92YWxJRCdcclxuICB9O1xyXG5cclxuXHJcblxyXG5cclxuICAvLyBhcHByb3ZhbCBhY3Rpb24gZGlhbG9nXHJcbiAgYXBwcm92YWxBY3Rpb25Gb3JtQ29uZmlnOiBGb3JtQ29uZmlnID0ge1xyXG4gICAgdGl0bGU6ICdBcHByb3ZhbCBBY3Rpb24nLFxyXG4gICAgZml4ZWRUaXRsZTogdHJ1ZSxcclxuICAgIGZpZWxkczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ2NvbW1lbnRzJywgdHlwZTogJ3RleHQnLCByZXF1aXJlZDogZmFsc2UsIHNwYW46IHRydWUsIHJvd3M6IDMsXHJcbiAgICAgICAgaW5mb01lc3NhZ2U6ICdFbnRlciB5b3VyIGNvbW1lbnRzIGFib3V0IHRoaXMgYXBwcm92YWwgYWN0aW9uLiBUaGlzIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYXBwcm92YWwgaGlzdG9yeS4nXHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9O1xyXG5cclxuICBhcHByb3ZlQWN0aW9uRGV0YWlsc0NvbmZpZzogRGV0YWlsc0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgIGZvcm1Db25maWc6IHtcclxuICAgICAgLi4udGhpcy5hcHByb3ZhbEFjdGlvbkZvcm1Db25maWcsXHJcbiAgICAgIGZpZWxkczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdjb21tZW50cycsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IGZhbHNlLCBzcGFuOiB0cnVlLCByb3dzOiAzLFxyXG4gICAgICAgICAgaW5mb01lc3NhZ2U6ICdFbnRlciB5b3VyIGNvbW1lbnRzIGFib3V0IHRoaXMgYXBwcm92YWwgYWN0aW9uLiBUaGlzIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYXBwcm92YWwgaGlzdG9yeS4nXHJcbiAgICAgICAgfVxyXG4gICAgICBdLFxyXG4gICAgfSxcclxuICAgIG1vZGU6ICdlZGl0JyxcclxuICAgIGJ1dHRvbnM6IFtcclxuICAgICAgeyBuYW1lOiAnZWRpdCcsIGRpc3BsYXk6ICdBcHByb3ZlJywgY29sb3I6ICdncmVlbicsIGFjdGlvbjogeyB1cmw6ICdhcHByb3ZlJywgbWV0aG9kOiAncG9zdCcgfSB9IC8vdXJsIHByZWNvbmZpZ3VyZWQgdG8gYmUgZHluYW1pY1xyXG4gICAgXVxyXG4gIH07XHJcblxyXG4gIGRlY2xpbmVBY3Rpb25EZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgZm9ybUNvbmZpZzogey4uLnRoaXMuYXBwcm92YWxBY3Rpb25Gb3JtQ29uZmlnLFxyXG4gICAgICBmaWVsZHM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnY29tbWVudHMnLCB0eXBlOiAndGV4dCcsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiB0cnVlLCByb3dzOiAzLFxyXG4gICAgICAgICAgaW5mb01lc3NhZ2U6ICdFbnRlciB5b3VyIGNvbW1lbnRzIGFib3V0IHRoaXMgYXBwcm92YWwgYWN0aW9uLiBUaGlzIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYXBwcm92YWwgaGlzdG9yeS4nLFxyXG4gICAgICAgICAgaGludCA6ICdEZWNsaW5lIGNvbW1lbnQgaXMgcmVxdWlyZWQgISdcclxuICAgICAgICB9XHJcbiAgICAgIF0sXHJcbiAgICB9LFxyXG4gICAgbW9kZTogJ2VkaXQnLFxyXG4gICAgYnV0dG9uczogW1xyXG4gICAgICB7IG5hbWU6ICdlZGl0JywgZGlzcGxheTogJ0RlY2xpbmUnLCBjb2xvcjogJ3JlZCcsIGFjdGlvbjogeyB1cmw6ICdkZWNsaW5lJywgbWV0aG9kOiAncG9zdCcgfSB9IC8vdXJsIHByZWNvbmZpZ3VyZWQgdG8gYmUgZHluYW1pY1xyXG4gICAgXVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBhcHByb3ZlQnV0dG9uOiBCdXR0b24gPSB7XHJcbiAgICBuYW1lOiAnYXBwcm92ZScsIHRpcDogJ0FwcHJvdmUgUmVxdWVzdCcsIGRpYWxvZzogdHJ1ZSwgaW5EaWFsb2c6IHRydWUsIGljb246IHsgbmFtZTogJ2RvbmUnIH0sIGNvbG9yOiAnZ3JlZW4nLCBkZXRhaWxzQ29uZmlnOiB0aGlzLmFwcHJvdmVBY3Rpb25EZXRhaWxzQ29uZmlnLCBpZ25vcmVQZW5kaW5nQXBwcm92YWw6IHRydWUsXHJcbiAgICB2aXNpYmxlOiB4ID0+IHggJiYgeC5jYW5BY3Rpb24gJiYgKCF4LmlzTXlBcHByb3ZhbFJlcXVlc3QgfHwgdGhpcy5teVJvbGVbdGhpcy5jYXBTZWxmQXBwcm92YWwubmFtZV0pLFxyXG4gIH1cclxuXHJcbiAgZGVjbGluZUJ1dHRvbjogQnV0dG9uID0ge1xyXG4gICAgbmFtZTogJ2RlY2xpbmUnLCB0aXA6ICdEZWNsaW5lIFJlcXVlc3QnLCBkaWFsb2c6IHRydWUsIGluRGlhbG9nOiB0cnVlLCBpY29uOiB7IG5hbWU6ICdjbG9zZScgfSwgY29sb3I6ICdyZWQnLCBkZXRhaWxzQ29uZmlnOiB0aGlzLmRlY2xpbmVBY3Rpb25EZXRhaWxzQ29uZmlnLCBpZ25vcmVQZW5kaW5nQXBwcm92YWw6IHRydWUsXHJcbiAgICB2aXNpYmxlOiB4ID0+IHggJiYgeC5jYW5BY3Rpb24gJiYgKCF4LmlzTXlBcHByb3ZhbFJlcXVlc3QgfHwgdGhpcy5teVJvbGVbdGhpcy5jYXBTZWxmQXBwcm92YWwubmFtZV0pLFxyXG4gIH1cclxuXHJcbiAgY2FuY2VsQnV0dG9uOiBCdXR0b24gPSB7XHJcbiAgICBuYW1lOiAnY2FuY2VsJywgdGlwOiAnQ2FuY2VsIEFwcHJvdmFsJywgaW5EaWFsb2c6IHRydWUsIGljb246IHsgbmFtZTogJ2NhbmNlbCcgfSwgY29sb3I6ICdyZWQnLCBhY3Rpb246IHsgdXJsOiAnY2FuY2VsJywgbWV0aG9kOiAncG9zdCcsIH0sIGlnbm9yZVBlbmRpbmdBcHByb3ZhbDogdHJ1ZSwgLy91cmwgcHJlY29uZmlndXJlZCB0byBiZSBkeW5hbWljXHJcbiAgICBjb25maXJtOiB7IG1lc3NhZ2U6ICdDYW5jZWwgYXBwcm92YWwgcmVxdWVzdD8gVGhpcyB3aWxsIHJldmVydCBjaGFuZ2VzIGFuZCBzdG9wIHRoZSBhcHByb3ZhbCBwcm9jZXNzLicgfSxcclxuICAgIHZpc2libGU6IHggPT4geCAmJiB4LmNhbkNhbmNlbFxyXG4gIH1cclxuXHJcbiAgYXBwcm92YWxEZXRhaWxzQ29uZmlnOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgZm9ybUNvbmZpZzogdGhpcy5hcHByb3ZhbEZvcm1Db25maWcsXHJcbiAgICBoZXJvRmllbGQ6ICdhcHByb3ZhbElEJyxcclxuICAgIHRhYmxlQ29uZmlnczogW3RoaXMuYXBwcm92YWxIaXN0b3J5VGFibGVDb25maWddLFxyXG5cclxuICAgIHN0ZXBDb25maWc6IHtcclxuICAgICAgc3RlcHM6IFtdLFxyXG4gICAgICBsb2FkQWN0aW9uOiB7IHVybDogYGFwcHJvdmFscy9zdGVwcy97aWR9YCB9LFxyXG4gICAgICBsb2FkSURGaWVsZDogJ2FwcHJvdmFsSUQnLFxyXG4gICAgICB2YWx1ZUZpZWxkOiAnY3VycmVudExldmVsJ1xyXG4gICAgfSxcclxuXHJcbiAgICBidXR0b25zIDogW1xyXG4gICAgICB0aGlzLmFwcHJvdmVCdXR0b24sXHJcbiAgICAgIHRoaXMuZGVjbGluZUJ1dHRvbixcclxuICAgICAgdGhpcy5jYW5jZWxCdXR0b25cclxuICAgIF1cclxuXHJcbiAgfTtcclxuXHJcblxyXG4gIHZpZXdBcHByb3ZhbEJ1dHRvbjogQnV0dG9uID0ge1xyXG4gICAgbmFtZTogJ2luZm8nLCB0aXA6ICdBcHByb3ZhbCBJbmZvcm1hdGlvbicsIGRpYWxvZzogdHJ1ZSwgaWNvbjogeyBuYW1lOiAnaW5mbycsICB9LCBkZXRhaWxzQ29uZmlnOiB0aGlzLmFwcHJvdmFsRGV0YWlsc0NvbmZpZywgaWdub3JlUGVuZGluZ0FwcHJvdmFsOiB0cnVlLFxyXG4gICAgdmlzaWJsZTogeCA9PiB4LmNhbkFjdGlvbiB8fCB4LmNhbkNhbmNlbFxyXG4gIH1cclxuXHJcblxyXG4gIC8vcmVjZWl2ZWQgYXBwcm92YWxzXHJcbiAgcmVjZWl2ZWRBcHByb3ZhbHNUYWJsZUNvbmZpZzogVGFibGVDb25maWcgPSB7XHJcbiAgICBzaG93RmlsdGVyOiB0cnVlLFxyXG4gICAgbWluQ29sdW1uczogWydtZXNzYWdlJywgJ3N0YXR1c05hbWUnXSxcclxuICAgIG1pbkJ1dHRvbnM6IFsndmlldycsICdhcHByb3ZlJywgJ2RlY2xpbmUnXSxcclxuICAgIGZsYXRCdXR0b25zOiB0cnVlLFxyXG4gICAgZ3JleU91dDogKHgpID0+IHguaXNHcmV5ZWRPdXQsXHJcbiAgICAvLyBsb2dSZXNwb25zZTogdHJ1ZSxcclxuICAgIGNvbGxhcHNlQnV0dG9uczogdHJ1ZSxcclxuICAgIGNvbHVtbnM6IFtcclxuICAgICAgeyBuYW1lOiAnY3JlYXRlZERhdGUnLCB0eXBlOiAnZGF0ZXRpbWUnLCBhbGlhczogJ0RhdGUnIH0sXHJcbiAgICAgIHsgbmFtZTogJ2NyZWF0ZWRCeU5hbWUnLCBhbGlhczogJ1JlcXVlc3QgQnknLCB0eXBlOiAndGV4dCcgfSxcclxuICAgICAgeyBuYW1lOiAnbWVzc2FnZScsIHR5cGU6ICd0ZXh0JyB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ3R5cGVOYW1lJywgYWxpYXM6ICdUeXBlJywgdHlwZTogJ2NoaXAnLFxyXG4gICAgICAgIGNvbG9yczogW1xyXG4gICAgICAgICAgeyBuYW1lOiAnIzY2QkI2QScsIGNvbmRpdGlvbjogeCA9PiB4LnR5cGUgPT09IDAgfSxcclxuICAgICAgICAgIHsgbmFtZTogJ29yYW5nZScsIGNvbmRpdGlvbjogeCA9PiB4LnR5cGUgPT09IDEgfSxcclxuICAgICAgICAgIHsgbmFtZTogJyNGNDQzMzYnLCBjb25kaXRpb246IHggPT4geC50eXBlID09PSAyIH1cclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnc3RhdHVzTmFtZScsIGFsaWFzOiAnU3RhdHVzJywgdHlwZTogJ2NoaXAnLCBkZXRhaWxzQ29uZmlnOiB0aGlzLmFwcHJvdmFsRGV0YWlsc0NvbmZpZyxcclxuICAgICAgICBjb2xvcnM6IFtcclxuICAgICAgICAgIHsgbmFtZTogJyM5MEE0QUUnLCBjb25kaXRpb246IHggPT4geC5zdGF0dXMgPT09IDAgfSxcclxuICAgICAgICAgIHsgbmFtZTogJyM2NkJCNkEnLCBjb25kaXRpb246IHggPT4geC5zdGF0dXMgPT09IDEgfSxcclxuICAgICAgICAgIHsgbmFtZTogJyNGNDQzMzYnLCBjb25kaXRpb246IHggPT4geC5zdGF0dXMgPT09IDIgfVxyXG4gICAgICAgIF1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdjdXJyZW50TGV2ZWxOYW1lJywgdHlwZTogJ3RleHQnLCBhbGlhczogJ0N1cnJlbnQgTGV2ZWwnLFxyXG4gICAgICAgIGljb25zOiBbXHJcbiAgICAgICAgICB7IG5hbWU6ICdkb25lJywgY29sb3I6ICcjNjZCQjZBJywgY29uZGl0aW9uOiB4ID0+IHguc3RhdHVzID09PSAnQXBwcm92ZWQnLCB0aXA6ICdBcHByb3ZlZCcgfSxcclxuICAgICAgICAgIHsgbmFtZTogJ2Nsb3NlJywgY29sb3I6ICcjRjQ0MzM2JywgY29uZGl0aW9uOiB4ID0+IHguc3RhdHVzID09PSAnRGVjbGluZWQnLCB0aXA6ICdEZWNsaW5lZCcgfSxcclxuICAgICAgICAgIHsgbmFtZTogJ3NjaGVkdWxlJywgY29sb3I6ICcjRkZDMTA3JywgY29uZGl0aW9uOiB4ID0+IHguc3RhdHVzID09PSAnUGVuZGluZycsIHRpcDogJ1BlbmRpbmcnIH1cclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgIHsgbmFtZTogJ3VwZGF0ZWRCeU5hbWUnLCBhbGlhczogJ0FjdGlvbmVkIEJ5JywgdHlwZTogJ3RleHQnIH0sXHJcbiAgICAgIHsgbmFtZTogJ3VwZGF0ZWREYXRlRGlzcGxheScsIHR5cGU6ICdkYXRldGltZScsIGFsaWFzOiAnQWN0aW9uZWQgRGF0ZScgfSxcclxuICAgIF0sXHJcblxyXG4gICAgYnV0dG9uczogW1xyXG4gICAgICB0aGlzLnZpZXdBcHByb3ZhbEJ1dHRvbixcclxuICAgICAgdGhpcy5hcHByb3ZlQnV0dG9uLFxyXG4gICAgICB0aGlzLmRlY2xpbmVCdXR0b24sXHJcbiAgICAgIHRoaXMuY2FuY2VsQnV0dG9uLFxyXG4gICAgXSxcclxuXHJcbiAgICBsb2FkQWN0aW9uOiB7IHVybDogJ2FwcHJvdmFscy9hbGwveCcgfVxyXG4gIH07XHJcblxyXG5cclxuICAvL3NlbmQgYXBwcm92YWxzXHJcbiAgc2VudEFwcHJvdmFsc1RhYmxlQ29uZmlnOiBUYWJsZUNvbmZpZyA9IHtcclxuICAgIC4uLnRoaXMucmVjZWl2ZWRBcHByb3ZhbHNUYWJsZUNvbmZpZyxcclxuICAgIGJ1dHRvbnM6IFtcclxuICAgICAgdGhpcy52aWV3QXBwcm92YWxCdXR0b24sXHJcbiAgICAgIHRoaXMuY2FuY2VsQnV0dG9uLFxyXG4gICAgXSxcclxuICAgIGxvYWRBY3Rpb246IHsgdXJsOiAnYXBwcm92YWxzL3NlbnQveCcgfVxyXG4gIH07XHJcblxyXG5cclxuICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU90aGVyIGNvZGVcclxuXHJcbiAgcHJpdmF0ZSBsaXN0Q2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICBwcml2YXRlIGNhY2hlVGltZXN0YW1wczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xyXG4gIHByaXZhdGUgb25nb2luZ1JlcXVlc3RzOiB7IFtrZXk6IHN0cmluZ106IE9ic2VydmFibGU8QXBpUmVzcG9uc2U+IH0gPSB7fTtcclxuXHJcbiAgcHVibGljIENhbGxBcGkoYWN0aW9uOiBBY3Rpb24sIGRhdGE6IGFueSA9ICcnICkge1xyXG5cclxuXHJcbiAgICBpZiAoIWFjdGlvbj8udXJsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBhY3Rpb24gb3IgbWlzc2luZyBVUkwnKTtcclxuICAgICAgcmV0dXJuIG9mKHsgc3VjY2VzczogZmFsc2UsIG1lc3NhZ2U6ICdJbnZhbGlkIGFjdGlvbiBjb25maWd1cmF0aW9uJyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZyhcImNhbGxpbmdcIiwgYWN0aW9uKTtcclxuXHJcblxyXG4gICAgaWYgKCFhY3Rpb24ubWV0aG9kIHx8IGFjdGlvbi5tZXRob2QgPT09ICdnZXQnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUNhY2hlZENhbGwoYWN0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAoYWN0aW9uLm1ldGhvZCA9PT0gJ3Bvc3QnKSB7XHJcbiAgICAgIGlmIChhY3Rpb24uaXNGb3JtRGF0YSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLlBvc3RfRm9ybURhdGEoYWN0aW9uLnVybCwgZGF0YSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnVybCA9PT0gJ2FwcHJvdmUnIHx8IGFjdGlvbi51cmwgPT09ICdkZWNsaW5lJyB8fCBhY3Rpb24udXJsID09PSAnY2FuY2VsJykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLlBvc3QoYCR7ZGF0YS5lbmRwb2ludH0vYXBwcm92ZT9hY3Rpb249JHthY3Rpb24udXJsfWAsIGRhdGEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLlBvc3QoYWN0aW9uLnVybCwgZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLlBvc3QoYWN0aW9uLnVybCwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVDYWNoZWRDYWxsKGFjdGlvbjogQWN0aW9uKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgY2FjaGVLZXkgPSB0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoYWN0aW9uLnVybCk7XHJcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XHJcbiAgICBcclxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCB1c2UgY2FjaGVcclxuICAgIGlmICghYWN0aW9uLnNraXBDYWNoZSAmJiB0aGlzLmlzQ2FjaGVWYWxpZChjYWNoZUtleSwgYWN0aW9uKSkge1xyXG4gICAgICBjb25zb2xlLmxvZygnVXNpbmcgY2FjaGU6JywgY2FjaGVLZXkpO1xyXG4gICAgICByZXR1cm4gb2Yoe1xyXG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgbWVzc2FnZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICAgIGRhdGE6IHRoaXMubGlzdENhY2hlW2NhY2hlS2V5XVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGFuIG9uZ29pbmcgcmVxdWVzdCBmb3IgdGhlIHNhbWUgVVJMXHJcbiAgICBpZiAodGhpcy5vbmdvaW5nUmVxdWVzdHNbY2FjaGVLZXldKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdVc2luZyBvbmdvaW5nIHJlcXVlc3QgZm9yOicsIGNhY2hlS2V5KTtcclxuICAgICAgcmV0dXJuIHRoaXMub25nb2luZ1JlcXVlc3RzW2NhY2hlS2V5XTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZXRlcm1pbmUgY2FjaGUgZHVyYXRpb25cclxuICAgIGNvbnN0IGNhY2hlRHVyYXRpb24gPSB0aGlzLmdldENhY2hlRHVyYXRpb24oYWN0aW9uKTtcclxuICAgIFxyXG4gICAgLy8gT25seSBjYWNoZSBpZiBkdXJhdGlvbiBpcyBzcGVjaWZpZWQgb3IgaXQncyBhIGxpc3QgZW5kcG9pbnRcclxuICAgIGlmIChjYWNoZUR1cmF0aW9uID4gMCkge1xyXG4gICAgICAvLyBDcmVhdGUgYW5kIHN0b3JlIHRoZSBvbmdvaW5nIHJlcXVlc3RcclxuICAgICAgdGhpcy5vbmdvaW5nUmVxdWVzdHNbY2FjaGVLZXldID0gdGhpcy5odHRwU2VydmljZS5HZXQoYWN0aW9uLnVybCkucGlwZShcclxuICAgICAgICB0aW1lb3V0KDYwMDAwKSwgLy8gMSBtaW51dGUgdGltZW91dCBmb3Igd2FpdGluZyByZXF1ZXN0c1xyXG4gICAgICAgIHRhcCgocmVzcG9uc2U6IEFwaVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZT8uZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RDYWNoZVtjYWNoZUtleV0gPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlVGltZXN0YW1wc1tjYWNoZUtleV0gPSBjdXJyZW50VGltZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgICBkZWxldGUgdGhpcy5vbmdvaW5nUmVxdWVzdHNbY2FjaGVLZXldO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHNoYXJlKCkgXHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5vbmdvaW5nUmVxdWVzdHNbY2FjaGVLZXldO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gTm8gY2FjaGluZywganVzdCBtYWtlIHRoZSByZXF1ZXN0XHJcbiAgICAgIGNvbnNvbGUubG9nKCdObyBjYWNoaW5nIGZvcjonLCBjYWNoZUtleSk7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLkdldChhY3Rpb24udXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWNoZUtleSh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdXJsOyAvLyBVUkwgYWxyZWFkeSBpbmNsdWRlcyBxdWVyeSBwYXJhbXNcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNDYWNoZVZhbGlkKGNhY2hlS2V5OiBzdHJpbmcsIGFjdGlvbjogQWN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMubGlzdENhY2hlW2NhY2hlS2V5XSB8fCAhdGhpcy5jYWNoZVRpbWVzdGFtcHNbY2FjaGVLZXldKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjYWNoZUR1cmF0aW9uID0gdGhpcy5nZXRDYWNoZUR1cmF0aW9uKGFjdGlvbik7XHJcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IERhdGUubm93KCk7XHJcbiAgICBjb25zdCBjYWNoZUFnZSA9IGN1cnJlbnRUaW1lIC0gdGhpcy5jYWNoZVRpbWVzdGFtcHNbY2FjaGVLZXldO1xyXG4gICAgXHJcbiAgICByZXR1cm4gY2FjaGVBZ2UgPCAoY2FjaGVEdXJhdGlvbiAqIDYwICogMTAwMCk7IFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDYWNoZUR1cmF0aW9uKGFjdGlvbjogQWN0aW9uKTogbnVtYmVyIHtcclxuICAgIC8vIElmIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIGFjdGlvbiwgdXNlIHRoYXRcclxuICAgIGlmIChhY3Rpb24uY2FjaGVEdXJhdGlvbk1pbnV0ZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gYWN0aW9uLmNhY2hlRHVyYXRpb25NaW51dGVzO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBEZWZhdWx0IHRvIDEgbWludXRlIGZvciBsaXN0IGVuZHBvaW50c1xyXG4gICAgaWYgKGFjdGlvbi51cmwuaW5jbHVkZXMoJy9saXN0LycpKSB7XHJcbiAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBObyBjYWNoaW5nIGJ5IGRlZmF1bHRcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIENsZWFyQ2FjaGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxpc3RDYWNoZSA9IHt9O1xyXG4gICAgdGhpcy5jYWNoZVRpbWVzdGFtcHMgPSB7fTtcclxuICAgIC8vIEFkZGVkOiBDbGVhciBvbmdvaW5nIHJlcXVlc3RzIGFzIHdlbGxcclxuICAgIE9iamVjdC5rZXlzKHRoaXMub25nb2luZ1JlcXVlc3RzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLm9uZ29pbmdSZXF1ZXN0c1trZXldO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW52YWxpZGF0ZUxpc3RDYWNoZShlbnRpdHlVcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5saXN0Q2FjaGUpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgaWYgKGtleS5pbmNsdWRlcyhlbnRpdHlVcmwpKSB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMubGlzdENhY2hlW2tleV07XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuY2FjaGVUaW1lc3RhbXBzW2tleV07XHJcbiAgICAgICAgZGVsZXRlIHRoaXMub25nb2luZ1JlcXVlc3RzW2tleV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBDaGVja1dlbGNvbWVkKHBhdGg6IHN0cmluZyA9ICdob21lL2FkbWluL3dlbGNvbWUnKSB7XHJcbiAgICB0aGlzLkNhbGxBcGkoeyB1cmw6ICd0ZW5hbnQvd2VsY29tZS94JyB9KS5zdWJzY3JpYmUoKHgpID0+IHtcclxuICAgICAgaWYgKCF4LmRhdGEpIHtcclxuICAgICAgICB0aGlzLk5hdmlnYXRlKHBhdGgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHB1YmxpYyBOYXZpZ2F0ZShwYXRoOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYXRoXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgTmF2aWdhdGVXaXRoVmFsdWUocGF0aDogc3RyaW5nLCB2YWx1ZSA6IHN0cmluZyl7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcGF0aF0sIHtcclxuICAgICAgcXVlcnlQYXJhbXM6IHsgdjogdmFsdWUgfSxcclxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgICAgc2tpcExvY2F0aW9uQ2hhbmdlOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0TmF2aWdhdGlvblZhbHVlKCl7XHJcbiAgICBpZiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tcInZcIl0gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW1widlwiXVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRtcEFjY291bnRJRDtcclxuXHJcblxyXG5cclxuICAvL1VzZXJzXHJcbiAgcHVibGljIEdldFVzZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5HZXQoXCJVc2VyL2FsbC94XCIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFJlZ2lzdGVyQWNjb3VudCh1KSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5Qb3N0KFwiVXNlci9yZWdpc3RlclwiLCB1KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRVc2VyQnlJRCh2YWw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuR2V0KGBVc2VyL2lkLyR7dmFsfWApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFVwZGF0ZVVzZXIocHJvZmlsZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuUG9zdChcIlVzZXIvZWRpdFwiLCBwcm9maWxlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBVbmxvY2tVc2VyKHVzZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLlBvc3QoXCJVc2VyL3VubG9ja1wiLCB1c2VyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBMb2NrVXNlcih1c2VyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5Qb3N0KFwiVXNlci9sb2NrXCIsIHVzZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIERlbGV0ZVVzZXIodXNlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuUG9zdChcIlVzZXIvZGVsZXRlXCIsIHVzZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIExvZ2luKHU6IFVzZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLlBvc3QoXCJVc2VyL2xvZ2luXCIsIHUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIENoYW5nZVBhc3N3b3JkKHUpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLlBvc3QoXCJVc2VyL2NoYW5nZXBhc3N3b3JkLXNlbGZcIiwgdSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ2hhbmdlUGFzc3dvcmRBZG1pbih1KSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5Qb3N0KFwiVXNlci9jaGFuZ2VwYXNzd29yZC1hZG1pblwiLCB1KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBTZWxmUmVzZXQodTogVXNlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5Qb3N0KFwiQmFzaWMvU2VsZlJlc2V0XCIsIHUpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vUm9sZXNcclxuXHJcbiAgcHVibGljIFBvc3RSb2xlKHJvbGUsIGFjdGlvbjogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5Qb3N0KGBSb2xlP2FjdGlvbj0ke2FjdGlvbn1gLCByb2xlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBQdXRSb2xlKHJvbGUpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLlB1dChcIlJvbGVcIiwgcm9sZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0Um9sZShieTogc3RyaW5nLCB2YWw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuR2V0KFwiUm9sZS9hbGwveFwiKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy9Mb2dzXHJcbiAgcHVibGljIEdldExvZyhieTogc3RyaW5nLCB2YWw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuR2V0KFwiTG9nL2FsbC94XCIpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vU2V0dGluZ3NcclxuICBwdWJsaWMgR2V0U2V0dGluZyhieTogc3RyaW5nLCB2YWw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UuR2V0KFwiU2V0dGluZy9hbGwveFwiKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBVcGRhdGVTZXR0aW5nKHNldHRpbmcsIGFjdGlvbjogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5Qb3N0KGBTZXR0aW5nP2FjdGlvbj0ke2FjdGlvbn1gLCBzZXR0aW5nKTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==