verben-authentication-ui 1.0.3 → 1.0.4

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 (434) hide show
  1. package/esm2022/lib/components/auth-callback/auth-callback.component.mjs +57 -0
  2. package/esm2022/lib/components/auth-callback/auth-callback.module.mjs +18 -0
  3. package/esm2022/lib/components/button/button.component.mjs +46 -0
  4. package/esm2022/lib/components/button/button.module.mjs +20 -0
  5. package/esm2022/lib/components/forgot-password/ForgotPasswordData.mjs +2 -0
  6. package/esm2022/lib/components/forgot-password/forgot-password.component.mjs +89 -0
  7. package/esm2022/lib/components/forgot-password/forgot-password.module.mjs +34 -0
  8. package/esm2022/lib/components/mail/mail.component.mjs +69 -0
  9. package/esm2022/lib/components/mail/mail.module.mjs +21 -0
  10. package/esm2022/lib/components/mail-validation/mail-validation.component.mjs +108 -0
  11. package/esm2022/lib/components/mail-validation/mail-validation.module.mjs +34 -0
  12. package/esm2022/lib/components/o-auth/o-auth.component.mjs +107 -0
  13. package/esm2022/lib/components/o-auth/o-auth.module.mjs +19 -0
  14. package/esm2022/lib/components/otp-input/otp-input.component.mjs +86 -0
  15. package/esm2022/lib/components/otp-input/otp-input.module.mjs +23 -0
  16. package/esm2022/lib/components/reset-password/ResetPasswordData.mjs +2 -0
  17. package/esm2022/lib/components/reset-password/reset-password.component.mjs +108 -0
  18. package/esm2022/lib/components/reset-password/reset-password.module.mjs +34 -0
  19. package/esm2022/lib/components/role-control/ChildrenType.mjs +6 -0
  20. package/esm2022/lib/components/role-control/MappedRole.mjs +2 -0
  21. package/esm2022/lib/components/role-control/MappedRoleAction.mjs +2 -0
  22. package/esm2022/lib/components/role-control/MappedRoleContext.mjs +2 -0
  23. package/esm2022/lib/components/role-control/UIActions.mjs +7 -0
  24. package/esm2022/lib/components/role-control/UIs.mjs +40 -0
  25. package/esm2022/lib/components/role-control/base-table-style.mjs +53 -0
  26. package/esm2022/lib/components/role-control/role-control.component.mjs +1556 -0
  27. package/esm2022/lib/components/role-control/role-control.module.mjs +18 -0
  28. package/esm2022/lib/components/role-control/role-control.service.mjs +54 -0
  29. package/esm2022/lib/components/sign-in/sign-in.component.mjs +318 -0
  30. package/esm2022/lib/components/sign-in/sign-in.module.mjs +24 -0
  31. package/esm2022/lib/components/sign-up/sign-up.component.mjs +229 -0
  32. package/esm2022/lib/components/sign-up/sign-up.module.mjs +24 -0
  33. package/esm2022/lib/components/sso/base-table-style.mjs +53 -0
  34. package/esm2022/lib/components/sso/helper.mjs +16 -0
  35. package/esm2022/lib/components/sso/sso-form/sso-form.component.mjs +74 -0
  36. package/esm2022/lib/components/sso/sso.columns.mjs +29 -0
  37. package/esm2022/lib/components/sso/sso.component.mjs +236 -0
  38. package/esm2022/lib/components/sso/sso.module.mjs +63 -0
  39. package/esm2022/lib/components/two-factor-auth-otp/two-factor-auth-otp.component.mjs +209 -0
  40. package/esm2022/lib/components/two-factor-auth-otp/two-factor-auth-otp.module.mjs +22 -0
  41. package/esm2022/lib/components/two-factor-auth-setup/two-factor-auth-setup.component.mjs +90 -0
  42. package/esm2022/lib/components/two-factor-auth-setup/two-factor-auth-setup.module.mjs +19 -0
  43. package/esm2022/lib/components/user-management/base-table-style.mjs +53 -0
  44. package/esm2022/lib/components/user-management/services/user-management.service.mjs +88 -0
  45. package/esm2022/lib/components/user-management/user-management-form/use-management-form.component.mjs +71 -0
  46. package/esm2022/lib/components/user-management/user-management.columns.mjs +47 -0
  47. package/esm2022/lib/components/user-management/user-management.component.mjs +475 -0
  48. package/esm2022/lib/components/user-management/user-management.module.mjs +79 -0
  49. package/esm2022/lib/components/user-management/user-status-badge/user-status-badge.component.mjs +26 -0
  50. package/esm2022/lib/components/user-request/user-request.component.mjs +320 -0
  51. package/esm2022/lib/components/user-request/user-request.module.mjs +38 -0
  52. package/esm2022/lib/components/user-request-approval/access-request.columns.mjs +29 -0
  53. package/esm2022/lib/components/user-request-approval/base-table-style.mjs +53 -0
  54. package/esm2022/lib/components/user-request-approval/facades/user-access-request.facade.mjs +260 -0
  55. package/esm2022/lib/components/user-request-approval/helper.mjs +56 -0
  56. package/esm2022/lib/components/user-request-approval/services/user-access-request.service.mjs +93 -0
  57. package/esm2022/lib/components/user-request-approval/states/user-access-request.state.mjs +92 -0
  58. package/esm2022/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.mjs +26 -0
  59. package/esm2022/lib/components/user-request-approval/user-request-approval.component.mjs +270 -0
  60. package/esm2022/lib/components/user-request-approval/user-request-approval.module.mjs +80 -0
  61. package/esm2022/lib/components/user-request-approval/user-request-form/use-request-form.component.mjs +86 -0
  62. package/esm2022/lib/models/ApplicationRoleAction.mjs +2 -0
  63. package/esm2022/lib/models/ApplicationRoleContext.mjs +2 -0
  64. package/esm2022/lib/models/ErrorResponse.mjs +11 -0
  65. package/esm2022/lib/models/OAuthParam.mjs +2 -0
  66. package/esm2022/lib/models/OAuthType.mjs +9 -0
  67. package/esm2022/lib/models/PagedResult.mjs +2 -0
  68. package/esm2022/lib/models/PasswordRequestParam.mjs +2 -0
  69. package/esm2022/lib/models/PermissionConfig.mjs +2 -0
  70. package/esm2022/lib/models/ResponseKeyValue.mjs +2 -0
  71. package/esm2022/lib/models/Role.mjs +2 -0
  72. package/esm2022/lib/models/RoleAction.mjs +2 -0
  73. package/esm2022/lib/models/RoleContext.mjs +2 -0
  74. package/esm2022/lib/models/SearchDynamicWrapper.mjs +2 -0
  75. package/esm2022/lib/models/SearchOperator.mjs +6 -0
  76. package/esm2022/lib/models/SearchPropertySign.mjs +11 -0
  77. package/esm2022/lib/models/SearchPropertyValue.mjs +2 -0
  78. package/esm2022/lib/models/SearchPropertyValueType.mjs +11 -0
  79. package/esm2022/lib/models/SortDirection.mjs +7 -0
  80. package/esm2022/lib/models/Tag.mjs +2 -0
  81. package/esm2022/lib/models/TenantConfig.mjs +2 -0
  82. package/esm2022/lib/models/UserRequest.mjs +2 -0
  83. package/esm2022/lib/models/auth-mechanism.mjs +8 -0
  84. package/esm2022/lib/models/base.mjs +2 -0
  85. package/esm2022/lib/models/conditions.mjs +13 -0
  86. package/esm2022/lib/models/log-in.mjs +2 -0
  87. package/esm2022/lib/models/mainUser.mjs +2 -0
  88. package/esm2022/lib/models/oauth-resp.mjs +2 -0
  89. package/esm2022/lib/models/oauth-response.mjs +2 -0
  90. package/esm2022/lib/models/object-state.mjs +8 -0
  91. package/esm2022/lib/models/otpValue.mjs +2 -0
  92. package/esm2022/lib/models/paged.mjs +2 -0
  93. package/esm2022/lib/models/query-params.mjs +2 -0
  94. package/esm2022/lib/models/request-status.mjs +5 -0
  95. package/esm2022/lib/models/resend-otp-data.mjs +2 -0
  96. package/esm2022/lib/models/sign-up.mjs +2 -0
  97. package/esm2022/lib/models/single-sign-on.mjs +2 -0
  98. package/esm2022/lib/models/status.mjs +6 -0
  99. package/esm2022/lib/models/user-access-request-status.mjs +7 -0
  100. package/esm2022/lib/models/user-access-request.mjs +2 -0
  101. package/esm2022/lib/models/user.mjs +2 -0
  102. package/esm2022/lib/pipes/async-label.pipe.mjs +25 -0
  103. package/esm2022/lib/services/authorization.service.mjs +26 -0
  104. package/esm2022/lib/services/encryption.service.mjs +52 -0
  105. package/esm2022/lib/services/environment.service.mjs +26 -0
  106. package/esm2022/lib/services/http-web-request.service.mjs +85 -0
  107. package/esm2022/lib/services/label.service.mjs +134 -0
  108. package/esm2022/lib/services/util.service.mjs +55 -0
  109. package/esm2022/lib/shared/shared.module.mjs +84 -0
  110. package/esm2022/public-api.mjs +48 -0
  111. package/esm2022/verben-authentication-ui.mjs +5 -0
  112. package/fesm2022/verben-authentication-ui.mjs +6491 -0
  113. package/fesm2022/verben-authentication-ui.mjs.map +1 -0
  114. package/index.d.ts +5 -0
  115. package/lib/components/auth-callback/auth-callback.component.d.ts +17 -0
  116. package/lib/components/auth-callback/auth-callback.module.d.ts +8 -0
  117. package/lib/components/button/button.component.d.ts +17 -0
  118. package/lib/components/button/button.module.d.ts +10 -0
  119. package/{src/lib/components/forgot-password/ForgotPasswordData.ts → lib/components/forgot-password/ForgotPasswordData.d.ts} +1 -1
  120. package/lib/components/forgot-password/forgot-password.component.d.ts +29 -0
  121. package/lib/components/forgot-password/forgot-password.module.d.ts +10 -0
  122. package/lib/components/mail/mail.component.d.ts +32 -0
  123. package/lib/components/mail/mail.module.d.ts +11 -0
  124. package/lib/components/mail-validation/mail-validation.component.d.ts +42 -0
  125. package/lib/components/mail-validation/mail-validation.module.d.ts +10 -0
  126. package/lib/components/o-auth/o-auth.component.d.ts +30 -0
  127. package/lib/components/o-auth/o-auth.module.d.ts +9 -0
  128. package/lib/components/otp-input/otp-input.component.d.ts +21 -0
  129. package/lib/components/otp-input/otp-input.module.d.ts +13 -0
  130. package/lib/components/reset-password/ResetPasswordData.d.ts +5 -0
  131. package/lib/components/reset-password/reset-password.component.d.ts +30 -0
  132. package/lib/components/reset-password/reset-password.module.d.ts +10 -0
  133. package/lib/components/role-control/ChildrenType.d.ts +4 -0
  134. package/{src/lib/components/role-control/MappedRole.ts → lib/components/role-control/MappedRole.d.ts} +2 -3
  135. package/{src/lib/components/role-control/MappedRoleAction.ts → lib/components/role-control/MappedRoleAction.d.ts} +1 -2
  136. package/{src/lib/components/role-control/MappedRoleContext.ts → lib/components/role-control/MappedRoleContext.d.ts} +3 -4
  137. package/lib/components/role-control/UIActions.d.ts +5 -0
  138. package/lib/components/role-control/UIs.d.ts +38 -0
  139. package/lib/components/role-control/base-table-style.d.ts +1 -0
  140. package/lib/components/role-control/role-control.component.d.ts +123 -0
  141. package/lib/components/role-control/role-control.module.d.ts +8 -0
  142. package/lib/components/role-control/role-control.service.d.ts +9 -0
  143. package/lib/components/sign-in/sign-in.component.d.ts +95 -0
  144. package/lib/components/sign-in/sign-in.module.d.ts +13 -0
  145. package/lib/components/sign-up/sign-up.component.d.ts +68 -0
  146. package/lib/components/sign-up/sign-up.module.d.ts +13 -0
  147. package/lib/components/sso/base-table-style.d.ts +1 -0
  148. package/lib/components/sso/helper.d.ts +2 -0
  149. package/lib/components/sso/sso-form/sso-form.component.d.ts +21 -0
  150. package/lib/components/sso/sso.columns.d.ts +3 -0
  151. package/lib/components/sso/sso.component.d.ts +54 -0
  152. package/lib/components/sso/sso.module.d.ts +11 -0
  153. package/lib/components/two-factor-auth-otp/two-factor-auth-otp.component.d.ts +67 -0
  154. package/lib/components/two-factor-auth-otp/two-factor-auth-otp.module.d.ts +12 -0
  155. package/lib/components/two-factor-auth-setup/two-factor-auth-setup.component.d.ts +39 -0
  156. package/lib/components/two-factor-auth-setup/two-factor-auth-setup.module.d.ts +9 -0
  157. package/lib/components/user-management/base-table-style.d.ts +1 -0
  158. package/lib/components/user-management/services/user-management.service.d.ts +44 -0
  159. package/lib/components/user-management/user-management-form/use-management-form.component.d.ts +22 -0
  160. package/lib/components/user-management/user-management.columns.d.ts +3 -0
  161. package/lib/components/user-management/user-management.component.d.ts +123 -0
  162. package/lib/components/user-management/user-management.module.d.ts +14 -0
  163. package/lib/components/user-management/user-status-badge/user-status-badge.component.d.ts +12 -0
  164. package/lib/components/user-request/user-request.component.d.ts +80 -0
  165. package/lib/components/user-request/user-request.module.d.ts +11 -0
  166. package/lib/components/user-request-approval/access-request.columns.d.ts +3 -0
  167. package/lib/components/user-request-approval/base-table-style.d.ts +1 -0
  168. package/lib/components/user-request-approval/facades/user-access-request.facade.d.ts +39 -0
  169. package/lib/components/user-request-approval/helper.d.ts +7 -0
  170. package/lib/components/user-request-approval/services/user-access-request.service.d.ts +65 -0
  171. package/lib/components/user-request-approval/states/user-access-request.state.d.ts +35 -0
  172. package/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.d.ts +12 -0
  173. package/lib/components/user-request-approval/user-request-approval.component.d.ts +69 -0
  174. package/lib/components/user-request-approval/user-request-approval.module.d.ts +12 -0
  175. package/lib/components/user-request-approval/user-request-form/use-request-form.component.d.ts +25 -0
  176. package/lib/models/ApplicationRoleAction.d.ts +9 -0
  177. package/{src/lib/models/ApplicationRoleContext copy.ts → lib/models/ApplicationRoleContext.d.ts} +5 -6
  178. package/lib/models/ErrorResponse.d.ts +6 -0
  179. package/lib/models/OAuthParam.d.ts +9 -0
  180. package/lib/models/OAuthType.d.ts +7 -0
  181. package/lib/models/PagedResult.d.ts +9 -0
  182. package/lib/models/PasswordRequestParam.d.ts +5 -0
  183. package/{src/lib/models/PermissionConfig.ts → lib/models/PermissionConfig.d.ts} +3 -4
  184. package/lib/models/ResponseKeyValue.d.ts +5 -0
  185. package/{src/lib/models/Role.ts → lib/models/Role.d.ts} +5 -6
  186. package/lib/models/RoleAction.d.ts +10 -0
  187. package/lib/models/RoleContext.d.ts +10 -0
  188. package/{src/lib/models/SearchDynamicWrapper.ts → lib/models/SearchDynamicWrapper.d.ts} +2 -3
  189. package/lib/models/SearchOperator.d.ts +4 -0
  190. package/lib/models/SearchPropertySign.d.ts +9 -0
  191. package/{src/lib/models/SearchPropertyValue.ts → lib/models/SearchPropertyValue.d.ts} +6 -7
  192. package/lib/models/SearchPropertyValueType.d.ts +9 -0
  193. package/lib/models/SortDirection.d.ts +5 -0
  194. package/{src/lib/models/Tag.ts → lib/models/Tag.d.ts} +3 -4
  195. package/lib/models/TenantConfig.d.ts +18 -0
  196. package/lib/models/UserRequest.d.ts +32 -0
  197. package/lib/models/auth-mechanism.d.ts +14 -0
  198. package/lib/models/base.d.ts +12 -0
  199. package/lib/models/conditions.d.ts +11 -0
  200. package/lib/models/log-in.d.ts +8 -0
  201. package/{src/lib/models/mainUser.ts → lib/models/mainUser.d.ts} +2 -3
  202. package/lib/models/oauth-resp.d.ts +6 -0
  203. package/{src/lib/models/oauth-response.ts → lib/models/oauth-response.d.ts} +1 -1
  204. package/lib/models/object-state.d.ts +6 -0
  205. package/{src/lib/models/otpValue.ts → lib/models/otpValue.d.ts} +2 -4
  206. package/lib/models/paged.d.ts +9 -0
  207. package/lib/models/query-params.d.ts +8 -0
  208. package/lib/models/request-status.d.ts +3 -0
  209. package/lib/models/resend-otp-data.d.ts +8 -0
  210. package/lib/models/sign-up.d.ts +9 -0
  211. package/lib/models/single-sign-on.d.ts +7 -0
  212. package/lib/models/status.d.ts +4 -0
  213. package/lib/models/user-access-request-status.d.ts +5 -0
  214. package/{src/lib/models/user-access-request.ts → lib/models/user-access-request.d.ts} +4 -5
  215. package/lib/models/user.d.ts +18 -0
  216. package/lib/pipes/async-label.pipe.d.ts +11 -0
  217. package/lib/services/authorization.service.d.ts +14 -0
  218. package/lib/services/encryption.service.d.ts +13 -0
  219. package/lib/services/environment.service.d.ts +22 -0
  220. package/lib/services/http-web-request.service.d.ts +23 -0
  221. package/lib/services/label.service.d.ts +15 -0
  222. package/lib/services/util.service.d.ts +11 -0
  223. package/lib/shared/shared.module.d.ts +10 -0
  224. package/package.json +15 -10
  225. package/{src/public-api.ts → public-api.d.ts} +0 -24
  226. package/ng-package.json +0 -8
  227. package/src/lib/base/base-data.component.ts +0 -86
  228. package/src/lib/base/base-data.facade.ts +0 -157
  229. package/src/lib/base/base-data.service.ts +0 -49
  230. package/src/lib/base/base-data.state.ts +0 -94
  231. package/src/lib/base/models.ts +0 -14
  232. package/src/lib/components/auth-callback/auth-callback.component.css +0 -30
  233. package/src/lib/components/auth-callback/auth-callback.component.html +0 -6
  234. package/src/lib/components/auth-callback/auth-callback.component.spec.ts +0 -23
  235. package/src/lib/components/auth-callback/auth-callback.component.ts +0 -56
  236. package/src/lib/components/auth-callback/auth-callback.module.ts +0 -10
  237. package/src/lib/components/button/button.component.css +0 -3
  238. package/src/lib/components/button/button.component.html +0 -13
  239. package/src/lib/components/button/button.component.spec.ts +0 -23
  240. package/src/lib/components/button/button.component.ts +0 -24
  241. package/src/lib/components/button/button.module.ts +0 -11
  242. package/src/lib/components/forgot-password/forgot-password.component.css +0 -46
  243. package/src/lib/components/forgot-password/forgot-password.component.html +0 -19
  244. package/src/lib/components/forgot-password/forgot-password.component.spec.ts +0 -23
  245. package/src/lib/components/forgot-password/forgot-password.component.ts +0 -88
  246. package/src/lib/components/forgot-password/forgot-password.module.ts +0 -18
  247. package/src/lib/components/mail/mail.component.css +0 -0
  248. package/src/lib/components/mail/mail.component.html +0 -11
  249. package/src/lib/components/mail/mail.component.spec.ts +0 -23
  250. package/src/lib/components/mail/mail.component.ts +0 -47
  251. package/src/lib/components/mail/mail.module.ts +0 -13
  252. package/src/lib/components/mail-validation/mail-validation.component.css +0 -59
  253. package/src/lib/components/mail-validation/mail-validation.component.html +0 -37
  254. package/src/lib/components/mail-validation/mail-validation.component.spec.ts +0 -23
  255. package/src/lib/components/mail-validation/mail-validation.component.ts +0 -66
  256. package/src/lib/components/mail-validation/mail-validation.module.ts +0 -18
  257. package/src/lib/components/o-auth/o-auth.component.css +0 -26
  258. package/src/lib/components/o-auth/o-auth.component.html +0 -26
  259. package/src/lib/components/o-auth/o-auth.component.spec.ts +0 -23
  260. package/src/lib/components/o-auth/o-auth.component.ts +0 -115
  261. package/src/lib/components/o-auth/o-auth.module.ts +0 -11
  262. package/src/lib/components/otp-input/otp-input.component.css +0 -19
  263. package/src/lib/components/otp-input/otp-input.component.html +0 -15
  264. package/src/lib/components/otp-input/otp-input.component.spec.ts +0 -23
  265. package/src/lib/components/otp-input/otp-input.component.ts +0 -88
  266. package/src/lib/components/otp-input/otp-input.module.ts +0 -15
  267. package/src/lib/components/reset-password/ResetPasswordData.ts +0 -5
  268. package/src/lib/components/reset-password/reset-password.component.css +0 -29
  269. package/src/lib/components/reset-password/reset-password.component.html +0 -24
  270. package/src/lib/components/reset-password/reset-password.component.spec.ts +0 -23
  271. package/src/lib/components/reset-password/reset-password.component.ts +0 -108
  272. package/src/lib/components/reset-password/reset-password.module.ts +0 -18
  273. package/src/lib/components/role-control/ChildrenType.ts +0 -4
  274. package/src/lib/components/role-control/UIActions.ts +0 -5
  275. package/src/lib/components/role-control/UIs.ts +0 -38
  276. package/src/lib/components/role-control/base-table-style.ts +0 -52
  277. package/src/lib/components/role-control/role-control.component.css +0 -55
  278. package/src/lib/components/role-control/role-control.component.html +0 -571
  279. package/src/lib/components/role-control/role-control.component.spec.ts +0 -23
  280. package/src/lib/components/role-control/role-control.component.ts +0 -1817
  281. package/src/lib/components/role-control/role-control.module.ts +0 -10
  282. package/src/lib/components/role-control/role-control.service.spec.ts +0 -16
  283. package/src/lib/components/role-control/role-control.service.ts +0 -53
  284. package/src/lib/components/sign-in/sign-in.component.css +0 -21
  285. package/src/lib/components/sign-in/sign-in.component.html +0 -83
  286. package/src/lib/components/sign-in/sign-in.component.spec.ts +0 -23
  287. package/src/lib/components/sign-in/sign-in.component.ts +0 -267
  288. package/src/lib/components/sign-in/sign-in.module.ts +0 -17
  289. package/src/lib/components/sign-up/sign-up.component.css +0 -36
  290. package/src/lib/components/sign-up/sign-up.component.html +0 -132
  291. package/src/lib/components/sign-up/sign-up.component.spec.ts +0 -23
  292. package/src/lib/components/sign-up/sign-up.component.ts +0 -180
  293. package/src/lib/components/sign-up/sign-up.module.ts +0 -15
  294. package/src/lib/components/sso/base-table-style.ts +0 -52
  295. package/src/lib/components/sso/helper.ts +0 -17
  296. package/src/lib/components/sso/sso-form/sso-form.component.css +0 -13
  297. package/src/lib/components/sso/sso-form/sso-form.component.html +0 -109
  298. package/src/lib/components/sso/sso-form/sso-form.component.spec.ts +0 -23
  299. package/src/lib/components/sso/sso-form/sso-form.component.ts +0 -70
  300. package/src/lib/components/sso/sso.columns.ts +0 -32
  301. package/src/lib/components/sso/sso.component.css +0 -47
  302. package/src/lib/components/sso/sso.component.html +0 -208
  303. package/src/lib/components/sso/sso.component.spec.ts +0 -23
  304. package/src/lib/components/sso/sso.component.ts +0 -261
  305. package/src/lib/components/sso/sso.module.ts +0 -40
  306. package/src/lib/components/two-factor-auth-otp/two-factor-auth-otp.component.css +0 -8
  307. package/src/lib/components/two-factor-auth-otp/two-factor-auth-otp.component.html +0 -30
  308. package/src/lib/components/two-factor-auth-otp/two-factor-auth-otp.component.spec.ts +0 -23
  309. package/src/lib/components/two-factor-auth-otp/two-factor-auth-otp.component.ts +0 -155
  310. package/src/lib/components/two-factor-auth-otp/two-factor-auth-otp.module.ts +0 -15
  311. package/src/lib/components/two-factor-auth-setup/two-factor-auth-setup.component.css +0 -17
  312. package/src/lib/components/two-factor-auth-setup/two-factor-auth-setup.component.html +0 -45
  313. package/src/lib/components/two-factor-auth-setup/two-factor-auth-setup.component.spec.ts +0 -23
  314. package/src/lib/components/two-factor-auth-setup/two-factor-auth-setup.component.ts +0 -57
  315. package/src/lib/components/two-factor-auth-setup/two-factor-auth-setup.module.ts +0 -11
  316. package/src/lib/components/user-management/base-table-style.ts +0 -52
  317. package/src/lib/components/user-management/facades/user-management.facades.ts +0 -133
  318. package/src/lib/components/user-management/helper.ts +0 -38
  319. package/src/lib/components/user-management/index.ts +0 -4
  320. package/src/lib/components/user-management/services/user-management.service.spec.ts +0 -16
  321. package/src/lib/components/user-management/services/user-management.service.ts +0 -111
  322. package/src/lib/components/user-management/states/user-management.state.ts +0 -65
  323. package/src/lib/components/user-management/user-management-form/use-management-form.component.ts +0 -73
  324. package/src/lib/components/user-management/user-management-form/user-management-form.component.css +0 -0
  325. package/src/lib/components/user-management/user-management-form/user-management-form.component.html +0 -80
  326. package/src/lib/components/user-management/user-management-form/user-management-form.component.spec.ts +0 -23
  327. package/src/lib/components/user-management/user-management.columns.ts +0 -51
  328. package/src/lib/components/user-management/user-management.component.css +0 -31
  329. package/src/lib/components/user-management/user-management.component.html +0 -319
  330. package/src/lib/components/user-management/user-management.component.spec.ts +0 -23
  331. package/src/lib/components/user-management/user-management.component.ts +0 -604
  332. package/src/lib/components/user-management/user-management.module.ts +0 -56
  333. package/src/lib/components/user-management/user-status-badge/user-status-badge.component.css +0 -0
  334. package/src/lib/components/user-management/user-status-badge/user-status-badge.component.html +0 -8
  335. package/src/lib/components/user-management/user-status-badge/user-status-badge.component.spec.ts +0 -22
  336. package/src/lib/components/user-management/user-status-badge/user-status-badge.component.ts +0 -22
  337. package/src/lib/components/user-request/user-request.component.css +0 -91
  338. package/src/lib/components/user-request/user-request.component.html +0 -137
  339. package/src/lib/components/user-request/user-request.component.spec.ts +0 -23
  340. package/src/lib/components/user-request/user-request.component.ts +0 -306
  341. package/src/lib/components/user-request/user-request.module.ts +0 -20
  342. package/src/lib/components/user-request-approval/access-request.columns.ts +0 -31
  343. package/src/lib/components/user-request-approval/base-table-style.ts +0 -52
  344. package/src/lib/components/user-request-approval/facades/user-access-request.facade.ts +0 -324
  345. package/src/lib/components/user-request-approval/helper.ts +0 -61
  346. package/src/lib/components/user-request-approval/services/user-access-request.service.spec.ts +0 -16
  347. package/src/lib/components/user-request-approval/services/user-access-request.service.ts +0 -122
  348. package/src/lib/components/user-request-approval/states/user-access-request.state.ts +0 -109
  349. package/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.css +0 -0
  350. package/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.html +0 -8
  351. package/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.spec.ts +0 -23
  352. package/src/lib/components/user-request-approval/user-access-request-status-badge/user-access-request-status-badge.component.ts +0 -22
  353. package/src/lib/components/user-request-approval/user-request-approval.component.css +0 -6
  354. package/src/lib/components/user-request-approval/user-request-approval.component.html +0 -269
  355. package/src/lib/components/user-request-approval/user-request-approval.component.spec.ts +0 -23
  356. package/src/lib/components/user-request-approval/user-request-approval.component.ts +0 -326
  357. package/src/lib/components/user-request-approval/user-request-approval.module.ts +0 -54
  358. package/src/lib/components/user-request-approval/user-request-form/use-request-form.component.ts +0 -98
  359. package/src/lib/components/user-request-approval/user-request-form/user-request-form.component.css +0 -0
  360. package/src/lib/components/user-request-approval/user-request-form/user-request-form.component.html +0 -94
  361. package/src/lib/components/user-request-approval/user-request-form/user-request-form.component.spec.ts +0 -23
  362. package/src/lib/components/user-request-process/user-request-process.component.css +0 -0
  363. package/src/lib/components/user-request-process/user-request-process.component.html +0 -1
  364. package/src/lib/components/user-request-process/user-request-process.component.spec.ts +0 -23
  365. package/src/lib/components/user-request-process/user-request-process.component.ts +0 -12
  366. package/src/lib/components/user-request-process/user-request-process.module.ts +0 -12
  367. package/src/lib/models/ApplicationRoleAction.ts +0 -10
  368. package/src/lib/models/ApplicationRoleContext.ts +0 -10
  369. package/src/lib/models/ErrorResponse.ts +0 -7
  370. package/src/lib/models/FilterTypes.ts +0 -8
  371. package/src/lib/models/MailConfig.ts +0 -13
  372. package/src/lib/models/MessageConfig.ts +0 -5
  373. package/src/lib/models/MessageMedium.ts +0 -4
  374. package/src/lib/models/OAuthParam.ts +0 -10
  375. package/src/lib/models/OAuthType.ts +0 -7
  376. package/src/lib/models/PagedResult.ts +0 -9
  377. package/src/lib/models/PasswordRequestParam.ts +0 -5
  378. package/src/lib/models/PeriodMode.ts +0 -10
  379. package/src/lib/models/ReportSchedule.ts +0 -23
  380. package/src/lib/models/ReportType.ts +0 -5
  381. package/src/lib/models/ResponseKeyValue.ts +0 -5
  382. package/src/lib/models/RoleAction.ts +0 -11
  383. package/src/lib/models/RoleContext.ts +0 -11
  384. package/src/lib/models/SMSConfig.ts +0 -11
  385. package/src/lib/models/SearchOperator.ts +0 -4
  386. package/src/lib/models/SearchPropertySign.ts +0 -9
  387. package/src/lib/models/SearchPropertyValueType.ts +0 -9
  388. package/src/lib/models/SortDirection.ts +0 -5
  389. package/src/lib/models/TaskNotification.ts +0 -14
  390. package/src/lib/models/TaskNotificationMessageType.ts +0 -4
  391. package/src/lib/models/TaskNotificationType.ts +0 -4
  392. package/src/lib/models/Tenant.ts +0 -22
  393. package/src/lib/models/TenantConfig.ts +0 -19
  394. package/src/lib/models/UserRequest.ts +0 -38
  395. package/src/lib/models/auth-mechanism.ts +0 -15
  396. package/src/lib/models/base.ts +0 -13
  397. package/src/lib/models/conditions.ts +0 -11
  398. package/src/lib/models/log-in.ts +0 -8
  399. package/src/lib/models/oauth-resp.ts +0 -6
  400. package/src/lib/models/object-state.ts +0 -6
  401. package/src/lib/models/paged.ts +0 -9
  402. package/src/lib/models/query-params.ts +0 -9
  403. package/src/lib/models/request-status.ts +0 -4
  404. package/src/lib/models/resend-otp-data.ts +0 -8
  405. package/src/lib/models/resource.ts +0 -27
  406. package/src/lib/models/sign-up.ts +0 -11
  407. package/src/lib/models/single-sign-on.ts +0 -9
  408. package/src/lib/models/status.ts +0 -5
  409. package/src/lib/models/user-access-request-status.ts +0 -5
  410. package/src/lib/models/user-object-state.ts +0 -6
  411. package/src/lib/models/user.ts +0 -19
  412. package/src/lib/pipes/async-label.pipe.spec.ts +0 -8
  413. package/src/lib/pipes/async-label.pipe.ts +0 -20
  414. package/src/lib/services/authorization.service.spec.ts +0 -16
  415. package/src/lib/services/authorization.service.ts +0 -24
  416. package/src/lib/services/encryption.service.ts +0 -57
  417. package/src/lib/services/environment.service.spec.ts +0 -16
  418. package/src/lib/services/environment.service.ts +0 -30
  419. package/src/lib/services/http-web-request.service.spec.ts +0 -16
  420. package/src/lib/services/http-web-request.service.ts +0 -114
  421. package/src/lib/services/label.service.spec.ts +0 -16
  422. package/src/lib/services/label.service.ts +0 -177
  423. package/src/lib/services/util.service.spec.ts +0 -16
  424. package/src/lib/services/util.service.ts +0 -49
  425. package/src/lib/shared/shared.module.ts +0 -55
  426. package/src/styles.css +0 -96
  427. package/src/theme/tailwind-setup.css +0 -3
  428. package/src/theme/tailwind.css +0 -1030
  429. package/src/utils/components/base-data-view.component.ts +0 -131
  430. package/src/utils/models/DataViewConfig.ts +0 -19
  431. package/tailwind.config.js +0 -20
  432. package/tsconfig.lib.json +0 -15
  433. package/tsconfig.lib.prod.json +0 -11
  434. package/tsconfig.spec.json +0 -15
@@ -0,0 +1,1556 @@
1
+ import { Component, Input, ViewChild, ViewChildren, } from '@angular/core';
2
+ import { DataFilterType, } from 'verben-ng-ui';
3
+ import { baseStyle } from './base-table-style';
4
+ import { ObjectState } from '../../models/object-state';
5
+ import { UIs } from './UIs';
6
+ import { UIActions } from './UIActions';
7
+ import { ChildrenType } from './ChildrenType';
8
+ import { ErrorResponse } from '../../models/ErrorResponse';
9
+ import { SearchOperator } from '../../models/SearchOperator';
10
+ import { SearchPropertySign } from '../../models/SearchPropertySign';
11
+ import { SearchPropertyValueType } from '../../models/SearchPropertyValueType';
12
+ import { debounceTime, Subject } from 'rxjs';
13
+ import { SortDirection } from '../../models/SortDirection';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "../../services/authorization.service";
16
+ import * as i2 from "./role-control.service";
17
+ import * as i3 from "../../services/util.service";
18
+ import * as i4 from "../../services/http-web-request.service";
19
+ import * as i5 from "@angular/forms";
20
+ import * as i6 from "../../services/environment.service";
21
+ import * as i7 from "@angular/common";
22
+ import * as i8 from "verben-ng-ui";
23
+ var DateFilterTypes;
24
+ (function (DateFilterTypes) {
25
+ DateFilterTypes["Before"] = "LT";
26
+ DateFilterTypes["On"] = "EQ";
27
+ DateFilterTypes["After"] = "GT";
28
+ })(DateFilterTypes || (DateFilterTypes = {}));
29
+ export class RoleControlComponent {
30
+ authService;
31
+ roleControlSvc;
32
+ utilService;
33
+ server;
34
+ cdr;
35
+ fb;
36
+ envSvc;
37
+ visibleColumnDef = [];
38
+ styles = baseStyle;
39
+ data = [];
40
+ cardData = [];
41
+ currentData = null;
42
+ currentExpandedCard = null;
43
+ cardContext = null;
44
+ cardContextHistory = [];
45
+ cardContextHistoryData = [];
46
+ cardDataView;
47
+ dataView;
48
+ popUps;
49
+ tableView;
50
+ isGlobal = true;
51
+ serviceName = null;
52
+ application = null;
53
+ pageSize = 10;
54
+ searchDebounceTime = 500;
55
+ permissionConfig = null;
56
+ pageState = null;
57
+ sourceData = [];
58
+ isOpen = false;
59
+ openDropdownId = null;
60
+ currentFilters = [];
61
+ currentSorts = [];
62
+ searchTerm$ = new Subject();
63
+ visibleColumns = [];
64
+ filterArray = [
65
+ {
66
+ name: 'CreatedAt',
67
+ type: DataFilterType.Date,
68
+ checked: false,
69
+ },
70
+ {
71
+ name: 'UpdatedAt',
72
+ type: DataFilterType.Date,
73
+ checked: false,
74
+ },
75
+ ];
76
+ sortOptions = [
77
+ {
78
+ name: 'CreatedAt',
79
+ type: DataFilterType.Date,
80
+ checked: false,
81
+ },
82
+ {
83
+ name: 'UpdatedAt',
84
+ type: DataFilterType.Date,
85
+ checked: false,
86
+ },
87
+ ];
88
+ // private _searchItem: string = '';
89
+ // get searchItem(): string {
90
+ // return this._searchItem
91
+ // }
92
+ // set searchItem(value: string) {
93
+ // this._searchItem = value;
94
+ // this.searchTerm$.next(value);
95
+ // }
96
+ // form: FormGroup;
97
+ childPermissionRef = ChildrenType.Permission;
98
+ roleContextsStore = [];
99
+ roleActionsStore = [];
100
+ currentSearchTerm = '';
101
+ constructor(authService, roleControlSvc, utilService, server, cdr, fb, envSvc) {
102
+ this.authService = authService;
103
+ this.roleControlSvc = roleControlSvc;
104
+ this.utilService = utilService;
105
+ this.server = server;
106
+ this.cdr = cdr;
107
+ this.fb = fb;
108
+ this.envSvc = envSvc;
109
+ this.visibleColumnDef = roleControlSvc.roleColumns;
110
+ this.visibleColumns = roleControlSvc.roleColumns.map((col) => ({
111
+ checked: true,
112
+ name: typeof col.header === 'string' ? col.header : col.id,
113
+ type: DataFilterType.Bool,
114
+ }));
115
+ // this.form = this.fb.group({
116
+ // Name: new FormControl<string | null>(null, Validators.required),
117
+ // });
118
+ }
119
+ async ngOnInit() {
120
+ const mockData = this.getMockRoles();
121
+ const roles = await this.getAllRoles();
122
+ if (this.isGlobal) {
123
+ const contextsRes = await this.getSavedContexts();
124
+ if (contextsRes) {
125
+ this.roleContextsStore = contextsRes;
126
+ this.roleActionsStore = contextsRes.flatMap((x) => x.RoleActions);
127
+ const authConfig = contextsRes.map((x) => {
128
+ return {
129
+ Name: x.Name,
130
+ Actions: x.RoleActions.map((y) => {
131
+ return y.Name;
132
+ }),
133
+ };
134
+ });
135
+ this.sourceData = authConfig;
136
+ }
137
+ }
138
+ else {
139
+ this.sourceData = this.authService.authorizationConfig;
140
+ }
141
+ if (roles) {
142
+ this.setUpMappedData(roles);
143
+ this.setUpCardData();
144
+ }
145
+ this.searchTerm$
146
+ .pipe(debounceTime(this.searchDebounceTime)) // Adjust debounce time here (in ms)
147
+ .subscribe(async (searchTerm) => {
148
+ this.currentSearchTerm = searchTerm;
149
+ this.updateFiltersAndSorts(true);
150
+ });
151
+ }
152
+ async getSavedContexts() {
153
+ if (!this.isGlobal || !this.application) {
154
+ return undefined;
155
+ }
156
+ var payload = [
157
+ {
158
+ PropertyName: 'Application',
159
+ EntityValue: this.application,
160
+ Operator: SearchOperator.And,
161
+ Sign: SearchPropertySign.EQ,
162
+ },
163
+ // {
164
+ // PropertyName: 'APIKey',
165
+ // EntityValue: this.envSvc.environment.APIKey,
166
+ // Operator: SearchOperator.And,
167
+ // Sign: SearchPropertySign.EQ,
168
+ // },
169
+ ];
170
+ this.utilService.sendBI(true);
171
+ const res = await this.server.post(`Application/SearchApplicationRoleContexts/0/0`, payload);
172
+ this.utilService.sendBI(false);
173
+ if (res instanceof ErrorResponse) {
174
+ return undefined;
175
+ }
176
+ else {
177
+ var result = res.Result;
178
+ return result;
179
+ }
180
+ }
181
+ async getAllRoles() {
182
+ // var payload: SearchPropertyValue[] = [
183
+ // {
184
+ // PropertyName: 'APIKey',
185
+ // EntityValue: this.envSvc.environment.APIKey,
186
+ // Operator: SearchOperator.And,
187
+ // Sign: SearchPropertySign.EQ
188
+ // }
189
+ // ]
190
+ this.utilService.sendBI(true);
191
+ const res = await this.server.get(`Role/GetRoles/0/${this.pageSize}`);
192
+ this.utilService.sendBI(false);
193
+ if (res instanceof ErrorResponse) {
194
+ return undefined;
195
+ }
196
+ else {
197
+ this.pageState = res;
198
+ var result = res.Result;
199
+ return result;
200
+ }
201
+ }
202
+ async loadMore() {
203
+ if (!this.pageState) {
204
+ return;
205
+ }
206
+ this.utilService.sendBI(true);
207
+ const res = this.currentFilters.length > 0 ||
208
+ this.currentSorts.length > 0 ||
209
+ this.currentSearchTerm.trim().length > 0
210
+ ? await this.loadMoreFiltersAndSorts()
211
+ : await this.server.get(`Role/GetRoles/${this.pageState.Skip}/${this.pageSize}`);
212
+ this.utilService.sendBI(false);
213
+ if (res instanceof ErrorResponse) {
214
+ return;
215
+ }
216
+ else {
217
+ this.pageState = res;
218
+ var result = res.Result;
219
+ const data = this.setUpMappedDataExtra(result);
220
+ this.data = this.data.concat(data);
221
+ this.setUpCardDataExtra(data);
222
+ }
223
+ }
224
+ getApplicationContextCode(name) {
225
+ const item = this.roleContextsStore.find((x) => x.Name == name);
226
+ return item ? item.Code : '';
227
+ }
228
+ getApplicationActionCode(name) {
229
+ const item = this.roleActionsStore.find((x) => x.Name == name);
230
+ return item ? item.Code : '';
231
+ }
232
+ findParent(cardData, target) {
233
+ for (const item of cardData) {
234
+ if (item.children.includes(target)) {
235
+ return item; // Immediate parent found
236
+ }
237
+ const parent = this.findParent(item.children, target);
238
+ if (parent) {
239
+ return parent;
240
+ }
241
+ }
242
+ return null; // Not found
243
+ }
244
+ isAllSelected(item) {
245
+ const parent = this.cardContextHistoryData.length > 0
246
+ ? this.findParent(this.cardContextHistoryData[0], item)
247
+ : this.findParent(this.cardData, item);
248
+ if (parent &&
249
+ parent.data.ChildrenType &&
250
+ parent.data.ChildrenType == ChildrenType.Action &&
251
+ parent.data.RoleActions.some((y) => !y.Selected)) {
252
+ return false;
253
+ }
254
+ if (parent &&
255
+ parent.data.ChildrenType &&
256
+ parent.data.ChildrenType == ChildrenType.Permission &&
257
+ parent.data.RoleContexts.some((y) => !y.Selected)) {
258
+ return false;
259
+ }
260
+ return true;
261
+ }
262
+ isCheckboxDisabled(item) {
263
+ const parent = this.cardContextHistoryData.length > 0
264
+ ? this.findParent(this.cardContextHistoryData[0], item)
265
+ : this.findParent(this.cardData, item);
266
+ if (parent &&
267
+ parent.data.ChildrenType &&
268
+ parent.data.ChildrenType == ChildrenType.Action &&
269
+ (parent.data.Selected == false ||
270
+ (this.permissionConfig != null &&
271
+ !this.permissionConfig.Actions['AddAction']))) {
272
+ return true;
273
+ }
274
+ if (parent &&
275
+ parent.data.ChildrenType &&
276
+ parent.data.ChildrenType == ChildrenType.Permission &&
277
+ this.permissionConfig != null &&
278
+ !this.permissionConfig.Actions['AddContext']) {
279
+ return true;
280
+ }
281
+ return false;
282
+ }
283
+ setUpMappedData(data) {
284
+ this.data = data.map((x) => {
285
+ return {
286
+ ...x,
287
+ Id: x.Code,
288
+ ChildrenType: ChildrenType.Permission,
289
+ RoleContexts: this.sourceData.map((config) => {
290
+ const existingId = x.RoleContexts.findIndex((y) => y.Name == config.Name);
291
+ var context = {
292
+ ChildrenType: ChildrenType.Action,
293
+ Selected: existingId > -1 ? true : false,
294
+ RoleActions: config.Actions.map((action) => {
295
+ const existingAction = existingId > -1
296
+ ? x.RoleContexts[existingId].RoleActions.findIndex((c) => c.Name == action)
297
+ : -1;
298
+ var act = {
299
+ Selected: existingAction > -1 ? true : false,
300
+ Name: action,
301
+ Role: x.Code,
302
+ Context: '',
303
+ id: existingAction > -1
304
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
305
+ .Code
306
+ : '',
307
+ Id: existingAction > -1
308
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
309
+ .Code
310
+ : '',
311
+ CreatedAt: new Date(),
312
+ UpdatedAt: new Date(),
313
+ DataState: ObjectState.New,
314
+ TenantId: x.TenantId,
315
+ Code: existingAction > -1
316
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
317
+ .Code
318
+ : '',
319
+ ServiceName: existingAction > -1
320
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
321
+ .ServiceName
322
+ : '',
323
+ APIKey: existingAction > -1
324
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
325
+ .APIKey
326
+ : this.envSvc.environment.APIKey,
327
+ ApplicationRoleAction: this.getApplicationActionCode(action),
328
+ };
329
+ return act;
330
+ }),
331
+ Name: config.Name,
332
+ Role: x.Code,
333
+ id: existingId > -1 ? x.RoleContexts[existingId].Code : '',
334
+ Id: existingId > -1 ? x.RoleContexts[existingId].Code : '',
335
+ CreatedAt: new Date(),
336
+ UpdatedAt: new Date(),
337
+ DataState: ObjectState.New,
338
+ TenantId: x.TenantId,
339
+ Code: existingId > -1 ? x.RoleContexts[existingId].Code : '',
340
+ ServiceName: existingId > -1 ? x.RoleContexts[existingId].ServiceName : '',
341
+ APIKey: existingId > -1
342
+ ? x.RoleContexts[existingId].APIKey
343
+ : this.envSvc.environment.APIKey,
344
+ ApplicationRoleContext: this.getApplicationContextCode(config.Name),
345
+ };
346
+ return context;
347
+ }),
348
+ };
349
+ });
350
+ }
351
+ setUpMappedDataExtra(data) {
352
+ return data.map((x) => {
353
+ return {
354
+ ...x,
355
+ Id: x.Code,
356
+ ChildrenType: ChildrenType.Permission,
357
+ RoleContexts: this.sourceData.map((config) => {
358
+ const existingId = x.RoleContexts.findIndex((y) => y.Name == config.Name);
359
+ var context = {
360
+ ChildrenType: ChildrenType.Action,
361
+ Selected: existingId > -1 ? true : false,
362
+ RoleActions: config.Actions.map((action) => {
363
+ const existingAction = existingId > -1
364
+ ? x.RoleContexts[existingId].RoleActions.findIndex((c) => c.Name == action)
365
+ : -1;
366
+ var act = {
367
+ Selected: existingAction > -1 ? true : false,
368
+ Name: action,
369
+ Role: x.Code,
370
+ Context: '',
371
+ id: existingAction > -1
372
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
373
+ .Code
374
+ : '',
375
+ Id: existingAction > -1
376
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
377
+ .Code
378
+ : '',
379
+ CreatedAt: new Date(),
380
+ UpdatedAt: new Date(),
381
+ DataState: ObjectState.New,
382
+ TenantId: x.TenantId,
383
+ Code: existingAction > -1
384
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
385
+ .Code
386
+ : '',
387
+ ServiceName: existingAction > -1
388
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
389
+ .ServiceName
390
+ : '',
391
+ APIKey: existingAction > -1
392
+ ? x.RoleContexts[existingId].RoleActions[existingAction]
393
+ .APIKey
394
+ : this.envSvc.environment.APIKey,
395
+ ApplicationRoleAction: this.getApplicationActionCode(action),
396
+ };
397
+ return act;
398
+ }),
399
+ Name: config.Name,
400
+ Role: x.Code,
401
+ id: existingId > -1 ? x.RoleContexts[existingId].Code : '',
402
+ Id: existingId > -1 ? x.RoleContexts[existingId].Code : '',
403
+ CreatedAt: new Date(),
404
+ UpdatedAt: new Date(),
405
+ DataState: ObjectState.New,
406
+ TenantId: x.TenantId,
407
+ Code: existingId > -1 ? x.RoleContexts[existingId].Code : '',
408
+ ServiceName: existingId > -1 ? x.RoleContexts[existingId].ServiceName : '',
409
+ APIKey: existingId > -1
410
+ ? x.RoleContexts[existingId].APIKey
411
+ : this.envSvc.environment.APIKey,
412
+ ApplicationRoleContext: this.getApplicationContextCode(config.Name),
413
+ };
414
+ return context;
415
+ }),
416
+ };
417
+ });
418
+ }
419
+ setUpCardData() {
420
+ const cardData = this.data.map((x) => {
421
+ return {
422
+ selected: false,
423
+ title: x.Name,
424
+ data: x,
425
+ body: [],
426
+ children: x.RoleContexts.map((c) => {
427
+ return {
428
+ selected: false,
429
+ title: this.getFormattedName(c.Name),
430
+ data: c,
431
+ body: [],
432
+ children: c.RoleActions.map((a) => {
433
+ return {
434
+ selected: false,
435
+ title: this.getFormattedName(a.Name),
436
+ data: a,
437
+ body: [],
438
+ children: [],
439
+ };
440
+ }),
441
+ };
442
+ }),
443
+ };
444
+ });
445
+ this.cardData = cardData;
446
+ }
447
+ setUpCardDataExtra(baseData) {
448
+ const cardData = baseData.map((x) => {
449
+ return {
450
+ selected: false,
451
+ title: x.Name,
452
+ data: x,
453
+ body: [],
454
+ children: x.RoleContexts.map((c) => {
455
+ return {
456
+ selected: false,
457
+ title: this.getFormattedName(c.Name),
458
+ data: c,
459
+ body: [],
460
+ children: c.RoleActions.map((a) => {
461
+ return {
462
+ selected: false,
463
+ title: this.getFormattedName(a.Name),
464
+ data: a,
465
+ body: [],
466
+ children: [],
467
+ };
468
+ }),
469
+ };
470
+ }),
471
+ };
472
+ });
473
+ this.cardData = this.cardData.concat(cardData);
474
+ }
475
+ getFormattedName(name) {
476
+ // Split the key on capital letters, handling "And" as lowercase
477
+ const words = name
478
+ .split(/(?=[A-Z])/)
479
+ .map((word) => (word === 'And' ? 'and' : word));
480
+ // Join the words with spaces
481
+ return words.join(' ');
482
+ }
483
+ viewDetailsFromTable(data) {
484
+ const cardData = this.cardData.find((x) => x.data == data);
485
+ console.log({ Data: data });
486
+ console.log({ CardData: this.cardData });
487
+ if (cardData) {
488
+ this.dataView.isTableView = false;
489
+ this.viewDetails(cardData);
490
+ }
491
+ this.closePopUp();
492
+ }
493
+ viewDetails(context) {
494
+ this.cardContextHistory.push(context);
495
+ this.cardContextHistoryData.push(this.cardData);
496
+ this.cardData = context.children;
497
+ this.cardDataView.clearData();
498
+ }
499
+ viewDetailsChild(context) {
500
+ if (this.currentExpandedCard) {
501
+ this.cardContextHistory.push(this.currentExpandedCard);
502
+ this.cardContextHistory.push(context);
503
+ this.cardContextHistoryData.push(this.cardData);
504
+ this.cardContextHistoryData.push(this.currentExpandedCard.children);
505
+ this.cardData = context.children;
506
+ this.cardDataView.clearData();
507
+ }
508
+ }
509
+ roleCardClicked(item) {
510
+ this.currentData = this.cardDataView.onItemClick(item);
511
+ // if (this.currentData) {
512
+ // this.form.controls['Name'].setValue(this.currentData.data?.Name);
513
+ // }
514
+ }
515
+ toggleChildren(item) {
516
+ var currToggleState = item.isChildrenExpanded;
517
+ this.cardData.forEach((_) => {
518
+ _.isChildrenExpanded = false;
519
+ });
520
+ item.isChildrenExpanded = !currToggleState;
521
+ if (item.isChildrenExpanded) {
522
+ this.currentExpandedCard = item;
523
+ }
524
+ else {
525
+ this.currentExpandedCard = null;
526
+ }
527
+ }
528
+ goToTableView() {
529
+ if (!this.currentData) {
530
+ return;
531
+ }
532
+ this.dataView.toggleView();
533
+ const id = this.currentData.data ? this.currentData.data.Id : '';
534
+ if (id.trim().length > 0 && !this.tableView.isRowEditing(id)) {
535
+ this.tableView.toggleRowEdit(id);
536
+ }
537
+ }
538
+ closeDetails() {
539
+ this.cardData =
540
+ this.cardContextHistoryData[this.cardContextHistoryData.length - 1];
541
+ this.cardContextHistoryData.pop();
542
+ this.cardContextHistory.pop();
543
+ setTimeout(() => {
544
+ if (this.dataView.isTableView) {
545
+ this.dataView.toggleView();
546
+ }
547
+ }, 200);
548
+ }
549
+ getCardSubCaption(item) {
550
+ const selected = item.children.filter((x) => x.data.Selected).length;
551
+ const total = item.children.length;
552
+ return `${selected} of ${total} ${total > 1 ? item.data.ChildrenType + 's' : item.data.ChildrenType}`;
553
+ }
554
+ getUpdatedRole(role) {
555
+ const newRole = role;
556
+ newRole.RoleContexts = role.RoleContexts.filter((x) => x.Selected).map((y) => {
557
+ y.RoleActions = y.RoleActions.filter((z) => z.Selected);
558
+ return y;
559
+ });
560
+ newRole.DataState =
561
+ newRole.DataState == ObjectState.New
562
+ ? ObjectState.New
563
+ : ObjectState.Changed;
564
+ newRole.Id = '';
565
+ return newRole;
566
+ }
567
+ async saveRole() {
568
+ if (this.currentData) {
569
+ var role = this.currentData.data;
570
+ // role.Name = this.form.controls['Name'].value;
571
+ if (this.currentData.data.Name.trim().length == 0) {
572
+ this.utilService.showInfo('Role name cannot be empty');
573
+ return;
574
+ }
575
+ const mappedRole = this.getUpdatedRole(JSON.parse(JSON.stringify(role)));
576
+ this.utilService.sendBI(true);
577
+ const res = await this.server.post(`Role/SaveRoles`, [mappedRole]);
578
+ this.utilService.sendBI(false);
579
+ if (res instanceof ErrorResponse) {
580
+ }
581
+ else {
582
+ this.utilService.showSuccess('Role saved successfully');
583
+ const result = res;
584
+ if (result.length > 0) {
585
+ var roleResult = result[0];
586
+ var mappedRoleSave = {
587
+ ...roleResult,
588
+ ChildrenType: ChildrenType.Permission,
589
+ RoleContexts: this.sourceData.map((config) => {
590
+ const existingId = roleResult.RoleContexts.findIndex((y) => y.Name == config.Name);
591
+ var context = {
592
+ ChildrenType: ChildrenType.Action,
593
+ Selected: existingId > -1 ? true : false,
594
+ RoleActions: config.Actions.map((action) => {
595
+ const existingAction = existingId > -1
596
+ ? roleResult.RoleContexts[existingId].RoleActions.findIndex((c) => c.Name == action)
597
+ : -1;
598
+ var act = {
599
+ Selected: existingAction > -1 ? true : false,
600
+ Name: action,
601
+ Role: roleResult.Code,
602
+ Context: '',
603
+ id: existingAction > -1
604
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
605
+ : '',
606
+ Id: existingAction > -1
607
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
608
+ : '',
609
+ CreatedAt: new Date(),
610
+ UpdatedAt: new Date(),
611
+ DataState: ObjectState.New,
612
+ TenantId: roleResult.TenantId,
613
+ Code: existingAction > -1
614
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
615
+ : '',
616
+ ServiceName: existingAction > -1
617
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].ServiceName
618
+ : '',
619
+ APIKey: existingAction > -1
620
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].APIKey
621
+ : this.envSvc.environment.APIKey,
622
+ ApplicationRoleAction: this.getApplicationActionCode(action),
623
+ };
624
+ return act;
625
+ }),
626
+ Name: config.Name,
627
+ Role: roleResult.Code,
628
+ id: existingId > -1
629
+ ? roleResult.RoleContexts[existingId].Code
630
+ : '',
631
+ Id: existingId > -1
632
+ ? roleResult.RoleContexts[existingId].Code
633
+ : '',
634
+ CreatedAt: new Date(),
635
+ UpdatedAt: new Date(),
636
+ DataState: ObjectState.New,
637
+ TenantId: roleResult.TenantId,
638
+ Code: existingId > -1
639
+ ? roleResult.RoleContexts[existingId].Code
640
+ : '',
641
+ ServiceName: existingId > -1
642
+ ? roleResult.RoleContexts[existingId].ServiceName
643
+ : '',
644
+ APIKey: existingId > -1
645
+ ? roleResult.RoleContexts[existingId].APIKey
646
+ : this.envSvc.environment.APIKey,
647
+ ApplicationRoleContext: this.getApplicationContextCode(config.Name),
648
+ };
649
+ return context;
650
+ }),
651
+ };
652
+ const itemIndex = this.data.findIndex((x) => x == this.currentData?.data);
653
+ if (itemIndex > -1) {
654
+ this.data[itemIndex].Code = mappedRoleSave.Code;
655
+ this.data[itemIndex].Id = mappedRoleSave.Code;
656
+ this.data[itemIndex].DataState = mappedRoleSave.DataState;
657
+ this.data[itemIndex].TenantId = mappedRoleSave.TenantId;
658
+ this.data[itemIndex].ServiceName = mappedRoleSave.ServiceName;
659
+ mappedRoleSave.RoleContexts.forEach((x, i) => {
660
+ this.data[itemIndex].RoleContexts[i].Role = mappedRoleSave.Code;
661
+ this.data[itemIndex].RoleContexts[i].Code = x.Code;
662
+ this.data[itemIndex].RoleContexts[i].ServiceName = x.ServiceName;
663
+ x.RoleActions.forEach((y, j) => {
664
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].Role =
665
+ mappedRoleSave.Code;
666
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].Code =
667
+ y.Code;
668
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].ServiceName = y.ServiceName;
669
+ });
670
+ });
671
+ this.data = this.data.map((x) => x);
672
+ this.cacheItem(this.data[itemIndex]);
673
+ // this.currentData = {
674
+ // selected: true,
675
+ // title: mappedRoleSave.Name,
676
+ // data: mappedRoleSave,
677
+ // isChildrenExpanded: this.currentData.isChildrenExpanded,
678
+ // body: [],
679
+ // children: mappedRoleSave.RoleContexts.map((c) => {
680
+ // return {
681
+ // selected: false,
682
+ // title: this.getFormattedName(c.Name),
683
+ // data: c,
684
+ // body: [],
685
+ // children: c.RoleActions.map((a) => {
686
+ // return {
687
+ // selected: false,
688
+ // title: this.getFormattedName(a.Name),
689
+ // data: a,
690
+ // body: [],
691
+ // children: [],
692
+ // };
693
+ // }),
694
+ // };
695
+ // }),
696
+ // };
697
+ }
698
+ }
699
+ }
700
+ }
701
+ }
702
+ async tableSaveRole(role, callBack) {
703
+ if (role.Name.trim().length == 0) {
704
+ this.utilService.showInfo('Role name cannot be empty');
705
+ return;
706
+ }
707
+ const mappedRole = this.getUpdatedRole(JSON.parse(JSON.stringify(role)));
708
+ this.utilService.sendBI(true);
709
+ const res = await this.server.post(`Role/SaveRoles`, [mappedRole]);
710
+ this.utilService.sendBI(false);
711
+ if (res instanceof ErrorResponse) {
712
+ }
713
+ else {
714
+ this.utilService.showSuccess('Role saved successfully');
715
+ const result = res;
716
+ if (result.length > 0) {
717
+ var roleResult = result[0];
718
+ var mappedRoleSave = {
719
+ ...roleResult,
720
+ ChildrenType: ChildrenType.Permission,
721
+ RoleContexts: this.sourceData.map((config) => {
722
+ const existingId = roleResult.RoleContexts.findIndex((y) => y.Name == config.Name);
723
+ var context = {
724
+ ChildrenType: ChildrenType.Action,
725
+ Selected: existingId > -1 ? true : false,
726
+ RoleActions: config.Actions.map((action) => {
727
+ const existingAction = existingId > -1
728
+ ? roleResult.RoleContexts[existingId].RoleActions.findIndex((c) => c.Name == action)
729
+ : -1;
730
+ var act = {
731
+ Selected: existingAction > -1 ? true : false,
732
+ Name: action,
733
+ Role: roleResult.Code,
734
+ Context: '',
735
+ id: existingAction > -1
736
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
737
+ : '',
738
+ Id: existingAction > -1
739
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
740
+ : '',
741
+ CreatedAt: new Date(),
742
+ UpdatedAt: new Date(),
743
+ DataState: ObjectState.New,
744
+ TenantId: roleResult.TenantId,
745
+ Code: existingAction > -1
746
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
747
+ : '',
748
+ ServiceName: existingAction > -1
749
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].ServiceName
750
+ : '',
751
+ APIKey: existingAction > -1
752
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].APIKey
753
+ : this.envSvc.environment.APIKey,
754
+ ApplicationRoleAction: this.getApplicationActionCode(action),
755
+ };
756
+ return act;
757
+ }),
758
+ Name: config.Name,
759
+ Role: roleResult.Code,
760
+ id: existingId > -1 ? roleResult.RoleContexts[existingId].Code : '',
761
+ Id: existingId > -1 ? roleResult.RoleContexts[existingId].Code : '',
762
+ CreatedAt: new Date(),
763
+ UpdatedAt: new Date(),
764
+ DataState: ObjectState.New,
765
+ TenantId: roleResult.TenantId,
766
+ Code: existingId > -1 ? roleResult.RoleContexts[existingId].Code : '',
767
+ ServiceName: existingId > -1
768
+ ? roleResult.RoleContexts[existingId].ServiceName
769
+ : '',
770
+ APIKey: existingId > -1
771
+ ? roleResult.RoleContexts[existingId].APIKey
772
+ : this.envSvc.environment.APIKey,
773
+ ApplicationRoleContext: this.getApplicationContextCode(config.Name),
774
+ };
775
+ return context;
776
+ }),
777
+ };
778
+ const itemIndex = this.data.findIndex((x) => x == this.currentData?.data);
779
+ if (itemIndex > -1) {
780
+ this.data[itemIndex].Code = mappedRoleSave.Code;
781
+ this.data[itemIndex].Id = mappedRoleSave.Code;
782
+ this.data[itemIndex].DataState = mappedRoleSave.DataState;
783
+ this.data[itemIndex].TenantId = mappedRoleSave.TenantId;
784
+ this.data[itemIndex].ServiceName = mappedRoleSave.ServiceName;
785
+ mappedRoleSave.RoleContexts.forEach((x, i) => {
786
+ this.data[itemIndex].RoleContexts[i].Role = mappedRoleSave.Code;
787
+ this.data[itemIndex].RoleContexts[i].Code = x.Code;
788
+ this.data[itemIndex].RoleContexts[i].ServiceName = x.ServiceName;
789
+ x.RoleActions.forEach((y, j) => {
790
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].Role =
791
+ mappedRoleSave.Code;
792
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].Code = y.Code;
793
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].ServiceName =
794
+ y.ServiceName;
795
+ });
796
+ });
797
+ this.data = this.data.map((x) => x);
798
+ this.cacheItem(this.data[itemIndex]);
799
+ }
800
+ callBack();
801
+ }
802
+ }
803
+ }
804
+ async saveRoleDynamic(item) {
805
+ if (this.isCheckboxDisabled(item)) {
806
+ this.utilService.showInfo('Parent UI not selected');
807
+ return;
808
+ }
809
+ var role = this.cardContextHistory.length > 0
810
+ ? this.cardContextHistory[0]
811
+ : this.currentExpandedCard
812
+ ? this.currentExpandedCard
813
+ : null;
814
+ var cardDataRef = this.cardContextHistoryData.length > 0
815
+ ? this.cardContextHistoryData[0]
816
+ : this.currentExpandedCard
817
+ ? this.cardData
818
+ : null;
819
+ // const isExpandedCard: boolean =
820
+ // this.cardContextHistory.length > 0
821
+ // ? false
822
+ // : this.currentExpandedCard
823
+ // ? true
824
+ // : false;
825
+ if (!role) {
826
+ return;
827
+ }
828
+ if (role.data.Name.trim().length == 0) {
829
+ item.data.Selected = false;
830
+ this.utilService.showInfo('Role name cannot be empty');
831
+ return;
832
+ }
833
+ item.data.Selected = !item.data.Selected;
834
+ const mappedRole = this.getUpdatedRole(JSON.parse(JSON.stringify(role.data)));
835
+ this.utilService.sendBI(true);
836
+ const res = await this.server.post(`Role/SaveRoles`, [mappedRole]);
837
+ this.utilService.sendBI(false);
838
+ if (res instanceof ErrorResponse) {
839
+ item.data.Selected = false;
840
+ }
841
+ else {
842
+ this.utilService.showSuccess('Role saved successfully');
843
+ const result = res;
844
+ if (result.length > 0) {
845
+ var roleResult = result[0];
846
+ var mappedRoleSave = {
847
+ ...roleResult,
848
+ ChildrenType: ChildrenType.Permission,
849
+ RoleContexts: this.sourceData.map((config) => {
850
+ const existingId = roleResult.RoleContexts.findIndex((y) => y.Name == config.Name);
851
+ var context = {
852
+ ChildrenType: ChildrenType.Action,
853
+ Selected: existingId > -1 ? true : false,
854
+ RoleActions: config.Actions.map((action) => {
855
+ const existingAction = existingId > -1
856
+ ? roleResult.RoleContexts[existingId].RoleActions.findIndex((c) => c.Name == action)
857
+ : -1;
858
+ var act = {
859
+ Selected: existingAction > -1 ? true : false,
860
+ Name: action,
861
+ Role: roleResult.Code,
862
+ Context: '',
863
+ id: existingAction > -1
864
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
865
+ : '',
866
+ Id: existingAction > -1
867
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
868
+ : '',
869
+ CreatedAt: new Date(),
870
+ UpdatedAt: new Date(),
871
+ DataState: ObjectState.New,
872
+ TenantId: roleResult.TenantId,
873
+ Code: existingAction > -1
874
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
875
+ : '',
876
+ ServiceName: existingAction > -1
877
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].ServiceName
878
+ : '',
879
+ APIKey: existingAction > -1
880
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].APIKey
881
+ : this.envSvc.environment.APIKey,
882
+ ApplicationRoleAction: this.getApplicationActionCode(action),
883
+ };
884
+ return act;
885
+ }),
886
+ Name: config.Name,
887
+ Role: roleResult.Code,
888
+ id: existingId > -1 ? roleResult.RoleContexts[existingId].Code : '',
889
+ Id: existingId > -1 ? roleResult.RoleContexts[existingId].Code : '',
890
+ CreatedAt: new Date(),
891
+ UpdatedAt: new Date(),
892
+ DataState: ObjectState.New,
893
+ TenantId: roleResult.TenantId,
894
+ Code: existingId > -1 ? roleResult.RoleContexts[existingId].Code : '',
895
+ ServiceName: existingId > -1
896
+ ? roleResult.RoleContexts[existingId].ServiceName
897
+ : '',
898
+ APIKey: existingId > -1
899
+ ? roleResult.RoleContexts[existingId].APIKey
900
+ : this.envSvc.environment.APIKey,
901
+ ApplicationRoleContext: this.getApplicationContextCode(config.Name),
902
+ };
903
+ return context;
904
+ }),
905
+ };
906
+ const itemIndex = cardDataRef
907
+ ? cardDataRef.findIndex((x) => x.data == role?.data)
908
+ : -1;
909
+ if (itemIndex > -1) {
910
+ this.data[itemIndex].Code = mappedRoleSave.Code;
911
+ this.data[itemIndex].Id = mappedRoleSave.Code;
912
+ this.data[itemIndex].DataState = mappedRoleSave.DataState;
913
+ this.data[itemIndex].TenantId = mappedRoleSave.TenantId;
914
+ this.data[itemIndex].ServiceName = mappedRoleSave.ServiceName;
915
+ mappedRoleSave.RoleContexts.forEach((x, i) => {
916
+ this.data[itemIndex].RoleContexts[i].Role = mappedRoleSave.Code;
917
+ this.data[itemIndex].RoleContexts[i].Code = x.Code;
918
+ this.data[itemIndex].RoleContexts[i].ServiceName = x.ServiceName;
919
+ x.RoleActions.forEach((y, j) => {
920
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].Role =
921
+ mappedRoleSave.Code;
922
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].Code = y.Code;
923
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].ServiceName =
924
+ y.ServiceName;
925
+ });
926
+ });
927
+ // this.data[itemIndex].RoleContexts = mappedRoleSave.RoleContexts;
928
+ this.data = this.data.map((x) => x);
929
+ // if (cardDataRef) {
930
+ // console.log({
931
+ // XDataIsHere: JSON.parse(JSON.stringify(cardDataRef)),
932
+ // });
933
+ // cardDataRef[itemIndex] = {
934
+ // selected: cardDataRef[itemIndex].selected,
935
+ // isChildrenExpanded: cardDataRef[itemIndex].isChildrenExpanded,
936
+ // title: mappedRoleSave.Name,
937
+ // data: mappedRoleSave,
938
+ // body: [],
939
+ // children: mappedRoleSave.RoleContexts.map((c) => {
940
+ // return {
941
+ // selected: false,
942
+ // title: this.getFormattedName(c.Name),
943
+ // data: c,
944
+ // body: [],
945
+ // children: c.RoleActions.map((a) => {
946
+ // return {
947
+ // selected: false,
948
+ // title: this.getFormattedName(a.Name),
949
+ // data: a,
950
+ // body: [],
951
+ // children: [],
952
+ // };
953
+ // }),
954
+ // };
955
+ // }),
956
+ // };
957
+ // }
958
+ }
959
+ }
960
+ }
961
+ }
962
+ async saveAllRoleDynamic(item) {
963
+ if (this.isCheckboxDisabled(item)) {
964
+ this.utilService.showInfo('Parent UI not selected');
965
+ return;
966
+ }
967
+ var role = this.cardContextHistory.length > 0
968
+ ? this.cardContextHistory[0]
969
+ : this.currentExpandedCard
970
+ ? this.currentExpandedCard
971
+ : null;
972
+ var cardDataRef = this.cardContextHistoryData.length > 0
973
+ ? this.cardContextHistoryData[0]
974
+ : this.currentExpandedCard
975
+ ? this.cardData
976
+ : null;
977
+ // const isExpandedCard: boolean =
978
+ // this.cardContextHistory.length > 0
979
+ // ? false
980
+ // : this.currentExpandedCard
981
+ // ? true
982
+ // : false;
983
+ if (!role) {
984
+ return;
985
+ }
986
+ if (role.data.Name.trim().length == 0) {
987
+ this.utilService.showInfo('Role name cannot be empty');
988
+ return;
989
+ }
990
+ const isAllSelected = this.isAllSelected(item);
991
+ const parent = this.cardContextHistoryData.length > 0
992
+ ? this.findParent(this.cardContextHistoryData[0], item)
993
+ : this.findParent(this.cardData, item);
994
+ if (parent &&
995
+ parent.data.ChildrenType &&
996
+ parent.data.ChildrenType == ChildrenType.Action) {
997
+ parent.data.RoleActions.forEach((x) => {
998
+ x.Selected = !isAllSelected;
999
+ });
1000
+ }
1001
+ if (parent &&
1002
+ parent.data.ChildrenType &&
1003
+ parent.data.ChildrenType == ChildrenType.Permission) {
1004
+ parent.data.RoleContexts.forEach((x) => {
1005
+ x.Selected = !isAllSelected;
1006
+ });
1007
+ }
1008
+ const mappedRole = this.getUpdatedRole(JSON.parse(JSON.stringify(role.data)));
1009
+ this.utilService.sendBI(true);
1010
+ const res = await this.server.post(`Role/SaveRoles`, [mappedRole]);
1011
+ this.utilService.sendBI(false);
1012
+ if (res instanceof ErrorResponse) {
1013
+ item.data.Selected = false;
1014
+ }
1015
+ else {
1016
+ this.utilService.showSuccess('Role saved successfully');
1017
+ const result = res;
1018
+ if (result.length > 0) {
1019
+ var roleResult = result[0];
1020
+ var mappedRoleSave = {
1021
+ ...roleResult,
1022
+ ChildrenType: ChildrenType.Permission,
1023
+ RoleContexts: this.sourceData.map((config) => {
1024
+ const existingId = roleResult.RoleContexts.findIndex((y) => y.Name == config.Name);
1025
+ var context = {
1026
+ ChildrenType: ChildrenType.Action,
1027
+ Selected: existingId > -1 ? true : false,
1028
+ RoleActions: config.Actions.map((action) => {
1029
+ const existingAction = existingId > -1
1030
+ ? roleResult.RoleContexts[existingId].RoleActions.findIndex((c) => c.Name == action)
1031
+ : -1;
1032
+ var act = {
1033
+ Selected: existingAction > -1 ? true : false,
1034
+ Name: action,
1035
+ Role: roleResult.Code,
1036
+ Context: '',
1037
+ id: existingAction > -1
1038
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
1039
+ : '',
1040
+ Id: existingAction > -1
1041
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
1042
+ : '',
1043
+ CreatedAt: new Date(),
1044
+ UpdatedAt: new Date(),
1045
+ DataState: ObjectState.New,
1046
+ TenantId: roleResult.TenantId,
1047
+ Code: existingAction > -1
1048
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].Code
1049
+ : '',
1050
+ ServiceName: existingAction > -1
1051
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].ServiceName
1052
+ : '',
1053
+ APIKey: existingAction > -1
1054
+ ? roleResult.RoleContexts[existingId].RoleActions[existingAction].APIKey
1055
+ : this.envSvc.environment.APIKey,
1056
+ ApplicationRoleAction: this.getApplicationActionCode(action),
1057
+ };
1058
+ return act;
1059
+ }),
1060
+ Name: config.Name,
1061
+ Role: roleResult.Code,
1062
+ id: existingId > -1 ? roleResult.RoleContexts[existingId].Code : '',
1063
+ Id: existingId > -1 ? roleResult.RoleContexts[existingId].Code : '',
1064
+ CreatedAt: new Date(),
1065
+ UpdatedAt: new Date(),
1066
+ DataState: ObjectState.New,
1067
+ TenantId: roleResult.TenantId,
1068
+ Code: existingId > -1 ? roleResult.RoleContexts[existingId].Code : '',
1069
+ ServiceName: existingId > -1
1070
+ ? roleResult.RoleContexts[existingId].ServiceName
1071
+ : '',
1072
+ APIKey: existingId > -1
1073
+ ? roleResult.RoleContexts[existingId].APIKey
1074
+ : this.envSvc.environment.APIKey,
1075
+ ApplicationRoleContext: this.getApplicationContextCode(config.Name),
1076
+ };
1077
+ return context;
1078
+ }),
1079
+ };
1080
+ const itemIndex = cardDataRef
1081
+ ? cardDataRef.findIndex((x) => x.data == role?.data)
1082
+ : -1;
1083
+ if (itemIndex > -1) {
1084
+ this.data[itemIndex].Code = mappedRoleSave.Code;
1085
+ this.data[itemIndex].Id = mappedRoleSave.Code;
1086
+ this.data[itemIndex].DataState = mappedRoleSave.DataState;
1087
+ this.data[itemIndex].TenantId = mappedRoleSave.TenantId;
1088
+ this.data[itemIndex].ServiceName = mappedRoleSave.ServiceName;
1089
+ mappedRoleSave.RoleContexts.forEach((x, i) => {
1090
+ this.data[itemIndex].RoleContexts[i].Role = mappedRoleSave.Code;
1091
+ this.data[itemIndex].RoleContexts[i].Code = x.Code;
1092
+ this.data[itemIndex].RoleContexts[i].ServiceName = x.ServiceName;
1093
+ x.RoleActions.forEach((y, j) => {
1094
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].Role =
1095
+ mappedRoleSave.Code;
1096
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].Code = y.Code;
1097
+ this.data[itemIndex].RoleContexts[i].RoleActions[j].ServiceName =
1098
+ y.ServiceName;
1099
+ });
1100
+ });
1101
+ // this.data[itemIndex].RoleContexts = mappedRoleSave.RoleContexts;
1102
+ this.data = this.data.map((x) => x);
1103
+ // if (cardDataRef) {
1104
+ // console.log({
1105
+ // XDataIsHere: JSON.parse(JSON.stringify(cardDataRef)),
1106
+ // });
1107
+ // cardDataRef[itemIndex] = {
1108
+ // selected: cardDataRef[itemIndex].selected,
1109
+ // isChildrenExpanded: cardDataRef[itemIndex].isChildrenExpanded,
1110
+ // title: mappedRoleSave.Name,
1111
+ // data: mappedRoleSave,
1112
+ // body: [],
1113
+ // children: mappedRoleSave.RoleContexts.map((c) => {
1114
+ // return {
1115
+ // selected: false,
1116
+ // title: this.getFormattedName(c.Name),
1117
+ // data: c,
1118
+ // body: [],
1119
+ // children: c.RoleActions.map((a) => {
1120
+ // return {
1121
+ // selected: false,
1122
+ // title: this.getFormattedName(a.Name),
1123
+ // data: a,
1124
+ // body: [],
1125
+ // children: [],
1126
+ // };
1127
+ // }),
1128
+ // };
1129
+ // }),
1130
+ // };
1131
+ // }
1132
+ }
1133
+ }
1134
+ }
1135
+ }
1136
+ saveDataAll() {
1137
+ const roles = this.data.map((x) => {
1138
+ return {
1139
+ ...x,
1140
+ RoleContexts: x.RoleContexts.filter((y) => y.Selected).map((z) => {
1141
+ return {
1142
+ ...z,
1143
+ RoleActions: z.RoleActions.filter((a) => a.Selected),
1144
+ };
1145
+ }),
1146
+ };
1147
+ });
1148
+ }
1149
+ updateTable() {
1150
+ this.data = this.data.map((x) => x);
1151
+ }
1152
+ onViewChange(isGridView) { }
1153
+ onStateChange(event) {
1154
+ switch (event.key) {
1155
+ case 'create':
1156
+ var newMappedRole = {
1157
+ RoleContexts: this.sourceData.map((config) => {
1158
+ var context = {
1159
+ ChildrenType: ChildrenType.Action,
1160
+ Selected: false,
1161
+ RoleActions: config.Actions.map((action) => {
1162
+ var act = {
1163
+ Selected: false,
1164
+ Name: action,
1165
+ Role: '',
1166
+ Context: '',
1167
+ id: '',
1168
+ Id: '',
1169
+ CreatedAt: new Date(),
1170
+ UpdatedAt: new Date(),
1171
+ DataState: ObjectState.New,
1172
+ TenantId: '',
1173
+ Code: '',
1174
+ ServiceName: '',
1175
+ APIKey: this.envSvc.environment.APIKey,
1176
+ ApplicationRoleAction: this.getApplicationActionCode(action),
1177
+ };
1178
+ return act;
1179
+ }),
1180
+ Name: config.Name,
1181
+ Role: '',
1182
+ id: '',
1183
+ Id: '',
1184
+ CreatedAt: new Date(),
1185
+ UpdatedAt: new Date(),
1186
+ DataState: ObjectState.New,
1187
+ TenantId: '',
1188
+ Code: '',
1189
+ ServiceName: '',
1190
+ APIKey: this.envSvc.environment.APIKey,
1191
+ ApplicationRoleContext: this.getApplicationContextCode(config.Name),
1192
+ };
1193
+ return context;
1194
+ }),
1195
+ ChildrenType: ChildrenType.Permission,
1196
+ Name: '',
1197
+ id: (this.cardData.length + 1).toString(),
1198
+ Id: (this.cardData.length + 1).toString(),
1199
+ CreatedAt: new Date(),
1200
+ UpdatedAt: new Date(),
1201
+ DataState: ObjectState.New,
1202
+ TenantId: '',
1203
+ Code: '',
1204
+ ServiceName: '',
1205
+ Application: this.application ? this.application : undefined,
1206
+ APIKey: this.envSvc.environment.APIKey,
1207
+ };
1208
+ const cardData = {
1209
+ selected: false,
1210
+ title: newMappedRole.Name,
1211
+ data: newMappedRole,
1212
+ body: [],
1213
+ children: newMappedRole.RoleContexts.map((c) => {
1214
+ return {
1215
+ selected: false,
1216
+ title: this.getFormattedName(c.Name),
1217
+ data: c,
1218
+ body: [],
1219
+ children: c.RoleActions.map((a) => {
1220
+ return {
1221
+ selected: false,
1222
+ title: this.getFormattedName(a.Name),
1223
+ data: a,
1224
+ body: [],
1225
+ children: [],
1226
+ };
1227
+ }),
1228
+ };
1229
+ }),
1230
+ };
1231
+ this.data = this.data.concat([newMappedRole]);
1232
+ this.cardData.push(cardData);
1233
+ this.roleCardClicked(cardData);
1234
+ this.dataView.isTableView = false;
1235
+ break;
1236
+ default:
1237
+ break;
1238
+ }
1239
+ }
1240
+ showTableView = false;
1241
+ onSelectionChange(selectedRows) { }
1242
+ retryMessage() { }
1243
+ onColumnsUpdated(updatedColumns) {
1244
+ const updatedColumnDef = [];
1245
+ updatedColumns.forEach((col) => {
1246
+ const matchingCol = this.roleControlSvc.roleColumns.find((column) => column.header === col.name || column.id === col.name);
1247
+ if (matchingCol) {
1248
+ updatedColumnDef.push(matchingCol);
1249
+ }
1250
+ });
1251
+ this.visibleColumnDef = [...updatedColumnDef];
1252
+ }
1253
+ async updateFiltersAndSorts(isSearch = false) {
1254
+ if (!isSearch) {
1255
+ this.dataView.onClearSearch();
1256
+ this.currentSearchTerm = '';
1257
+ this.cdr.detectChanges();
1258
+ const clickEvent = new MouseEvent('click', {
1259
+ bubbles: true,
1260
+ cancelable: true,
1261
+ view: window,
1262
+ });
1263
+ document.dispatchEvent(clickEvent);
1264
+ }
1265
+ var payload = this.currentFilters.map((x) => {
1266
+ return {
1267
+ PropertyName: x.name,
1268
+ EntityValue: x.value,
1269
+ Operator: SearchOperator.And,
1270
+ Sign: x.condition && Object.keys(DateFilterTypes).includes(x.condition)
1271
+ ? DateFilterTypes[x.condition]
1272
+ : SearchPropertySign.EQ,
1273
+ Type: SearchPropertyValueType.Date,
1274
+ };
1275
+ });
1276
+ payload.push({
1277
+ PropertyName: 'APIKey',
1278
+ EntityValue: this.envSvc.environment.APIKey,
1279
+ Operator: SearchOperator.And,
1280
+ Sign: SearchPropertySign.EQ,
1281
+ });
1282
+ for (let sort of this.currentSorts) {
1283
+ payload.push({
1284
+ PropertyName: sort.name,
1285
+ EntityValue: '',
1286
+ Operator: SearchOperator.And,
1287
+ Sign: SearchPropertySign.EQ,
1288
+ Sort: sort.value.toLowerCase() == SortDirection.Asc.toLowerCase()
1289
+ ? SortDirection.Asc
1290
+ : sort.value.toLowerCase() == SortDirection.Desc.toLowerCase()
1291
+ ? SortDirection.Desc
1292
+ : SortDirection.None,
1293
+ });
1294
+ }
1295
+ const searchTermExists = this.currentSearchTerm.trim().length > 0;
1296
+ this.utilService.sendBI(true);
1297
+ const res = searchTermExists
1298
+ ? await this.server.get(`Role/GetRolesWithParam/${this.currentSearchTerm.trim()}/0/${this.pageSize}`)
1299
+ : await this.server.post(`Role/SearchRoles/0/${this.pageSize}`, payload);
1300
+ this.utilService.sendBI(false);
1301
+ if (res instanceof ErrorResponse) {
1302
+ this.currentFilters = [];
1303
+ this.currentSorts = [];
1304
+ return undefined;
1305
+ }
1306
+ else {
1307
+ this.cardDataView.clearData();
1308
+ this.currentData = null;
1309
+ this.pageState = res;
1310
+ var result = res.Result;
1311
+ this.setUpMappedData(result);
1312
+ this.setUpCardData();
1313
+ }
1314
+ }
1315
+ async loadMoreFiltersAndSorts() {
1316
+ if (!this.pageState) {
1317
+ return;
1318
+ }
1319
+ var payload = this.currentFilters.map((x) => {
1320
+ return {
1321
+ PropertyName: x.name,
1322
+ EntityValue: x.value,
1323
+ Operator: SearchOperator.And,
1324
+ Sign: x.condition && Object.keys(DateFilterTypes).includes(x.condition)
1325
+ ? DateFilterTypes[x.condition]
1326
+ : SearchPropertySign.EQ,
1327
+ Type: SearchPropertyValueType.Date,
1328
+ };
1329
+ });
1330
+ payload.push({
1331
+ PropertyName: 'APIKey',
1332
+ EntityValue: this.envSvc.environment.APIKey,
1333
+ Operator: SearchOperator.And,
1334
+ Sign: SearchPropertySign.EQ,
1335
+ });
1336
+ for (let sort of this.currentSorts) {
1337
+ payload.push({
1338
+ PropertyName: sort.name,
1339
+ EntityValue: '',
1340
+ Operator: SearchOperator.And,
1341
+ Sign: SearchPropertySign.EQ,
1342
+ Sort: sort.value.toLowerCase() == SortDirection.Asc.toLowerCase()
1343
+ ? SortDirection.Asc
1344
+ : sort.value.toLowerCase() == SortDirection.Desc.toLowerCase()
1345
+ ? SortDirection.Desc
1346
+ : SortDirection.None,
1347
+ });
1348
+ }
1349
+ const searchTermExists = this.currentSearchTerm.trim().length > 0;
1350
+ this.utilService.sendBI(true);
1351
+ const res = searchTermExists
1352
+ ? await this.server.get(`Role/GetRolesWithParam/${this.currentSearchTerm.trim()}/${this.pageState.Skip}/${this.pageSize}`)
1353
+ : await this.server.post(`Role/SearchRoles/${this.pageState.Skip}/${this.pageSize}`, payload);
1354
+ this.utilService.sendBI(false);
1355
+ if (res instanceof ErrorResponse) {
1356
+ return undefined;
1357
+ }
1358
+ else {
1359
+ var result = res;
1360
+ return result;
1361
+ }
1362
+ }
1363
+ onFilterUpdated(updatedFilters) {
1364
+ // Ensure updatedFilters is an array
1365
+ if (Array.isArray(updatedFilters)) {
1366
+ this.currentFilters = updatedFilters;
1367
+ this.updateFiltersAndSorts();
1368
+ }
1369
+ }
1370
+ onSortUpdated(updatedSorts) {
1371
+ this.currentSorts = updatedSorts;
1372
+ console.log({ CurrSorts: this.currentSorts });
1373
+ this.updateFiltersAndSorts();
1374
+ }
1375
+ handleSearch(event) {
1376
+ this.searchTerm$.next(event.value);
1377
+ }
1378
+ handleExport(exportedData) {
1379
+ // console.log('Exported data:', exportedData);
1380
+ this.downloadCSV(exportedData);
1381
+ }
1382
+ downloadCSV(data) {
1383
+ const headers = Object.keys(data[0]);
1384
+ const csvContent = [
1385
+ headers.join(','),
1386
+ ...data.map((row) => headers.map((header) => row[header]).join(',')),
1387
+ ].join('\n');
1388
+ const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
1389
+ const link = document.createElement('a');
1390
+ if (link.download !== undefined) {
1391
+ const url = URL.createObjectURL(blob);
1392
+ link.setAttribute('href', url);
1393
+ link.setAttribute('download', 'export.csv');
1394
+ link.style.visibility = 'hidden';
1395
+ document.body.appendChild(link);
1396
+ link.click();
1397
+ document.body.removeChild(link);
1398
+ }
1399
+ }
1400
+ getMockRoles() {
1401
+ return new Array(10).fill(1).map((id, i) => ({
1402
+ Id: id + i,
1403
+ id: (id + i).toString(),
1404
+ Name: this.mockNames[i] || '',
1405
+ RoleContexts: this.randomContexts(),
1406
+ CreatedAt: new Date(),
1407
+ UpdatedAt: new Date(),
1408
+ DataState: ObjectState.New,
1409
+ TenantId: `Tenant${id + i}`,
1410
+ Code: '',
1411
+ ServiceName: '',
1412
+ APIKey: '',
1413
+ }));
1414
+ }
1415
+ mockNames = [
1416
+ 'Admin',
1417
+ 'Super Admin',
1418
+ 'Manager',
1419
+ 'Intern',
1420
+ 'Production Manager',
1421
+ 'CEO',
1422
+ 'CTO',
1423
+ 'COO',
1424
+ 'Developer',
1425
+ 'Engineer',
1426
+ ];
1427
+ randomName() {
1428
+ const randomIndex = Math.floor(Math.random() * this.mockNames.length);
1429
+ return this.mockNames[randomIndex];
1430
+ }
1431
+ randomContexts() {
1432
+ const randomNumber = Math.floor(Math.random() * Object.keys(UIs).length + 1);
1433
+ var returnArray = [];
1434
+ const usedList = [];
1435
+ for (let i = 0; i < randomNumber; i++) {
1436
+ let randomIndex;
1437
+ do {
1438
+ randomIndex = Math.floor(Math.random() * Object.keys(UIs).length);
1439
+ } while (usedList.includes(randomIndex));
1440
+ returnArray.push({
1441
+ Id: 'context' + i,
1442
+ id: ('context' + i).toString(),
1443
+ Name: Object.keys(UIs)[randomIndex],
1444
+ Role: '',
1445
+ RoleActions: this.randomActions(),
1446
+ CreatedAt: new Date(),
1447
+ UpdatedAt: new Date(),
1448
+ DataState: ObjectState.New,
1449
+ TenantId: `Tenant${'context' + i}`,
1450
+ Code: '',
1451
+ ServiceName: '',
1452
+ APIKey: '',
1453
+ ApplicationRoleContext: '',
1454
+ });
1455
+ usedList.push(randomIndex);
1456
+ }
1457
+ return returnArray;
1458
+ }
1459
+ randomActions() {
1460
+ const randomNumber = Math.floor(Math.random() * Object.keys(UIActions).length + 1);
1461
+ var returnArray = [];
1462
+ const usedList = [];
1463
+ for (let i = 0; i < randomNumber; i++) {
1464
+ let randomIndex;
1465
+ do {
1466
+ randomIndex = Math.floor(Math.random() * Object.keys(UIActions).length);
1467
+ } while (usedList.includes(randomIndex));
1468
+ returnArray.push({
1469
+ Id: 'action' + i,
1470
+ id: ('action' + i).toString(),
1471
+ Name: Object.keys(UIActions)[randomIndex],
1472
+ Role: '',
1473
+ Context: '',
1474
+ CreatedAt: new Date(),
1475
+ UpdatedAt: new Date(),
1476
+ DataState: ObjectState.New,
1477
+ TenantId: `Tenant${'action' + i}`,
1478
+ Code: '',
1479
+ ServiceName: '',
1480
+ APIKey: '',
1481
+ ApplicationRoleAction: '',
1482
+ });
1483
+ usedList.push(randomIndex);
1484
+ }
1485
+ return returnArray;
1486
+ }
1487
+ closePopUp() {
1488
+ this.openDropdownId = null;
1489
+ this.popUps.forEach((popUp) => {
1490
+ if (popUp.dropdownOpen) {
1491
+ popUp.toggleDropdown();
1492
+ }
1493
+ });
1494
+ }
1495
+ updateItem(value, key) {
1496
+ return {
1497
+ [key]: value,
1498
+ };
1499
+ }
1500
+ editValue(value) {
1501
+ const card = this.cardData.find((x) => x.data.Id == value.Id);
1502
+ if (card && this.cardDataView) {
1503
+ this.dataView.toggleView();
1504
+ card.selected = true;
1505
+ this.currentData = this.cardDataView.onItemClick(card);
1506
+ this.closePopUp();
1507
+ // if (this.currentData) {
1508
+ // this.form.controls['Name'].setValue(this.currentData.data?.Name);
1509
+ // }
1510
+ }
1511
+ }
1512
+ tableCache = new Map();
1513
+ cacheItem(item) {
1514
+ const cacheKey = item.Id;
1515
+ this.tableCache.set(cacheKey, JSON.parse(JSON.stringify(item)));
1516
+ }
1517
+ restoreCache(item) {
1518
+ const cacheKey = item.Id;
1519
+ const itemCache = this.tableCache.get(cacheKey);
1520
+ if (itemCache) {
1521
+ item.Name = itemCache.Name;
1522
+ }
1523
+ this.tableCache.delete(cacheKey);
1524
+ }
1525
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RoleControlComponent, deps: [{ token: i1.AuthorizationService }, { token: i2.RoleControlService }, { token: i3.UtilService }, { token: i4.HttpWebRequestService }, { token: i0.ChangeDetectorRef }, { token: i5.FormBuilder }, { token: i6.EnvironmentService }], target: i0.ɵɵFactoryTarget.Component });
1526
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RoleControlComponent, selector: "lib-role-control", inputs: { isGlobal: "isGlobal", serviceName: "serviceName", application: "application", pageSize: "pageSize", searchDebounceTime: "searchDebounceTime", permissionConfig: "permissionConfig" }, viewQueries: [{ propertyName: "cardDataView", first: true, predicate: ["vdcv"], descendants: true }, { propertyName: "dataView", first: true, predicate: ["vdv"], descendants: true }, { propertyName: "tableView", first: true, predicate: ["dt"], descendants: true }, { propertyName: "popUps", predicate: ["popup"], descendants: true }], ngImport: i0, template: "<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <div\n *ngIf=\"this.cardContextHistory.length > 0\"\n class=\"context-banner py-3 px-4 rounded-xl flex item-center justify-space-between gap-3\"\n >\n <div class=\"flex gap-2 flex-1 context-banner-content\">\n <div\n class=\"context-content items-center flex gap-2\"\n *ngFor=\"let context of this.cardContextHistory; index as i\"\n >\n <div class=\"context-main-content-container flex gap-4\">\n <span class=\"context-caption font-bold text-[#404040]\">{{\n context.data.ChildrenType &&\n context.data.ChildrenType == childPermissionRef\n ? context.data.Name\n : context.title\n }}</span>\n <span\n *ngIf=\"i == this.cardContextHistory.length - 1\"\n class=\"context-subcaption\"\n >{{ this.getCardSubCaption(context) }}</span\n >\n </div>\n <div *ngIf=\"i < this.cardContextHistory.length - 1\">/</div>\n </div>\n </div>\n <div class=\"flex justify-end\">\n <verben-svg\n (click)=\"closeDetails()\"\n class=\"cursor-pointer\"\n icon=\"close-circle-full\"\n [width]=\"20\"\n [height]=\"20\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"this.cardContextHistory.length > 0 && this.cardData.length > 0\"\n class=\"flex items-center gap-2 px-2\"\n >\n <input\n [disabled]=\"this.isCheckboxDisabled(this.cardData[0])\"\n type=\"checkbox\"\n class=\"mt-1 cursor-pointer\"\n [ngModel]=\"isAllSelected(this.cardData[0])\"\n (click)=\"\n $event.preventDefault(); this.saveAllRoleDynamic(this.cardData[0])\n \"\n />\n\n <span class=\"font-semibold\">Select All</span>\n </div>\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: this.cardContextHistory.length == 0,\n isColumn: this.cardContextHistory.length == 0,\n isFilter: this.cardContextHistory.length == 0,\n isSort: this.cardContextHistory.length == 0,\n isExport: this.cardContextHistory.length == 0 && (!permissionConfig || permissionConfig.Actions['Export']),\n isSelect: this.cardContextHistory.length == 0,\n isCreate: this.cardContextHistory.length == 0 && (!permissionConfig || permissionConfig.Actions['Create']),\n isToggle:this.cardContextHistory.length == 0,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [isTableView]=\"false\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n #dt\n [data]=\"data\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | date }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | date }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"value.Name\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig || permissionConfig.Actions['Create']\n \"\n (click)=\"toggleRowEdit(); cacheItem(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewDetailsFromTable(value)\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n <div class=\"pop-up-value cursor-pointer\">View Users</div>\n </div>\n </verben-pop-Up>\n <!-- <div class=\"flex gap-4 items-center\">\n <verben-svg (click)=\"editValue(value)\" icon=\"edit\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n <span (click)=\"viewDetailsFromTable(value)\" class=\"view-links view-details\">view details</span>\n <span class=\"view-links view-users\">view users</span>\n </div> -->\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveRole(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n <verben-svg\n icon=\"cardViewAlt\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"editValue(value)\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"MailAddress\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"roleCardClicked(item)\"\n *ngIf=\"\n item.data.ChildrenType &&\n item.data.ChildrenType == childPermissionRef\n \"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <verben-svg\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"\n item.children && item.children.length\n ? 'visible'\n : 'invisible'\n \"\n class=\"items-center flex pr-1 cursor-pointer\"\n [icon]=\"item.isChildrenExpanded ? 'minus' : 'plus'\"\n />\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span\n class=\"!text-[10px] font-light text-[#404040] leading-[12.1px]\"\n *ngIf=\"item.children && item.children.length > 0\"\n >\n {{ getCardSubCaption(item) }}\n </span>\n </div>\n\n <div\n *ngIf=\"item.children && item.children.length > 0\"\n class=\"flex items-end h-[100%]\"\n >\n <p\n (click)=\"viewDetails(item); $event.stopPropagation()\"\n class=\"my-0 underline text-[#3479E9] text-[12px] leading-[16.6px] cursor-pointer font-medium\"\n >\n view details\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div\n *ngIf=\"\n !item.data.ChildrenType ||\n item.data.ChildrenType !== childPermissionRef\n \"\n class=\"flex h-[max-content]\"\n >\n <verben-svg\n [ngClass]=\"\n item.children && item.children.length\n ? 'visible'\n : 'invisible'\n \"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"toggleChildren(item)\"\n class=\"items-center flex pr-1 cursor-pointer\"\n [icon]=\"item.isChildrenExpanded ? 'minus' : 'plus'\"\n />\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 flex gap-2 h-[100%] items-start\">\n <input\n *ngIf=\"item.data?.Selected != undefined\"\n [disabled]=\"this.isCheckboxDisabled(item)\"\n type=\"checkbox\"\n class=\"mt-1 cursor-pointer\"\n [(ngModel)]=\"item.data.Selected\"\n (click)=\"\n $event.preventDefault(); this.saveRoleDynamic(item)\n \"\n />\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.title }}\n </h3>\n <span\n class=\"!text-[10px] font-light text-[#404040] leading-[12.1px]\"\n *ngIf=\"item.children && item.children.length > 0\"\n >\n {{ getCardSubCaption(item) }}\n </span>\n </div>\n\n <div\n *ngIf=\"item.children && item.children.length > 0\"\n class=\"flex items-end h-[100%]\"\n >\n <p\n (click)=\"viewDetails(item)\"\n class=\"my-0 underline text-[#3479E9] text-[12px] leading-[16.6px] cursor-pointer font-medium\"\n >\n view details\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #cardChild let-index=\"index\" let-item>\n <div class=\"flex gap-2 items-start h-[max-content]\">\n <input\n [ngClass]=\"index == 0 ? 'visible' : 'invisible'\"\n [disabled]=\"this.isCheckboxDisabled(item)\"\n type=\"checkbox\"\n class=\"mt-1 cursor-pointer\"\n [ngModel]=\"isAllSelected(item)\"\n (click)=\"\n $event.preventDefault(); this.saveAllRoleDynamic(item)\n \"\n />\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 flex gap-2 h-[100%] items-start\">\n <input\n *ngIf=\"item.data?.Selected != undefined\"\n [disabled]=\"this.isCheckboxDisabled(item)\"\n type=\"checkbox\"\n class=\"mt-1 cursor-pointer\"\n [(ngModel)]=\"item.data.Selected\"\n (click)=\"\n $event.preventDefault(); this.saveRoleDynamic(item)\n \"\n />\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.title }}\n </h3>\n <span\n class=\"!text-[10px] font-light text-[#404040] leading-[12.1px]\"\n *ngIf=\"item.children && item.children.length > 0\"\n >\n {{ getCardSubCaption(item) }}\n </span>\n </div>\n\n <div\n *ngIf=\"item.children && item.children.length > 0\"\n class=\"flex items-end h-[100%]\"\n >\n <p\n (click)=\"viewDetailsChild(item)\"\n class=\"my-0 underline text-[#3479E9] text-[12px] leading-[16.6px] cursor-pointer font-medium\"\n >\n view details\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view\n *ngIf=\"this.cardContextHistory.length == 0\"\n >\n <ng-template #parent>\n <div\n *ngIf=\"this.currentData\"\n class=\"flex flex-col rounded-xl h-full w-full justify-between relative space-y-4\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n (ngModelChange)=\"updateTable()\"\n [(ngModel)]=\"this.currentData.data.Name\"\n />\n\n <!-- buttons -->\n <div class=\"flex justify-between bottom-8 left-0 right-0\">\n <div></div>\n <!-- <verbena-button class=\"verben-delete-button\" text=\"Delete\"></verbena-button> -->\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <verbena-button\n class=\"verben-primary-button\"\n (click)=\"this.saveRole()\"\n text=\"Save\"\n ></verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer\n *ngIf=\"this.cardContextHistory.length == 0\"\n >\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"\n !vdcv.hasCurrentItem() && this.cardContextHistory.length == 0\n \"\n class=\"message-log-button-container flex justify-between\"\n >\n <!-- <verbena-button [fontWeight]=\"'bold'\" [bgColor]=\"'#8E8D87'\" [borderRadius]=\"'4px'\" [textColor]=\"'#fff'\"\n [text]=\"'Delete'\">\n </verbena-button> -->\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <!-- <verbena-button [fontWeight]=\"'bold'\" [bgColor]=\"'#8E8D87'\" [borderRadius]=\"'4px'\" [textColor]=\"'#fff'\"\n [text]=\"'Delete'\">\n </verbena-button> -->\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n", styles: [".view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid #FFE681}.width-max{min-width:max-content}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowDelete", "selectionChange"] }, { kind: "directive", type: i8.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i8.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i8.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "extendCustomClass", "exportCustomClass", "selectCustomClass", "importCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "importTemplate", "columnTemplate", "extendTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showImportChild", "showExportChild", "showExtendChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i8.CardDataViewComponent, selector: "verben-card-data-view", inputs: ["pd", "mg", "lHeight", "rHeight", "rWidth", "lWidth", "textColor", "lbgColor", "rbgColor", "border", "display", "borderRadius", "activeCss", "inActiveCss", "displayAsRow", "cardDataList", "dataId", "totalRecords", "footer", "noOfVisibleChildren", "onItemClick", "onCardChildClick"], outputs: ["loadMoreClick"] }, { kind: "component", type: i8.LeftCardDataComponent, selector: "verben-left-card-data", inputs: ["pd", "mg", "height", "weight", "activeCss", "inActiveCss", "cardDataList", "iconCollapse", "iconExpanded", "parent", "dataId"] }, { kind: "component", type: i8.LeftCardDataViewComponent, selector: "verben-left-card-data-view", inputs: ["cardDataList"] }, { kind: "component", type: i8.RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: ["parentData", "chilData", "meth"] }, { kind: "component", type: i8.CardDataViewFooterComponent, selector: "verben-card-data-view-footer" }, { kind: "component", type: i8.SortTableComponent, selector: "verben-sort-table", inputs: ["enableDragAndDrop", "sortOptions", "resetText", "displayedOptions", "propertyText", "showMoreText", "sortButtonText", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "containerHeight"], outputs: ["selectedOptions", "resetSortData"] }, { kind: "component", type: i8.VisibleColumnComponent, selector: "verben-visible-column", inputs: ["columns", "items", "enableDragAndDrop", "displayedColumns", "showMore", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "closeColumn"], outputs: ["columnsUpdated", "resetFilter"] }, { kind: "component", type: i8.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied", "resetSortData"] }, { kind: "component", type: i8.DataExportComponent, selector: "lib-data-export", inputs: ["columns", "data"], outputs: ["exportDataEvent"] }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.VerbenaInputComponent, selector: "verbena-input", inputs: ["label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i8.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i8.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "pipe", type: i7.DatePipe, name: "date" }] });
1527
+ }
1528
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RoleControlComponent, decorators: [{
1529
+ type: Component,
1530
+ args: [{ selector: 'lib-role-control', template: "<div #messageLog class=\"flex flex-col gap-4 message-log-container\">\n <div\n *ngIf=\"this.cardContextHistory.length > 0\"\n class=\"context-banner py-3 px-4 rounded-xl flex item-center justify-space-between gap-3\"\n >\n <div class=\"flex gap-2 flex-1 context-banner-content\">\n <div\n class=\"context-content items-center flex gap-2\"\n *ngFor=\"let context of this.cardContextHistory; index as i\"\n >\n <div class=\"context-main-content-container flex gap-4\">\n <span class=\"context-caption font-bold text-[#404040]\">{{\n context.data.ChildrenType &&\n context.data.ChildrenType == childPermissionRef\n ? context.data.Name\n : context.title\n }}</span>\n <span\n *ngIf=\"i == this.cardContextHistory.length - 1\"\n class=\"context-subcaption\"\n >{{ this.getCardSubCaption(context) }}</span\n >\n </div>\n <div *ngIf=\"i < this.cardContextHistory.length - 1\">/</div>\n </div>\n </div>\n <div class=\"flex justify-end\">\n <verben-svg\n (click)=\"closeDetails()\"\n class=\"cursor-pointer\"\n icon=\"close-circle-full\"\n [width]=\"20\"\n [height]=\"20\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"this.cardContextHistory.length > 0 && this.cardData.length > 0\"\n class=\"flex items-center gap-2 px-2\"\n >\n <input\n [disabled]=\"this.isCheckboxDisabled(this.cardData[0])\"\n type=\"checkbox\"\n class=\"mt-1 cursor-pointer\"\n [ngModel]=\"isAllSelected(this.cardData[0])\"\n (click)=\"\n $event.preventDefault(); this.saveAllRoleDynamic(this.cardData[0])\n \"\n />\n\n <span class=\"font-semibold\">Select All</span>\n </div>\n <verben-data-view\n #vdv\n [viewState]=\"{\n isSearch: this.cardContextHistory.length == 0,\n isColumn: this.cardContextHistory.length == 0,\n isFilter: this.cardContextHistory.length == 0,\n isSort: this.cardContextHistory.length == 0,\n isExport: this.cardContextHistory.length == 0 && (!permissionConfig || permissionConfig.Actions['Export']),\n isSelect: this.cardContextHistory.length == 0,\n isCreate: this.cardContextHistory.length == 0 && (!permissionConfig || permissionConfig.Actions['Create']),\n isToggle:this.cardContextHistory.length == 0,\n }\"\n [buttonClass]=\"'my-custom-button-class'\"\n [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\"\n [isTableView]=\"false\"\n [selectedColumnCount]=\"0\"\n [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\"\n (viewChange)=\"onViewChange($event)\"\n (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"handleSearch($event)\"\n >\n <div class=\"mt-2\" table-content>\n <lib-data-table\n [dataKey]=\"'Id'\"\n #dt\n [data]=\"data\"\n [columns]=\"visibleColumnDef\"\n [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <ng-container libColumn=\"select\">\n <ng-template\n #cell\n let-isSelected=\"isSelected\"\n let-toggleRowSelection=\"toggleRowSelection\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected\"\n (change)=\"toggleRowSelection()\"\n />\n </ng-template>\n <ng-template\n #header\n let-allRowsSelected=\"allRowsSelected\"\n let-someRowsSelected=\"someRowsSelected\"\n let-toggleAllRows=\"toggleAllRows\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"allRowsSelected()\"\n [indeterminate]=\"someRowsSelected()\"\n (change)=\"toggleAllRows()\"\n />\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"createdAt\">\n <ng-template #cell let-value>\n {{ value | date }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"updatedAt\">\n <ng-template #cell let-value>\n {{ value | date }}\n </ng-template>\n </ng-container>\n <ng-container libColumn=\"name\">\n <ng-template #cell let-row=\"row\" let-value>\n {{ value.Name }}\n </ng-template>\n <ng-template\n #cellEdit\n let-row=\"row\"\n let-updateValue=\"updateValue\"\n let-updateData=\"updateData\"\n let-value\n >\n <div class=\"width-max\">\n <verbena-input [(ngModel)]=\"value.Name\"></verbena-input>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <verben-pop-Up\n #popup\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n >\n <verben-svg\n class=\"cursor-pointer actions-icon\"\n dropdown-trigger\n icon=\"list\"\n ></verben-svg>\n <div class=\"pop-up-content flex flex-col\" dropdown-content>\n <div\n *ngIf=\"\n !permissionConfig || permissionConfig.Actions['Create']\n \"\n (click)=\"toggleRowEdit(); cacheItem(value); closePopUp()\"\n class=\"pop-up-value cursor-pointer\"\n >\n Edit\n </div>\n <div\n (click)=\"viewDetailsFromTable(value)\"\n class=\"pop-up-value cursor-pointer\"\n >\n View Details\n </div>\n <div class=\"pop-up-value cursor-pointer\">View Users</div>\n </div>\n </verben-pop-Up>\n <!-- <div class=\"flex gap-4 items-center\">\n <verben-svg (click)=\"editValue(value)\" icon=\"edit\" [width]=\"15\" [height]=\"15\"\n class=\"cursor-pointer\"></verben-svg>\n <span (click)=\"viewDetailsFromTable(value)\" class=\"view-links view-details\">view details</span>\n <span class=\"view-links view-users\">view users</span>\n </div> -->\n </ng-template>\n <ng-template\n #cellEdit\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-value\n >\n <div class=\"flex gap-2 items-center\">\n <verben-svg\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"tableSaveRole(value, toggleRowEdit)\"\n ></verben-svg>\n <verben-svg\n (click)=\"restoreCache(value); toggleRowEdit()\"\n icon=\"close-no-circle\"\n [width]=\"15\"\n [height]=\"15\"\n ></verben-svg>\n <!-- <verben-svg icon=\"delete\" [width]=\"15\" [height]=\"15\"></verben-svg> -->\n <verben-svg\n icon=\"cardViewAlt\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"editValue(value)\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n <div card-content>\n <verben-card-data-view\n borderRadius=\"12px\"\n #vdcv\n dataId=\"Id\"\n border=\"5px\"\n [cardDataList]=\"cardData\"\n rbgColor=\"#f5f6f9\"\n mg=\"0px\"\n >\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data\n #vlcd\n [parent]=\"vdcv\"\n dataId=\"MailAddress\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\"\n [cardDataList]=\"cardData\"\n >\n <ng-template #card let-item>\n <div\n (click)=\"roleCardClicked(item)\"\n *ngIf=\"\n item.data.ChildrenType &&\n item.data.ChildrenType == childPermissionRef\n \"\n class=\"flex cursor-pointer h-[max-content]\"\n >\n <verben-svg\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"toggleChildren(item); $event.stopPropagation()\"\n [ngClass]=\"\n item.children && item.children.length\n ? 'visible'\n : 'invisible'\n \"\n class=\"items-center flex pr-1 cursor-pointer\"\n [icon]=\"item.isChildrenExpanded ? 'minus' : 'plus'\"\n />\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 h-[100%]\">\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.data.Name }}\n </h3>\n <span\n class=\"!text-[10px] font-light text-[#404040] leading-[12.1px]\"\n *ngIf=\"item.children && item.children.length > 0\"\n >\n {{ getCardSubCaption(item) }}\n </span>\n </div>\n\n <div\n *ngIf=\"item.children && item.children.length > 0\"\n class=\"flex items-end h-[100%]\"\n >\n <p\n (click)=\"viewDetails(item); $event.stopPropagation()\"\n class=\"my-0 underline text-[#3479E9] text-[12px] leading-[16.6px] cursor-pointer font-medium\"\n >\n view details\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div\n *ngIf=\"\n !item.data.ChildrenType ||\n item.data.ChildrenType !== childPermissionRef\n \"\n class=\"flex h-[max-content]\"\n >\n <verben-svg\n [ngClass]=\"\n item.children && item.children.length\n ? 'visible'\n : 'invisible'\n \"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"toggleChildren(item)\"\n class=\"items-center flex pr-1 cursor-pointer\"\n [icon]=\"item.isChildrenExpanded ? 'minus' : 'plus'\"\n />\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 flex gap-2 h-[100%] items-start\">\n <input\n *ngIf=\"item.data?.Selected != undefined\"\n [disabled]=\"this.isCheckboxDisabled(item)\"\n type=\"checkbox\"\n class=\"mt-1 cursor-pointer\"\n [(ngModel)]=\"item.data.Selected\"\n (click)=\"\n $event.preventDefault(); this.saveRoleDynamic(item)\n \"\n />\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.title }}\n </h3>\n <span\n class=\"!text-[10px] font-light text-[#404040] leading-[12.1px]\"\n *ngIf=\"item.children && item.children.length > 0\"\n >\n {{ getCardSubCaption(item) }}\n </span>\n </div>\n\n <div\n *ngIf=\"item.children && item.children.length > 0\"\n class=\"flex items-end h-[100%]\"\n >\n <p\n (click)=\"viewDetails(item)\"\n class=\"my-0 underline text-[#3479E9] text-[12px] leading-[16.6px] cursor-pointer font-medium\"\n >\n view details\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n <ng-template #cardChild let-index=\"index\" let-item>\n <div class=\"flex gap-2 items-start h-[max-content]\">\n <input\n [ngClass]=\"index == 0 ? 'visible' : 'invisible'\"\n [disabled]=\"this.isCheckboxDisabled(item)\"\n type=\"checkbox\"\n class=\"mt-1 cursor-pointer\"\n [ngModel]=\"isAllSelected(item)\"\n (click)=\"\n $event.preventDefault(); this.saveAllRoleDynamic(item)\n \"\n />\n <div class=\"flex w-full bg-secondary rounded-xl\">\n <div\n class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\"\n [ngClass]=\"\n item.selected ? 'bg-primary' : 'bg-secondary-200'\n \"\n ></div>\n <div class=\"py-3 px-4 flex-1 flex gap-2 h-[100%] items-start\">\n <input\n *ngIf=\"item.data?.Selected != undefined\"\n [disabled]=\"this.isCheckboxDisabled(item)\"\n type=\"checkbox\"\n class=\"mt-1 cursor-pointer\"\n [(ngModel)]=\"item.data.Selected\"\n (click)=\"\n $event.preventDefault(); this.saveRoleDynamic(item)\n \"\n />\n <div\n class=\"flex items-start flex-1 gap-1 justify-between h-[100%]\"\n >\n <div\n class=\"flex flex-col flex-1 card-min-height justify-between h-[100%]\"\n >\n <h3\n class=\"my-0 font-bold text-[#404040] leading-[19.5px]\"\n >\n {{ item.title }}\n </h3>\n <span\n class=\"!text-[10px] font-light text-[#404040] leading-[12.1px]\"\n *ngIf=\"item.children && item.children.length > 0\"\n >\n {{ getCardSubCaption(item) }}\n </span>\n </div>\n\n <div\n *ngIf=\"item.children && item.children.length > 0\"\n class=\"flex items-end h-[100%]\"\n >\n <p\n (click)=\"viewDetailsChild(item)\"\n class=\"my-0 underline text-[#3479E9] text-[12px] leading-[16.6px] cursor-pointer font-medium\"\n >\n view details\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n <verben-right-card-data-view\n *ngIf=\"this.cardContextHistory.length == 0\"\n >\n <ng-template #parent>\n <div\n *ngIf=\"this.currentData\"\n class=\"flex flex-col rounded-xl h-full w-full justify-between relative space-y-4\"\n >\n <verbena-input\n name=\"Name\"\n label=\"Name\"\n (ngModelChange)=\"updateTable()\"\n [(ngModel)]=\"this.currentData.data.Name\"\n />\n\n <!-- buttons -->\n <div class=\"flex justify-between bottom-8 left-0 right-0\">\n <div></div>\n <!-- <verbena-button class=\"verben-delete-button\" text=\"Delete\"></verbena-button> -->\n <div class=\"flex gap-3\">\n <verbena-button\n class=\"verben-switch-button\"\n (click)=\"goToTableView()\"\n text=\"Switch To Table\"\n ></verbena-button>\n <verbena-button\n class=\"verben-primary-button\"\n (click)=\"this.saveRole()\"\n text=\"Save\"\n ></verbena-button>\n </div>\n </div>\n </div>\n </ng-template>\n </verben-right-card-data-view>\n <!-- <verben-right-card-data-view>\n yeshhhhhh\n </verben-right-card-data-view> -->\n\n <verben-card-data-view-footer\n *ngIf=\"this.cardContextHistory.length == 0\"\n >\n <div class=\"flex gap-2 justify-between\">\n <div\n *ngIf=\"\n !vdcv.hasCurrentItem() && this.cardContextHistory.length == 0\n \"\n class=\"message-log-button-container flex justify-between\"\n >\n <!-- <verbena-button [fontWeight]=\"'bold'\" [bgColor]=\"'#8E8D87'\" [borderRadius]=\"'4px'\" [textColor]=\"'#fff'\"\n [text]=\"'Delete'\">\n </verbena-button> -->\n </div>\n <div\n class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\"\n >\n <span class=\"paginator-text\"\n >{{ cardData.length }} records loaded</span\n >\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <verben-visible-column\n (columnsUpdated)=\"onColumnsUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n [columns]=\"visibleColumns\"\n [displayedColumns]=\"5\"\n ></verben-visible-column>\n </div>\n <div filter-content>\n <verben-table-filter\n (filtersApplied)=\"onFilterUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"420px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"\n ></verben-table-filter>\n </div>\n <div sort-content>\n <verben-sort-table\n (selectedOptions)=\"onSortUpdated($event)\"\n [border]=\"'1px solid rgba(212, 160, 7, 1)'\"\n borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\"\n bgColor=\"white\"\n width=\"400px\"\n textColor=\"black\"\n pd=\"1rem\"\n primaryColor=\"#FFE681\"\n secondaryColor=\"#3479E9\"\n tertiaryColor=\"#404040\"\n [enableDragAndDrop]=\"true\"\n [sortOptions]=\"sortOptions\"\n ></verben-sort-table>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <!-- <verbena-button [fontWeight]=\"'bold'\" [bgColor]=\"'#8E8D87'\" [borderRadius]=\"'4px'\" [textColor]=\"'#fff'\"\n [text]=\"'Delete'\">\n </verbena-button> -->\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData.length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links\">\n Load more\n </button>\n </div>\n </div>\n</div>\n", styles: [".view-links{font-size:14px!important;color:#00f;font-weight:600;cursor:pointer}.view-links:hover{text-decoration:underline;text-underline-offset:3px}.context-banner{background-color:#d4a00773}.card-min-height{gap:10px}::ng-deep .childrenPadding{max-height:300px;overflow-y:auto}.pop-up-content{border-radius:4px;background-color:#fff;border:1px solid rgba(212,161,7,.5)}.pop-up-value{padding:10px 20px}.pop-up-content>div:nth-child(1){border-bottom:4px solid #FFE681}.width-max{min-width:max-content}\n"] }]
1531
+ }], ctorParameters: () => [{ type: i1.AuthorizationService }, { type: i2.RoleControlService }, { type: i3.UtilService }, { type: i4.HttpWebRequestService }, { type: i0.ChangeDetectorRef }, { type: i5.FormBuilder }, { type: i6.EnvironmentService }], propDecorators: { cardDataView: [{
1532
+ type: ViewChild,
1533
+ args: ['vdcv']
1534
+ }], dataView: [{
1535
+ type: ViewChild,
1536
+ args: ['vdv']
1537
+ }], popUps: [{
1538
+ type: ViewChildren,
1539
+ args: ['popup']
1540
+ }], tableView: [{
1541
+ type: ViewChild,
1542
+ args: ['dt']
1543
+ }], isGlobal: [{
1544
+ type: Input
1545
+ }], serviceName: [{
1546
+ type: Input
1547
+ }], application: [{
1548
+ type: Input
1549
+ }], pageSize: [{
1550
+ type: Input
1551
+ }], searchDebounceTime: [{
1552
+ type: Input
1553
+ }], permissionConfig: [{
1554
+ type: Input
1555
+ }] } });
1556
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1jb250cm9sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1hdXRoZW50aWNhdGlvbi11aS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1jb250cm9sL3JvbGUtY29udHJvbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tYXV0aGVudGljYXRpb24tdWkvc3JjL2xpYi9jb21wb25lbnRzL3JvbGUtY29udHJvbC9yb2xlLWNvbnRyb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxLQUFLLEVBR0wsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBSUwsY0FBYyxHQUtmLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFeEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUU1QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBUXhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSXJFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUs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QyxJQUFJLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7d0dBcHREVSxvQkFBb0I7NEZBQXBCLG9CQUFvQix1a0JDbkVqQyx3NHJCQTJqQkE7OzRGRHhmYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCO21SQWNULFlBQVk7c0JBQTlCLFNBQVM7dUJBQUMsTUFBTTtnQkFDQyxRQUFRO3NCQUF6QixTQUFTO3VCQUFDLEtBQUs7Z0JBQ08sTUFBTTtzQkFBNUIsWUFBWTt1QkFBQyxPQUFPO2dCQUNKLFNBQVM7c0JBQXpCLFNBQVM7dUJBQUMsSUFBSTtnQkFDTixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvbGVDb250cm9sU2VydmljZSB9IGZyb20gJy4vcm9sZS1jb250cm9sLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ2FyZERhdGEsXG4gIENhcmREYXRhVmlld0NvbXBvbmVudCxcbiAgQ29sdW1uRGVmaW5pdGlvbixcbiAgRGF0YUZpbHRlclR5cGUsXG4gIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgRGF0YVZpZXdDb21wb25lbnQsXG4gIElEYXRhRmlsdGVyLFxuICBWZXJiZW5Qb3BVcENvbXBvbmVudCxcbn0gZnJvbSAndmVyYmVuLW5nLXVpJztcbmltcG9ydCB7IFJvbGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvUm9sZSc7XG5pbXBvcnQgeyBiYXNlU3R5bGUgfSBmcm9tICcuL2Jhc2UtdGFibGUtc3R5bGUnO1xuaW1wb3J0IHsgT2JqZWN0U3RhdGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvb2JqZWN0LXN0YXRlJztcbmltcG9ydCB7IFJvbGVDb250ZXh0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL1JvbGVDb250ZXh0JztcbmltcG9ydCB7IFVJcyB9IGZyb20gJy4vVUlzJztcbmltcG9ydCB7IFJvbGVBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvUm9sZUFjdGlvbic7XG5pbXBvcnQgeyBVSUFjdGlvbnMgfSBmcm9tICcuL1VJQWN0aW9ucyc7XG5pbXBvcnQgeyBNYXBwZWRSb2xlIH0gZnJvbSAnLi9NYXBwZWRSb2xlJztcbmltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25Db25maWcsXG4gIEF1dGhvcml6YXRpb25TZXJ2aWNlLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRob3JpemF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFwcGVkUm9sZUNvbnRleHQgfSBmcm9tICcuL01hcHBlZFJvbGVDb250ZXh0JztcbmltcG9ydCB7IE1hcHBlZFJvbGVBY3Rpb24gfSBmcm9tICcuL01hcHBlZFJvbGVBY3Rpb24nO1xuaW1wb3J0IHsgQ2hpbGRyZW5UeXBlIH0gZnJvbSAnLi9DaGlsZHJlblR5cGUnO1xuaW1wb3J0IHtcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IEh0dHBXZWJSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAtd2ViLXJlcXVlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL0Vycm9yUmVzcG9uc2UnO1xuaW1wb3J0IHsgUGFnZWRSZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbHMvUGFnZWRSZXN1bHQnO1xuaW1wb3J0IHsgU2VhcmNoUHJvcGVydHlWYWx1ZSB9IGZyb20gJy4uLy4uL21vZGVscy9TZWFyY2hQcm9wZXJ0eVZhbHVlJztcbmltcG9ydCB7IFNlYXJjaE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1NlYXJjaE9wZXJhdG9yJztcbmltcG9ydCB7IFNlYXJjaFByb3BlcnR5U2lnbiB9IGZyb20gJy4uLy4uL21vZGVscy9TZWFyY2hQcm9wZXJ0eVNpZ24nO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW52aXJvbm1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblJvbGVDb250ZXh0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL0FwcGxpY2F0aW9uUm9sZUNvbnRleHQnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Sb2xlQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL0FwcGxpY2F0aW9uUm9sZUFjdGlvbic7XG5pbXBvcnQgeyBTZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9TZWFyY2hQcm9wZXJ0eVZhbHVlVHlwZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNvcnREaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvU29ydERpcmVjdGlvbic7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1Blcm1pc3Npb25Db25maWcnO1xuXG5lbnVtIERhdGVGaWx0ZXJUeXBlcyB7XG4gIEJlZm9yZSA9IFNlYXJjaFByb3BlcnR5U2lnbi5MVCxcbiAgT24gPSBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gIEFmdGVyID0gU2VhcmNoUHJvcGVydHlTaWduLkdULFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcm9sZS1jb250cm9sJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGUtY29udHJvbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9yb2xlLWNvbnRyb2wuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFJvbGVDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgdmlzaWJsZUNvbHVtbkRlZjogQ29sdW1uRGVmaW5pdGlvbjxNYXBwZWRSb2xlPltdID0gW107XG4gIHN0eWxlcyA9IGJhc2VTdHlsZTtcbiAgZGF0YTogTWFwcGVkUm9sZVtdID0gW107XG4gIGNhcmREYXRhOiBDYXJkRGF0YVtdID0gW107XG4gIGN1cnJlbnREYXRhOiBDYXJkRGF0YSB8IG51bGwgPSBudWxsO1xuICBjdXJyZW50RXhwYW5kZWRDYXJkOiBDYXJkRGF0YSB8IG51bGwgPSBudWxsO1xuICBjYXJkQ29udGV4dDogQ2FyZERhdGEgfCBudWxsID0gbnVsbDtcbiAgY2FyZENvbnRleHRIaXN0b3J5OiBDYXJkRGF0YVtdID0gW107XG4gIGNhcmRDb250ZXh0SGlzdG9yeURhdGE6IENhcmREYXRhW11bXSA9IFtdO1xuICBAVmlld0NoaWxkKCd2ZGN2JykgY2FyZERhdGFWaWV3ITogQ2FyZERhdGFWaWV3Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCd2ZHYnKSBkYXRhVmlldyE6IERhdGFWaWV3Q29tcG9uZW50O1xuICBAVmlld0NoaWxkcmVuKCdwb3B1cCcpIHBvcFVwcyE6IFF1ZXJ5TGlzdDxWZXJiZW5Qb3BVcENvbXBvbmVudD47XG4gIEBWaWV3Q2hpbGQoJ2R0JykgdGFibGVWaWV3ITogRGF0YVRhYmxlQ29tcG9uZW50PE1hcHBlZFJvbGU+O1xuICBASW5wdXQoKSBpc0dsb2JhbDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNlcnZpY2VOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYXBwbGljYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gMTA7XG4gIEBJbnB1dCgpIHNlYXJjaERlYm91bmNlVGltZTogbnVtYmVyID0gNTAwO1xuICBASW5wdXQoKSBwZXJtaXNzaW9uQ29uZmlnOiBQZXJtaXNzaW9uQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHBhZ2VTdGF0ZTogUGFnZWRSZXN1bHQ8Um9sZT4gfCBudWxsID0gbnVsbDtcbiAgc291cmNlRGF0YTogQXV0aG9yaXphdGlvbkNvbmZpZ1tdID0gW107XG4gIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBvcGVuRHJvcGRvd25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGN1cnJlbnRGaWx0ZXJzOiBJRGF0YUZpbHRlcltdID0gW107XG4gIGN1cnJlbnRTb3J0czogSURhdGFGaWx0ZXJbXSA9IFtdO1xuICBzZWFyY2hUZXJtJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICB2aXNpYmxlQ29sdW1uczogSURhdGFGaWx0ZXJbXSA9IFtdO1xuXG4gIGZpbHRlckFycmF5OiBJRGF0YUZpbHRlcltdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICdDcmVhdGVkQXQnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuRGF0ZSxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1VwZGF0ZWRBdCcsXG4gICAgICB0eXBlOiBEYXRhRmlsdGVyVHlwZS5EYXRlLFxuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgfSxcbiAgXTtcblxuICBzb3J0T3B0aW9uczogSURhdGFGaWx0ZXJbXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnQ3JlYXRlZEF0JyxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkRhdGUsXG4gICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdVcGRhdGVkQXQnLFxuICAgICAgdHlwZTogRGF0YUZpbHRlclR5cGUuRGF0ZSxcbiAgICAgIGNoZWNrZWQ6IGZhbHNlLFxuICAgIH0sXG4gIF07XG5cbiAgLy8gcHJpdmF0ZSBfc2VhcmNoSXRlbTogc3RyaW5nID0gJyc7XG4gIC8vIGdldCBzZWFyY2hJdGVtKCk6IHN0cmluZyB7XG4gIC8vICAgcmV0dXJuIHRoaXMuX3NlYXJjaEl0ZW1cbiAgLy8gfVxuICAvLyBzZXQgc2VhcmNoSXRlbSh2YWx1ZTogc3RyaW5nKSB7XG4gIC8vICAgdGhpcy5fc2VhcmNoSXRlbSA9IHZhbHVlO1xuICAvLyAgIHRoaXMuc2VhcmNoVGVybSQubmV4dCh2YWx1ZSk7XG4gIC8vIH1cblxuICAvLyBmb3JtOiBGb3JtR3JvdXA7XG4gIGNoaWxkUGVybWlzc2lvblJlZjogQ2hpbGRyZW5UeXBlID0gQ2hpbGRyZW5UeXBlLlBlcm1pc3Npb247XG5cbiAgcm9sZUNvbnRleHRzU3RvcmU6IEFwcGxpY2F0aW9uUm9sZUNvbnRleHRbXSA9IFtdO1xuICByb2xlQWN0aW9uc1N0b3JlOiBBcHBsaWNhdGlvblJvbGVBY3Rpb25bXSA9IFtdO1xuICBwcml2YXRlIGN1cnJlbnRTZWFyY2hUZXJtOiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRob3JpemF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvbGVDb250cm9sU3ZjOiBSb2xlQ29udHJvbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsU2VydmljZTogVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZXJ2ZXI6IEh0dHBXZWJSZXF1ZXN0U2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBlbnZTdmM6IEVudmlyb25tZW50U2VydmljZVxuICApIHtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5EZWYgPSByb2xlQ29udHJvbFN2Yy5yb2xlQ29sdW1ucztcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gcm9sZUNvbnRyb2xTdmMucm9sZUNvbHVtbnMubWFwKChjb2wpID0+ICh7XG4gICAgICBjaGVja2VkOiB0cnVlLFxuICAgICAgbmFtZTogdHlwZW9mIGNvbC5oZWFkZXIgPT09ICdzdHJpbmcnID8gY29sLmhlYWRlciA6IGNvbC5pZCxcbiAgICAgIHR5cGU6IERhdGFGaWx0ZXJUeXBlLkJvb2wsXG4gICAgfSkpO1xuICAgIC8vIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgIC8vICAgTmFtZTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIC8vIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbW9ja0RhdGEgPSB0aGlzLmdldE1vY2tSb2xlcygpO1xuICAgIGNvbnN0IHJvbGVzID0gYXdhaXQgdGhpcy5nZXRBbGxSb2xlcygpO1xuICAgIGlmICh0aGlzLmlzR2xvYmFsKSB7XG4gICAgICBjb25zdCBjb250ZXh0c1JlcyA9IGF3YWl0IHRoaXMuZ2V0U2F2ZWRDb250ZXh0cygpO1xuICAgICAgaWYgKGNvbnRleHRzUmVzKSB7XG4gICAgICAgIHRoaXMucm9sZUNvbnRleHRzU3RvcmUgPSBjb250ZXh0c1JlcztcbiAgICAgICAgdGhpcy5yb2xlQWN0aW9uc1N0b3JlID0gY29udGV4dHNSZXMuZmxhdE1hcCgoeCkgPT4geC5Sb2xlQWN0aW9ucyk7XG4gICAgICAgIGNvbnN0IGF1dGhDb25maWc6IEF1dGhvcml6YXRpb25Db25maWdbXSA9IGNvbnRleHRzUmVzLm1hcCgoeCkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBOYW1lOiB4Lk5hbWUsXG4gICAgICAgICAgICBBY3Rpb25zOiB4LlJvbGVBY3Rpb25zLm1hcCgoeSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4geS5OYW1lO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc291cmNlRGF0YSA9IGF1dGhDb25maWc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc291cmNlRGF0YSA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkNvbmZpZztcbiAgICB9XG4gICAgaWYgKHJvbGVzKSB7XG4gICAgICB0aGlzLnNldFVwTWFwcGVkRGF0YShyb2xlcyk7XG4gICAgICB0aGlzLnNldFVwQ2FyZERhdGEoKTtcbiAgICB9XG4gICAgdGhpcy5zZWFyY2hUZXJtJFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuc2VhcmNoRGVib3VuY2VUaW1lKSkgLy8gQWRqdXN0IGRlYm91bmNlIHRpbWUgaGVyZSAoaW4gbXMpXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChzZWFyY2hUZXJtKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0gPSBzZWFyY2hUZXJtO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnNBbmRTb3J0cyh0cnVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0U2F2ZWRDb250ZXh0cygpOiBQcm9taXNlPEFwcGxpY2F0aW9uUm9sZUNvbnRleHRbXSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5pc0dsb2JhbCB8fCAhdGhpcy5hcHBsaWNhdGlvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiAnQXBwbGljYXRpb24nLFxuICAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5hcHBsaWNhdGlvbixcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgfSxcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgUHJvcGVydHlOYW1lOiAnQVBJS2V5JyxcbiAgICAgIC8vICAgRW50aXR5VmFsdWU6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAgIC8vICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgIC8vICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgLy8gfSxcbiAgICBdO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoXG4gICAgICBgQXBwbGljYXRpb24vU2VhcmNoQXBwbGljYXRpb25Sb2xlQ29udGV4dHMvMC8wYCxcbiAgICAgIHBheWxvYWRcbiAgICApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8QXBwbGljYXRpb25Sb2xlQ29udGV4dD4pLlJlc3VsdDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIGFzeW5jIGdldEFsbFJvbGVzKCk6IFByb21pc2U8Um9sZVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gICB2YXIgcGF5bG9hZDogU2VhcmNoUHJvcGVydHlWYWx1ZVtdID0gW1xuICAgIC8vICAgICB7XG4gICAgLy8gICAgICAgUHJvcGVydHlOYW1lOiAnQVBJS2V5JyxcbiAgICAvLyAgICAgICBFbnRpdHlWYWx1ZTogdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQVBJS2V5LFxuICAgIC8vICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgLy8gICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRXG4gICAgLy8gICAgIH1cbiAgICAvLyBdXG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KGBSb2xlL0dldFJvbGVzLzAvJHt0aGlzLnBhZ2VTaXplfWApO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Um9sZT47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxSb2xlPikuUmVzdWx0O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkTW9yZSgpIHtcbiAgICBpZiAoIXRoaXMucGFnZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuY3VycmVudFNvcnRzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCB0aGlzLmxvYWRNb3JlRmlsdGVyc0FuZFNvcnRzKClcbiAgICAgICAgOiBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgICAgICBgUm9sZS9HZXRSb2xlcy8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX1gXG4gICAgICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlU3RhdGUgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Um9sZT47XG4gICAgICB2YXIgcmVzdWx0ID0gKHJlcyBhcyBQYWdlZFJlc3VsdDxSb2xlPikuUmVzdWx0O1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2V0VXBNYXBwZWREYXRhRXh0cmEocmVzdWx0KTtcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoZGF0YSk7XG4gICAgICB0aGlzLnNldFVwQ2FyZERhdGFFeHRyYShkYXRhKTtcbiAgICB9XG4gIH1cblxuICBnZXRBcHBsaWNhdGlvbkNvbnRleHRDb2RlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMucm9sZUNvbnRleHRzU3RvcmUuZmluZCgoeCkgPT4geC5OYW1lID09IG5hbWUpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5Db2RlIDogJyc7XG4gIH1cbiAgZ2V0QXBwbGljYXRpb25BY3Rpb25Db2RlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMucm9sZUFjdGlvbnNTdG9yZS5maW5kKCh4KSA9PiB4Lk5hbWUgPT0gbmFtZSk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLkNvZGUgOiAnJztcbiAgfVxuXG4gIGZpbmRQYXJlbnQoY2FyZERhdGE6IENhcmREYXRhW10sIHRhcmdldDogQ2FyZERhdGEpOiBDYXJkRGF0YSB8IG51bGwge1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjYXJkRGF0YSkge1xuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4uaW5jbHVkZXModGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gaXRlbTsgLy8gSW1tZWRpYXRlIHBhcmVudCBmb3VuZFxuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5maW5kUGFyZW50KGl0ZW0uY2hpbGRyZW4sIHRhcmdldCk7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsOyAvLyBOb3QgZm91bmRcbiAgfVxuXG4gIGlzQWxsU2VsZWN0ZWQoaXRlbTogQ2FyZERhdGEpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXJlbnQgPVxuICAgICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnlEYXRhLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmZpbmRQYXJlbnQodGhpcy5jYXJkQ29udGV4dEhpc3RvcnlEYXRhWzBdLCBpdGVtKVxuICAgICAgICA6IHRoaXMuZmluZFBhcmVudCh0aGlzLmNhcmREYXRhLCBpdGVtKTtcbiAgICBpZiAoXG4gICAgICBwYXJlbnQgJiZcbiAgICAgIHBhcmVudC5kYXRhLkNoaWxkcmVuVHlwZSAmJlxuICAgICAgcGFyZW50LmRhdGEuQ2hpbGRyZW5UeXBlID09IENoaWxkcmVuVHlwZS5BY3Rpb24gJiZcbiAgICAgIChwYXJlbnQuZGF0YSBhcyBNYXBwZWRSb2xlQ29udGV4dCkuUm9sZUFjdGlvbnMuc29tZSgoeSkgPT4gIXkuU2VsZWN0ZWQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcGFyZW50ICYmXG4gICAgICBwYXJlbnQuZGF0YS5DaGlsZHJlblR5cGUgJiZcbiAgICAgIHBhcmVudC5kYXRhLkNoaWxkcmVuVHlwZSA9PSBDaGlsZHJlblR5cGUuUGVybWlzc2lvbiAmJlxuICAgICAgKHBhcmVudC5kYXRhIGFzIE1hcHBlZFJvbGUpLlJvbGVDb250ZXh0cy5zb21lKCh5KSA9PiAheS5TZWxlY3RlZClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpc0NoZWNrYm94RGlzYWJsZWQoaXRlbTogQ2FyZERhdGEpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXJlbnQgPVxuICAgICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnlEYXRhLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmZpbmRQYXJlbnQodGhpcy5jYXJkQ29udGV4dEhpc3RvcnlEYXRhWzBdLCBpdGVtKVxuICAgICAgICA6IHRoaXMuZmluZFBhcmVudCh0aGlzLmNhcmREYXRhLCBpdGVtKTtcbiAgICBpZiAoXG4gICAgICBwYXJlbnQgJiZcbiAgICAgIHBhcmVudC5kYXRhLkNoaWxkcmVuVHlwZSAmJlxuICAgICAgcGFyZW50LmRhdGEuQ2hpbGRyZW5UeXBlID09IENoaWxkcmVuVHlwZS5BY3Rpb24gJiZcbiAgICAgIChwYXJlbnQuZGF0YS5TZWxlY3RlZCA9PSBmYWxzZSB8fFxuICAgICAgICAodGhpcy5wZXJtaXNzaW9uQ29uZmlnICE9IG51bGwgJiZcbiAgICAgICAgICAhdGhpcy5wZXJtaXNzaW9uQ29uZmlnLkFjdGlvbnNbJ0FkZEFjdGlvbiddKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBhcmVudCAmJlxuICAgICAgcGFyZW50LmRhdGEuQ2hpbGRyZW5UeXBlICYmXG4gICAgICBwYXJlbnQuZGF0YS5DaGlsZHJlblR5cGUgPT0gQ2hpbGRyZW5UeXBlLlBlcm1pc3Npb24gJiZcbiAgICAgIHRoaXMucGVybWlzc2lvbkNvbmZpZyAhPSBudWxsICYmXG4gICAgICAhdGhpcy5wZXJtaXNzaW9uQ29uZmlnLkFjdGlvbnNbJ0FkZENvbnRleHQnXVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNldFVwTWFwcGVkRGF0YShkYXRhOiBSb2xlW10pIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ueCxcbiAgICAgICAgSWQ6IHguQ29kZSxcbiAgICAgICAgQ2hpbGRyZW5UeXBlOiBDaGlsZHJlblR5cGUuUGVybWlzc2lvbixcbiAgICAgICAgUm9sZUNvbnRleHRzOiB0aGlzLnNvdXJjZURhdGEubWFwKChjb25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0geC5Sb2xlQ29udGV4dHMuZmluZEluZGV4KFxuICAgICAgICAgICAgKHkpID0+IHkuTmFtZSA9PSBjb25maWcuTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgdmFyIGNvbnRleHQ6IE1hcHBlZFJvbGVDb250ZXh0ID0ge1xuICAgICAgICAgICAgQ2hpbGRyZW5UeXBlOiBDaGlsZHJlblR5cGUuQWN0aW9uLFxuICAgICAgICAgICAgU2VsZWN0ZWQ6IGV4aXN0aW5nSWQgPiAtMSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIFJvbGVBY3Rpb25zOiBjb25maWcuQWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0FjdGlvbiA9XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xXG4gICAgICAgICAgICAgICAgICA/IHguUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAoYykgPT4gYy5OYW1lID09IGFjdGlvblxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IC0xO1xuXG4gICAgICAgICAgICAgIHZhciBhY3Q6IE1hcHBlZFJvbGVBY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgU2VsZWN0ZWQ6IGV4aXN0aW5nQWN0aW9uID4gLTEgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgTmFtZTogYWN0aW9uLFxuICAgICAgICAgICAgICAgIFJvbGU6IHguQ29kZSxcbiAgICAgICAgICAgICAgICBDb250ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICBpZDpcbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgPyB4LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Sb2xlQWN0aW9uc1tleGlzdGluZ0FjdGlvbl1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5Db2RlXG4gICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgSWQ6XG4gICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgID8geC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbZXhpc3RpbmdBY3Rpb25dXG4gICAgICAgICAgICAgICAgICAgICAgICAuQ29kZVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgICAgICAgICAgVGVuYW50SWQ6IHguVGVuYW50SWQsXG4gICAgICAgICAgICAgICAgQ29kZTpcbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgPyB4LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Sb2xlQWN0aW9uc1tleGlzdGluZ0FjdGlvbl1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5Db2RlXG4gICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgU2VydmljZU5hbWU6XG4gICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgID8geC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbZXhpc3RpbmdBY3Rpb25dXG4gICAgICAgICAgICAgICAgICAgICAgICAuU2VydmljZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICBBUElLZXk6XG4gICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgID8geC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbZXhpc3RpbmdBY3Rpb25dXG4gICAgICAgICAgICAgICAgICAgICAgICAuQVBJS2V5XG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQVBJS2V5LFxuICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uUm9sZUFjdGlvbjogdGhpcy5nZXRBcHBsaWNhdGlvbkFjdGlvbkNvZGUoYWN0aW9uKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFjdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgTmFtZTogY29uZmlnLk5hbWUsXG4gICAgICAgICAgICBSb2xlOiB4LkNvZGUsXG4gICAgICAgICAgICBpZDogZXhpc3RpbmdJZCA+IC0xID8geC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uQ29kZSA6ICcnLFxuICAgICAgICAgICAgSWQ6IGV4aXN0aW5nSWQgPiAtMSA/IHguUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLkNvZGUgOiAnJyxcbiAgICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICAgICAgVGVuYW50SWQ6IHguVGVuYW50SWQsXG4gICAgICAgICAgICBDb2RlOiBleGlzdGluZ0lkID4gLTEgPyB4LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Db2RlIDogJycsXG4gICAgICAgICAgICBTZXJ2aWNlTmFtZTpcbiAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xID8geC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uU2VydmljZU5hbWUgOiAnJyxcbiAgICAgICAgICAgIEFQSUtleTpcbiAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xXG4gICAgICAgICAgICAgICAgPyB4LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5BUElLZXlcbiAgICAgICAgICAgICAgICA6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAgICAgICAgIEFwcGxpY2F0aW9uUm9sZUNvbnRleHQ6IHRoaXMuZ2V0QXBwbGljYXRpb25Db250ZXh0Q29kZShjb25maWcuTmFtZSksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbiAgc2V0VXBNYXBwZWREYXRhRXh0cmEoZGF0YTogUm9sZVtdKTogTWFwcGVkUm9sZVtdIHtcbiAgICByZXR1cm4gZGF0YS5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLngsXG4gICAgICAgIElkOiB4LkNvZGUsXG4gICAgICAgIENoaWxkcmVuVHlwZTogQ2hpbGRyZW5UeXBlLlBlcm1pc3Npb24sXG4gICAgICAgIFJvbGVDb250ZXh0czogdGhpcy5zb3VyY2VEYXRhLm1hcCgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHguUm9sZUNvbnRleHRzLmZpbmRJbmRleChcbiAgICAgICAgICAgICh5KSA9PiB5Lk5hbWUgPT0gY29uZmlnLk5hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIHZhciBjb250ZXh0OiBNYXBwZWRSb2xlQ29udGV4dCA9IHtcbiAgICAgICAgICAgIENoaWxkcmVuVHlwZTogQ2hpbGRyZW5UeXBlLkFjdGlvbixcbiAgICAgICAgICAgIFNlbGVjdGVkOiBleGlzdGluZ0lkID4gLTEgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICBSb2xlQWN0aW9uczogY29uZmlnLkFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdBY3Rpb24gPVxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMVxuICAgICAgICAgICAgICAgICAgPyB4LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Sb2xlQWN0aW9ucy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgICAgKGMpID0+IGMuTmFtZSA9PSBhY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiAtMTtcblxuICAgICAgICAgICAgICB2YXIgYWN0OiBNYXBwZWRSb2xlQWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIFNlbGVjdGVkOiBleGlzdGluZ0FjdGlvbiA+IC0xID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIE5hbWU6IGFjdGlvbixcbiAgICAgICAgICAgICAgICBSb2xlOiB4LkNvZGUsXG4gICAgICAgICAgICAgICAgQ29udGV4dDogJycsXG4gICAgICAgICAgICAgICAgaWQ6XG4gICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgID8geC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbZXhpc3RpbmdBY3Rpb25dXG4gICAgICAgICAgICAgICAgICAgICAgICAuQ29kZVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgIElkOlxuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb24gPiAtMVxuICAgICAgICAgICAgICAgICAgICA/IHguUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW2V4aXN0aW5nQWN0aW9uXVxuICAgICAgICAgICAgICAgICAgICAgICAgLkNvZGVcbiAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICAgICAgICAgIFRlbmFudElkOiB4LlRlbmFudElkLFxuICAgICAgICAgICAgICAgIENvZGU6XG4gICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgID8geC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbZXhpc3RpbmdBY3Rpb25dXG4gICAgICAgICAgICAgICAgICAgICAgICAuQ29kZVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgIFNlcnZpY2VOYW1lOlxuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb24gPiAtMVxuICAgICAgICAgICAgICAgICAgICA/IHguUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW2V4aXN0aW5nQWN0aW9uXVxuICAgICAgICAgICAgICAgICAgICAgICAgLlNlcnZpY2VOYW1lXG4gICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgQVBJS2V5OlxuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb24gPiAtMVxuICAgICAgICAgICAgICAgICAgICA/IHguUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW2V4aXN0aW5nQWN0aW9uXVxuICAgICAgICAgICAgICAgICAgICAgICAgLkFQSUtleVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblJvbGVBY3Rpb246IHRoaXMuZ2V0QXBwbGljYXRpb25BY3Rpb25Db2RlKGFjdGlvbiksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybiBhY3Q7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIE5hbWU6IGNvbmZpZy5OYW1lLFxuICAgICAgICAgICAgUm9sZTogeC5Db2RlLFxuICAgICAgICAgICAgaWQ6IGV4aXN0aW5nSWQgPiAtMSA/IHguUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLkNvZGUgOiAnJyxcbiAgICAgICAgICAgIElkOiBleGlzdGluZ0lkID4gLTEgPyB4LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Db2RlIDogJycsXG4gICAgICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyxcbiAgICAgICAgICAgIFRlbmFudElkOiB4LlRlbmFudElkLFxuICAgICAgICAgICAgQ29kZTogZXhpc3RpbmdJZCA+IC0xID8geC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uQ29kZSA6ICcnLFxuICAgICAgICAgICAgU2VydmljZU5hbWU6XG4gICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMSA/IHguUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlNlcnZpY2VOYW1lIDogJycsXG4gICAgICAgICAgICBBUElLZXk6XG4gICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMVxuICAgICAgICAgICAgICAgID8geC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uQVBJS2V5XG4gICAgICAgICAgICAgICAgOiB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BUElLZXksXG4gICAgICAgICAgICBBcHBsaWNhdGlvblJvbGVDb250ZXh0OiB0aGlzLmdldEFwcGxpY2F0aW9uQ29udGV4dENvZGUoY29uZmlnLk5hbWUpLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0VXBDYXJkRGF0YSgpIHtcbiAgICBjb25zdCBjYXJkRGF0YTogQ2FyZERhdGFbXSA9IHRoaXMuZGF0YS5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IHguTmFtZSxcbiAgICAgICAgZGF0YTogeCxcbiAgICAgICAgYm9keTogW10sXG4gICAgICAgIGNoaWxkcmVuOiB4LlJvbGVDb250ZXh0cy5tYXAoKGMpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0Rm9ybWF0dGVkTmFtZShjLk5hbWUpLFxuICAgICAgICAgICAgZGF0YTogYyxcbiAgICAgICAgICAgIGJvZHk6IFtdLFxuICAgICAgICAgICAgY2hpbGRyZW46IGMuUm9sZUFjdGlvbnMubWFwKChhKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmdldEZvcm1hdHRlZE5hbWUoYS5OYW1lKSxcbiAgICAgICAgICAgICAgICBkYXRhOiBhLFxuICAgICAgICAgICAgICAgIGJvZHk6IFtdLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLmNhcmREYXRhID0gY2FyZERhdGE7XG4gIH1cbiAgc2V0VXBDYXJkRGF0YUV4dHJhKGJhc2VEYXRhOiBNYXBwZWRSb2xlW10pIHtcbiAgICBjb25zdCBjYXJkRGF0YTogQ2FyZERhdGFbXSA9IGJhc2VEYXRhLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICB0aXRsZTogeC5OYW1lLFxuICAgICAgICBkYXRhOiB4LFxuICAgICAgICBib2R5OiBbXSxcbiAgICAgICAgY2hpbGRyZW46IHguUm9sZUNvbnRleHRzLm1hcCgoYykgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5nZXRGb3JtYXR0ZWROYW1lKGMuTmFtZSksXG4gICAgICAgICAgICBkYXRhOiBjLFxuICAgICAgICAgICAgYm9keTogW10sXG4gICAgICAgICAgICBjaGlsZHJlbjogYy5Sb2xlQWN0aW9ucy5tYXAoKGEpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0Rm9ybWF0dGVkTmFtZShhLk5hbWUpLFxuICAgICAgICAgICAgICAgIGRhdGE6IGEsXG4gICAgICAgICAgICAgICAgYm9keTogW10sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuY2FyZERhdGEgPSB0aGlzLmNhcmREYXRhLmNvbmNhdChjYXJkRGF0YSk7XG4gIH1cblxuICBnZXRGb3JtYXR0ZWROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU3BsaXQgdGhlIGtleSBvbiBjYXBpdGFsIGxldHRlcnMsIGhhbmRsaW5nIFwiQW5kXCIgYXMgbG93ZXJjYXNlXG4gICAgY29uc3Qgd29yZHMgPSBuYW1lXG4gICAgICAuc3BsaXQoLyg/PVtBLVpdKS8pXG4gICAgICAubWFwKCh3b3JkKSA9PiAod29yZCA9PT0gJ0FuZCcgPyAnYW5kJyA6IHdvcmQpKTtcbiAgICAvLyBKb2luIHRoZSB3b3JkcyB3aXRoIHNwYWNlc1xuICAgIHJldHVybiB3b3Jkcy5qb2luKCcgJyk7XG4gIH1cblxuICB2aWV3RGV0YWlsc0Zyb21UYWJsZShkYXRhOiBNYXBwZWRSb2xlKSB7XG4gICAgY29uc3QgY2FyZERhdGEgPSB0aGlzLmNhcmREYXRhLmZpbmQoKHgpID0+IHguZGF0YSA9PSBkYXRhKTtcbiAgICBjb25zb2xlLmxvZyh7IERhdGE6IGRhdGEgfSk7XG4gICAgY29uc29sZS5sb2coeyBDYXJkRGF0YTogdGhpcy5jYXJkRGF0YSB9KTtcbiAgICBpZiAoY2FyZERhdGEpIHtcbiAgICAgIHRoaXMuZGF0YVZpZXcuaXNUYWJsZVZpZXcgPSBmYWxzZTtcbiAgICAgIHRoaXMudmlld0RldGFpbHMoY2FyZERhdGEpO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlUG9wVXAoKTtcbiAgfVxuXG4gIHZpZXdEZXRhaWxzKGNvbnRleHQ6IENhcmREYXRhKSB7XG4gICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnkucHVzaChjb250ZXh0KTtcbiAgICB0aGlzLmNhcmRDb250ZXh0SGlzdG9yeURhdGEucHVzaCh0aGlzLmNhcmREYXRhKTtcbiAgICB0aGlzLmNhcmREYXRhID0gY29udGV4dC5jaGlsZHJlbjtcbiAgICB0aGlzLmNhcmREYXRhVmlldy5jbGVhckRhdGEoKTtcbiAgfVxuICB2aWV3RGV0YWlsc0NoaWxkKGNvbnRleHQ6IENhcmREYXRhKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEV4cGFuZGVkQ2FyZCkge1xuICAgICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnkucHVzaCh0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmQpO1xuICAgICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnkucHVzaChjb250ZXh0KTtcbiAgICAgIHRoaXMuY2FyZENvbnRleHRIaXN0b3J5RGF0YS5wdXNoKHRoaXMuY2FyZERhdGEpO1xuICAgICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnlEYXRhLnB1c2godGhpcy5jdXJyZW50RXhwYW5kZWRDYXJkLmNoaWxkcmVuKTtcbiAgICAgIHRoaXMuY2FyZERhdGEgPSBjb250ZXh0LmNoaWxkcmVuO1xuICAgICAgdGhpcy5jYXJkRGF0YVZpZXcuY2xlYXJEYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgcm9sZUNhcmRDbGlja2VkKGl0ZW06IENhcmREYXRhKSB7XG4gICAgdGhpcy5jdXJyZW50RGF0YSA9IHRoaXMuY2FyZERhdGFWaWV3Lm9uSXRlbUNsaWNrKGl0ZW0pO1xuICAgIC8vIGlmICh0aGlzLmN1cnJlbnREYXRhKSB7XG4gICAgLy8gICB0aGlzLmZvcm0uY29udHJvbHNbJ05hbWUnXS5zZXRWYWx1ZSh0aGlzLmN1cnJlbnREYXRhLmRhdGE/Lk5hbWUpO1xuICAgIC8vIH1cbiAgfVxuXG4gIHRvZ2dsZUNoaWxkcmVuKGl0ZW06IENhcmREYXRhKSB7XG4gICAgdmFyIGN1cnJUb2dnbGVTdGF0ZSA9IGl0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkO1xuICAgIHRoaXMuY2FyZERhdGEuZm9yRWFjaCgoXykgPT4ge1xuICAgICAgXy5pc0NoaWxkcmVuRXhwYW5kZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgICBpdGVtLmlzQ2hpbGRyZW5FeHBhbmRlZCA9ICFjdXJyVG9nZ2xlU3RhdGU7XG4gICAgaWYgKGl0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmQgPSBpdGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdvVG9UYWJsZVZpZXcoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnREYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGF0YVZpZXcudG9nZ2xlVmlldygpO1xuICAgIGNvbnN0IGlkID0gdGhpcy5jdXJyZW50RGF0YS5kYXRhID8gdGhpcy5jdXJyZW50RGF0YS5kYXRhLklkIDogJyc7XG4gICAgaWYgKGlkLnRyaW0oKS5sZW5ndGggPiAwICYmICF0aGlzLnRhYmxlVmlldy5pc1Jvd0VkaXRpbmcoaWQpKSB7XG4gICAgICB0aGlzLnRhYmxlVmlldy50b2dnbGVSb3dFZGl0KGlkKTtcbiAgICB9XG4gIH1cbiAgY2xvc2VEZXRhaWxzKCkge1xuICAgIHRoaXMuY2FyZERhdGEgPVxuICAgICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnlEYXRhW3RoaXMuY2FyZENvbnRleHRIaXN0b3J5RGF0YS5sZW5ndGggLSAxXTtcbiAgICB0aGlzLmNhcmRDb250ZXh0SGlzdG9yeURhdGEucG9wKCk7XG4gICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnkucG9wKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhVmlldy5pc1RhYmxlVmlldykge1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnRvZ2dsZVZpZXcoKTtcbiAgICAgIH1cbiAgICB9LCAyMDApO1xuICB9XG5cbiAgZ2V0Q2FyZFN1YkNhcHRpb24oaXRlbTogQ2FyZERhdGEpIHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IGl0ZW0uY2hpbGRyZW4uZmlsdGVyKCh4KSA9PiB4LmRhdGEuU2VsZWN0ZWQpLmxlbmd0aDtcbiAgICBjb25zdCB0b3RhbCA9IGl0ZW0uY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHJldHVybiBgJHtzZWxlY3RlZH0gb2YgJHt0b3RhbH0gJHtcbiAgICAgIHRvdGFsID4gMSA/IGl0ZW0uZGF0YS5DaGlsZHJlblR5cGUgKyAncycgOiBpdGVtLmRhdGEuQ2hpbGRyZW5UeXBlXG4gICAgfWA7XG4gIH1cblxuICBnZXRVcGRhdGVkUm9sZShyb2xlOiBNYXBwZWRSb2xlKTogUm9sZSB7XG4gICAgY29uc3QgbmV3Um9sZSA9IHJvbGU7XG4gICAgbmV3Um9sZS5Sb2xlQ29udGV4dHMgPSByb2xlLlJvbGVDb250ZXh0cy5maWx0ZXIoKHgpID0+IHguU2VsZWN0ZWQpLm1hcChcbiAgICAgICh5KSA9PiB7XG4gICAgICAgIHkuUm9sZUFjdGlvbnMgPSB5LlJvbGVBY3Rpb25zLmZpbHRlcigoeikgPT4gei5TZWxlY3RlZCk7XG4gICAgICAgIHJldHVybiB5O1xuICAgICAgfVxuICAgICk7XG4gICAgbmV3Um9sZS5EYXRhU3RhdGUgPVxuICAgICAgbmV3Um9sZS5EYXRhU3RhdGUgPT0gT2JqZWN0U3RhdGUuTmV3XG4gICAgICAgID8gT2JqZWN0U3RhdGUuTmV3XG4gICAgICAgIDogT2JqZWN0U3RhdGUuQ2hhbmdlZDtcbiAgICBuZXdSb2xlLklkID0gJyc7XG4gICAgcmV0dXJuIG5ld1JvbGUgYXMgUm9sZTtcbiAgfVxuICBhc3luYyBzYXZlUm9sZSgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50RGF0YSkge1xuICAgICAgdmFyIHJvbGU6IE1hcHBlZFJvbGUgPSB0aGlzLmN1cnJlbnREYXRhLmRhdGEgYXMgTWFwcGVkUm9sZTtcbiAgICAgIC8vIHJvbGUuTmFtZSA9IHRoaXMuZm9ybS5jb250cm9sc1snTmFtZSddLnZhbHVlO1xuICAgICAgaWYgKHRoaXMuY3VycmVudERhdGEuZGF0YS5OYW1lLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKCdSb2xlIG5hbWUgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hcHBlZFJvbGUgPSB0aGlzLmdldFVwZGF0ZWRSb2xlKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocm9sZSkpKTtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChgUm9sZS9TYXZlUm9sZXNgLCBbbWFwcGVkUm9sZV0pO1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1JvbGUgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBSb2xlW107XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciByb2xlUmVzdWx0ID0gcmVzdWx0WzBdO1xuICAgICAgICAgIHZhciBtYXBwZWRSb2xlU2F2ZTogTWFwcGVkUm9sZSA9IHtcbiAgICAgICAgICAgIC4uLnJvbGVSZXN1bHQsXG4gICAgICAgICAgICBDaGlsZHJlblR5cGU6IENoaWxkcmVuVHlwZS5QZXJtaXNzaW9uLFxuICAgICAgICAgICAgUm9sZUNvbnRleHRzOiB0aGlzLnNvdXJjZURhdGEubWFwKChjb25maWcpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAoeSkgPT4geS5OYW1lID09IGNvbmZpZy5OYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHZhciBjb250ZXh0OiBNYXBwZWRSb2xlQ29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICBDaGlsZHJlblR5cGU6IENoaWxkcmVuVHlwZS5BY3Rpb24sXG4gICAgICAgICAgICAgICAgU2VsZWN0ZWQ6IGV4aXN0aW5nSWQgPiAtMSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBSb2xlQWN0aW9uczogY29uZmlnLkFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQWN0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xXG4gICAgICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdJZFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5Sb2xlQWN0aW9ucy5maW5kSW5kZXgoKGMpID0+IGMuTmFtZSA9PSBhY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgOiAtMTtcblxuICAgICAgICAgICAgICAgICAgdmFyIGFjdDogTWFwcGVkUm9sZUFjdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWQ6IGV4aXN0aW5nQWN0aW9uID4gLTEgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIE5hbWU6IGFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgUm9sZTogcm9sZVJlc3VsdC5Db2RlLFxuICAgICAgICAgICAgICAgICAgICBDb250ZXh0OiAnJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6XG4gICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb24gPiAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Sb2xlQWN0aW9uc1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLkNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgICAgIElkOlxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXS5Db2RlXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgICAgICAgICAgICAgIFRlbmFudElkOiByb2xlUmVzdWx0LlRlbmFudElkLFxuICAgICAgICAgICAgICAgICAgICBDb2RlOlxuICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXS5Db2RlXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0uU2VydmljZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgICAgIEFQSUtleTpcbiAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0uQVBJS2V5XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25Sb2xlQWN0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QXBwbGljYXRpb25BY3Rpb25Db2RlKGFjdGlvbiksXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBOYW1lOiBjb25maWcuTmFtZSxcbiAgICAgICAgICAgICAgICBSb2xlOiByb2xlUmVzdWx0LkNvZGUsXG4gICAgICAgICAgICAgICAgaWQ6XG4gICAgICAgICAgICAgICAgICBleGlzdGluZ0lkID4gLTFcbiAgICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Db2RlXG4gICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgSWQ6XG4gICAgICAgICAgICAgICAgICBleGlzdGluZ0lkID4gLTFcbiAgICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Db2RlXG4gICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyxcbiAgICAgICAgICAgICAgICBUZW5hbnRJZDogcm9sZVJlc3VsdC5UZW5hbnRJZCxcbiAgICAgICAgICAgICAgICBDb2RlOlxuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xXG4gICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uQ29kZVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgIFNlcnZpY2VOYW1lOlxuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xXG4gICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uU2VydmljZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICBBUElLZXk6XG4gICAgICAgICAgICAgICAgICBleGlzdGluZ0lkID4gLTFcbiAgICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5BUElLZXlcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BUElLZXksXG4gICAgICAgICAgICAgICAgQXBwbGljYXRpb25Sb2xlQ29udGV4dDogdGhpcy5nZXRBcHBsaWNhdGlvbkNvbnRleHRDb2RlKFxuICAgICAgICAgICAgICAgICAgY29uZmlnLk5hbWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuZGF0YS5maW5kSW5kZXgoXG4gICAgICAgICAgICAoeCkgPT4geCA9PSB0aGlzLmN1cnJlbnREYXRhPy5kYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoaXRlbUluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLkNvZGUgPSBtYXBwZWRSb2xlU2F2ZS5Db2RlO1xuICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uSWQgPSBtYXBwZWRSb2xlU2F2ZS5Db2RlO1xuICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uRGF0YVN0YXRlID0gbWFwcGVkUm9sZVNhdmUuRGF0YVN0YXRlO1xuICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uVGVuYW50SWQgPSBtYXBwZWRSb2xlU2F2ZS5UZW5hbnRJZDtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlNlcnZpY2VOYW1lID0gbWFwcGVkUm9sZVNhdmUuU2VydmljZU5hbWU7XG4gICAgICAgICAgICBtYXBwZWRSb2xlU2F2ZS5Sb2xlQ29udGV4dHMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Sb2xlQ29udGV4dHNbaV0uUm9sZSA9IG1hcHBlZFJvbGVTYXZlLkNvZGU7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlJvbGVDb250ZXh0c1tpXS5Db2RlID0geC5Db2RlO1xuICAgICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Sb2xlQ29udGV4dHNbaV0uU2VydmljZU5hbWUgPSB4LlNlcnZpY2VOYW1lO1xuICAgICAgICAgICAgICB4LlJvbGVBY3Rpb25zLmZvckVhY2goKHksIGopID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Sb2xlQ29udGV4dHNbaV0uUm9sZUFjdGlvbnNbal0uUm9sZSA9XG4gICAgICAgICAgICAgICAgICBtYXBwZWRSb2xlU2F2ZS5Db2RlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlJvbGVDb250ZXh0c1tpXS5Sb2xlQWN0aW9uc1tqXS5Db2RlID1cbiAgICAgICAgICAgICAgICAgIHkuQ29kZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Sb2xlQ29udGV4dHNbaV0uUm9sZUFjdGlvbnNbXG4gICAgICAgICAgICAgICAgICBqXG4gICAgICAgICAgICAgICAgXS5TZXJ2aWNlTmFtZSA9IHkuU2VydmljZU5hbWU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEubWFwKCh4KSA9PiB4KTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVJdGVtKHRoaXMuZGF0YVtpdGVtSW5kZXhdKTtcbiAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudERhdGEgPSB7XG4gICAgICAgICAgICAvLyAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgICAgLy8gICB0aXRsZTogbWFwcGVkUm9sZVNhdmUuTmFtZSxcbiAgICAgICAgICAgIC8vICAgZGF0YTogbWFwcGVkUm9sZVNhdmUsXG4gICAgICAgICAgICAvLyAgIGlzQ2hpbGRyZW5FeHBhbmRlZDogdGhpcy5jdXJyZW50RGF0YS5pc0NoaWxkcmVuRXhwYW5kZWQsXG4gICAgICAgICAgICAvLyAgIGJvZHk6IFtdLFxuICAgICAgICAgICAgLy8gICBjaGlsZHJlbjogbWFwcGVkUm9sZVNhdmUuUm9sZUNvbnRleHRzLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAvLyAgICAgICB0aXRsZTogdGhpcy5nZXRGb3JtYXR0ZWROYW1lKGMuTmFtZSksXG4gICAgICAgICAgICAvLyAgICAgICBkYXRhOiBjLFxuICAgICAgICAgICAgLy8gICAgICAgYm9keTogW10sXG4gICAgICAgICAgICAvLyAgICAgICBjaGlsZHJlbjogYy5Sb2xlQWN0aW9ucy5tYXAoKGEpID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0Rm9ybWF0dGVkTmFtZShhLk5hbWUpLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIGRhdGE6IGEsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgYm9keTogW10sXG4gICAgICAgICAgICAvLyAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgLy8gICAgICAgICB9O1xuICAgICAgICAgICAgLy8gICAgICAgfSksXG4gICAgICAgICAgICAvLyAgICAgfTtcbiAgICAgICAgICAgIC8vICAgfSksXG4gICAgICAgICAgICAvLyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBhc3luYyB0YWJsZVNhdmVSb2xlKHJvbGU6IE1hcHBlZFJvbGUsIGNhbGxCYWNrOiAoKSA9PiBhbnkpIHtcbiAgICBpZiAocm9sZS5OYW1lLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93SW5mbygnUm9sZSBuYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYXBwZWRSb2xlID0gdGhpcy5nZXRVcGRhdGVkUm9sZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJvbGUpKSk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChgUm9sZS9TYXZlUm9sZXNgLCBbbWFwcGVkUm9sZV0pO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dTdWNjZXNzKCdSb2xlIHNhdmVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzIGFzIFJvbGVbXTtcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgcm9sZVJlc3VsdCA9IHJlc3VsdFswXTtcbiAgICAgICAgdmFyIG1hcHBlZFJvbGVTYXZlOiBNYXBwZWRSb2xlID0ge1xuICAgICAgICAgIC4uLnJvbGVSZXN1bHQsXG4gICAgICAgICAgQ2hpbGRyZW5UeXBlOiBDaGlsZHJlblR5cGUuUGVybWlzc2lvbixcbiAgICAgICAgICBSb2xlQ29udGV4dHM6IHRoaXMuc291cmNlRGF0YS5tYXAoKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgKHkpID0+IHkuTmFtZSA9PSBjb25maWcuTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHZhciBjb250ZXh0OiBNYXBwZWRSb2xlQ29udGV4dCA9IHtcbiAgICAgICAgICAgICAgQ2hpbGRyZW5UeXBlOiBDaGlsZHJlblR5cGUuQWN0aW9uLFxuICAgICAgICAgICAgICBTZWxlY3RlZDogZXhpc3RpbmdJZCA+IC0xID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICBSb2xlQWN0aW9uczogY29uZmlnLkFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0FjdGlvbiA9XG4gICAgICAgICAgICAgICAgICBleGlzdGluZ0lkID4gLTFcbiAgICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Sb2xlQWN0aW9ucy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYykgPT4gYy5OYW1lID09IGFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiAtMTtcblxuICAgICAgICAgICAgICAgIHZhciBhY3Q6IE1hcHBlZFJvbGVBY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgICBTZWxlY3RlZDogZXhpc3RpbmdBY3Rpb24gPiAtMSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIE5hbWU6IGFjdGlvbixcbiAgICAgICAgICAgICAgICAgIFJvbGU6IHJvbGVSZXN1bHQuQ29kZSxcbiAgICAgICAgICAgICAgICAgIENvbnRleHQ6ICcnLFxuICAgICAgICAgICAgICAgICAgaWQ6XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgXS5Db2RlXG4gICAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICAgIElkOlxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Sb2xlQWN0aW9uc1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIF0uQ29kZVxuICAgICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyxcbiAgICAgICAgICAgICAgICAgIFRlbmFudElkOiByb2xlUmVzdWx0LlRlbmFudElkLFxuICAgICAgICAgICAgICAgICAgQ29kZTpcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb24gPiAtMVxuICAgICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBdLkNvZGVcbiAgICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgU2VydmljZU5hbWU6XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgXS5TZXJ2aWNlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgICBBUElLZXk6XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgXS5BUElLZXlcbiAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uUm9sZUFjdGlvbjogdGhpcy5nZXRBcHBsaWNhdGlvbkFjdGlvbkNvZGUoYWN0aW9uKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Q7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBOYW1lOiBjb25maWcuTmFtZSxcbiAgICAgICAgICAgICAgUm9sZTogcm9sZVJlc3VsdC5Db2RlLFxuICAgICAgICAgICAgICBpZDpcbiAgICAgICAgICAgICAgICBleGlzdGluZ0lkID4gLTEgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Db2RlIDogJycsXG4gICAgICAgICAgICAgIElkOlxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMSA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLkNvZGUgOiAnJyxcbiAgICAgICAgICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICAgICAgICBUZW5hbnRJZDogcm9sZVJlc3VsdC5UZW5hbnRJZCxcbiAgICAgICAgICAgICAgQ29kZTpcbiAgICAgICAgICAgICAgICBleGlzdGluZ0lkID4gLTEgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Db2RlIDogJycsXG4gICAgICAgICAgICAgIFNlcnZpY2VOYW1lOlxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMVxuICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5TZXJ2aWNlTmFtZVxuICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgQVBJS2V5OlxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMVxuICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5BUElLZXlcbiAgICAgICAgICAgICAgICAgIDogdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQVBJS2V5LFxuICAgICAgICAgICAgICBBcHBsaWNhdGlvblJvbGVDb250ZXh0OiB0aGlzLmdldEFwcGxpY2F0aW9uQ29udGV4dENvZGUoXG4gICAgICAgICAgICAgICAgY29uZmlnLk5hbWVcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuZGF0YS5maW5kSW5kZXgoXG4gICAgICAgICAgKHgpID0+IHggPT0gdGhpcy5jdXJyZW50RGF0YT8uZGF0YVxuICAgICAgICApO1xuICAgICAgICBpZiAoaXRlbUluZGV4ID4gLTEpIHtcbiAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Db2RlID0gbWFwcGVkUm9sZVNhdmUuQ29kZTtcbiAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5JZCA9IG1hcHBlZFJvbGVTYXZlLkNvZGU7XG4gICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uRGF0YVN0YXRlID0gbWFwcGVkUm9sZVNhdmUuRGF0YVN0YXRlO1xuICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlRlbmFudElkID0gbWFwcGVkUm9sZVNhdmUuVGVuYW50SWQ7XG4gICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uU2VydmljZU5hbWUgPSBtYXBwZWRSb2xlU2F2ZS5TZXJ2aWNlTmFtZTtcbiAgICAgICAgICBtYXBwZWRSb2xlU2F2ZS5Sb2xlQ29udGV4dHMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uUm9sZUNvbnRleHRzW2ldLlJvbGUgPSBtYXBwZWRSb2xlU2F2ZS5Db2RlO1xuICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uUm9sZUNvbnRleHRzW2ldLkNvZGUgPSB4LkNvZGU7XG4gICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Sb2xlQ29udGV4dHNbaV0uU2VydmljZU5hbWUgPSB4LlNlcnZpY2VOYW1lO1xuICAgICAgICAgICAgeC5Sb2xlQWN0aW9ucy5mb3JFYWNoKCh5LCBqKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlJvbGVDb250ZXh0c1tpXS5Sb2xlQWN0aW9uc1tqXS5Sb2xlID1cbiAgICAgICAgICAgICAgICBtYXBwZWRSb2xlU2F2ZS5Db2RlO1xuICAgICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Sb2xlQ29udGV4dHNbaV0uUm9sZUFjdGlvbnNbal0uQ29kZSA9IHkuQ29kZTtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uUm9sZUNvbnRleHRzW2ldLlJvbGVBY3Rpb25zW2pdLlNlcnZpY2VOYW1lID1cbiAgICAgICAgICAgICAgICB5LlNlcnZpY2VOYW1lO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLm1hcCgoeCkgPT4geCk7XG4gICAgICAgICAgdGhpcy5jYWNoZUl0ZW0odGhpcy5kYXRhW2l0ZW1JbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxCYWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZVJvbGVEeW5hbWljKGl0ZW06IENhcmREYXRhKSB7XG4gICAgaWYgKHRoaXMuaXNDaGVja2JveERpc2FibGVkKGl0ZW0pKSB7XG4gICAgICB0aGlzLnV0aWxTZXJ2aWNlLnNob3dJbmZvKCdQYXJlbnQgVUkgbm90IHNlbGVjdGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHJvbGU6IENhcmREYXRhIHwgbnVsbCA9XG4gICAgICB0aGlzLmNhcmRDb250ZXh0SGlzdG9yeS5sZW5ndGggPiAwXG4gICAgICAgID8gdGhpcy5jYXJkQ29udGV4dEhpc3RvcnlbMF1cbiAgICAgICAgOiB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmRcbiAgICAgICAgPyB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmRcbiAgICAgICAgOiBudWxsO1xuICAgIHZhciBjYXJkRGF0YVJlZjogQ2FyZERhdGFbXSB8IG51bGwgPVxuICAgICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnlEYXRhLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmNhcmRDb250ZXh0SGlzdG9yeURhdGFbMF1cbiAgICAgICAgOiB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmRcbiAgICAgICAgPyB0aGlzLmNhcmREYXRhXG4gICAgICAgIDogbnVsbDtcbiAgICAvLyBjb25zdCBpc0V4cGFuZGVkQ2FyZDogYm9vbGVhbiA9XG4gICAgLy8gICB0aGlzLmNhcmRDb250ZXh0SGlzdG9yeS5sZW5ndGggPiAwXG4gICAgLy8gICAgID8gZmFsc2VcbiAgICAvLyAgICAgOiB0aGlzLmN1cnJlbnRFeHBhbmRlZENhcmRcbiAgICAvLyAgICAgPyB0cnVlXG4gICAgLy8gICAgIDogZmFsc2U7XG4gICAgaWYgKCFyb2xlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyb2xlLmRhdGEuTmFtZS50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgIGl0ZW0uZGF0YS5TZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93SW5mbygnUm9sZSBuYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmRhdGEuU2VsZWN0ZWQgPSAhaXRlbS5kYXRhLlNlbGVjdGVkO1xuICAgIGNvbnN0IG1hcHBlZFJvbGUgPSB0aGlzLmdldFVwZGF0ZWRSb2xlKFxuICAgICAgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyb2xlLmRhdGEpKVxuICAgICk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChgUm9sZS9TYXZlUm9sZXNgLCBbbWFwcGVkUm9sZV0pO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKGZhbHNlKTtcbiAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3JSZXNwb25zZSkge1xuICAgICAgaXRlbS5kYXRhLlNlbGVjdGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd1N1Y2Nlc3MoJ1JvbGUgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXMgYXMgUm9sZVtdO1xuICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByb2xlUmVzdWx0ID0gcmVzdWx0WzBdO1xuICAgICAgICB2YXIgbWFwcGVkUm9sZVNhdmU6IE1hcHBlZFJvbGUgPSB7XG4gICAgICAgICAgLi4ucm9sZVJlc3VsdCxcbiAgICAgICAgICBDaGlsZHJlblR5cGU6IENoaWxkcmVuVHlwZS5QZXJtaXNzaW9uLFxuICAgICAgICAgIFJvbGVDb250ZXh0czogdGhpcy5zb3VyY2VEYXRhLm1hcCgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHMuZmluZEluZGV4KFxuICAgICAgICAgICAgICAoeSkgPT4geS5OYW1lID09IGNvbmZpZy5OYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdmFyIGNvbnRleHQ6IE1hcHBlZFJvbGVDb250ZXh0ID0ge1xuICAgICAgICAgICAgICBDaGlsZHJlblR5cGU6IENoaWxkcmVuVHlwZS5BY3Rpb24sXG4gICAgICAgICAgICAgIFNlbGVjdGVkOiBleGlzdGluZ0lkID4gLTEgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgICAgICAgIFJvbGVBY3Rpb25zOiBjb25maWcuQWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQWN0aW9uID1cbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMVxuICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zLmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjKSA9PiBjLk5hbWUgPT0gYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICAgICAgICAgIHZhciBhY3Q6IE1hcHBlZFJvbGVBY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgICBTZWxlY3RlZDogZXhpc3RpbmdBY3Rpb24gPiAtMSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIE5hbWU6IGFjdGlvbixcbiAgICAgICAgICAgICAgICAgIFJvbGU6IHJvbGVSZXN1bHQuQ29kZSxcbiAgICAgICAgICAgICAgICAgIENvbnRleHQ6ICcnLFxuICAgICAgICAgICAgICAgICAgaWQ6XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgXS5Db2RlXG4gICAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICAgIElkOlxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Sb2xlQWN0aW9uc1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIF0uQ29kZVxuICAgICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyxcbiAgICAgICAgICAgICAgICAgIFRlbmFudElkOiByb2xlUmVzdWx0LlRlbmFudElkLFxuICAgICAgICAgICAgICAgICAgQ29kZTpcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb24gPiAtMVxuICAgICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBdLkNvZGVcbiAgICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgU2VydmljZU5hbWU6XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgXS5TZXJ2aWNlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgICBBUElLZXk6XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgXS5BUElLZXlcbiAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uUm9sZUFjdGlvbjogdGhpcy5nZXRBcHBsaWNhdGlvbkFjdGlvbkNvZGUoYWN0aW9uKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Q7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBOYW1lOiBjb25maWcuTmFtZSxcbiAgICAgICAgICAgICAgUm9sZTogcm9sZVJlc3VsdC5Db2RlLFxuICAgICAgICAgICAgICBpZDpcbiAgICAgICAgICAgICAgICBleGlzdGluZ0lkID4gLTEgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Db2RlIDogJycsXG4gICAgICAgICAgICAgIElkOlxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMSA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLkNvZGUgOiAnJyxcbiAgICAgICAgICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICAgICAgICBUZW5hbnRJZDogcm9sZVJlc3VsdC5UZW5hbnRJZCxcbiAgICAgICAgICAgICAgQ29kZTpcbiAgICAgICAgICAgICAgICBleGlzdGluZ0lkID4gLTEgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Db2RlIDogJycsXG4gICAgICAgICAgICAgIFNlcnZpY2VOYW1lOlxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMVxuICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5TZXJ2aWNlTmFtZVxuICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgQVBJS2V5OlxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMVxuICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5BUElLZXlcbiAgICAgICAgICAgICAgICAgIDogdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQVBJS2V5LFxuICAgICAgICAgICAgICBBcHBsaWNhdGlvblJvbGVDb250ZXh0OiB0aGlzLmdldEFwcGxpY2F0aW9uQ29udGV4dENvZGUoXG4gICAgICAgICAgICAgICAgY29uZmlnLk5hbWVcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaXRlbUluZGV4ID0gY2FyZERhdGFSZWZcbiAgICAgICAgICA/IGNhcmREYXRhUmVmLmZpbmRJbmRleCgoeCkgPT4geC5kYXRhID09IHJvbGU/LmRhdGEpXG4gICAgICAgICAgOiAtMTtcbiAgICAgICAgaWYgKGl0ZW1JbmRleCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uQ29kZSA9IG1hcHBlZFJvbGVTYXZlLkNvZGU7XG4gICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uSWQgPSBtYXBwZWRSb2xlU2F2ZS5Db2RlO1xuICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLkRhdGFTdGF0ZSA9IG1hcHBlZFJvbGVTYXZlLkRhdGFTdGF0ZTtcbiAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5UZW5hbnRJZCA9IG1hcHBlZFJvbGVTYXZlLlRlbmFudElkO1xuICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlNlcnZpY2VOYW1lID0gbWFwcGVkUm9sZVNhdmUuU2VydmljZU5hbWU7XG4gICAgICAgICAgbWFwcGVkUm9sZVNhdmUuUm9sZUNvbnRleHRzLmZvckVhY2goKHgsIGkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlJvbGVDb250ZXh0c1tpXS5Sb2xlID0gbWFwcGVkUm9sZVNhdmUuQ29kZTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlJvbGVDb250ZXh0c1tpXS5Db2RlID0geC5Db2RlO1xuICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uUm9sZUNvbnRleHRzW2ldLlNlcnZpY2VOYW1lID0geC5TZXJ2aWNlTmFtZTtcbiAgICAgICAgICAgIHguUm9sZUFjdGlvbnMuZm9yRWFjaCgoeSwgaikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Sb2xlQ29udGV4dHNbaV0uUm9sZUFjdGlvbnNbal0uUm9sZSA9XG4gICAgICAgICAgICAgICAgbWFwcGVkUm9sZVNhdmUuQ29kZTtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uUm9sZUNvbnRleHRzW2ldLlJvbGVBY3Rpb25zW2pdLkNvZGUgPSB5LkNvZGU7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlJvbGVDb250ZXh0c1tpXS5Sb2xlQWN0aW9uc1tqXS5TZXJ2aWNlTmFtZSA9XG4gICAgICAgICAgICAgICAgeS5TZXJ2aWNlTmFtZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlJvbGVDb250ZXh0cyA9IG1hcHBlZFJvbGVTYXZlLlJvbGVDb250ZXh0cztcblxuICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5tYXAoKHgpID0+IHgpO1xuICAgICAgICAgIC8vIGlmIChjYXJkRGF0YVJlZikge1xuICAgICAgICAgIC8vICAgY29uc29sZS5sb2coe1xuICAgICAgICAgIC8vICAgICBYRGF0YUlzSGVyZTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjYXJkRGF0YVJlZikpLFxuICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgLy8gICBjYXJkRGF0YVJlZltpdGVtSW5kZXhdID0ge1xuICAgICAgICAgIC8vICAgICBzZWxlY3RlZDogY2FyZERhdGFSZWZbaXRlbUluZGV4XS5zZWxlY3RlZCxcbiAgICAgICAgICAvLyAgICAgaXNDaGlsZHJlbkV4cGFuZGVkOiBjYXJkRGF0YVJlZltpdGVtSW5kZXhdLmlzQ2hpbGRyZW5FeHBhbmRlZCxcbiAgICAgICAgICAvLyAgICAgdGl0bGU6IG1hcHBlZFJvbGVTYXZlLk5hbWUsXG4gICAgICAgICAgLy8gICAgIGRhdGE6IG1hcHBlZFJvbGVTYXZlLFxuICAgICAgICAgIC8vICAgICBib2R5OiBbXSxcbiAgICAgICAgICAvLyAgICAgY2hpbGRyZW46IG1hcHBlZFJvbGVTYXZlLlJvbGVDb250ZXh0cy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAvLyAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC8vICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgIC8vICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0Rm9ybWF0dGVkTmFtZShjLk5hbWUpLFxuICAgICAgICAgIC8vICAgICAgICAgZGF0YTogYyxcbiAgICAgICAgICAvLyAgICAgICAgIGJvZHk6IFtdLFxuICAgICAgICAgIC8vICAgICAgICAgY2hpbGRyZW46IGMuUm9sZUFjdGlvbnMubWFwKChhKSA9PiB7XG4gICAgICAgICAgLy8gICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLy8gICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgIC8vICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmdldEZvcm1hdHRlZE5hbWUoYS5OYW1lKSxcbiAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhOiBhLFxuICAgICAgICAgIC8vICAgICAgICAgICAgIGJvZHk6IFtdLFxuICAgICAgICAgIC8vICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAvLyAgICAgICAgICAgfTtcbiAgICAgICAgICAvLyAgICAgICAgIH0pLFxuICAgICAgICAgIC8vICAgICAgIH07XG4gICAgICAgICAgLy8gICAgIH0pLFxuICAgICAgICAgIC8vICAgfTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlQWxsUm9sZUR5bmFtaWMoaXRlbTogQ2FyZERhdGEpIHtcbiAgICBpZiAodGhpcy5pc0NoZWNrYm94RGlzYWJsZWQoaXRlbSkpIHtcbiAgICAgIHRoaXMudXRpbFNlcnZpY2Uuc2hvd0luZm8oJ1BhcmVudCBVSSBub3Qgc2VsZWN0ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcm9sZTogQ2FyZERhdGEgfCBudWxsID1cbiAgICAgIHRoaXMuY2FyZENvbnRleHRIaXN0b3J5Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmNhcmRDb250ZXh0SGlzdG9yeVswXVxuICAgICAgICA6IHRoaXMuY3VycmVudEV4cGFuZGVkQ2FyZFxuICAgICAgICA/IHRoaXMuY3VycmVudEV4cGFuZGVkQ2FyZFxuICAgICAgICA6IG51bGw7XG4gICAgdmFyIGNhcmREYXRhUmVmOiBDYXJkRGF0YVtdIHwgbnVsbCA9XG4gICAgICB0aGlzLmNhcmRDb250ZXh0SGlzdG9yeURhdGEubGVuZ3RoID4gMFxuICAgICAgICA/IHRoaXMuY2FyZENvbnRleHRIaXN0b3J5RGF0YVswXVxuICAgICAgICA6IHRoaXMuY3VycmVudEV4cGFuZGVkQ2FyZFxuICAgICAgICA/IHRoaXMuY2FyZERhdGFcbiAgICAgICAgOiBudWxsO1xuICAgIC8vIGNvbnN0IGlzRXhwYW5kZWRDYXJkOiBib29sZWFuID1cbiAgICAvLyAgIHRoaXMuY2FyZENvbnRleHRIaXN0b3J5Lmxlbmd0aCA+IDBcbiAgICAvLyAgICAgPyBmYWxzZVxuICAgIC8vICAgICA6IHRoaXMuY3VycmVudEV4cGFuZGVkQ2FyZFxuICAgIC8vICAgICA/IHRydWVcbiAgICAvLyAgICAgOiBmYWxzZTtcbiAgICBpZiAoIXJvbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJvbGUuZGF0YS5OYW1lLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93SW5mbygnUm9sZSBuYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSB0aGlzLmlzQWxsU2VsZWN0ZWQoaXRlbSk7XG5cbiAgICBjb25zdCBwYXJlbnQgPVxuICAgICAgdGhpcy5jYXJkQ29udGV4dEhpc3RvcnlEYXRhLmxlbmd0aCA+IDBcbiAgICAgICAgPyB0aGlzLmZpbmRQYXJlbnQodGhpcy5jYXJkQ29udGV4dEhpc3RvcnlEYXRhWzBdLCBpdGVtKVxuICAgICAgICA6IHRoaXMuZmluZFBhcmVudCh0aGlzLmNhcmREYXRhLCBpdGVtKTtcbiAgICBpZiAoXG4gICAgICBwYXJlbnQgJiZcbiAgICAgIHBhcmVudC5kYXRhLkNoaWxkcmVuVHlwZSAmJlxuICAgICAgcGFyZW50LmRhdGEuQ2hpbGRyZW5UeXBlID09IENoaWxkcmVuVHlwZS5BY3Rpb25cbiAgICApIHtcbiAgICAgIChwYXJlbnQuZGF0YSBhcyBNYXBwZWRSb2xlQ29udGV4dCkuUm9sZUFjdGlvbnMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICB4LlNlbGVjdGVkID0gIWlzQWxsU2VsZWN0ZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwYXJlbnQgJiZcbiAgICAgIHBhcmVudC5kYXRhLkNoaWxkcmVuVHlwZSAmJlxuICAgICAgcGFyZW50LmRhdGEuQ2hpbGRyZW5UeXBlID09IENoaWxkcmVuVHlwZS5QZXJtaXNzaW9uXG4gICAgKSB7XG4gICAgICAocGFyZW50LmRhdGEgYXMgTWFwcGVkUm9sZSkuUm9sZUNvbnRleHRzLmZvckVhY2goKHgpID0+IHtcbiAgICAgICAgeC5TZWxlY3RlZCA9ICFpc0FsbFNlbGVjdGVkO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWFwcGVkUm9sZSA9IHRoaXMuZ2V0VXBkYXRlZFJvbGUoXG4gICAgICBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJvbGUuZGF0YSkpXG4gICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSSh0cnVlKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlcnZlci5wb3N0KGBSb2xlL1NhdmVSb2xlc2AsIFttYXBwZWRSb2xlXSk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICBpdGVtLmRhdGEuU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51dGlsU2VydmljZS5zaG93U3VjY2VzcygnUm9sZSBzYXZlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcyBhcyBSb2xlW107XG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHJvbGVSZXN1bHQgPSByZXN1bHRbMF07XG4gICAgICAgIHZhciBtYXBwZWRSb2xlU2F2ZTogTWFwcGVkUm9sZSA9IHtcbiAgICAgICAgICAuLi5yb2xlUmVzdWx0LFxuICAgICAgICAgIENoaWxkcmVuVHlwZTogQ2hpbGRyZW5UeXBlLlBlcm1pc3Npb24sXG4gICAgICAgICAgUm9sZUNvbnRleHRzOiB0aGlzLnNvdXJjZURhdGEubWFwKChjb25maWcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSByb2xlUmVzdWx0LlJvbGVDb250ZXh0cy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICh5KSA9PiB5Lk5hbWUgPT0gY29uZmlnLk5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YXIgY29udGV4dDogTWFwcGVkUm9sZUNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIENoaWxkcmVuVHlwZTogQ2hpbGRyZW5UeXBlLkFjdGlvbixcbiAgICAgICAgICAgICAgU2VsZWN0ZWQ6IGV4aXN0aW5nSWQgPiAtMSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgICAgUm9sZUFjdGlvbnM6IGNvbmZpZy5BY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdBY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xXG4gICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnMuZmluZEluZGV4KFxuICAgICAgICAgICAgICAgICAgICAgICAgKGMpID0+IGMuTmFtZSA9PSBhY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIDogLTE7XG4gICAgICAgICAgICAgICAgdmFyIGFjdDogTWFwcGVkUm9sZUFjdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgIFNlbGVjdGVkOiBleGlzdGluZ0FjdGlvbiA+IC0xID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgTmFtZTogYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgUm9sZTogcm9sZVJlc3VsdC5Db2RlLFxuICAgICAgICAgICAgICAgICAgQ29udGV4dDogJycsXG4gICAgICAgICAgICAgICAgICBpZDpcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb24gPiAtMVxuICAgICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBdLkNvZGVcbiAgICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgSWQ6XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlJvbGVBY3Rpb25zW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgXS5Db2RlXG4gICAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICAgICAgICAgICAgVGVuYW50SWQ6IHJvbGVSZXN1bHQuVGVuYW50SWQsXG4gICAgICAgICAgICAgICAgICBDb2RlOlxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0FjdGlvbiA+IC0xXG4gICAgICAgICAgICAgICAgICAgICAgPyByb2xlUmVzdWx0LlJvbGVDb250ZXh0c1tleGlzdGluZ0lkXS5Sb2xlQWN0aW9uc1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIF0uQ29kZVxuICAgICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgICBTZXJ2aWNlTmFtZTpcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb24gPiAtMVxuICAgICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBdLlNlcnZpY2VOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICAgIEFQSUtleTpcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdBY3Rpb24gPiAtMVxuICAgICAgICAgICAgICAgICAgICAgID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uUm9sZUFjdGlvbnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBdLkFQSUtleVxuICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQVBJS2V5LFxuICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25Sb2xlQWN0aW9uOiB0aGlzLmdldEFwcGxpY2F0aW9uQWN0aW9uQ29kZShhY3Rpb24pLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIE5hbWU6IGNvbmZpZy5OYW1lLFxuICAgICAgICAgICAgICBSb2xlOiByb2xlUmVzdWx0LkNvZGUsXG4gICAgICAgICAgICAgIGlkOlxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMSA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLkNvZGUgOiAnJyxcbiAgICAgICAgICAgICAgSWQ6XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xID8gcm9sZVJlc3VsdC5Sb2xlQ29udGV4dHNbZXhpc3RpbmdJZF0uQ29kZSA6ICcnLFxuICAgICAgICAgICAgICBDcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgIFVwZGF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgICAgICAgIFRlbmFudElkOiByb2xlUmVzdWx0LlRlbmFudElkLFxuICAgICAgICAgICAgICBDb2RlOlxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSWQgPiAtMSA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLkNvZGUgOiAnJyxcbiAgICAgICAgICAgICAgU2VydmljZU5hbWU6XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xXG4gICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLlNlcnZpY2VOYW1lXG4gICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICBBUElLZXk6XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdJZCA+IC0xXG4gICAgICAgICAgICAgICAgICA/IHJvbGVSZXN1bHQuUm9sZUNvbnRleHRzW2V4aXN0aW5nSWRdLkFQSUtleVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BUElLZXksXG4gICAgICAgICAgICAgIEFwcGxpY2F0aW9uUm9sZUNvbnRleHQ6IHRoaXMuZ2V0QXBwbGljYXRpb25Db250ZXh0Q29kZShcbiAgICAgICAgICAgICAgICBjb25maWcuTmFtZVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpdGVtSW5kZXggPSBjYXJkRGF0YVJlZlxuICAgICAgICAgID8gY2FyZERhdGFSZWYuZmluZEluZGV4KCh4KSA9PiB4LmRhdGEgPT0gcm9sZT8uZGF0YSlcbiAgICAgICAgICA6IC0xO1xuICAgICAgICBpZiAoaXRlbUluZGV4ID4gLTEpIHtcbiAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Db2RlID0gbWFwcGVkUm9sZVNhdmUuQ29kZTtcbiAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5JZCA9IG1hcHBlZFJvbGVTYXZlLkNvZGU7XG4gICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uRGF0YVN0YXRlID0gbWFwcGVkUm9sZVNhdmUuRGF0YVN0YXRlO1xuICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlRlbmFudElkID0gbWFwcGVkUm9sZVNhdmUuVGVuYW50SWQ7XG4gICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uU2VydmljZU5hbWUgPSBtYXBwZWRSb2xlU2F2ZS5TZXJ2aWNlTmFtZTtcbiAgICAgICAgICBtYXBwZWRSb2xlU2F2ZS5Sb2xlQ29udGV4dHMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uUm9sZUNvbnRleHRzW2ldLlJvbGUgPSBtYXBwZWRSb2xlU2F2ZS5Db2RlO1xuICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uUm9sZUNvbnRleHRzW2ldLkNvZGUgPSB4LkNvZGU7XG4gICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Sb2xlQ29udGV4dHNbaV0uU2VydmljZU5hbWUgPSB4LlNlcnZpY2VOYW1lO1xuICAgICAgICAgICAgeC5Sb2xlQWN0aW9ucy5mb3JFYWNoKCh5LCBqKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtSW5kZXhdLlJvbGVDb250ZXh0c1tpXS5Sb2xlQWN0aW9uc1tqXS5Sb2xlID1cbiAgICAgICAgICAgICAgICBtYXBwZWRSb2xlU2F2ZS5Db2RlO1xuICAgICAgICAgICAgICB0aGlzLmRhdGFbaXRlbUluZGV4XS5Sb2xlQ29udGV4dHNbaV0uUm9sZUFjdGlvbnNbal0uQ29kZSA9IHkuQ29kZTtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhW2l0ZW1JbmRleF0uUm9sZUNvbnRleHRzW2ldLlJvbGVBY3Rpb25zW2pdLlNlcnZpY2VOYW1lID1cbiAgICAgICAgICAgICAgICB5LlNlcnZpY2VOYW1lO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gdGhpcy5kYXRhW2l0ZW1JbmRleF0uUm9sZUNvbnRleHRzID0gbWFwcGVkUm9sZVNhdmUuUm9sZUNvbnRleHRzO1xuXG4gICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLm1hcCgoeCkgPT4geCk7XG4gICAgICAgICAgLy8gaWYgKGNhcmREYXRhUmVmKSB7XG4gICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh7XG4gICAgICAgICAgLy8gICAgIFhEYXRhSXNIZXJlOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNhcmREYXRhUmVmKSksXG4gICAgICAgICAgLy8gICB9KTtcbiAgICAgICAgICAvLyAgIGNhcmREYXRhUmVmW2l0ZW1JbmRleF0gPSB7XG4gICAgICAgICAgLy8gICAgIHNlbGVjdGVkOiBjYXJkRGF0YVJlZltpdGVtSW5kZXhdLnNlbGVjdGVkLFxuICAgICAgICAgIC8vICAgICBpc0NoaWxkcmVuRXhwYW5kZWQ6IGNhcmREYXRhUmVmW2l0ZW1JbmRleF0uaXNDaGlsZHJlbkV4cGFuZGVkLFxuICAgICAgICAgIC8vICAgICB0aXRsZTogbWFwcGVkUm9sZVNhdmUuTmFtZSxcbiAgICAgICAgICAvLyAgICAgZGF0YTogbWFwcGVkUm9sZVNhdmUsXG4gICAgICAgICAgLy8gICAgIGJvZHk6IFtdLFxuICAgICAgICAgIC8vICAgICBjaGlsZHJlbjogbWFwcGVkUm9sZVNhdmUuUm9sZUNvbnRleHRzLm1hcCgoYykgPT4ge1xuICAgICAgICAgIC8vICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLy8gICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgLy8gICAgICAgICB0aXRsZTogdGhpcy5nZXRGb3JtYXR0ZWROYW1lKGMuTmFtZSksXG4gICAgICAgICAgLy8gICAgICAgICBkYXRhOiBjLFxuICAgICAgICAgIC8vICAgICAgICAgYm9keTogW10sXG4gICAgICAgICAgLy8gICAgICAgICBjaGlsZHJlbjogYy5Sb2xlQWN0aW9ucy5tYXAoKGEpID0+IHtcbiAgICAgICAgICAvLyAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAvLyAgICAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgLy8gICAgICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0Rm9ybWF0dGVkTmFtZShhLk5hbWUpLFxuICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGE6IGEsXG4gICAgICAgICAgLy8gICAgICAgICAgICAgYm9keTogW10sXG4gICAgICAgICAgLy8gICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgIC8vICAgICAgICAgICB9O1xuICAgICAgICAgIC8vICAgICAgICAgfSksXG4gICAgICAgICAgLy8gICAgICAgfTtcbiAgICAgICAgICAvLyAgICAgfSksXG4gICAgICAgICAgLy8gICB9O1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNhdmVEYXRhQWxsKCkge1xuICAgIGNvbnN0IHJvbGVzOiBSb2xlW10gPSB0aGlzLmRhdGEubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi54LFxuICAgICAgICBSb2xlQ29udGV4dHM6IHguUm9sZUNvbnRleHRzLmZpbHRlcigoeSkgPT4geS5TZWxlY3RlZCkubWFwKCh6KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnosXG4gICAgICAgICAgICBSb2xlQWN0aW9uczogei5Sb2xlQWN0aW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAgIChhKSA9PiBhLlNlbGVjdGVkXG4gICAgICAgICAgICApIGFzIFJvbGVBY3Rpb25bXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSBhcyBSb2xlQ29udGV4dFtdLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVRhYmxlKCkge1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5tYXAoKHgpID0+IHgpO1xuICB9XG5cbiAgb25WaWV3Q2hhbmdlKGlzR3JpZFZpZXc6IGJvb2xlYW4pOiB2b2lkIHt9XG4gIG9uU3RhdGVDaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnY3JlYXRlJzpcbiAgICAgICAgdmFyIG5ld01hcHBlZFJvbGU6IE1hcHBlZFJvbGUgPSB7XG4gICAgICAgICAgUm9sZUNvbnRleHRzOiB0aGlzLnNvdXJjZURhdGEubWFwKChjb25maWcpID0+IHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0OiBNYXBwZWRSb2xlQ29udGV4dCA9IHtcbiAgICAgICAgICAgICAgQ2hpbGRyZW5UeXBlOiBDaGlsZHJlblR5cGUuQWN0aW9uLFxuICAgICAgICAgICAgICBTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgIFJvbGVBY3Rpb25zOiBjb25maWcuQWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBhY3Q6IE1hcHBlZFJvbGVBY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgICBTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBOYW1lOiBhY3Rpb24sXG4gICAgICAgICAgICAgICAgICBSb2xlOiAnJyxcbiAgICAgICAgICAgICAgICAgIENvbnRleHQ6ICcnLFxuICAgICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgICAgSWQ6ICcnLFxuICAgICAgICAgICAgICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgICAgICAgICAgICBUZW5hbnRJZDogJycsXG4gICAgICAgICAgICAgICAgICBDb2RlOiAnJyxcbiAgICAgICAgICAgICAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgICAgICAgICAgICAgIEFQSUtleTogdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQVBJS2V5LFxuICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25Sb2xlQWN0aW9uOiB0aGlzLmdldEFwcGxpY2F0aW9uQWN0aW9uQ29kZShhY3Rpb24pLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdDtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIE5hbWU6IGNvbmZpZy5OYW1lLFxuICAgICAgICAgICAgICBSb2xlOiAnJyxcbiAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICBJZDogJycsXG4gICAgICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyxcbiAgICAgICAgICAgICAgVGVuYW50SWQ6ICcnLFxuICAgICAgICAgICAgICBDb2RlOiAnJyxcbiAgICAgICAgICAgICAgU2VydmljZU5hbWU6ICcnLFxuICAgICAgICAgICAgICBBUElLZXk6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAgICAgICAgICAgQXBwbGljYXRpb25Sb2xlQ29udGV4dDogdGhpcy5nZXRBcHBsaWNhdGlvbkNvbnRleHRDb2RlKFxuICAgICAgICAgICAgICAgIGNvbmZpZy5OYW1lXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBDaGlsZHJlblR5cGU6IENoaWxkcmVuVHlwZS5QZXJtaXNzaW9uLFxuICAgICAgICAgIE5hbWU6ICcnLFxuICAgICAgICAgIGlkOiAodGhpcy5jYXJkRGF0YS5sZW5ndGggKyAxKS50b1N0cmluZygpLFxuICAgICAgICAgIElkOiAodGhpcy5jYXJkRGF0YS5sZW5ndGggKyAxKS50b1N0cmluZygpLFxuICAgICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICAgICAgVGVuYW50SWQ6ICcnLFxuICAgICAgICAgIENvZGU6ICcnLFxuICAgICAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgICAgICBBcHBsaWNhdGlvbjogdGhpcy5hcHBsaWNhdGlvbiA/IHRoaXMuYXBwbGljYXRpb24gOiB1bmRlZmluZWQsXG4gICAgICAgICAgQVBJS2V5OiB0aGlzLmVudlN2Yy5lbnZpcm9ubWVudC5BUElLZXksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNhcmREYXRhOiBDYXJkRGF0YSA9IHtcbiAgICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgdGl0bGU6IG5ld01hcHBlZFJvbGUuTmFtZSxcbiAgICAgICAgICBkYXRhOiBuZXdNYXBwZWRSb2xlLFxuICAgICAgICAgIGJvZHk6IFtdLFxuICAgICAgICAgIGNoaWxkcmVuOiBuZXdNYXBwZWRSb2xlLlJvbGVDb250ZXh0cy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0Rm9ybWF0dGVkTmFtZShjLk5hbWUpLFxuICAgICAgICAgICAgICBkYXRhOiBjLFxuICAgICAgICAgICAgICBib2R5OiBbXSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IGMuUm9sZUFjdGlvbnMubWFwKChhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmdldEZvcm1hdHRlZE5hbWUoYS5OYW1lKSxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGEsXG4gICAgICAgICAgICAgICAgICBib2R5OiBbXSxcbiAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoW25ld01hcHBlZFJvbGVdKTtcbiAgICAgICAgdGhpcy5jYXJkRGF0YS5wdXNoKGNhcmREYXRhKTtcbiAgICAgICAgdGhpcy5yb2xlQ2FyZENsaWNrZWQoY2FyZERhdGEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LmlzVGFibGVWaWV3ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgc2hvd1RhYmxlVmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3RlZFJvd3M6IFJvbGVbXSkge31cbiAgcmV0cnlNZXNzYWdlKCkge31cbiAgb25Db2x1bW5zVXBkYXRlZCh1cGRhdGVkQ29sdW1uczogSURhdGFGaWx0ZXJbXSkge1xuICAgIGNvbnN0IHVwZGF0ZWRDb2x1bW5EZWY6IENvbHVtbkRlZmluaXRpb248TWFwcGVkUm9sZT5bXSA9IFtdO1xuICAgIHVwZGF0ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdDb2wgPSB0aGlzLnJvbGVDb250cm9sU3ZjLnJvbGVDb2x1bW5zLmZpbmQoXG4gICAgICAgIChjb2x1bW4pID0+IGNvbHVtbi5oZWFkZXIgPT09IGNvbC5uYW1lIHx8IGNvbHVtbi5pZCA9PT0gY29sLm5hbWVcbiAgICAgICk7XG4gICAgICBpZiAobWF0Y2hpbmdDb2wpIHtcbiAgICAgICAgdXBkYXRlZENvbHVtbkRlZi5wdXNoKG1hdGNoaW5nQ29sKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudmlzaWJsZUNvbHVtbkRlZiA9IFsuLi51cGRhdGVkQ29sdW1uRGVmXTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpbHRlcnNBbmRTb3J0cyhpc1NlYXJjaDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKCFpc1NlYXJjaCkge1xuICAgICAgdGhpcy5kYXRhVmlldy5vbkNsZWFyU2VhcmNoKCk7XG4gICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtID0gJyc7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICBjb25zdCBjbGlja0V2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ2NsaWNrJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgICB2aWV3OiB3aW5kb3csXG4gICAgICB9KTtcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY2xpY2tFdmVudCk7XG4gICAgfVxuICAgIHZhciBwYXlsb2FkOiBTZWFyY2hQcm9wZXJ0eVZhbHVlW10gPSB0aGlzLmN1cnJlbnRGaWx0ZXJzLm1hcCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiB4Lm5hbWUsXG4gICAgICAgIEVudGl0eVZhbHVlOiB4LnZhbHVlLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOlxuICAgICAgICAgIHguY29uZGl0aW9uICYmIE9iamVjdC5rZXlzKERhdGVGaWx0ZXJUeXBlcykuaW5jbHVkZXMoeC5jb25kaXRpb24pXG4gICAgICAgICAgICA/IChEYXRlRmlsdGVyVHlwZXNbXG4gICAgICAgICAgICAgICAgeC5jb25kaXRpb24gYXMga2V5b2YgdHlwZW9mIERhdGVGaWx0ZXJUeXBlc1xuICAgICAgICAgICAgICBdIGFzIHVua25vd24gYXMgU2VhcmNoUHJvcGVydHlTaWduKVxuICAgICAgICAgICAgOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICAgIFR5cGU6IFNlYXJjaFByb3BlcnR5VmFsdWVUeXBlLkRhdGUsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHBheWxvYWQucHVzaCh7XG4gICAgICBQcm9wZXJ0eU5hbWU6ICdBUElLZXknLFxuICAgICAgRW50aXR5VmFsdWU6IHRoaXMuZW52U3ZjLmVudmlyb25tZW50LkFQSUtleSxcbiAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgfSk7XG4gICAgZm9yIChsZXQgc29ydCBvZiB0aGlzLmN1cnJlbnRTb3J0cykge1xuICAgICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgICAgUHJvcGVydHlOYW1lOiBzb3J0Lm5hbWUsXG4gICAgICAgIEVudGl0eVZhbHVlOiAnJyxcbiAgICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgICAgU2lnbjogU2VhcmNoUHJvcGVydHlTaWduLkVRLFxuICAgICAgICBTb3J0OlxuICAgICAgICAgIHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkFzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uQXNjXG4gICAgICAgICAgICA6IHNvcnQudmFsdWUudG9Mb3dlckNhc2UoKSA9PSBTb3J0RGlyZWN0aW9uLkRlc2MudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgPyBTb3J0RGlyZWN0aW9uLkRlc2NcbiAgICAgICAgICAgIDogU29ydERpcmVjdGlvbi5Ob25lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFRlcm1FeGlzdHMgPSB0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgIHRoaXMudXRpbFNlcnZpY2Uuc2VuZEJJKHRydWUpO1xuICAgIGNvbnN0IHJlcyA9IHNlYXJjaFRlcm1FeGlzdHNcbiAgICAgID8gYXdhaXQgdGhpcy5zZXJ2ZXIuZ2V0KFxuICAgICAgICAgIGBSb2xlL0dldFJvbGVzV2l0aFBhcmFtLyR7dGhpcy5jdXJyZW50U2VhcmNoVGVybS50cmltKCl9LzAvJHtcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemVcbiAgICAgICAgICB9YFxuICAgICAgICApXG4gICAgICA6IGF3YWl0IHRoaXMuc2VydmVyLnBvc3QoYFJvbGUvU2VhcmNoUm9sZXMvMC8ke3RoaXMucGFnZVNpemV9YCwgcGF5bG9hZCk7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkoZmFsc2UpO1xuICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvclJlc3BvbnNlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzID0gW107XG4gICAgICB0aGlzLmN1cnJlbnRTb3J0cyA9IFtdO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXJkRGF0YVZpZXcuY2xlYXJEYXRhKCk7XG4gICAgICB0aGlzLmN1cnJlbnREYXRhID0gbnVsbDtcbiAgICAgIHRoaXMucGFnZVN0YXRlID0gcmVzIGFzIFBhZ2VkUmVzdWx0PFJvbGU+O1xuICAgICAgdmFyIHJlc3VsdCA9IChyZXMgYXMgUGFnZWRSZXN1bHQ8Um9sZT4pLlJlc3VsdDtcbiAgICAgIHRoaXMuc2V0VXBNYXBwZWREYXRhKHJlc3VsdCk7XG4gICAgICB0aGlzLnNldFVwQ2FyZERhdGEoKTtcbiAgICB9XG4gIH1cbiAgYXN5bmMgbG9hZE1vcmVGaWx0ZXJzQW5kU29ydHMoKTogUHJvbWlzZTxQYWdlZFJlc3VsdDxSb2xlPiB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5wYWdlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHBheWxvYWQ6IFNlYXJjaFByb3BlcnR5VmFsdWVbXSA9IHRoaXMuY3VycmVudEZpbHRlcnMubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9wZXJ0eU5hbWU6IHgubmFtZSxcbiAgICAgICAgRW50aXR5VmFsdWU6IHgudmFsdWUsXG4gICAgICAgIE9wZXJhdG9yOiBTZWFyY2hPcGVyYXRvci5BbmQsXG4gICAgICAgIFNpZ246XG4gICAgICAgICAgeC5jb25kaXRpb24gJiYgT2JqZWN0LmtleXMoRGF0ZUZpbHRlclR5cGVzKS5pbmNsdWRlcyh4LmNvbmRpdGlvbilcbiAgICAgICAgICAgID8gKERhdGVGaWx0ZXJUeXBlc1tcbiAgICAgICAgICAgICAgICB4LmNvbmRpdGlvbiBhcyBrZXlvZiB0eXBlb2YgRGF0ZUZpbHRlclR5cGVzXG4gICAgICAgICAgICAgIF0gYXMgdW5rbm93biBhcyBTZWFyY2hQcm9wZXJ0eVNpZ24pXG4gICAgICAgICAgICA6IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICAgICAgVHlwZTogU2VhcmNoUHJvcGVydHlWYWx1ZVR5cGUuRGF0ZSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcGF5bG9hZC5wdXNoKHtcbiAgICAgIFByb3BlcnR5TmFtZTogJ0FQSUtleScsXG4gICAgICBFbnRpdHlWYWx1ZTogdGhpcy5lbnZTdmMuZW52aXJvbm1lbnQuQVBJS2V5LFxuICAgICAgT3BlcmF0b3I6IFNlYXJjaE9wZXJhdG9yLkFuZCxcbiAgICAgIFNpZ246IFNlYXJjaFByb3BlcnR5U2lnbi5FUSxcbiAgICB9KTtcbiAgICBmb3IgKGxldCBzb3J0IG9mIHRoaXMuY3VycmVudFNvcnRzKSB7XG4gICAgICBwYXlsb2FkLnB1c2goe1xuICAgICAgICBQcm9wZXJ0eU5hbWU6IHNvcnQubmFtZSxcbiAgICAgICAgRW50aXR5VmFsdWU6ICcnLFxuICAgICAgICBPcGVyYXRvcjogU2VhcmNoT3BlcmF0b3IuQW5kLFxuICAgICAgICBTaWduOiBTZWFyY2hQcm9wZXJ0eVNpZ24uRVEsXG4gICAgICAgIFNvcnQ6XG4gICAgICAgICAgc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uQXNjLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgID8gU29ydERpcmVjdGlvbi5Bc2NcbiAgICAgICAgICAgIDogc29ydC52YWx1ZS50b0xvd2VyQ2FzZSgpID09IFNvcnREaXJlY3Rpb24uRGVzYy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICA/IFNvcnREaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgOiBTb3J0RGlyZWN0aW9uLk5vbmUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoVGVybUV4aXN0cyA9IHRoaXMuY3VycmVudFNlYXJjaFRlcm0udHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy51dGlsU2VydmljZS5zZW5kQkkodHJ1ZSk7XG4gICAgY29uc3QgcmVzID0gc2VhcmNoVGVybUV4aXN0c1xuICAgICAgPyBhd2FpdCB0aGlzLnNlcnZlci5nZXQoXG4gICAgICAgICAgYFJvbGUvR2V0Um9sZXNXaXRoUGFyYW0vJHt0aGlzLmN1cnJlbnRTZWFyY2hUZXJtLnRyaW0oKX0vJHtcbiAgICAgICAgICAgIHRoaXMucGFnZVN0YXRlLlNraXBcbiAgICAgICAgICB9LyR7dGhpcy5wYWdlU2l6ZX1gXG4gICAgICAgIClcbiAgICAgIDogYXdhaXQgdGhpcy5zZXJ2ZXIucG9zdChcbiAgICAgICAgICBgUm9sZS9TZWFyY2hSb2xlcy8ke3RoaXMucGFnZVN0YXRlLlNraXB9LyR7dGhpcy5wYWdlU2l6ZX1gLFxuICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB0aGlzLnV0aWxTZXJ2aWNlLnNlbmRCSShmYWxzZSk7XG4gICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQgPSByZXMgYXMgUGFnZWRSZXN1bHQ8Um9sZT47XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICBvbkZpbHRlclVwZGF0ZWQodXBkYXRlZEZpbHRlcnM6IElEYXRhRmlsdGVyW10gfCBzdHJpbmcpIHtcbiAgICAvLyBFbnN1cmUgdXBkYXRlZEZpbHRlcnMgaXMgYW4gYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkRmlsdGVycykpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlcnMgPSB1cGRhdGVkRmlsdGVycztcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyc0FuZFNvcnRzKCk7XG4gICAgfVxuICB9XG4gIG9uU29ydFVwZGF0ZWQodXBkYXRlZFNvcnRzOiBJRGF0YUZpbHRlcltdKSB7XG4gICAgdGhpcy5jdXJyZW50U29ydHMgPSB1cGRhdGVkU29ydHM7XG4gICAgY29uc29sZS5sb2coeyBDdXJyU29ydHM6IHRoaXMuY3VycmVudFNvcnRzIH0pO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyc0FuZFNvcnRzKCk7XG4gIH1cblxuICBoYW5kbGVTZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuc2VhcmNoVGVybSQubmV4dChldmVudC52YWx1ZSk7XG4gIH1cblxuICBoYW5kbGVFeHBvcnQoZXhwb3J0ZWREYXRhOiBQYXJ0aWFsPGFueT5bXSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdFeHBvcnRlZCBkYXRhOicsIGV4cG9ydGVkRGF0YSk7XG4gICAgdGhpcy5kb3dubG9hZENTVihleHBvcnRlZERhdGEpO1xuICB9XG4gIHByaXZhdGUgZG93bmxvYWRDU1YoZGF0YTogUGFydGlhbDxhbnk+W10pIHtcbiAgICBjb25zdCBoZWFkZXJzID0gT2JqZWN0LmtleXMoZGF0YVswXSk7XG4gICAgY29uc3QgY3N2Q29udGVudCA9IFtcbiAgICAgIGhlYWRlcnMuam9pbignLCcpLFxuICAgICAgLi4uZGF0YS5tYXAoKHJvdykgPT4gaGVhZGVycy5tYXAoKGhlYWRlcikgPT4gcm93W2hlYWRlcl0pLmpvaW4oJywnKSksXG4gICAgXS5qb2luKCdcXG4nKTtcblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY3N2Q29udGVudF0sIHsgdHlwZTogJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTg7JyB9KTtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGlmIChsaW5rLmRvd25sb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCAnZXhwb3J0LmNzdicpO1xuICAgICAgbGluay5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgbGluay5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICB9XG4gIH1cblxuICBnZXRNb2NrUm9sZXMoKTogUm9sZVtdIHtcbiAgICByZXR1cm4gbmV3IEFycmF5KDEwKS5maWxsKDEpLm1hcCgoaWQsIGkpID0+ICh7XG4gICAgICBJZDogaWQgKyBpLFxuICAgICAgaWQ6IChpZCArIGkpLnRvU3RyaW5nKCksXG4gICAgICBOYW1lOiB0aGlzLm1vY2tOYW1lc1tpXSB8fCAnJyxcbiAgICAgIFJvbGVDb250ZXh0czogdGhpcy5yYW5kb21Db250ZXh0cygpLFxuICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgRGF0YVN0YXRlOiBPYmplY3RTdGF0ZS5OZXcsXG4gICAgICBUZW5hbnRJZDogYFRlbmFudCR7aWQgKyBpfWAsXG4gICAgICBDb2RlOiAnJyxcbiAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgIEFQSUtleTogJycsXG4gICAgfSkpO1xuICB9XG5cbiAgbW9ja05hbWVzOiBzdHJpbmdbXSA9IFtcbiAgICAnQWRtaW4nLFxuICAgICdTdXBlciBBZG1pbicsXG4gICAgJ01hbmFnZXInLFxuICAgICdJbnRlcm4nLFxuICAgICdQcm9kdWN0aW9uIE1hbmFnZXInLFxuICAgICdDRU8nLFxuICAgICdDVE8nLFxuICAgICdDT08nLFxuICAgICdEZXZlbG9wZXInLFxuICAgICdFbmdpbmVlcicsXG4gIF07XG5cbiAgcmFuZG9tTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5tb2NrTmFtZXMubGVuZ3RoKTtcbiAgICByZXR1cm4gdGhpcy5tb2NrTmFtZXNbcmFuZG9tSW5kZXhdO1xuICB9XG5cbiAgcmFuZG9tQ29udGV4dHMoKTogUm9sZUNvbnRleHRbXSB7XG4gICAgY29uc3QgcmFuZG9tTnVtYmVyID0gTWF0aC5mbG9vcihcbiAgICAgIE1hdGgucmFuZG9tKCkgKiBPYmplY3Qua2V5cyhVSXMpLmxlbmd0aCArIDFcbiAgICApO1xuICAgIHZhciByZXR1cm5BcnJheTogUm9sZUNvbnRleHRbXSA9IFtdO1xuICAgIGNvbnN0IHVzZWRMaXN0OiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZG9tTnVtYmVyOyBpKyspIHtcbiAgICAgIGxldCByYW5kb21JbmRleDtcbiAgICAgIGRvIHtcbiAgICAgICAgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBPYmplY3Qua2V5cyhVSXMpLmxlbmd0aCk7XG4gICAgICB9IHdoaWxlICh1c2VkTGlzdC5pbmNsdWRlcyhyYW5kb21JbmRleCkpO1xuXG4gICAgICByZXR1cm5BcnJheS5wdXNoKHtcbiAgICAgICAgSWQ6ICdjb250ZXh0JyArIGksXG4gICAgICAgIGlkOiAoJ2NvbnRleHQnICsgaSkudG9TdHJpbmcoKSxcbiAgICAgICAgTmFtZTogT2JqZWN0LmtleXMoVUlzKVtyYW5kb21JbmRleF0sXG4gICAgICAgIFJvbGU6ICcnLFxuICAgICAgICBSb2xlQWN0aW9uczogdGhpcy5yYW5kb21BY3Rpb25zKCksXG4gICAgICAgIENyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgVXBkYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICBEYXRhU3RhdGU6IE9iamVjdFN0YXRlLk5ldyxcbiAgICAgICAgVGVuYW50SWQ6IGBUZW5hbnQkeydjb250ZXh0JyArIGl9YCxcbiAgICAgICAgQ29kZTogJycsXG4gICAgICAgIFNlcnZpY2VOYW1lOiAnJyxcbiAgICAgICAgQVBJS2V5OiAnJyxcbiAgICAgICAgQXBwbGljYXRpb25Sb2xlQ29udGV4dDogJycsXG4gICAgICB9KTtcbiAgICAgIHVzZWRMaXN0LnB1c2gocmFuZG9tSW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyYXk7XG4gIH1cblxuICByYW5kb21BY3Rpb25zKCk6IFJvbGVBY3Rpb25bXSB7XG4gICAgY29uc3QgcmFuZG9tTnVtYmVyID0gTWF0aC5mbG9vcihcbiAgICAgIE1hdGgucmFuZG9tKCkgKiBPYmplY3Qua2V5cyhVSUFjdGlvbnMpLmxlbmd0aCArIDFcbiAgICApO1xuICAgIHZhciByZXR1cm5BcnJheTogUm9sZUFjdGlvbltdID0gW107XG4gICAgY29uc3QgdXNlZExpc3Q6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5kb21OdW1iZXI7IGkrKykge1xuICAgICAgbGV0IHJhbmRvbUluZGV4O1xuICAgICAgZG8ge1xuICAgICAgICByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE9iamVjdC5rZXlzKFVJQWN0aW9ucykubGVuZ3RoKTtcbiAgICAgIH0gd2hpbGUgKHVzZWRMaXN0LmluY2x1ZGVzKHJhbmRvbUluZGV4KSk7XG5cbiAgICAgIHJldHVybkFycmF5LnB1c2goe1xuICAgICAgICBJZDogJ2FjdGlvbicgKyBpLFxuICAgICAgICBpZDogKCdhY3Rpb24nICsgaSkudG9TdHJpbmcoKSxcbiAgICAgICAgTmFtZTogT2JqZWN0LmtleXMoVUlBY3Rpb25zKVtyYW5kb21JbmRleF0sXG4gICAgICAgIFJvbGU6ICcnLFxuICAgICAgICBDb250ZXh0OiAnJyxcbiAgICAgICAgQ3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICBVcGRhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICBUZW5hbnRJZDogYFRlbmFudCR7J2FjdGlvbicgKyBpfWAsXG4gICAgICAgIENvZGU6ICcnLFxuICAgICAgICBTZXJ2aWNlTmFtZTogJycsXG4gICAgICAgIEFQSUtleTogJycsXG4gICAgICAgIEFwcGxpY2F0aW9uUm9sZUFjdGlvbjogJycsXG4gICAgICB9KTtcbiAgICAgIHVzZWRMaXN0LnB1c2gocmFuZG9tSW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyYXk7XG4gIH1cblxuICBjbG9zZVBvcFVwKCkge1xuICAgIHRoaXMub3BlbkRyb3Bkb3duSWQgPSBudWxsO1xuICAgIHRoaXMucG9wVXBzLmZvckVhY2goKHBvcFVwKSA9PiB7XG4gICAgICBpZiAocG9wVXAuZHJvcGRvd25PcGVuKSB7XG4gICAgICAgIHBvcFVwLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVJdGVtKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgW2tleV06IHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBlZGl0VmFsdWUodmFsdWU6IE1hcHBlZFJvbGUpIHtcbiAgICBjb25zdCBjYXJkID0gdGhpcy5jYXJkRGF0YS5maW5kKCh4KSA9PiB4LmRhdGEuSWQgPT0gdmFsdWUuSWQpO1xuICAgIGlmIChjYXJkICYmIHRoaXMuY2FyZERhdGFWaWV3KSB7XG4gICAgICB0aGlzLmRhdGFWaWV3LnRvZ2dsZVZpZXcoKTtcbiAgICAgIGNhcmQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyZW50RGF0YSA9IHRoaXMuY2FyZERhdGFWaWV3Lm9uSXRlbUNsaWNrKGNhcmQpO1xuICAgICAgdGhpcy5jbG9zZVBvcFVwKCk7XG4gICAgICAvLyBpZiAodGhpcy5jdXJyZW50RGF0YSkge1xuICAgICAgLy8gICB0aGlzLmZvcm0uY29udHJvbHNbJ05hbWUnXS5zZXRWYWx1ZSh0aGlzLmN1cnJlbnREYXRhLmRhdGE/Lk5hbWUpO1xuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHRhYmxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgTWFwcGVkUm9sZT4oKTtcblxuICBjYWNoZUl0ZW0oaXRlbTogTWFwcGVkUm9sZSkge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gaXRlbS5JZDtcbiAgICB0aGlzLnRhYmxlQ2FjaGUuc2V0KGNhY2hlS2V5LCBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKSk7XG4gIH1cblxuICByZXN0b3JlQ2FjaGUoaXRlbTogUm9sZSkge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gaXRlbS5JZDtcbiAgICBjb25zdCBpdGVtQ2FjaGUgPSB0aGlzLnRhYmxlQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoaXRlbUNhY2hlKSB7XG4gICAgICBpdGVtLk5hbWUgPSBpdGVtQ2FjaGUuTmFtZTtcbiAgICB9XG4gICAgdGhpcy50YWJsZUNhY2hlLmRlbGV0ZShjYWNoZUtleSk7XG4gIH1cbn1cbiIsIjxkaXYgI21lc3NhZ2VMb2cgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IG1lc3NhZ2UtbG9nLWNvbnRhaW5lclwiPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJ0aGlzLmNhcmRDb250ZXh0SGlzdG9yeS5sZW5ndGggPiAwXCJcbiAgICBjbGFzcz1cImNvbnRleHQtYmFubmVyIHB5LTMgcHgtNCByb3VuZGVkLXhsIGZsZXggaXRlbS1jZW50ZXIganVzdGlmeS1zcGFjZS1iZXR3ZWVuIGdhcC0zXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yIGZsZXgtMSBjb250ZXh0LWJhbm5lci1jb250ZW50XCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY29udGV4dC1jb250ZW50IGl0ZW1zLWNlbnRlciBmbGV4IGdhcC0yXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRleHQgb2YgdGhpcy5jYXJkQ29udGV4dEhpc3Rvcnk7IGluZGV4IGFzIGlcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tYWluLWNvbnRlbnQtY29udGFpbmVyIGZsZXggZ2FwLTRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRleHQtY2FwdGlvbiBmb250LWJvbGQgdGV4dC1bIzQwNDA0MF1cIj57e1xuICAgICAgICAgICAgY29udGV4dC5kYXRhLkNoaWxkcmVuVHlwZSAmJlxuICAgICAgICAgICAgY29udGV4dC5kYXRhLkNoaWxkcmVuVHlwZSA9PSBjaGlsZFBlcm1pc3Npb25SZWZcbiAgICAgICAgICAgICAgPyBjb250ZXh0LmRhdGEuTmFtZVxuICAgICAgICAgICAgICA6IGNvbnRleHQudGl0bGVcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJpID09IHRoaXMuY2FyZENvbnRleHRIaXN0b3J5Lmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgY2xhc3M9XCJjb250ZXh0LXN1YmNhcHRpb25cIlxuICAgICAgICAgICAgPnt7IHRoaXMuZ2V0Q2FyZFN1YkNhcHRpb24oY29udGV4dCkgfX08L3NwYW5cbiAgICAgICAgICA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaSA8IHRoaXMuY2FyZENvbnRleHRIaXN0b3J5Lmxlbmd0aCAtIDFcIj4vPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgKGNsaWNrKT1cImNsb3NlRGV0YWlscygpXCJcbiAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgIGljb249XCJjbG9zZS1jaXJjbGUtZnVsbFwiXG4gICAgICAgIFt3aWR0aF09XCIyMFwiXG4gICAgICAgIFtoZWlnaHRdPVwiMjBcIlxuICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICAqbmdJZj1cInRoaXMuY2FyZENvbnRleHRIaXN0b3J5Lmxlbmd0aCA+IDAgJiYgdGhpcy5jYXJkRGF0YS5sZW5ndGggPiAwXCJcbiAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTJcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICBbZGlzYWJsZWRdPVwidGhpcy5pc0NoZWNrYm94RGlzYWJsZWQodGhpcy5jYXJkRGF0YVswXSlcIlxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgIGNsYXNzPVwibXQtMSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICBbbmdNb2RlbF09XCJpc0FsbFNlbGVjdGVkKHRoaXMuY2FyZERhdGFbMF0pXCJcbiAgICAgIChjbGljayk9XCJcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMuc2F2ZUFsbFJvbGVEeW5hbWljKHRoaXMuY2FyZERhdGFbMF0pXG4gICAgICBcIlxuICAgIC8+XG5cbiAgICA8c3BhbiBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj5TZWxlY3QgQWxsPC9zcGFuPlxuICA8L2Rpdj5cbiAgPHZlcmJlbi1kYXRhLXZpZXdcbiAgICAjdmR2XG4gICAgW3ZpZXdTdGF0ZV09XCJ7XG4gICAgICBpc1NlYXJjaDogdGhpcy5jYXJkQ29udGV4dEhpc3RvcnkubGVuZ3RoID09IDAsXG4gICAgICBpc0NvbHVtbjogdGhpcy5jYXJkQ29udGV4dEhpc3RvcnkubGVuZ3RoID09IDAsXG4gICAgICBpc0ZpbHRlcjogdGhpcy5jYXJkQ29udGV4dEhpc3RvcnkubGVuZ3RoID09IDAsXG4gICAgICBpc1NvcnQ6IHRoaXMuY2FyZENvbnRleHRIaXN0b3J5Lmxlbmd0aCA9PSAwLFxuICAgICAgaXNFeHBvcnQ6IHRoaXMuY2FyZENvbnRleHRIaXN0b3J5Lmxlbmd0aCA9PSAwICYmICghcGVybWlzc2lvbkNvbmZpZyB8fCBwZXJtaXNzaW9uQ29uZmlnLkFjdGlvbnNbJ0V4cG9ydCddKSxcbiAgICAgIGlzU2VsZWN0OiB0aGlzLmNhcmRDb250ZXh0SGlzdG9yeS5sZW5ndGggPT0gMCxcbiAgICAgIGlzQ3JlYXRlOiB0aGlzLmNhcmRDb250ZXh0SGlzdG9yeS5sZW5ndGggPT0gMCAmJiAoIXBlcm1pc3Npb25Db25maWcgfHwgcGVybWlzc2lvbkNvbmZpZy5BY3Rpb25zWydDcmVhdGUnXSksXG4gICAgICBpc1RvZ2dsZTp0aGlzLmNhcmRDb250ZXh0SGlzdG9yeS5sZW5ndGggPT0gMCxcbiAgICB9XCJcbiAgICBbYnV0dG9uQ2xhc3NdPVwiJ215LWN1c3RvbS1idXR0b24tY2xhc3MnXCJcbiAgICBbaWNvbkNsYXNzXT1cIidteS1pY29uLWNsYXNzJ1wiXG4gICAgW2FjdGl2ZUljb25DbGFzc109XCInbXktYWN0aXZlLWljb24tY2xhc3MnXCJcbiAgICBbaXNUYWJsZVZpZXddPVwiZmFsc2VcIlxuICAgIFtzZWxlY3RlZENvbHVtbkNvdW50XT1cIjBcIlxuICAgIFtzZWxlY3RlZFNvcnRDb3VudF09XCIwXCJcbiAgICBbc2VsZWN0ZWRGaWx0ZXJUYWJsZUNvdW50XT1cIjBcIlxuICAgICh2aWV3Q2hhbmdlKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQpXCJcbiAgICAoc3RhdGVDaGFuZ2UpPVwib25TdGF0ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAob25TZWFyY2hDaGFuZ2UpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cIm10LTJcIiB0YWJsZS1jb250ZW50PlxuICAgICAgPGxpYi1kYXRhLXRhYmxlXG4gICAgICAgIFtkYXRhS2V5XT1cIidJZCdcIlxuICAgICAgICAjZHRcbiAgICAgICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgICAgIFtjb2x1bW5zXT1cInZpc2libGVDb2x1bW5EZWZcIlxuICAgICAgICBbc3R5bGVDb25maWddPVwic3R5bGVzXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJzZWxlY3RcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNjZWxsXG4gICAgICAgICAgICBsZXQtaXNTZWxlY3RlZD1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd1NlbGVjdGlvbj1cInRvZ2dsZVJvd1NlbGVjdGlvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVJvd1NlbGVjdGlvbigpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICNoZWFkZXJcbiAgICAgICAgICAgIGxldC1hbGxSb3dzU2VsZWN0ZWQ9XCJhbGxSb3dzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgbGV0LXNvbWVSb3dzU2VsZWN0ZWQ9XCJzb21lUm93c1NlbGVjdGVkXCJcbiAgICAgICAgICAgIGxldC10b2dnbGVBbGxSb3dzPVwidG9nZ2xlQWxsUm93c1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVBbGxSb3dzKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJjcmVhdGVkQXRcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPlxuICAgICAgICAgICAge3sgdmFsdWUgfCBkYXRlIH19XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwidXBkYXRlZEF0XCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZT5cbiAgICAgICAgICAgIHt7IHZhbHVlIHwgZGF0ZSB9fVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cIm5hbWVcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT5cbiAgICAgICAgICAgIHt7IHZhbHVlLk5hbWUgfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxFZGl0XG4gICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgIGxldC11cGRhdGVWYWx1ZT1cInVwZGF0ZVZhbHVlXCJcbiAgICAgICAgICAgIGxldC11cGRhdGVEYXRhPVwidXBkYXRlRGF0YVwiXG4gICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkdGgtbWF4XCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWUuTmFtZVwiPjwvdmVyYmVuYS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwiYWN0aW9uc1wiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgI2NlbGxcbiAgICAgICAgICAgIGxldC1pc0VkaXRpbmc9XCJpc0VkaXRpbmdcIlxuICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCJcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZlcmJlbi1wb3AtVXBcbiAgICAgICAgICAgICAgI3BvcHVwXG4gICAgICAgICAgICAgIFtjdXN0b21TdHlsZXNdPVwieyAnei1pbmRleCc6ICc5OScgfVwiXG4gICAgICAgICAgICAgIFtlbmFibGVNb3VzZUxlYXZlXT1cImZhbHNlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGFjdGlvbnMtaWNvblwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd24tdHJpZ2dlclxuICAgICAgICAgICAgICAgIGljb249XCJsaXN0XCJcbiAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcC11cC1jb250ZW50IGZsZXggZmxleC1jb2xcIiBkcm9wZG93bi1jb250ZW50PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICFwZXJtaXNzaW9uQ29uZmlnIHx8IHBlcm1pc3Npb25Db25maWcuQWN0aW9uc1snQ3JlYXRlJ11cbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUm93RWRpdCgpOyBjYWNoZUl0ZW0odmFsdWUpOyBjbG9zZVBvcFVwKClcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3AtdXAtdmFsdWUgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld0RldGFpbHNGcm9tVGFibGUodmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicG9wLXVwLXZhbHVlIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wLXVwLXZhbHVlIGN1cnNvci1wb2ludGVyXCI+VmlldyBVc2VyczwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnIChjbGljayk9XCJlZGl0VmFsdWUodmFsdWUpXCIgaWNvbj1cImVkaXRcIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwidmlld0RldGFpbHNGcm9tVGFibGUodmFsdWUpXCIgY2xhc3M9XCJ2aWV3LWxpbmtzIHZpZXctZGV0YWlsc1wiPnZpZXcgZGV0YWlsczwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWV3LWxpbmtzIHZpZXctdXNlcnNcIj52aWV3IHVzZXJzPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAjY2VsbEVkaXRcbiAgICAgICAgICAgIGxldC1pc0VkaXRpbmc9XCJpc0VkaXRpbmdcIlxuICAgICAgICAgICAgbGV0LXRvZ2dsZVJvd0VkaXQ9XCJ0b2dnbGVSb3dFZGl0XCJcbiAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTIgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICAgICAgICAgaWNvbj1cInRpY2tcIlxuICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRhYmxlU2F2ZVJvbGUodmFsdWUsIHRvZ2dsZVJvd0VkaXQpXCJcbiAgICAgICAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzdG9yZUNhY2hlKHZhbHVlKTsgdG9nZ2xlUm93RWRpdCgpXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiY2xvc2Utbm8tY2lyY2xlXCJcbiAgICAgICAgICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgICA8IS0tIDx2ZXJiZW4tc3ZnIGljb249XCJkZWxldGVcIiBbd2lkdGhdPVwiMTVcIiBbaGVpZ2h0XT1cIjE1XCI+PC92ZXJiZW4tc3ZnPiAtLT5cbiAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICBpY29uPVwiY2FyZFZpZXdBbHRcIlxuICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRWYWx1ZSh2YWx1ZSlcIlxuICAgICAgICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2xpYi1kYXRhLXRhYmxlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2FyZC1jb250ZW50PlxuICAgICAgPHZlcmJlbi1jYXJkLWRhdGEtdmlld1xuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMnB4XCJcbiAgICAgICAgI3ZkY3ZcbiAgICAgICAgZGF0YUlkPVwiSWRcIlxuICAgICAgICBib3JkZXI9XCI1cHhcIlxuICAgICAgICBbY2FyZERhdGFMaXN0XT1cImNhcmREYXRhXCJcbiAgICAgICAgcmJnQ29sb3I9XCIjZjVmNmY5XCJcbiAgICAgICAgbWc9XCIwcHhcIlxuICAgICAgPlxuICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhLXZpZXcgY2xhc3M9XCJzcGFjZS15LTdcIj5cbiAgICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhXG4gICAgICAgICAgICAjdmxjZFxuICAgICAgICAgICAgW3BhcmVudF09XCJ2ZGN2XCJcbiAgICAgICAgICAgIGRhdGFJZD1cIk1haWxBZGRyZXNzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYmctc2Vjb25kYXJ5LTEwMCByb3VuZGVkLXhsIGJvcmRlci1wcmltYXJ5IGJvcmRlci1bMXB4XVwiXG4gICAgICAgICAgICBbY2FyZERhdGFMaXN0XT1cImNhcmREYXRhXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NhcmQgbGV0LWl0ZW0+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicm9sZUNhcmRDbGlja2VkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgaXRlbS5kYXRhLkNoaWxkcmVuVHlwZSAmJlxuICAgICAgICAgICAgICAgICAgaXRlbS5kYXRhLkNoaWxkcmVuVHlwZSA9PSBjaGlsZFBlcm1pc3Npb25SZWZcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBjdXJzb3ItcG9pbnRlciBoLVttYXgtY29udGVudF1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAgIFt3aWR0aF09XCIxNVwiXG4gICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDaGlsZHJlbihpdGVtKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgPyAndmlzaWJsZSdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdpbnZpc2libGUnXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtcy1jZW50ZXIgZmxleCBwci0xIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIFtpY29uXT1cIml0ZW0uaXNDaGlsZHJlbkV4cGFuZGVkID8gJ21pbnVzJyA6ICdwbHVzJ1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgYmctc2Vjb25kYXJ5IHJvdW5kZWQteGxcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTMgcm91bmRlZC14bCByb3VuZGVkLXRyLW5vbmUgcm91bmRlZC1ici1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA/ICdiZy1wcmltYXJ5JyA6ICdiZy1zZWNvbmRhcnktMjAwJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB5LTMgcHgtNCBmbGV4LTEgaC1bMTAwJV1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBmbGV4LTEgZ2FwLTEganVzdGlmeS1iZXR3ZWVuIGgtWzEwMCVdXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LTEgY2FyZC1taW4taGVpZ2h0IGp1c3RpZnktYmV0d2VlbiBoLVsxMDAlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXktMCBmb250LWJvbGQgdGV4dC1bIzQwNDA0MF0gbGVhZGluZy1bMTkuNXB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGF0YS5OYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIhdGV4dC1bMTBweF0gZm9udC1saWdodCB0ZXh0LVsjNDA0MDQwXSBsZWFkaW5nLVsxMi4xcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldENhcmRTdWJDYXB0aW9uKGl0ZW0pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1lbmQgaC1bMTAwJV1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3RGV0YWlscyhpdGVtKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJteS0wIHVuZGVybGluZSB0ZXh0LVsjMzQ3OUU5XSB0ZXh0LVsxMnB4XSBsZWFkaW5nLVsxNi42cHhdIGN1cnNvci1wb2ludGVyIGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldyBkZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICFpdGVtLmRhdGEuQ2hpbGRyZW5UeXBlIHx8XG4gICAgICAgICAgICAgICAgICBpdGVtLmRhdGEuQ2hpbGRyZW5UeXBlICE9PSBjaGlsZFBlcm1pc3Npb25SZWZcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLVttYXgtY29udGVudF1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgPyAndmlzaWJsZSdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdpbnZpc2libGUnXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiMTVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNoaWxkcmVuKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbXMtY2VudGVyIGZsZXggcHItMSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICBbaWNvbl09XCJpdGVtLmlzQ2hpbGRyZW5FeHBhbmRlZCA/ICdtaW51cycgOiAncGx1cydcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGJnLXNlY29uZGFyeSByb3VuZGVkLXhsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0zIHJvdW5kZWQteGwgcm91bmRlZC10ci1ub25lIHJvdW5kZWQtYnItbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2VsZWN0ZWQgPyAnYmctcHJpbWFyeScgOiAnYmctc2Vjb25kYXJ5LTIwMCdcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0zIHB4LTQgZmxleC0xIGZsZXggZ2FwLTIgaC1bMTAwJV0gaXRlbXMtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmRhdGE/LlNlbGVjdGVkICE9IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuaXNDaGVja2JveERpc2FibGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmRhdGEuU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLnNhdmVSb2xlRHluYW1pYyhpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtc3RhcnQgZmxleC0xIGdhcC0xIGp1c3RpZnktYmV0d2VlbiBoLVsxMDAlXVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC0xIGNhcmQtbWluLWhlaWdodCBqdXN0aWZ5LWJldHdlZW4gaC1bMTAwJV1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoM1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm15LTAgZm9udC1ib2xkIHRleHQtWyM0MDQwNDBdIGxlYWRpbmctWzE5LjVweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIhdGV4dC1bMTBweF0gZm9udC1saWdodCB0ZXh0LVsjNDA0MDQwXSBsZWFkaW5nLVsxMi4xcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldENhcmRTdWJDYXB0aW9uKGl0ZW0pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1lbmQgaC1bMTAwJV1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3RGV0YWlscyhpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXktMCB1bmRlcmxpbmUgdGV4dC1bIzM0NzlFOV0gdGV4dC1bMTJweF0gbGVhZGluZy1bMTYuNnB4XSBjdXJzb3ItcG9pbnRlciBmb250LW1lZGl1bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgZGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NhcmRDaGlsZCBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC1pdGVtPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1zdGFydCBoLVttYXgtY29udGVudF1cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImluZGV4ID09IDAgPyAndmlzaWJsZScgOiAnaW52aXNpYmxlJ1wiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpcy5pc0NoZWNrYm94RGlzYWJsZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpc0FsbFNlbGVjdGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRoaXMuc2F2ZUFsbFJvbGVEeW5hbWljKGl0ZW0pXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGJnLXNlY29uZGFyeSByb3VuZGVkLXhsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0zIHJvdW5kZWQteGwgcm91bmRlZC10ci1ub25lIHJvdW5kZWQtYnItbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2VsZWN0ZWQgPyAnYmctcHJpbWFyeScgOiAnYmctc2Vjb25kYXJ5LTIwMCdcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0zIHB4LTQgZmxleC0xIGZsZXggZ2FwLTIgaC1bMTAwJV0gaXRlbXMtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmRhdGE/LlNlbGVjdGVkICE9IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuaXNDaGVja2JveERpc2FibGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmRhdGEuU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLnNhdmVSb2xlRHluYW1pYyhpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtc3RhcnQgZmxleC0xIGdhcC0xIGp1c3RpZnktYmV0d2VlbiBoLVsxMDAlXVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC0xIGNhcmQtbWluLWhlaWdodCBqdXN0aWZ5LWJldHdlZW4gaC1bMTAwJV1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoM1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm15LTAgZm9udC1ib2xkIHRleHQtWyM0MDQwNDBdIGxlYWRpbmctWzE5LjVweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIhdGV4dC1bMTBweF0gZm9udC1saWdodCB0ZXh0LVsjNDA0MDQwXSBsZWFkaW5nLVsxMi4xcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldENhcmRTdWJDYXB0aW9uKGl0ZW0pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1lbmQgaC1bMTAwJV1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3RGV0YWlsc0NoaWxkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJteS0wIHVuZGVybGluZSB0ZXh0LVsjMzQ3OUU5XSB0ZXh0LVsxMnB4XSBsZWFkaW5nLVsxNi42cHhdIGN1cnNvci1wb2ludGVyIGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldyBkZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3ZlcmJlbi1sZWZ0LWNhcmQtZGF0YT5cbiAgICAgICAgPC92ZXJiZW4tbGVmdC1jYXJkLWRhdGEtdmlldz5cbiAgICAgICAgPHZlcmJlbi1yaWdodC1jYXJkLWRhdGEtdmlld1xuICAgICAgICAgICpuZ0lmPVwidGhpcy5jYXJkQ29udGV4dEhpc3RvcnkubGVuZ3RoID09IDBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwYXJlbnQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5jdXJyZW50RGF0YVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCByb3VuZGVkLXhsIGgtZnVsbCB3LWZ1bGwganVzdGlmeS1iZXR3ZWVuIHJlbGF0aXZlIHNwYWNlLXktNFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDx2ZXJiZW5hLWlucHV0XG4gICAgICAgICAgICAgICAgbmFtZT1cIk5hbWVcIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiTmFtZVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlVGFibGUoKVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0aGlzLmN1cnJlbnREYXRhLmRhdGEuTmFtZVwiXG4gICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgPCEtLSBidXR0b25zIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gYm90dG9tLTggbGVmdC0wIHJpZ2h0LTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PjwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gPHZlcmJlbmEtYnV0dG9uIGNsYXNzPVwidmVyYmVuLWRlbGV0ZS1idXR0b25cIiB0ZXh0PVwiRGVsZXRlXCI+PC92ZXJiZW5hLWJ1dHRvbj4gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZlcmJlbi1zd2l0Y2gtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9UYWJsZVZpZXcoKVwiXG4gICAgICAgICAgICAgICAgICAgIHRleHQ9XCJTd2l0Y2ggVG8gVGFibGVcIlxuICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2ZXJiZW4tcHJpbWFyeS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidGhpcy5zYXZlUm9sZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlNhdmVcIlxuICAgICAgICAgICAgICAgICAgPjwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC92ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+XG4gICAgICAgIDwhLS0gPHZlcmJlbi1yaWdodC1jYXJkLWRhdGEtdmlldz5cbiAgICAgICAgICB5ZXNoaGhoaGhcbiAgICAgICAgPC92ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+IC0tPlxuXG4gICAgICAgIDx2ZXJiZW4tY2FyZC1kYXRhLXZpZXctZm9vdGVyXG4gICAgICAgICAgKm5nSWY9XCJ0aGlzLmNhcmRDb250ZXh0SGlzdG9yeS5sZW5ndGggPT0gMFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAhdmRjdi5oYXNDdXJyZW50SXRlbSgpICYmIHRoaXMuY2FyZENvbnRleHRIaXN0b3J5Lmxlbmd0aCA9PSAwXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWVzc2FnZS1sb2ctYnV0dG9uLWNvbnRhaW5lciBmbGV4IGp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwhLS0gPHZlcmJlbmEtYnV0dG9uIFtmb250V2VpZ2h0XT1cIidib2xkJ1wiIFtiZ0NvbG9yXT1cIicjOEU4RDg3J1wiIFtib3JkZXJSYWRpdXNdPVwiJzRweCdcIiBbdGV4dENvbG9yXT1cIicjZmZmJ1wiXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiJ0RlbGV0ZSdcIj5cbiAgICAgICAgICAgICAgPC92ZXJiZW5hLWJ1dHRvbj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IHt7XG4gICAgICAgICAgICAgICAgdmRjdi5oYXNDdXJyZW50SXRlbSgpID8gJ2ZsZXgtMScgOiAnJ1xuICAgICAgICAgICAgICB9fSBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgZ2FwLTVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2luYXRvci10ZXh0XCJcbiAgICAgICAgICAgICAgICA+e3sgY2FyZERhdGEubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibG9hZE1vcmUoKVwiIGNsYXNzPVwibG9hZC1tb3JlIHZpZXctbGlua3NcIj5cbiAgICAgICAgICAgICAgICBMb2FkIG1vcmVcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXctZm9vdGVyPlxuICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjb2x1bW4tY29udGVudD5cbiAgICAgIDx2ZXJiZW4tdmlzaWJsZS1jb2x1bW5cbiAgICAgICAgKGNvbHVtbnNVcGRhdGVkKT1cIm9uQ29sdW1uc1VwZGF0ZWQoJGV2ZW50KVwiXG4gICAgICAgIFtib3JkZXJdPVwiJzFweCBzb2xpZCByZ2JhKDIxMiwgMTYwLCA3LCAxKSdcIlxuICAgICAgICBib3JkZXJSYWRpdXM9XCIxMHB4XCJcbiAgICAgICAgYm94U2hhZG93PVwiMnB4IDJweCAycHggMHB4IHNpbHZlclwiXG4gICAgICAgIGJnQ29sb3I9XCJ3aGl0ZVwiXG4gICAgICAgIHdpZHRoPVwiNDAwcHhcIlxuICAgICAgICB0ZXh0Q29sb3I9XCJibGFja1wiXG4gICAgICAgIHBkPVwiMXJlbVwiXG4gICAgICAgIHByaW1hcnlDb2xvcj1cIiNGRkU2ODFcIlxuICAgICAgICBzZWNvbmRhcnlDb2xvcj1cIiMzNDc5RTlcIlxuICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICAgIFtkaXNwbGF5ZWRDb2x1bW5zXT1cIjVcIlxuICAgICAgPjwvdmVyYmVuLXZpc2libGUtY29sdW1uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgZmlsdGVyLWNvbnRlbnQ+XG4gICAgICA8dmVyYmVuLXRhYmxlLWZpbHRlclxuICAgICAgICAoZmlsdGVyc0FwcGxpZWQpPVwib25GaWx0ZXJVcGRhdGVkKCRldmVudClcIlxuICAgICAgICBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCJcbiAgICAgICAgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIlxuICAgICAgICBiZ0NvbG9yPVwid2hpdGVcIlxuICAgICAgICB3aWR0aD1cIjQyMHB4XCJcbiAgICAgICAgdGV4dENvbG9yPVwiYmxhY2tcIlxuICAgICAgICBwZD1cIjFyZW1cIlxuICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCJcbiAgICAgICAgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCJcbiAgICAgICAgdGVydGlhcnlDb2xvcj1cIiM0MDQwNDBcIlxuICAgICAgICBbZmlsdGVyT3B0aW9uc109XCJmaWx0ZXJBcnJheVwiXG4gICAgICAgIFttYXhGaWx0ZXJMZW5ndGhdPVwiM1wiXG4gICAgICA+PC92ZXJiZW4tdGFibGUtZmlsdGVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgc29ydC1jb250ZW50PlxuICAgICAgPHZlcmJlbi1zb3J0LXRhYmxlXG4gICAgICAgIChzZWxlY3RlZE9wdGlvbnMpPVwib25Tb3J0VXBkYXRlZCgkZXZlbnQpXCJcbiAgICAgICAgW2JvcmRlcl09XCInMXB4IHNvbGlkIHJnYmEoMjEyLCAxNjAsIDcsIDEpJ1wiXG4gICAgICAgIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCJcbiAgICAgICAgYmdDb2xvcj1cIndoaXRlXCJcbiAgICAgICAgd2lkdGg9XCI0MDBweFwiXG4gICAgICAgIHRleHRDb2xvcj1cImJsYWNrXCJcbiAgICAgICAgcGQ9XCIxcmVtXCJcbiAgICAgICAgcHJpbWFyeUNvbG9yPVwiI0ZGRTY4MVwiXG4gICAgICAgIHNlY29uZGFyeUNvbG9yPVwiIzM0NzlFOVwiXG4gICAgICAgIHRlcnRpYXJ5Q29sb3I9XCIjNDA0MDQwXCJcbiAgICAgICAgW2VuYWJsZURyYWdBbmREcm9wXT1cInRydWVcIlxuICAgICAgICBbc29ydE9wdGlvbnNdPVwic29ydE9wdGlvbnNcIlxuICAgICAgPjwvdmVyYmVuLXNvcnQtdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBleHBvcnQtY29udGVudD5cbiAgICAgIDxsaWItZGF0YS1leHBvcnQgW2RhdGFdPVwiZGF0YVwiIChleHBvcnREYXRhRXZlbnQpPVwiaGFuZGxlRXhwb3J0KCRldmVudClcIj5cbiAgICAgIDwvbGliLWRhdGEtZXhwb3J0PlxuICAgIDwvZGl2PlxuICA8L3ZlcmJlbi1kYXRhLXZpZXc+XG4gIDxkaXYgKm5nSWY9XCJ2ZHYuaXNUYWJsZVZpZXdcIiBjbGFzcz1cImZsZXggZ2FwLTIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtbG9nLWJ1dHRvbi1jb250YWluZXIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDwhLS0gPHZlcmJlbmEtYnV0dG9uIFtmb250V2VpZ2h0XT1cIidib2xkJ1wiIFtiZ0NvbG9yXT1cIicjOEU4RDg3J1wiIFtib3JkZXJSYWRpdXNdPVwiJzRweCdcIiBbdGV4dENvbG9yXT1cIicjZmZmJ1wiXG4gICAgICAgIFt0ZXh0XT1cIidEZWxldGUnXCI+XG4gICAgICA8L3ZlcmJlbmEtYnV0dG9uPiAtLT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgZ2FwLTVcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicGFnaW5hdG9yLXRleHRcIj57eyBjYXJkRGF0YS5sZW5ndGggfX0gcmVjb3JkcyBsb2FkZWQ8L3NwYW4+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZSgpXCIgY2xhc3M9XCJsb2FkLW1vcmUgdmlldy1saW5rc1wiPlxuICAgICAgICBMb2FkIG1vcmVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19