@koalarx/ui 14.0.7 → 14.0.9

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 (346) hide show
  1. package/alert/esm2020/index.mjs +6 -6
  2. package/alert/esm2020/koalarx-ui-alert.mjs +4 -4
  3. package/alert/esm2020/lib/dialog-alert.component.mjs +48 -48
  4. package/alert/esm2020/lib/koala.alert-config.interface.mjs +1 -1
  5. package/alert/esm2020/lib/koala.alert.enum.mjs +8 -8
  6. package/alert/esm2020/lib/koala.alert.module.mjs +46 -46
  7. package/alert/esm2020/lib/koala.alert.service.mjs +19 -19
  8. package/alert/esm2020/lib/koala.request-code-to-alert-enum.translate.mjs +17 -17
  9. package/alert/fesm2015/koalarx-ui-alert.mjs +111 -111
  10. package/alert/fesm2015/koalarx-ui-alert.mjs.map +1 -1
  11. package/alert/fesm2020/koalarx-ui-alert.mjs +109 -109
  12. package/alert/fesm2020/koalarx-ui-alert.mjs.map +1 -1
  13. package/alert/index.d.ts +6 -6
  14. package/alert/lib/dialog-alert.component.d.ts +10 -10
  15. package/alert/lib/koala.alert-config.interface.d.ts +14 -14
  16. package/alert/lib/koala.alert.enum.d.ts +7 -7
  17. package/alert/lib/koala.alert.module.d.ts +12 -12
  18. package/alert/lib/koala.alert.service.d.ts +10 -10
  19. package/alert/lib/koala.request-code-to-alert-enum.translate.d.ts +4 -4
  20. package/button/esm2020/index.mjs +2 -2
  21. package/button/esm2020/koalarx-ui-button.mjs +4 -4
  22. package/button/esm2020/lib/button.component.mjs +44 -44
  23. package/button/esm2020/lib/koala.button.module.mjs +40 -40
  24. package/button/fesm2015/koalarx-ui-button.mjs +67 -67
  25. package/button/fesm2015/koalarx-ui-button.mjs.map +1 -1
  26. package/button/fesm2020/koalarx-ui-button.mjs +67 -67
  27. package/button/fesm2020/koalarx-ui-button.mjs.map +1 -1
  28. package/button/index.d.ts +2 -2
  29. package/button/lib/button.component.d.ts +18 -18
  30. package/button/lib/koala.button.module.d.ts +12 -12
  31. package/common/esm2020/index.mjs +4 -4
  32. package/common/esm2020/koalarx-ui-common.mjs +4 -4
  33. package/common/esm2020/lib/mask-options.mjs +3 -3
  34. package/common/esm2020/lib/services/csv/koala.csv.service.mjs +36 -36
  35. package/common/esm2020/lib/services/xlsx/koala.xlsx-config.interface.mjs +1 -1
  36. package/common/esm2020/lib/services/xlsx/koala.xlsx.service.mjs +127 -127
  37. package/common/fesm2015/koalarx-ui-common.mjs +160 -160
  38. package/common/fesm2015/koalarx-ui-common.mjs.map +1 -1
  39. package/common/fesm2020/koalarx-ui-common.mjs +155 -155
  40. package/common/fesm2020/koalarx-ui-common.mjs.map +1 -1
  41. package/common/index.d.ts +4 -4
  42. package/common/lib/mask-options.d.ts +2 -2
  43. package/common/lib/services/csv/koala.csv.service.d.ts +10 -10
  44. package/common/lib/services/xlsx/koala.xlsx-config.interface.d.ts +11 -11
  45. package/common/lib/services/xlsx/koala.xlsx.service.d.ts +12 -12
  46. package/core/esm2020/index.mjs +36 -36
  47. package/core/esm2020/koalarx-ui-core.mjs +4 -4
  48. package/core/esm2020/lib/environments/koalaEnvironment.mjs +3 -3
  49. package/core/esm2020/lib/helpers/mat-form-field.helper.mjs +16 -16
  50. package/core/esm2020/lib/loader/loader-bar-page.component.mjs +24 -24
  51. package/core/esm2020/lib/loader/loader-bar-page.interface.mjs +1 -1
  52. package/core/esm2020/lib/loader/loader-config.interface.mjs +1 -1
  53. package/core/esm2020/lib/ngx-koala.module.mjs +47 -47
  54. package/core/esm2020/lib/page/koala-language.helper.mjs +113 -113
  55. package/core/esm2020/lib/page/koala-page-pallet-colors.interface.mjs +1 -1
  56. package/core/esm2020/lib/page/koala.page.module.mjs +76 -76
  57. package/core/esm2020/lib/page/koala.user-menu-options.interface.mjs +1 -1
  58. package/core/esm2020/lib/page/notifications/koala.notification.interface.mjs +1 -1
  59. package/core/esm2020/lib/page/notifications/notification.component.mjs +43 -43
  60. package/core/esm2020/lib/page/page.component.mjs +302 -302
  61. package/core/esm2020/lib/router/koala.parameter-hash-location-stategy.mjs +18 -18
  62. package/core/esm2020/lib/services/api-requester/factory/koala.response.factory.mjs +43 -43
  63. package/core/esm2020/lib/services/api-requester/helpers/error/koala.client.error.mjs +2 -2
  64. package/core/esm2020/lib/services/api-requester/helpers/error/koala.errors.helper.mjs +45 -45
  65. package/core/esm2020/lib/services/api-requester/helpers/error/koala.not-found.error.mjs +2 -2
  66. package/core/esm2020/lib/services/api-requester/helpers/error/koala.success.error.mjs +2 -2
  67. package/core/esm2020/lib/services/api-requester/helpers/error/koala.unhautorized.error.mjs +2 -2
  68. package/core/esm2020/lib/services/api-requester/helpers/service/koala.request-header.helper.mjs +14 -14
  69. package/core/esm2020/lib/services/api-requester/koala.api-requester.base.mjs +86 -86
  70. package/core/esm2020/lib/services/api-requester/koala.api-requester.cache.mjs +37 -37
  71. package/core/esm2020/lib/services/api-requester/koala.api-requester.service.mjs +158 -158
  72. package/core/esm2020/lib/services/loader/koala.loader.service.mjs +34 -34
  73. package/core/esm2020/lib/services/openid/koala-oauth2-config.interface.mjs +1 -1
  74. package/core/esm2020/lib/services/openid/koala.oauth.config.mjs +29 -29
  75. package/core/esm2020/lib/services/openid/koala.oauth2.service.mjs +188 -188
  76. package/core/esm2020/lib/services/request/koala.request.service.mjs +52 -52
  77. package/core/esm2020/lib/services/token/koala.token.service.mjs +55 -55
  78. package/core/esm2020/lib/services/token/token.factory.mjs +26 -26
  79. package/core/fesm2015/koalarx-ui-core.mjs +1294 -1294
  80. package/core/fesm2015/koalarx-ui-core.mjs.map +1 -1
  81. package/core/fesm2020/koalarx-ui-core.mjs +1256 -1256
  82. package/core/fesm2020/koalarx-ui-core.mjs.map +1 -1
  83. package/core/index.d.ts +30 -30
  84. package/core/lib/environments/koalaEnvironment.d.ts +15 -15
  85. package/core/lib/helpers/mat-form-field.helper.d.ts +3 -3
  86. package/core/lib/loader/loader-bar-page.component.d.ts +9 -9
  87. package/core/lib/loader/loader-bar-page.interface.d.ts +5 -5
  88. package/core/lib/loader/loader-config.interface.d.ts +7 -7
  89. package/core/lib/ngx-koala.module.d.ts +12 -12
  90. package/core/lib/page/koala-language.helper.d.ts +19 -19
  91. package/core/lib/page/koala-page-pallet-colors.interface.d.ts +38 -38
  92. package/core/lib/page/koala.page.module.d.ts +21 -21
  93. package/core/lib/page/koala.user-menu-options.interface.d.ts +5 -5
  94. package/core/lib/page/notifications/koala.notification.interface.d.ts +6 -6
  95. package/core/lib/page/notifications/notification.component.d.ts +15 -15
  96. package/core/lib/page/page.component.d.ts +58 -58
  97. package/core/lib/router/koala.parameter-hash-location-stategy.d.ts +7 -7
  98. package/core/lib/services/api-requester/factory/koala.response.factory.d.ts +5 -5
  99. package/core/lib/services/api-requester/helpers/error/koala.client.error.d.ts +2 -2
  100. package/core/lib/services/api-requester/helpers/error/koala.errors.helper.d.ts +13 -13
  101. package/core/lib/services/api-requester/helpers/error/koala.not-found.error.d.ts +2 -2
  102. package/core/lib/services/api-requester/helpers/error/koala.success.error.d.ts +2 -2
  103. package/core/lib/services/api-requester/helpers/error/koala.unhautorized.error.d.ts +2 -2
  104. package/core/lib/services/api-requester/helpers/service/koala.request-header.helper.d.ts +4 -4
  105. package/core/lib/services/api-requester/koala.api-requester.base.d.ts +19 -19
  106. package/core/lib/services/api-requester/koala.api-requester.cache.d.ts +13 -13
  107. package/core/lib/services/api-requester/koala.api-requester.service.d.ts +24 -24
  108. package/core/lib/services/loader/koala.loader.service.d.ts +14 -14
  109. package/core/lib/services/openid/koala-oauth2-config.interface.d.ts +11 -11
  110. package/core/lib/services/openid/koala.oauth.config.d.ts +9 -9
  111. package/core/lib/services/openid/koala.oauth2.service.d.ts +82 -82
  112. package/core/lib/services/request/koala.request.service.d.ts +11 -11
  113. package/core/lib/services/token/koala.token.service.d.ts +26 -26
  114. package/core/lib/services/token/token.factory.d.ts +9 -9
  115. package/dialog/esm2020/index.mjs +3 -3
  116. package/dialog/esm2020/koalarx-ui-dialog.mjs +4 -4
  117. package/dialog/esm2020/lib/dialog.component.mjs +25 -25
  118. package/dialog/esm2020/lib/koala.dialog-template.interface.mjs +1 -1
  119. package/dialog/esm2020/lib/koala.dialog.module.mjs +36 -36
  120. package/dialog/esm2020/lib/koala.dialog.service.mjs +57 -57
  121. package/dialog/fesm2015/koalarx-ui-dialog.mjs +96 -96
  122. package/dialog/fesm2015/koalarx-ui-dialog.mjs.map +1 -1
  123. package/dialog/fesm2020/koalarx-ui-dialog.mjs +96 -96
  124. package/dialog/fesm2020/koalarx-ui-dialog.mjs.map +1 -1
  125. package/dialog/index.d.ts +3 -3
  126. package/dialog/lib/dialog.component.d.ts +11 -11
  127. package/dialog/lib/koala.dialog-template.interface.d.ts +9 -9
  128. package/dialog/lib/koala.dialog.module.d.ts +11 -11
  129. package/dialog/lib/koala.dialog.service.d.ts +14 -14
  130. package/dynamic-component/esm2020/index.mjs +5 -5
  131. package/dynamic-component/esm2020/koalarx-ui-dynamic-component.mjs +4 -4
  132. package/dynamic-component/esm2020/lib/koala-dynamic-component.component.mjs +1 -1
  133. package/dynamic-component/esm2020/lib/koala-dynamic-component.directive.mjs +16 -16
  134. package/dynamic-component/esm2020/lib/koala-dynamic-component.factory.mjs +40 -40
  135. package/dynamic-component/esm2020/lib/koala-dynamic-component.mjs +6 -6
  136. package/dynamic-component/esm2020/lib/koala-dynamic-component.module.mjs +23 -23
  137. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.mjs +71 -71
  138. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.mjs.map +1 -1
  139. package/dynamic-component/fesm2020/koalarx-ui-dynamic-component.mjs +70 -70
  140. package/dynamic-component/fesm2020/koalarx-ui-dynamic-component.mjs.map +1 -1
  141. package/dynamic-component/index.d.ts +5 -5
  142. package/dynamic-component/lib/koala-dynamic-component.component.d.ts +3 -3
  143. package/dynamic-component/lib/koala-dynamic-component.d.ts +6 -6
  144. package/dynamic-component/lib/koala-dynamic-component.directive.d.ts +8 -8
  145. package/dynamic-component/lib/koala-dynamic-component.factory.d.ts +14 -14
  146. package/dynamic-component/lib/koala-dynamic-component.module.d.ts +8 -8
  147. package/file-button/esm2020/index.mjs +4 -4
  148. package/file-button/esm2020/koalarx-ui-file-button.mjs +4 -4
  149. package/file-button/esm2020/lib/file-button.component.mjs +125 -125
  150. package/file-button/esm2020/lib/koala.btn-file.service.mjs +25 -25
  151. package/file-button/esm2020/lib/koala.file-button.module.mjs +36 -36
  152. package/file-button/esm2020/lib/koala.file.interface.mjs +1 -1
  153. package/file-button/fesm2015/koalarx-ui-file-button.mjs +174 -174
  154. package/file-button/fesm2015/koalarx-ui-file-button.mjs.map +1 -1
  155. package/file-button/fesm2020/koalarx-ui-file-button.mjs +165 -165
  156. package/file-button/fesm2020/koalarx-ui-file-button.mjs.map +1 -1
  157. package/file-button/index.d.ts +4 -4
  158. package/file-button/lib/file-button.component.d.ts +29 -29
  159. package/file-button/lib/koala.btn-file.service.d.ts +11 -11
  160. package/file-button/lib/koala.file-button.module.d.ts +11 -11
  161. package/file-button/lib/koala.file.interface.d.ts +5 -5
  162. package/folder-page/esm2020/index.mjs +3 -3
  163. package/folder-page/esm2020/koalarx-ui-folder-page.mjs +4 -4
  164. package/folder-page/esm2020/lib/folder.component.mjs +70 -70
  165. package/folder-page/esm2020/lib/koala-navigate-history.interface.mjs +1 -1
  166. package/folder-page/esm2020/lib/koala.folder-page.module.mjs +40 -40
  167. package/folder-page/fesm2015/koalarx-ui-folder-page.mjs +95 -95
  168. package/folder-page/fesm2015/koalarx-ui-folder-page.mjs.map +1 -1
  169. package/folder-page/fesm2020/koalarx-ui-folder-page.mjs +94 -94
  170. package/folder-page/fesm2020/koalarx-ui-folder-page.mjs.map +1 -1
  171. package/folder-page/index.d.ts +3 -3
  172. package/folder-page/lib/folder.component.d.ts +21 -21
  173. package/folder-page/lib/koala-navigate-history.interface.d.ts +4 -4
  174. package/folder-page/lib/koala.folder-page.module.d.ts +12 -12
  175. package/form/esm2020/index.mjs +19 -19
  176. package/form/esm2020/koalarx-ui-form.mjs +4 -4
  177. package/form/esm2020/lib/btn-submit/btn-submit.component.mjs +49 -49
  178. package/form/esm2020/lib/directives/koala-autofocus.directive.mjs +25 -25
  179. package/form/esm2020/lib/dynamic-form/builder/dynamic-form.builder.mjs +139 -138
  180. package/form/esm2020/lib/dynamic-form/builder/fields/autocomplete.builder.mjs +37 -37
  181. package/form/esm2020/lib/dynamic-form/builder/fields/field.base.mjs +147 -147
  182. package/form/esm2020/lib/dynamic-form/builder/fields/field.builder.mjs +6 -6
  183. package/form/esm2020/lib/dynamic-form/builder/fields/more-items.builder.mjs +56 -56
  184. package/form/esm2020/lib/dynamic-form/dynamic-form.component.mjs +598 -598
  185. package/form/esm2020/lib/dynamic-form/enums/dynamic-form-type-field.enum.mjs +34 -34
  186. package/form/esm2020/lib/dynamic-form/interfaces/koala-custom-validator-fn.interface.mjs +1 -1
  187. package/form/esm2020/lib/dynamic-form/interfaces/koala.dynamic-autocomplete-options.interface.mjs +1 -1
  188. package/form/esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-autocomplete-multiple-config.interface.mjs +1 -1
  189. package/form/esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-config.interface.mjs +2 -2
  190. package/form/esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-field.interface.mjs +1 -1
  191. package/form/esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-more-itens-show-field-config.interface.mjs +1 -1
  192. package/form/esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-show-field.interface.mjs +1 -1
  193. package/form/esm2020/lib/dynamic-form/interfaces/koala.dynamic-set-value.interface.mjs +1 -1
  194. package/form/esm2020/lib/dynamic-form/koala.dynamic-form.service.mjs +212 -212
  195. package/form/esm2020/lib/dynamic-form/validators/autocomplete-selected.validator.mjs +9 -9
  196. package/form/esm2020/lib/dynamic-form/validators/cnpj.validator.mjs +9 -9
  197. package/form/esm2020/lib/dynamic-form/validators/cpf.validator.mjs +9 -9
  198. package/form/esm2020/lib/dynamic-form/validators/date-max.validator.mjs +10 -10
  199. package/form/esm2020/lib/dynamic-form/validators/date-min.validator.mjs +10 -10
  200. package/form/esm2020/lib/dynamic-form/validators/koala-dynamic-form-validator-result.helper.mjs +9 -9
  201. package/form/esm2020/lib/dynamic-form/validators/validation.helper.mjs +85 -85
  202. package/form/esm2020/lib/form.abstract.mjs +41 -41
  203. package/form/esm2020/lib/koala.form.module.mjs +132 -132
  204. package/form/esm2020/lib/show-invalid-fields/show-invalid-fields.mjs +8 -8
  205. package/form/fesm2015/koalarx-ui-form.mjs +1517 -1516
  206. package/form/fesm2015/koalarx-ui-form.mjs.map +1 -1
  207. package/form/fesm2020/koalarx-ui-form.mjs +1499 -1498
  208. package/form/fesm2020/koalarx-ui-form.mjs.map +1 -1
  209. package/form/index.d.ts +19 -19
  210. package/form/lib/btn-submit/btn-submit.component.d.ts +20 -20
  211. package/form/lib/directives/koala-autofocus.directive.d.ts +10 -10
  212. package/form/lib/dynamic-form/builder/dynamic-form.builder.d.ts +21 -21
  213. package/form/lib/dynamic-form/builder/fields/autocomplete.builder.d.ts +16 -16
  214. package/form/lib/dynamic-form/builder/fields/field.base.d.ts +42 -42
  215. package/form/lib/dynamic-form/builder/fields/field.builder.d.ts +8 -8
  216. package/form/lib/dynamic-form/builder/fields/more-items.builder.d.ts +17 -17
  217. package/form/lib/dynamic-form/dynamic-form.component.d.ts +54 -54
  218. package/form/lib/dynamic-form/enums/dynamic-form-type-field.enum.d.ts +33 -33
  219. package/form/lib/dynamic-form/interfaces/koala-custom-validator-fn.interface.d.ts +4 -4
  220. package/form/lib/dynamic-form/interfaces/koala.dynamic-autocomplete-options.interface.d.ts +4 -4
  221. package/form/lib/dynamic-form/interfaces/koala.dynamic-form-autocomplete-multiple-config.interface.d.ts +4 -4
  222. package/form/lib/dynamic-form/interfaces/koala.dynamic-form-config.interface.d.ts +12 -11
  223. package/form/lib/dynamic-form/interfaces/koala.dynamic-form-field.interface.d.ts +69 -69
  224. package/form/lib/dynamic-form/interfaces/koala.dynamic-form-more-itens-show-field-config.interface.d.ts +8 -8
  225. package/form/lib/dynamic-form/interfaces/koala.dynamic-form-show-field.interface.d.ts +5 -5
  226. package/form/lib/dynamic-form/interfaces/koala.dynamic-set-value.interface.d.ts +4 -4
  227. package/form/lib/dynamic-form/koala.dynamic-form.service.d.ts +28 -28
  228. package/form/lib/dynamic-form/validators/autocomplete-selected.validator.d.ts +4 -4
  229. package/form/lib/dynamic-form/validators/cnpj.validator.d.ts +4 -4
  230. package/form/lib/dynamic-form/validators/cpf.validator.d.ts +4 -4
  231. package/form/lib/dynamic-form/validators/date-max.validator.d.ts +2 -2
  232. package/form/lib/dynamic-form/validators/date-min.validator.d.ts +2 -2
  233. package/form/lib/dynamic-form/validators/koala-dynamic-form-validator-result.helper.d.ts +7 -7
  234. package/form/lib/dynamic-form/validators/validation.helper.d.ts +4 -4
  235. package/form/lib/form.abstract.d.ts +16 -16
  236. package/form/lib/koala.form.module.d.ts +25 -25
  237. package/form/lib/show-invalid-fields/show-invalid-fields.d.ts +6 -6
  238. package/icon/esm2020/index.mjs +3 -3
  239. package/icon/esm2020/koalarx-ui-icon.mjs +4 -4
  240. package/icon/esm2020/lib/icon.component.mjs +41 -41
  241. package/icon/esm2020/lib/koala.icon.module.mjs +24 -24
  242. package/icon/esm2020/lib/koala.icon.type.mjs +1 -1
  243. package/icon/fesm2015/koalarx-ui-icon.mjs +56 -56
  244. package/icon/fesm2015/koalarx-ui-icon.mjs.map +1 -1
  245. package/icon/fesm2020/koalarx-ui-icon.mjs +55 -55
  246. package/icon/fesm2020/koalarx-ui-icon.mjs.map +1 -1
  247. package/icon/index.d.ts +3 -3
  248. package/icon/lib/icon.component.d.ts +14 -14
  249. package/icon/lib/koala.icon.module.d.ts +8 -8
  250. package/icon/lib/koala.icon.type.d.ts +1 -1
  251. package/icons-animated/esm2020/index.mjs +4 -4
  252. package/icons-animated/esm2020/koalarx-ui-icons-animated.mjs +4 -4
  253. package/icons-animated/esm2020/lib/icons/downloading/downloading-icon-animated.component.mjs +23 -23
  254. package/icons-animated/esm2020/lib/icons/loading/loading-icon-animated.component.mjs +23 -23
  255. package/icons-animated/esm2020/lib/icons-animated.component.mjs +20 -20
  256. package/icons-animated/esm2020/lib/icons-animated.service.mjs +27 -27
  257. package/icons-animated/esm2020/lib/koala-icons-animated.module.mjs +30 -30
  258. package/icons-animated/fesm2015/koalarx-ui-icons-animated.mjs +95 -95
  259. package/icons-animated/fesm2015/koalarx-ui-icons-animated.mjs.map +1 -1
  260. package/icons-animated/fesm2020/koalarx-ui-icons-animated.mjs +93 -93
  261. package/icons-animated/fesm2020/koalarx-ui-icons-animated.mjs.map +1 -1
  262. package/icons-animated/index.d.ts +4 -4
  263. package/icons-animated/lib/icons/downloading/downloading-icon-animated.component.d.ts +12 -12
  264. package/icons-animated/lib/icons/loading/loading-icon-animated.component.d.ts +12 -12
  265. package/icons-animated/lib/icons-animated.component.d.ts +8 -8
  266. package/icons-animated/lib/icons-animated.service.d.ts +9 -9
  267. package/icons-animated/lib/koala-icons-animated.module.d.ts +10 -10
  268. package/list/esm2020/index.mjs +11 -11
  269. package/list/esm2020/koalarx-ui-list.mjs +4 -4
  270. package/list/esm2020/lib/koala-list-btn-collapse-sub-list-config.interface.mjs +1 -1
  271. package/list/esm2020/lib/koala-list-filter.interface.mjs +1 -1
  272. package/list/esm2020/lib/koala-list-form-filter.interface.mjs +1 -1
  273. package/list/esm2020/lib/koala-list-item-menu-option.interface.mjs +1 -1
  274. package/list/esm2020/lib/koala-list-item.interface.mjs +1 -1
  275. package/list/esm2020/lib/koala.list-config.interface.mjs +1 -1
  276. package/list/esm2020/lib/koala.list.module.mjs +68 -68
  277. package/list/esm2020/lib/koala.list.service.mjs +15 -15
  278. package/list/esm2020/lib/list-builder/list.builder.mjs +104 -104
  279. package/list/esm2020/lib/list.abstract.mjs +163 -163
  280. package/list/esm2020/lib/list.component.mjs +172 -172
  281. package/list/esm2020/lib/providers/pagination/pagination.provider.mjs +32 -32
  282. package/list/fesm2015/koalarx-ui-list.mjs +521 -521
  283. package/list/fesm2015/koalarx-ui-list.mjs.map +1 -1
  284. package/list/fesm2020/koalarx-ui-list.mjs +491 -491
  285. package/list/fesm2020/koalarx-ui-list.mjs.map +1 -1
  286. package/list/index.d.ts +11 -11
  287. package/list/lib/koala-list-btn-collapse-sub-list-config.interface.d.ts +8 -8
  288. package/list/lib/koala-list-filter.interface.d.ts +10 -10
  289. package/list/lib/koala-list-form-filter.interface.d.ts +8 -8
  290. package/list/lib/koala-list-item-menu-option.interface.d.ts +7 -7
  291. package/list/lib/koala-list-item.interface.d.ts +13 -13
  292. package/list/lib/koala.list-config.interface.d.ts +37 -37
  293. package/list/lib/koala.list.module.d.ts +17 -17
  294. package/list/lib/koala.list.service.d.ts +7 -7
  295. package/list/lib/list-builder/list.builder.d.ts +32 -32
  296. package/list/lib/list.abstract.d.ts +44 -44
  297. package/list/lib/list.component.d.ts +54 -54
  298. package/list/lib/providers/pagination/pagination.provider.d.ts +9 -9
  299. package/menu/esm2020/index.mjs +5 -5
  300. package/menu/esm2020/koalarx-ui-menu.mjs +4 -4
  301. package/menu/esm2020/lib/koala.menu-module.interface.mjs +1 -1
  302. package/menu/esm2020/lib/koala.menu-tool.interface.mjs +1 -1
  303. package/menu/esm2020/lib/koala.menu.module.mjs +36 -36
  304. package/menu/esm2020/lib/koala.menu.service.mjs +24 -24
  305. package/menu/esm2020/lib/menu.component.mjs +100 -100
  306. package/menu/fesm2015/koalarx-ui-menu.mjs +139 -139
  307. package/menu/fesm2015/koalarx-ui-menu.mjs.map +1 -1
  308. package/menu/fesm2020/koalarx-ui-menu.mjs +135 -135
  309. package/menu/fesm2020/koalarx-ui-menu.mjs.map +1 -1
  310. package/menu/index.d.ts +5 -5
  311. package/menu/lib/koala.menu-module.interface.d.ts +12 -12
  312. package/menu/lib/koala.menu-tool.interface.d.ts +6 -6
  313. package/menu/lib/koala.menu.module.d.ts +11 -11
  314. package/menu/lib/koala.menu.service.d.ts +10 -10
  315. package/menu/lib/menu.component.d.ts +22 -22
  316. package/package.json +1 -1
  317. package/question/esm2020/index.mjs +4 -4
  318. package/question/esm2020/koalarx-ui-question.mjs +4 -4
  319. package/question/esm2020/lib/dialog-question.component.mjs +25 -25
  320. package/question/esm2020/lib/koala-question-config.interface.mjs +1 -1
  321. package/question/esm2020/lib/koala.question.module.mjs +40 -40
  322. package/question/esm2020/lib/koala.question.service.mjs +26 -26
  323. package/question/fesm2015/koalarx-ui-question.mjs +68 -68
  324. package/question/fesm2015/koalarx-ui-question.mjs.map +1 -1
  325. package/question/fesm2020/koalarx-ui-question.mjs +66 -66
  326. package/question/fesm2020/koalarx-ui-question.mjs.map +1 -1
  327. package/question/index.d.ts +4 -4
  328. package/question/lib/dialog-question.component.d.ts +10 -10
  329. package/question/lib/koala-question-config.interface.d.ts +5 -5
  330. package/question/lib/koala.question.module.d.ts +12 -12
  331. package/question/lib/koala.question.service.d.ts +10 -10
  332. package/snackbar/esm2020/index.mjs +4 -4
  333. package/snackbar/esm2020/koalarx-ui-snackbar.mjs +4 -4
  334. package/snackbar/esm2020/lib/koala.snackbar.component.mjs +22 -22
  335. package/snackbar/esm2020/lib/koala.snackbar.interface.mjs +1 -1
  336. package/snackbar/esm2020/lib/koala.snackbar.module.mjs +36 -36
  337. package/snackbar/esm2020/lib/koala.snackbar.service.mjs +35 -35
  338. package/snackbar/fesm2015/koalarx-ui-snackbar.mjs +74 -74
  339. package/snackbar/fesm2015/koalarx-ui-snackbar.mjs.map +1 -1
  340. package/snackbar/fesm2020/koalarx-ui-snackbar.mjs +72 -72
  341. package/snackbar/fesm2020/koalarx-ui-snackbar.mjs.map +1 -1
  342. package/snackbar/index.d.ts +4 -4
  343. package/snackbar/lib/koala.snackbar.component.d.ts +10 -10
  344. package/snackbar/lib/koala.snackbar.interface.d.ts +4 -4
  345. package/snackbar/lib/koala.snackbar.module.d.ts +10 -10
  346. package/snackbar/lib/koala.snackbar.service.d.ts +12 -12
@@ -1,598 +1,598 @@
1
- import { Validators } from '@angular/forms';
2
- import { DynamicFormTypeFieldEnum } from './enums/dynamic-form-type-field.enum';
3
- import { CpfValidator } from './validators/cpf.validator';
4
- import { CnpjValidator } from './validators/cnpj.validator';
5
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
6
- import { FormAbstract } from '../form.abstract';
7
- import { debounceTime } from 'rxjs/operators';
8
- import { BehaviorSubject } from 'rxjs';
9
- import { AutocompleteSelectedValidator } from './validators/autocomplete-selected.validator';
10
- import { delay } from "@koalarx/utils/operators/delay";
11
- import { koala } from "@koalarx/utils";
12
- import { DateMinValidator } from "./validators/date-min.validator";
13
- import { DateMaxValidator } from "./validators/date-max.validator";
14
- import { KoalaLanguageHelper } from "@koalarx/ui/core";
15
- import { randomString } from "@koalarx/utils/operators/string";
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "@angular/forms";
18
- import * as i2 from "./koala.dynamic-form.service";
19
- import * as i3 from "@angular/common";
20
- import * as i4 from "ng2-currency-mask";
21
- import * as i5 from "ngx-mask";
22
- import * as i6 from "@koalarx/ui/file-button";
23
- import * as i7 from "@angular/cdk/text-field";
24
- import * as i8 from "@angular/material/form-field";
25
- import * as i9 from "@angular/material/input";
26
- import * as i10 from "@angular/material/select";
27
- import * as i11 from "@angular/material/core";
28
- import * as i12 from "@angular/material/radio";
29
- import * as i13 from "@angular/material/checkbox";
30
- import * as i14 from "@angular/material/autocomplete";
31
- import * as i15 from "@angular/material/button";
32
- import * as i16 from "@angular/material/icon";
33
- import * as i17 from "@angular/material/expansion";
34
- import * as i18 from "@angular/material/chips";
35
- import * as i19 from "@koalarx/ui/button";
36
- import * as i20 from "@angular/material/progress-spinner";
37
- import * as i21 from "../directives/koala-autofocus.directive";
38
- export class DynamicFormComponent extends FormAbstract {
39
- constructor(fb, dynamicFormService) {
40
- super(() => this.form);
41
- this.fb = fb;
42
- this.dynamicFormService = dynamicFormService;
43
- this.tabIndexStart = 1;
44
- this.typeField = DynamicFormTypeFieldEnum;
45
- this.hoursAndMinutesMask = '00:000';
46
- this.errorMessage = KoalaLanguageHelper;
47
- this.formId = randomString(25, {
48
- lowercase: true,
49
- uppercase: true,
50
- numbers: false,
51
- specialCharacters: false
52
- });
53
- }
54
- ngOnInit() {
55
- if (!this.form.get('formData')) {
56
- this.form.addControl('formData', this.fb.array([]));
57
- }
58
- this.controls = this.form.get('formData');
59
- this.formConfig?.forEach((config, indexConfig) => {
60
- const newFormGroup = this.newControl(config);
61
- if (config.asyncValidators) {
62
- newFormGroup.get('value').setAsyncValidators(config.asyncValidators);
63
- }
64
- newFormGroup.get('value').updateValueAndValidity();
65
- if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
66
- const formGroupDynamicFormsSubject = newFormGroup.get('dynamicFormConfig').value;
67
- formGroupDynamicFormsSubject.subscribe(formGroupConfig => {
68
- if (formGroupConfig) {
69
- formGroupConfig.form.valueChanges.subscribe(() => {
70
- if (formGroupConfig.form.valid && (config.valueChanges || this.showFieldsMoreItensConfig)) {
71
- const value = this.dynamicFormService.emitData(formGroupConfig.form);
72
- newFormGroup.get('value').setValue(value);
73
- }
74
- });
75
- }
76
- });
77
- }
78
- if (config.valueChanges ||
79
- config.type === DynamicFormTypeFieldEnum.autocomplete ||
80
- config.type === DynamicFormTypeFieldEnum.dynamicForm ||
81
- this.showFieldsMoreItensConfig) {
82
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
83
- const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
84
- if (autocompleteOptionsSubject) {
85
- autocompleteOptionsSubject.subscribe(options => newFormGroup.get('autocompleteOptionsFiltered').value.next(options));
86
- }
87
- }
88
- newFormGroup.get('value')
89
- .valueChanges
90
- .pipe(debounceTime(300))
91
- .subscribe(async (value) => {
92
- await this.setConfigDynamicForm(newFormGroup);
93
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
94
- if (value && (value.hasOwnProperty('value') &&
95
- value.hasOwnProperty('name') &&
96
- Object.keys(value).length === 2) || (Array.isArray(value) &&
97
- newFormGroup.get('multiple').value)) {
98
- if (newFormGroup.get('multiple').value) {
99
- if (Array.isArray(value)) {
100
- newFormGroup.get('autocompleteSelectedValue').setValue(value);
101
- newFormGroup.get('value').setValue(value[value.length - 1], { emitEvent: false });
102
- }
103
- else {
104
- if (this.validateAutocompleteSelect(newFormGroup.get('autocompleteSelectedValue').value, value)) {
105
- newFormGroup.get('autocompleteSelectedValue').value.push(value);
106
- }
107
- }
108
- const autocompleteInput = document.querySelector(`#${this.formId} input#autocomplete-${newFormGroup.get('name')?.value}`);
109
- if (autocompleteInput) {
110
- autocompleteInput.value = '';
111
- }
112
- }
113
- else {
114
- newFormGroup.get('autocompleteSelectedValue').setValue(value);
115
- }
116
- }
117
- else if (!newFormGroup.get('multiple').value) {
118
- newFormGroup.get('autocompleteSelectedValue').setValue(koala(this.formConfig)
119
- .array()
120
- .filter(newFormGroup.get('name').value, 'name')
121
- .getValue()[0]?.autocompleteDefaultValueOnClear ?? null);
122
- }
123
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
124
- if (config.autocompleteType === 'all') {
125
- const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
126
- newFormGroup.get('autocompleteOptionsFiltered').value.next(this.autocompleteFilter(autocompleteOptionsSubject.value, value));
127
- }
128
- else if (config.autocompleteType === 'onDemand' && typeof value !== "object") {
129
- const loader = newFormGroup.get('autocompleteLoading').value;
130
- loader.next(true);
131
- config.autocompleteFilter(value).subscribe(options => {
132
- newFormGroup.get('autocompleteOptionsFiltered').value.next(options);
133
- loader.next(false);
134
- });
135
- }
136
- }
137
- }
138
- if (config.valueChanges) {
139
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
140
- config.valueChanges((newFormGroup.get('multiple').value ?
141
- newFormGroup.get('autocompleteSelectedValue').value.map(item => item.value) :
142
- newFormGroup.get('autocompleteSelectedValue').value?.value));
143
- }
144
- else {
145
- config.valueChanges(value);
146
- }
147
- }
148
- });
149
- }
150
- this.controls.push(newFormGroup);
151
- if (config.moreItemsConfig) {
152
- if (config.moreItemsMinItems > 0) {
153
- for (let min = 0; min < config.moreItemsMinItems; min++) {
154
- if (min <= config.moreItemsMaxItems) {
155
- this.addMoreItem(indexConfig);
156
- }
157
- }
158
- }
159
- if (config.moreItemsConfig.setValues) {
160
- config.moreItemsConfig
161
- .setValues
162
- .subscribe(async (values) => {
163
- if (values.length > 0) {
164
- values.forEach((itemValue, indexValue) => {
165
- if (!this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue]) {
166
- this.addMoreItem(indexConfig);
167
- }
168
- setTimeout(() => {
169
- this.setValuesOnFields(itemValue, this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue].form);
170
- }, 300);
171
- });
172
- }
173
- });
174
- }
175
- }
176
- });
177
- if (this.showFields) {
178
- this.changeVisibilityFields(this.showFields, this.form);
179
- }
180
- if (this.setValues) {
181
- this.setValuesOnFields(this.setValues, this.form);
182
- }
183
- }
184
- isValidNewAutocompleteOption(value) {
185
- return !!value && typeof value === 'string';
186
- }
187
- hoursAndMinutesApplyMask(index, event) {
188
- const control = this.controls?.controls[index];
189
- const type = control?.get('type').value;
190
- if (type === DynamicFormTypeFieldEnum.hoursAndMinutes) {
191
- const value = control?.get('value').value;
192
- if (event.key == 'Backspace' && value.length < 6) {
193
- this.hoursAndMinutesMask = '00:000';
194
- }
195
- else if (event.key != 'Backspace' && value.length >= 6) {
196
- this.hoursAndMinutesMask = '000:00';
197
- }
198
- }
199
- }
200
- passwordView(index) {
201
- const control = this.controls?.controls[index];
202
- const hidePassword = !control?.get('hidePassword').value;
203
- control?.get('hidePassword').setValue(hidePassword);
204
- control?.get('type').setValue(hidePassword ?
205
- DynamicFormTypeFieldEnum.password :
206
- DynamicFormTypeFieldEnum.text);
207
- }
208
- addMoreItem(propIndex) {
209
- if (this.controls.controls[propIndex].get('moreItemsConfig').value.length < this.controls.controls[propIndex].get('moreItemsMaxItems').value) {
210
- const formGroup = this.fb.group({});
211
- this.controls.controls[propIndex].get('moreItemsConfig').value.push({
212
- form: formGroup,
213
- formConfig: this.formConfig[propIndex].moreItemsConfig.formConfig,
214
- showFields: new BehaviorSubject([]),
215
- showFieldsMoreItensConfig: this.formConfig[propIndex].moreItemsConfig.showFieldsConfig
216
- });
217
- this.controls.controls[propIndex].get('moreItemsExpanded').setValue(this.controls.controls[propIndex].get('moreItemsConfig').value.length - 1);
218
- const formArrayMoreItems = this.controls.controls[propIndex].get('moreItemsFormGroup');
219
- formArrayMoreItems.push(formGroup);
220
- }
221
- }
222
- removeMoreItem(propIndex, removeIndex) {
223
- const expandedItemIndex = removeIndex - 1;
224
- this.controls.controls[propIndex].get('moreItemsConfig').value.splice(removeIndex, 1);
225
- setTimeout(() => {
226
- this.controls.controls[propIndex].get('moreItemsExpanded').setValue((expandedItemIndex < 0) ? 0 : expandedItemIndex);
227
- }, 50);
228
- }
229
- clearAutocomplete(propIndex) {
230
- if (this.controls.controls[propIndex].get('multiple').value) {
231
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
232
- this.controls.controls[propIndex].get('value').setValue(null);
233
- }
234
- else {
235
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue(this.formConfig[propIndex].autocompleteDefaultValueOnClear ?? null);
236
- this.controls.controls[propIndex].get('value').setValue(this.formConfig[propIndex].autocompleteDefaultValueOnClear ?? null);
237
- }
238
- }
239
- display(option) {
240
- return option ? option.name : undefined;
241
- }
242
- removeOptionOnAutocomplete(propIndex, option) {
243
- const value = this.controls.controls[propIndex].get('autocompleteSelectedValue').value.filter(item => item !== option);
244
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue(value);
245
- if (value.length === 0) {
246
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
247
- this.controls.controls[propIndex].get('value').setValue(null);
248
- }
249
- else if (this.formConfig[propIndex].valueChanges) {
250
- this.formConfig[propIndex].valueChanges(value.map(item => item.value));
251
- }
252
- }
253
- getColorChip(config) {
254
- return config.color;
255
- }
256
- getAutocompleteOptions(propriedade) {
257
- return propriedade.get('autocompleteOptionsFiltered').value;
258
- }
259
- getDynamicFormConfig(propriedade) {
260
- return propriedade.get('dynamicFormConfig').value;
261
- }
262
- getRandomString() {
263
- return randomString(20, {
264
- lowercase: true,
265
- numbers: true,
266
- specialCharacters: false,
267
- uppercase: true
268
- });
269
- }
270
- newControl(config) {
271
- let validators = config.syncValidators ?? [];
272
- let value = config.value ?? '';
273
- let valueSelectedAutocomplete = (config.multiple ? [] : (config.autocompleteDefaultValueOnClear ?? null));
274
- if (config.required === true)
275
- validators.push(Validators.required);
276
- if (config.min && typeof config.min === "number")
277
- validators.push(Validators.min(config.min));
278
- if (config.max && typeof config.max === "number")
279
- validators.push(Validators.max(config.max));
280
- if (config.type === DynamicFormTypeFieldEnum.date ||
281
- config.type === DynamicFormTypeFieldEnum.datetime ||
282
- config.type === DynamicFormTypeFieldEnum.time) {
283
- if (config.min && typeof config.min === "string") {
284
- validators.push(DateMinValidator(config.min));
285
- }
286
- if (config.max && typeof config.max === "string") {
287
- validators.push(DateMaxValidator(config.max));
288
- }
289
- }
290
- if (config.minLength)
291
- validators.push(Validators.minLength(config.minLength));
292
- if (config.maxLength)
293
- validators.push(Validators.maxLength(config.maxLength));
294
- if (config.type === DynamicFormTypeFieldEnum.cpf) {
295
- validators.push(CpfValidator);
296
- }
297
- else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
298
- validators.push(CnpjValidator);
299
- }
300
- else if (config.type === DynamicFormTypeFieldEnum.email) {
301
- validators.push(Validators.email);
302
- }
303
- else if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
304
- if (value) {
305
- valueSelectedAutocomplete = value;
306
- value = (config.multiple ? valueSelectedAutocomplete[0] : value);
307
- }
308
- if (config.required === true) {
309
- validators.push(AutocompleteSelectedValidator);
310
- }
311
- }
312
- else if (config.type === DynamicFormTypeFieldEnum.checkbox) {
313
- value = config.value ?? false;
314
- }
315
- if (config.type === DynamicFormTypeFieldEnum.hoursAndMinutes &&
316
- value.length >= 6) {
317
- this.hoursAndMinutesMask = '000:00';
318
- }
319
- if (config.dynamicFormConfig) {
320
- const cloneDynamicFormConfig = {};
321
- Object.assign(cloneDynamicFormConfig, config.dynamicFormConfig);
322
- cloneDynamicFormConfig.form = config.dynamicFormConfig.form;
323
- config.dynamicFormConfig = cloneDynamicFormConfig;
324
- }
325
- if (config.show === false) {
326
- validators = [];
327
- }
328
- const field = this.fb.group({
329
- show: [new BehaviorSubject(config.show ?? true)],
330
- label: [config.label],
331
- name: [config.name],
332
- type: [config.type],
333
- fileButtonConfig: [{
334
- icon: config?.fileButtonConfig?.icon ?? 'attach_file',
335
- text: config?.fileButtonConfig?.text ?? 'Clique para anexar arquivos',
336
- backgroundColor: config?.fileButtonConfig?.backgroundColor ?? 'white',
337
- color: config?.fileButtonConfig?.color ?? 'blue',
338
- accept: config?.fileButtonConfig?.accept ?? '*'
339
- }],
340
- dynamicFormConfig: [new BehaviorSubject(config.dynamicFormConfig)],
341
- dynamicFormGroup: this.fb.array([]),
342
- appearance: [config.appearance],
343
- floatLabel: [config.floatLabel],
344
- placeholder: [config.placeholder],
345
- class: [config.class],
346
- fieldClass: [config.fieldClass],
347
- textHint: [config.textHint],
348
- required: [config.required ?? false],
349
- min: [config.min ?? 0],
350
- max: [config.max ?? 99999999999],
351
- minLength: [config.minLength ?? 0],
352
- maxLength: [config.maxLength ?? 255],
353
- disabled: [config.disabled ?? false],
354
- focus: [config.focus ?? false],
355
- multiple: [config.multiple ?? false],
356
- opcoesSelect: [config.opcoesSelect ?? []],
357
- hidePassword: config.type === DynamicFormTypeFieldEnum.password ? true : null,
358
- moreItemsButtonIconAddlabel: [config.moreItemsButtonIconAddlabel],
359
- moreItemsMinItems: [config.moreItemsMinItems ?? 0],
360
- moreItemsMaxItems: [config.moreItemsMaxItems ?? 100],
361
- moreItemsIcon: [config.moreItemsIcon],
362
- moreItemsIconFontColor: [config.moreItemsIconFontColor],
363
- moreItemsIconBackgroundColor: [config.moreItemsIconBackgroundColor],
364
- moreItemsExpanded: [''],
365
- moreItemsConfig: [[]],
366
- moreItemsFormGroup: this.fb.array([]),
367
- autocompleteLoading: [new BehaviorSubject(false)],
368
- autocompleteOptions: [config.autocompleteOptions],
369
- autocompleteMultipleConfig: [config.autocompleteMultipleConfig],
370
- autocompleteOptionsFiltered: [new BehaviorSubject([])],
371
- autocompleteSelectedValue: [valueSelectedAutocomplete],
372
- autocompleteAddOption: [config.autocompleteAddOption],
373
- textLogs: [config?.textObs],
374
- customMasc: [config?.customMasc],
375
- customMascThousandSeparator: [config?.customMascThousandSeparator ?? ''],
376
- customMascSuffix: [config?.customMascSuffix ?? ''],
377
- customMascPrefix: [config?.customMascPrefix ?? ''],
378
- value: [{ value, disabled: config.disabled }, validators, config.asyncValidators]
379
- });
380
- if (config.autocompleteType === "onDemand") {
381
- const loader = field.get('autocompleteLoading').value;
382
- loader.next(true);
383
- config.autocompleteFilter('').subscribe(options => {
384
- field.get('autocompleteOptionsFiltered').value.next(options);
385
- loader.next(false);
386
- });
387
- }
388
- return field;
389
- }
390
- setValuesOnFields(subject, form) {
391
- subject.subscribe(item => {
392
- if (item) {
393
- const formArray = form.get('formData');
394
- for (const prop of item.values()) {
395
- this.setValueByProp(formArray, prop);
396
- }
397
- }
398
- });
399
- }
400
- changeVisibilityFields(subject, form) {
401
- subject.pipe(debounceTime(5)).subscribe(item => {
402
- if (item) {
403
- const formArray = form.get('formData');
404
- for (const prop of item.values()) {
405
- for (const [indexControl, control] of formArray.controls.entries()) {
406
- if (control.get('name').value === prop.name) {
407
- control.get('show').value.next(prop.show);
408
- const config = this.formConfig[indexControl] ?? null;
409
- if (prop.show) {
410
- let validators = [];
411
- if (config) {
412
- if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
413
- const formArrayMoreItems = control.get('dynamicFormGroup');
414
- formArrayMoreItems.push(config?.dynamicFormConfig?.form);
415
- }
416
- else {
417
- validators = config.syncValidators ?? [];
418
- if (config.required === true) {
419
- validators.push(Validators.required);
420
- }
421
- if (config.type === DynamicFormTypeFieldEnum.cpf) {
422
- validators.push(CpfValidator);
423
- }
424
- else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
425
- validators.push(CnpjValidator);
426
- }
427
- else if (config.type === DynamicFormTypeFieldEnum.email) {
428
- validators.push(Validators.email);
429
- }
430
- else if (config.required === true &&
431
- config.type === DynamicFormTypeFieldEnum.autocomplete) {
432
- validators.push(AutocompleteSelectedValidator);
433
- }
434
- if (config.min && typeof config.min === "number")
435
- validators.push(Validators.min(config.min));
436
- if (config.max && typeof config.max === "number")
437
- validators.push(Validators.max(config.max));
438
- if (config.type === DynamicFormTypeFieldEnum.date ||
439
- config.type === DynamicFormTypeFieldEnum.datetime ||
440
- config.type === DynamicFormTypeFieldEnum.time) {
441
- if (config.min && typeof config.min === "string") {
442
- validators.push(DateMinValidator(config.min));
443
- }
444
- if (config.max && typeof config.max === "string") {
445
- validators.push(DateMaxValidator(config.max));
446
- }
447
- }
448
- if (config.minLength)
449
- validators.push(Validators.minLength(config.minLength));
450
- if (config.maxLength)
451
- validators.push(Validators.maxLength(config.maxLength));
452
- control.get('value').setValidators(validators);
453
- if (config.asyncValidators) {
454
- control.get('value').setAsyncValidators(config.asyncValidators);
455
- }
456
- }
457
- control.get('value').updateValueAndValidity();
458
- if (prop.clearCurrentValue) {
459
- control.get('value').setValue(null);
460
- }
461
- }
462
- }
463
- else {
464
- control.get('value').clearValidators();
465
- control.get('value').clearAsyncValidators();
466
- control.setErrors(null);
467
- control.get('value').setValue(null);
468
- control.get('value').updateValueAndValidity();
469
- if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
470
- const formGroup = control;
471
- formGroup.removeControl('dynamicFormGroup');
472
- formGroup.addControl('dynamicFormGroup', this.fb.array([]));
473
- }
474
- }
475
- break;
476
- }
477
- }
478
- }
479
- }
480
- });
481
- }
482
- autocompleteFilter(arr, value) {
483
- return arr.filter(filter => {
484
- if (typeof value === 'string') {
485
- if (filter) {
486
- let find = true;
487
- value.toLowerCase()
488
- .split(' ')
489
- .forEach(part => {
490
- if (filter.name.toLowerCase().indexOf(part) < 0) {
491
- find = false;
492
- return false;
493
- }
494
- });
495
- return find;
496
- }
497
- }
498
- else {
499
- return true;
500
- }
501
- });
502
- }
503
- setValueByProp(formArray, prop) {
504
- if (formArray) {
505
- if (prop.name.indexOf(' > ') >= 0) {
506
- let dynamicFormSubject;
507
- const arrPropName = prop.name.split(' > ');
508
- let indexPropName = 0;
509
- do {
510
- const control = formArray.controls.find(control => control.get('name').value === arrPropName[indexPropName]);
511
- if (indexPropName === arrPropName.length - 2) {
512
- dynamicFormSubject = control.get('dynamicFormConfig').value;
513
- const dynamicForm = dynamicFormSubject.getValue();
514
- if (dynamicForm.formConfig.find(fc => fc.name === arrPropName[arrPropName.length - 1])) {
515
- if (dynamicForm.setValues) {
516
- dynamicForm.setValues.next(koala(dynamicForm.setValues.getValue()).array().merge([{
517
- name: arrPropName[arrPropName.length - 1],
518
- value: prop.value
519
- }]).getValue());
520
- }
521
- else {
522
- dynamicForm.setValues = new BehaviorSubject([{
523
- name: arrPropName[arrPropName.length - 1],
524
- value: prop.value
525
- }]);
526
- }
527
- }
528
- }
529
- indexPropName++;
530
- } while (indexPropName < arrPropName.length - 1);
531
- }
532
- else {
533
- for (const control of formArray.controls.values()) {
534
- if (control.get('name').value === prop.name) {
535
- control.get('value').setValue(prop.value);
536
- break;
537
- }
538
- }
539
- }
540
- }
541
- }
542
- async setConfigDynamicForm(newFormGroup) {
543
- if (this.showFieldsMoreItensConfig) {
544
- const value = newFormGroup.get('value').value;
545
- const configs = this.showFieldsMoreItensConfig
546
- .filter(config => config.nameField === newFormGroup.get('name').value)
547
- .sort(config => {
548
- if (config.fnShow(value)) {
549
- return 1;
550
- }
551
- return -1;
552
- });
553
- for (const config of configs) {
554
- if (config) {
555
- if (config.dynamicFormConfig && config.fnShow(value)) {
556
- const controlDynamicFormConfig = this.controls
557
- .controls
558
- .find(control => config.fieldsToShow.indexOf(control.get('name').value) >= 0);
559
- const dynamicFormConfigSubject = controlDynamicFormConfig.get('dynamicFormConfig').value;
560
- dynamicFormConfigSubject.next(null);
561
- await delay(1);
562
- dynamicFormConfigSubject.next(config.dynamicFormConfig(value));
563
- }
564
- this.dynamicFormService.showFields(this.showFields, config.fieldsToShow, config.fnShow(value), config.clearCurrentValue);
565
- }
566
- }
567
- }
568
- }
569
- validateAutocompleteSelect(selectedValues, value) {
570
- let isValid = true;
571
- for (const selectedItem of selectedValues.values()) {
572
- if (selectedItem.name === value.name) {
573
- isValid = false;
574
- break;
575
- }
576
- }
577
- return isValid;
578
- }
579
- }
580
- DynamicFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: DynamicFormComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.KoalaDynamicFormService }], target: i0.ɵɵFactoryTarget.Component });
581
- DynamicFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.11", type: DynamicFormComponent, selector: "koala-dynamic-form", inputs: { form: "form", formConfig: "formConfig", showFields: "showFields", showFieldsMoreItensConfig: "showFieldsMoreItensConfig", setValues: "setValues", tabIndexStart: "tabIndexStart" }, usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"form\" class=\"p-relative w-100\" [id]=\"formId\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n [autocomplete]=\"getRandomString()\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [autocomplete]=\"getRandomString()\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [autocomplete]=\"getRandomString()\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n <mat-chip\n (removed)=\"removeOptionOnAutocomplete(i, option)\"\n *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n [removable]=\"true\"\n [selectable]=\"true\">\n {{display(option)}}\n <mat-icon *ngIf=\"!propriedade.get('disabled').value\" matChipRemove>cancel</mat-icon>\n </mat-chip>\n\t <input\n [id]=\"'autocomplete-' + propriedade.get('name').value\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n [autocomplete]=\"getRandomString()\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [autocomplete]=\"getRandomString()\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n <mat-option\n *ngIf=\"propriedade.get('autocompleteAddOption').value && isValidNewAutocompleteOption(propriedade.get('value').value)\"\n [value]=\"{\n value: {id: 0, name: propriedade.get('value').value},\n name: propriedade.get('value').value\n }\">\n Add <b>{{propriedade.get('value').value}}</b>...\n </mat-option>\n\t\t <div *ngIf=\"(getAutocompleteOptions(propriedade) | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(getDynamicFormConfig(propriedade) | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n", styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:Josefin Sans,sans-serif;font-size:11px;font-weight:700;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.CurrencyMaskDirective, selector: "[currencyMask]", inputs: ["max", "min", "options"] }, { kind: "directive", type: i5.MaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "triggerOnMaskChange"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { kind: "component", type: i6.FileButtonComponent, selector: "koala-file-button", inputs: ["color", "backgroundColor", "icon", "text", "tooltip", "disabled", "multiple", "accept", "setFile", "updateFileList", "autoclear"], outputs: ["getFiles"] }, { kind: "directive", type: i7.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "directive", type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i12.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i12.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i14.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i14.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i15.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i16.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i17.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i17.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i17.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i17.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i17.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i17.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "component", type: i18.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i18.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i18.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i18.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i19.ButtonComponent, selector: "koala-button", inputs: ["color", "backgroundColor", "icon", "text", "tooltip", "disabled", "koalaIcon", "koalaIconSize"] }, { kind: "component", type: i20.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: DynamicFormComponent, selector: "koala-dynamic-form", inputs: ["form", "formConfig", "showFields", "showFieldsMoreItensConfig", "setValues", "tabIndexStart"] }, { kind: "directive", type: i21.KoalaAutofocusDirective, selector: "[koalaAutoFocus]", inputs: ["koalaAutoFocus"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
582
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: DynamicFormComponent, decorators: [{
583
- type: Component,
584
- args: [{ selector: 'koala-dynamic-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [formGroup]=\"form\" class=\"p-relative w-100\" [id]=\"formId\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n [autocomplete]=\"getRandomString()\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [autocomplete]=\"getRandomString()\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [autocomplete]=\"getRandomString()\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n <mat-chip\n (removed)=\"removeOptionOnAutocomplete(i, option)\"\n *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n [removable]=\"true\"\n [selectable]=\"true\">\n {{display(option)}}\n <mat-icon *ngIf=\"!propriedade.get('disabled').value\" matChipRemove>cancel</mat-icon>\n </mat-chip>\n\t <input\n [id]=\"'autocomplete-' + propriedade.get('name').value\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n [autocomplete]=\"getRandomString()\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [autocomplete]=\"getRandomString()\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n <mat-option\n *ngIf=\"propriedade.get('autocompleteAddOption').value && isValidNewAutocompleteOption(propriedade.get('value').value)\"\n [value]=\"{\n value: {id: 0, name: propriedade.get('value').value},\n name: propriedade.get('value').value\n }\">\n Add <b>{{propriedade.get('value').value}}</b>...\n </mat-option>\n\t\t <div *ngIf=\"(getAutocompleteOptions(propriedade) | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(getDynamicFormConfig(propriedade) | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n", styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:Josefin Sans,sans-serif;font-size:11px;font-weight:700;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"] }]
585
- }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.KoalaDynamicFormService }]; }, propDecorators: { form: [{
586
- type: Input
587
- }], formConfig: [{
588
- type: Input
589
- }], showFields: [{
590
- type: Input
591
- }], showFieldsMoreItensConfig: [{
592
- type: Input
593
- }], setValues: [{
594
- type: Input
595
- }], tabIndexStart: [{
596
- type: Input
597
- }] } });
598
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMEQsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBRXJILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQVE3RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8s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b0JBQW9CO3NHQUFwQixvQkFBb0IsK1FDL0JqQyxpeDZCQTJrQkEsd2xSRDVpQmEsb0JBQW9COzRGQUFwQixvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0Usb0JBQW9CLG1CQUdiLHVCQUF1QixDQUFDLE1BQU07K0lBR3RDLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtIH0gZnJvbSAnLi9lbnVtcy9keW5hbWljLWZvcm0tdHlwZS1maWVsZC5lbnVtJztcbmltcG9ydCB7IENwZlZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycy9jcGYudmFsaWRhdG9yJztcbmltcG9ydCB7IENucGpWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvY25wai52YWxpZGF0b3InO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQWJzdHJhY3QgfSBmcm9tICcuLi9mb3JtLmFic3RyYWN0JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1zZXQtdmFsdWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL2F1dG9jb21wbGV0ZS1zZWxlY3RlZC52YWxpZGF0b3InO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWF1dG9jb21wbGV0ZS1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1zaG93LWZpZWxkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2VydmljZSB9IGZyb20gJy4va29hbGEuZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybU1vcmVJdGVuc1Nob3dGaWVsZENvbmZpZ0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tbW9yZS1pdGVucy1zaG93LWZpZWxkLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtQXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiQGtvYWxhcngvdXRpbHMvb3BlcmF0b3JzL2RlbGF5XCI7XG5pbXBvcnQgeyBrb2FsYSB9IGZyb20gXCJAa29hbGFyeC91dGlsc1wiO1xuaW1wb3J0IHsgRGF0ZU1pblZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvZGF0ZS1taW4udmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBEYXRlTWF4VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9kYXRlLW1heC52YWxpZGF0b3JcIjtcbmltcG9ydCB7IEtvYWxhTGFuZ3VhZ2VIZWxwZXIgfSBmcm9tIFwiQGtvYWxhcngvdWkvY29yZVwiO1xuaW1wb3J0IHsgcmFuZG9tU3RyaW5nIH0gZnJvbSBcIkBrb2FsYXJ4L3V0aWxzL29wZXJhdG9ycy9zdHJpbmdcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna29hbGEtZHluYW1pYy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICdkeW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZHluYW1pYy1mb3JtLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1Db21wb25lbnQgZXh0ZW5kcyBGb3JtQWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmb3JtQ29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtRmllbGRJbnRlcmZhY2VbXTtcbiAgQElucHV0KCkgc2hvd0ZpZWxkczogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1TaG93RmllbGRJbnRlcmZhY2VbXT47XG4gIEBJbnB1dCgpIHNob3dGaWVsZHNNb3JlSXRlbnNDb25maWc6IEtvYWxhRHluYW1pY0Zvcm1Nb3JlSXRlbnNTaG93RmllbGRDb25maWdJbnRlcmZhY2VbXTtcbiAgQElucHV0KCkgc2V0VmFsdWVzOiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2VbXT47XG4gIEBJbnB1dCgpIHRhYkluZGV4U3RhcnQ6IG51bWJlciA9IDE7XG5cbiAgcHVibGljIGNvbnRyb2xzOiBVbnR5cGVkRm9ybUFycmF5O1xuICBwdWJsaWMgdHlwZUZpZWxkID0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtO1xuICBwdWJsaWMgaG91cnNBbmRNaW51dGVzTWFzayA9ICcwMDowMDAnO1xuICBwdWJsaWMgZXJyb3JNZXNzYWdlID0gS29hbGFMYW5ndWFnZUhlbHBlcjtcbiAgcHVibGljIGZvcm1JZCA9IHJhbmRvbVN0cmluZygyNSwge1xuICAgIGxvd2VyY2FzZTogdHJ1ZSxcbiAgICB1cHBlcmNhc2U6IHRydWUsXG4gICAgbnVtYmVyczogZmFsc2UsXG4gICAgc3BlY2lhbENoYXJhY3RlcnM6IGZhbHNlXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGR5bmFtaWNGb3JtU2VydmljZTogS29hbGFEeW5hbWljRm9ybVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKCkgPT4gdGhpcy5mb3JtKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSkge1xuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ2Zvcm1EYXRhJywgdGhpcy5mYi5hcnJheShbXSkpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRyb2xzID0gdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIHRoaXMuZm9ybUNvbmZpZz8uZm9yRWFjaCgoY29uZmlnLCBpbmRleENvbmZpZykgPT4ge1xuICAgICAgY29uc3QgbmV3Rm9ybUdyb3VwID0gdGhpcy5uZXdDb250cm9sKGNvbmZpZyk7XG4gICAgICBpZiAoY29uZmlnLmFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpLnNldEFzeW5jVmFsaWRhdG9ycyhjb25maWcuYXN5bmNWYWxpZGF0b3JzKTtcbiAgICAgIH1cbiAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0pIHtcbiAgICAgICAgY29uc3QgZm9ybUdyb3VwRHluYW1pY0Zvcm1zU3ViamVjdCA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICBmb3JtR3JvdXBEeW5hbWljRm9ybXNTdWJqZWN0LnN1YnNjcmliZShmb3JtR3JvdXBDb25maWcgPT4ge1xuICAgICAgICAgIGlmIChmb3JtR3JvdXBDb25maWcpIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cENvbmZpZy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZm9ybUdyb3VwQ29uZmlnLmZvcm0udmFsaWQgJiYgKGNvbmZpZy52YWx1ZUNoYW5nZXMgfHwgdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5keW5hbWljRm9ybVNlcnZpY2UuZW1pdERhdGEoZm9ybUdyb3VwQ29uZmlnLmZvcm0pO1xuICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcudmFsdWVDaGFuZ2VzIHx8XG4gICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlIHx8XG4gICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0gfHxcbiAgICAgICAgdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXT47XG4gICAgICAgICAgaWYgKGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0KSB7XG4gICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdC5zdWJzY3JpYmUob3B0aW9ucyA9PiBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZS5uZXh0KG9wdGlvbnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKVxuICAgICAgICAgICAgICAgICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgzMDApKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldENvbmZpZ0R5bmFtaWNGb3JtKG5ld0Zvcm1Hcm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KCduYW1lJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnbXVsdGlwbGUnKS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVBdXRvY29tcGxldGVTZWxlY3QobmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZUlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihgIyR7dGhpcy5mb3JtSWR9IGlucHV0I2F1dG9jb21wbGV0ZS0ke25ld0Zvcm1Hcm91cC5nZXQoJ25hbWUnKT8udmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9jb21wbGV0ZUlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZShrb2FsYSh0aGlzLmZvcm1Db25maWcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFycmF5PEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZT4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobmV3Rm9ybUdyb3VwLmdldCgnbmFtZScpLnZhbHVlLCAnbmFtZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKClbMF0/LmF1dG9jb21wbGV0ZURlZmF1bHRWYWx1ZU9uQ2xlYXIgPz8gbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmF1dG9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZVR5cGUgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXT47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkJykudmFsdWUubmV4dCh0aGlzLmF1dG9jb21wbGV0ZUZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuYXV0b2NvbXBsZXRlVHlwZSA9PT0gJ29uRGVtYW5kJyAmJiB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZXIgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVMb2FkaW5nJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hdXRvY29tcGxldGVGaWx0ZXIodmFsdWUpLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy52YWx1ZUNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmF1dG9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudmFsdWVDaGFuZ2VzKChuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLm1hcChpdGVtID0+IGl0ZW0udmFsdWUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlPy52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWx1ZUNoYW5nZXModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRyb2xzLnB1c2gobmV3Rm9ybUdyb3VwKTtcbiAgICAgIGlmIChjb25maWcubW9yZUl0ZW1zQ29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcubW9yZUl0ZW1zTWluSXRlbXMgPiAwKSB7XG4gICAgICAgICAgZm9yIChsZXQgbWluID0gMDsgbWluIDwgY29uZmlnLm1vcmVJdGVtc01pbkl0ZW1zOyBtaW4rKykge1xuICAgICAgICAgICAgaWYgKG1pbiA8PSBjb25maWcubW9yZUl0ZW1zTWF4SXRlbXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRNb3JlSXRlbShpbmRleENvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcubW9yZUl0ZW1zQ29uZmlnLnNldFZhbHVlcykge1xuICAgICAgICAgIGNvbmZpZy5tb3JlSXRlbXNDb25maWdcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWVzXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyB2YWx1ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKChpdGVtVmFsdWUsIGluZGV4VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbHMuY29udHJvbHNbaW5kZXhDb25maWddLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWVbaW5kZXhWYWx1ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZUl0ZW0oaW5kZXhDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzT25GaWVsZHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1tpbmRleENvbmZpZ10uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZVtpbmRleFZhbHVlXS5mb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuc2hvd0ZpZWxkcykge1xuICAgICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5RmllbGRzKHRoaXMuc2hvd0ZpZWxkcywgdGhpcy5mb3JtKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2V0VmFsdWVzKSB7XG4gICAgICB0aGlzLnNldFZhbHVlc09uRmllbGRzKHRoaXMuc2V0VmFsdWVzLCB0aGlzLmZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1ZhbGlkTmV3QXV0b2NvbXBsZXRlT3B0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIGhvdXJzQW5kTWludXRlc0FwcGx5TWFzayhpbmRleDogbnVtYmVyLCBldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2xzPy5jb250cm9sc1tpbmRleF07XG4gICAgY29uc3QgdHlwZSA9IGNvbnRyb2w/LmdldCgndHlwZScpLnZhbHVlIGFzIER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bTtcbiAgICBpZiAodHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmhvdXJzQW5kTWludXRlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sPy5nZXQoJ3ZhbHVlJykudmFsdWU7XG4gICAgICBpZiAoZXZlbnQua2V5ID09ICdCYWNrc3BhY2UnICYmIHZhbHVlLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgdGhpcy5ob3Vyc0FuZE1pbnV0ZXNNYXNrID0gJzAwOjAwMCc7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSAhPSAnQmFja3NwYWNlJyAmJiB2YWx1ZS5sZW5ndGggPj0gNikge1xuICAgICAgICB0aGlzLmhvdXJzQW5kTWludXRlc01hc2sgPSAnMDAwOjAwJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFzc3dvcmRWaWV3KGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9scz8uY29udHJvbHNbaW5kZXhdO1xuICAgIGNvbnN0IGhpZGVQYXNzd29yZCA9ICFjb250cm9sPy5nZXQoJ2hpZGVQYXNzd29yZCcpLnZhbHVlO1xuICAgIGNvbnRyb2w/LmdldCgnaGlkZVBhc3N3b3JkJykuc2V0VmFsdWUoaGlkZVBhc3N3b3JkKTtcbiAgICBjb250cm9sPy5nZXQoJ3R5cGUnKS5zZXRWYWx1ZShoaWRlUGFzc3dvcmQgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5wYXNzd29yZCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRleHRcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZE1vcmVJdGVtKHByb3BJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLmxlbmd0aCA8IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc01heEl0ZW1zJykudmFsdWUpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUucHVzaCh7XG4gICAgICAgIGZvcm06IGZvcm1Hcm91cCxcbiAgICAgICAgZm9ybUNvbmZpZzogdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0ubW9yZUl0ZW1zQ29uZmlnLmZvcm1Db25maWcsXG4gICAgICAgIHNob3dGaWVsZHM6IG5ldyBCZWhhdmlvclN1YmplY3Q8QmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+W10+KFtdKSxcbiAgICAgICAgc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZzogdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0ubW9yZUl0ZW1zQ29uZmlnLnNob3dGaWVsZHNDb25maWdcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zRXhwYW5kZWQnKS5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIC0gMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZvcm1BcnJheU1vcmVJdGVtcyA9IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0Zvcm1Hcm91cCcpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICBmb3JtQXJyYXlNb3JlSXRlbXMucHVzaChmb3JtR3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVNb3JlSXRlbShwcm9wSW5kZXg6IG51bWJlciwgcmVtb3ZlSW5kZXgpIHtcbiAgICBjb25zdCBleHBhbmRlZEl0ZW1JbmRleCA9IHJlbW92ZUluZGV4IC0gMTtcbiAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zRXhwYW5kZWQnKS5zZXRWYWx1ZSgoZXhwYW5kZWRJdGVtSW5kZXggPCAwKSA/IDAgOiBleHBhbmRlZEl0ZW1JbmRleCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgcHVibGljIGNsZWFyQXV0b2NvbXBsZXRlKHByb3BJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ211bHRpcGxlJykudmFsdWUpIHtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0uYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUodGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0uYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheShvcHRpb24/OiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLm5hbWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlT3B0aW9uT25BdXRvY29tcGxldGUocHJvcEluZGV4OiBudW1iZXIsIG9wdGlvbjogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IG9wdGlvbikgYXMgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdO1xuICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUobnVsbCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS52YWx1ZUNoYW5nZXMpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLnZhbHVlQ2hhbmdlcyh2YWx1ZS5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENvbG9yQ2hpcChjb25maWc6IEtvYWxhRHluYW1pY0Zvcm1BdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZ0ludGVyZmFjZSk6IFRoZW1lUGFsZXR0ZSB7XG4gICAgcmV0dXJuIGNvbmZpZy5jb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdXRvY29tcGxldGVPcHRpb25zKHByb3ByaWVkYWRlOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICByZXR1cm4gcHJvcHJpZWRhZGUuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8YW55W10+O1xuICB9XG5cbiAgcHVibGljIGdldER5bmFtaWNGb3JtQ29uZmlnKHByb3ByaWVkYWRlOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICByZXR1cm4gcHJvcHJpZWRhZGUuZ2V0KCdkeW5hbWljRm9ybUNvbmZpZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlPjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYW5kb21TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHJhbmRvbVN0cmluZygyMCwge1xuICAgICAgbG93ZXJjYXNlOiB0cnVlLFxuICAgICAgbnVtYmVyczogdHJ1ZSxcbiAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiBmYWxzZSxcbiAgICAgIHVwcGVyY2FzZTogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdDb250cm9sKGNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlKTogVW50eXBlZEZvcm1Hcm91cCB7XG4gICAgbGV0IHZhbGlkYXRvcnMgPSBjb25maWcuc3luY1ZhbGlkYXRvcnMgPz8gW107XG4gICAgbGV0IHZhbHVlOiBhbnkgPSBjb25maWcudmFsdWUgPz8gJyc7XG4gICAgbGV0IHZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGU6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UgfCBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10gPSAoXG4gICAgICBjb25maWcubXVsdGlwbGUgPyBbXSA6IChjb25maWcuYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKVxuICAgICk7XG5cbiAgICBpZiAoY29uZmlnLnJlcXVpcmVkID09PSB0cnVlKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwibnVtYmVyXCIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbihjb25maWcubWluKSk7XG4gICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwibnVtYmVyXCIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heChjb25maWcubWF4KSk7XG4gICAgaWYgKFxuICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5kYXRlIHx8XG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmRhdGV0aW1lIHx8XG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRpbWVcbiAgICApIHtcbiAgICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcInN0cmluZ1wiKSB7IHZhbGlkYXRvcnMucHVzaChEYXRlTWluVmFsaWRhdG9yKGNvbmZpZy5taW4pKTsgfVxuICAgICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNYXhWYWxpZGF0b3IoY29uZmlnLm1heCkpOyB9XG4gICAgfVxuICAgIGlmIChjb25maWcubWluTGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoY29uZmlnLm1pbkxlbmd0aCkpO1xuICAgIGlmIChjb25maWcubWF4TGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoY29uZmlnLm1heExlbmd0aCkpO1xuXG4gICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY3BmKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goQ3BmVmFsaWRhdG9yKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY25waikge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKENucGpWYWxpZGF0b3IpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5lbWFpbCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlID0gdmFsdWU7XG4gICAgICAgIHZhbHVlID0gKGNvbmZpZy5tdWx0aXBsZSA/IHZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGVbMF0gOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChBdXRvY29tcGxldGVTZWxlY3RlZFZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNoZWNrYm94KSB7XG4gICAgICB2YWx1ZSA9IGNvbmZpZy52YWx1ZSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmhvdXJzQW5kTWludXRlcyAmJlxuICAgICAgdmFsdWUubGVuZ3RoID49IDZcbiAgICApIHtcbiAgICAgIHRoaXMuaG91cnNBbmRNaW51dGVzTWFzayA9ICcwMDA6MDAnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZHluYW1pY0Zvcm1Db25maWcpIHtcbiAgICAgIGNvbnN0IGNsb25lRHluYW1pY0Zvcm1Db25maWcgPSB7fSBhcyBLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlO1xuICAgICAgT2JqZWN0LmFzc2lnbihjbG9uZUR5bmFtaWNGb3JtQ29uZmlnLCBjb25maWcuZHluYW1pY0Zvcm1Db25maWcpO1xuICAgICAgY2xvbmVEeW5hbWljRm9ybUNvbmZpZy5mb3JtID0gY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnLmZvcm07XG4gICAgICBjb25maWcuZHluYW1pY0Zvcm1Db25maWcgPSBjbG9uZUR5bmFtaWNGb3JtQ29uZmlnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuc2hvdyA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbGlkYXRvcnMgPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgc2hvdzogW25ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oY29uZmlnLnNob3cgPz8gdHJ1ZSldLFxuICAgICAgbGFiZWw6IFtjb25maWcubGFiZWxdLFxuICAgICAgbmFtZTogW2NvbmZpZy5uYW1lXSxcbiAgICAgIHR5cGU6IFtjb25maWcudHlwZV0sXG4gICAgICBmaWxlQnV0dG9uQ29uZmlnOiBbe1xuICAgICAgICBpY29uOiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/Lmljb24gPz8gJ2F0dGFjaF9maWxlJyxcbiAgICAgICAgdGV4dDogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy50ZXh0ID8/ICdDbGlxdWUgcGFyYSBhbmV4YXIgYXJxdWl2b3MnLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8uYmFja2dyb3VuZENvbG9yID8/ICd3aGl0ZScsXG4gICAgICAgIGNvbG9yOiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LmNvbG9yID8/ICdibHVlJyxcbiAgICAgICAgYWNjZXB0OiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LmFjY2VwdCA/PyAnKidcbiAgICAgIH1dLFxuICAgICAgZHluYW1pY0Zvcm1Db25maWc6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+KGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyldLFxuICAgICAgZHluYW1pY0Zvcm1Hcm91cDogdGhpcy5mYi5hcnJheShbXSksXG4gICAgICBhcHBlYXJhbmNlOiBbY29uZmlnLmFwcGVhcmFuY2VdLFxuICAgICAgZmxvYXRMYWJlbDogW2NvbmZpZy5mbG9hdExhYmVsXSxcbiAgICAgIHBsYWNlaG9sZGVyOiBbY29uZmlnLnBsYWNlaG9sZGVyXSxcbiAgICAgIGNsYXNzOiBbY29uZmlnLmNsYXNzXSxcbiAgICAgIGZpZWxkQ2xhc3M6IFtjb25maWcuZmllbGRDbGFzc10sXG4gICAgICB0ZXh0SGludDogW2NvbmZpZy50ZXh0SGludF0sXG4gICAgICByZXF1aXJlZDogW2NvbmZpZy5yZXF1aXJlZCA/PyBmYWxzZV0sXG4gICAgICBtaW46IFtjb25maWcubWluID8/IDBdLFxuICAgICAgbWF4OiBbY29uZmlnLm1heCA/PyA5OTk5OTk5OTk5OV0sXG4gICAgICBtaW5MZW5ndGg6IFtjb25maWcubWluTGVuZ3RoID8/IDBdLFxuICAgICAgbWF4TGVuZ3RoOiBbY29uZmlnLm1heExlbmd0aCA/PyAyNTVdLFxuICAgICAgZGlzYWJsZWQ6IFtjb25maWcuZGlzYWJsZWQgPz8gZmFsc2VdLFxuICAgICAgZm9jdXM6IFtjb25maWcuZm9jdXMgPz8gZmFsc2VdLFxuICAgICAgbXVsdGlwbGU6IFtjb25maWcubXVsdGlwbGUgPz8gZmFsc2VdLFxuICAgICAgb3Bjb2VzU2VsZWN0OiBbY29uZmlnLm9wY29lc1NlbGVjdCA/PyBbXV0sXG4gICAgICBoaWRlUGFzc3dvcmQ6IGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0ucGFzc3dvcmQgPyB0cnVlIDogbnVsbCxcbiAgICAgIG1vcmVJdGVtc0J1dHRvbkljb25BZGRsYWJlbDogW2NvbmZpZy5tb3JlSXRlbXNCdXR0b25JY29uQWRkbGFiZWxdLFxuICAgICAgbW9yZUl0ZW1zTWluSXRlbXM6IFtjb25maWcubW9yZUl0ZW1zTWluSXRlbXMgPz8gMF0sXG4gICAgICBtb3JlSXRlbXNNYXhJdGVtczogW2NvbmZpZy5tb3JlSXRlbXNNYXhJdGVtcyA/PyAxMDBdLFxuICAgICAgbW9yZUl0ZW1zSWNvbjogW2NvbmZpZy5tb3JlSXRlbXNJY29uXSxcbiAgICAgIG1vcmVJdGVtc0ljb25Gb250Q29sb3I6IFtjb25maWcubW9yZUl0ZW1zSWNvbkZvbnRDb2xvcl0sXG4gICAgICBtb3JlSXRlbXNJY29uQmFja2dyb3VuZENvbG9yOiBbY29uZmlnLm1vcmVJdGVtc0ljb25CYWNrZ3JvdW5kQ29sb3JdLFxuICAgICAgbW9yZUl0ZW1zRXhwYW5kZWQ6IFsnJ10sXG4gICAgICBtb3JlSXRlbXNDb25maWc6IFtbXV0sXG4gICAgICBtb3JlSXRlbXNGb3JtR3JvdXA6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgYXV0b2NvbXBsZXRlTG9hZGluZzogW25ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpXSxcbiAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnM6IFtjb25maWcuYXV0b2NvbXBsZXRlT3B0aW9uc10sXG4gICAgICBhdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZzogW2NvbmZpZy5hdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZ10sXG4gICAgICBhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQ6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oW10pXSxcbiAgICAgIGF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWU6IFt2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlXSxcbiAgICAgIGF1dG9jb21wbGV0ZUFkZE9wdGlvbjogW2NvbmZpZy5hdXRvY29tcGxldGVBZGRPcHRpb25dLFxuICAgICAgdGV4dExvZ3M6IFtjb25maWc/LnRleHRPYnNdLFxuICAgICAgY3VzdG9tTWFzYzogW2NvbmZpZz8uY3VzdG9tTWFzY10sXG4gICAgICBjdXN0b21NYXNjVGhvdXNhbmRTZXBhcmF0b3I6IFtjb25maWc/LmN1c3RvbU1hc2NUaG91c2FuZFNlcGFyYXRvciA/PyAnJ10sXG4gICAgICBjdXN0b21NYXNjU3VmZml4OiBbY29uZmlnPy5jdXN0b21NYXNjU3VmZml4ID8/ICcnXSxcbiAgICAgIGN1c3RvbU1hc2NQcmVmaXg6IFtjb25maWc/LmN1c3RvbU1hc2NQcmVmaXggPz8gJyddLFxuICAgICAgdmFsdWU6IFt7dmFsdWUsIGRpc2FibGVkOiBjb25maWcuZGlzYWJsZWR9LCB2YWxpZGF0b3JzLCBjb25maWcuYXN5bmNWYWxpZGF0b3JzXVxuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5hdXRvY29tcGxldGVUeXBlID09PSBcIm9uRGVtYW5kXCIpIHtcbiAgICAgIGNvbnN0IGxvYWRlciA9IGZpZWxkLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICAgIGxvYWRlci5uZXh0KHRydWUpO1xuICAgICAgY29uZmlnLmF1dG9jb21wbGV0ZUZpbHRlcignJykuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xuICAgICAgICBmaWVsZC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucyk7XG4gICAgICAgIGxvYWRlci5uZXh0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWVzT25GaWVsZHMoc3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+LCBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgc3ViamVjdC5zdWJzY3JpYmUoaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtLmdldCgnZm9ybURhdGEnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgaXRlbS52YWx1ZXMoKSkge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWVCeVByb3AoZm9ybUFycmF5LCBwcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VWaXNpYmlsaXR5RmllbGRzKHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlW10+LCBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgc3ViamVjdC5waXBlKGRlYm91bmNlVGltZSg1KSkuc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoJ2Zvcm1EYXRhJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGl0ZW0udmFsdWVzKCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleENvbnRyb2wsIGNvbnRyb2xdIG9mIGZvcm1BcnJheS5jb250cm9scy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLmdldCgnbmFtZScpLnZhbHVlID09PSBwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3Nob3cnKS52YWx1ZS5uZXh0KHByb3Auc2hvdyk7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlID0gdGhpcy5mb3JtQ29uZmlnW2luZGV4Q29udHJvbF0gPz8gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKHByb3Auc2hvdykge1xuICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0b3JzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUFycmF5TW9yZUl0ZW1zID0gY29udHJvbC5nZXQoJ2R5bmFtaWNGb3JtR3JvdXAnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgICAgICBmb3JtQXJyYXlNb3JlSXRlbXMucHVzaChjb25maWc/LmR5bmFtaWNGb3JtQ29uZmlnPy5mb3JtKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMgPSBjb25maWcuc3luY1ZhbGlkYXRvcnMgPz8gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY3BmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKENwZlZhbGlkYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jbnBqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKENucGpWYWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZW1haWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnJlcXVpcmVkID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcIm51bWJlclwiKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4oY29uZmlnLm1pbikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1heCAmJiB0eXBlb2YgY29uZmlnLm1heCA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KGNvbmZpZy5tYXgpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZXRpbWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRpbWVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNaW5WYWxpZGF0b3IoY29uZmlnLm1pbikpOyB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNYXhWYWxpZGF0b3IoY29uZmlnLm1heCkpOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5taW5MZW5ndGgpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aChjb25maWcubWluTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWF4TGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoY29uZmlnLm1heExlbmd0aCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXN5bmNWYWxpZGF0b3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0QXN5bmNWYWxpZGF0b3JzKGNvbmZpZy5hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmNsZWFyQ3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5jbGVhckFzeW5jVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmR5bmFtaWNGb3JtKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgICBmb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnZHluYW1pY0Zvcm1Hcm91cCcpO1xuICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwLmFkZENvbnRyb2woJ2R5bmFtaWNGb3JtR3JvdXAnLCB0aGlzLmZiLmFycmF5KFtdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvY29tcGxldGVGaWx0ZXIoYXJyOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10sIHZhbHVlOiBzdHJpbmcpOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10ge1xuICAgIHJldHVybiBhcnIuZmlsdGVyKGZpbHRlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgbGV0IGZpbmQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgICAgICAgICAuZm9yRWFjaChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihwYXJ0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICBmaW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBmaW5kO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWVCeVByb3AoZm9ybUFycmF5OiBVbnR5cGVkRm9ybUFycmF5LCBwcm9wOiBLb2FsYUR5bmFtaWNTZXRWYWx1ZUludGVyZmFjZSkge1xuICAgIGlmIChmb3JtQXJyYXkpIHtcbiAgICAgIGlmIChwcm9wLm5hbWUuaW5kZXhPZignID4gJykgPj0gMCkge1xuICAgICAgICBsZXQgZHluYW1pY0Zvcm1TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT47XG4gICAgICAgIGNvbnN0IGFyclByb3BOYW1lID0gcHJvcC5uYW1lLnNwbGl0KCcgPiAnKTtcbiAgICAgICAgbGV0IGluZGV4UHJvcE5hbWUgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1BcnJheS5jb250cm9scy5maW5kKGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSA9PT0gYXJyUHJvcE5hbWVbaW5kZXhQcm9wTmFtZV0pO1xuICAgICAgICAgIGlmIChpbmRleFByb3BOYW1lID09PSBhcnJQcm9wTmFtZS5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICBkeW5hbWljRm9ybVN1YmplY3QgPSBjb250cm9sLmdldCgnZHluYW1pY0Zvcm1Db25maWcnKS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGb3JtID0gZHluYW1pY0Zvcm1TdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoZHluYW1pY0Zvcm0uZm9ybUNvbmZpZy5maW5kKGZjID0+IGZjLm5hbWUgPT09IGFyclByb3BOYW1lW2FyclByb3BOYW1lLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgICBpZiAoZHluYW1pY0Zvcm0uc2V0VmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgZHluYW1pY0Zvcm0uc2V0VmFsdWVzLm5leHQoa29hbGEoZHluYW1pY0Zvcm0uc2V0VmFsdWVzLmdldFZhbHVlKCkpLmFycmF5PGFueT4oKS5tZXJnZShbe1xuICAgICAgICAgICAgICAgICAgbmFtZTogYXJyUHJvcE5hbWVbYXJyUHJvcE5hbWUubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcC52YWx1ZVxuICAgICAgICAgICAgICAgIH1dKS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljRm9ybS5zZXRWYWx1ZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+KFt7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBhcnJQcm9wTmFtZVthcnJQcm9wTmFtZS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wLnZhbHVlXG4gICAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4UHJvcE5hbWUrKztcbiAgICAgICAgfSB3aGlsZSAoaW5kZXhQcm9wTmFtZSA8IGFyclByb3BOYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIGZvcm1BcnJheS5jb250cm9scy52YWx1ZXMoKSkge1xuICAgICAgICAgIGlmIChjb250cm9sLmdldCgnbmFtZScpLnZhbHVlID09PSBwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKHByb3AudmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRDb25maWdEeW5hbWljRm9ybShuZXdGb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXApIHtcbiAgICBpZiAodGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykudmFsdWU7XG4gICAgICBjb25zdCBjb25maWdzID0gdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY29uZmlnID0+IGNvbmZpZy5uYW1lRmllbGQgPT09IG5ld0Zvcm1Hcm91cC5nZXQoJ25hbWUnKS52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoY29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmZuU2hvdyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyAmJiBjb25maWcuZm5TaG93KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbER5bmFtaWNGb3JtQ29uZmlnID0gdGhpcy5jb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKGNvbnRyb2wgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5maWVsZHNUb1Nob3cuaW5kZXhPZihjb250cm9sLmdldCgnbmFtZScpLnZhbHVlKSA+PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdCA9IGNvbnRyb2xEeW5hbWljRm9ybUNvbmZpZy5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICAgICAgZHluYW1pY0Zvcm1Db25maWdTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheSgxKTtcbiAgICAgICAgICAgIGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdC5uZXh0KGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5zaG93RmllbGRzKFxuICAgICAgICAgICAgdGhpcy5zaG93RmllbGRzLFxuICAgICAgICAgICAgY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgIGNvbmZpZy5mblNob3codmFsdWUpLFxuICAgICAgICAgICAgY29uZmlnLmNsZWFyQ3VycmVudFZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBdXRvY29tcGxldGVTZWxlY3Qoc2VsZWN0ZWRWYWx1ZXM6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSwgdmFsdWU6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UpIHtcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdGVkSXRlbSBvZiBzZWxlY3RlZFZhbHVlcy52YWx1ZXMoKSkge1xuICAgICAgaWYgKHNlbGVjdGVkSXRlbS5uYW1lID09PSB2YWx1ZS5uYW1lKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJwLXJlbGF0aXZlIHctMTAwXCIgW2lkXT1cImZvcm1JZFwiPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9wcmllZGFkZSBvZiBjb250cm9scz8uY29udHJvbHM7IGxldCBpID0gaW5kZXg7XCJcbiAgICAgICBbbmdDbGFzc109XCIocHJvcHJpZWRhZGUuZ2V0KCdzaG93JykudmFsdWUgfCBhc3luYykgPyBwcm9wcmllZGFkZS5nZXQoJ2NsYXNzJykudmFsdWUgOiAnZC1ub25lJ1wiXG4gICAgICAgZm9ybUFycmF5TmFtZT1cImZvcm1EYXRhXCI+XG5cdCAgPGRpdiAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnc2hvdycpLnZhbHVlIHwgYXN5bmNcIj5cblx0ICAgIDxtYXQtZm9ybS1maWVsZFxuXHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC50ZXh0IHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGFzc3dvcmQgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jcGYgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jbnBqIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZGF0ZXRpbWUgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5lbWFpbCB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLm51bWJlciB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnN0cmluZ051bWJlciB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnRpbWUgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5kYXRlIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuaG91cnNBbmRNaW51dGVzIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGhvbmUgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5wZXJjZW50IHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY29sb3IgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5tb250aCB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNvbXBldGVuY2VEYXRlIHx8XG4gICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc3RyaW5nV2l0aEN1c3RvbU1hc2NcIlxuXHRcdCAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0ICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8aW5wdXRcblx0XHQgICAgICBbZHJvcFNwZWNpYWxDaGFyYWN0ZXJzXT1cImZhbHNlXCJcblx0XHQgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHQgICAgICAoa2V5dXApPVwiaG91cnNBbmRNaW51dGVzQXBwbHlNYXNrKGksICRldmVudClcIlxuXHRcdCAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuXHRcdCAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG5cdFx0ICAgICAgW21hc2tdPVwiKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY29tcGV0ZW5jZURhdGUpID8gJzAwLzAwMDAnIDogbnVsbCkgfHxcblx0XHQgICAgICAgICAgICAgICgocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBob25lKSA/ICcoMDApMDAwMC0wMDAwPzAnIDogbnVsbCkgfHxcblx0XHQgICAgICAgICAgICAgICgocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnN0cmluZ051bWJlcikgPyAnMHsnK3Byb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWUrJ30nIDogbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAgICgocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNwZikgPyAnMDAwLjAwMC4wMDAtMDAnIDogbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAgICgocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNucGopID8gJzAwLjAwMC4wMDAvMDAwMC0wMCcgOiBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGVyY2VudCkgPyAncGVyY2VudCcgOiBudWxsKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuaG91cnNBbmRNaW51dGVzKSA/IGhvdXJzQW5kTWludXRlc01hc2sgOiBudWxsKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc3RyaW5nV2l0aEN1c3RvbU1hc2MpID8gcHJvcHJpZWRhZGUuZ2V0KCdjdXN0b21NYXNjJykudmFsdWUgOiBudWxsKVwiXG5cdFx0ICAgICAgW3ZhbGlkYXRpb25dPVwiXG5cdCAgICAgICAgICAgICAgICAgICAgKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jcGYgJiYgcHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3BmSW52YWxpZCkgfHxcblx0ICAgICAgICAgICAgICAgICAgICAocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNucGogJiYgcHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY25wakludmFsaWQpXCJcblx0XHQgICAgICBbdHlwZV09XCIoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jcGYgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNucGogfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBob25lIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5wZXJjZW50XG4gICAgICAgICAgICAgICAgICApKSA/ICd0ZWwnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQubW9udGggP1xuICAgICAgICAgICAgICAgICAgICAnbW9udGgnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZGF0ZSA/XG4gICAgICAgICAgICAgICAgICAgICdkYXRlJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmRhdGV0aW1lID9cbiAgICAgICAgICAgICAgICAgICAgJ2RhdGV0aW1lLWxvY2FsJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmVtYWlsID9cbiAgICAgICAgICAgICAgICAgICAgJ2VtYWlsJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLm51bWJlciA/XG4gICAgICAgICAgICAgICAgICAgICdudW1iZXInIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudGltZSA/XG4gICAgICAgICAgICAgICAgICAgICd0aW1lJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBhc3N3b3JkID9cbiAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNvbG9yID9cbiAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6ICd0ZXh0JykpKSkpKSkpXCJcbiAgICAgICAgICBbbWluXT1cInByb3ByaWVkYWRlLmdldCgnbWluJykudmFsdWVcIlxuICAgICAgICAgIFttYXhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXgnKS52YWx1ZVwiXG4gICAgICAgICAgW21pbkxlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21pbkxlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4TGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFt0aG91c2FuZFNlcGFyYXRvcl09XCJwcm9wcmllZGFkZS5nZXQoJ2N1c3RvbU1hc2NUaG91c2FuZFNlcGFyYXRvcicpLnZhbHVlXCJcbiAgICAgICAgICBbc3VmZml4XT1cInByb3ByaWVkYWRlLmdldCgnY3VzdG9tTWFzY1N1ZmZpeCcpLnZhbHVlXCJcbiAgICAgICAgICBbcHJlZml4XT1cInByb3ByaWVkYWRlLmdldCgnY3VzdG9tTWFzY1ByZWZpeCcpLnZhbHVlXCJcbiAgICAgICAgICBzZXBhcmF0b3JMaW1pdD1cIjBcIlxuICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiZ2V0UmFuZG9tU3RyaW5nKClcIlxuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICBtYXRJbnB1dC8+XG5cdCAgICAgIDxidXR0b25cblx0XHQgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaWV3KGkpXCJcblx0XHQgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnaGlkZVBhc3N3b3JkJykudmFsdWUgIT09IG51bGxcIlxuXHRcdCAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hpZGUgcGFzc3dvcmQnXCJcblx0XHQgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdoaWRlUGFzc3dvcmQnKS52YWx1ZVwiXG5cdFx0ICAgICAgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj57e3Byb3ByaWVkYWRlLmdldCgnaGlkZVBhc3N3b3JkJykudmFsdWUgPyAndmlzaWJpbGl0eV9vZmYnIDogJ3Zpc2liaWxpdHknfX08L21hdC1pY29uPlxuXHQgICAgICA8L2J1dHRvbj5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3BmSW52YWxpZFwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0SW52YWxpZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY25wakludmFsaWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldEludmFsaWRNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuXHQgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmVtYWlsXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRJbnZhbGlkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5cIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbk1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmRhdGVNaW5cIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldERhdGVNaW5NZXNzYWdlKCl9fVxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZSB8IGRhdGU6XCJzaG9ydERhdGVcIn19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmRhdGVNYXhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldERhdGVNYXhNZXNzYWdlKCl9fVxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCdtYXgnKS52YWx1ZSB8IGRhdGU6XCJzaG9ydERhdGVcIn19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yLm1lc3NhZ2V9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG5cdCAgICA8L21hdC1mb3JtLWZpZWxkPlxuXHQgICAgPG1hdC1mb3JtLWZpZWxkXG5cdFx0ICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNvaW5cIlxuXHRcdCAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0ICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8aW5wdXRcblx0XHQgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHQgICAgICBbcmVxdWlyZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdyZXF1aXJlZCcpLnZhbHVlXCJcbiAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgIFttaW5dPVwicHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZVwiXG4gICAgICAgICAgW21heF09XCJwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG4gICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJnZXRSYW5kb21TdHJpbmcoKVwiXG5cdFx0ICAgICAgY3VycmVuY3lNYXNrXG5cdFx0ICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdCAgICAgIG1hdElucHV0XG5cdFx0ICAgICAgdHlwZT1cInRlbFwiLz5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1pblwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWluTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21pbicpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWF4XCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNYXhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWF4JykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5MZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbkxlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heExlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5mbG9hdFwiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcbiAgICAgICAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgW21pbl09XCJwcm9wcmllZGFkZS5nZXQoJ21pbicpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4XT1cInByb3ByaWVkYWRlLmdldCgnbWF4JykudmFsdWVcIlxuICAgICAgICAgIFttaW5MZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZVwiXG4gICAgICAgICAgW21heExlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cImdldFJhbmRvbVN0cmluZygpXCJcbiAgICAgICAgICBjdXJyZW5jeU1hc2tcbiAgICAgICAgICBbb3B0aW9uc109XCJ7cHJlZml4OiAnJ31cIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZWxcIi8+XG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZX19XG4gICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5cIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbk1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cdCAgICA8bWF0LWZvcm0tZmllbGRcblx0XHQgICAgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudmFsdWVMaXN0IHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudGV4dGFyZWFcIlxuXHRcdCAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0ICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAjdGV4dGFyZWFcblx0XHQgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcbiAgICAgICAgICBjZGtUZXh0YXJlYUF1dG9zaXplXG4gICAgICAgICAgI2F1dG9zaXplPVwiY2RrVGV4dGFyZWFBdXRvc2l6ZVwiXG5cdFx0ICAgICAgW2Nka0F1dG9zaXplTWF4Um93c109XCI4XCJcblx0XHQgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIjNcIlxuXHRcdCAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgW21pbkxlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21pbkxlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4TGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIlxuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICBtYXRJbnB1dD5cbiAgICAgICAgPC90ZXh0YXJlYT5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1oaW50IGFsaWduPVwiZW5kXCIgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlXCI+XG4gICAgICAgICAge3t0ZXh0YXJlYS52YWx1ZS5sZW5ndGh9fS97e3Byb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWV9fVxuICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cdFx0ICA8bWF0LWZvcm0tZmllbGRcblx0XHRcdCAgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudGV4dExvZ3NcIlxuXHRcdFx0ICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0XHQgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHRcdCAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0XHQgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0TG9ncycpLnZhbHVlXCIgY2xhc3M9XCJ0ZXh0LW9ic1wiPjwvZGl2PlxuXHQgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAjdGV4dGFyZWFcblx0XHQgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcbiAgICAgICAgICBjZGtUZXh0YXJlYUF1dG9zaXplXG4gICAgICAgICAgI2F1dG9zaXplPVwiY2RrVGV4dGFyZWFBdXRvc2l6ZVwiXG5cdFx0ICAgICAgW2Nka0F1dG9zaXplTWF4Um93c109XCI4XCJcblx0XHQgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIjNcIlxuXHRcdCAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgW21pbkxlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21pbkxlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4TGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIlxuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICBtYXRJbnB1dD5cblx0ICAgICAgPC90ZXh0YXJlYT5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1oaW50IGFsaWduPVwiZW5kXCIgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlXCI+XG4gICAgICAgICAge3t0ZXh0YXJlYS52YWx1ZS5sZW5ndGh9fS97e3Byb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWV9fVxuICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cdCAgICA8bWF0LWZvcm0tZmllbGRcblx0XHQgICAgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc2VsZWN0XCJcblx0XHQgICAgW2FwcGVhcmFuY2VdPVwicHJvcHJpZWRhZGUuZ2V0KCdhcHBlYXJhbmNlJykudmFsdWVcIlxuXHRcdCAgICBbZmxvYXRMYWJlbF09XCJwcm9wcmllZGFkZS5nZXQoJ2Zsb2F0TGFiZWwnKS52YWx1ZVwiXG5cdFx0ICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuXHRcdCAgICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiPlxuXHQgICAgICA8bWF0LWxhYmVsPnt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX08L21hdC1sYWJlbD5cblx0ICAgICAgPG1hdC1zZWxlY3QgW211bHRpcGxlXT1cInByb3ByaWVkYWRlLmdldCgnbXVsdGlwbGUnKS52YWx1ZVwiIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIiBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiPlxuXHQgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb25zIG9mIHByb3ByaWVkYWRlLmdldCgnb3Bjb2VzU2VsZWN0JykudmFsdWVcIiBbdmFsdWVdPVwib3B0aW9ucy52YWx1ZVwiPlxuXHQgICAgICAgICAge3tvcHRpb25zLm5hbWV9fVxuXHQgICAgICAgIDwvbWF0LW9wdGlvbj5cblx0ICAgICAgPC9tYXQtc2VsZWN0PlxuXHQgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWVcIj5cblx0ICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XG5cdFx0ICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWV9fVxuXHQgICAgICA8L21hdC1oaW50PlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICBjbGFzcz1cInNlbGVjdC1tdWx0aXBsZS1uYXRpdmVcIlxuICAgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5zZWxlY3RNdWx0aXBsZU5hdGl2ZVwiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcbiAgICAgICAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICBtYXROYXRpdmVDb250cm9sXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdyZXF1aXJlZCcpLnZhbHVlXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9ucyBvZiBwcm9wcmllZGFkZS5nZXQoJ29wY29lc1NlbGVjdCcpLnZhbHVlXCIgW3ZhbHVlXT1cIm9wdGlvbnMudmFsdWVcIj5cbiAgICAgICAgICAgIHt7b3B0aW9ucy5uYW1lfX1cbiAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZX19XG4gICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5yZXF1aXJlZFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0UmVxdWlyZWRNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yLm1lc3NhZ2V9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXHQgICAgPGRpdlxuXHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jaGVja2JveFwiXG5cdFx0ICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuXHRcdCAgICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiPlxuXHQgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcblx0XHQgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG5cdFx0ICAgICAgdmFsdWU9XCJ0cnVlXCI+XG5cdCAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fVxuXHQgICAgICA8L21hdC1jaGVja2JveD5cblx0ICAgIDwvZGl2PlxuXHRcdCAgPGRpdlxuXHRcdFx0ICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5tb3JlSXRlbXNcIlxuXHRcdFx0ICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHRcdCAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIlxuXHRcdFx0ICBjbGFzcz1cIm1vcmUtaXRlbXMtY29udGVudFwiPlxuXHRcdFx0ICA8ZmllbGRzZXQ+XG5cdFx0XHRcdCAgPGxlZ2VuZD5cblx0XHRcdFx0XHQgIDxrb2FsYS1idXR0b25cblx0XHRcdFx0XHRcdCAgKGNsaWNrKT1cImFkZE1vcmVJdGVtKGkpXCJcblx0XHRcdFx0XHRcdCAgW2Rpc2FibGVkXT1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoID09PSBwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc01heEl0ZW1zJykudmFsdWVcIlxuXHRcdFx0XHRcdFx0ICBbdG9vbHRpcF09XCJwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0J1dHRvbkljb25BZGRsYWJlbCcpLnZhbHVlXCJcblx0XHRcdFx0XHRcdCAgW2JhY2tncm91bmRDb2xvcl09XCJwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0ljb25CYWNrZ3JvdW5kQ29sb3InKS52YWx1ZVwiXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0ljb25Gb250Q29sb3InKS52YWx1ZVwiXG5cdFx0XHRcdFx0XHQgIGNsYXNzPVwiYnRuLWFkZC1tb3JlLWl0ZW1zXCJcblx0XHRcdFx0XHRcdCAgaWNvbj1cImFkZFwiPlxuXHRcdFx0XHRcdCAgPC9rb2FsYS1idXR0b24+XG5cdFx0XHRcdFx0ICB7e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19IChNaW4uOiB7e3Byb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zTWluSXRlbXMnKS52YWx1ZX19XG5cdFx0XHRcdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTcOheC46IHt7cHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNNYXhJdGVtcycpLnZhbHVlfX0pXG5cdFx0XHRcdCAgPC9sZWdlbmQ+XG5cdFx0XHRcdCAgPG1hdC1hY2NvcmRpb24gY2xhc3M9XCJpdGVtc1wiIG11bHRpPlxuXHRcdFx0XHRcdCAgPG1hdC1leHBhbnNpb24tcGFuZWxcblx0XHRcdFx0XHRcdCAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5zbGljZSgpLnJldmVyc2UoKTsgaW5kZXggYXMgaW5kZXhNb3JlSXRlbXNcIlxuXHRcdFx0XHRcdFx0ICBleHBhbmRlZD5cblx0XHRcdFx0XHRcdCAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtcGFuZWwtdGl0bGUgY2xhc3M9XCJ0aXRsZUZvcm1cIj4jXG5cdFx0XHRcdFx0XHRcdFx0XHR7e3Byb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIC0gMSAtIGluZGV4TW9yZUl0ZW1zICsgMX19PC9tYXQtcGFuZWwtdGl0bGU+XG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1wYW5lbC1kZXNjcmlwdGlvbiBjbGFzcz1cInRpdGxlRm9ybVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fVxuXHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uPnt7cHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNJY29uJykudmFsdWV9fTwvbWF0LWljb24+XG5cdFx0XHRcdFx0XHRcdFx0PC9tYXQtcGFuZWwtZGVzY3JpcHRpb24+XG5cdFx0XHRcdFx0XHRcdDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG5cdFx0XHRcdFx0XHQgIDxrb2FsYS1keW5hbWljLWZvcm1cblx0XHRcdFx0XHRcdFx0ICBbc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZ109XCJpdGVtLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWdcIlxuXHRcdFx0XHRcdFx0XHQgIFtzaG93RmllbGRzXT1cIml0ZW0uc2hvd0ZpZWxkc1wiXG5cdFx0XHRcdFx0XHRcdCAgW2Zvcm1Db25maWddPVwiaXRlbS5mb3JtQ29uZmlnXCJcblx0XHRcdFx0XHRcdFx0ICBbZm9ybV09XCJpdGVtLmZvcm1cIlxuICAgICAgICAgICAgICAgIFt0YWJJbmRleFN0YXJ0XT1cInRhYkluZGV4U3RhcnQgKyBpXCI+XG5cdFx0XHRcdFx0XHQgIDwva29hbGEtZHluYW1pYy1mb3JtPlxuXHRcdFx0XHRcdCAgICA8bWF0LWFjdGlvbi1yb3dcblx0XHRcdFx0XHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoID4gcHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNNaW5JdGVtcycpLnZhbHVlXCI+XG5cdFx0XHRcdFx0ICAgICAgPGJ1dHRvblxuXHRcdFx0XHRcdFx0ICAgICAgKGNsaWNrKT1cInJlbW92ZU1vcmVJdGVtKGksIHByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIC0gMSAtIGluZGV4TW9yZUl0ZW1zKVwiXG5cdFx0XHRcdFx0XHQgICAgICBtYXQtaWNvbi1idXR0b24+XG5cdFx0XHRcdFx0XHQgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cblx0XHRcdFx0XHQgICAgICA8L2J1dHRvbj5cblx0XHRcdFx0XHQgICAgPC9tYXQtYWN0aW9uLXJvdz5cblx0XHRcdFx0XHQgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cblx0XHRcdFx0ICA8L21hdC1hY2NvcmRpb24+XG5cdFx0XHQgIDwvZmllbGRzZXQ+XG5cdFx0ICA8L2Rpdj5cblx0XHQgIDxtYXQtZm9ybS1maWVsZFxuXHRcdFx0ICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5hdXRvY29tcGxldGVcIlxuXHRcdFx0ICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0XHQgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHRcdCAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0XHQgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fSB7e3Byb3ByaWVkYWRlLmdldCgnbXVsdGlwbGUnKS52YWx1ZSAmJlxuXHQgICAgICBwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWUgPyAnKicgOiAnJ319PC9tYXQtbGFiZWw+XG5cdFx0XHQgIDxkaXYgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ211bHRpcGxlJykudmFsdWUgZWxzZSBzaW5nbGVcIj5cblx0ICAgICAgICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3Q+XG4gICAgICAgICAgICA8bWF0LWNoaXBcbiAgICAgICAgICAgICAgKHJlbW92ZWQpPVwicmVtb3ZlT3B0aW9uT25BdXRvY29tcGxldGUoaSwgb3B0aW9uKVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcHJpZWRhZGUuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWVcIlxuICAgICAgICAgICAgICBbY29sb3JdPVwiZ2V0Q29sb3JDaGlwKHByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWcnKS52YWx1ZSB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInRydWVcIj5cbiAgICAgICAgICAgICAge3tkaXNwbGF5KG9wdGlvbil9fVxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhcHJvcHJpZWRhZGUuZ2V0KCdkaXNhYmxlZCcpLnZhbHVlXCIgbWF0Q2hpcFJlbW92ZT5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9tYXQtY2hpcD5cblx0ICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBbaWRdPVwiJ2F1dG9jb21wbGV0ZS0nICsgcHJvcHJpZWRhZGUuZ2V0KCduYW1lJykudmFsdWVcIlxuICAgICAgICAgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHQgICAgICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG5cdFx0ICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG5cdFx0ICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIlxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cImdldFJhbmRvbVN0cmluZygpXCJcblx0XHQgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdCAgICAgICAgICBtYXRJbnB1dFxuXHRcdCAgICAgICAgICB0eXBlPVwidGV4dFwiXG5cdFx0ICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIHVtIG91IG1haXMgb3DDp8O1ZXMuLi5cIj5cblx0ICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG5cdCAgICAgIDwvZGl2PlxuXHQgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZT5cblx0XHQgICAgICA8aW5wdXRcblx0XHRcdCAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHRcdCAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiZ2V0UmFuZG9tU3RyaW5nKClcIlxuXHRcdFx0ICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdFx0ICAgICAgbWF0SW5wdXRcblx0XHRcdCAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIHVtYSBvcMOnw6NvLi4uXCJcblx0XHRcdCAgICAgIHR5cGU9XCJ0ZXh0XCI+XG5cdCAgICAgIDwvbmctdGVtcGxhdGU+XG5cdCAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIHwgYXN5bmNcIiBjb2xvcj1cInByaW1hcnlcIlxuXHQgICAgICAgICAgICAgICAgICAgbWF0U3VmZml4PjwvbWF0LXNwaW5uZXI+XG5cdCAgICAgIDxidXR0b25cblx0XHQgICAgICAoY2xpY2spPVwiY2xlYXJBdXRvY29tcGxldGUoaSlcIlxuXHRcdCAgICAgICpuZ0lmPVwiXG5cdCAgICAgICAgICAhKHByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIHwgYXN5bmMpICYmXG5cdCAgICAgICAgICAhcHJvcHJpZWRhZGUuZ2V0KCdkaXNhYmxlZCcpLnZhbHVlXCJcblx0XHQgICAgICBjb2xvcj1cIndhcm5cIlxuXHRcdCAgICAgIG1hdC1pY29uLWJ1dHRvblxuXHRcdCAgICAgIG1hdFN1ZmZpeFxuXHRcdCAgICAgIHR5cGU9XCJidXR0b25cIj5cblx0ICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuXHQgICAgICA8L2J1dHRvbj5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkIHx8IHByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmF1dG9jb21wbGV0ZVNlbGVjdGVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRBdXRvY29tcGxldGVNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuXHQgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yLm1lc3NhZ2V9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG5cdCAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG5cdFx0ICAgICAgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuXHRcdCAgICAgIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5XCIgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlQWRkT3B0aW9uJykudmFsdWUgJiYgaXNWYWxpZE5ld0F1dG9jb21wbGV0ZU9wdGlvbihwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykudmFsdWUpXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ7XG4gICAgICAgICAgICAgIHZhbHVlOiB7aWQ6IDAsIG5hbWU6IHByb3ByaWVkYWRlLmdldCgndmFsdWUnKS52YWx1ZX0sXG4gICAgICAgICAgICAgIG5hbWU6IHByb3ByaWVkYWRlLmdldCgndmFsdWUnKS52YWx1ZVxuICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgQWRkIDxiPnt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLnZhbHVlfX08L2I+Li4uXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXHRcdCAgICAgIDxkaXYgKm5nSWY9XCIoZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyhwcm9wcmllZGFkZSkgfCBhc3luYykgYXMgb3B0aW9uc1wiPlxuXHRcdCAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuXHRcdCAgICAgICAgICB7e29wdGlvbi5uYW1lfX1cblx0XHQgICAgICAgIDwvbWF0LW9wdGlvbj5cblx0XHQgICAgICA8L2Rpdj5cblx0ICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cblx0XHQgIDxkaXYgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZmlsZVwiPlxuXHRcdFx0ICA8a29hbGEtZmlsZS1idXR0b25cblx0XHRcdFx0ICAoZ2V0RmlsZXMpPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKCRldmVudClcIlxuXHRcdFx0XHQgIFthY2NlcHRdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWxlQnV0dG9uQ29uZmlnJykudmFsdWUuYWNjZXB0XCJcblx0XHRcdFx0ICBbYmFja2dyb3VuZENvbG9yXT1cInByb3ByaWVkYWRlLmdldCgnZmlsZUJ1dHRvbkNvbmZpZycpLnZhbHVlLmJhY2tncm91bmRDb2xvclwiXG5cdFx0XHRcdCAgW2NvbG9yXT1cInByb3ByaWVkYWRlLmdldCgnZmlsZUJ1dHRvbkNvbmZpZycpLnZhbHVlLmNvbG9yXCJcblx0XHRcdFx0ICBbZGlzYWJsZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdkaXNhYmxlZCcpLnZhbHVlXCJcblx0XHRcdFx0ICBbaWNvbl09XCJwcm9wcmllZGFkZS5nZXQoJ2ZpbGVCdXR0b25Db25maWcnKS52YWx1ZS5pY29uXCJcblx0XHRcdFx0ICBbbXVsdGlwbGVdPVwicHJvcHJpZWRhZGUuZ2V0KCdtdWx0aXBsZScpLnZhbHVlXCJcblx0XHRcdFx0ICBbdGV4dF09XCJwcm9wcmllZGFkZS5nZXQoJ2ZpbGVCdXR0b25Db25maWcnKS52YWx1ZS50ZXh0XCI+XG5cdFx0XHQgIDwva29hbGEtZmlsZS1idXR0b24+XG5cdFx0ICA8L2Rpdj5cblx0XHQgIDxkaXYgKm5nSWY9XCJcblx0XHQgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmR5bmFtaWNGb3JtICYmXG5cdFx0XHRcdChnZXREeW5hbWljRm9ybUNvbmZpZyhwcm9wcmllZGFkZSkgfCBhc3luYykgYXMgZHluYW1pY0Zvcm1Db25maWdcIj5cblx0XHRcdCAgPGZpZWxkc2V0ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlIGVsc2UgZHluYW1pY0Zvcm1XaXRob3V0TGFiZWxcIj5cblx0XHRcdFx0ICA8bGVnZW5kPnt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX08L2xlZ2VuZD5cblx0XHRcdFx0ICA8a29hbGEtZHluYW1pYy1mb3JtXG5cdFx0XHRcdFx0ICBbZm9ybUNvbmZpZ109XCJkeW5hbWljRm9ybUNvbmZpZy5mb3JtQ29uZmlnXCJcblx0XHRcdFx0XHQgIFtmb3JtXT1cImR5bmFtaWNGb3JtQ29uZmlnLmZvcm1cIlxuXHRcdFx0XHRcdCAgW3NldFZhbHVlc109XCJkeW5hbWljRm9ybUNvbmZpZy5zZXRWYWx1ZXNcIlxuXHRcdFx0XHRcdCAgW3Nob3dGaWVsZHNdPVwiZHluYW1pY0Zvcm1Db25maWcuc2hvd0ZpZWxkc1wiXG4gICAgICAgICAgICBbdGFiSW5kZXhTdGFydF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiPlxuXHRcdFx0XHQgIDwva29hbGEtZHluYW1pYy1mb3JtPlxuXHRcdFx0ICA8L2ZpZWxkc2V0PlxuXHRcdFx0ICA8bmctdGVtcGxhdGUgI2R5bmFtaWNGb3JtV2l0aG91dExhYmVsPlxuXHRcdFx0XHQgIDxrb2FsYS1keW5hbWljLWZvcm1cblx0XHRcdFx0XHQgIFtmb3JtQ29uZmlnXT1cImR5bmFtaWNGb3JtQ29uZmlnLmZvcm1Db25maWdcIlxuXHRcdFx0XHRcdCAgW2Zvcm1dPVwiZHluYW1pY0Zvcm1Db25maWcuZm9ybVwiXG5cdFx0XHRcdFx0ICBbc2V0VmFsdWVzXT1cImR5bmFtaWNGb3JtQ29uZmlnLnNldFZhbHVlc1wiXG5cdFx0XHRcdFx0ICBbc2hvd0ZpZWxkc109XCJkeW5hbWljRm9ybUNvbmZpZy5zaG93RmllbGRzXCJcbiAgICAgICAgICAgIFt0YWJJbmRleFN0YXJ0XT1cInRhYkluZGV4U3RhcnQgKyBpXCI+XG5cdFx0XHRcdCAgPC9rb2FsYS1keW5hbWljLWZvcm0+XG5cdFx0XHQgIDwvbmctdGVtcGxhdGU+XG5cdFx0ICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyYWRpby1idG4tZ3JvdXBcIlxuICAgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5yYWRpb1wiXG4gICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuICAgICAgICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiPlxuICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCI+XG4gICAgICAgICAgPGxhYmVsICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlXCI+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbGFiZWw+XG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b25cbiAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9ucyBvZiBwcm9wcmllZGFkZS5nZXQoJ29wY29lc1NlbGVjdCcpLnZhbHVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25zLnZhbHVlXCI+XG4gICAgICAgICAgICB7e29wdGlvbnMubmFtZX19XG4gICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgIDwvZGl2PlxuXHQgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2J0bi1zdWJtaXRdXCI+PC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=
1
+ import { Validators } from '@angular/forms';
2
+ import { DynamicFormTypeFieldEnum } from './enums/dynamic-form-type-field.enum';
3
+ import { CpfValidator } from './validators/cpf.validator';
4
+ import { CnpjValidator } from './validators/cnpj.validator';
5
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
6
+ import { FormAbstract } from '../form.abstract';
7
+ import { debounceTime } from 'rxjs/operators';
8
+ import { BehaviorSubject } from 'rxjs';
9
+ import { AutocompleteSelectedValidator } from './validators/autocomplete-selected.validator';
10
+ import { delay } from "@koalarx/utils/operators/delay";
11
+ import { koala } from "@koalarx/utils";
12
+ import { DateMinValidator } from "./validators/date-min.validator";
13
+ import { DateMaxValidator } from "./validators/date-max.validator";
14
+ import { KoalaLanguageHelper } from "@koalarx/ui/core";
15
+ import { randomString } from "@koalarx/utils/operators/string";
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "@angular/forms";
18
+ import * as i2 from "./koala.dynamic-form.service";
19
+ import * as i3 from "@angular/common";
20
+ import * as i4 from "ng2-currency-mask";
21
+ import * as i5 from "ngx-mask";
22
+ import * as i6 from "@koalarx/ui/file-button";
23
+ import * as i7 from "@angular/cdk/text-field";
24
+ import * as i8 from "@angular/material/form-field";
25
+ import * as i9 from "@angular/material/input";
26
+ import * as i10 from "@angular/material/select";
27
+ import * as i11 from "@angular/material/core";
28
+ import * as i12 from "@angular/material/radio";
29
+ import * as i13 from "@angular/material/checkbox";
30
+ import * as i14 from "@angular/material/autocomplete";
31
+ import * as i15 from "@angular/material/button";
32
+ import * as i16 from "@angular/material/icon";
33
+ import * as i17 from "@angular/material/expansion";
34
+ import * as i18 from "@angular/material/chips";
35
+ import * as i19 from "@koalarx/ui/button";
36
+ import * as i20 from "@angular/material/progress-spinner";
37
+ import * as i21 from "../directives/koala-autofocus.directive";
38
+ export class DynamicFormComponent extends FormAbstract {
39
+ constructor(fb, dynamicFormService) {
40
+ super(() => this.form);
41
+ this.fb = fb;
42
+ this.dynamicFormService = dynamicFormService;
43
+ this.tabIndexStart = 1;
44
+ this.typeField = DynamicFormTypeFieldEnum;
45
+ this.hoursAndMinutesMask = '00:000';
46
+ this.errorMessage = KoalaLanguageHelper;
47
+ this.formId = randomString(25, {
48
+ lowercase: true,
49
+ uppercase: true,
50
+ numbers: false,
51
+ specialCharacters: false
52
+ });
53
+ }
54
+ ngOnInit() {
55
+ if (!this.form.get('formData')) {
56
+ this.form.addControl('formData', this.fb.array([]));
57
+ }
58
+ this.controls = this.form.get('formData');
59
+ this.formConfig?.forEach((config, indexConfig) => {
60
+ const newFormGroup = this.newControl(config);
61
+ if (config.asyncValidators) {
62
+ newFormGroup.get('value').setAsyncValidators(config.asyncValidators);
63
+ }
64
+ newFormGroup.get('value').updateValueAndValidity();
65
+ if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
66
+ const formGroupDynamicFormsSubject = newFormGroup.get('dynamicFormConfig').value;
67
+ formGroupDynamicFormsSubject.subscribe(formGroupConfig => {
68
+ if (formGroupConfig) {
69
+ formGroupConfig.form.valueChanges.subscribe(() => {
70
+ if (formGroupConfig.form.valid && (config.valueChanges || this.showFieldsMoreItensConfig)) {
71
+ const value = this.dynamicFormService.emitData(formGroupConfig.form);
72
+ newFormGroup.get('value').setValue(value);
73
+ }
74
+ });
75
+ }
76
+ });
77
+ }
78
+ if (config.valueChanges ||
79
+ config.type === DynamicFormTypeFieldEnum.autocomplete ||
80
+ config.type === DynamicFormTypeFieldEnum.dynamicForm ||
81
+ this.showFieldsMoreItensConfig) {
82
+ if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
83
+ const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
84
+ if (autocompleteOptionsSubject) {
85
+ autocompleteOptionsSubject.subscribe(options => newFormGroup.get('autocompleteOptionsFiltered').value.next(options));
86
+ }
87
+ }
88
+ newFormGroup.get('value')
89
+ .valueChanges
90
+ .pipe(debounceTime(300))
91
+ .subscribe(async (value) => {
92
+ await this.setConfigDynamicForm(newFormGroup);
93
+ if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
94
+ if (value && (value.hasOwnProperty('value') &&
95
+ value.hasOwnProperty('name') &&
96
+ Object.keys(value).length === 2) || (Array.isArray(value) &&
97
+ newFormGroup.get('multiple').value)) {
98
+ if (newFormGroup.get('multiple').value) {
99
+ if (Array.isArray(value)) {
100
+ newFormGroup.get('autocompleteSelectedValue').setValue(value);
101
+ newFormGroup.get('value').setValue(value[value.length - 1], { emitEvent: false });
102
+ }
103
+ else {
104
+ if (this.validateAutocompleteSelect(newFormGroup.get('autocompleteSelectedValue').value, value)) {
105
+ newFormGroup.get('autocompleteSelectedValue').value.push(value);
106
+ }
107
+ }
108
+ const autocompleteInput = document.querySelector(`#${this.formId} input#autocomplete-${newFormGroup.get('name')?.value}`);
109
+ if (autocompleteInput) {
110
+ autocompleteInput.value = '';
111
+ }
112
+ }
113
+ else {
114
+ newFormGroup.get('autocompleteSelectedValue').setValue(value);
115
+ }
116
+ }
117
+ else if (!newFormGroup.get('multiple').value) {
118
+ newFormGroup.get('autocompleteSelectedValue').setValue(koala(this.formConfig)
119
+ .array()
120
+ .filter(newFormGroup.get('name').value, 'name')
121
+ .getValue()[0]?.autocompleteDefaultValueOnClear ?? null);
122
+ }
123
+ if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
124
+ if (config.autocompleteType === 'all') {
125
+ const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
126
+ newFormGroup.get('autocompleteOptionsFiltered').value.next(this.autocompleteFilter(autocompleteOptionsSubject.value, value));
127
+ }
128
+ else if (config.autocompleteType === 'onDemand' && typeof value !== "object") {
129
+ const loader = newFormGroup.get('autocompleteLoading').value;
130
+ loader.next(true);
131
+ config.autocompleteFilter(value).subscribe(options => {
132
+ newFormGroup.get('autocompleteOptionsFiltered').value.next(options);
133
+ loader.next(false);
134
+ });
135
+ }
136
+ }
137
+ }
138
+ if (config.valueChanges) {
139
+ if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
140
+ config.valueChanges((newFormGroup.get('multiple').value ?
141
+ newFormGroup.get('autocompleteSelectedValue').value.map(item => item.value) :
142
+ newFormGroup.get('autocompleteSelectedValue').value?.value));
143
+ }
144
+ else {
145
+ config.valueChanges(value);
146
+ }
147
+ }
148
+ });
149
+ }
150
+ this.controls.push(newFormGroup);
151
+ if (config.moreItemsConfig) {
152
+ if (config.moreItemsMinItems > 0) {
153
+ for (let min = 0; min < config.moreItemsMinItems; min++) {
154
+ if (min <= config.moreItemsMaxItems) {
155
+ this.addMoreItem(indexConfig);
156
+ }
157
+ }
158
+ }
159
+ if (config.moreItemsConfig.setValues) {
160
+ config.moreItemsConfig
161
+ .setValues
162
+ .subscribe(async (values) => {
163
+ if (values.length > 0) {
164
+ values.forEach((itemValue, indexValue) => {
165
+ if (!this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue]) {
166
+ this.addMoreItem(indexConfig);
167
+ }
168
+ setTimeout(() => {
169
+ this.setValuesOnFields(itemValue, this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue].form);
170
+ }, 300);
171
+ });
172
+ }
173
+ });
174
+ }
175
+ }
176
+ });
177
+ if (this.showFields) {
178
+ this.changeVisibilityFields(this.showFields, this.form);
179
+ }
180
+ if (this.setValues) {
181
+ this.setValuesOnFields(this.setValues, this.form);
182
+ }
183
+ }
184
+ isValidNewAutocompleteOption(value) {
185
+ return !!value && typeof value === 'string';
186
+ }
187
+ hoursAndMinutesApplyMask(index, event) {
188
+ const control = this.controls?.controls[index];
189
+ const type = control?.get('type').value;
190
+ if (type === DynamicFormTypeFieldEnum.hoursAndMinutes) {
191
+ const value = control?.get('value').value;
192
+ if (event.key == 'Backspace' && value.length < 6) {
193
+ this.hoursAndMinutesMask = '00:000';
194
+ }
195
+ else if (event.key != 'Backspace' && value.length >= 6) {
196
+ this.hoursAndMinutesMask = '000:00';
197
+ }
198
+ }
199
+ }
200
+ passwordView(index) {
201
+ const control = this.controls?.controls[index];
202
+ const hidePassword = !control?.get('hidePassword').value;
203
+ control?.get('hidePassword').setValue(hidePassword);
204
+ control?.get('type').setValue(hidePassword ?
205
+ DynamicFormTypeFieldEnum.password :
206
+ DynamicFormTypeFieldEnum.text);
207
+ }
208
+ addMoreItem(propIndex) {
209
+ if (this.controls.controls[propIndex].get('moreItemsConfig').value.length < this.controls.controls[propIndex].get('moreItemsMaxItems').value) {
210
+ const formGroup = this.fb.group({});
211
+ this.controls.controls[propIndex].get('moreItemsConfig').value.push({
212
+ form: formGroup,
213
+ formConfig: this.formConfig[propIndex].moreItemsConfig.formConfig,
214
+ showFields: new BehaviorSubject([]),
215
+ showFieldsMoreItensConfig: this.formConfig[propIndex].moreItemsConfig.showFieldsConfig
216
+ });
217
+ this.controls.controls[propIndex].get('moreItemsExpanded').setValue(this.controls.controls[propIndex].get('moreItemsConfig').value.length - 1);
218
+ const formArrayMoreItems = this.controls.controls[propIndex].get('moreItemsFormGroup');
219
+ formArrayMoreItems.push(formGroup);
220
+ }
221
+ }
222
+ removeMoreItem(propIndex, removeIndex) {
223
+ const expandedItemIndex = removeIndex - 1;
224
+ this.controls.controls[propIndex].get('moreItemsConfig').value.splice(removeIndex, 1);
225
+ setTimeout(() => {
226
+ this.controls.controls[propIndex].get('moreItemsExpanded').setValue((expandedItemIndex < 0) ? 0 : expandedItemIndex);
227
+ }, 50);
228
+ }
229
+ clearAutocomplete(propIndex) {
230
+ if (this.controls.controls[propIndex].get('multiple').value) {
231
+ this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
232
+ this.controls.controls[propIndex].get('value').setValue(null);
233
+ }
234
+ else {
235
+ this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue(this.formConfig[propIndex].autocompleteDefaultValueOnClear ?? null);
236
+ this.controls.controls[propIndex].get('value').setValue(this.formConfig[propIndex].autocompleteDefaultValueOnClear ?? null);
237
+ }
238
+ }
239
+ display(option) {
240
+ return option ? option.name : undefined;
241
+ }
242
+ removeOptionOnAutocomplete(propIndex, option) {
243
+ const value = this.controls.controls[propIndex].get('autocompleteSelectedValue').value.filter(item => item !== option);
244
+ this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue(value);
245
+ if (value.length === 0) {
246
+ this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
247
+ this.controls.controls[propIndex].get('value').setValue(null);
248
+ }
249
+ else if (this.formConfig[propIndex].valueChanges) {
250
+ this.formConfig[propIndex].valueChanges(value.map(item => item.value));
251
+ }
252
+ }
253
+ getColorChip(config) {
254
+ return config.color;
255
+ }
256
+ getAutocompleteOptions(propriedade) {
257
+ return propriedade.get('autocompleteOptionsFiltered').value;
258
+ }
259
+ getDynamicFormConfig(propriedade) {
260
+ return propriedade.get('dynamicFormConfig').value;
261
+ }
262
+ getRandomString() {
263
+ return randomString(20, {
264
+ lowercase: true,
265
+ numbers: true,
266
+ specialCharacters: false,
267
+ uppercase: true
268
+ });
269
+ }
270
+ newControl(config) {
271
+ let validators = config.syncValidators ?? [];
272
+ let value = config.value ?? '';
273
+ let valueSelectedAutocomplete = (config.multiple ? [] : (config.autocompleteDefaultValueOnClear ?? null));
274
+ if (config.required === true)
275
+ validators.push(Validators.required);
276
+ if (config.min && typeof config.min === "number")
277
+ validators.push(Validators.min(config.min));
278
+ if (config.max && typeof config.max === "number")
279
+ validators.push(Validators.max(config.max));
280
+ if (config.type === DynamicFormTypeFieldEnum.date ||
281
+ config.type === DynamicFormTypeFieldEnum.datetime ||
282
+ config.type === DynamicFormTypeFieldEnum.time) {
283
+ if (config.min && typeof config.min === "string") {
284
+ validators.push(DateMinValidator(config.min));
285
+ }
286
+ if (config.max && typeof config.max === "string") {
287
+ validators.push(DateMaxValidator(config.max));
288
+ }
289
+ }
290
+ if (config.minLength)
291
+ validators.push(Validators.minLength(config.minLength));
292
+ if (config.maxLength)
293
+ validators.push(Validators.maxLength(config.maxLength));
294
+ if (config.type === DynamicFormTypeFieldEnum.cpf) {
295
+ validators.push(CpfValidator);
296
+ }
297
+ else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
298
+ validators.push(CnpjValidator);
299
+ }
300
+ else if (config.type === DynamicFormTypeFieldEnum.email) {
301
+ validators.push(Validators.email);
302
+ }
303
+ else if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
304
+ if (value) {
305
+ valueSelectedAutocomplete = value;
306
+ value = (config.multiple ? valueSelectedAutocomplete[0] : value);
307
+ }
308
+ if (config.required === true) {
309
+ validators.push(AutocompleteSelectedValidator);
310
+ }
311
+ }
312
+ else if (config.type === DynamicFormTypeFieldEnum.checkbox) {
313
+ value = config.value ?? false;
314
+ }
315
+ if (config.type === DynamicFormTypeFieldEnum.hoursAndMinutes &&
316
+ value.length >= 6) {
317
+ this.hoursAndMinutesMask = '000:00';
318
+ }
319
+ if (config.dynamicFormConfig) {
320
+ const cloneDynamicFormConfig = {};
321
+ Object.assign(cloneDynamicFormConfig, config.dynamicFormConfig);
322
+ cloneDynamicFormConfig.form = config.dynamicFormConfig.form;
323
+ config.dynamicFormConfig = cloneDynamicFormConfig;
324
+ }
325
+ if (config.show === false) {
326
+ validators = [];
327
+ }
328
+ const field = this.fb.group({
329
+ show: [new BehaviorSubject(config.show ?? true)],
330
+ label: [config.label],
331
+ name: [config.name],
332
+ type: [config.type],
333
+ fileButtonConfig: [{
334
+ icon: config?.fileButtonConfig?.icon ?? 'attach_file',
335
+ text: config?.fileButtonConfig?.text ?? 'Clique para anexar arquivos',
336
+ backgroundColor: config?.fileButtonConfig?.backgroundColor ?? 'white',
337
+ color: config?.fileButtonConfig?.color ?? 'blue',
338
+ accept: config?.fileButtonConfig?.accept ?? '*'
339
+ }],
340
+ dynamicFormConfig: [new BehaviorSubject(config.dynamicFormConfig)],
341
+ dynamicFormGroup: this.fb.array([]),
342
+ appearance: [config.appearance],
343
+ floatLabel: [config.floatLabel],
344
+ placeholder: [config.placeholder],
345
+ class: [config.class],
346
+ fieldClass: [config.fieldClass],
347
+ textHint: [config.textHint],
348
+ required: [config.required ?? false],
349
+ min: [config.min ?? 0],
350
+ max: [config.max ?? 99999999999],
351
+ minLength: [config.minLength ?? 0],
352
+ maxLength: [config.maxLength ?? 255],
353
+ disabled: [config.disabled ?? false],
354
+ focus: [config.focus ?? false],
355
+ multiple: [config.multiple ?? false],
356
+ opcoesSelect: [config.opcoesSelect ?? []],
357
+ hidePassword: config.type === DynamicFormTypeFieldEnum.password ? true : null,
358
+ moreItemsButtonIconAddlabel: [config.moreItemsButtonIconAddlabel],
359
+ moreItemsMinItems: [config.moreItemsMinItems ?? 0],
360
+ moreItemsMaxItems: [config.moreItemsMaxItems ?? 100],
361
+ moreItemsIcon: [config.moreItemsIcon],
362
+ moreItemsIconFontColor: [config.moreItemsIconFontColor],
363
+ moreItemsIconBackgroundColor: [config.moreItemsIconBackgroundColor],
364
+ moreItemsExpanded: [''],
365
+ moreItemsConfig: [[]],
366
+ moreItemsFormGroup: this.fb.array([]),
367
+ autocompleteLoading: [new BehaviorSubject(false)],
368
+ autocompleteOptions: [config.autocompleteOptions],
369
+ autocompleteMultipleConfig: [config.autocompleteMultipleConfig],
370
+ autocompleteOptionsFiltered: [new BehaviorSubject([])],
371
+ autocompleteSelectedValue: [valueSelectedAutocomplete],
372
+ autocompleteAddOption: [config.autocompleteAddOption],
373
+ textLogs: [config?.textObs],
374
+ customMasc: [config?.customMasc],
375
+ customMascThousandSeparator: [config?.customMascThousandSeparator ?? ''],
376
+ customMascSuffix: [config?.customMascSuffix ?? ''],
377
+ customMascPrefix: [config?.customMascPrefix ?? ''],
378
+ value: [{ value, disabled: config.disabled }, validators, config.asyncValidators]
379
+ });
380
+ if (config.autocompleteType === "onDemand") {
381
+ const loader = field.get('autocompleteLoading').value;
382
+ loader.next(true);
383
+ config.autocompleteFilter('').subscribe(options => {
384
+ field.get('autocompleteOptionsFiltered').value.next(options);
385
+ loader.next(false);
386
+ });
387
+ }
388
+ return field;
389
+ }
390
+ setValuesOnFields(subject, form) {
391
+ subject.subscribe(item => {
392
+ if (item) {
393
+ const formArray = form.get('formData');
394
+ for (const prop of item.values()) {
395
+ this.setValueByProp(formArray, prop);
396
+ }
397
+ }
398
+ });
399
+ }
400
+ changeVisibilityFields(subject, form) {
401
+ subject.pipe(debounceTime(5)).subscribe(item => {
402
+ if (item) {
403
+ const formArray = form.get('formData');
404
+ for (const prop of item.values()) {
405
+ for (const [indexControl, control] of formArray.controls.entries()) {
406
+ if (control.get('name').value === prop.name) {
407
+ control.get('show').value.next(prop.show);
408
+ const config = this.formConfig[indexControl] ?? null;
409
+ if (prop.show) {
410
+ let validators = [];
411
+ if (config) {
412
+ if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
413
+ const formArrayMoreItems = control.get('dynamicFormGroup');
414
+ formArrayMoreItems.push(config?.dynamicFormConfig?.form);
415
+ }
416
+ else {
417
+ validators = config.syncValidators ?? [];
418
+ if (config.required === true) {
419
+ validators.push(Validators.required);
420
+ }
421
+ if (config.type === DynamicFormTypeFieldEnum.cpf) {
422
+ validators.push(CpfValidator);
423
+ }
424
+ else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
425
+ validators.push(CnpjValidator);
426
+ }
427
+ else if (config.type === DynamicFormTypeFieldEnum.email) {
428
+ validators.push(Validators.email);
429
+ }
430
+ else if (config.required === true &&
431
+ config.type === DynamicFormTypeFieldEnum.autocomplete) {
432
+ validators.push(AutocompleteSelectedValidator);
433
+ }
434
+ if (config.min && typeof config.min === "number")
435
+ validators.push(Validators.min(config.min));
436
+ if (config.max && typeof config.max === "number")
437
+ validators.push(Validators.max(config.max));
438
+ if (config.type === DynamicFormTypeFieldEnum.date ||
439
+ config.type === DynamicFormTypeFieldEnum.datetime ||
440
+ config.type === DynamicFormTypeFieldEnum.time) {
441
+ if (config.min && typeof config.min === "string") {
442
+ validators.push(DateMinValidator(config.min));
443
+ }
444
+ if (config.max && typeof config.max === "string") {
445
+ validators.push(DateMaxValidator(config.max));
446
+ }
447
+ }
448
+ if (config.minLength)
449
+ validators.push(Validators.minLength(config.minLength));
450
+ if (config.maxLength)
451
+ validators.push(Validators.maxLength(config.maxLength));
452
+ control.get('value').setValidators(validators);
453
+ if (config.asyncValidators) {
454
+ control.get('value').setAsyncValidators(config.asyncValidators);
455
+ }
456
+ }
457
+ control.get('value').updateValueAndValidity();
458
+ if (prop.clearCurrentValue) {
459
+ control.get('value').setValue(null);
460
+ }
461
+ }
462
+ }
463
+ else {
464
+ control.get('value').clearValidators();
465
+ control.get('value').clearAsyncValidators();
466
+ control.setErrors(null);
467
+ control.get('value').setValue(null);
468
+ control.get('value').updateValueAndValidity();
469
+ if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
470
+ const formGroup = control;
471
+ formGroup.removeControl('dynamicFormGroup');
472
+ formGroup.addControl('dynamicFormGroup', this.fb.array([]));
473
+ }
474
+ }
475
+ break;
476
+ }
477
+ }
478
+ }
479
+ }
480
+ });
481
+ }
482
+ autocompleteFilter(arr, value) {
483
+ return arr.filter(filter => {
484
+ if (typeof value === 'string') {
485
+ if (filter) {
486
+ let find = true;
487
+ value.toLowerCase()
488
+ .split(' ')
489
+ .forEach(part => {
490
+ if (filter.name.toLowerCase().indexOf(part) < 0) {
491
+ find = false;
492
+ return false;
493
+ }
494
+ });
495
+ return find;
496
+ }
497
+ }
498
+ else {
499
+ return true;
500
+ }
501
+ });
502
+ }
503
+ setValueByProp(formArray, prop) {
504
+ if (formArray) {
505
+ if (prop.name.indexOf(' > ') >= 0) {
506
+ let dynamicFormSubject;
507
+ const arrPropName = prop.name.split(' > ');
508
+ let indexPropName = 0;
509
+ do {
510
+ const control = formArray.controls.find(control => control.get('name').value === arrPropName[indexPropName]);
511
+ if (indexPropName === arrPropName.length - 2) {
512
+ dynamicFormSubject = control.get('dynamicFormConfig').value;
513
+ const dynamicForm = dynamicFormSubject.getValue();
514
+ if (dynamicForm.formConfig.find(fc => fc.name === arrPropName[arrPropName.length - 1])) {
515
+ if (dynamicForm.setValues) {
516
+ dynamicForm.setValues.next(koala(dynamicForm.setValues.getValue()).array().merge([{
517
+ name: arrPropName[arrPropName.length - 1],
518
+ value: prop.value
519
+ }]).getValue());
520
+ }
521
+ else {
522
+ dynamicForm.setValues = new BehaviorSubject([{
523
+ name: arrPropName[arrPropName.length - 1],
524
+ value: prop.value
525
+ }]);
526
+ }
527
+ }
528
+ }
529
+ indexPropName++;
530
+ } while (indexPropName < arrPropName.length - 1);
531
+ }
532
+ else {
533
+ for (const control of formArray.controls.values()) {
534
+ if (control.get('name').value === prop.name) {
535
+ control.get('value').setValue(prop.value);
536
+ break;
537
+ }
538
+ }
539
+ }
540
+ }
541
+ }
542
+ async setConfigDynamicForm(newFormGroup) {
543
+ if (this.showFieldsMoreItensConfig) {
544
+ const value = newFormGroup.get('value').value;
545
+ const configs = this.showFieldsMoreItensConfig
546
+ .filter(config => config.nameField === newFormGroup.get('name').value)
547
+ .sort(config => {
548
+ if (config.fnShow(value)) {
549
+ return 1;
550
+ }
551
+ return -1;
552
+ });
553
+ for (const config of configs) {
554
+ if (config) {
555
+ if (config.dynamicFormConfig && config.fnShow(value)) {
556
+ const controlDynamicFormConfig = this.controls
557
+ .controls
558
+ .find(control => config.fieldsToShow.indexOf(control.get('name').value) >= 0);
559
+ const dynamicFormConfigSubject = controlDynamicFormConfig.get('dynamicFormConfig').value;
560
+ dynamicFormConfigSubject.next(null);
561
+ await delay(1);
562
+ dynamicFormConfigSubject.next(config.dynamicFormConfig(value));
563
+ }
564
+ this.dynamicFormService.showFields(this.showFields, config.fieldsToShow, config.fnShow(value), config.clearCurrentValue);
565
+ }
566
+ }
567
+ }
568
+ }
569
+ validateAutocompleteSelect(selectedValues, value) {
570
+ let isValid = true;
571
+ for (const selectedItem of selectedValues.values()) {
572
+ if (selectedItem.name === value.name) {
573
+ isValid = false;
574
+ break;
575
+ }
576
+ }
577
+ return isValid;
578
+ }
579
+ }
580
+ DynamicFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DynamicFormComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.KoalaDynamicFormService }], target: i0.ɵɵFactoryTarget.Component });
581
+ DynamicFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DynamicFormComponent, selector: "koala-dynamic-form", inputs: { form: "form", formConfig: "formConfig", showFields: "showFields", showFieldsMoreItensConfig: "showFieldsMoreItensConfig", setValues: "setValues", tabIndexStart: "tabIndexStart" }, usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"form\" class=\"p-relative w-100\" [id]=\"formId\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n [autocomplete]=\"getRandomString()\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [autocomplete]=\"getRandomString()\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [autocomplete]=\"getRandomString()\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n <mat-chip\n (removed)=\"removeOptionOnAutocomplete(i, option)\"\n *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n [removable]=\"true\"\n [selectable]=\"true\">\n {{display(option)}}\n <mat-icon *ngIf=\"!propriedade.get('disabled').value\" matChipRemove>cancel</mat-icon>\n </mat-chip>\n\t <input\n [id]=\"'autocomplete-' + propriedade.get('name').value\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n [autocomplete]=\"getRandomString()\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [autocomplete]=\"getRandomString()\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n <mat-option\n *ngIf=\"propriedade.get('autocompleteAddOption').value && isValidNewAutocompleteOption(propriedade.get('value').value)\"\n [value]=\"{\n value: {id: 0, name: propriedade.get('value').value},\n name: propriedade.get('value').value\n }\">\n Add <b>{{propriedade.get('value').value}}</b>...\n </mat-option>\n\t\t <div *ngIf=\"(getAutocompleteOptions(propriedade) | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(getDynamicFormConfig(propriedade) | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n", styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:Josefin Sans,sans-serif;font-size:11px;font-weight:700;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.CurrencyMaskDirective, selector: "[currencyMask]", inputs: ["max", "min", "options"] }, { kind: "directive", type: i5.MaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "triggerOnMaskChange"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { kind: "component", type: i6.FileButtonComponent, selector: "koala-file-button", inputs: ["color", "backgroundColor", "icon", "text", "tooltip", "disabled", "multiple", "accept", "setFile", "updateFileList", "autoclear"], outputs: ["getFiles"] }, { kind: "directive", type: i7.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "directive", type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i12.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i12.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i14.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i14.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i15.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i16.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i17.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i17.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i17.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i17.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i17.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i17.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "component", type: i18.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i18.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i18.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i18.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i19.ButtonComponent, selector: "koala-button", inputs: ["color", "backgroundColor", "icon", "text", "tooltip", "disabled", "koalaIcon", "koalaIconSize"] }, { kind: "component", type: i20.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: DynamicFormComponent, selector: "koala-dynamic-form", inputs: ["form", "formConfig", "showFields", "showFieldsMoreItensConfig", "setValues", "tabIndexStart"] }, { kind: "directive", type: i21.KoalaAutofocusDirective, selector: "[koalaAutoFocus]", inputs: ["koalaAutoFocus"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
582
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DynamicFormComponent, decorators: [{
583
+ type: Component,
584
+ args: [{ selector: 'koala-dynamic-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [formGroup]=\"form\" class=\"p-relative w-100\" [id]=\"formId\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n [autocomplete]=\"getRandomString()\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [autocomplete]=\"getRandomString()\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [autocomplete]=\"getRandomString()\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n <mat-chip\n (removed)=\"removeOptionOnAutocomplete(i, option)\"\n *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n [removable]=\"true\"\n [selectable]=\"true\">\n {{display(option)}}\n <mat-icon *ngIf=\"!propriedade.get('disabled').value\" matChipRemove>cancel</mat-icon>\n </mat-chip>\n\t <input\n [id]=\"'autocomplete-' + propriedade.get('name').value\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n [autocomplete]=\"getRandomString()\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [autocomplete]=\"getRandomString()\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n <mat-option\n *ngIf=\"propriedade.get('autocompleteAddOption').value && isValidNewAutocompleteOption(propriedade.get('value').value)\"\n [value]=\"{\n value: {id: 0, name: propriedade.get('value').value},\n name: propriedade.get('value').value\n }\">\n Add <b>{{propriedade.get('value').value}}</b>...\n </mat-option>\n\t\t <div *ngIf=\"(getAutocompleteOptions(propriedade) | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(getDynamicFormConfig(propriedade) | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n", styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:Josefin Sans,sans-serif;font-size:11px;font-weight:700;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"] }]
585
+ }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.KoalaDynamicFormService }]; }, propDecorators: { form: [{
586
+ type: Input
587
+ }], formConfig: [{
588
+ type: Input
589
+ }], showFields: [{
590
+ type: Input
591
+ }], showFieldsMoreItensConfig: [{
592
+ type: Input
593
+ }], setValues: [{
594
+ type: Input
595
+ }], tabIndexStart: [{
596
+ type: Input
597
+ }] } });
598
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMEQsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBRXJILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQVE3RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8s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b0JBQW9CO3FHQUFwQixvQkFBb0IsK1FDL0JqQyxpeDZCQTJrQkEsd2xSRDVpQmEsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0Usb0JBQW9CLG1CQUdiLHVCQUF1QixDQUFDLE1BQU07K0lBR3RDLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtIH0gZnJvbSAnLi9lbnVtcy9keW5hbWljLWZvcm0tdHlwZS1maWVsZC5lbnVtJztcbmltcG9ydCB7IENwZlZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycy9jcGYudmFsaWRhdG9yJztcbmltcG9ydCB7IENucGpWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvY25wai52YWxpZGF0b3InO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQWJzdHJhY3QgfSBmcm9tICcuLi9mb3JtLmFic3RyYWN0JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1zZXQtdmFsdWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL2F1dG9jb21wbGV0ZS1zZWxlY3RlZC52YWxpZGF0b3InO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWF1dG9jb21wbGV0ZS1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1zaG93LWZpZWxkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2VydmljZSB9IGZyb20gJy4va29hbGEuZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybU1vcmVJdGVuc1Nob3dGaWVsZENvbmZpZ0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tbW9yZS1pdGVucy1zaG93LWZpZWxkLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtQXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiQGtvYWxhcngvdXRpbHMvb3BlcmF0b3JzL2RlbGF5XCI7XG5pbXBvcnQgeyBrb2FsYSB9IGZyb20gXCJAa29hbGFyeC91dGlsc1wiO1xuaW1wb3J0IHsgRGF0ZU1pblZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvZGF0ZS1taW4udmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBEYXRlTWF4VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9kYXRlLW1heC52YWxpZGF0b3JcIjtcbmltcG9ydCB7IEtvYWxhTGFuZ3VhZ2VIZWxwZXIgfSBmcm9tIFwiQGtvYWxhcngvdWkvY29yZVwiO1xuaW1wb3J0IHsgcmFuZG9tU3RyaW5nIH0gZnJvbSBcIkBrb2FsYXJ4L3V0aWxzL29wZXJhdG9ycy9zdHJpbmdcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna29hbGEtZHluYW1pYy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICdkeW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZHluYW1pYy1mb3JtLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1Db21wb25lbnQgZXh0ZW5kcyBGb3JtQWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmb3JtQ29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtRmllbGRJbnRlcmZhY2VbXTtcbiAgQElucHV0KCkgc2hvd0ZpZWxkczogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1TaG93RmllbGRJbnRlcmZhY2VbXT47XG4gIEBJbnB1dCgpIHNob3dGaWVsZHNNb3JlSXRlbnNDb25maWc6IEtvYWxhRHluYW1pY0Zvcm1Nb3JlSXRlbnNTaG93RmllbGRDb25maWdJbnRlcmZhY2VbXTtcbiAgQElucHV0KCkgc2V0VmFsdWVzOiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2VbXT47XG4gIEBJbnB1dCgpIHRhYkluZGV4U3RhcnQ6IG51bWJlciA9IDE7XG5cbiAgcHVibGljIGNvbnRyb2xzOiBVbnR5cGVkRm9ybUFycmF5O1xuICBwdWJsaWMgdHlwZUZpZWxkID0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtO1xuICBwdWJsaWMgaG91cnNBbmRNaW51dGVzTWFzayA9ICcwMDowMDAnO1xuICBwdWJsaWMgZXJyb3JNZXNzYWdlID0gS29hbGFMYW5ndWFnZUhlbHBlcjtcbiAgcHVibGljIGZvcm1JZCA9IHJhbmRvbVN0cmluZygyNSwge1xuICAgIGxvd2VyY2FzZTogdHJ1ZSxcbiAgICB1cHBlcmNhc2U6IHRydWUsXG4gICAgbnVtYmVyczogZmFsc2UsXG4gICAgc3BlY2lhbENoYXJhY3RlcnM6IGZhbHNlXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGR5bmFtaWNGb3JtU2VydmljZTogS29hbGFEeW5hbWljRm9ybVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKCkgPT4gdGhpcy5mb3JtKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSkge1xuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ2Zvcm1EYXRhJywgdGhpcy5mYi5hcnJheShbXSkpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRyb2xzID0gdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIHRoaXMuZm9ybUNvbmZpZz8uZm9yRWFjaCgoY29uZmlnLCBpbmRleENvbmZpZykgPT4ge1xuICAgICAgY29uc3QgbmV3Rm9ybUdyb3VwID0gdGhpcy5uZXdDb250cm9sKGNvbmZpZyk7XG4gICAgICBpZiAoY29uZmlnLmFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpLnNldEFzeW5jVmFsaWRhdG9ycyhjb25maWcuYXN5bmNWYWxpZGF0b3JzKTtcbiAgICAgIH1cbiAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0pIHtcbiAgICAgICAgY29uc3QgZm9ybUdyb3VwRHluYW1pY0Zvcm1zU3ViamVjdCA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICBmb3JtR3JvdXBEeW5hbWljRm9ybXNTdWJqZWN0LnN1YnNjcmliZShmb3JtR3JvdXBDb25maWcgPT4ge1xuICAgICAgICAgIGlmIChmb3JtR3JvdXBDb25maWcpIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cENvbmZpZy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZm9ybUdyb3VwQ29uZmlnLmZvcm0udmFsaWQgJiYgKGNvbmZpZy52YWx1ZUNoYW5nZXMgfHwgdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5keW5hbWljRm9ybVNlcnZpY2UuZW1pdERhdGEoZm9ybUdyb3VwQ29uZmlnLmZvcm0pO1xuICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcudmFsdWVDaGFuZ2VzIHx8XG4gICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlIHx8XG4gICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0gfHxcbiAgICAgICAgdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXT47XG4gICAgICAgICAgaWYgKGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0KSB7XG4gICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdC5zdWJzY3JpYmUob3B0aW9ucyA9PiBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZS5uZXh0KG9wdGlvbnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKVxuICAgICAgICAgICAgICAgICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgzMDApKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldENvbmZpZ0R5bmFtaWNGb3JtKG5ld0Zvcm1Hcm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KCduYW1lJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnbXVsdGlwbGUnKS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVBdXRvY29tcGxldGVTZWxlY3QobmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZUlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50PihgIyR7dGhpcy5mb3JtSWR9IGlucHV0I2F1dG9jb21wbGV0ZS0ke25ld0Zvcm1Hcm91cC5nZXQoJ25hbWUnKT8udmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9jb21wbGV0ZUlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZShrb2FsYSh0aGlzLmZvcm1Db25maWcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFycmF5PEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZT4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobmV3Rm9ybUdyb3VwLmdldCgnbmFtZScpLnZhbHVlLCAnbmFtZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKClbMF0/LmF1dG9jb21wbGV0ZURlZmF1bHRWYWx1ZU9uQ2xlYXIgPz8gbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmF1dG9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZVR5cGUgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXT47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkJykudmFsdWUubmV4dCh0aGlzLmF1dG9jb21wbGV0ZUZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuYXV0b2NvbXBsZXRlVHlwZSA9PT0gJ29uRGVtYW5kJyAmJiB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZXIgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVMb2FkaW5nJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hdXRvY29tcGxldGVGaWx0ZXIodmFsdWUpLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy52YWx1ZUNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmF1dG9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudmFsdWVDaGFuZ2VzKChuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLm1hcChpdGVtID0+IGl0ZW0udmFsdWUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlPy52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWx1ZUNoYW5nZXModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRyb2xzLnB1c2gobmV3Rm9ybUdyb3VwKTtcbiAgICAgIGlmIChjb25maWcubW9yZUl0ZW1zQ29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcubW9yZUl0ZW1zTWluSXRlbXMgPiAwKSB7XG4gICAgICAgICAgZm9yIChsZXQgbWluID0gMDsgbWluIDwgY29uZmlnLm1vcmVJdGVtc01pbkl0ZW1zOyBtaW4rKykge1xuICAgICAgICAgICAgaWYgKG1pbiA8PSBjb25maWcubW9yZUl0ZW1zTWF4SXRlbXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRNb3JlSXRlbShpbmRleENvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcubW9yZUl0ZW1zQ29uZmlnLnNldFZhbHVlcykge1xuICAgICAgICAgIGNvbmZpZy5tb3JlSXRlbXNDb25maWdcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWVzXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyB2YWx1ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKChpdGVtVmFsdWUsIGluZGV4VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbHMuY29udHJvbHNbaW5kZXhDb25maWddLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWVbaW5kZXhWYWx1ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZUl0ZW0oaW5kZXhDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzT25GaWVsZHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1tpbmRleENvbmZpZ10uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZVtpbmRleFZhbHVlXS5mb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuc2hvd0ZpZWxkcykge1xuICAgICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5RmllbGRzKHRoaXMuc2hvd0ZpZWxkcywgdGhpcy5mb3JtKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2V0VmFsdWVzKSB7XG4gICAgICB0aGlzLnNldFZhbHVlc09uRmllbGRzKHRoaXMuc2V0VmFsdWVzLCB0aGlzLmZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc1ZhbGlkTmV3QXV0b2NvbXBsZXRlT3B0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIGhvdXJzQW5kTWludXRlc0FwcGx5TWFzayhpbmRleDogbnVtYmVyLCBldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2xzPy5jb250cm9sc1tpbmRleF07XG4gICAgY29uc3QgdHlwZSA9IGNvbnRyb2w/LmdldCgndHlwZScpLnZhbHVlIGFzIER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bTtcbiAgICBpZiAodHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmhvdXJzQW5kTWludXRlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sPy5nZXQoJ3ZhbHVlJykudmFsdWU7XG4gICAgICBpZiAoZXZlbnQua2V5ID09ICdCYWNrc3BhY2UnICYmIHZhbHVlLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgdGhpcy5ob3Vyc0FuZE1pbnV0ZXNNYXNrID0gJzAwOjAwMCc7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSAhPSAnQmFja3NwYWNlJyAmJiB2YWx1ZS5sZW5ndGggPj0gNikge1xuICAgICAgICB0aGlzLmhvdXJzQW5kTWludXRlc01hc2sgPSAnMDAwOjAwJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFzc3dvcmRWaWV3KGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9scz8uY29udHJvbHNbaW5kZXhdO1xuICAgIGNvbnN0IGhpZGVQYXNzd29yZCA9ICFjb250cm9sPy5nZXQoJ2hpZGVQYXNzd29yZCcpLnZhbHVlO1xuICAgIGNvbnRyb2w/LmdldCgnaGlkZVBhc3N3b3JkJykuc2V0VmFsdWUoaGlkZVBhc3N3b3JkKTtcbiAgICBjb250cm9sPy5nZXQoJ3R5cGUnKS5zZXRWYWx1ZShoaWRlUGFzc3dvcmQgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5wYXNzd29yZCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRleHRcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZE1vcmVJdGVtKHByb3BJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLmxlbmd0aCA8IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc01heEl0ZW1zJykudmFsdWUpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUucHVzaCh7XG4gICAgICAgIGZvcm06IGZvcm1Hcm91cCxcbiAgICAgICAgZm9ybUNvbmZpZzogdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0ubW9yZUl0ZW1zQ29uZmlnLmZvcm1Db25maWcsXG4gICAgICAgIHNob3dGaWVsZHM6IG5ldyBCZWhhdmlvclN1YmplY3Q8QmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+W10+KFtdKSxcbiAgICAgICAgc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZzogdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0ubW9yZUl0ZW1zQ29uZmlnLnNob3dGaWVsZHNDb25maWdcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zRXhwYW5kZWQnKS5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIC0gMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZvcm1BcnJheU1vcmVJdGVtcyA9IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0Zvcm1Hcm91cCcpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICBmb3JtQXJyYXlNb3JlSXRlbXMucHVzaChmb3JtR3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVNb3JlSXRlbShwcm9wSW5kZXg6IG51bWJlciwgcmVtb3ZlSW5kZXgpIHtcbiAgICBjb25zdCBleHBhbmRlZEl0ZW1JbmRleCA9IHJlbW92ZUluZGV4IC0gMTtcbiAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zRXhwYW5kZWQnKS5zZXRWYWx1ZSgoZXhwYW5kZWRJdGVtSW5kZXggPCAwKSA/IDAgOiBleHBhbmRlZEl0ZW1JbmRleCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgcHVibGljIGNsZWFyQXV0b2NvbXBsZXRlKHByb3BJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ211bHRpcGxlJykudmFsdWUpIHtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0uYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUodGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0uYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheShvcHRpb24/OiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLm5hbWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlT3B0aW9uT25BdXRvY29tcGxldGUocHJvcEluZGV4OiBudW1iZXIsIG9wdGlvbjogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IG9wdGlvbikgYXMgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdO1xuICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUobnVsbCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS52YWx1ZUNoYW5nZXMpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLnZhbHVlQ2hhbmdlcyh2YWx1ZS5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENvbG9yQ2hpcChjb25maWc6IEtvYWxhRHluYW1pY0Zvcm1BdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZ0ludGVyZmFjZSk6IFRoZW1lUGFsZXR0ZSB7XG4gICAgcmV0dXJuIGNvbmZpZy5jb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdXRvY29tcGxldGVPcHRpb25zKHByb3ByaWVkYWRlOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICByZXR1cm4gcHJvcHJpZWRhZGUuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8YW55W10+O1xuICB9XG5cbiAgcHVibGljIGdldER5bmFtaWNGb3JtQ29uZmlnKHByb3ByaWVkYWRlOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICByZXR1cm4gcHJvcHJpZWRhZGUuZ2V0KCdkeW5hbWljRm9ybUNvbmZpZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlPjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYW5kb21TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHJhbmRvbVN0cmluZygyMCwge1xuICAgICAgbG93ZXJjYXNlOiB0cnVlLFxuICAgICAgbnVtYmVyczogdHJ1ZSxcbiAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzOiBmYWxzZSxcbiAgICAgIHVwcGVyY2FzZTogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdDb250cm9sKGNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlKTogVW50eXBlZEZvcm1Hcm91cCB7XG4gICAgbGV0IHZhbGlkYXRvcnMgPSBjb25maWcuc3luY1ZhbGlkYXRvcnMgPz8gW107XG4gICAgbGV0IHZhbHVlOiBhbnkgPSBjb25maWcudmFsdWUgPz8gJyc7XG4gICAgbGV0IHZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGU6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UgfCBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10gPSAoXG4gICAgICBjb25maWcubXVsdGlwbGUgPyBbXSA6IChjb25maWcuYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKVxuICAgICk7XG5cbiAgICBpZiAoY29uZmlnLnJlcXVpcmVkID09PSB0cnVlKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwibnVtYmVyXCIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbihjb25maWcubWluKSk7XG4gICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwibnVtYmVyXCIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heChjb25maWcubWF4KSk7XG4gICAgaWYgKFxuICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5kYXRlIHx8XG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmRhdGV0aW1lIHx8XG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRpbWVcbiAgICApIHtcbiAgICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcInN0cmluZ1wiKSB7IHZhbGlkYXRvcnMucHVzaChEYXRlTWluVmFsaWRhdG9yKGNvbmZpZy5taW4pKTsgfVxuICAgICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNYXhWYWxpZGF0b3IoY29uZmlnLm1heCkpOyB9XG4gICAgfVxuICAgIGlmIChjb25maWcubWluTGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoY29uZmlnLm1pbkxlbmd0aCkpO1xuICAgIGlmIChjb25maWcubWF4TGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoY29uZmlnLm1heExlbmd0aCkpO1xuXG4gICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY3BmKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goQ3BmVmFsaWRhdG9yKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY25waikge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKENucGpWYWxpZGF0b3IpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5lbWFpbCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlID0gdmFsdWU7XG4gICAgICAgIHZhbHVlID0gKGNvbmZpZy5tdWx0aXBsZSA/IHZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGVbMF0gOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChBdXRvY29tcGxldGVTZWxlY3RlZFZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNoZWNrYm94KSB7XG4gICAgICB2YWx1ZSA9IGNvbmZpZy52YWx1ZSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmhvdXJzQW5kTWludXRlcyAmJlxuICAgICAgdmFsdWUubGVuZ3RoID49IDZcbiAgICApIHtcbiAgICAgIHRoaXMuaG91cnNBbmRNaW51dGVzTWFzayA9ICcwMDA6MDAnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZHluYW1pY0Zvcm1Db25maWcpIHtcbiAgICAgIGNvbnN0IGNsb25lRHluYW1pY0Zvcm1Db25maWcgPSB7fSBhcyBLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlO1xuICAgICAgT2JqZWN0LmFzc2lnbihjbG9uZUR5bmFtaWNGb3JtQ29uZmlnLCBjb25maWcuZHluYW1pY0Zvcm1Db25maWcpO1xuICAgICAgY2xvbmVEeW5hbWljRm9ybUNvbmZpZy5mb3JtID0gY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnLmZvcm07XG4gICAgICBjb25maWcuZHluYW1pY0Zvcm1Db25maWcgPSBjbG9uZUR5bmFtaWNGb3JtQ29uZmlnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuc2hvdyA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbGlkYXRvcnMgPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgc2hvdzogW25ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oY29uZmlnLnNob3cgPz8gdHJ1ZSldLFxuICAgICAgbGFiZWw6IFtjb25maWcubGFiZWxdLFxuICAgICAgbmFtZTogW2NvbmZpZy5uYW1lXSxcbiAgICAgIHR5cGU6IFtjb25maWcudHlwZV0sXG4gICAgICBmaWxlQnV0dG9uQ29uZmlnOiBbe1xuICAgICAgICBpY29uOiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/Lmljb24gPz8gJ2F0dGFjaF9maWxlJyxcbiAgICAgICAgdGV4dDogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy50ZXh0ID8/ICdDbGlxdWUgcGFyYSBhbmV4YXIgYXJxdWl2b3MnLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8uYmFja2dyb3VuZENvbG9yID8/ICd3aGl0ZScsXG4gICAgICAgIGNvbG9yOiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LmNvbG9yID8/ICdibHVlJyxcbiAgICAgICAgYWNjZXB0OiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LmFjY2VwdCA/PyAnKidcbiAgICAgIH1dLFxuICAgICAgZHluYW1pY0Zvcm1Db25maWc6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+KGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyldLFxuICAgICAgZHluYW1pY0Zvcm1Hcm91cDogdGhpcy5mYi5hcnJheShbXSksXG4gICAgICBhcHBlYXJhbmNlOiBbY29uZmlnLmFwcGVhcmFuY2VdLFxuICAgICAgZmxvYXRMYWJlbDogW2NvbmZpZy5mbG9hdExhYmVsXSxcbiAgICAgIHBsYWNlaG9sZGVyOiBbY29uZmlnLnBsYWNlaG9sZGVyXSxcbiAgICAgIGNsYXNzOiBbY29uZmlnLmNsYXNzXSxcbiAgICAgIGZpZWxkQ2xhc3M6IFtjb25maWcuZmllbGRDbGFzc10sXG4gICAgICB0ZXh0SGludDogW2NvbmZpZy50ZXh0SGludF0sXG4gICAgICByZXF1aXJlZDogW2NvbmZpZy5yZXF1aXJlZCA/PyBmYWxzZV0sXG4gICAgICBtaW46IFtjb25maWcubWluID8/IDBdLFxuICAgICAgbWF4OiBbY29uZmlnLm1heCA/PyA5OTk5OTk5OTk5OV0sXG4gICAgICBtaW5MZW5ndGg6IFtjb25maWcubWluTGVuZ3RoID8/IDBdLFxuICAgICAgbWF4TGVuZ3RoOiBbY29uZmlnLm1heExlbmd0aCA/PyAyNTVdLFxuICAgICAgZGlzYWJsZWQ6IFtjb25maWcuZGlzYWJsZWQgPz8gZmFsc2VdLFxuICAgICAgZm9jdXM6IFtjb25maWcuZm9jdXMgPz8gZmFsc2VdLFxuICAgICAgbXVsdGlwbGU6IFtjb25maWcubXVsdGlwbGUgPz8gZmFsc2VdLFxuICAgICAgb3Bjb2VzU2VsZWN0OiBbY29uZmlnLm9wY29lc1NlbGVjdCA/PyBbXV0sXG4gICAgICBoaWRlUGFzc3dvcmQ6IGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0ucGFzc3dvcmQgPyB0cnVlIDogbnVsbCxcbiAgICAgIG1vcmVJdGVtc0J1dHRvbkljb25BZGRsYWJlbDogW2NvbmZpZy5tb3JlSXRlbXNCdXR0b25JY29uQWRkbGFiZWxdLFxuICAgICAgbW9yZUl0ZW1zTWluSXRlbXM6IFtjb25maWcubW9yZUl0ZW1zTWluSXRlbXMgPz8gMF0sXG4gICAgICBtb3JlSXRlbXNNYXhJdGVtczogW2NvbmZpZy5tb3JlSXRlbXNNYXhJdGVtcyA/PyAxMDBdLFxuICAgICAgbW9yZUl0ZW1zSWNvbjogW2NvbmZpZy5tb3JlSXRlbXNJY29uXSxcbiAgICAgIG1vcmVJdGVtc0ljb25Gb250Q29sb3I6IFtjb25maWcubW9yZUl0ZW1zSWNvbkZvbnRDb2xvcl0sXG4gICAgICBtb3JlSXRlbXNJY29uQmFja2dyb3VuZENvbG9yOiBbY29uZmlnLm1vcmVJdGVtc0ljb25CYWNrZ3JvdW5kQ29sb3JdLFxuICAgICAgbW9yZUl0ZW1zRXhwYW5kZWQ6IFsnJ10sXG4gICAgICBtb3JlSXRlbXNDb25maWc6IFtbXV0sXG4gICAgICBtb3JlSXRlbXNGb3JtR3JvdXA6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgYXV0b2NvbXBsZXRlTG9hZGluZzogW25ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpXSxcbiAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnM6IFtjb25maWcuYXV0b2NvbXBsZXRlT3B0aW9uc10sXG4gICAgICBhdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZzogW2NvbmZpZy5hdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZ10sXG4gICAgICBhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQ6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oW10pXSxcbiAgICAgIGF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWU6IFt2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlXSxcbiAgICAgIGF1dG9jb21wbGV0ZUFkZE9wdGlvbjogW2NvbmZpZy5hdXRvY29tcGxldGVBZGRPcHRpb25dLFxuICAgICAgdGV4dExvZ3M6IFtjb25maWc/LnRleHRPYnNdLFxuICAgICAgY3VzdG9tTWFzYzogW2NvbmZpZz8uY3VzdG9tTWFzY10sXG4gICAgICBjdXN0b21NYXNjVGhvdXNhbmRTZXBhcmF0b3I6IFtjb25maWc/LmN1c3RvbU1hc2NUaG91c2FuZFNlcGFyYXRvciA/PyAnJ10sXG4gICAgICBjdXN0b21NYXNjU3VmZml4OiBbY29uZmlnPy5jdXN0b21NYXNjU3VmZml4ID8/ICcnXSxcbiAgICAgIGN1c3RvbU1hc2NQcmVmaXg6IFtjb25maWc/LmN1c3RvbU1hc2NQcmVmaXggPz8gJyddLFxuICAgICAgdmFsdWU6IFt7dmFsdWUsIGRpc2FibGVkOiBjb25maWcuZGlzYWJsZWR9LCB2YWxpZGF0b3JzLCBjb25maWcuYXN5bmNWYWxpZGF0b3JzXVxuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5hdXRvY29tcGxldGVUeXBlID09PSBcIm9uRGVtYW5kXCIpIHtcbiAgICAgIGNvbnN0IGxvYWRlciA9IGZpZWxkLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICAgIGxvYWRlci5uZXh0KHRydWUpO1xuICAgICAgY29uZmlnLmF1dG9jb21wbGV0ZUZpbHRlcignJykuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xuICAgICAgICBmaWVsZC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucyk7XG4gICAgICAgIGxvYWRlci5uZXh0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWVzT25GaWVsZHMoc3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+LCBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgc3ViamVjdC5zdWJzY3JpYmUoaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtLmdldCgnZm9ybURhdGEnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgaXRlbS52YWx1ZXMoKSkge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWVCeVByb3AoZm9ybUFycmF5LCBwcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VWaXNpYmlsaXR5RmllbGRzKHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlW10+LCBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgc3ViamVjdC5waXBlKGRlYm91bmNlVGltZSg1KSkuc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoJ2Zvcm1EYXRhJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGl0ZW0udmFsdWVzKCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleENvbnRyb2wsIGNvbnRyb2xdIG9mIGZvcm1BcnJheS5jb250cm9scy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLmdldCgnbmFtZScpLnZhbHVlID09PSBwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3Nob3cnKS52YWx1ZS5uZXh0KHByb3Auc2hvdyk7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlID0gdGhpcy5mb3JtQ29uZmlnW2luZGV4Q29udHJvbF0gPz8gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKHByb3Auc2hvdykge1xuICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0b3JzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUFycmF5TW9yZUl0ZW1zID0gY29udHJvbC5nZXQoJ2R5bmFtaWNGb3JtR3JvdXAnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgICAgICBmb3JtQXJyYXlNb3JlSXRlbXMucHVzaChjb25maWc/LmR5bmFtaWNGb3JtQ29uZmlnPy5mb3JtKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMgPSBjb25maWcuc3luY1ZhbGlkYXRvcnMgPz8gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY3BmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKENwZlZhbGlkYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jbnBqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKENucGpWYWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZW1haWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnJlcXVpcmVkID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcIm51bWJlclwiKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4oY29uZmlnLm1pbikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1heCAmJiB0eXBlb2YgY29uZmlnLm1heCA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KGNvbmZpZy5tYXgpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZXRpbWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRpbWVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNaW5WYWxpZGF0b3IoY29uZmlnLm1pbikpOyB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNYXhWYWxpZGF0b3IoY29uZmlnLm1heCkpOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5taW5MZW5ndGgpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aChjb25maWcubWluTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWF4TGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoY29uZmlnLm1heExlbmd0aCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXN5bmNWYWxpZGF0b3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0QXN5bmNWYWxpZGF0b3JzKGNvbmZpZy5hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmNsZWFyQ3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5jbGVhckFzeW5jVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmR5bmFtaWNGb3JtKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sIGFzIFVudHlwZWRGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgICBmb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnZHluYW1pY0Zvcm1Hcm91cCcpO1xuICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwLmFkZENvbnRyb2woJ2R5bmFtaWNGb3JtR3JvdXAnLCB0aGlzLmZiLmFycmF5KFtdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvY29tcGxldGVGaWx0ZXIoYXJyOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10sIHZhbHVlOiBzdHJpbmcpOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10ge1xuICAgIHJldHVybiBhcnIuZmlsdGVyKGZpbHRlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgbGV0IGZpbmQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgICAgICAgICAuZm9yRWFjaChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihwYXJ0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICBmaW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBmaW5kO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWVCeVByb3AoZm9ybUFycmF5OiBVbnR5cGVkRm9ybUFycmF5LCBwcm9wOiBLb2FsYUR5bmFtaWNTZXRWYWx1ZUludGVyZmFjZSkge1xuICAgIGlmIChmb3JtQXJyYXkpIHtcbiAgICAgIGlmIChwcm9wLm5hbWUuaW5kZXhPZignID4gJykgPj0gMCkge1xuICAgICAgICBsZXQgZHluYW1pY0Zvcm1TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT47XG4gICAgICAgIGNvbnN0IGFyclByb3BOYW1lID0gcHJvcC5uYW1lLnNwbGl0KCcgPiAnKTtcbiAgICAgICAgbGV0IGluZGV4UHJvcE5hbWUgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1BcnJheS5jb250cm9scy5maW5kKGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSA9PT0gYXJyUHJvcE5hbWVbaW5kZXhQcm9wTmFtZV0pO1xuICAgICAgICAgIGlmIChpbmRleFByb3BOYW1lID09PSBhcnJQcm9wTmFtZS5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICBkeW5hbWljRm9ybVN1YmplY3QgPSBjb250cm9sLmdldCgnZHluYW1pY0Zvcm1Db25maWcnKS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGb3JtID0gZHluYW1pY0Zvcm1TdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoZHluYW1pY0Zvcm0uZm9ybUNvbmZpZy5maW5kKGZjID0+IGZjLm5hbWUgPT09IGFyclByb3BOYW1lW2FyclByb3BOYW1lLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgICBpZiAoZHluYW1pY0Zvcm0uc2V0VmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgZHluYW1pY0Zvcm0uc2V0VmFsdWVzLm5leHQoa29hbGEoZHluYW1pY0Zvcm0uc2V0VmFsdWVzLmdldFZhbHVlKCkpLmFycmF5PGFueT4oKS5tZXJnZShbe1xuICAgICAgICAgICAgICAgICAgbmFtZTogYXJyUHJvcE5hbWVbYXJyUHJvcE5hbWUubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcC52YWx1ZVxuICAgICAgICAgICAgICAgIH1dKS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljRm9ybS5zZXRWYWx1ZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+KFt7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBhcnJQcm9wTmFtZVthcnJQcm9wTmFtZS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wLnZhbHVlXG4gICAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4UHJvcE5hbWUrKztcbiAgICAgICAgfSB3aGlsZSAoaW5kZXhQcm9wTmFtZSA8IGFyclByb3BOYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIGZvcm1BcnJheS5jb250cm9scy52YWx1ZXMoKSkge1xuICAgICAgICAgIGlmIChjb250cm9sLmdldCgnbmFtZScpLnZhbHVlID09PSBwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKHByb3AudmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRDb25maWdEeW5hbWljRm9ybShuZXdGb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXApIHtcbiAgICBpZiAodGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykudmFsdWU7XG4gICAgICBjb25zdCBjb25maWdzID0gdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY29uZmlnID0+IGNvbmZpZy5uYW1lRmllbGQgPT09IG5ld0Zvcm1Hcm91cC5nZXQoJ25hbWUnKS52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoY29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmZuU2hvdyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyAmJiBjb25maWcuZm5TaG93KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbER5bmFtaWNGb3JtQ29uZmlnID0gdGhpcy5jb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKGNvbnRyb2wgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5maWVsZHNUb1Nob3cuaW5kZXhPZihjb250cm9sLmdldCgnbmFtZScpLnZhbHVlKSA+PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdCA9IGNvbnRyb2xEeW5hbWljRm9ybUNvbmZpZy5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICAgICAgZHluYW1pY0Zvcm1Db25maWdTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheSgxKTtcbiAgICAgICAgICAgIGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdC5uZXh0KGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5zaG93RmllbGRzKFxuICAgICAgICAgICAgdGhpcy5zaG93RmllbGRzLFxuICAgICAgICAgICAgY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgIGNvbmZpZy5mblNob3codmFsdWUpLFxuICAgICAgICAgICAgY29uZmlnLmNsZWFyQ3VycmVudFZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBdXRvY29tcGxldGVTZWxlY3Qoc2VsZWN0ZWRWYWx1ZXM6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSwgdmFsdWU6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UpIHtcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdGVkSXRlbSBvZiBzZWxlY3RlZFZhbHVlcy52YWx1ZXMoKSkge1xuICAgICAgaWYgKHNlbGVjdGVkSXRlbS5uYW1lID09PSB2YWx1ZS5uYW1lKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJwLXJlbGF0aXZlIHctMTAwXCIgW2lkXT1cImZvcm1JZFwiPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9wcmllZGFkZSBvZiBjb250cm9scz8uY29udHJvbHM7IGxldCBpID0gaW5kZXg7XCJcbiAgICAgICBbbmdDbGFzc109XCIocHJvcHJpZWRhZGUuZ2V0KCdzaG93JykudmFsdWUgfCBhc3luYykgPyBwcm9wcmllZGFkZS5nZXQoJ2NsYXNzJykudmFsdWUgOiAnZC1ub25lJ1wiXG4gICAgICAgZm9ybUFycmF5TmFtZT1cImZvcm1EYXRhXCI+XG5cdCAgPGRpdiAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnc2hvdycpLnZhbHVlIHwgYXN5bmNcIj5cblx0ICAgIDxtYXQtZm9ybS1maWVsZFxuXHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC50ZXh0IHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGFzc3dvcmQgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jcGYgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jbnBqIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZGF0ZXRpbWUgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5lbWFpbCB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLm51bWJlciB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnN0cmluZ051bWJlciB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnRpbWUgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5kYXRlIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuaG91cnNBbmRNaW51dGVzIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGhvbmUgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5wZXJjZW50IHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY29sb3IgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5tb250aCB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNvbXBldGVuY2VEYXRlIHx8XG4gICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc3RyaW5nV2l0aEN1c3RvbU1hc2NcIlxuXHRcdCAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0ICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8aW5wdXRcblx0XHQgICAgICBbZHJvcFNwZWNpYWxDaGFyYWN0ZXJzXT1cImZhbHNlXCJcblx0XHQgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHQgICAgICAoa2V5dXApPVwiaG91cnNBbmRNaW51dGVzQXBwbHlNYXNrKGksICRldmVudClcIlxuXHRcdCAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuXHRcdCAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG5cdFx0ICAgICAgW21hc2tdPVwiKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY29tcGV0ZW5jZURhdGUpID8gJzAwLzAwMDAnIDogbnVsbCkgfHxcblx0XHQgICAgICAgICAgICAgICgocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBob25lKSA/ICcoMDApMDAwMC0wMDAwPzAnIDogbnVsbCkgfHxcblx0XHQgICAgICAgICAgICAgICgocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnN0cmluZ051bWJlcikgPyAnMHsnK3Byb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWUrJ30nIDogbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAgICgocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNwZikgPyAnMDAwLjAwMC4wMDAtMDAnIDogbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAgICgocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNucGopID8gJzAwLjAwMC4wMDAvMDAwMC0wMCcgOiBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGVyY2VudCkgPyAncGVyY2VudCcgOiBudWxsKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuaG91cnNBbmRNaW51dGVzKSA/IGhvdXJzQW5kTWludXRlc01hc2sgOiBudWxsKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc3RyaW5nV2l0aEN1c3RvbU1hc2MpID8gcHJvcHJpZWRhZGUuZ2V0KCdjdXN0b21NYXNjJykudmFsdWUgOiBudWxsKVwiXG5cdFx0ICAgICAgW3ZhbGlkYXRpb25dPVwiXG5cdCAgICAgICAgICAgICAgICAgICAgKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jcGYgJiYgcHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3BmSW52YWxpZCkgfHxcblx0ICAgICAgICAgICAgICAgICAgICAocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNucGogJiYgcHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY25wakludmFsaWQpXCJcblx0XHQgICAgICBbdHlwZV09XCIoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jcGYgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNucGogfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBob25lIHx8XG4gICAgICAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5wZXJjZW50XG4gICAgICAgICAgICAgICAgICApKSA/ICd0ZWwnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQubW9udGggP1xuICAgICAgICAgICAgICAgICAgICAnbW9udGgnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZGF0ZSA/XG4gICAgICAgICAgICAgICAgICAgICdkYXRlJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmRhdGV0aW1lID9cbiAgICAgICAgICAgICAgICAgICAgJ2RhdGV0aW1lLWxvY2FsJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmVtYWlsID9cbiAgICAgICAgICAgICAgICAgICAgJ2VtYWlsJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLm51bWJlciA/XG4gICAgICAgICAgICAgICAgICAgICdudW1iZXInIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudGltZSA/XG4gICAgICAgICAgICAgICAgICAgICd0aW1lJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBhc3N3b3JkID9cbiAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyA6IChcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNvbG9yID9cbiAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6ICd0ZXh0JykpKSkpKSkpXCJcbiAgICAgICAgICBbbWluXT1cInByb3ByaWVkYWRlLmdldCgnbWluJykudmFsdWVcIlxuICAgICAgICAgIFttYXhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXgnKS52YWx1ZVwiXG4gICAgICAgICAgW21pbkxlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21pbkxlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4TGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFt0aG91c2FuZFNlcGFyYXRvcl09XCJwcm9wcmllZGFkZS5nZXQoJ2N1c3RvbU1hc2NUaG91c2FuZFNlcGFyYXRvcicpLnZhbHVlXCJcbiAgICAgICAgICBbc3VmZml4XT1cInByb3ByaWVkYWRlLmdldCgnY3VzdG9tTWFzY1N1ZmZpeCcpLnZhbHVlXCJcbiAgICAgICAgICBbcHJlZml4XT1cInByb3ByaWVkYWRlLmdldCgnY3VzdG9tTWFzY1ByZWZpeCcpLnZhbHVlXCJcbiAgICAgICAgICBzZXBhcmF0b3JMaW1pdD1cIjBcIlxuICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiZ2V0UmFuZG9tU3RyaW5nKClcIlxuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICBtYXRJbnB1dC8+XG5cdCAgICAgIDxidXR0b25cblx0XHQgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaWV3KGkpXCJcblx0XHQgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnaGlkZVBhc3N3b3JkJykudmFsdWUgIT09IG51bGxcIlxuXHRcdCAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hpZGUgcGFzc3dvcmQnXCJcblx0XHQgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdoaWRlUGFzc3dvcmQnKS52YWx1ZVwiXG5cdFx0ICAgICAgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj57e3Byb3ByaWVkYWRlLmdldCgnaGlkZVBhc3N3b3JkJykudmFsdWUgPyAndmlzaWJpbGl0eV9vZmYnIDogJ3Zpc2liaWxpdHknfX08L21hdC1pY29uPlxuXHQgICAgICA8L2J1dHRvbj5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3BmSW52YWxpZFwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0SW52YWxpZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY25wakludmFsaWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldEludmFsaWRNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuXHQgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmVtYWlsXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRJbnZhbGlkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5cIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbk1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmRhdGVNaW5cIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldERhdGVNaW5NZXNzYWdlKCl9fVxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZSB8IGRhdGU6XCJzaG9ydERhdGVcIn19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmRhdGVNYXhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldERhdGVNYXhNZXNzYWdlKCl9fVxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCdtYXgnKS52YWx1ZSB8IGRhdGU6XCJzaG9ydERhdGVcIn19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yLm1lc3NhZ2V9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG5cdCAgICA8L21hdC1mb3JtLWZpZWxkPlxuXHQgICAgPG1hdC1mb3JtLWZpZWxkXG5cdFx0ICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNvaW5cIlxuXHRcdCAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0ICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8aW5wdXRcblx0XHQgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHQgICAgICBbcmVxdWlyZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdyZXF1aXJlZCcpLnZhbHVlXCJcbiAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgIFttaW5dPVwicHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZVwiXG4gICAgICAgICAgW21heF09XCJwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG4gICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJnZXRSYW5kb21TdHJpbmcoKVwiXG5cdFx0ICAgICAgY3VycmVuY3lNYXNrXG5cdFx0ICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdCAgICAgIG1hdElucHV0XG5cdFx0ICAgICAgdHlwZT1cInRlbFwiLz5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1pblwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWluTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21pbicpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWF4XCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNYXhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWF4JykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5MZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbkxlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heExlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5mbG9hdFwiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcbiAgICAgICAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgW21pbl09XCJwcm9wcmllZGFkZS5nZXQoJ21pbicpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4XT1cInByb3ByaWVkYWRlLmdldCgnbWF4JykudmFsdWVcIlxuICAgICAgICAgIFttaW5MZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZVwiXG4gICAgICAgICAgW21heExlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cImdldFJhbmRvbVN0cmluZygpXCJcbiAgICAgICAgICBjdXJyZW5jeU1hc2tcbiAgICAgICAgICBbb3B0aW9uc109XCJ7cHJlZml4OiAnJ31cIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZWxcIi8+XG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZX19XG4gICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5cIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbk1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cdCAgICA8bWF0LWZvcm0tZmllbGRcblx0XHQgICAgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudmFsdWVMaXN0IHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudGV4dGFyZWFcIlxuXHRcdCAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0ICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAjdGV4dGFyZWFcblx0XHQgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcbiAgICAgICAgICBjZGtUZXh0YXJlYUF1dG9zaXplXG4gICAgICAgICAgI2F1dG9zaXplPVwiY2RrVGV4dGFyZWFBdXRvc2l6ZVwiXG5cdFx0ICAgICAgW2Nka0F1dG9zaXplTWF4Um93c109XCI4XCJcblx0XHQgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIjNcIlxuXHRcdCAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgW21pbkxlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21pbkxlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4TGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIlxuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICBtYXRJbnB1dD5cbiAgICAgICAgPC90ZXh0YXJlYT5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1oaW50IGFsaWduPVwiZW5kXCIgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlXCI+XG4gICAgICAgICAge3t0ZXh0YXJlYS52YWx1ZS5sZW5ndGh9fS97e3Byb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWV9fVxuICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cdFx0ICA8bWF0LWZvcm0tZmllbGRcblx0XHRcdCAgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudGV4dExvZ3NcIlxuXHRcdFx0ICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0XHQgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHRcdCAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0XHQgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0TG9ncycpLnZhbHVlXCIgY2xhc3M9XCJ0ZXh0LW9ic1wiPjwvZGl2PlxuXHQgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAjdGV4dGFyZWFcblx0XHQgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcbiAgICAgICAgICBjZGtUZXh0YXJlYUF1dG9zaXplXG4gICAgICAgICAgI2F1dG9zaXplPVwiY2RrVGV4dGFyZWFBdXRvc2l6ZVwiXG5cdFx0ICAgICAgW2Nka0F1dG9zaXplTWF4Um93c109XCI4XCJcblx0XHQgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIjNcIlxuXHRcdCAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgW21pbkxlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21pbkxlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4TGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIlxuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICBtYXRJbnB1dD5cblx0ICAgICAgPC90ZXh0YXJlYT5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1oaW50IGFsaWduPVwiZW5kXCIgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlXCI+XG4gICAgICAgICAge3t0ZXh0YXJlYS52YWx1ZS5sZW5ndGh9fS97e3Byb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWV9fVxuICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cdCAgICA8bWF0LWZvcm0tZmllbGRcblx0XHQgICAgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc2VsZWN0XCJcblx0XHQgICAgW2FwcGVhcmFuY2VdPVwicHJvcHJpZWRhZGUuZ2V0KCdhcHBlYXJhbmNlJykudmFsdWVcIlxuXHRcdCAgICBbZmxvYXRMYWJlbF09XCJwcm9wcmllZGFkZS5nZXQoJ2Zsb2F0TGFiZWwnKS52YWx1ZVwiXG5cdFx0ICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuXHRcdCAgICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiPlxuXHQgICAgICA8bWF0LWxhYmVsPnt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX08L21hdC1sYWJlbD5cblx0ICAgICAgPG1hdC1zZWxlY3QgW211bHRpcGxlXT1cInByb3ByaWVkYWRlLmdldCgnbXVsdGlwbGUnKS52YWx1ZVwiIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIiBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiPlxuXHQgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb25zIG9mIHByb3ByaWVkYWRlLmdldCgnb3Bjb2VzU2VsZWN0JykudmFsdWVcIiBbdmFsdWVdPVwib3B0aW9ucy52YWx1ZVwiPlxuXHQgICAgICAgICAge3tvcHRpb25zLm5hbWV9fVxuXHQgICAgICAgIDwvbWF0LW9wdGlvbj5cblx0ICAgICAgPC9tYXQtc2VsZWN0PlxuXHQgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWVcIj5cblx0ICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XG5cdFx0ICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWV9fVxuXHQgICAgICA8L21hdC1oaW50PlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICBjbGFzcz1cInNlbGVjdC1tdWx0aXBsZS1uYXRpdmVcIlxuICAgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5zZWxlY3RNdWx0aXBsZU5hdGl2ZVwiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcbiAgICAgICAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICBtYXROYXRpdmVDb250cm9sXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdyZXF1aXJlZCcpLnZhbHVlXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9ucyBvZiBwcm9wcmllZGFkZS5nZXQoJ29wY29lc1NlbGVjdCcpLnZhbHVlXCIgW3ZhbHVlXT1cIm9wdGlvbnMudmFsdWVcIj5cbiAgICAgICAgICAgIHt7b3B0aW9ucy5uYW1lfX1cbiAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZX19XG4gICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5yZXF1aXJlZFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0UmVxdWlyZWRNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yLm1lc3NhZ2V9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXHQgICAgPGRpdlxuXHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jaGVja2JveFwiXG5cdFx0ICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuXHRcdCAgICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiPlxuXHQgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcblx0XHQgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG5cdFx0ICAgICAgdmFsdWU9XCJ0cnVlXCI+XG5cdCAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fVxuXHQgICAgICA8L21hdC1jaGVja2JveD5cblx0ICAgIDwvZGl2PlxuXHRcdCAgPGRpdlxuXHRcdFx0ICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5tb3JlSXRlbXNcIlxuXHRcdFx0ICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHRcdCAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIlxuXHRcdFx0ICBjbGFzcz1cIm1vcmUtaXRlbXMtY29udGVudFwiPlxuXHRcdFx0ICA8ZmllbGRzZXQ+XG5cdFx0XHRcdCAgPGxlZ2VuZD5cblx0XHRcdFx0XHQgIDxrb2FsYS1idXR0b25cblx0XHRcdFx0XHRcdCAgKGNsaWNrKT1cImFkZE1vcmVJdGVtKGkpXCJcblx0XHRcdFx0XHRcdCAgW2Rpc2FibGVkXT1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoID09PSBwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc01heEl0ZW1zJykudmFsdWVcIlxuXHRcdFx0XHRcdFx0ICBbdG9vbHRpcF09XCJwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0J1dHRvbkljb25BZGRsYWJlbCcpLnZhbHVlXCJcblx0XHRcdFx0XHRcdCAgW2JhY2tncm91bmRDb2xvcl09XCJwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0ljb25CYWNrZ3JvdW5kQ29sb3InKS52YWx1ZVwiXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0ljb25Gb250Q29sb3InKS52YWx1ZVwiXG5cdFx0XHRcdFx0XHQgIGNsYXNzPVwiYnRuLWFkZC1tb3JlLWl0ZW1zXCJcblx0XHRcdFx0XHRcdCAgaWNvbj1cImFkZFwiPlxuXHRcdFx0XHRcdCAgPC9rb2FsYS1idXR0b24+XG5cdFx0XHRcdFx0ICB7e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19IChNaW4uOiB7e3Byb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zTWluSXRlbXMnKS52YWx1ZX19XG5cdFx0XHRcdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTcOheC46IHt7cHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNNYXhJdGVtcycpLnZhbHVlfX0pXG5cdFx0XHRcdCAgPC9sZWdlbmQ+XG5cdFx0XHRcdCAgPG1hdC1hY2NvcmRpb24gY2xhc3M9XCJpdGVtc1wiIG11bHRpPlxuXHRcdFx0XHRcdCAgPG1hdC1leHBhbnNpb24tcGFuZWxcblx0XHRcdFx0XHRcdCAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5zbGljZSgpLnJldmVyc2UoKTsgaW5kZXggYXMgaW5kZXhNb3JlSXRlbXNcIlxuXHRcdFx0XHRcdFx0ICBleHBhbmRlZD5cblx0XHRcdFx0XHRcdCAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtcGFuZWwtdGl0bGUgY2xhc3M9XCJ0aXRsZUZvcm1cIj4jXG5cdFx0XHRcdFx0XHRcdFx0XHR7e3Byb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIC0gMSAtIGluZGV4TW9yZUl0ZW1zICsgMX19PC9tYXQtcGFuZWwtdGl0bGU+XG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1wYW5lbC1kZXNjcmlwdGlvbiBjbGFzcz1cInRpdGxlRm9ybVwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fVxuXHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uPnt7cHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNJY29uJykudmFsdWV9fTwvbWF0LWljb24+XG5cdFx0XHRcdFx0XHRcdFx0PC9tYXQtcGFuZWwtZGVzY3JpcHRpb24+XG5cdFx0XHRcdFx0XHRcdDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG5cdFx0XHRcdFx0XHQgIDxrb2FsYS1keW5hbWljLWZvcm1cblx0XHRcdFx0XHRcdFx0ICBbc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZ109XCJpdGVtLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWdcIlxuXHRcdFx0XHRcdFx0XHQgIFtzaG93RmllbGRzXT1cIml0ZW0uc2hvd0ZpZWxkc1wiXG5cdFx0XHRcdFx0XHRcdCAgW2Zvcm1Db25maWddPVwiaXRlbS5mb3JtQ29uZmlnXCJcblx0XHRcdFx0XHRcdFx0ICBbZm9ybV09XCJpdGVtLmZvcm1cIlxuICAgICAgICAgICAgICAgIFt0YWJJbmRleFN0YXJ0XT1cInRhYkluZGV4U3RhcnQgKyBpXCI+XG5cdFx0XHRcdFx0XHQgIDwva29hbGEtZHluYW1pYy1mb3JtPlxuXHRcdFx0XHRcdCAgICA8bWF0LWFjdGlvbi1yb3dcblx0XHRcdFx0XHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoID4gcHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNNaW5JdGVtcycpLnZhbHVlXCI+XG5cdFx0XHRcdFx0ICAgICAgPGJ1dHRvblxuXHRcdFx0XHRcdFx0ICAgICAgKGNsaWNrKT1cInJlbW92ZU1vcmVJdGVtKGksIHByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIC0gMSAtIGluZGV4TW9yZUl0ZW1zKVwiXG5cdFx0XHRcdFx0XHQgICAgICBtYXQtaWNvbi1idXR0b24+XG5cdFx0XHRcdFx0XHQgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cblx0XHRcdFx0XHQgICAgICA8L2J1dHRvbj5cblx0XHRcdFx0XHQgICAgPC9tYXQtYWN0aW9uLXJvdz5cblx0XHRcdFx0XHQgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cblx0XHRcdFx0ICA8L21hdC1hY2NvcmRpb24+XG5cdFx0XHQgIDwvZmllbGRzZXQ+XG5cdFx0ICA8L2Rpdj5cblx0XHQgIDxtYXQtZm9ybS1maWVsZFxuXHRcdFx0ICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5hdXRvY29tcGxldGVcIlxuXHRcdFx0ICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0XHQgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHRcdCAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0XHQgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fSB7e3Byb3ByaWVkYWRlLmdldCgnbXVsdGlwbGUnKS52YWx1ZSAmJlxuXHQgICAgICBwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWUgPyAnKicgOiAnJ319PC9tYXQtbGFiZWw+XG5cdFx0XHQgIDxkaXYgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ211bHRpcGxlJykudmFsdWUgZWxzZSBzaW5nbGVcIj5cblx0ICAgICAgICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3Q+XG4gICAgICAgICAgICA8bWF0LWNoaXBcbiAgICAgICAgICAgICAgKHJlbW92ZWQpPVwicmVtb3ZlT3B0aW9uT25BdXRvY29tcGxldGUoaSwgb3B0aW9uKVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcHJpZWRhZGUuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWVcIlxuICAgICAgICAgICAgICBbY29sb3JdPVwiZ2V0Q29sb3JDaGlwKHByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWcnKS52YWx1ZSB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInRydWVcIj5cbiAgICAgICAgICAgICAge3tkaXNwbGF5KG9wdGlvbil9fVxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhcHJvcHJpZWRhZGUuZ2V0KCdkaXNhYmxlZCcpLnZhbHVlXCIgbWF0Q2hpcFJlbW92ZT5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9tYXQtY2hpcD5cblx0ICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBbaWRdPVwiJ2F1dG9jb21wbGV0ZS0nICsgcHJvcHJpZWRhZGUuZ2V0KCduYW1lJykudmFsdWVcIlxuICAgICAgICAgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHQgICAgICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG5cdFx0ICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG5cdFx0ICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIlxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cImdldFJhbmRvbVN0cmluZygpXCJcblx0XHQgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdCAgICAgICAgICBtYXRJbnB1dFxuXHRcdCAgICAgICAgICB0eXBlPVwidGV4dFwiXG5cdFx0ICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIHVtIG91IG1haXMgb3DDp8O1ZXMuLi5cIj5cblx0ICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG5cdCAgICAgIDwvZGl2PlxuXHQgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZT5cblx0XHQgICAgICA8aW5wdXRcblx0XHRcdCAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHRcdCAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiZ2V0UmFuZG9tU3RyaW5nKClcIlxuXHRcdFx0ICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdFx0ICAgICAgbWF0SW5wdXRcblx0XHRcdCAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIHVtYSBvcMOnw6NvLi4uXCJcblx0XHRcdCAgICAgIHR5cGU9XCJ0ZXh0XCI+XG5cdCAgICAgIDwvbmctdGVtcGxhdGU+XG5cdCAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIHwgYXN5bmNcIiBjb2xvcj1cInByaW1hcnlcIlxuXHQgICAgICAgICAgICAgICAgICAgbWF0U3VmZml4PjwvbWF0LXNwaW5uZXI+XG5cdCAgICAgIDxidXR0b25cblx0XHQgICAgICAoY2xpY2spPVwiY2xlYXJBdXRvY29tcGxldGUoaSlcIlxuXHRcdCAgICAgICpuZ0lmPVwiXG5cdCAgICAgICAgICAhKHByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIHwgYXN5bmMpICYmXG5cdCAgICAgICAgICAhcHJvcHJpZWRhZGUuZ2V0KCdkaXNhYmxlZCcpLnZhbHVlXCJcblx0XHQgICAgICBjb2xvcj1cIndhcm5cIlxuXHRcdCAgICAgIG1hdC1pY29uLWJ1dHRvblxuXHRcdCAgICAgIG1hdFN1ZmZpeFxuXHRcdCAgICAgIHR5cGU9XCJidXR0b25cIj5cblx0ICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuXHQgICAgICA8L2J1dHRvbj5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkIHx8IHByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmF1dG9jb21wbGV0ZVNlbGVjdGVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRBdXRvY29tcGxldGVNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuXHQgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yLm1lc3NhZ2V9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG5cdCAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG5cdFx0ICAgICAgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuXHRcdCAgICAgIFtkaXNwbGF5V2l0aF09XCJkaXNwbGF5XCIgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlQWRkT3B0aW9uJykudmFsdWUgJiYgaXNWYWxpZE5ld0F1dG9jb21wbGV0ZU9wdGlvbihwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykudmFsdWUpXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ7XG4gICAgICAgICAgICAgIHZhbHVlOiB7aWQ6IDAsIG5hbWU6IHByb3ByaWVkYWRlLmdldCgndmFsdWUnKS52YWx1ZX0sXG4gICAgICAgICAgICAgIG5hbWU6IHByb3ByaWVkYWRlLmdldCgndmFsdWUnKS52YWx1ZVxuICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgQWRkIDxiPnt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLnZhbHVlfX08L2I+Li4uXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXHRcdCAgICAgIDxkaXYgKm5nSWY9XCIoZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyhwcm9wcmllZGFkZSkgfCBhc3luYykgYXMgb3B0aW9uc1wiPlxuXHRcdCAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuXHRcdCAgICAgICAgICB7e29wdGlvbi5uYW1lfX1cblx0XHQgICAgICAgIDwvbWF0LW9wdGlvbj5cblx0XHQgICAgICA8L2Rpdj5cblx0ICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cblx0XHQgIDxkaXYgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZmlsZVwiPlxuXHRcdFx0ICA8a29hbGEtZmlsZS1idXR0b25cblx0XHRcdFx0ICAoZ2V0RmlsZXMpPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKCRldmVudClcIlxuXHRcdFx0XHQgIFthY2NlcHRdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWxlQnV0dG9uQ29uZmlnJykudmFsdWUuYWNjZXB0XCJcblx0XHRcdFx0ICBbYmFja2dyb3VuZENvbG9yXT1cInByb3ByaWVkYWRlLmdldCgnZmlsZUJ1dHRvbkNvbmZpZycpLnZhbHVlLmJhY2tncm91bmRDb2xvclwiXG5cdFx0XHRcdCAgW2NvbG9yXT1cInByb3ByaWVkYWRlLmdldCgnZmlsZUJ1dHRvbkNvbmZpZycpLnZhbHVlLmNvbG9yXCJcblx0XHRcdFx0ICBbZGlzYWJsZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdkaXNhYmxlZCcpLnZhbHVlXCJcblx0XHRcdFx0ICBbaWNvbl09XCJwcm9wcmllZGFkZS5nZXQoJ2ZpbGVCdXR0b25Db25maWcnKS52YWx1ZS5pY29uXCJcblx0XHRcdFx0ICBbbXVsdGlwbGVdPVwicHJvcHJpZWRhZGUuZ2V0KCdtdWx0aXBsZScpLnZhbHVlXCJcblx0XHRcdFx0ICBbdGV4dF09XCJwcm9wcmllZGFkZS5nZXQoJ2ZpbGVCdXR0b25Db25maWcnKS52YWx1ZS50ZXh0XCI+XG5cdFx0XHQgIDwva29hbGEtZmlsZS1idXR0b24+XG5cdFx0ICA8L2Rpdj5cblx0XHQgIDxkaXYgKm5nSWY9XCJcblx0XHQgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmR5bmFtaWNGb3JtICYmXG5cdFx0XHRcdChnZXREeW5hbWljRm9ybUNvbmZpZyhwcm9wcmllZGFkZSkgfCBhc3luYykgYXMgZHluYW1pY0Zvcm1Db25maWdcIj5cblx0XHRcdCAgPGZpZWxkc2V0ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlIGVsc2UgZHluYW1pY0Zvcm1XaXRob3V0TGFiZWxcIj5cblx0XHRcdFx0ICA8bGVnZW5kPnt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX08L2xlZ2VuZD5cblx0XHRcdFx0ICA8a29hbGEtZHluYW1pYy1mb3JtXG5cdFx0XHRcdFx0ICBbZm9ybUNvbmZpZ109XCJkeW5hbWljRm9ybUNvbmZpZy5mb3JtQ29uZmlnXCJcblx0XHRcdFx0XHQgIFtmb3JtXT1cImR5bmFtaWNGb3JtQ29uZmlnLmZvcm1cIlxuXHRcdFx0XHRcdCAgW3NldFZhbHVlc109XCJkeW5hbWljRm9ybUNvbmZpZy5zZXRWYWx1ZXNcIlxuXHRcdFx0XHRcdCAgW3Nob3dGaWVsZHNdPVwiZHluYW1pY0Zvcm1Db25maWcuc2hvd0ZpZWxkc1wiXG4gICAgICAgICAgICBbdGFiSW5kZXhTdGFydF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiPlxuXHRcdFx0XHQgIDwva29hbGEtZHluYW1pYy1mb3JtPlxuXHRcdFx0ICA8L2ZpZWxkc2V0PlxuXHRcdFx0ICA8bmctdGVtcGxhdGUgI2R5bmFtaWNGb3JtV2l0aG91dExhYmVsPlxuXHRcdFx0XHQgIDxrb2FsYS1keW5hbWljLWZvcm1cblx0XHRcdFx0XHQgIFtmb3JtQ29uZmlnXT1cImR5bmFtaWNGb3JtQ29uZmlnLmZvcm1Db25maWdcIlxuXHRcdFx0XHRcdCAgW2Zvcm1dPVwiZHluYW1pY0Zvcm1Db25maWcuZm9ybVwiXG5cdFx0XHRcdFx0ICBbc2V0VmFsdWVzXT1cImR5bmFtaWNGb3JtQ29uZmlnLnNldFZhbHVlc1wiXG5cdFx0XHRcdFx0ICBbc2hvd0ZpZWxkc109XCJkeW5hbWljRm9ybUNvbmZpZy5zaG93RmllbGRzXCJcbiAgICAgICAgICAgIFt0YWJJbmRleFN0YXJ0XT1cInRhYkluZGV4U3RhcnQgKyBpXCI+XG5cdFx0XHRcdCAgPC9rb2FsYS1keW5hbWljLWZvcm0+XG5cdFx0XHQgIDwvbmctdGVtcGxhdGU+XG5cdFx0ICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJyYWRpby1idG4tZ3JvdXBcIlxuICAgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5yYWRpb1wiXG4gICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuICAgICAgICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiPlxuICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCI+XG4gICAgICAgICAgPGxhYmVsICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlXCI+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbGFiZWw+XG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b25cbiAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9ucyBvZiBwcm9wcmllZGFkZS5nZXQoJ29wY29lc1NlbGVjdCcpLnZhbHVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25zLnZhbHVlXCI+XG4gICAgICAgICAgICB7e29wdGlvbnMubmFtZX19XG4gICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgIDwvZGl2PlxuXHQgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2J0bi1zdWJtaXRdXCI+PC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=