@koalarx/ui 12.7.16 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/alert/{esm2015/index.js → esm2020/index.mjs} +0 -0
  2. package/alert/{esm2015/koalarx-ui-alert.js → esm2020/koalarx-ui-alert.mjs} +0 -0
  3. package/alert/esm2020/lib/dialog-alert.component.mjs +48 -0
  4. package/alert/{esm2015/lib/koala.alert-config.interface.js → esm2020/lib/koala.alert-config.interface.mjs} +0 -0
  5. package/alert/{esm2015/lib/koala.alert.enum.js → esm2020/lib/koala.alert.enum.mjs} +0 -0
  6. package/alert/esm2020/lib/koala.alert.module.mjs +48 -0
  7. package/alert/esm2020/lib/koala.alert.service.mjs +19 -0
  8. package/alert/{esm2015/lib/koala.request-code-to-alert-enum.translate.js → esm2020/lib/koala.request-code-to-alert-enum.translate.mjs} +0 -0
  9. package/alert/fesm2015/koalarx-ui-alert.mjs +141 -0
  10. package/alert/fesm2015/koalarx-ui-alert.mjs.map +1 -0
  11. package/alert/fesm2020/koalarx-ui-alert.mjs +139 -0
  12. package/alert/fesm2020/koalarx-ui-alert.mjs.map +1 -0
  13. package/alert/koalarx-ui-alert.d.ts +1 -0
  14. package/alert/lib/dialog-alert.component.d.ts +3 -0
  15. package/alert/lib/koala.alert.module.d.ts +10 -0
  16. package/alert/lib/koala.alert.service.d.ts +3 -0
  17. package/alert/package.json +18 -6
  18. package/button/{esm2015/index.js → esm2020/index.mjs} +0 -0
  19. package/button/{esm2015/koalarx-ui-button.js → esm2020/koalarx-ui-button.mjs} +0 -0
  20. package/button/esm2020/lib/button.component.mjs +44 -0
  21. package/button/esm2020/lib/koala.button.module.mjs +42 -0
  22. package/button/fesm2015/koalarx-ui-button.mjs +90 -0
  23. package/button/fesm2015/koalarx-ui-button.mjs.map +1 -0
  24. package/button/fesm2020/koalarx-ui-button.mjs +90 -0
  25. package/button/fesm2020/koalarx-ui-button.mjs.map +1 -0
  26. package/button/koalarx-ui-button.d.ts +1 -0
  27. package/button/lib/button.component.d.ts +6 -1
  28. package/button/lib/koala.button.module.d.ts +10 -0
  29. package/button/package.json +18 -6
  30. package/common/{esm2015/index.js → esm2020/index.mjs} +0 -0
  31. package/common/{esm2015/koalarx-ui-common.js → esm2020/koalarx-ui-common.mjs} +0 -0
  32. package/common/{esm2015/lib/mask-options.js → esm2020/lib/mask-options.mjs} +0 -0
  33. package/common/esm2020/lib/services/csv/koala.csv.service.mjs +36 -0
  34. package/common/{esm2015/lib/services/xlsx/koala.xlsx-config.interface.js → esm2020/lib/services/xlsx/koala.xlsx-config.interface.mjs} +0 -0
  35. package/common/esm2020/lib/services/xlsx/koala.xlsx.service.mjs +73 -0
  36. package/common/fesm2015/{koalarx-ui-common.js → koalarx-ui-common.mjs} +14 -14
  37. package/common/fesm2015/koalarx-ui-common.mjs.map +1 -0
  38. package/common/fesm2020/koalarx-ui-common.mjs +118 -0
  39. package/common/fesm2020/koalarx-ui-common.mjs.map +1 -0
  40. package/common/koalarx-ui-common.d.ts +1 -0
  41. package/common/lib/services/csv/koala.csv.service.d.ts +3 -0
  42. package/common/lib/services/xlsx/koala.xlsx.service.d.ts +3 -0
  43. package/common/package.json +18 -6
  44. package/core/esm2020/index.mjs +35 -0
  45. package/core/esm2020/koalarx-ui-core.mjs +5 -0
  46. package/core/{esm2015/lib/environments/koalaEnvironment.js → esm2020/lib/environments/koalaEnvironment.mjs} +0 -0
  47. package/core/esm2020/lib/loader/loader-bar-page.component.mjs +24 -0
  48. package/core/{esm2015/lib/loader/loader-bar-page.interface.js → esm2020/lib/loader/loader-bar-page.interface.mjs} +0 -0
  49. package/core/{esm2015/lib/loader/loader-config.interface.js → esm2020/lib/loader/loader-config.interface.mjs} +0 -0
  50. package/core/esm2020/lib/ngx-koala.module.mjs +49 -0
  51. package/core/{esm2015/lib/page/koala-language.helper.js → esm2020/lib/page/koala-language.helper.mjs} +0 -0
  52. package/core/{esm2015/lib/page/koala-page-pallet-colors.interface.js → esm2020/lib/page/koala-page-pallet-colors.interface.mjs} +0 -0
  53. package/core/esm2020/lib/page/koala.page.module.mjs +78 -0
  54. package/core/{esm2015/lib/page/koala.user-menu-options.interface.js → esm2020/lib/page/koala.user-menu-options.interface.mjs} +0 -0
  55. package/core/{esm2015/lib/page/notifications/koala.notification.interface.js → esm2020/lib/page/notifications/koala.notification.interface.mjs} +0 -0
  56. package/core/esm2020/lib/page/notifications/notification.component.mjs +47 -0
  57. package/core/esm2020/lib/page/page.component.mjs +404 -0
  58. package/core/esm2020/lib/router/koala.parameter-hash-location-stategy.mjs +18 -0
  59. package/core/esm2020/lib/services/api-requester/factory/koala.response.factory.mjs +44 -0
  60. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.client.error.js → esm2020/lib/services/api-requester/helpers/error/koala.client.error.mjs} +0 -0
  61. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.errors.helper.js → esm2020/lib/services/api-requester/helpers/error/koala.errors.helper.mjs} +0 -0
  62. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.not-found.error.js → esm2020/lib/services/api-requester/helpers/error/koala.not-found.error.mjs} +0 -0
  63. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.success.error.js → esm2020/lib/services/api-requester/helpers/error/koala.success.error.mjs} +0 -0
  64. package/core/{esm2015/lib/services/api-requester/helpers/error/koala.unhautorized.error.js → esm2020/lib/services/api-requester/helpers/error/koala.unhautorized.error.mjs} +0 -0
  65. package/core/{esm2015/lib/services/api-requester/helpers/service/koala.request-header.helper.js → esm2020/lib/services/api-requester/helpers/service/koala.request-header.helper.mjs} +0 -0
  66. package/core/esm2020/lib/services/api-requester/koala.api-requester.base.mjs +63 -0
  67. package/core/esm2020/lib/services/api-requester/koala.api-requester.service.mjs +131 -0
  68. package/core/esm2020/lib/services/loader/koala.loader.service.mjs +34 -0
  69. package/core/{esm2015/lib/services/openid/koala-oauth2-config.interface.js → esm2020/lib/services/openid/koala-oauth2-config.interface.mjs} +0 -0
  70. package/core/esm2020/lib/services/openid/koala.oauth.config.mjs +30 -0
  71. package/core/esm2020/lib/services/openid/koala.oauth2.service.mjs +194 -0
  72. package/core/esm2020/lib/services/request/koala.request.service.mjs +52 -0
  73. package/core/{esm2015/lib/services/token/koala.token.service.js → esm2020/lib/services/token/koala.token.service.mjs} +7 -6
  74. package/core/esm2020/lib/services/token/token.factory.mjs +27 -0
  75. package/core/fesm2015/{koalarx-ui-core.js → koalarx-ui-core.mjs} +249 -191
  76. package/core/fesm2015/koalarx-ui-core.mjs.map +1 -0
  77. package/core/fesm2020/koalarx-ui-core.mjs +1367 -0
  78. package/core/fesm2020/koalarx-ui-core.mjs.map +1 -0
  79. package/core/index.d.ts +1 -0
  80. package/core/koalarx-ui-core.d.ts +1 -2
  81. package/core/lib/loader/loader-bar-page.component.d.ts +5 -1
  82. package/core/lib/ngx-koala.module.d.ts +7 -0
  83. package/core/lib/page/koala.page.module.d.ts +19 -0
  84. package/core/lib/page/notifications/notification.component.d.ts +3 -0
  85. package/core/lib/page/page.component.d.ts +3 -0
  86. package/core/lib/router/koala.parameter-hash-location-stategy.d.ts +3 -0
  87. package/core/lib/services/api-requester/koala.api-requester.service.d.ts +3 -0
  88. package/core/lib/services/loader/koala.loader.service.d.ts +3 -0
  89. package/core/lib/services/openid/koala.oauth2.service.d.ts +3 -0
  90. package/core/lib/services/request/koala.request.service.d.ts +3 -0
  91. package/core/lib/services/token/koala.token.service.d.ts +3 -0
  92. package/core/package.json +20 -7
  93. package/dialog/{esm2015/index.js → esm2020/index.mjs} +0 -0
  94. package/dialog/{esm2015/koalarx-ui-dialog.js → esm2020/koalarx-ui-dialog.mjs} +0 -0
  95. package/dialog/esm2020/lib/dialog.component.mjs +25 -0
  96. package/dialog/{esm2015/lib/koala.dialog-template.interface.js → esm2020/lib/koala.dialog-template.interface.mjs} +0 -0
  97. package/dialog/esm2020/lib/koala.dialog.module.mjs +38 -0
  98. package/dialog/esm2020/lib/koala.dialog.service.mjs +57 -0
  99. package/dialog/fesm2015/koalarx-ui-dialog.mjs +121 -0
  100. package/dialog/fesm2015/koalarx-ui-dialog.mjs.map +1 -0
  101. package/dialog/fesm2020/koalarx-ui-dialog.mjs +121 -0
  102. package/dialog/fesm2020/koalarx-ui-dialog.mjs.map +1 -0
  103. package/dialog/koalarx-ui-dialog.d.ts +1 -0
  104. package/dialog/lib/dialog.component.d.ts +3 -0
  105. package/dialog/lib/koala.dialog.module.d.ts +9 -0
  106. package/dialog/lib/koala.dialog.service.d.ts +3 -0
  107. package/dialog/package.json +20 -7
  108. package/dynamic-component/{esm2015/index.js → esm2020/index.mjs} +0 -0
  109. package/dynamic-component/{esm2015/koalarx-ui-dynamic-component.js → esm2020/koalarx-ui-dynamic-component.mjs} +0 -0
  110. package/dynamic-component/{esm2015/lib/koala-dynamic-component.component.js → esm2020/lib/koala-dynamic-component.component.mjs} +0 -0
  111. package/dynamic-component/esm2020/lib/koala-dynamic-component.directive.mjs +16 -0
  112. package/dynamic-component/esm2020/lib/koala-dynamic-component.factory.mjs +41 -0
  113. package/dynamic-component/{esm2015/lib/koala-dynamic-component.js → esm2020/lib/koala-dynamic-component.mjs} +0 -0
  114. package/dynamic-component/esm2020/lib/koala-dynamic-component.module.mjs +23 -0
  115. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.mjs +87 -0
  116. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.mjs.map +1 -0
  117. package/dynamic-component/fesm2020/koalarx-ui-dynamic-component.mjs +86 -0
  118. package/dynamic-component/fesm2020/koalarx-ui-dynamic-component.mjs.map +1 -0
  119. package/dynamic-component/koalarx-ui-dynamic-component.d.ts +1 -0
  120. package/dynamic-component/lib/koala-dynamic-component.directive.d.ts +3 -0
  121. package/dynamic-component/lib/koala-dynamic-component.factory.d.ts +3 -0
  122. package/dynamic-component/lib/koala-dynamic-component.module.d.ts +6 -0
  123. package/dynamic-component/package.json +18 -6
  124. package/file-button/{esm2015/index.js → esm2020/index.mjs} +0 -0
  125. package/file-button/{esm2015/koalarx-ui-file-button.js → esm2020/koalarx-ui-file-button.mjs} +0 -0
  126. package/file-button/esm2020/lib/file-button.component.mjs +125 -0
  127. package/file-button/esm2020/lib/koala.btn-file.service.mjs +25 -0
  128. package/file-button/esm2020/lib/koala.file-button.module.mjs +38 -0
  129. package/file-button/{esm2015/lib/koala.file.interface.js → esm2020/lib/koala.file.interface.mjs} +0 -0
  130. package/file-button/fesm2015/koalarx-ui-file-button.mjs +199 -0
  131. package/file-button/fesm2015/koalarx-ui-file-button.mjs.map +1 -0
  132. package/file-button/fesm2020/koalarx-ui-file-button.mjs +189 -0
  133. package/file-button/fesm2020/koalarx-ui-file-button.mjs.map +1 -0
  134. package/file-button/koalarx-ui-file-button.d.ts +1 -0
  135. package/file-button/lib/file-button.component.d.ts +4 -1
  136. package/file-button/lib/koala.btn-file.service.d.ts +3 -0
  137. package/file-button/lib/koala.file-button.module.d.ts +9 -0
  138. package/file-button/package.json +18 -6
  139. package/folder-page/{esm2015/index.js → esm2020/index.mjs} +0 -0
  140. package/folder-page/{esm2015/koalarx-ui-folder-page.js → esm2020/koalarx-ui-folder-page.mjs} +0 -0
  141. package/folder-page/esm2020/lib/folder.component.mjs +70 -0
  142. package/folder-page/{esm2015/lib/koala-navigate-history.interface.js → esm2020/lib/koala-navigate-history.interface.mjs} +0 -0
  143. package/folder-page/esm2020/lib/koala.folder-page.module.mjs +42 -0
  144. package/folder-page/fesm2015/koalarx-ui-folder-page.mjs +117 -0
  145. package/folder-page/fesm2015/koalarx-ui-folder-page.mjs.map +1 -0
  146. package/folder-page/fesm2020/koalarx-ui-folder-page.mjs +116 -0
  147. package/folder-page/fesm2020/koalarx-ui-folder-page.mjs.map +1 -0
  148. package/folder-page/koalarx-ui-folder-page.d.ts +1 -0
  149. package/folder-page/lib/folder.component.d.ts +6 -2
  150. package/folder-page/lib/koala.folder-page.module.d.ts +10 -0
  151. package/folder-page/package.json +18 -6
  152. package/form/{esm2015/index.js → esm2020/index.mjs} +0 -0
  153. package/form/{esm2015/koalarx-ui-form.js → esm2020/koalarx-ui-form.mjs} +0 -0
  154. package/form/esm2020/lib/btn-submit/btn-submit.component.mjs +49 -0
  155. package/form/esm2020/lib/directives/koala-autofocus.directive.mjs +25 -0
  156. package/form/esm2020/lib/dynamic-form/builder/dynamic-form.builder.mjs +138 -0
  157. package/form/{esm2015/lib/dynamic-form/builder/fields/autocomplete.builder.js → esm2020/lib/dynamic-form/builder/fields/autocomplete.builder.mjs} +0 -0
  158. package/form/esm2020/lib/dynamic-form/builder/fields/field.base.mjs +148 -0
  159. package/form/{esm2015/lib/dynamic-form/builder/fields/field.builder.js → esm2020/lib/dynamic-form/builder/fields/field.builder.mjs} +0 -0
  160. package/form/esm2020/lib/dynamic-form/builder/fields/more-items.builder.mjs +57 -0
  161. package/form/esm2020/lib/dynamic-form/dynamic-form.component.mjs +581 -0
  162. package/form/{esm2015/lib/dynamic-form/enums/dynamic-form-type-field.enum.js → esm2020/lib/dynamic-form/enums/dynamic-form-type-field.enum.mjs} +0 -0
  163. package/form/{esm2015/lib/dynamic-form/interfaces/koala-custom-validator-fn.interface.js → esm2020/lib/dynamic-form/interfaces/koala-custom-validator-fn.interface.mjs} +0 -0
  164. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-autocomplete-options.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-autocomplete-options.interface.mjs} +0 -0
  165. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-autocomplete-multiple-config.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-autocomplete-multiple-config.interface.mjs} +0 -0
  166. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-config.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-config.interface.mjs} +0 -0
  167. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-field.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-field.interface.mjs} +0 -0
  168. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-more-itens-show-field-config.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-more-itens-show-field-config.interface.mjs} +0 -0
  169. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-show-field.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-show-field.interface.mjs} +0 -0
  170. package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-set-value.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-set-value.interface.mjs} +0 -0
  171. package/form/esm2020/lib/dynamic-form/koala.dynamic-form.service.mjs +199 -0
  172. package/form/{esm2015/lib/dynamic-form/validators/autocomplete-selected.validator.js → esm2020/lib/dynamic-form/validators/autocomplete-selected.validator.mjs} +0 -0
  173. package/form/{esm2015/lib/dynamic-form/validators/cnpj.validator.js → esm2020/lib/dynamic-form/validators/cnpj.validator.mjs} +0 -0
  174. package/form/{esm2015/lib/dynamic-form/validators/cpf.validator.js → esm2020/lib/dynamic-form/validators/cpf.validator.mjs} +0 -0
  175. package/form/{esm2015/lib/dynamic-form/validators/date-max.validator.js → esm2020/lib/dynamic-form/validators/date-max.validator.mjs} +0 -0
  176. package/form/{esm2015/lib/dynamic-form/validators/date-min.validator.js → esm2020/lib/dynamic-form/validators/date-min.validator.mjs} +0 -0
  177. package/form/{esm2015/lib/dynamic-form/validators/koala-dynamic-form-validator-result.helper.js → esm2020/lib/dynamic-form/validators/koala-dynamic-form-validator-result.helper.mjs} +0 -0
  178. package/form/{esm2015/lib/dynamic-form/validators/validation.helper.js → esm2020/lib/dynamic-form/validators/validation.helper.mjs} +0 -0
  179. package/form/{esm2015/lib/form.abstract.js → esm2020/lib/form.abstract.mjs} +0 -0
  180. package/form/esm2020/lib/koala.form.module.mjs +134 -0
  181. package/form/{esm2015/lib/show-invalid-fields/show-invalid-fields.js → esm2020/lib/show-invalid-fields/show-invalid-fields.mjs} +0 -0
  182. package/form/fesm2015/koalarx-ui-form.mjs +1575 -0
  183. package/form/fesm2015/koalarx-ui-form.mjs.map +1 -0
  184. package/form/fesm2020/koalarx-ui-form.mjs +1557 -0
  185. package/form/fesm2020/koalarx-ui-form.mjs.map +1 -0
  186. package/form/koalarx-ui-form.d.ts +1 -0
  187. package/form/lib/btn-submit/btn-submit.component.d.ts +3 -0
  188. package/form/lib/directives/koala-autofocus.directive.d.ts +3 -0
  189. package/form/lib/dynamic-form/builder/fields/field.base.d.ts +1 -1
  190. package/form/lib/dynamic-form/dynamic-form.component.d.ts +8 -1
  191. package/form/lib/dynamic-form/koala.dynamic-form.service.d.ts +3 -0
  192. package/form/lib/koala.form.module.d.ts +23 -0
  193. package/form/package.json +20 -7
  194. package/icon/{esm2015/index.js → esm2020/index.mjs} +2 -1
  195. package/icon/{esm2015/koalarx-ui-icon.js → esm2020/koalarx-ui-icon.mjs} +0 -0
  196. package/icon/esm2020/lib/icon.component.mjs +46 -0
  197. package/icon/esm2020/lib/koala.icon.module.mjs +26 -0
  198. package/icon/esm2020/lib/koala.icon.type.mjs +2 -0
  199. package/icon/fesm2015/koalarx-ui-icon.mjs +77 -0
  200. package/icon/{esm2015/lib/icon.component.js → fesm2015/koalarx-ui-icon.mjs.map} +1 -45
  201. package/icon/fesm2020/koalarx-ui-icon.mjs +76 -0
  202. package/icon/{fesm2015/koalarx-ui-icon.js → fesm2020/koalarx-ui-icon.mjs.map} +1 -69
  203. package/icon/index.d.ts +1 -0
  204. package/icon/koalarx-ui-icon.d.ts +1 -0
  205. package/icon/lib/icon.component.d.ts +4 -1
  206. package/icon/lib/koala.icon.module.d.ts +6 -0
  207. package/icon/lib/koala.icon.type.d.ts +1 -0
  208. package/icon/package.json +18 -6
  209. package/icons-animated/{esm2015/index.js → esm2020/index.mjs} +0 -0
  210. package/icons-animated/esm2020/koalarx-ui-icons-animated.mjs +5 -0
  211. package/icons-animated/esm2020/lib/icons/downloading/downloading-icon-animated.component.mjs +23 -0
  212. package/icons-animated/esm2020/lib/icons/loading/loading-icon-animated.component.mjs +23 -0
  213. package/icons-animated/esm2020/lib/icons-animated.component.mjs +20 -0
  214. package/icons-animated/esm2020/lib/icons-animated.service.mjs +32 -0
  215. package/icons-animated/esm2020/lib/koala-icons-animated.module.mjs +32 -0
  216. package/icons-animated/fesm2015/koalarx-ui-icons-animated.mjs +122 -0
  217. package/icons-animated/fesm2015/koalarx-ui-icons-animated.mjs.map +1 -0
  218. package/icons-animated/fesm2020/koalarx-ui-icons-animated.mjs +120 -0
  219. package/icons-animated/fesm2020/koalarx-ui-icons-animated.mjs.map +1 -0
  220. package/icons-animated/koalarx-ui-icons-animated.d.ts +1 -1
  221. package/icons-animated/lib/icons/downloading/downloading-icon-animated.component.d.ts +5 -2
  222. package/icons-animated/lib/icons/loading/loading-icon-animated.component.d.ts +5 -2
  223. package/icons-animated/lib/icons-animated.component.d.ts +3 -0
  224. package/icons-animated/lib/icons-animated.service.d.ts +3 -0
  225. package/icons-animated/lib/koala-icons-animated.module.d.ts +8 -0
  226. package/icons-animated/package.json +18 -6
  227. package/list/{esm2015/index.js → esm2020/index.mjs} +0 -0
  228. package/list/{esm2015/koalarx-ui-list.js → esm2020/koalarx-ui-list.mjs} +0 -0
  229. package/list/{esm2015/lib/koala-list-btn-collapse-sub-list-config.interface.js → esm2020/lib/koala-list-btn-collapse-sub-list-config.interface.mjs} +0 -0
  230. package/list/{esm2015/lib/koala-list-filter.interface.js → esm2020/lib/koala-list-filter.interface.mjs} +0 -0
  231. package/list/{esm2015/lib/koala-list-form-filter.interface.js → esm2020/lib/koala-list-form-filter.interface.mjs} +0 -0
  232. package/list/{esm2015/lib/koala-list-item-menu-option.interface.js → esm2020/lib/koala-list-item-menu-option.interface.mjs} +0 -0
  233. package/list/{esm2015/lib/koala-list-item.interface.js → esm2020/lib/koala-list-item.interface.mjs} +0 -0
  234. package/list/{esm2015/lib/koala.list-config.interface.js → esm2020/lib/koala.list-config.interface.mjs} +0 -0
  235. package/list/esm2020/lib/koala.list.module.mjs +70 -0
  236. package/list/esm2020/lib/koala.list.service.mjs +15 -0
  237. package/list/esm2020/lib/list-builder/list.builder.mjs +97 -0
  238. package/list/esm2020/lib/list.abstract.mjs +157 -0
  239. package/list/esm2020/lib/list.component.mjs +171 -0
  240. package/list/esm2020/lib/providers/pagination/pagination.provider.mjs +32 -0
  241. package/list/fesm2015/koalarx-ui-list.mjs +559 -0
  242. package/list/fesm2015/koalarx-ui-list.mjs.map +1 -0
  243. package/list/fesm2020/koalarx-ui-list.mjs +529 -0
  244. package/list/fesm2020/koalarx-ui-list.mjs.map +1 -0
  245. package/list/koalarx-ui-list.d.ts +1 -0
  246. package/list/lib/koala.list.module.d.ts +15 -0
  247. package/list/lib/koala.list.service.d.ts +3 -0
  248. package/list/lib/list.component.d.ts +3 -0
  249. package/list/lib/providers/pagination/pagination.provider.d.ts +3 -0
  250. package/list/package.json +20 -7
  251. package/menu/{esm2015/index.js → esm2020/index.mjs} +0 -0
  252. package/menu/{esm2015/koalarx-ui-menu.js → esm2020/koalarx-ui-menu.mjs} +0 -0
  253. package/menu/{esm2015/lib/koala.menu-module.interface.js → esm2020/lib/koala.menu-module.interface.mjs} +0 -0
  254. package/menu/{esm2015/lib/koala.menu-tool.interface.js → esm2020/lib/koala.menu-tool.interface.mjs} +0 -0
  255. package/menu/esm2020/lib/koala.menu.module.mjs +38 -0
  256. package/menu/esm2020/lib/koala.menu.service.mjs +24 -0
  257. package/menu/esm2020/lib/menu.component.mjs +100 -0
  258. package/menu/fesm2015/koalarx-ui-menu.mjs +167 -0
  259. package/menu/fesm2015/koalarx-ui-menu.mjs.map +1 -0
  260. package/menu/fesm2020/koalarx-ui-menu.mjs +162 -0
  261. package/menu/fesm2020/koalarx-ui-menu.mjs.map +1 -0
  262. package/menu/koalarx-ui-menu.d.ts +1 -0
  263. package/menu/lib/koala.menu.module.d.ts +9 -0
  264. package/menu/lib/koala.menu.service.d.ts +3 -0
  265. package/menu/lib/menu.component.d.ts +6 -0
  266. package/menu/package.json +18 -6
  267. package/package.json +9 -5
  268. package/question/{esm2015/index.js → esm2020/index.mjs} +0 -0
  269. package/question/{esm2015/koalarx-ui-question.js → esm2020/koalarx-ui-question.mjs} +0 -0
  270. package/question/esm2020/lib/dialog-question.component.mjs +25 -0
  271. package/question/{esm2015/lib/koala-question-config.interface.js → esm2020/lib/koala-question-config.interface.mjs} +0 -0
  272. package/question/esm2020/lib/koala.question.module.mjs +42 -0
  273. package/question/esm2020/lib/koala.question.service.mjs +26 -0
  274. package/question/fesm2015/koalarx-ui-question.mjs +95 -0
  275. package/question/fesm2015/koalarx-ui-question.mjs.map +1 -0
  276. package/question/fesm2020/koalarx-ui-question.mjs +93 -0
  277. package/question/fesm2020/koalarx-ui-question.mjs.map +1 -0
  278. package/question/koalarx-ui-question.d.ts +1 -0
  279. package/question/lib/dialog-question.component.d.ts +3 -0
  280. package/question/lib/koala.question.module.d.ts +10 -0
  281. package/question/lib/koala.question.service.d.ts +3 -0
  282. package/question/package.json +18 -6
  283. package/snackbar/{esm2015/index.js → esm2020/index.mjs} +0 -0
  284. package/snackbar/{esm2015/koalarx-ui-snackbar.js → esm2020/koalarx-ui-snackbar.mjs} +0 -0
  285. package/snackbar/esm2020/lib/koala.snackbar.component.mjs +22 -0
  286. package/snackbar/{esm2015/lib/koala.snackbar.interface.js → esm2020/lib/koala.snackbar.interface.mjs} +0 -0
  287. package/snackbar/esm2020/lib/koala.snackbar.module.mjs +38 -0
  288. package/snackbar/esm2020/lib/koala.snackbar.service.mjs +35 -0
  289. package/snackbar/fesm2015/koalarx-ui-snackbar.mjs +95 -0
  290. package/snackbar/fesm2015/koalarx-ui-snackbar.mjs.map +1 -0
  291. package/snackbar/fesm2020/koalarx-ui-snackbar.mjs +93 -0
  292. package/snackbar/fesm2020/koalarx-ui-snackbar.mjs.map +1 -0
  293. package/snackbar/koalarx-ui-snackbar.d.ts +1 -0
  294. package/snackbar/lib/koala.snackbar.component.d.ts +3 -0
  295. package/snackbar/lib/koala.snackbar.module.d.ts +8 -0
  296. package/snackbar/lib/koala.snackbar.service.d.ts +3 -0
  297. package/snackbar/package.json +18 -6
  298. package/alert/bundles/koalarx-ui-alert.umd.js +0 -153
  299. package/alert/bundles/koalarx-ui-alert.umd.js.map +0 -1
  300. package/alert/esm2015/lib/dialog-alert.component.js +0 -43
  301. package/alert/esm2015/lib/koala.alert.module.js +0 -31
  302. package/alert/esm2015/lib/koala.alert.service.js +0 -21
  303. package/alert/fesm2015/koalarx-ui-alert.js +0 -121
  304. package/alert/fesm2015/koalarx-ui-alert.js.map +0 -1
  305. package/alert/koalarx-ui-alert.metadata.json +0 -1
  306. package/button/bundles/koalarx-ui-button.umd.js +0 -71
  307. package/button/bundles/koalarx-ui-button.umd.js.map +0 -1
  308. package/button/esm2015/lib/button.component.js +0 -31
  309. package/button/esm2015/lib/koala.button.module.js +0 -27
  310. package/button/fesm2015/koalarx-ui-button.js +0 -63
  311. package/button/fesm2015/koalarx-ui-button.js.map +0 -1
  312. package/button/koalarx-ui-button.metadata.json +0 -1
  313. package/common/bundles/koalarx-ui-common.umd.js +0 -481
  314. package/common/bundles/koalarx-ui-common.umd.js.map +0 -1
  315. package/common/esm2015/lib/services/csv/koala.csv.service.js +0 -38
  316. package/common/esm2015/lib/services/xlsx/koala.xlsx.service.js +0 -74
  317. package/common/fesm2015/koalarx-ui-common.js.map +0 -1
  318. package/common/koalarx-ui-common.metadata.json +0 -1
  319. package/core/bundles/koalarx-ui-core.umd.js +0 -1716
  320. package/core/bundles/koalarx-ui-core.umd.js.map +0 -1
  321. package/core/esm2015/index.js +0 -34
  322. package/core/esm2015/koalarx-ui-core.js +0 -7
  323. package/core/esm2015/lib/loader/loader-bar-page.component.js +0 -22
  324. package/core/esm2015/lib/ngx-koala.module.js +0 -35
  325. package/core/esm2015/lib/page/koala.page.module.js +0 -46
  326. package/core/esm2015/lib/page/notifications/notification.component.js +0 -43
  327. package/core/esm2015/lib/page/page.component.js +0 -396
  328. package/core/esm2015/lib/router/koala.parameter-hash-location-stategy.js +0 -16
  329. package/core/esm2015/lib/services/api-requester/factory/koala.response.factory.js +0 -48
  330. package/core/esm2015/lib/services/api-requester/koala.api-requester.base.js +0 -70
  331. package/core/esm2015/lib/services/api-requester/koala.api-requester.service.js +0 -134
  332. package/core/esm2015/lib/services/loader/koala.loader.service.js +0 -32
  333. package/core/esm2015/lib/services/openid/koala.oauth.config.js +0 -33
  334. package/core/esm2015/lib/services/openid/koala.oauth2.service.js +0 -201
  335. package/core/esm2015/lib/services/request/koala.request.service.js +0 -53
  336. package/core/esm2015/lib/services/token/token.factory.js +0 -31
  337. package/core/fesm2015/koalarx-ui-core.js.map +0 -1
  338. package/core/koalarx-ui-core.metadata.json +0 -1
  339. package/dialog/bundles/koalarx-ui-dialog.umd.js +0 -139
  340. package/dialog/bundles/koalarx-ui-dialog.umd.js.map +0 -1
  341. package/dialog/esm2015/lib/dialog.component.js +0 -18
  342. package/dialog/esm2015/lib/koala.dialog.module.js +0 -25
  343. package/dialog/esm2015/lib/koala.dialog.service.js +0 -61
  344. package/dialog/fesm2015/koalarx-ui-dialog.js +0 -107
  345. package/dialog/fesm2015/koalarx-ui-dialog.js.map +0 -1
  346. package/dialog/koalarx-ui-dialog.metadata.json +0 -1
  347. package/dynamic-component/bundles/koalarx-ui-dynamic-component.umd.js +0 -95
  348. package/dynamic-component/bundles/koalarx-ui-dynamic-component.umd.js.map +0 -1
  349. package/dynamic-component/esm2015/lib/koala-dynamic-component.directive.js +0 -15
  350. package/dynamic-component/esm2015/lib/koala-dynamic-component.factory.js +0 -38
  351. package/dynamic-component/esm2015/lib/koala-dynamic-component.module.js +0 -17
  352. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.js +0 -79
  353. package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.js.map +0 -1
  354. package/dynamic-component/koalarx-ui-dynamic-component.metadata.json +0 -1
  355. package/file-button/bundles/koalarx-ui-file-button.umd.js +0 -553
  356. package/file-button/bundles/koalarx-ui-file-button.umd.js.map +0 -1
  357. package/file-button/esm2015/lib/file-button.component.js +0 -118
  358. package/file-button/esm2015/lib/koala.btn-file.service.js +0 -26
  359. package/file-button/esm2015/lib/koala.file-button.module.js +0 -25
  360. package/file-button/fesm2015/koalarx-ui-file-button.js +0 -171
  361. package/file-button/fesm2015/koalarx-ui-file-button.js.map +0 -1
  362. package/file-button/koalarx-ui-file-button.metadata.json +0 -1
  363. package/folder-page/bundles/koalarx-ui-folder-page.umd.js +0 -97
  364. package/folder-page/bundles/koalarx-ui-folder-page.umd.js.map +0 -1
  365. package/folder-page/esm2015/lib/folder.component.js +0 -56
  366. package/folder-page/esm2015/lib/koala.folder-page.module.js +0 -27
  367. package/folder-page/fesm2015/koalarx-ui-folder-page.js +0 -88
  368. package/folder-page/fesm2015/koalarx-ui-folder-page.js.map +0 -1
  369. package/folder-page/koalarx-ui-folder-page.metadata.json +0 -1
  370. package/form/bundles/koalarx-ui-form.umd.js +0 -1944
  371. package/form/bundles/koalarx-ui-form.umd.js.map +0 -1
  372. package/form/esm2015/lib/btn-submit/btn-submit.component.js +0 -39
  373. package/form/esm2015/lib/directives/koala-autofocus.directive.js +0 -25
  374. package/form/esm2015/lib/dynamic-form/builder/dynamic-form.builder.js +0 -141
  375. package/form/esm2015/lib/dynamic-form/builder/fields/field.base.js +0 -150
  376. package/form/esm2015/lib/dynamic-form/builder/fields/more-items.builder.js +0 -57
  377. package/form/esm2015/lib/dynamic-form/dynamic-form.component.js +0 -551
  378. package/form/esm2015/lib/dynamic-form/koala.dynamic-form.service.js +0 -204
  379. package/form/esm2015/lib/koala.form.module.js +0 -69
  380. package/form/fesm2015/koalarx-ui-form.js +0 -1473
  381. package/form/fesm2015/koalarx-ui-form.js.map +0 -1
  382. package/form/koalarx-ui-form.metadata.json +0 -1
  383. package/icon/bundles/koalarx-ui-icon.umd.js +0 -76
  384. package/icon/bundles/koalarx-ui-icon.umd.js.map +0 -1
  385. package/icon/esm2015/lib/koala.icon.module.js +0 -19
  386. package/icon/fesm2015/koalarx-ui-icon.js.map +0 -1
  387. package/icon/koalarx-ui-icon.metadata.json +0 -1
  388. package/icons-animated/bundles/koalarx-ui-icons-animated.umd.js +0 -138
  389. package/icons-animated/bundles/koalarx-ui-icons-animated.umd.js.map +0 -1
  390. package/icons-animated/esm2015/koalarx-ui-icons-animated.js +0 -6
  391. package/icons-animated/esm2015/lib/icons/downloading/downloading-icon-animated.component.js +0 -28
  392. package/icons-animated/esm2015/lib/icons/loading/loading-icon-animated.component.js +0 -28
  393. package/icons-animated/esm2015/lib/icons-animated.component.js +0 -15
  394. package/icons-animated/esm2015/lib/icons-animated.service.js +0 -29
  395. package/icons-animated/esm2015/lib/koala-icons-animated.module.js +0 -23
  396. package/icons-animated/fesm2015/koalarx-ui-icons-animated.js +0 -121
  397. package/icons-animated/fesm2015/koalarx-ui-icons-animated.js.map +0 -1
  398. package/icons-animated/koalarx-ui-icons-animated.metadata.json +0 -1
  399. package/list/bundles/koalarx-ui-list.umd.js +0 -914
  400. package/list/bundles/koalarx-ui-list.umd.js.map +0 -1
  401. package/list/esm2015/lib/koala.list.module.js +0 -42
  402. package/list/esm2015/lib/koala.list.service.js +0 -13
  403. package/list/esm2015/lib/list-builder/list.builder.js +0 -101
  404. package/list/esm2015/lib/list.abstract.js +0 -174
  405. package/list/esm2015/lib/list.component.js +0 -166
  406. package/list/esm2015/lib/providers/pagination/pagination.provider.js +0 -30
  407. package/list/fesm2015/koalarx-ui-list.js +0 -514
  408. package/list/fesm2015/koalarx-ui-list.js.map +0 -1
  409. package/list/koalarx-ui-list.metadata.json +0 -1
  410. package/menu/bundles/koalarx-ui-menu.umd.js +0 -511
  411. package/menu/bundles/koalarx-ui-menu.umd.js.map +0 -1
  412. package/menu/esm2015/lib/koala.menu.module.js +0 -25
  413. package/menu/esm2015/lib/koala.menu.service.js +0 -22
  414. package/menu/esm2015/lib/menu.component.js +0 -104
  415. package/menu/fesm2015/koalarx-ui-menu.js +0 -153
  416. package/menu/fesm2015/koalarx-ui-menu.js.map +0 -1
  417. package/menu/koalarx-ui-menu.metadata.json +0 -1
  418. package/question/bundles/koalarx-ui-question.umd.js +0 -104
  419. package/question/bundles/koalarx-ui-question.umd.js.map +0 -1
  420. package/question/esm2015/lib/dialog-question.component.js +0 -20
  421. package/question/esm2015/lib/koala.question.module.js +0 -27
  422. package/question/esm2015/lib/koala.question.service.js +0 -28
  423. package/question/fesm2015/koalarx-ui-question.js +0 -77
  424. package/question/fesm2015/koalarx-ui-question.js.map +0 -1
  425. package/question/koalarx-ui-question.metadata.json +0 -1
  426. package/snackbar/bundles/koalarx-ui-snackbar.umd.js +0 -93
  427. package/snackbar/bundles/koalarx-ui-snackbar.umd.js.map +0 -1
  428. package/snackbar/esm2015/lib/koala.snackbar.component.js +0 -20
  429. package/snackbar/esm2015/lib/koala.snackbar.module.js +0 -26
  430. package/snackbar/esm2015/lib/koala.snackbar.service.js +0 -35
  431. package/snackbar/fesm2015/koalarx-ui-snackbar.js +0 -81
  432. package/snackbar/fesm2015/koalarx-ui-snackbar.js.map +0 -1
  433. package/snackbar/koalarx-ui-snackbar.metadata.json +0 -1
@@ -1,551 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { FormBuilder, Validators } from '@angular/forms';
3
- import { DynamicFormTypeFieldEnum } from './enums/dynamic-form-type-field.enum';
4
- import { CpfValidator } from './validators/cpf.validator';
5
- import { CnpjValidator } from './validators/cnpj.validator';
6
- import { ChangeDetectionStrategy, Component, Input, ViewChild } from '@angular/core';
7
- import { FormAbstract } from '../form.abstract';
8
- import { debounceTime } from 'rxjs/operators';
9
- import { BehaviorSubject } from 'rxjs';
10
- import { AutocompleteSelectedValidator } from './validators/autocomplete-selected.validator';
11
- import { KoalaDynamicFormService } from './koala.dynamic-form.service';
12
- import { delay } from "@koalarx/utils/operators/delay";
13
- import { koala } from "@koalarx/utils";
14
- import { DateMinValidator } from "./validators/date-min.validator";
15
- import { DateMaxValidator } from "./validators/date-max.validator";
16
- import { KoalaLanguageHelper } from "@koalarx/ui/core";
17
- export class DynamicFormComponent extends FormAbstract {
18
- constructor(fb, dynamicFormService) {
19
- super(() => this.form);
20
- this.fb = fb;
21
- this.dynamicFormService = dynamicFormService;
22
- this.tabIndexStart = 1;
23
- this.typeField = DynamicFormTypeFieldEnum;
24
- this.hoursAndMinutesMask = '00:000';
25
- this.errorMessage = KoalaLanguageHelper;
26
- }
27
- ngOnInit() {
28
- var _a;
29
- if (!this.form.get('formData')) {
30
- this.form.addControl('formData', this.fb.array([]));
31
- }
32
- this.controls = this.form.get('formData');
33
- (_a = this.formConfig) === null || _a === void 0 ? void 0 : _a.forEach((config, indexConfig) => {
34
- const newFormGroup = this.newControl(config);
35
- if (config.asyncValidators) {
36
- newFormGroup.get('value').setAsyncValidators(config.asyncValidators);
37
- }
38
- newFormGroup.get('value').updateValueAndValidity();
39
- if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
40
- const formGroupDynamicFormsSubject = newFormGroup.get('dynamicFormConfig').value;
41
- formGroupDynamicFormsSubject.subscribe(formGroupConfig => {
42
- if (formGroupConfig) {
43
- formGroupConfig.form.valueChanges.subscribe(() => {
44
- if (formGroupConfig.form.valid && (config.valueChanges || this.showFieldsMoreItensConfig)) {
45
- const value = this.dynamicFormService.emitData(formGroupConfig.form);
46
- newFormGroup.get('value').setValue(value);
47
- }
48
- });
49
- }
50
- });
51
- }
52
- if (config.valueChanges ||
53
- config.type === DynamicFormTypeFieldEnum.autocomplete ||
54
- config.type === DynamicFormTypeFieldEnum.dynamicForm ||
55
- this.showFieldsMoreItensConfig) {
56
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
57
- const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
58
- if (autocompleteOptionsSubject) {
59
- autocompleteOptionsSubject.subscribe(options => newFormGroup.get('autocompleteOptionsFiltered').value.next(options));
60
- }
61
- }
62
- newFormGroup.get('value')
63
- .valueChanges
64
- .pipe(debounceTime(300))
65
- .subscribe((value) => __awaiter(this, void 0, void 0, function* () {
66
- var _a, _b, _c, _d;
67
- yield this.setConfigDynamicForm(newFormGroup);
68
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
69
- if (value && (value.hasOwnProperty('value') &&
70
- value.hasOwnProperty('name') &&
71
- Object.keys(value).length === 2) || (Array.isArray(value) &&
72
- newFormGroup.get('multiple').value)) {
73
- if (newFormGroup.get('multiple').value) {
74
- if (Array.isArray(value)) {
75
- newFormGroup.get('autocompleteSelectedValue').setValue(value);
76
- }
77
- else {
78
- newFormGroup.get('autocompleteSelectedValue').value.push(value);
79
- }
80
- if ((_a = this.autocompleteInput) === null || _a === void 0 ? void 0 : _a.nativeElement) {
81
- this.autocompleteInput.nativeElement.value = '';
82
- }
83
- }
84
- else {
85
- newFormGroup.get('autocompleteSelectedValue').setValue(value);
86
- }
87
- }
88
- else if (!newFormGroup.get('multiple').value) {
89
- newFormGroup.get('autocompleteSelectedValue').setValue((_c = (_b = koala(this.formConfig)
90
- .array()
91
- .filter(newFormGroup.get('name').value, 'name')
92
- .getValue()[0]) === null || _b === void 0 ? void 0 : _b.autocompleteDefaultValueOnClear) !== null && _c !== void 0 ? _c : null);
93
- }
94
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
95
- if (config.autocompleteType === 'all') {
96
- const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
97
- newFormGroup.get('autocompleteOptionsFiltered').value.next(this.autocompleteFilter(autocompleteOptionsSubject.value, value));
98
- }
99
- else if (config.autocompleteType === 'onDemand' && typeof value !== "object") {
100
- const loader = newFormGroup.get('autocompleteLoading').value;
101
- loader.next(true);
102
- config.autocompleteFilter(value).subscribe(options => {
103
- newFormGroup.get('autocompleteOptionsFiltered').value.next(options);
104
- loader.next(false);
105
- });
106
- }
107
- }
108
- }
109
- if (config.valueChanges) {
110
- if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
111
- config.valueChanges((newFormGroup.get('multiple').value ?
112
- newFormGroup.get('autocompleteSelectedValue').value.map(item => item.value) :
113
- (_d = newFormGroup.get('autocompleteSelectedValue').value) === null || _d === void 0 ? void 0 : _d.value));
114
- }
115
- else {
116
- config.valueChanges(value);
117
- }
118
- }
119
- }));
120
- }
121
- this.controls.push(newFormGroup);
122
- if (config.moreItemsConfig) {
123
- if (config.moreItemsMinItems > 0) {
124
- for (let min = 0; min < config.moreItemsMinItems; min++) {
125
- if (min <= config.moreItemsMaxItems) {
126
- this.addMoreItem(indexConfig);
127
- }
128
- }
129
- }
130
- if (config.moreItemsConfig.setValues) {
131
- config.moreItemsConfig
132
- .setValues
133
- .subscribe((values) => __awaiter(this, void 0, void 0, function* () {
134
- if (values.length > 0) {
135
- values.forEach((itemValue, indexValue) => {
136
- if (!this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue]) {
137
- this.addMoreItem(indexConfig);
138
- }
139
- setTimeout(() => {
140
- this.setValuesOnFields(itemValue, this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue].form);
141
- }, 300);
142
- });
143
- }
144
- }));
145
- }
146
- }
147
- });
148
- if (this.showFields) {
149
- this.changeVisibilityFields(this.showFields, this.form);
150
- }
151
- if (this.setValues) {
152
- this.setValuesOnFields(this.setValues, this.form);
153
- }
154
- }
155
- hoursAndMinutesApplyMask(index, event) {
156
- var _a;
157
- const control = (_a = this.controls) === null || _a === void 0 ? void 0 : _a.controls[index];
158
- const type = control === null || control === void 0 ? void 0 : control.get('type').value;
159
- if (type === DynamicFormTypeFieldEnum.hoursAndMinutes) {
160
- const value = control === null || control === void 0 ? void 0 : control.get('value').value;
161
- if (event.key == 'Backspace' && value.length < 6) {
162
- this.hoursAndMinutesMask = '00:000';
163
- }
164
- else if (event.key != 'Backspace' && value.length >= 6) {
165
- this.hoursAndMinutesMask = '000:00';
166
- }
167
- }
168
- }
169
- passwordView(index) {
170
- var _a;
171
- const control = (_a = this.controls) === null || _a === void 0 ? void 0 : _a.controls[index];
172
- const hidePassword = !(control === null || control === void 0 ? void 0 : control.get('hidePassword').value);
173
- control === null || control === void 0 ? void 0 : control.get('hidePassword').setValue(hidePassword);
174
- control === null || control === void 0 ? void 0 : control.get('type').setValue(hidePassword ?
175
- DynamicFormTypeFieldEnum.password :
176
- DynamicFormTypeFieldEnum.text);
177
- }
178
- addMoreItem(propIndex) {
179
- if (this.controls.controls[propIndex].get('moreItemsConfig').value.length < this.controls.controls[propIndex].get('moreItemsMaxItems').value) {
180
- const formGroup = this.fb.group({});
181
- this.controls.controls[propIndex].get('moreItemsConfig').value.push({
182
- form: formGroup,
183
- formConfig: this.formConfig[propIndex].moreItemsConfig.formConfig,
184
- showFields: new BehaviorSubject([]),
185
- showFieldsMoreItensConfig: this.formConfig[propIndex].moreItemsConfig.showFieldsConfig
186
- });
187
- this.controls.controls[propIndex].get('moreItemsExpanded').setValue(this.controls.controls[propIndex].get('moreItemsConfig').value.length - 1);
188
- const formArrayMoreItems = this.controls.controls[propIndex].get('moreItemsFormGroup');
189
- formArrayMoreItems.push(formGroup);
190
- }
191
- }
192
- removeMoreItem(propIndex, removeIndex) {
193
- const expandedItemIndex = removeIndex - 1;
194
- this.controls.controls[propIndex].get('moreItemsConfig').value.splice(removeIndex, 1);
195
- setTimeout(() => {
196
- this.controls.controls[propIndex].get('moreItemsExpanded').setValue((expandedItemIndex < 0) ? 0 : expandedItemIndex);
197
- }, 50);
198
- }
199
- clearAutocomplete(propIndex) {
200
- var _a, _b;
201
- if (this.controls.controls[propIndex].get('multiple').value) {
202
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
203
- this.controls.controls[propIndex].get('value').setValue(null);
204
- }
205
- else {
206
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue((_a = this.formConfig[propIndex].autocompleteDefaultValueOnClear) !== null && _a !== void 0 ? _a : null);
207
- this.controls.controls[propIndex].get('value').setValue((_b = this.formConfig[propIndex].autocompleteDefaultValueOnClear) !== null && _b !== void 0 ? _b : null);
208
- }
209
- }
210
- display(option) {
211
- return option ? option.name : undefined;
212
- }
213
- removeOptionOnAutocomplete(propIndex, option) {
214
- const value = this.controls.controls[propIndex].get('autocompleteSelectedValue').value.filter(item => item !== option);
215
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue(value);
216
- if (value.length === 0) {
217
- this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
218
- this.controls.controls[propIndex].get('value').setValue(null);
219
- }
220
- else if (this.formConfig[propIndex].valueChanges) {
221
- this.formConfig[propIndex].valueChanges(value.map(item => item.value));
222
- }
223
- }
224
- getColorChip(config) {
225
- return config.color;
226
- }
227
- newControl(config) {
228
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
229
- let validators = (_a = config.syncValidators) !== null && _a !== void 0 ? _a : [];
230
- let value = (_b = config.value) !== null && _b !== void 0 ? _b : '';
231
- let valueSelectedAutocomplete = (config.multiple ? [] : ((_c = config.autocompleteDefaultValueOnClear) !== null && _c !== void 0 ? _c : null));
232
- if (config.required === true)
233
- validators.push(Validators.required);
234
- if (config.min && typeof config.min === "number")
235
- validators.push(Validators.min(config.min));
236
- if (config.max && typeof config.max === "number")
237
- validators.push(Validators.max(config.max));
238
- if (config.type === DynamicFormTypeFieldEnum.date ||
239
- config.type === DynamicFormTypeFieldEnum.datetime ||
240
- config.type === DynamicFormTypeFieldEnum.time) {
241
- if (config.min && typeof config.min === "string") {
242
- validators.push(DateMinValidator(config.min));
243
- }
244
- if (config.max && typeof config.max === "string") {
245
- validators.push(DateMaxValidator(config.max));
246
- }
247
- }
248
- if (config.minLength)
249
- validators.push(Validators.minLength(config.minLength));
250
- if (config.maxLength)
251
- validators.push(Validators.maxLength(config.maxLength));
252
- if (config.type === DynamicFormTypeFieldEnum.cpf) {
253
- validators.push(CpfValidator);
254
- }
255
- else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
256
- validators.push(CnpjValidator);
257
- }
258
- else if (config.type === DynamicFormTypeFieldEnum.email) {
259
- validators.push(Validators.email);
260
- }
261
- else if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
262
- if (value) {
263
- valueSelectedAutocomplete = value;
264
- value = (config.multiple ? valueSelectedAutocomplete[0] : value);
265
- }
266
- if (config.required === true) {
267
- validators.push(AutocompleteSelectedValidator);
268
- }
269
- }
270
- else if (config.type === DynamicFormTypeFieldEnum.checkbox) {
271
- value = (_d = config.value) !== null && _d !== void 0 ? _d : false;
272
- }
273
- if (config.type === DynamicFormTypeFieldEnum.hoursAndMinutes &&
274
- value.length >= 6) {
275
- this.hoursAndMinutesMask = '000:00';
276
- }
277
- if (config.dynamicFormConfig) {
278
- const cloneDynamicFormConfig = {};
279
- Object.assign(cloneDynamicFormConfig, config.dynamicFormConfig);
280
- cloneDynamicFormConfig.form = config.dynamicFormConfig.form;
281
- config.dynamicFormConfig = cloneDynamicFormConfig;
282
- }
283
- if (config.show === false) {
284
- validators = [];
285
- }
286
- const field = this.fb.group({
287
- show: [new BehaviorSubject((_e = config.show) !== null && _e !== void 0 ? _e : true)],
288
- label: [config.label],
289
- name: [config.name],
290
- type: [config.type],
291
- fileButtonConfig: [{
292
- icon: (_g = (_f = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _f === void 0 ? void 0 : _f.icon) !== null && _g !== void 0 ? _g : 'attach_file',
293
- text: (_j = (_h = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _h === void 0 ? void 0 : _h.text) !== null && _j !== void 0 ? _j : 'Clique para anexar arquivos',
294
- backgroundColor: (_l = (_k = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _k === void 0 ? void 0 : _k.backgroundColor) !== null && _l !== void 0 ? _l : 'white',
295
- color: (_o = (_m = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _m === void 0 ? void 0 : _m.color) !== null && _o !== void 0 ? _o : 'blue',
296
- accept: (_q = (_p = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _p === void 0 ? void 0 : _p.accept) !== null && _q !== void 0 ? _q : '*'
297
- }],
298
- dynamicFormConfig: [new BehaviorSubject(config.dynamicFormConfig)],
299
- dynamicFormGroup: this.fb.array([]),
300
- appearance: [config.appearance],
301
- floatLabel: [config.floatLabel],
302
- placeholder: [config.placeholder],
303
- class: [config.class],
304
- fieldClass: [config.fieldClass],
305
- textHint: [config.textHint],
306
- required: [(_r = config.required) !== null && _r !== void 0 ? _r : false],
307
- min: [(_s = config.min) !== null && _s !== void 0 ? _s : 0],
308
- max: [(_t = config.max) !== null && _t !== void 0 ? _t : 99999999999],
309
- minLength: [(_u = config.minLength) !== null && _u !== void 0 ? _u : 0],
310
- maxLength: [(_v = config.maxLength) !== null && _v !== void 0 ? _v : 255],
311
- disabled: [(_w = config.disabled) !== null && _w !== void 0 ? _w : false],
312
- focus: [(_x = config.focus) !== null && _x !== void 0 ? _x : false],
313
- multiple: [(_y = config.multiple) !== null && _y !== void 0 ? _y : false],
314
- opcoesSelect: [(_z = config.opcoesSelect) !== null && _z !== void 0 ? _z : []],
315
- hidePassword: config.type === DynamicFormTypeFieldEnum.password ? true : null,
316
- moreItemsButtonIconAddlabel: [config.moreItemsButtonIconAddlabel],
317
- moreItemsMinItems: [(_0 = config.moreItemsMinItems) !== null && _0 !== void 0 ? _0 : 0],
318
- moreItemsMaxItems: [(_1 = config.moreItemsMaxItems) !== null && _1 !== void 0 ? _1 : 100],
319
- moreItemsIcon: [config.moreItemsIcon],
320
- moreItemsIconFontColor: [config.moreItemsIconFontColor],
321
- moreItemsIconBackgroundColor: [config.moreItemsIconBackgroundColor],
322
- moreItemsExpanded: [''],
323
- moreItemsConfig: [[]],
324
- moreItemsFormGroup: this.fb.array([]),
325
- autocompleteLoading: [new BehaviorSubject(false)],
326
- autocompleteOptions: [config.autocompleteOptions],
327
- autocompleteMultipleConfig: [config.autocompleteMultipleConfig],
328
- autocompleteOptionsFiltered: [new BehaviorSubject([])],
329
- autocompleteSelectedValue: [valueSelectedAutocomplete],
330
- textLogs: [config === null || config === void 0 ? void 0 : config.textObs],
331
- customMasc: [config === null || config === void 0 ? void 0 : config.customMasc],
332
- customMascThousandSeparator: [(_2 = config === null || config === void 0 ? void 0 : config.customMascThousandSeparator) !== null && _2 !== void 0 ? _2 : ''],
333
- customMascSuffix: [(_3 = config === null || config === void 0 ? void 0 : config.customMascSuffix) !== null && _3 !== void 0 ? _3 : ''],
334
- customMascPrefix: [(_4 = config === null || config === void 0 ? void 0 : config.customMascPrefix) !== null && _4 !== void 0 ? _4 : ''],
335
- value: [{ value, disabled: config.disabled }, validators, config.asyncValidators]
336
- });
337
- if (config.autocompleteType === "onDemand") {
338
- const loader = field.get('autocompleteLoading').value;
339
- loader.next(true);
340
- config.autocompleteFilter('').subscribe(options => {
341
- field.get('autocompleteOptionsFiltered').value.next(options);
342
- loader.next(false);
343
- });
344
- }
345
- return field;
346
- }
347
- setValuesOnFields(subject, form) {
348
- subject.subscribe(item => {
349
- if (item) {
350
- const formArray = form.get('formData');
351
- for (const prop of item.values()) {
352
- this.setValueByProp(formArray, prop);
353
- }
354
- }
355
- });
356
- }
357
- changeVisibilityFields(subject, form) {
358
- subject.pipe(debounceTime(5)).subscribe(item => {
359
- var _a, _b, _c;
360
- if (item) {
361
- const formArray = form.get('formData');
362
- for (const prop of item.values()) {
363
- for (const [indexControl, control] of formArray.controls.entries()) {
364
- if (control.get('name').value === prop.name) {
365
- control.get('show').value.next(prop.show);
366
- const config = (_a = this.formConfig[indexControl]) !== null && _a !== void 0 ? _a : null;
367
- if (prop.show) {
368
- let validators = [];
369
- if (config) {
370
- if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
371
- const formArrayMoreItems = control.get('dynamicFormGroup');
372
- formArrayMoreItems.push((_b = config === null || config === void 0 ? void 0 : config.dynamicFormConfig) === null || _b === void 0 ? void 0 : _b.form);
373
- }
374
- else {
375
- validators = (_c = config.syncValidators) !== null && _c !== void 0 ? _c : [];
376
- if (config.required === true) {
377
- validators.push(Validators.required);
378
- }
379
- if (config.type === DynamicFormTypeFieldEnum.cpf) {
380
- validators.push(CpfValidator);
381
- }
382
- else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
383
- validators.push(CnpjValidator);
384
- }
385
- else if (config.type === DynamicFormTypeFieldEnum.email) {
386
- validators.push(Validators.email);
387
- }
388
- else if (config.required === true &&
389
- config.type === DynamicFormTypeFieldEnum.autocomplete) {
390
- validators.push(AutocompleteSelectedValidator);
391
- }
392
- if (config.min && typeof config.min === "number")
393
- validators.push(Validators.min(config.min));
394
- if (config.max && typeof config.max === "number")
395
- validators.push(Validators.max(config.max));
396
- if (config.type === DynamicFormTypeFieldEnum.date ||
397
- config.type === DynamicFormTypeFieldEnum.datetime ||
398
- config.type === DynamicFormTypeFieldEnum.time) {
399
- if (config.min && typeof config.min === "string") {
400
- validators.push(DateMinValidator(config.min));
401
- }
402
- if (config.max && typeof config.max === "string") {
403
- validators.push(DateMaxValidator(config.max));
404
- }
405
- }
406
- if (config.minLength)
407
- validators.push(Validators.minLength(config.minLength));
408
- if (config.maxLength)
409
- validators.push(Validators.maxLength(config.maxLength));
410
- control.get('value').setValidators(validators);
411
- if (config.asyncValidators) {
412
- control.get('value').setAsyncValidators(config.asyncValidators);
413
- }
414
- }
415
- control.get('value').updateValueAndValidity();
416
- if (prop.clearCurrentValue) {
417
- control.get('value').setValue(null);
418
- }
419
- }
420
- }
421
- else {
422
- control.get('value').clearValidators();
423
- control.get('value').clearAsyncValidators();
424
- control.setErrors(null);
425
- control.get('value').setValue(null);
426
- control.get('value').updateValueAndValidity();
427
- if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
428
- const formGroup = control;
429
- formGroup.removeControl('dynamicFormGroup');
430
- formGroup.addControl('dynamicFormGroup', this.fb.array([]));
431
- }
432
- }
433
- break;
434
- }
435
- }
436
- }
437
- }
438
- });
439
- }
440
- autocompleteFilter(arr, value) {
441
- return arr.filter(filter => {
442
- if (typeof value === 'string') {
443
- if (filter) {
444
- let find = true;
445
- value.toLowerCase()
446
- .split(' ')
447
- .forEach(part => {
448
- if (filter.name.toLowerCase().indexOf(part) < 0) {
449
- find = false;
450
- return false;
451
- }
452
- });
453
- return find;
454
- }
455
- }
456
- else {
457
- return true;
458
- }
459
- });
460
- }
461
- setValueByProp(formArray, prop) {
462
- if (formArray) {
463
- if (prop.name.indexOf(' > ') >= 0) {
464
- let dynamicFormSubject;
465
- const arrPropName = prop.name.split(' > ');
466
- let indexPropName = 0;
467
- do {
468
- const control = formArray.controls.find(control => control.get('name').value === arrPropName[indexPropName]);
469
- if (indexPropName === arrPropName.length - 2) {
470
- dynamicFormSubject = control.get('dynamicFormConfig').value;
471
- const dynamicForm = dynamicFormSubject.getValue();
472
- if (dynamicForm.formConfig.find(fc => fc.name === arrPropName[arrPropName.length - 1])) {
473
- if (dynamicForm.setValues) {
474
- dynamicForm.setValues.next(koala(dynamicForm.setValues.getValue()).array().merge([{
475
- name: arrPropName[arrPropName.length - 1],
476
- value: prop.value
477
- }]).getValue());
478
- }
479
- else {
480
- dynamicForm.setValues = new BehaviorSubject([{
481
- name: arrPropName[arrPropName.length - 1],
482
- value: prop.value
483
- }]);
484
- }
485
- }
486
- }
487
- indexPropName++;
488
- } while (indexPropName < arrPropName.length - 1);
489
- }
490
- else {
491
- for (const control of formArray.controls.values()) {
492
- if (control.get('name').value === prop.name) {
493
- control.get('value').setValue(prop.value);
494
- break;
495
- }
496
- }
497
- }
498
- }
499
- }
500
- setConfigDynamicForm(newFormGroup) {
501
- return __awaiter(this, void 0, void 0, function* () {
502
- if (this.showFieldsMoreItensConfig) {
503
- const value = newFormGroup.get('value').value;
504
- const configs = this.showFieldsMoreItensConfig
505
- .filter(config => config.nameField === newFormGroup.get('name').value)
506
- .sort(config => {
507
- if (config.fnShow(value)) {
508
- return 1;
509
- }
510
- return -1;
511
- });
512
- for (const config of configs) {
513
- if (config) {
514
- if (config.dynamicFormConfig && config.fnShow(value)) {
515
- const controlDynamicFormConfig = this.controls
516
- .controls
517
- .find(control => config.fieldsToShow.indexOf(control.get('name').value) >= 0);
518
- const dynamicFormConfigSubject = controlDynamicFormConfig.get('dynamicFormConfig').value;
519
- dynamicFormConfigSubject.next(null);
520
- yield delay(1);
521
- dynamicFormConfigSubject.next(config.dynamicFormConfig(value));
522
- }
523
- this.dynamicFormService.showFields(this.showFields, config.fieldsToShow, config.fnShow(value), config.clearCurrentValue);
524
- }
525
- }
526
- }
527
- });
528
- }
529
- }
530
- DynamicFormComponent.decorators = [
531
- { type: Component, args: [{
532
- selector: 'koala-dynamic-form',
533
- template: "<div [formGroup]=\"form\" class=\"p-relative w-100\">\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=\"off\"\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=\"off\"\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=\"off\"\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\t\t [mat-autosize]=\"true\"\n\t\t [matAutosizeMaxRows]=\"8\"\n\t\t [matAutosizeMinRows]=\"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\t\t [mat-autosize]=\"true\"\n\t\t [matAutosizeMaxRows]=\"8\"\n\t\t [matAutosizeMinRows]=\"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\t <mat-chip\n\t\t (removed)=\"removeOptionOnAutocomplete(i, option)\"\n\t\t *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n\t\t [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n\t\t [removable]=\"true\"\n\t\t [selectable]=\"true\">\n\t {{display(option)}}\n\t\t <mat-icon matChipRemove>cancel</mat-icon>\n\t </mat-chip>\n\t <input\n\t\t #autocompleteInput\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=\"off\"\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=\"off\"\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\t\t <div *ngIf=\"(propriedade.get('autocompleteOptionsFiltered').value | 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(propriedade.get('dynamicFormConfig').value | 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",
534
- changeDetection: ChangeDetectionStrategy.OnPush,
535
- 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:bold;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"]
536
- },] }
537
- ];
538
- DynamicFormComponent.ctorParameters = () => [
539
- { type: FormBuilder },
540
- { type: KoalaDynamicFormService }
541
- ];
542
- DynamicFormComponent.propDecorators = {
543
- form: [{ type: Input }],
544
- formConfig: [{ type: Input }],
545
- showFields: [{ type: Input }],
546
- showFieldsMoreItensConfig: [{ type: Input }],
547
- setValues: [{ type: Input }],
548
- tabIndexStart: [{ type: Input }],
549
- autocompleteInput: [{ type: ViewChild, args: ['autocompleteInput',] }]
550
- };
551
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFhLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFHN0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVF2RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsWUFBWTtJQWNwRCxZQUNVLEVBQWUsRUFDZixrQkFBMkM7UUFFbkQsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUhmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXlCO1FBVjVDLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBRTVCLGNBQVMsR0FBRyx3QkFBd0IsQ0FBQztRQUNyQyx3QkFBbUIsR0FBRyxRQUFRLENBQUM7UUFDL0IsaUJBQVksR0FBRyxtQkFBbUIsQ0FBQztJQVMxQyxDQUFDO0lBRUQsUUFBUTs7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDckQ7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBYyxDQUFDO1FBQ3ZELE1BQUEsSUFBSSxDQUFDLFVBQVUsMENBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFO1lBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFO2dCQUMxQixZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUN0RTtZQUNELFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsV0FBVyxFQUFFO2dCQUN4RCxNQUFNLDRCQUE0QixHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUF5RCxDQUFDO2dCQUNySSw0QkFBNEIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUU7b0JBQ3ZELElBQUksZUFBZSxFQUFFO3dCQUNuQixlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFOzRCQUMvQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFBRTtnQ0FDekYsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ3JFLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUMzQzt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDSjtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFDRSxNQUFNLENBQUMsWUFBWTtnQkFDbkIsTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxZQUFZO2dCQUNyRCxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFdBQVc7Z0JBQ3BELElBQUksQ0FBQyx5QkFBeUIsRUFDOUI7Z0JBQ0EsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFlBQVksRUFBRTtvQkFDekQsTUFBTSwwQkFBMEIsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBb0UsQ0FBQztvQkFDaEosSUFBSSwwQkFBMEIsRUFBRTt3QkFDOUIsMEJBQTBCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztxQkFDdEg7aUJBQ0Y7Z0JBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7cUJBQ1osWUFBWTtxQkFDWixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUN2QixTQUFTLENBQUMsQ0FBTSxLQUFLLEVBQUMsRUFBRTs7b0JBQ3ZCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM5QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFO3dCQUN6RCxJQUNFLEtBQUssSUFBSSxDQUNQLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDOzRCQUM3QixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQzs0QkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUNoQyxJQUFJLENBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7NEJBQ3BCLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUNuQyxFQUFFOzRCQUNILElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0NBQ3RDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQ0FDeEIsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQ0FDL0Q7cUNBQU07b0NBQ0wsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUNBQ2pFO2dDQUNELElBQUksTUFBQSxJQUFJLENBQUMsaUJBQWlCLDBDQUFFLGFBQWEsRUFBRTtvQ0FDekMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2lDQUNqRDs2QkFDRjtpQ0FBTTtnQ0FDTCxZQUFZLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUMvRDt5QkFDRjs2QkFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUU7NEJBQzlDLFlBQVksQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBQSxNQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2lDQUMxRSxLQUFLLEVBQWtDO2lDQUN2QyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO2lDQUM5QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsMENBQUUsK0JBQStCLG1DQUFJLElBQUksQ0FBQyxDQUFDO3lCQUM1RDt3QkFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFOzRCQUN6RCxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLEVBQUU7Z0NBQ3JDLE1BQU0sMEJBQTBCLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEtBQW9FLENBQUM7Z0NBQ2hKLFlBQVksQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FDaEYsMEJBQTBCLENBQUMsS0FBSyxFQUNoQyxLQUFLLENBQ04sQ0FBQyxDQUFDOzZCQUNKO2lDQUFNLElBQUksTUFBTSxDQUFDLGdCQUFnQixLQUFLLFVBQVUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0NBQzlFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFpQyxDQUFDO2dDQUN6RixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNsQixNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29DQUNuRCxZQUFZLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQ0FDcEUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDckIsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO3dCQUN2QixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFOzRCQUN6RCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDcEMsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQ0FDN0UsTUFBQSxZQUFZLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsS0FBSywwQ0FBRSxLQUFLLENBQzlFLENBQUMsQ0FBQzt5QkFDSjs2QkFBTTs0QkFDTCxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUM1QjtxQkFDRjtnQkFDSCxDQUFDLENBQUEsQ0FBQyxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakMsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFO2dCQUMxQixJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7b0JBQ2hDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0JBQ3ZELElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTs0QkFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQzt5QkFDL0I7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRTtvQkFDcEMsTUFBTSxDQUFDLGVBQWU7eUJBQ2YsU0FBUzt5QkFDVCxTQUFTLENBQUMsQ0FBTSxNQUFNLEVBQUMsRUFBRTt3QkFDeEIsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRTtnQ0FDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtvQ0FDakYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQ0FDL0I7Z0NBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQ0FDZCxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLFNBQVMsRUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUNsRixDQUFDO2dDQUNKLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDVixDQUFDLENBQUMsQ0FBQzt5QkFDSjtvQkFDSCxDQUFDLENBQUEsQ0FBQyxDQUFDO2lCQUNWO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekQ7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUVNLHdCQUF3QixDQUFDLEtBQWEsRUFBRSxLQUFvQjs7UUFDakUsTUFBTSxPQUFPLEdBQUcsTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBaUMsQ0FBQztRQUNwRSxJQUFJLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUU7WUFDckQsTUFBTSxLQUFLLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO1lBQzFDLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxXQUFXLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUM7YUFDckM7aUJBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLFdBQVcsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQzthQUNyQztTQUNGO0lBQ0gsQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUFhOztRQUMvQixNQUFNLE9BQU8sR0FBRyxNQUFBLElBQUksQ0FBQyxRQUFRLDBDQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFBLENBQUM7UUFDekQsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BELE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNkLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLHdCQUF3QixDQUFDLElBQUksQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFTSxXQUFXLENBQUMsU0FBaUI7UUFDbEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUM1SSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUNsRSxJQUFJLEVBQUUsU0FBUztnQkFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVTtnQkFDakUsVUFBVSxFQUFFLElBQUksZUFBZSxDQUFxRCxFQUFFLENBQUM7Z0JBQ3ZGLHlCQUF5QixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxDQUFDLGdCQUFnQjthQUN2RixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLENBQ2pFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUMxRSxDQUFDO1lBQ0YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQWMsQ0FBQztZQUNwRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU0sY0FBYyxDQUFDLFNBQWlCLEVBQUUsV0FBVztRQUNsRCxNQUFNLGlCQUFpQixHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEYsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkgsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVNLGlCQUFpQixDQUFDLFNBQWlCOztRQUN4QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsK0JBQStCLG1DQUFJLElBQUksQ0FBQyxDQUFDO1lBQ2hKLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLCtCQUErQixtQ0FBSSxJQUFJLENBQUMsQ0FBQztTQUM3SDtJQUNILENBQUM7SUFFTSxPQUFPLENBQUMsTUFBaUQ7UUFDOUQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sMEJBQTBCLENBQUMsU0FBaUIsRUFBRSxNQUFnRDtRQUNuRyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBK0MsQ0FBQztRQUNySyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkYsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvRDthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3hFO0lBQ0gsQ0FBQztJQUVNLFlBQVksQ0FBQyxNQUEyRDtRQUM3RSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVPLFVBQVUsQ0FBQyxNQUFzQzs7UUFDdkQsSUFBSSxVQUFVLEdBQUcsTUFBQSxNQUFNLENBQUMsY0FBYyxtQ0FBSSxFQUFFLENBQUM7UUFDN0MsSUFBSSxLQUFLLEdBQVEsTUFBQSxNQUFNLENBQUMsS0FBSyxtQ0FBSSxFQUFFLENBQUM7UUFDcEMsSUFBSSx5QkFBeUIsR0FBMEYsQ0FDckgsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQUEsTUFBTSxDQUFDLCtCQUErQixtQ0FBSSxJQUFJLENBQUMsQ0FDeEUsQ0FBQztRQUVGLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUTtZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsSUFBSTtZQUM3QyxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFFBQVE7WUFDakQsTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxJQUFJLEVBQzdDO1lBQ0EsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7Z0JBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUFFO1lBQ3BHLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO2dCQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFBRTtTQUNyRztRQUNELElBQUksTUFBTSxDQUFDLFNBQVM7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxNQUFNLENBQUMsU0FBUztZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUU5RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsR0FBRyxFQUFFO1lBQ2hELFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDL0I7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsSUFBSSxFQUFFO1lBQ3hELFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDaEM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsS0FBSyxFQUFFO1lBQ3pELFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFlBQVksRUFBRTtZQUNoRSxJQUFJLEtBQUssRUFBRTtnQkFDVCx5QkFBeUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsRTtZQUNELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQzVCLFVBQVUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQzthQUNoRDtTQUNGO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFFBQVEsRUFBRTtZQUM1RCxLQUFLLEdBQUcsTUFBQSxNQUFNLENBQUMsS0FBSyxtQ0FBSSxLQUFLLENBQUM7U0FDL0I7UUFFRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsZUFBZTtZQUN4RCxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFDakI7WUFDQSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUU7WUFDNUIsTUFBTSxzQkFBc0IsR0FBRyxFQUFxQyxDQUFDO1lBQ3JFLE1BQU0sQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDaEUsc0JBQXNCLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDNUQsTUFBTSxDQUFDLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO1NBQ25EO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRTtZQUN6QixVQUFVLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDMUIsSUFBSSxFQUFFLENBQUMsSUFBSSxlQUFlLENBQVUsTUFBQSxNQUFNLENBQUMsSUFBSSxtQ0FBSSxJQUFJLENBQUMsQ0FBQztZQUN6RCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3JCLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbkIsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNuQixnQkFBZ0IsRUFBRSxDQUFDO29CQUNqQixJQUFJLEVBQUUsTUFBQSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxnQkFBZ0IsMENBQUUsSUFBSSxtQ0FBSSxhQUFhO29CQUNyRCxJQUFJLEVBQUUsTUFBQSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxnQkFBZ0IsMENBQUUsSUFBSSxtQ0FBSSw2QkFBNkI7b0JBQ3JFLGVBQWUsRUFBRSxNQUFBLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGdCQUFnQiwwQ0FBRSxlQUFlLG1DQUFJLE9BQU87b0JBQ3JFLEtBQUssRUFBRSxNQUFBLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGdCQUFnQiwwQ0FBRSxLQUFLLG1DQUFJLE1BQU07b0JBQ2hELE1BQU0sRUFBRSxNQUFBLE1BQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLGdCQUFnQiwwQ0FBRSxNQUFNLG1DQUFJLEdBQUc7aUJBQ2hELENBQUM7WUFDRixpQkFBaUIsRUFBRSxDQUFDLElBQUksZUFBZSxDQUFrQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNuRyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUMvQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9CLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDakMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNyQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDM0IsUUFBUSxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsUUFBUSxtQ0FBSSxLQUFLLENBQUM7WUFDcEMsR0FBRyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsR0FBRyxtQ0FBSSxDQUFDLENBQUM7WUFDdEIsR0FBRyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsR0FBRyxtQ0FBSSxXQUFXLENBQUM7WUFDaEMsU0FBUyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsU0FBUyxtQ0FBSSxDQUFDLENBQUM7WUFDbEMsU0FBUyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsU0FBUyxtQ0FBSSxHQUFHLENBQUM7WUFDcEMsUUFBUSxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsUUFBUSxtQ0FBSSxLQUFLLENBQUM7WUFDcEMsS0FBSyxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsS0FBSyxtQ0FBSSxLQUFLLENBQUM7WUFDOUIsUUFBUSxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsUUFBUSxtQ0FBSSxLQUFLLENBQUM7WUFDcEMsWUFBWSxFQUFFLENBQUMsTUFBQSxNQUFNLENBQUMsWUFBWSxtQ0FBSSxFQUFFLENBQUM7WUFDekMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDN0UsMkJBQTJCLEVBQUUsQ0FB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LENBQUMsQ0FBQyxDQUFDO3lCQUNoRTt3QkFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUNoQyxJQUFJLENBQUMsVUFBVSxFQUNmLE1BQU0sQ0FBQyxZQUFZLEVBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQ3BCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDekIsQ0FBQztxQkFDSDtpQkFDRjthQUNGO1FBQ0gsQ0FBQztLQUFBOzs7WUFoaUJGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsb0JBQW9CO2dCQUM5Qix3cDVCQUEwQztnQkFFMUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O2FBQ2hEOzs7WUE3Qm1CLFdBQVc7WUFhdEIsdUJBQXVCOzs7bUJBa0I3QixLQUFLO3lCQUNMLEtBQUs7eUJBQ0wsS0FBSzt3Q0FDTCxLQUFLO3dCQUNMLEtBQUs7NEJBQ0wsS0FBSztnQ0FNTCxTQUFTLFNBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtIH0gZnJvbSAnLi9lbnVtcy9keW5hbWljLWZvcm0tdHlwZS1maWVsZC5lbnVtJztcbmltcG9ydCB7IENwZlZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycy9jcGYudmFsaWRhdG9yJztcbmltcG9ydCB7IENucGpWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvY25wai52YWxpZGF0b3InO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQWJzdHJhY3QgfSBmcm9tICcuLi9mb3JtLmFic3RyYWN0JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1zZXQtdmFsdWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL2F1dG9jb21wbGV0ZS1zZWxlY3RlZC52YWxpZGF0b3InO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWF1dG9jb21wbGV0ZS1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1zaG93LWZpZWxkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2VydmljZSB9IGZyb20gJy4va29hbGEuZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybU1vcmVJdGVuc1Nob3dGaWVsZENvbmZpZ0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tbW9yZS1pdGVucy1zaG93LWZpZWxkLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtQXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiQGtvYWxhcngvdXRpbHMvb3BlcmF0b3JzL2RlbGF5XCI7XG5pbXBvcnQgeyBrb2FsYSB9IGZyb20gXCJAa29hbGFyeC91dGlsc1wiO1xuaW1wb3J0IHsgRGF0ZU1pblZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvZGF0ZS1taW4udmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBEYXRlTWF4VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9kYXRlLW1heC52YWxpZGF0b3JcIjtcbmltcG9ydCB7IEtvYWxhTGFuZ3VhZ2VIZWxwZXIgfSBmcm9tIFwiQGtvYWxhcngvdWkvY29yZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdrb2FsYS1keW5hbWljLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydkeW5hbWljLWZvcm0uY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUNvbXBvbmVudCBleHRlbmRzIEZvcm1BYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGZvcm06IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgZm9ybUNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlW107XG4gIEBJbnB1dCgpIHNob3dGaWVsZHM6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlW10+O1xuICBASW5wdXQoKSBzaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtTW9yZUl0ZW5zU2hvd0ZpZWxkQ29uZmlnSW50ZXJmYWNlW107XG4gIEBJbnB1dCgpIHNldFZhbHVlczogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+O1xuICBASW5wdXQoKSB0YWJJbmRleFN0YXJ0OiBudW1iZXIgPSAxO1xuICBwdWJsaWMgY29udHJvbHM6IEZvcm1BcnJheTtcbiAgcHVibGljIHR5cGVGaWVsZCA9IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bTtcbiAgcHVibGljIGhvdXJzQW5kTWludXRlc01hc2sgPSAnMDA6MDAwJztcbiAgcHVibGljIGVycm9yTWVzc2FnZSA9IEtvYWxhTGFuZ3VhZ2VIZWxwZXI7XG5cbiAgQFZpZXdDaGlsZCgnYXV0b2NvbXBsZXRlSW5wdXQnKSBhdXRvY29tcGxldGVJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGR5bmFtaWNGb3JtU2VydmljZTogS29hbGFEeW5hbWljRm9ybVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKCkgPT4gdGhpcy5mb3JtKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSkge1xuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ2Zvcm1EYXRhJywgdGhpcy5mYi5hcnJheShbXSkpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRyb2xzID0gdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSBhcyBGb3JtQXJyYXk7XG4gICAgdGhpcy5mb3JtQ29uZmlnPy5mb3JFYWNoKChjb25maWcsIGluZGV4Q29uZmlnKSA9PiB7XG4gICAgICBjb25zdCBuZXdGb3JtR3JvdXAgPSB0aGlzLm5ld0NvbnRyb2woY29uZmlnKTtcbiAgICAgIGlmIChjb25maWcuYXN5bmNWYWxpZGF0b3JzKSB7XG4gICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykuc2V0QXN5bmNWYWxpZGF0b3JzKGNvbmZpZy5hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgfVxuICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSkge1xuICAgICAgICBjb25zdCBmb3JtR3JvdXBEeW5hbWljRm9ybXNTdWJqZWN0ID0gbmV3Rm9ybUdyb3VwLmdldCgnZHluYW1pY0Zvcm1Db25maWcnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT47XG4gICAgICAgIGZvcm1Hcm91cER5bmFtaWNGb3Jtc1N1YmplY3Quc3Vic2NyaWJlKGZvcm1Hcm91cENvbmZpZyA9PiB7XG4gICAgICAgICAgaWYgKGZvcm1Hcm91cENvbmZpZykge1xuICAgICAgICAgICAgZm9ybUdyb3VwQ29uZmlnLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChmb3JtR3JvdXBDb25maWcuZm9ybS52YWxpZCAmJiAoY29uZmlnLnZhbHVlQ2hhbmdlcyB8fCB0aGlzLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5lbWl0RGF0YShmb3JtR3JvdXBDb25maWcuZm9ybSk7XG4gICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy52YWx1ZUNoYW5nZXMgfHxcbiAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUgfHxcbiAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSB8fFxuICAgICAgICB0aGlzLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWdcbiAgICAgICkge1xuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICBjb25zdCBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdCA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnMnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdPjtcbiAgICAgICAgICBpZiAoYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QpIHtcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0LnN1YnNjcmliZShvcHRpb25zID0+IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpXG4gICAgICAgICAgICAgICAgICAgIC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q29uZmlnRHluYW1pY0Zvcm0obmV3Rm9ybUdyb3VwKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuaGFzT3duUHJvcGVydHkoJ25hbWUnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0Zvcm1Hcm91cC5nZXQoJ211bHRpcGxlJykudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS52YWx1ZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0b2NvbXBsZXRlSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZShrb2FsYSh0aGlzLmZvcm1Db25maWcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFycmF5PEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZT4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobmV3Rm9ybUdyb3VwLmdldCgnbmFtZScpLnZhbHVlLCAnbmFtZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKClbMF0/LmF1dG9jb21wbGV0ZURlZmF1bHRWYWx1ZU9uQ2xlYXIgPz8gbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmF1dG9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZVR5cGUgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXT47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkJykudmFsdWUubmV4dCh0aGlzLmF1dG9jb21wbGV0ZUZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuYXV0b2NvbXBsZXRlVHlwZSA9PT0gJ29uRGVtYW5kJyAmJiB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZXIgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVMb2FkaW5nJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5hdXRvY29tcGxldGVGaWx0ZXIodmFsdWUpLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy52YWx1ZUNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmF1dG9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudmFsdWVDaGFuZ2VzKChuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLm1hcChpdGVtID0+IGl0ZW0udmFsdWUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlPy52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWx1ZUNoYW5nZXModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRyb2xzLnB1c2gobmV3Rm9ybUdyb3VwKTtcbiAgICAgIGlmIChjb25maWcubW9yZUl0ZW1zQ29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcubW9yZUl0ZW1zTWluSXRlbXMgPiAwKSB7XG4gICAgICAgICAgZm9yIChsZXQgbWluID0gMDsgbWluIDwgY29uZmlnLm1vcmVJdGVtc01pbkl0ZW1zOyBtaW4rKykge1xuICAgICAgICAgICAgaWYgKG1pbiA8PSBjb25maWcubW9yZUl0ZW1zTWF4SXRlbXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRNb3JlSXRlbShpbmRleENvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcubW9yZUl0ZW1zQ29uZmlnLnNldFZhbHVlcykge1xuICAgICAgICAgIGNvbmZpZy5tb3JlSXRlbXNDb25maWdcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWVzXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyB2YWx1ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKChpdGVtVmFsdWUsIGluZGV4VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udHJvbHMuY29udHJvbHNbaW5kZXhDb25maWddLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWVbaW5kZXhWYWx1ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZUl0ZW0oaW5kZXhDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVzT25GaWVsZHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1tpbmRleENvbmZpZ10uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZVtpbmRleFZhbHVlXS5mb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuc2hvd0ZpZWxkcykge1xuICAgICAgdGhpcy5jaGFuZ2VWaXNpYmlsaXR5RmllbGRzKHRoaXMuc2hvd0ZpZWxkcywgdGhpcy5mb3JtKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2V0VmFsdWVzKSB7XG4gICAgICB0aGlzLnNldFZhbHVlc09uRmllbGRzKHRoaXMuc2V0VmFsdWVzLCB0aGlzLmZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBob3Vyc0FuZE1pbnV0ZXNBcHBseU1hc2soaW5kZXg6IG51bWJlciwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9scz8uY29udHJvbHNbaW5kZXhdO1xuICAgIGNvbnN0IHR5cGUgPSBjb250cm9sPy5nZXQoJ3R5cGUnKS52YWx1ZSBhcyBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW07XG4gICAgaWYgKHR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5ob3Vyc0FuZE1pbnV0ZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbD8uZ2V0KCd2YWx1ZScpLnZhbHVlO1xuICAgICAgaWYgKGV2ZW50LmtleSA9PSAnQmFja3NwYWNlJyAmJiB2YWx1ZS5sZW5ndGggPCA2KSB7XG4gICAgICAgIHRoaXMuaG91cnNBbmRNaW51dGVzTWFzayA9ICcwMDowMDAnO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgIT0gJ0JhY2tzcGFjZScgJiYgdmFsdWUubGVuZ3RoID49IDYpIHtcbiAgICAgICAgdGhpcy5ob3Vyc0FuZE1pbnV0ZXNNYXNrID0gJzAwMDowMCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBhc3N3b3JkVmlldyhpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuY29udHJvbHM/LmNvbnRyb2xzW2luZGV4XTtcbiAgICBjb25zdCBoaWRlUGFzc3dvcmQgPSAhY29udHJvbD8uZ2V0KCdoaWRlUGFzc3dvcmQnKS52YWx1ZTtcbiAgICBjb250cm9sPy5nZXQoJ2hpZGVQYXNzd29yZCcpLnNldFZhbHVlKGhpZGVQYXNzd29yZCk7XG4gICAgY29udHJvbD8uZ2V0KCd0eXBlJykuc2V0VmFsdWUoaGlkZVBhc3N3b3JkID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0ucGFzc3dvcmQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS50ZXh0XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNb3JlSXRlbShwcm9wSW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggPCB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNNYXhJdGVtcycpLnZhbHVlKSB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLnB1c2goe1xuICAgICAgICBmb3JtOiBmb3JtR3JvdXAsXG4gICAgICAgIGZvcm1Db25maWc6IHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLm1vcmVJdGVtc0NvbmZpZy5mb3JtQ29uZmlnLFxuICAgICAgICBzaG93RmllbGRzOiBuZXcgQmVoYXZpb3JTdWJqZWN0PEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNTZXRWYWx1ZUludGVyZmFjZVtdPltdPihbXSksXG4gICAgICAgIHNob3dGaWVsZHNNb3JlSXRlbnNDb25maWc6IHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLm1vcmVJdGVtc0NvbmZpZy5zaG93RmllbGRzQ29uZmlnXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0V4cGFuZGVkJykuc2V0VmFsdWUoXG4gICAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLmxlbmd0aCAtIDFcbiAgICAgICk7XG4gICAgICBjb25zdCBmb3JtQXJyYXlNb3JlSXRlbXMgPSB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNGb3JtR3JvdXAnKSBhcyBGb3JtQXJyYXk7XG4gICAgICBmb3JtQXJyYXlNb3JlSXRlbXMucHVzaChmb3JtR3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVNb3JlSXRlbShwcm9wSW5kZXg6IG51bWJlciwgcmVtb3ZlSW5kZXgpIHtcbiAgICBjb25zdCBleHBhbmRlZEl0ZW1JbmRleCA9IHJlbW92ZUluZGV4IC0gMTtcbiAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zRXhwYW5kZWQnKS5zZXRWYWx1ZSgoZXhwYW5kZWRJdGVtSW5kZXggPCAwKSA/IDAgOiBleHBhbmRlZEl0ZW1JbmRleCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgcHVibGljIGNsZWFyQXV0b2NvbXBsZXRlKHByb3BJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ211bHRpcGxlJykudmFsdWUpIHtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0uYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUodGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0uYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcGxheShvcHRpb24/OiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLm5hbWUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlT3B0aW9uT25BdXRvY29tcGxldGUocHJvcEluZGV4OiBudW1iZXIsIG9wdGlvbjogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IG9wdGlvbikgYXMgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdO1xuICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUobnVsbCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS52YWx1ZUNoYW5nZXMpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLnZhbHVlQ2hhbmdlcyh2YWx1ZS5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENvbG9yQ2hpcChjb25maWc6IEtvYWxhRHluYW1pY0Zvcm1BdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZ0ludGVyZmFjZSk6IFRoZW1lUGFsZXR0ZSB7XG4gICAgcmV0dXJuIGNvbmZpZy5jb2xvcjtcbiAgfVxuXG4gIHByaXZhdGUgbmV3Q29udHJvbChjb25maWc6IEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZSk6IEZvcm1Hcm91cCB7XG4gICAgbGV0IHZhbGlkYXRvcnMgPSBjb25maWcuc3luY1ZhbGlkYXRvcnMgPz8gW107XG4gICAgbGV0IHZhbHVlOiBhbnkgPSBjb25maWcudmFsdWUgPz8gJyc7XG4gICAgbGV0IHZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGU6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UgfCBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10gPSAoXG4gICAgICBjb25maWcubXVsdGlwbGUgPyBbXSA6IChjb25maWcuYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKVxuICAgICk7XG5cbiAgICBpZiAoY29uZmlnLnJlcXVpcmVkID09PSB0cnVlKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwibnVtYmVyXCIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbihjb25maWcubWluKSk7XG4gICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwibnVtYmVyXCIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heChjb25maWcubWF4KSk7XG4gICAgaWYgKFxuICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5kYXRlIHx8XG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmRhdGV0aW1lIHx8XG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRpbWVcbiAgICApIHtcbiAgICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcInN0cmluZ1wiKSB7IHZhbGlkYXRvcnMucHVzaChEYXRlTWluVmFsaWRhdG9yKGNvbmZpZy5taW4pKTsgfVxuICAgICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNYXhWYWxpZGF0b3IoY29uZmlnLm1heCkpOyB9XG4gICAgfVxuICAgIGlmIChjb25maWcubWluTGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoY29uZmlnLm1pbkxlbmd0aCkpO1xuICAgIGlmIChjb25maWcubWF4TGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoY29uZmlnLm1heExlbmd0aCkpO1xuXG4gICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY3BmKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goQ3BmVmFsaWRhdG9yKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY25waikge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKENucGpWYWxpZGF0b3IpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5lbWFpbCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlID0gdmFsdWU7XG4gICAgICAgIHZhbHVlID0gKGNvbmZpZy5tdWx0aXBsZSA/IHZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGVbMF0gOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChBdXRvY29tcGxldGVTZWxlY3RlZFZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNoZWNrYm94KSB7XG4gICAgICB2YWx1ZSA9IGNvbmZpZy52YWx1ZSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmhvdXJzQW5kTWludXRlcyAmJlxuICAgICAgdmFsdWUubGVuZ3RoID49IDZcbiAgICApIHtcbiAgICAgIHRoaXMuaG91cnNBbmRNaW51dGVzTWFzayA9ICcwMDA6MDAnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZHluYW1pY0Zvcm1Db25maWcpIHtcbiAgICAgIGNvbnN0IGNsb25lRHluYW1pY0Zvcm1Db25maWcgPSB7fSBhcyBLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlO1xuICAgICAgT2JqZWN0LmFzc2lnbihjbG9uZUR5bmFtaWNGb3JtQ29uZmlnLCBjb25maWcuZHluYW1pY0Zvcm1Db25maWcpO1xuICAgICAgY2xvbmVEeW5hbWljRm9ybUNvbmZpZy5mb3JtID0gY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnLmZvcm07XG4gICAgICBjb25maWcuZHluYW1pY0Zvcm1Db25maWcgPSBjbG9uZUR5bmFtaWNGb3JtQ29uZmlnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuc2hvdyA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbGlkYXRvcnMgPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgc2hvdzogW25ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oY29uZmlnLnNob3cgPz8gdHJ1ZSldLFxuICAgICAgbGFiZWw6IFtjb25maWcubGFiZWxdLFxuICAgICAgbmFtZTogW2NvbmZpZy5uYW1lXSxcbiAgICAgIHR5cGU6IFtjb25maWcudHlwZV0sXG4gICAgICBmaWxlQnV0dG9uQ29uZmlnOiBbe1xuICAgICAgICBpY29uOiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/Lmljb24gPz8gJ2F0dGFjaF9maWxlJyxcbiAgICAgICAgdGV4dDogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy50ZXh0ID8/ICdDbGlxdWUgcGFyYSBhbmV4YXIgYXJxdWl2b3MnLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8uYmFja2dyb3VuZENvbG9yID8/ICd3aGl0ZScsXG4gICAgICAgIGNvbG9yOiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LmNvbG9yID8/ICdibHVlJyxcbiAgICAgICAgYWNjZXB0OiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LmFjY2VwdCA/PyAnKidcbiAgICAgIH1dLFxuICAgICAgZHluYW1pY0Zvcm1Db25maWc6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+KGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyldLFxuICAgICAgZHluYW1pY0Zvcm1Hcm91cDogdGhpcy5mYi5hcnJheShbXSksXG4gICAgICBhcHBlYXJhbmNlOiBbY29uZmlnLmFwcGVhcmFuY2VdLFxuICAgICAgZmxvYXRMYWJlbDogW2NvbmZpZy5mbG9hdExhYmVsXSxcbiAgICAgIHBsYWNlaG9sZGVyOiBbY29uZmlnLnBsYWNlaG9sZGVyXSxcbiAgICAgIGNsYXNzOiBbY29uZmlnLmNsYXNzXSxcbiAgICAgIGZpZWxkQ2xhc3M6IFtjb25maWcuZmllbGRDbGFzc10sXG4gICAgICB0ZXh0SGludDogW2NvbmZpZy50ZXh0SGludF0sXG4gICAgICByZXF1aXJlZDogW2NvbmZpZy5yZXF1aXJlZCA/PyBmYWxzZV0sXG4gICAgICBtaW46IFtjb25maWcubWluID8/IDBdLFxuICAgICAgbWF4OiBbY29uZmlnLm1heCA/PyA5OTk5OTk5OTk5OV0sXG4gICAgICBtaW5MZW5ndGg6IFtjb25maWcubWluTGVuZ3RoID8/IDBdLFxuICAgICAgbWF4TGVuZ3RoOiBbY29uZmlnLm1heExlbmd0aCA/PyAyNTVdLFxuICAgICAgZGlzYWJsZWQ6IFtjb25maWcuZGlzYWJsZWQgPz8gZmFsc2VdLFxuICAgICAgZm9jdXM6IFtjb25maWcuZm9jdXMgPz8gZmFsc2VdLFxuICAgICAgbXVsdGlwbGU6IFtjb25maWcubXVsdGlwbGUgPz8gZmFsc2VdLFxuICAgICAgb3Bjb2VzU2VsZWN0OiBbY29uZmlnLm9wY29lc1NlbGVjdCA/PyBbXV0sXG4gICAgICBoaWRlUGFzc3dvcmQ6IGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0ucGFzc3dvcmQgPyB0cnVlIDogbnVsbCxcbiAgICAgIG1vcmVJdGVtc0J1dHRvbkljb25BZGRsYWJlbDogW2NvbmZpZy5tb3JlSXRlbXNCdXR0b25JY29uQWRkbGFiZWxdLFxuICAgICAgbW9yZUl0ZW1zTWluSXRlbXM6IFtjb25maWcubW9yZUl0ZW1zTWluSXRlbXMgPz8gMF0sXG4gICAgICBtb3JlSXRlbXNNYXhJdGVtczogW2NvbmZpZy5tb3JlSXRlbXNNYXhJdGVtcyA/PyAxMDBdLFxuICAgICAgbW9yZUl0ZW1zSWNvbjogW2NvbmZpZy5tb3JlSXRlbXNJY29uXSxcbiAgICAgIG1vcmVJdGVtc0ljb25Gb250Q29sb3I6IFtjb25maWcubW9yZUl0ZW1zSWNvbkZvbnRDb2xvcl0sXG4gICAgICBtb3JlSXRlbXNJY29uQmFja2dyb3VuZENvbG9yOiBbY29uZmlnLm1vcmVJdGVtc0ljb25CYWNrZ3JvdW5kQ29sb3JdLFxuICAgICAgbW9yZUl0ZW1zRXhwYW5kZWQ6IFsnJ10sXG4gICAgICBtb3JlSXRlbXNDb25maWc6IFtbXV0sXG4gICAgICBtb3JlSXRlbXNGb3JtR3JvdXA6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgYXV0b2NvbXBsZXRlTG9hZGluZzogW25ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpXSxcbiAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnM6IFtjb25maWcuYXV0b2NvbXBsZXRlT3B0aW9uc10sXG4gICAgICBhdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZzogW2NvbmZpZy5hdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZ10sXG4gICAgICBhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQ6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oW10pXSxcbiAgICAgIGF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWU6IFt2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlXSxcbiAgICAgIHRleHRMb2dzOiBbY29uZmlnPy50ZXh0T2JzXSxcbiAgICAgIGN1c3RvbU1hc2M6IFtjb25maWc/LmN1c3RvbU1hc2NdLFxuICAgICAgY3VzdG9tTWFzY1Rob3VzYW5kU2VwYXJhdG9yOiBbY29uZmlnPy5jdXN0b21NYXNjVGhvdXNhbmRTZXBhcmF0b3IgPz8gJyddLFxuICAgICAgY3VzdG9tTWFzY1N1ZmZpeDogW2NvbmZpZz8uY3VzdG9tTWFzY1N1ZmZpeCA/PyAnJ10sXG4gICAgICBjdXN0b21NYXNjUHJlZml4OiBbY29uZmlnPy5jdXN0b21NYXNjUHJlZml4ID8/ICcnXSxcbiAgICAgIHZhbHVlOiBbe3ZhbHVlLCBkaXNhYmxlZDogY29uZmlnLmRpc2FibGVkfSwgdmFsaWRhdG9ycywgY29uZmlnLmFzeW5jVmFsaWRhdG9yc11cbiAgICB9KTtcblxuICAgIGlmIChjb25maWcuYXV0b2NvbXBsZXRlVHlwZSA9PT0gXCJvbkRlbWFuZFwiKSB7XG4gICAgICBjb25zdCBsb2FkZXIgPSBmaWVsZC5nZXQoJ2F1dG9jb21wbGV0ZUxvYWRpbmcnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gICAgICBsb2FkZXIubmV4dCh0cnVlKTtcbiAgICAgIGNvbmZpZy5hdXRvY29tcGxldGVGaWx0ZXIoJycpLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgZmllbGQuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZS5uZXh0KG9wdGlvbnMpO1xuICAgICAgICBsb2FkZXIubmV4dChmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGQ7XG4gIH1cblxuICBwcml2YXRlIHNldFZhbHVlc09uRmllbGRzKHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNTZXRWYWx1ZUludGVyZmFjZVtdPiwgZm9ybTogRm9ybUdyb3VwKSB7XG4gICAgc3ViamVjdC5zdWJzY3JpYmUoaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtLmdldCgnZm9ybURhdGEnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBpdGVtLnZhbHVlcygpKSB7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZUJ5UHJvcChmb3JtQXJyYXksIHByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZVZpc2liaWxpdHlGaWVsZHMoc3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1TaG93RmllbGRJbnRlcmZhY2VbXT4sIGZvcm06IEZvcm1Hcm91cCkge1xuICAgIHN1YmplY3QucGlwZShkZWJvdW5jZVRpbWUoNSkpLnN1YnNjcmliZShpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IGZvcm0uZ2V0KCdmb3JtRGF0YScpIGFzIEZvcm1BcnJheTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGl0ZW0udmFsdWVzKCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleENvbnRyb2wsIGNvbnRyb2xdIG9mIGZvcm1BcnJheS5jb250cm9scy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLmdldCgnbmFtZScpLnZhbHVlID09PSBwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3Nob3cnKS52YWx1ZS5uZXh0KHByb3Auc2hvdyk7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlID0gdGhpcy5mb3JtQ29uZmlnW2luZGV4Q29udHJvbF0gPz8gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKHByb3Auc2hvdykge1xuICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0b3JzID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUFycmF5TW9yZUl0ZW1zID0gY29udHJvbC5nZXQoJ2R5bmFtaWNGb3JtR3JvdXAnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1BcnJheU1vcmVJdGVtcy5wdXNoKGNvbmZpZz8uZHluYW1pY0Zvcm1Db25maWc/LmZvcm0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycyA9IGNvbmZpZy5zeW5jVmFsaWRhdG9ycyA/PyBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5yZXF1aXJlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jcGYpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goQ3BmVmFsaWRhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNucGopIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goQ25walZhbGlkYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5lbWFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcucmVxdWlyZWQgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goQXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwibnVtYmVyXCIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbihjb25maWcubWluKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWF4ICYmIHR5cGVvZiBjb25maWcubWF4ID09PSBcIm51bWJlclwiKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXgoY29uZmlnLm1heCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5kYXRlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5kYXRldGltZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0udGltZVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1pbiAmJiB0eXBlb2YgY29uZmlnLm1pbiA9PT0gXCJzdHJpbmdcIikgeyB2YWxpZGF0b3JzLnB1c2goRGF0ZU1pblZhbGlkYXRvcihjb25maWcubWluKSk7IH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1heCAmJiB0eXBlb2YgY29uZmlnLm1heCA9PT0gXCJzdHJpbmdcIikgeyB2YWxpZGF0b3JzLnB1c2goRGF0ZU1heFZhbGlkYXRvcihjb25maWcubWF4KSk7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1pbkxlbmd0aCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKGNvbmZpZy5taW5MZW5ndGgpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYXhMZW5ndGgpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aChjb25maWcubWF4TGVuZ3RoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hc3luY1ZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRBc3luY1ZhbGlkYXRvcnMoY29uZmlnLmFzeW5jVmFsaWRhdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHByb3AuY2xlYXJDdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLmNsZWFyQXN5bmNWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ2R5bmFtaWNGb3JtR3JvdXAnKTtcbiAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5hZGRDb250cm9sKCdkeW5hbWljRm9ybUdyb3VwJywgdGhpcy5mYi5hcnJheShbXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b2NvbXBsZXRlRmlsdGVyKGFycjogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdLCB2YWx1ZTogc3RyaW5nKTogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdIHtcbiAgICByZXR1cm4gYXJyLmZpbHRlcihmaWx0ZXIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgIGxldCBmaW5kID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAuc3BsaXQoJyAnKVxuICAgICAgICAgICAgICAgLmZvckVhY2gocGFydCA9PiB7XG4gICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YocGFydCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgZmluZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gZmluZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFZhbHVlQnlQcm9wKGZvcm1BcnJheTogRm9ybUFycmF5LCBwcm9wOiBLb2FsYUR5bmFtaWNTZXRWYWx1ZUludGVyZmFjZSkge1xuICAgIGlmIChmb3JtQXJyYXkpIHtcbiAgICAgIGlmIChwcm9wLm5hbWUuaW5kZXhPZignID4gJykgPj0gMCkge1xuICAgICAgICBsZXQgZHluYW1pY0Zvcm1TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT47XG4gICAgICAgIGNvbnN0IGFyclByb3BOYW1lID0gcHJvcC5uYW1lLnNwbGl0KCcgPiAnKTtcbiAgICAgICAgbGV0IGluZGV4UHJvcE5hbWUgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm1BcnJheS5jb250cm9scy5maW5kKGNvbnRyb2wgPT4gY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSA9PT0gYXJyUHJvcE5hbWVbaW5kZXhQcm9wTmFtZV0pO1xuICAgICAgICAgIGlmIChpbmRleFByb3BOYW1lID09PSBhcnJQcm9wTmFtZS5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICBkeW5hbWljRm9ybVN1YmplY3QgPSBjb250cm9sLmdldCgnZHluYW1pY0Zvcm1Db25maWcnKS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGb3JtID0gZHluYW1pY0Zvcm1TdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoZHluYW1pY0Zvcm0uZm9ybUNvbmZpZy5maW5kKGZjID0+IGZjLm5hbWUgPT09IGFyclByb3BOYW1lW2FyclByb3BOYW1lLmxlbmd0aCAtIDFdKSkge1xuICAgICAgICAgICAgICBpZiAoZHluYW1pY0Zvcm0uc2V0VmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgZHluYW1pY0Zvcm0uc2V0VmFsdWVzLm5leHQoa29hbGEoZHluYW1pY0Zvcm0uc2V0VmFsdWVzLmdldFZhbHVlKCkpLmFycmF5PGFueT4oKS5tZXJnZShbe1xuICAgICAgICAgICAgICAgICAgbmFtZTogYXJyUHJvcE5hbWVbYXJyUHJvcE5hbWUubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcC52YWx1ZVxuICAgICAgICAgICAgICAgIH1dKS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljRm9ybS5zZXRWYWx1ZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+KFt7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBhcnJQcm9wTmFtZVthcnJQcm9wTmFtZS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wLnZhbHVlXG4gICAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4UHJvcE5hbWUrKztcbiAgICAgICAgfSB3aGlsZSAoaW5kZXhQcm9wTmFtZSA8IGFyclByb3BOYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIGZvcm1BcnJheS5jb250cm9scy52YWx1ZXMoKSkge1xuICAgICAgICAgIGlmIChjb250cm9sLmdldCgnbmFtZScpLnZhbHVlID09PSBwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKHByb3AudmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRDb25maWdEeW5hbWljRm9ybShuZXdGb3JtR3JvdXA6IEZvcm1Hcm91cCkge1xuICAgIGlmICh0aGlzLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWcpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS52YWx1ZTtcbiAgICAgIGNvbnN0IGNvbmZpZ3MgPSB0aGlzLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjb25maWcgPT4gY29uZmlnLm5hbWVGaWVsZCA9PT0gbmV3Rm9ybUdyb3VwLmdldCgnbmFtZScpLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydChjb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuZm5TaG93KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICBpZiAoY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnICYmIGNvbmZpZy5mblNob3codmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sRHluYW1pY0Zvcm1Db25maWcgPSB0aGlzLmNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoY29udHJvbCA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZpZWxkc1RvU2hvdy5pbmRleE9mKGNvbnRyb2wuZ2V0KCduYW1lJykudmFsdWUpID49IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZHluYW1pY0Zvcm1Db25maWdTdWJqZWN0ID0gY29udHJvbER5bmFtaWNGb3JtQ29uZmlnLmdldCgnZHluYW1pY0Zvcm1Db25maWcnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT47XG4gICAgICAgICAgICBkeW5hbWljRm9ybUNvbmZpZ1N1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KDEpO1xuICAgICAgICAgICAgZHluYW1pY0Zvcm1Db25maWdTdWJqZWN0Lm5leHQoY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnKHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLnNob3dGaWVsZHMoXG4gICAgICAgICAgICB0aGlzLnNob3dGaWVsZHMsXG4gICAgICAgICAgICBjb25maWcuZmllbGRzVG9TaG93LFxuICAgICAgICAgICAgY29uZmlnLmZuU2hvdyh2YWx1ZSksXG4gICAgICAgICAgICBjb25maWcuY2xlYXJDdXJyZW50VmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=