@mediusinc/mng-commons 1.2.0 → 1.4.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 (383) hide show
  1. package/assets/i18n/en.json +9 -0
  2. package/assets/i18n/sl.json +9 -0
  3. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  4. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  5. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  6. package/esm2020/lib/api/models/index.mjs +8 -8
  7. package/esm2020/lib/api/models/mappers.mjs +12 -12
  8. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  9. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  10. package/esm2020/lib/api/models/query-result.model.mjs +23 -23
  11. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  12. package/esm2020/lib/api/services/api.abstract.service.mjs +57 -57
  13. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +74 -74
  14. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +29 -29
  15. package/esm2020/lib/api/services/index.mjs +3 -3
  16. package/esm2020/lib/api/utils/index.mjs +2 -2
  17. package/esm2020/lib/api/utils/medius-rest.util.mjs +212 -212
  18. package/esm2020/lib/api/utils/object-serializer.util.mjs +247 -247
  19. package/esm2020/lib/components/action/action.component.mjs +275 -225
  20. package/esm2020/lib/components/action/editor/action-editor.component.mjs +302 -302
  21. package/esm2020/lib/components/action/index.mjs +4 -4
  22. package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +44 -44
  23. package/esm2020/lib/components/action/models/action-component.model.mjs +1 -1
  24. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  25. package/esm2020/lib/components/action/models/action-execution.model.mjs +248 -248
  26. package/esm2020/lib/components/action/models/index.mjs +4 -4
  27. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +10 -10
  28. package/esm2020/lib/components/action/route/action-route.component.mjs +129 -129
  29. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +299 -299
  30. package/esm2020/lib/components/form/date-range/date-range.component.mjs +108 -108
  31. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +193 -193
  32. package/esm2020/lib/components/form/editor/form-editor.component.mjs +242 -242
  33. package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +38 -38
  34. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +49 -49
  35. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +44 -44
  36. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +25 -25
  37. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +149 -149
  38. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +23 -23
  39. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +186 -181
  40. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +197 -178
  41. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +154 -149
  42. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  43. package/esm2020/lib/components/form/formly/fields/index.mjs +10 -10
  44. package/esm2020/lib/components/form/formly/formly.config.mjs +211 -211
  45. package/esm2020/lib/components/form/formly/index.mjs +1 -1
  46. package/esm2020/lib/components/form/formly/models/formly-config.model.mjs +1 -1
  47. package/esm2020/lib/components/form/formly/models/formly-field.model.mjs +1 -1
  48. package/esm2020/lib/components/form/formly/models/index.mjs +2 -2
  49. package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +14 -14
  50. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +82 -82
  51. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  52. package/esm2020/lib/components/form/index.mjs +4 -4
  53. package/esm2020/lib/components/form/models/field-action-context.model.mjs +1 -1
  54. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  55. package/esm2020/lib/components/form/models/form-editor.interface.mjs +1 -1
  56. package/esm2020/lib/components/form/models/index.mjs +2 -2
  57. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  58. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  59. package/esm2020/lib/components/layout/index.mjs +7 -7
  60. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  61. package/esm2020/lib/components/layout/menu-item.component.mjs +271 -271
  62. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  63. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  64. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +194 -194
  65. package/esm2020/lib/components/layout/topbar.component.mjs +64 -64
  66. package/esm2020/lib/components/layout/version.component.mjs +57 -57
  67. package/esm2020/lib/components/tableview/index.mjs +6 -6
  68. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  69. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  70. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +147 -122
  71. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +52 -52
  72. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +119 -119
  73. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +84 -84
  74. package/esm2020/lib/components/tableview/table/table.component.mjs +595 -594
  75. package/esm2020/lib/components/tableview/tableview.component.mjs +112 -112
  76. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  77. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  78. package/esm2020/lib/data-providers/index.mjs +6 -6
  79. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  80. package/esm2020/lib/data-providers/table.data-provider.mjs +37 -37
  81. package/esm2020/lib/data-providers/tableview-crud.data-provider.mjs +23 -23
  82. package/esm2020/lib/data-providers/tableview.data-provider.mjs +44 -44
  83. package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +76 -76
  84. package/esm2020/lib/descriptors/action-button.descriptor.mjs +59 -59
  85. package/esm2020/lib/descriptors/action.descriptor.mjs +577 -560
  86. package/esm2020/lib/descriptors/column.descriptor.mjs +405 -405
  87. package/esm2020/lib/descriptors/editor.descriptor.mjs +289 -289
  88. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +24 -24
  89. package/esm2020/lib/descriptors/field.descriptor.mjs +986 -986
  90. package/esm2020/lib/descriptors/filter.descriptor.mjs +368 -321
  91. package/esm2020/lib/descriptors/index.mjs +11 -11
  92. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  93. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  94. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  95. package/esm2020/lib/descriptors/model.descriptor.mjs +44 -44
  96. package/esm2020/lib/descriptors/table.descriptor.mjs +497 -482
  97. package/esm2020/lib/descriptors/tableview.descriptor.mjs +343 -343
  98. package/esm2020/lib/descriptors/types/action.type.mjs +25 -25
  99. package/esm2020/lib/descriptors/types/column.type.mjs +20 -20
  100. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  101. package/esm2020/lib/descriptors/types/field.type.mjs +55 -55
  102. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  103. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  104. package/esm2020/lib/descriptors/types/table.type.mjs +26 -26
  105. package/esm2020/lib/directives/component.directive.mjs +43 -43
  106. package/esm2020/lib/directives/index.mjs +2 -2
  107. package/esm2020/lib/directives/template.directive.mjs +27 -27
  108. package/esm2020/lib/mng-commons.module.mjs +485 -475
  109. package/esm2020/lib/models/column-value.model.mjs +1 -1
  110. package/esm2020/lib/models/config.model.mjs +1 -1
  111. package/esm2020/lib/models/enum.model.mjs +1 -1
  112. package/esm2020/lib/models/error.model.mjs +1 -1
  113. package/esm2020/lib/models/index.mjs +9 -9
  114. package/esm2020/lib/models/menu.model.mjs +1 -1
  115. package/esm2020/lib/models/tableview-attr.model.mjs +1 -1
  116. package/esm2020/lib/models/user.model.mjs +1 -1
  117. package/esm2020/lib/models/version.model.mjs +1 -1
  118. package/esm2020/lib/models/view-container.model.mjs +1 -1
  119. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  120. package/esm2020/lib/pipes/class-map.pipe.mjs +21 -21
  121. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  122. package/esm2020/lib/pipes/enumerate-async.pipe.mjs +37 -37
  123. package/esm2020/lib/pipes/enumerate.pipe.mjs +54 -54
  124. package/esm2020/lib/pipes/getter.pipe.mjs +19 -19
  125. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  126. package/esm2020/lib/pipes/index.mjs +11 -11
  127. package/esm2020/lib/pipes/json-path.pipe.mjs +78 -78
  128. package/esm2020/lib/pipes/locale-default-row-class.pipe.mjs +25 -25
  129. package/esm2020/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +1 -1
  130. package/esm2020/lib/pipes/models/internal/index.mjs +1 -1
  131. package/esm2020/lib/pipes/parametrize.pipe.mjs +84 -84
  132. package/esm2020/lib/pipes/template.pipe.mjs +23 -23
  133. package/esm2020/lib/router/index.mjs +2 -2
  134. package/esm2020/lib/router/models/index.mjs +1 -1
  135. package/esm2020/lib/router/models/router.model.mjs +1 -1
  136. package/esm2020/lib/router/route-builder.mjs +425 -425
  137. package/esm2020/lib/router/tableview-route-builder.mjs +186 -186
  138. package/esm2020/lib/security/authorization.guard.mjs +25 -25
  139. package/esm2020/lib/security/authorization.service.mjs +46 -46
  140. package/esm2020/lib/security/authorization.util.mjs +15 -15
  141. package/esm2020/lib/security/index.mjs +3 -3
  142. package/esm2020/lib/security/model/authorization.type.mjs +7 -7
  143. package/esm2020/lib/security/model/index.mjs +3 -3
  144. package/esm2020/lib/security/model/permission-service.interface.mjs +1 -1
  145. package/esm2020/lib/security/model/permissions.model.mjs +86 -86
  146. package/esm2020/lib/services/action-executor.service.mjs +555 -552
  147. package/esm2020/lib/services/commons.service.mjs +461 -446
  148. package/esm2020/lib/services/configuration.service.mjs +141 -141
  149. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  150. package/esm2020/lib/services/index.mjs +6 -6
  151. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  152. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  153. package/esm2020/lib/services/internal/index.mjs +2 -2
  154. package/esm2020/lib/services/navigation.service.mjs +47 -47
  155. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  156. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  157. package/esm2020/lib/services/providers/index.mjs +2 -2
  158. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  159. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  160. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  161. package/esm2020/lib/services/tokens/index.mjs +4 -4
  162. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  163. package/esm2020/lib/services/version.service.mjs +38 -38
  164. package/esm2020/lib/services/view-container.component.service.mjs +54 -54
  165. package/esm2020/lib/styles/button-style.builder.mjs +164 -164
  166. package/esm2020/lib/styles/index.mjs +2 -2
  167. package/esm2020/lib/styles/models/index.mjs +2 -2
  168. package/esm2020/lib/styles/models/style-level.enum.mjs +11 -11
  169. package/esm2020/lib/styles/models/style-size.enum.mjs +8 -8
  170. package/esm2020/lib/styles/styles.util.mjs +41 -41
  171. package/esm2020/lib/types/index.mjs +2 -2
  172. package/esm2020/lib/types/type.decorator.mjs +21 -21
  173. package/esm2020/lib/types/type.model.mjs +1 -1
  174. package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
  175. package/esm2020/lib/utils/date.util.mjs +117 -117
  176. package/esm2020/lib/utils/editor-formly.util.mjs +287 -287
  177. package/esm2020/lib/utils/enum.util.mjs +81 -81
  178. package/esm2020/lib/utils/export.util.mjs +20 -0
  179. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  180. package/esm2020/lib/utils/index.mjs +11 -10
  181. package/esm2020/lib/utils/model.util.mjs +68 -68
  182. package/esm2020/lib/utils/notification.util.mjs +50 -50
  183. package/esm2020/lib/utils/route.util.mjs +23 -23
  184. package/esm2020/lib/utils/string.util.mjs +26 -26
  185. package/esm2020/lib/utils/tableview.util.mjs +159 -159
  186. package/esm2020/lib/utils/type.util.mjs +92 -92
  187. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  188. package/esm2020/public-api.mjs +54 -54
  189. package/fesm2015/mediusinc-mng-commons.mjs +13871 -13639
  190. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  191. package/fesm2020/mediusinc-mng-commons.mjs +13708 -13477
  192. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  193. package/index.d.ts +5 -5
  194. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  195. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  196. package/lib/api/models/filter-param.model.d.ts +23 -23
  197. package/lib/api/models/index.d.ts +8 -8
  198. package/lib/api/models/mappers.d.ts +6 -6
  199. package/lib/api/models/query-mode.model.d.ts +16 -16
  200. package/lib/api/models/query-param.model.d.ts +31 -31
  201. package/lib/api/models/query-result.model.d.ts +24 -24
  202. package/lib/api/models/serialization.model.d.ts +8 -8
  203. package/lib/api/services/api.abstract.service.d.ts +24 -24
  204. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  205. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  206. package/lib/api/services/index.d.ts +3 -3
  207. package/lib/api/utils/index.d.ts +2 -2
  208. package/lib/api/utils/medius-rest.util.d.ts +16 -16
  209. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  210. package/lib/components/action/action.component.d.ts +79 -74
  211. package/lib/components/action/editor/action-editor.component.d.ts +69 -69
  212. package/lib/components/action/index.d.ts +4 -4
  213. package/lib/components/action/localization/data-language-dropdown.component.d.ts +25 -25
  214. package/lib/components/action/models/action-component.model.d.ts +15 -15
  215. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  216. package/lib/components/action/models/action-execution.model.d.ts +135 -135
  217. package/lib/components/action/models/index.d.ts +4 -4
  218. package/lib/components/action/models/tableview-action-default-categories.model.d.ts +10 -10
  219. package/lib/components/action/route/action-route.component.d.ts +31 -31
  220. package/lib/components/form/autocomplete/autocomplete.component.d.ts +61 -61
  221. package/lib/components/form/date-range/date-range.component.d.ts +28 -28
  222. package/lib/components/form/dropdown/dropdown.component.d.ts +52 -52
  223. package/lib/components/form/editor/form-editor.component.d.ts +52 -52
  224. package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +13 -13
  225. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +16 -16
  226. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +15 -15
  227. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +14 -14
  228. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +29 -29
  229. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +11 -11
  230. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +46 -46
  231. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +24 -24
  232. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  233. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +7 -7
  234. package/lib/components/form/formly/fields/index.d.ts +10 -10
  235. package/lib/components/form/formly/formly.config.d.ts +14 -14
  236. package/lib/components/form/formly/index.d.ts +1 -1
  237. package/lib/components/form/formly/models/formly-config.model.d.ts +11 -11
  238. package/lib/components/form/formly/models/formly-field.model.d.ts +16 -16
  239. package/lib/components/form/formly/models/index.d.ts +2 -2
  240. package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +6 -6
  241. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +11 -11
  242. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  243. package/lib/components/form/index.d.ts +4 -4
  244. package/lib/components/form/models/field-action-context.model.d.ts +17 -17
  245. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  246. package/lib/components/form/models/form-editor.interface.d.ts +10 -10
  247. package/lib/components/form/models/index.d.ts +2 -2
  248. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  249. package/lib/components/layout/footer.component.d.ts +9 -9
  250. package/lib/components/layout/index.d.ts +7 -7
  251. package/lib/components/layout/main-layout.component.d.ts +20 -20
  252. package/lib/components/layout/menu-item.component.d.ts +52 -52
  253. package/lib/components/layout/menu.component.d.ts +10 -10
  254. package/lib/components/layout/services/index.d.ts +1 -1
  255. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  256. package/lib/components/layout/topbar.component.d.ts +28 -28
  257. package/lib/components/layout/version.component.d.ts +19 -19
  258. package/lib/components/tableview/index.d.ts +6 -6
  259. package/lib/components/tableview/models/index.d.ts +1 -1
  260. package/lib/components/tableview/models/table.event.d.ts +17 -17
  261. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +33 -29
  262. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
  263. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +38 -38
  264. package/lib/components/tableview/table/column-value/column-value.component.d.ts +35 -35
  265. package/lib/components/tableview/table/table.component.d.ts +115 -115
  266. package/lib/components/tableview/tableview.component.d.ts +48 -48
  267. package/lib/data-providers/base.data-provider.d.ts +14 -14
  268. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  269. package/lib/data-providers/index.d.ts +6 -6
  270. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  271. package/lib/data-providers/table.data-provider.d.ts +27 -27
  272. package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -8
  273. package/lib/data-providers/tableview.data-provider.d.ts +33 -33
  274. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +36 -36
  275. package/lib/descriptors/action-button.descriptor.d.ts +22 -22
  276. package/lib/descriptors/action.descriptor.d.ts +223 -217
  277. package/lib/descriptors/column.descriptor.d.ts +130 -130
  278. package/lib/descriptors/editor.descriptor.d.ts +116 -116
  279. package/lib/descriptors/field-validation.descriptor.d.ts +19 -19
  280. package/lib/descriptors/field.descriptor.d.ts +345 -345
  281. package/lib/descriptors/filter.descriptor.d.ts +118 -113
  282. package/lib/descriptors/index.d.ts +11 -11
  283. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  284. package/lib/descriptors/interfaces/index.d.ts +2 -2
  285. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  286. package/lib/descriptors/model.descriptor.d.ts +18 -18
  287. package/lib/descriptors/table.descriptor.d.ts +193 -188
  288. package/lib/descriptors/tableview.descriptor.d.ts +129 -129
  289. package/lib/descriptors/types/action.type.d.ts +21 -21
  290. package/lib/descriptors/types/column.type.d.ts +18 -18
  291. package/lib/descriptors/types/editor.type.d.ts +6 -6
  292. package/lib/descriptors/types/field.type.d.ts +47 -47
  293. package/lib/descriptors/types/filter.type.d.ts +27 -27
  294. package/lib/descriptors/types/index.d.ts +6 -6
  295. package/lib/descriptors/types/table.type.d.ts +22 -22
  296. package/lib/directives/component.directive.d.ts +16 -16
  297. package/lib/directives/index.d.ts +2 -2
  298. package/lib/directives/template.directive.d.ts +13 -13
  299. package/lib/mng-commons.module.d.ts +99 -97
  300. package/lib/models/column-value.model.d.ts +4 -4
  301. package/lib/models/config.model.d.ts +40 -40
  302. package/lib/models/enum.model.d.ts +6 -6
  303. package/lib/models/error.model.d.ts +14 -14
  304. package/lib/models/index.d.ts +9 -9
  305. package/lib/models/menu.model.d.ts +30 -30
  306. package/lib/models/tableview-attr.model.d.ts +10 -10
  307. package/lib/models/user.model.d.ts +8 -8
  308. package/lib/models/version.model.d.ts +18 -18
  309. package/lib/models/view-container.model.d.ts +43 -43
  310. package/lib/pipes/boolean.pipe.d.ts +7 -7
  311. package/lib/pipes/class-map.pipe.d.ts +7 -7
  312. package/lib/pipes/enum.pipe.d.ts +8 -8
  313. package/lib/pipes/enumerate-async.pipe.d.ts +14 -14
  314. package/lib/pipes/enumerate.pipe.d.ts +21 -21
  315. package/lib/pipes/getter.pipe.d.ts +7 -7
  316. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  317. package/lib/pipes/index.d.ts +11 -11
  318. package/lib/pipes/json-path.pipe.d.ts +13 -13
  319. package/lib/pipes/locale-default-row-class.pipe.d.ts +10 -10
  320. package/lib/pipes/models/internal/enumrate-pipe-i18n.model.d.ts +5 -5
  321. package/lib/pipes/models/internal/index.d.ts +1 -1
  322. package/lib/pipes/parametrize.pipe.d.ts +13 -13
  323. package/lib/pipes/template.pipe.d.ts +10 -10
  324. package/lib/router/index.d.ts +2 -2
  325. package/lib/router/models/index.d.ts +1 -1
  326. package/lib/router/models/router.model.d.ts +33 -33
  327. package/lib/router/route-builder.d.ts +98 -98
  328. package/lib/router/tableview-route-builder.d.ts +37 -37
  329. package/lib/security/authorization.guard.d.ts +11 -11
  330. package/lib/security/authorization.service.d.ts +19 -19
  331. package/lib/security/authorization.util.d.ts +5 -5
  332. package/lib/security/index.d.ts +3 -3
  333. package/lib/security/model/authorization.type.d.ts +6 -6
  334. package/lib/security/model/index.d.ts +3 -3
  335. package/lib/security/model/permission-service.interface.d.ts +6 -6
  336. package/lib/security/model/permissions.model.d.ts +37 -37
  337. package/lib/services/action-executor.service.d.ts +149 -149
  338. package/lib/services/commons.service.d.ts +93 -89
  339. package/lib/services/configuration.service.d.ts +57 -57
  340. package/lib/services/error-mapper.service.d.ts +7 -7
  341. package/lib/services/index.d.ts +6 -6
  342. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  343. package/lib/services/internal/commons-init.service.d.ts +16 -16
  344. package/lib/services/internal/index.d.ts +2 -2
  345. package/lib/services/navigation.service.d.ts +14 -14
  346. package/lib/services/providers/config-service.provider.d.ts +6 -6
  347. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  348. package/lib/services/providers/index.d.ts +2 -2
  349. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  350. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  351. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  352. package/lib/services/tokens/index.d.ts +4 -4
  353. package/lib/services/tokens/module-config.token.d.ts +3 -3
  354. package/lib/services/version.service.d.ts +13 -13
  355. package/lib/services/view-container.component.service.d.ts +31 -31
  356. package/lib/styles/button-style.builder.d.ts +67 -67
  357. package/lib/styles/index.d.ts +2 -2
  358. package/lib/styles/models/index.d.ts +2 -2
  359. package/lib/styles/models/style-level.enum.d.ts +10 -10
  360. package/lib/styles/models/style-size.enum.d.ts +7 -7
  361. package/lib/styles/styles.util.d.ts +14 -14
  362. package/lib/types/index.d.ts +2 -2
  363. package/lib/types/type.decorator.d.ts +4 -4
  364. package/lib/types/type.model.d.ts +23 -23
  365. package/lib/utils/action-data-provider.util.d.ts +20 -20
  366. package/lib/utils/date.util.d.ts +7 -7
  367. package/lib/utils/editor-formly.util.d.ts +12 -12
  368. package/lib/utils/enum.util.d.ts +50 -50
  369. package/lib/utils/export.util.d.ts +5 -0
  370. package/lib/utils/i18n.util.d.ts +56 -56
  371. package/lib/utils/index.d.ts +10 -9
  372. package/lib/utils/model.util.d.ts +8 -8
  373. package/lib/utils/notification.util.d.ts +12 -12
  374. package/lib/utils/route.util.d.ts +4 -4
  375. package/lib/utils/string.util.d.ts +4 -4
  376. package/lib/utils/tableview.util.d.ts +40 -40
  377. package/lib/utils/type.util.d.ts +57 -57
  378. package/mediusinc-mng-commons-1.4.0.tgz +0 -0
  379. package/package.json +1 -1
  380. package/public-api.d.ts +34 -34
  381. package/scss/common/theme/designer/_components.scss +4 -4
  382. package/scss/mng-overrides/_layout_menu.scss +4 -0
  383. package/version-info.json +5 -5
@@ -1,987 +1,987 @@
1
- import { Validators } from '@angular/forms';
2
- import { Subject, of } from 'rxjs';
3
- import { MngFormFieldEvent } from '../components/form/models';
4
- import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
5
- import { MngCommonsService } from '../services';
6
- import { ButtonStyleBuilder } from '../styles';
7
- import { StyleLevelEnum } from '../styles/models';
8
- import { EnumUtil, I18nUtils, ModelUtil, TypeUtil } from '../utils';
9
- import { ActionButtonDescriptor, EditorDescriptor, FieldValidationDescriptor, TableviewDescriptor } from './';
10
- import { FieldGroupTypeEnum, FieldInputTypeEnum, FieldLookupTypeEnum, FieldManyEditorActionEnum, FieldManyEditorTypeEnum, FieldManyToManyEditorActionEnum, FieldManyToManyEditorTypeEnum, FieldSizeEnum } from './types';
11
- export class AGenericFieldDescriptor {
12
- constructor(editor) {
13
- this._config = {};
14
- this._editor = editor;
15
- }
16
- get editor() {
17
- return this._editor;
18
- }
19
- get config() {
20
- return this._config;
21
- }
22
- withConfig(config) {
23
- this._config = config;
24
- return this;
25
- }
26
- }
27
- export class AFieldDescriptor extends AGenericFieldDescriptor {
28
- constructor(editor, property) {
29
- super(editor);
30
- this._required = false;
31
- this._requiredHideLabelMarker = false;
32
- this._disabled = false;
33
- this._validations = [];
34
- this._asyncValidations = [];
35
- this._className = '';
36
- this._labelClassName = '';
37
- this._inputClassName = '';
38
- this._size = FieldSizeEnum.Normal;
39
- // localization
40
- this._isLocalized = false;
41
- this._eventsSubject = new Subject();
42
- this._property = property;
43
- this._label = I18nUtils.Type.getPropertyKey(this._editor.model.i18nBaseKey, property);
44
- }
45
- get property() {
46
- return this._property;
47
- }
48
- get label() {
49
- return this._label;
50
- }
51
- get placeholder() {
52
- return this._placeholder;
53
- }
54
- get helpText() {
55
- return this._helpText;
56
- }
57
- get required() {
58
- return this._required;
59
- }
60
- get requiredHideLabelMarker() {
61
- return this._requiredHideLabelMarker;
62
- }
63
- get disabled() {
64
- return this._disabled;
65
- }
66
- get defaultValue() {
67
- return this._defaultValue;
68
- }
69
- get getter() {
70
- return this._getter;
71
- }
72
- get setter() {
73
- return this._setter;
74
- }
75
- get validations() {
76
- return this._validations;
77
- }
78
- get asyncValidations() {
79
- return this._asyncValidations;
80
- }
81
- get requiredExpression() {
82
- return this._requiredExpression;
83
- }
84
- get disabledExpression() {
85
- return this._disabledExpression;
86
- }
87
- get hiddenExpression() {
88
- return this._hiddenExpression;
89
- }
90
- get className() {
91
- return this._className;
92
- }
93
- get fieldClassName() {
94
- return this._fieldClassName;
95
- }
96
- get labelClassName() {
97
- return this._labelClassName;
98
- }
99
- get inputClassName() {
100
- return this._inputClassName;
101
- }
102
- get size() {
103
- return this._size;
104
- }
105
- get localizationTableview() {
106
- return this._localizationTableview;
107
- }
108
- get isSizeSmall() {
109
- return this._size === FieldSizeEnum.Small;
110
- }
111
- get isSizeLarge() {
112
- return this._size === FieldSizeEnum.Large;
113
- }
114
- get isLocalized() {
115
- return this._isLocalized;
116
- }
117
- withLabel(label) {
118
- this._label = label;
119
- return this;
120
- }
121
- withPlaceholder(placeholder) {
122
- this._placeholder = placeholder;
123
- return this;
124
- }
125
- withHelpText(helpText) {
126
- this._helpText = helpText;
127
- return this;
128
- }
129
- withRequired(required = true, requiredExpression, hideLabelMarker = false) {
130
- this._required = required;
131
- if (requiredExpression) {
132
- this._requiredExpression = requiredExpression;
133
- }
134
- this._requiredHideLabelMarker = hideLabelMarker;
135
- return this;
136
- }
137
- withDisabled(disabled = true, disabledExpression) {
138
- this._disabled = disabled;
139
- if (disabledExpression) {
140
- this._disabledExpression = disabledExpression;
141
- }
142
- return this;
143
- }
144
- withHidden(hiddenExpression) {
145
- this._hiddenExpression = hiddenExpression;
146
- return this;
147
- }
148
- withDefaultValue(defaultValue) {
149
- this._defaultValue = defaultValue;
150
- return this;
151
- }
152
- withGetter(getter) {
153
- this._getter = getter;
154
- return this;
155
- }
156
- withSetter(setter) {
157
- this._setter = setter;
158
- return this;
159
- }
160
- withValidation(name, validator, message) {
161
- this._validations.push(new FieldValidationDescriptor(name, validator, message));
162
- return this;
163
- }
164
- withAsyncValidation(name, asyncValidator, message) {
165
- this._asyncValidations.push(new FieldValidationDescriptor(name, asyncValidator, message));
166
- return this;
167
- }
168
- withClassName(className, labelClassName = '', inputClassName = '', fieldClassName) {
169
- this._className = className;
170
- this._labelClassName = labelClassName;
171
- this._inputClassName = inputClassName;
172
- this._fieldClassName = fieldClassName;
173
- return this;
174
- }
175
- withSize(size = FieldSizeEnum.Normal) {
176
- this._size = size;
177
- return this;
178
- }
179
- /**
180
- * This method adds an icon with text Show all translations above the field and after clicking on it, it displays a new dialog with tableview.
181
- * This new table view shows all available translations for specific property and allows editing it.
182
- * @param tableview with lookup provider for locales
183
- */
184
- localized(tableview) {
185
- if (!this.editor.isLocalized) {
186
- this.editor.localized();
187
- }
188
- this._isLocalized = true;
189
- if (tableview) {
190
- this._localizationTableview = tableview;
191
- }
192
- else {
193
- const localizationTableviewDescriptor = new TableviewDescriptor(this._editor.localizationBeanType);
194
- localizationTableviewDescriptor.addColumn(this._editor.localizationLocaleProperty);
195
- localizationTableviewDescriptor.addColumn(this.property);
196
- localizationTableviewDescriptor
197
- .addFieldLookup(this._editor.localizationLocaleProperty, String)
198
- .withLookup((qp, service) => of(service.appDataLanguages), MngCommonsService);
199
- if (this._editor.localeLookup) {
200
- localizationTableviewDescriptor.addFieldLookup(this._editor.localizationLocaleProperty, String).withLookup(() => this._editor.localeLookup());
201
- }
202
- localizationTableviewDescriptor.addField(this.property);
203
- // this is used in table.component to mark row with default data language
204
- localizationTableviewDescriptor.table.withLocalizationLocaleProperty(this._editor.localizationLocaleProperty);
205
- this._localizationTableview = new TableviewDescriptor(this._editor.model.type);
206
- this._localizationTableview.addFieldManyEditor(this._editor.localizationLocalizationProperty, localizationTableviewDescriptor);
207
- }
208
- return this;
209
- }
210
- nextEvent(type, cmpType, cmpInstance, data) {
211
- this._eventsSubject.next(new MngFormFieldEvent(type, cmpType, cmpInstance, data));
212
- }
213
- get events$() {
214
- return this._eventsSubject.asObservable();
215
- }
216
- copyFieldsTo(obj) {
217
- obj._label = this._label;
218
- obj._placeholder = this._placeholder;
219
- obj._helpText = this._helpText;
220
- obj._required = this._required;
221
- obj._disabled = this._disabled;
222
- obj._defaultValue = this._defaultValue;
223
- obj._requiredExpression = this._requiredExpression;
224
- obj._hiddenExpression = this._hiddenExpression;
225
- obj._disabledExpression = this._disabledExpression;
226
- obj._className = this._className;
227
- obj._size = this.size;
228
- obj._getter = this._getter;
229
- obj._setter = this._setter;
230
- obj._isLocalized = this._isLocalized;
231
- obj._localizationTableview = this._localizationTableview?.copy();
232
- obj._validations = this._validations.map(value => value.copy());
233
- obj._asyncValidations = this._asyncValidations.map(value => value.copy());
234
- }
235
- }
236
- export class FieldInputDescriptor extends AFieldDescriptor {
237
- constructor(editor, property) {
238
- super(editor, property);
239
- this._fieldType = FieldInputTypeEnum.Text;
240
- this._numberAutoCorrect = true;
241
- this._numberUseGrouping = true;
242
- this._currencyDisplay = 'symbol';
243
- // radio specific properties
244
- this._radioOptions = [];
245
- this._datePickerShowTime = false;
246
- this._datePickerShowSeconds = true;
247
- // file specific properties
248
- this._fileMultiple = false;
249
- this._fileMaxFileSize = 500000;
250
- // image specific properties
251
- this._imagePreview = true;
252
- this._imageUrlInputHiddenOnDisabled = false;
253
- }
254
- /**
255
- * converts field to given type with additional arguments
256
- * @param fieldType field type enum
257
- * @param args any additional arguments for field (optional)
258
- */
259
- asType(fieldType, ...args) {
260
- switch (fieldType) {
261
- case FieldInputTypeEnum.Hidden:
262
- return this.asHidden();
263
- case FieldInputTypeEnum.Label:
264
- return this.asLabel();
265
- case FieldInputTypeEnum.Textarea:
266
- return this.asTextarea(...args);
267
- case FieldInputTypeEnum.Number:
268
- return this.asNumber();
269
- case FieldInputTypeEnum.Currency:
270
- return this.asCurrency(...args);
271
- case FieldInputTypeEnum.Switch:
272
- return this.asSwitch();
273
- case FieldInputTypeEnum.Radio:
274
- return this.asRadio(args[0], args[1]);
275
- case FieldInputTypeEnum.Datepicker:
276
- return this.asDatePicker(...args);
277
- case FieldInputTypeEnum.Mask:
278
- return this.asMask(args[0], args[1]);
279
- case FieldInputTypeEnum.File:
280
- return this.asFile(...args);
281
- case FieldInputTypeEnum.ImageFile:
282
- return this.asImageFile();
283
- case FieldInputTypeEnum.ImageUrl:
284
- return this.asImageUrl();
285
- case FieldInputTypeEnum.Custom:
286
- return this.asCustomComponent(args[0]);
287
- case FieldInputTypeEnum.Text:
288
- return this.asText();
289
- }
290
- }
291
- get fieldType() {
292
- return this._fieldType;
293
- }
294
- get rows() {
295
- return this._rows;
296
- }
297
- get numberMin() {
298
- return this._numberMin;
299
- }
300
- get numberMax() {
301
- return this._numberMax;
302
- }
303
- get numberStep() {
304
- return this._numberStep;
305
- }
306
- get numberAutoCorrect() {
307
- return this._numberAutoCorrect;
308
- }
309
- get numberMinFractionDigits() {
310
- return this._numberMinFractionDigits;
311
- }
312
- get numberMaxFractionDigits() {
313
- return this._numberMaxFractionDigits;
314
- }
315
- get numberUseGrouping() {
316
- return this._numberUseGrouping;
317
- }
318
- get radioOptions() {
319
- return this._radioOptions;
320
- }
321
- get datePickerFormat() {
322
- return this._datePickerFormat;
323
- }
324
- get datePickerMin() {
325
- return this._datePickerMin;
326
- }
327
- get datePickerMax() {
328
- return this._datePickerMax;
329
- }
330
- get datePickerShowTime() {
331
- return this._datePickerShowTime;
332
- }
333
- get datePickerShowSeconds() {
334
- return this._datePickerShowSeconds;
335
- }
336
- get maxLength() {
337
- return this._maxLength;
338
- }
339
- get minLength() {
340
- return this._minLength;
341
- }
342
- get pattern() {
343
- return this._pattern;
344
- }
345
- get mask() {
346
- return this._mask;
347
- }
348
- get slotChar() {
349
- return this._slotChar;
350
- }
351
- get fileMultiple() {
352
- return this._fileMultiple;
353
- }
354
- get fileMaxFileSize() {
355
- return this._fileMaxFileSize;
356
- }
357
- get fileAccept() {
358
- return this._fileAccept;
359
- }
360
- get fileOnSelectHandler() {
361
- return this._fileOnSelectHandler;
362
- }
363
- get imagePreview() {
364
- return this._imagePreview;
365
- }
366
- get imageUrlInputVisibleOnDisabled() {
367
- return this._imageUrlInputHiddenOnDisabled;
368
- }
369
- get customComponentName() {
370
- return this._customComponentName;
371
- }
372
- get locale() {
373
- return this._locale;
374
- }
375
- get currency() {
376
- return this._currency;
377
- }
378
- get currencyFromProperty() {
379
- return this._currencyFromProperty;
380
- }
381
- get currencyDisplay() {
382
- return this._currencyDisplay;
383
- }
384
- asHidden() {
385
- this._fieldType = FieldInputTypeEnum.Hidden;
386
- return this;
387
- }
388
- asLabel() {
389
- this._fieldType = FieldInputTypeEnum.Label;
390
- return this;
391
- }
392
- asText() {
393
- this._fieldType = FieldInputTypeEnum.Text;
394
- return this;
395
- }
396
- asTextarea(rows = 3) {
397
- this._fieldType = FieldInputTypeEnum.Textarea;
398
- this._rows = rows;
399
- return this;
400
- }
401
- asNumber() {
402
- this._fieldType = FieldInputTypeEnum.Number;
403
- return this;
404
- }
405
- asCurrency(currencyFromProperty, currency, currencyDisplay) {
406
- this._fieldType = FieldInputTypeEnum.Currency;
407
- this._currencyFromProperty = currencyFromProperty;
408
- this._currency = currency ?? this._currency;
409
- this._currencyDisplay = currencyDisplay ?? this._currencyDisplay;
410
- return this.withNumberFractions(2, 2);
411
- }
412
- asSwitch() {
413
- this._fieldType = FieldInputTypeEnum.Switch;
414
- return this;
415
- }
416
- asRadio(options, optionsTitlePath) {
417
- this._fieldType = FieldInputTypeEnum.Radio;
418
- this._radioOptions = options.map(o => ({ value: o, title: `${optionsTitlePath ? `${optionsTitlePath}.` : ''}${o}` }));
419
- return this;
420
- }
421
- asRadioFromEnum(enumType, optionsTitlePath, values, nameAsValue = false) {
422
- this._fieldType = FieldInputTypeEnum.Radio;
423
- if (typeof optionsTitlePath === 'undefined') {
424
- optionsTitlePath = TypeUtil.findEnumName(enumType);
425
- }
426
- this._radioOptions = Array.isArray(values)
427
- ? EnumUtil.fromValuesAsEnumValueArray(enumType, values, nameAsValue, optionsTitlePath ?? undefined)
428
- : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
429
- return this;
430
- }
431
- asDatePicker(format, min, max, showTime, showSeconds) {
432
- this._fieldType = FieldInputTypeEnum.Datepicker;
433
- this._datePickerFormat = format;
434
- this._datePickerMin = min;
435
- this._datePickerMax = max;
436
- this._datePickerShowTime = showTime ?? false;
437
- this._datePickerShowSeconds = showSeconds ?? true;
438
- return this;
439
- }
440
- asMask(mask, slotChar) {
441
- this._fieldType = FieldInputTypeEnum.Mask;
442
- this._mask = mask;
443
- this._slotChar = slotChar;
444
- return this;
445
- }
446
- asFile(multiple = false, maxFileSize = 500000, accept) {
447
- this._fieldType = FieldInputTypeEnum.File;
448
- this._fileMultiple = multiple;
449
- this._fileMaxFileSize = maxFileSize;
450
- this._fileAccept = accept;
451
- return this;
452
- }
453
- asImageFile(multiple = false, maxFileSize = 500000, accept = 'image/*') {
454
- this.asFile(multiple, maxFileSize, accept);
455
- this._fieldType = FieldInputTypeEnum.ImageFile;
456
- return this;
457
- }
458
- asImageUrl(multiple = false, preview = true, inputVisibleOnDisabled = true) {
459
- this._fieldType = FieldInputTypeEnum.ImageUrl;
460
- this._fileMultiple = multiple;
461
- this._imagePreview = preview;
462
- this._imageUrlInputHiddenOnDisabled = inputVisibleOnDisabled;
463
- return this;
464
- }
465
- asCustomComponent(customComponentName) {
466
- this._fieldType = FieldInputTypeEnum.Custom;
467
- this._customComponentName = customComponentName;
468
- return this;
469
- }
470
- withNumberValidation(min, max, step, autoCorrect = true) {
471
- this._numberStep = step ?? this._numberStep;
472
- this._numberAutoCorrect = autoCorrect;
473
- this._numberMin = min ?? this._numberMin ?? Number.MIN_SAFE_INTEGER;
474
- this._numberMax = max ?? this._numberMax ?? Number.MAX_SAFE_INTEGER;
475
- return this;
476
- }
477
- withLocale(locale) {
478
- this._locale = locale;
479
- return this;
480
- }
481
- withNumberFractions(min, max) {
482
- this._numberMinFractionDigits = min;
483
- this._numberMaxFractionDigits = max;
484
- return this;
485
- }
486
- withNumberGrouping(useGrouping = true) {
487
- this._numberUseGrouping = useGrouping;
488
- return this;
489
- }
490
- withTextValidation(minLength, maxLength, pattern) {
491
- this._minLength = minLength;
492
- this._maxLength = maxLength;
493
- this._pattern = pattern;
494
- return this;
495
- }
496
- withTextValidationEmail() {
497
- if (this.fieldType === FieldInputTypeEnum.Text) {
498
- this.withValidation('email', Validators.email);
499
- }
500
- return this;
501
- }
502
- withFileOnSelectHandler(fn) {
503
- this._fileOnSelectHandler = fn;
504
- }
505
- copy() {
506
- const field = new FieldInputDescriptor(this._editor, this._property);
507
- this.copyFieldsTo(field);
508
- field._fieldType = this._fieldType;
509
- field._rows = this._rows;
510
- field._numberMin = this._numberMin;
511
- field._numberMax = this._numberMax;
512
- field._numberStep = this._numberStep;
513
- field._numberAutoCorrect = this._numberAutoCorrect;
514
- field._numberMinFractionDigits = this._numberMinFractionDigits;
515
- field._numberMaxFractionDigits = this._numberMaxFractionDigits;
516
- field._numberUseGrouping = this._numberUseGrouping;
517
- field._radioOptions = [...this._radioOptions];
518
- field._datePickerFormat = this._datePickerFormat;
519
- field._datePickerMin = this._datePickerMin;
520
- field._datePickerMax = this._datePickerMax;
521
- field._datePickerShowTime = this._datePickerShowTime;
522
- field._datePickerShowSeconds = this._datePickerShowSeconds;
523
- field._maxLength = this._maxLength;
524
- field._minLength = this._minLength;
525
- field._pattern = this._pattern;
526
- field._mask = this._mask;
527
- field._slotChar = this._slotChar;
528
- field._fileMultiple = this._fileMultiple;
529
- field._fileMaxFileSize = this._fileMaxFileSize;
530
- field._fileAccept = this._fileAccept;
531
- field._fileOnSelectHandler = this._fileOnSelectHandler;
532
- field._imagePreview = this._imagePreview;
533
- field._imageUrlInputHiddenOnDisabled = this._imageUrlInputHiddenOnDisabled;
534
- field._customComponentName = this._customComponentName;
535
- field._locale = this._locale;
536
- field._currency = this._currency;
537
- field._currencyDisplay = this._currencyDisplay;
538
- field._currencyFromProperty = this._currencyFromProperty;
539
- return field;
540
- }
541
- }
542
- export class FieldActionDescriptor extends AFieldDescriptor {
543
- constructor(editor, property) {
544
- super(editor, property);
545
- this._button = new ActionButtonDescriptor();
546
- this._fieldActionName = property;
547
- let displayName = property;
548
- if (this._editor.model)
549
- displayName = `${this._editor.model.typeName}.${displayName}`;
550
- this._fieldActionNameLong = displayName;
551
- }
552
- get button() {
553
- return this._button;
554
- }
555
- get runFunction() {
556
- return this._runFunction;
557
- }
558
- withButtonDescriptor(button) {
559
- this._button = button;
560
- return this;
561
- }
562
- withButton(label, icon = null, styleLevel = StyleLevelEnum.Default, styleText = false) {
563
- this._button = new ActionButtonDescriptor().withLabel(label).withIcon(icon).withStyleClass(new ButtonStyleBuilder(styleLevel).withTextButton(styleText));
564
- return this;
565
- }
566
- withRunFunction(fn) {
567
- this._runFunction = fn;
568
- return this;
569
- }
570
- copy() {
571
- const field = new FieldActionDescriptor(this._editor, this._property);
572
- this.copyFieldsTo(field);
573
- field._button = this._button.copy();
574
- field._runFunction = this._runFunction?.bind(field);
575
- return field;
576
- }
577
- }
578
- export class FieldLookupDescriptor extends AFieldDescriptor {
579
- constructor(editor, property, modelType) {
580
- super(editor, property);
581
- this._lookupType = FieldLookupTypeEnum.Dropdown;
582
- this._itemsLabelTranslate = false;
583
- this._dropdownClassName = 'mng-filter-lookup-dropdown';
584
- this._autocompleteOpenOnFocus = false;
585
- this._autocompleteInlineSearch = false;
586
- this._autocompleteAutoClear = false;
587
- this._autocompleteSelectFirst = false;
588
- this._modelType = modelType;
589
- ModelUtil.trySetLookupItemsProperties(this);
590
- }
591
- get lookupType() {
592
- return this._lookupType;
593
- }
594
- get itemsLabelProperty() {
595
- return this._itemsLabelProperty;
596
- }
597
- get itemsLabelTranslate() {
598
- return this._itemsLabelTranslate;
599
- }
600
- get itemsValueProperty() {
601
- return this._itemsValueProperty;
602
- }
603
- get itemsDisabledProperty() {
604
- return this._itemsDisabledProperty;
605
- }
606
- get dataKeyProperty() {
607
- return this._dataKeyProperty;
608
- }
609
- get dataProvider() {
610
- return this._dataProvider;
611
- }
612
- get autocompleteOpenOnFocus() {
613
- return this._autocompleteOpenOnFocus;
614
- }
615
- get autocompleteInlineSearch() {
616
- return this._autocompleteInlineSearch;
617
- }
618
- get autocompleteAutoClear() {
619
- return this._autocompleteAutoClear;
620
- }
621
- get autocompleteSelectFirst() {
622
- return this._autocompleteSelectFirst;
623
- }
624
- get dropdownClassName() {
625
- return this._dropdownClassName;
626
- }
627
- get modelType() {
628
- return this._modelType;
629
- }
630
- get dialogTableDescriptor() {
631
- return this._dialogTableDescriptor;
632
- }
633
- get dialogTableDataProvider() {
634
- return this._dialogTableDataProvider;
635
- }
636
- get customComponentName() {
637
- return this._customComponentName;
638
- }
639
- withItemsLabelProperty(itemsLabelProperty, translate = false) {
640
- this._itemsLabelProperty = itemsLabelProperty;
641
- this._itemsLabelTranslate = translate;
642
- return this;
643
- }
644
- withItemsValueProperty(itemsValueProperty) {
645
- this._itemsValueProperty = itemsValueProperty;
646
- this._dataKeyProperty = undefined;
647
- return this;
648
- }
649
- withItemsDisabledProperty(itemsDisabledProperty) {
650
- this._itemsDisabledProperty = itemsDisabledProperty;
651
- return this;
652
- }
653
- withDataKeyProperty(property) {
654
- this._dataKeyProperty = property;
655
- this._itemsValueProperty = undefined;
656
- return this;
657
- }
658
- withLookup(lookup, serviceType) {
659
- const dataProvider = new LookupDataProvider(this._modelType);
660
- if (serviceType) {
661
- dataProvider.withServiceType(serviceType);
662
- }
663
- dataProvider.withLookup(lookup);
664
- this._dataProvider = dataProvider;
665
- return this;
666
- }
667
- withLookupDataProvider(dataProvider) {
668
- this._dataProvider = dataProvider;
669
- return this;
670
- }
671
- withConfig(config) {
672
- return super.withConfig(config);
673
- }
674
- asAutocomplete(openOnFocus = false, inlineSearch = false, selectFirst = false, autoClear = false) {
675
- this._lookupType = FieldLookupTypeEnum.Autocomplete;
676
- this._autocompleteAutoClear = autoClear;
677
- this._autocompleteSelectFirst = selectFirst;
678
- this._autocompleteOpenOnFocus = openOnFocus;
679
- this._autocompleteInlineSearch = inlineSearch;
680
- return this;
681
- }
682
- asDialog(lookupTableDescriptor, tableDataProvider) {
683
- this._lookupType = FieldLookupTypeEnum.Dialog;
684
- this._dialogTableDescriptor = lookupTableDescriptor;
685
- this._dialogTableDataProvider = tableDataProvider;
686
- return this;
687
- }
688
- asCustomComponent(customComponentName) {
689
- this._lookupType = FieldLookupTypeEnum.Custom;
690
- this._customComponentName = customComponentName;
691
- return this;
692
- }
693
- copy() {
694
- const field = new FieldLookupDescriptor(this._editor, this._property, this._modelType);
695
- this.copyFieldsTo(field);
696
- field._lookupType = this._lookupType;
697
- field._itemsLabelProperty = this._itemsLabelProperty;
698
- field._itemsLabelTranslate = this._itemsLabelTranslate;
699
- field._itemsValueProperty = this._itemsValueProperty;
700
- field._itemsDisabledProperty = this._itemsDisabledProperty;
701
- field._dataKeyProperty = this._dataKeyProperty;
702
- field._dataProvider = this._dataProvider;
703
- field._dropdownClassName = this._dropdownClassName;
704
- field._autocompleteOpenOnFocus = this._autocompleteOpenOnFocus;
705
- field._autocompleteInlineSearch = this._autocompleteInlineSearch;
706
- field._dialogTableDescriptor = this._dialogTableDescriptor;
707
- return field;
708
- }
709
- }
710
- export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
711
- constructor(editor, property, enumType, options, nameAsValue = false, optionsTitlePath) {
712
- super(editor, property, null);
713
- this._nameAsValue = false;
714
- this._enumType = enumType;
715
- this._nameAsValue = nameAsValue;
716
- if (typeof optionsTitlePath === 'undefined') {
717
- optionsTitlePath = TypeUtil.findEnumName(enumType);
718
- }
719
- this._optionEnumValues = Array.isArray(options)
720
- ? EnumUtil.fromValuesAsEnumValueArray(enumType, options, nameAsValue, optionsTitlePath ?? undefined)
721
- : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
722
- const dataProvider = new LookupDataProvider(null).withLookup(() => of(this._optionEnumValues));
723
- this.withLookupDataProvider(dataProvider);
724
- this.withItemsLabelProperty('title', optionsTitlePath !== null);
725
- this.withItemsValueProperty('value');
726
- this.withItemsDisabledProperty('disabled');
727
- }
728
- get enumType() {
729
- return this._enumType;
730
- }
731
- withDisabledOptions(...disabledOptions) {
732
- for (const disabledOption of disabledOptions) {
733
- const disabledOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, disabledOption) : disabledOption;
734
- if (disabledOptionValue) {
735
- const option = this._optionEnumValues.find(o => o.value === disabledOptionValue);
736
- if (option) {
737
- option.disabled = true;
738
- }
739
- }
740
- }
741
- return this;
742
- }
743
- withDefaultValueEnum(defaultValue) {
744
- const defaultOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, defaultValue) : defaultValue;
745
- if (defaultOptionValue) {
746
- const option = this._optionEnumValues.find(o => o.value === defaultOptionValue);
747
- if (option) {
748
- this.withDefaultValue(this._itemsValueProperty ? option[this._itemsValueProperty] : option);
749
- }
750
- }
751
- return this;
752
- }
753
- asAutocomplete(openOnFocus = true) {
754
- super.asAutocomplete(openOnFocus, true);
755
- return this;
756
- }
757
- copy() {
758
- const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumType, []);
759
- this.copyFieldsTo(field);
760
- field._lookupType = this._lookupType;
761
- field._itemsLabelProperty = this._itemsLabelProperty;
762
- field._itemsValueProperty = this._itemsValueProperty;
763
- field._itemsDisabledProperty = this._itemsDisabledProperty;
764
- field._dataKeyProperty = this._dataKeyProperty;
765
- field._dataProvider = this._dataProvider;
766
- return field;
767
- }
768
- }
769
- export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
770
- constructor(editor, property, mainTableDescriptor, lookupTableDescriptor) {
771
- super(editor, property);
772
- this._fieldType = FieldManyToManyEditorTypeEnum.DialogTableMultiselect;
773
- this._lookupTableDataProvider = null;
774
- this._actions = [];
775
- this._hasLookupExcludeValues = false;
776
- this._excludeFilterProperty = '';
777
- this._excludeValueProperty = '';
778
- this._mainTableDescriptor = mainTableDescriptor;
779
- this._lookupTableDescriptor = lookupTableDescriptor;
780
- this._actions.push(FieldManyToManyEditorActionEnum.Add, FieldManyToManyEditorActionEnum.Delete);
781
- }
782
- get fieldType() {
783
- return this._fieldType;
784
- }
785
- get lookupTableDataProvider() {
786
- return this._lookupTableDataProvider;
787
- }
788
- get actions() {
789
- return this._actions;
790
- }
791
- get hasLookupExcludeValues() {
792
- return this._hasLookupExcludeValues;
793
- }
794
- get excludeFilterProperty() {
795
- return this._excludeFilterProperty;
796
- }
797
- get excludeValueProperty() {
798
- return this._excludeValueProperty;
799
- }
800
- get mainTableDescriptor() {
801
- return this._mainTableDescriptor;
802
- }
803
- get lookupTableDescriptor() {
804
- return this._lookupTableDescriptor;
805
- }
806
- withLookup(getAll, serviceType) {
807
- const dataProvider = new TableviewDataProvider(this._mainTableDescriptor.model.type);
808
- if (serviceType) {
809
- dataProvider.withServiceType(serviceType);
810
- }
811
- dataProvider.withGetAll(getAll);
812
- this._lookupTableDataProvider = dataProvider;
813
- return this;
814
- }
815
- withLookupDataProvider(dataProvider) {
816
- this._lookupTableDataProvider = dataProvider;
817
- return this;
818
- }
819
- withActions(actions = []) {
820
- this.actions.push(...actions);
821
- return this;
822
- }
823
- withLookupExclude(filterProperty, valueProperty, hasLookupExclude = true) {
824
- this._hasLookupExcludeValues = hasLookupExclude;
825
- this._excludeFilterProperty = filterProperty;
826
- this._excludeValueProperty = valueProperty;
827
- return this;
828
- }
829
- copy() {
830
- const field = new FieldManyToManyEditorDescriptor(this._editor, this._property, this._mainTableDescriptor.copy(), this._lookupTableDescriptor.copy());
831
- this.copyFieldsTo(field);
832
- field._fieldType = this._fieldType;
833
- field._actions = this._actions.map(a => a);
834
- field._lookupTableDataProvider = this._lookupTableDataProvider;
835
- field._hasLookupExcludeValues = this._hasLookupExcludeValues;
836
- field._excludeFilterProperty = this._excludeFilterProperty;
837
- field._excludeValueProperty = this._excludeValueProperty;
838
- return field;
839
- }
840
- }
841
- export class FieldManyEditorDescriptor extends AFieldDescriptor {
842
- constructor(editor, property, tableviewDescriptor) {
843
- super(editor, property);
844
- this._fieldType = FieldManyEditorTypeEnum.DialogEditor;
845
- this._fieldActions = [];
846
- this._actions = [];
847
- // this._modelType = modelType;
848
- this._tableviewDescriptor = tableviewDescriptor;
849
- this._fieldActions.push(FieldManyEditorActionEnum.View, FieldManyEditorActionEnum.Add, FieldManyEditorActionEnum.Edit, FieldManyEditorActionEnum.Delete);
850
- }
851
- get fieldType() {
852
- return this._fieldType;
853
- }
854
- get fieldActions() {
855
- return this._fieldActions;
856
- }
857
- get actions() {
858
- return this._actions;
859
- }
860
- get tableviewDescriptor() {
861
- return this._tableviewDescriptor;
862
- }
863
- get tableDescriptor() {
864
- return this._tableviewDescriptor.table;
865
- }
866
- get editorForCreate() {
867
- return this._tableviewDescriptor.addEditor;
868
- }
869
- get editorForRead() {
870
- return this._tableviewDescriptor.detailsEditor;
871
- }
872
- get editorForUpdate() {
873
- return this._tableviewDescriptor.editEditor;
874
- }
875
- withFieldAction(action) {
876
- this._fieldActions.push(action);
877
- return this;
878
- }
879
- withFieldActions(actions) {
880
- this._fieldActions = actions;
881
- return this;
882
- }
883
- withAction(action) {
884
- this._actions.push(action);
885
- return this;
886
- }
887
- copy() {
888
- const field = new FieldManyEditorDescriptor(this._editor, this._property, this._tableviewDescriptor.copy());
889
- this.copyFieldsTo(field);
890
- field._fieldType = this._fieldType;
891
- field._fieldActions = this._fieldActions.map(a => a);
892
- return field;
893
- }
894
- }
895
- export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
896
- constructor(editor, name) {
897
- super(editor);
898
- this._fields = [];
899
- this._validations = [];
900
- this._name = `${this.baseName}${name}`;
901
- this._default = name === EditorDescriptor.defaultGroupName;
902
- }
903
- removeField(property, filterFunction) {
904
- this._fields = filterFunction(this._fields);
905
- return this._fields;
906
- }
907
- get title() {
908
- return this._title;
909
- }
910
- get validations() {
911
- return this._validations;
912
- }
913
- get baseName() {
914
- return `${this.groupName()}_`;
915
- }
916
- get name() {
917
- return this._name;
918
- }
919
- get default() {
920
- return this._default;
921
- }
922
- withTitle(title) {
923
- this._title = title;
924
- return this;
925
- }
926
- withValidation(name, validator, message) {
927
- this._validations.push(new FieldValidationDescriptor(name, validator, message));
928
- return this;
929
- }
930
- }
931
- export class FieldTabGroupDescriptor extends AFieldGroupDescriptor {
932
- constructor(editor, name) {
933
- super(editor, name);
934
- }
935
- get fields() {
936
- return this._fields;
937
- }
938
- groupName() {
939
- return 'tab';
940
- }
941
- addField(field) {
942
- this._fields.push(field);
943
- return this;
944
- }
945
- copy() {
946
- const tab = new FieldTabGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
947
- tab._title = this._title;
948
- tab._fields = this.fields.map(f => f.copy());
949
- tab._validations = this.validations.map(v => v.copy());
950
- return tab;
951
- }
952
- }
953
- export class FieldGroupDescriptor extends AFieldGroupDescriptor {
954
- constructor(editor, name) {
955
- super(editor, name);
956
- this._type = FieldGroupTypeEnum.Fieldset;
957
- if (this._default) {
958
- this.asLogical();
959
- }
960
- }
961
- get type() {
962
- return this._type;
963
- }
964
- get fields() {
965
- return this._fields;
966
- }
967
- groupName() {
968
- return 'group';
969
- }
970
- addField(field) {
971
- this._fields.push(field);
972
- return this;
973
- }
974
- asLogical() {
975
- this._type = FieldGroupTypeEnum.Logical;
976
- return this;
977
- }
978
- copy() {
979
- const group = new FieldGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
980
- group._type = this._type;
981
- group._title = this._title;
982
- group._fields = this.fields.map(f => f.copy());
983
- group._validations = this.validations.map(v => v.copy());
984
- return group;
985
- }
986
- }
1
+ import { Validators } from '@angular/forms';
2
+ import { Subject, of } from 'rxjs';
3
+ import { MngFormFieldEvent } from '../components/form/models';
4
+ import { LookupDataProvider, TableviewDataProvider } from '../data-providers';
5
+ import { MngCommonsService } from '../services';
6
+ import { ButtonStyleBuilder } from '../styles';
7
+ import { StyleLevelEnum } from '../styles/models';
8
+ import { EnumUtil, I18nUtils, ModelUtil, TypeUtil } from '../utils';
9
+ import { ActionButtonDescriptor, EditorDescriptor, FieldValidationDescriptor, TableviewDescriptor } from './';
10
+ import { FieldGroupTypeEnum, FieldInputTypeEnum, FieldLookupTypeEnum, FieldManyEditorActionEnum, FieldManyEditorTypeEnum, FieldManyToManyEditorActionEnum, FieldManyToManyEditorTypeEnum, FieldSizeEnum } from './types';
11
+ export class AGenericFieldDescriptor {
12
+ constructor(editor) {
13
+ this._config = {};
14
+ this._editor = editor;
15
+ }
16
+ get editor() {
17
+ return this._editor;
18
+ }
19
+ get config() {
20
+ return this._config;
21
+ }
22
+ withConfig(config) {
23
+ this._config = config;
24
+ return this;
25
+ }
26
+ }
27
+ export class AFieldDescriptor extends AGenericFieldDescriptor {
28
+ constructor(editor, property) {
29
+ super(editor);
30
+ this._required = false;
31
+ this._requiredHideLabelMarker = false;
32
+ this._disabled = false;
33
+ this._validations = [];
34
+ this._asyncValidations = [];
35
+ this._className = '';
36
+ this._labelClassName = '';
37
+ this._inputClassName = '';
38
+ this._size = FieldSizeEnum.Normal;
39
+ // localization
40
+ this._isLocalized = false;
41
+ this._eventsSubject = new Subject();
42
+ this._property = property;
43
+ this._label = I18nUtils.Type.getPropertyKey(this._editor.model.i18nBaseKey, property);
44
+ }
45
+ get property() {
46
+ return this._property;
47
+ }
48
+ get label() {
49
+ return this._label;
50
+ }
51
+ get placeholder() {
52
+ return this._placeholder;
53
+ }
54
+ get helpText() {
55
+ return this._helpText;
56
+ }
57
+ get required() {
58
+ return this._required;
59
+ }
60
+ get requiredHideLabelMarker() {
61
+ return this._requiredHideLabelMarker;
62
+ }
63
+ get disabled() {
64
+ return this._disabled;
65
+ }
66
+ get defaultValue() {
67
+ return this._defaultValue;
68
+ }
69
+ get getter() {
70
+ return this._getter;
71
+ }
72
+ get setter() {
73
+ return this._setter;
74
+ }
75
+ get validations() {
76
+ return this._validations;
77
+ }
78
+ get asyncValidations() {
79
+ return this._asyncValidations;
80
+ }
81
+ get requiredExpression() {
82
+ return this._requiredExpression;
83
+ }
84
+ get disabledExpression() {
85
+ return this._disabledExpression;
86
+ }
87
+ get hiddenExpression() {
88
+ return this._hiddenExpression;
89
+ }
90
+ get className() {
91
+ return this._className;
92
+ }
93
+ get fieldClassName() {
94
+ return this._fieldClassName;
95
+ }
96
+ get labelClassName() {
97
+ return this._labelClassName;
98
+ }
99
+ get inputClassName() {
100
+ return this._inputClassName;
101
+ }
102
+ get size() {
103
+ return this._size;
104
+ }
105
+ get localizationTableview() {
106
+ return this._localizationTableview;
107
+ }
108
+ get isSizeSmall() {
109
+ return this._size === FieldSizeEnum.Small;
110
+ }
111
+ get isSizeLarge() {
112
+ return this._size === FieldSizeEnum.Large;
113
+ }
114
+ get isLocalized() {
115
+ return this._isLocalized;
116
+ }
117
+ withLabel(label) {
118
+ this._label = label;
119
+ return this;
120
+ }
121
+ withPlaceholder(placeholder) {
122
+ this._placeholder = placeholder;
123
+ return this;
124
+ }
125
+ withHelpText(helpText) {
126
+ this._helpText = helpText;
127
+ return this;
128
+ }
129
+ withRequired(required = true, requiredExpression, hideLabelMarker = false) {
130
+ this._required = required;
131
+ if (requiredExpression) {
132
+ this._requiredExpression = requiredExpression;
133
+ }
134
+ this._requiredHideLabelMarker = hideLabelMarker;
135
+ return this;
136
+ }
137
+ withDisabled(disabled = true, disabledExpression) {
138
+ this._disabled = disabled;
139
+ if (disabledExpression) {
140
+ this._disabledExpression = disabledExpression;
141
+ }
142
+ return this;
143
+ }
144
+ withHidden(hiddenExpression) {
145
+ this._hiddenExpression = hiddenExpression;
146
+ return this;
147
+ }
148
+ withDefaultValue(defaultValue) {
149
+ this._defaultValue = defaultValue;
150
+ return this;
151
+ }
152
+ withGetter(getter) {
153
+ this._getter = getter;
154
+ return this;
155
+ }
156
+ withSetter(setter) {
157
+ this._setter = setter;
158
+ return this;
159
+ }
160
+ withValidation(name, validator, message) {
161
+ this._validations.push(new FieldValidationDescriptor(name, validator, message));
162
+ return this;
163
+ }
164
+ withAsyncValidation(name, asyncValidator, message) {
165
+ this._asyncValidations.push(new FieldValidationDescriptor(name, asyncValidator, message));
166
+ return this;
167
+ }
168
+ withClassName(className, labelClassName = '', inputClassName = '', fieldClassName) {
169
+ this._className = className;
170
+ this._labelClassName = labelClassName;
171
+ this._inputClassName = inputClassName;
172
+ this._fieldClassName = fieldClassName;
173
+ return this;
174
+ }
175
+ withSize(size = FieldSizeEnum.Normal) {
176
+ this._size = size;
177
+ return this;
178
+ }
179
+ /**
180
+ * This method adds an icon with text Show all translations above the field and after clicking on it, it displays a new dialog with tableview.
181
+ * This new table view shows all available translations for specific property and allows editing it.
182
+ * @param tableview with lookup provider for locales
183
+ */
184
+ localized(tableview) {
185
+ if (!this.editor.isLocalized) {
186
+ this.editor.localized();
187
+ }
188
+ this._isLocalized = true;
189
+ if (tableview) {
190
+ this._localizationTableview = tableview;
191
+ }
192
+ else {
193
+ const localizationTableviewDescriptor = new TableviewDescriptor(this._editor.localizationBeanType);
194
+ localizationTableviewDescriptor.addColumn(this._editor.localizationLocaleProperty);
195
+ localizationTableviewDescriptor.addColumn(this.property);
196
+ localizationTableviewDescriptor
197
+ .addFieldLookup(this._editor.localizationLocaleProperty, String)
198
+ .withLookup((qp, service) => of(service.appDataLanguages), MngCommonsService);
199
+ if (this._editor.localeLookup) {
200
+ localizationTableviewDescriptor.addFieldLookup(this._editor.localizationLocaleProperty, String).withLookup(() => this._editor.localeLookup());
201
+ }
202
+ localizationTableviewDescriptor.addField(this.property);
203
+ // this is used in table.component to mark row with default data language
204
+ localizationTableviewDescriptor.table.withLocalizationLocaleProperty(this._editor.localizationLocaleProperty);
205
+ this._localizationTableview = new TableviewDescriptor(this._editor.model.type);
206
+ this._localizationTableview.addFieldManyEditor(this._editor.localizationLocalizationProperty, localizationTableviewDescriptor);
207
+ }
208
+ return this;
209
+ }
210
+ nextEvent(type, cmpType, cmpInstance, data) {
211
+ this._eventsSubject.next(new MngFormFieldEvent(type, cmpType, cmpInstance, data));
212
+ }
213
+ get events$() {
214
+ return this._eventsSubject.asObservable();
215
+ }
216
+ copyFieldsTo(obj) {
217
+ obj._label = this._label;
218
+ obj._placeholder = this._placeholder;
219
+ obj._helpText = this._helpText;
220
+ obj._required = this._required;
221
+ obj._disabled = this._disabled;
222
+ obj._defaultValue = this._defaultValue;
223
+ obj._requiredExpression = this._requiredExpression;
224
+ obj._hiddenExpression = this._hiddenExpression;
225
+ obj._disabledExpression = this._disabledExpression;
226
+ obj._className = this._className;
227
+ obj._size = this.size;
228
+ obj._getter = this._getter;
229
+ obj._setter = this._setter;
230
+ obj._isLocalized = this._isLocalized;
231
+ obj._localizationTableview = this._localizationTableview?.copy();
232
+ obj._validations = this._validations.map(value => value.copy());
233
+ obj._asyncValidations = this._asyncValidations.map(value => value.copy());
234
+ }
235
+ }
236
+ export class FieldInputDescriptor extends AFieldDescriptor {
237
+ constructor(editor, property) {
238
+ super(editor, property);
239
+ this._fieldType = FieldInputTypeEnum.Text;
240
+ this._numberAutoCorrect = true;
241
+ this._numberUseGrouping = true;
242
+ this._currencyDisplay = 'symbol';
243
+ // radio specific properties
244
+ this._radioOptions = [];
245
+ this._datePickerShowTime = false;
246
+ this._datePickerShowSeconds = true;
247
+ // file specific properties
248
+ this._fileMultiple = false;
249
+ this._fileMaxFileSize = 500000;
250
+ // image specific properties
251
+ this._imagePreview = true;
252
+ this._imageUrlInputHiddenOnDisabled = false;
253
+ }
254
+ /**
255
+ * converts field to given type with additional arguments
256
+ * @param fieldType field type enum
257
+ * @param args any additional arguments for field (optional)
258
+ */
259
+ asType(fieldType, ...args) {
260
+ switch (fieldType) {
261
+ case FieldInputTypeEnum.Hidden:
262
+ return this.asHidden();
263
+ case FieldInputTypeEnum.Label:
264
+ return this.asLabel();
265
+ case FieldInputTypeEnum.Textarea:
266
+ return this.asTextarea(...args);
267
+ case FieldInputTypeEnum.Number:
268
+ return this.asNumber();
269
+ case FieldInputTypeEnum.Currency:
270
+ return this.asCurrency(...args);
271
+ case FieldInputTypeEnum.Switch:
272
+ return this.asSwitch();
273
+ case FieldInputTypeEnum.Radio:
274
+ return this.asRadio(args[0], args[1]);
275
+ case FieldInputTypeEnum.Datepicker:
276
+ return this.asDatePicker(...args);
277
+ case FieldInputTypeEnum.Mask:
278
+ return this.asMask(args[0], args[1]);
279
+ case FieldInputTypeEnum.File:
280
+ return this.asFile(...args);
281
+ case FieldInputTypeEnum.ImageFile:
282
+ return this.asImageFile();
283
+ case FieldInputTypeEnum.ImageUrl:
284
+ return this.asImageUrl();
285
+ case FieldInputTypeEnum.Custom:
286
+ return this.asCustomComponent(args[0]);
287
+ case FieldInputTypeEnum.Text:
288
+ return this.asText();
289
+ }
290
+ }
291
+ get fieldType() {
292
+ return this._fieldType;
293
+ }
294
+ get rows() {
295
+ return this._rows;
296
+ }
297
+ get numberMin() {
298
+ return this._numberMin;
299
+ }
300
+ get numberMax() {
301
+ return this._numberMax;
302
+ }
303
+ get numberStep() {
304
+ return this._numberStep;
305
+ }
306
+ get numberAutoCorrect() {
307
+ return this._numberAutoCorrect;
308
+ }
309
+ get numberMinFractionDigits() {
310
+ return this._numberMinFractionDigits;
311
+ }
312
+ get numberMaxFractionDigits() {
313
+ return this._numberMaxFractionDigits;
314
+ }
315
+ get numberUseGrouping() {
316
+ return this._numberUseGrouping;
317
+ }
318
+ get radioOptions() {
319
+ return this._radioOptions;
320
+ }
321
+ get datePickerFormat() {
322
+ return this._datePickerFormat;
323
+ }
324
+ get datePickerMin() {
325
+ return this._datePickerMin;
326
+ }
327
+ get datePickerMax() {
328
+ return this._datePickerMax;
329
+ }
330
+ get datePickerShowTime() {
331
+ return this._datePickerShowTime;
332
+ }
333
+ get datePickerShowSeconds() {
334
+ return this._datePickerShowSeconds;
335
+ }
336
+ get maxLength() {
337
+ return this._maxLength;
338
+ }
339
+ get minLength() {
340
+ return this._minLength;
341
+ }
342
+ get pattern() {
343
+ return this._pattern;
344
+ }
345
+ get mask() {
346
+ return this._mask;
347
+ }
348
+ get slotChar() {
349
+ return this._slotChar;
350
+ }
351
+ get fileMultiple() {
352
+ return this._fileMultiple;
353
+ }
354
+ get fileMaxFileSize() {
355
+ return this._fileMaxFileSize;
356
+ }
357
+ get fileAccept() {
358
+ return this._fileAccept;
359
+ }
360
+ get fileOnSelectHandler() {
361
+ return this._fileOnSelectHandler;
362
+ }
363
+ get imagePreview() {
364
+ return this._imagePreview;
365
+ }
366
+ get imageUrlInputVisibleOnDisabled() {
367
+ return this._imageUrlInputHiddenOnDisabled;
368
+ }
369
+ get customComponentName() {
370
+ return this._customComponentName;
371
+ }
372
+ get locale() {
373
+ return this._locale;
374
+ }
375
+ get currency() {
376
+ return this._currency;
377
+ }
378
+ get currencyFromProperty() {
379
+ return this._currencyFromProperty;
380
+ }
381
+ get currencyDisplay() {
382
+ return this._currencyDisplay;
383
+ }
384
+ asHidden() {
385
+ this._fieldType = FieldInputTypeEnum.Hidden;
386
+ return this;
387
+ }
388
+ asLabel() {
389
+ this._fieldType = FieldInputTypeEnum.Label;
390
+ return this;
391
+ }
392
+ asText() {
393
+ this._fieldType = FieldInputTypeEnum.Text;
394
+ return this;
395
+ }
396
+ asTextarea(rows = 3) {
397
+ this._fieldType = FieldInputTypeEnum.Textarea;
398
+ this._rows = rows;
399
+ return this;
400
+ }
401
+ asNumber() {
402
+ this._fieldType = FieldInputTypeEnum.Number;
403
+ return this;
404
+ }
405
+ asCurrency(currencyFromProperty, currency, currencyDisplay) {
406
+ this._fieldType = FieldInputTypeEnum.Currency;
407
+ this._currencyFromProperty = currencyFromProperty;
408
+ this._currency = currency ?? this._currency;
409
+ this._currencyDisplay = currencyDisplay ?? this._currencyDisplay;
410
+ return this.withNumberFractions(2, 2);
411
+ }
412
+ asSwitch() {
413
+ this._fieldType = FieldInputTypeEnum.Switch;
414
+ return this;
415
+ }
416
+ asRadio(options, optionsTitlePath) {
417
+ this._fieldType = FieldInputTypeEnum.Radio;
418
+ this._radioOptions = options.map(o => ({ value: o, title: `${optionsTitlePath ? `${optionsTitlePath}.` : ''}${o}` }));
419
+ return this;
420
+ }
421
+ asRadioFromEnum(enumType, optionsTitlePath, values, nameAsValue = false) {
422
+ this._fieldType = FieldInputTypeEnum.Radio;
423
+ if (typeof optionsTitlePath === 'undefined') {
424
+ optionsTitlePath = TypeUtil.findEnumName(enumType);
425
+ }
426
+ this._radioOptions = Array.isArray(values)
427
+ ? EnumUtil.fromValuesAsEnumValueArray(enumType, values, nameAsValue, optionsTitlePath ?? undefined)
428
+ : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
429
+ return this;
430
+ }
431
+ asDatePicker(format, min, max, showTime, showSeconds) {
432
+ this._fieldType = FieldInputTypeEnum.Datepicker;
433
+ this._datePickerFormat = format;
434
+ this._datePickerMin = min;
435
+ this._datePickerMax = max;
436
+ this._datePickerShowTime = showTime ?? false;
437
+ this._datePickerShowSeconds = showSeconds ?? true;
438
+ return this;
439
+ }
440
+ asMask(mask, slotChar) {
441
+ this._fieldType = FieldInputTypeEnum.Mask;
442
+ this._mask = mask;
443
+ this._slotChar = slotChar;
444
+ return this;
445
+ }
446
+ asFile(multiple = false, maxFileSize = 500000, accept) {
447
+ this._fieldType = FieldInputTypeEnum.File;
448
+ this._fileMultiple = multiple;
449
+ this._fileMaxFileSize = maxFileSize;
450
+ this._fileAccept = accept;
451
+ return this;
452
+ }
453
+ asImageFile(multiple = false, maxFileSize = 500000, accept = 'image/*') {
454
+ this.asFile(multiple, maxFileSize, accept);
455
+ this._fieldType = FieldInputTypeEnum.ImageFile;
456
+ return this;
457
+ }
458
+ asImageUrl(multiple = false, preview = true, inputVisibleOnDisabled = true) {
459
+ this._fieldType = FieldInputTypeEnum.ImageUrl;
460
+ this._fileMultiple = multiple;
461
+ this._imagePreview = preview;
462
+ this._imageUrlInputHiddenOnDisabled = inputVisibleOnDisabled;
463
+ return this;
464
+ }
465
+ asCustomComponent(customComponentName) {
466
+ this._fieldType = FieldInputTypeEnum.Custom;
467
+ this._customComponentName = customComponentName;
468
+ return this;
469
+ }
470
+ withNumberValidation(min, max, step, autoCorrect = true) {
471
+ this._numberStep = step ?? this._numberStep;
472
+ this._numberAutoCorrect = autoCorrect;
473
+ this._numberMin = min ?? this._numberMin ?? Number.MIN_SAFE_INTEGER;
474
+ this._numberMax = max ?? this._numberMax ?? Number.MAX_SAFE_INTEGER;
475
+ return this;
476
+ }
477
+ withLocale(locale) {
478
+ this._locale = locale;
479
+ return this;
480
+ }
481
+ withNumberFractions(min, max) {
482
+ this._numberMinFractionDigits = min;
483
+ this._numberMaxFractionDigits = max;
484
+ return this;
485
+ }
486
+ withNumberGrouping(useGrouping = true) {
487
+ this._numberUseGrouping = useGrouping;
488
+ return this;
489
+ }
490
+ withTextValidation(minLength, maxLength, pattern) {
491
+ this._minLength = minLength;
492
+ this._maxLength = maxLength;
493
+ this._pattern = pattern;
494
+ return this;
495
+ }
496
+ withTextValidationEmail() {
497
+ if (this.fieldType === FieldInputTypeEnum.Text) {
498
+ this.withValidation('email', Validators.email);
499
+ }
500
+ return this;
501
+ }
502
+ withFileOnSelectHandler(fn) {
503
+ this._fileOnSelectHandler = fn;
504
+ }
505
+ copy() {
506
+ const field = new FieldInputDescriptor(this._editor, this._property);
507
+ this.copyFieldsTo(field);
508
+ field._fieldType = this._fieldType;
509
+ field._rows = this._rows;
510
+ field._numberMin = this._numberMin;
511
+ field._numberMax = this._numberMax;
512
+ field._numberStep = this._numberStep;
513
+ field._numberAutoCorrect = this._numberAutoCorrect;
514
+ field._numberMinFractionDigits = this._numberMinFractionDigits;
515
+ field._numberMaxFractionDigits = this._numberMaxFractionDigits;
516
+ field._numberUseGrouping = this._numberUseGrouping;
517
+ field._radioOptions = [...this._radioOptions];
518
+ field._datePickerFormat = this._datePickerFormat;
519
+ field._datePickerMin = this._datePickerMin;
520
+ field._datePickerMax = this._datePickerMax;
521
+ field._datePickerShowTime = this._datePickerShowTime;
522
+ field._datePickerShowSeconds = this._datePickerShowSeconds;
523
+ field._maxLength = this._maxLength;
524
+ field._minLength = this._minLength;
525
+ field._pattern = this._pattern;
526
+ field._mask = this._mask;
527
+ field._slotChar = this._slotChar;
528
+ field._fileMultiple = this._fileMultiple;
529
+ field._fileMaxFileSize = this._fileMaxFileSize;
530
+ field._fileAccept = this._fileAccept;
531
+ field._fileOnSelectHandler = this._fileOnSelectHandler;
532
+ field._imagePreview = this._imagePreview;
533
+ field._imageUrlInputHiddenOnDisabled = this._imageUrlInputHiddenOnDisabled;
534
+ field._customComponentName = this._customComponentName;
535
+ field._locale = this._locale;
536
+ field._currency = this._currency;
537
+ field._currencyDisplay = this._currencyDisplay;
538
+ field._currencyFromProperty = this._currencyFromProperty;
539
+ return field;
540
+ }
541
+ }
542
+ export class FieldActionDescriptor extends AFieldDescriptor {
543
+ constructor(editor, property) {
544
+ super(editor, property);
545
+ this._button = new ActionButtonDescriptor();
546
+ this._fieldActionName = property;
547
+ let displayName = property;
548
+ if (this._editor.model)
549
+ displayName = `${this._editor.model.typeName}.${displayName}`;
550
+ this._fieldActionNameLong = displayName;
551
+ }
552
+ get button() {
553
+ return this._button;
554
+ }
555
+ get runFunction() {
556
+ return this._runFunction;
557
+ }
558
+ withButtonDescriptor(button) {
559
+ this._button = button;
560
+ return this;
561
+ }
562
+ withButton(label, icon = null, styleLevel = StyleLevelEnum.Default, styleText = false) {
563
+ this._button = new ActionButtonDescriptor().withLabel(label).withIcon(icon).withStyleClass(new ButtonStyleBuilder(styleLevel).withTextButton(styleText));
564
+ return this;
565
+ }
566
+ withRunFunction(fn) {
567
+ this._runFunction = fn;
568
+ return this;
569
+ }
570
+ copy() {
571
+ const field = new FieldActionDescriptor(this._editor, this._property);
572
+ this.copyFieldsTo(field);
573
+ field._button = this._button.copy();
574
+ field._runFunction = this._runFunction?.bind(field);
575
+ return field;
576
+ }
577
+ }
578
+ export class FieldLookupDescriptor extends AFieldDescriptor {
579
+ constructor(editor, property, modelType) {
580
+ super(editor, property);
581
+ this._lookupType = FieldLookupTypeEnum.Dropdown;
582
+ this._itemsLabelTranslate = false;
583
+ this._dropdownClassName = 'mng-filter-lookup-dropdown';
584
+ this._autocompleteOpenOnFocus = false;
585
+ this._autocompleteInlineSearch = false;
586
+ this._autocompleteAutoClear = false;
587
+ this._autocompleteSelectFirst = false;
588
+ this._modelType = modelType;
589
+ ModelUtil.trySetLookupItemsProperties(this);
590
+ }
591
+ get lookupType() {
592
+ return this._lookupType;
593
+ }
594
+ get itemsLabelProperty() {
595
+ return this._itemsLabelProperty;
596
+ }
597
+ get itemsLabelTranslate() {
598
+ return this._itemsLabelTranslate;
599
+ }
600
+ get itemsValueProperty() {
601
+ return this._itemsValueProperty;
602
+ }
603
+ get itemsDisabledProperty() {
604
+ return this._itemsDisabledProperty;
605
+ }
606
+ get dataKeyProperty() {
607
+ return this._dataKeyProperty;
608
+ }
609
+ get dataProvider() {
610
+ return this._dataProvider;
611
+ }
612
+ get autocompleteOpenOnFocus() {
613
+ return this._autocompleteOpenOnFocus;
614
+ }
615
+ get autocompleteInlineSearch() {
616
+ return this._autocompleteInlineSearch;
617
+ }
618
+ get autocompleteAutoClear() {
619
+ return this._autocompleteAutoClear;
620
+ }
621
+ get autocompleteSelectFirst() {
622
+ return this._autocompleteSelectFirst;
623
+ }
624
+ get dropdownClassName() {
625
+ return this._dropdownClassName;
626
+ }
627
+ get modelType() {
628
+ return this._modelType;
629
+ }
630
+ get dialogTableDescriptor() {
631
+ return this._dialogTableDescriptor;
632
+ }
633
+ get dialogTableDataProvider() {
634
+ return this._dialogTableDataProvider;
635
+ }
636
+ get customComponentName() {
637
+ return this._customComponentName;
638
+ }
639
+ withItemsLabelProperty(itemsLabelProperty, translate = false) {
640
+ this._itemsLabelProperty = itemsLabelProperty;
641
+ this._itemsLabelTranslate = translate;
642
+ return this;
643
+ }
644
+ withItemsValueProperty(itemsValueProperty) {
645
+ this._itemsValueProperty = itemsValueProperty;
646
+ this._dataKeyProperty = undefined;
647
+ return this;
648
+ }
649
+ withItemsDisabledProperty(itemsDisabledProperty) {
650
+ this._itemsDisabledProperty = itemsDisabledProperty;
651
+ return this;
652
+ }
653
+ withDataKeyProperty(property) {
654
+ this._dataKeyProperty = property;
655
+ this._itemsValueProperty = undefined;
656
+ return this;
657
+ }
658
+ withLookup(lookup, serviceType) {
659
+ const dataProvider = new LookupDataProvider(this._modelType);
660
+ if (serviceType) {
661
+ dataProvider.withServiceType(serviceType);
662
+ }
663
+ dataProvider.withLookup(lookup);
664
+ this._dataProvider = dataProvider;
665
+ return this;
666
+ }
667
+ withLookupDataProvider(dataProvider) {
668
+ this._dataProvider = dataProvider;
669
+ return this;
670
+ }
671
+ withConfig(config) {
672
+ return super.withConfig(config);
673
+ }
674
+ asAutocomplete(openOnFocus = false, inlineSearch = false, selectFirst = false, autoClear = false) {
675
+ this._lookupType = FieldLookupTypeEnum.Autocomplete;
676
+ this._autocompleteAutoClear = autoClear;
677
+ this._autocompleteSelectFirst = selectFirst;
678
+ this._autocompleteOpenOnFocus = openOnFocus;
679
+ this._autocompleteInlineSearch = inlineSearch;
680
+ return this;
681
+ }
682
+ asDialog(lookupTableDescriptor, tableDataProvider) {
683
+ this._lookupType = FieldLookupTypeEnum.Dialog;
684
+ this._dialogTableDescriptor = lookupTableDescriptor;
685
+ this._dialogTableDataProvider = tableDataProvider;
686
+ return this;
687
+ }
688
+ asCustomComponent(customComponentName) {
689
+ this._lookupType = FieldLookupTypeEnum.Custom;
690
+ this._customComponentName = customComponentName;
691
+ return this;
692
+ }
693
+ copy() {
694
+ const field = new FieldLookupDescriptor(this._editor, this._property, this._modelType);
695
+ this.copyFieldsTo(field);
696
+ field._lookupType = this._lookupType;
697
+ field._itemsLabelProperty = this._itemsLabelProperty;
698
+ field._itemsLabelTranslate = this._itemsLabelTranslate;
699
+ field._itemsValueProperty = this._itemsValueProperty;
700
+ field._itemsDisabledProperty = this._itemsDisabledProperty;
701
+ field._dataKeyProperty = this._dataKeyProperty;
702
+ field._dataProvider = this._dataProvider;
703
+ field._dropdownClassName = this._dropdownClassName;
704
+ field._autocompleteOpenOnFocus = this._autocompleteOpenOnFocus;
705
+ field._autocompleteInlineSearch = this._autocompleteInlineSearch;
706
+ field._dialogTableDescriptor = this._dialogTableDescriptor;
707
+ return field;
708
+ }
709
+ }
710
+ export class FieldLookupEnumDescriptor extends FieldLookupDescriptor {
711
+ constructor(editor, property, enumType, options, nameAsValue = false, optionsTitlePath) {
712
+ super(editor, property, null);
713
+ this._nameAsValue = false;
714
+ this._enumType = enumType;
715
+ this._nameAsValue = nameAsValue;
716
+ if (typeof optionsTitlePath === 'undefined') {
717
+ optionsTitlePath = TypeUtil.findEnumName(enumType);
718
+ }
719
+ this._optionEnumValues = Array.isArray(options)
720
+ ? EnumUtil.fromValuesAsEnumValueArray(enumType, options, nameAsValue, optionsTitlePath ?? undefined)
721
+ : EnumUtil.fromConstantsAsEnumValueArray(enumType, nameAsValue, optionsTitlePath ?? undefined);
722
+ const dataProvider = new LookupDataProvider(null).withLookup(() => of(this._optionEnumValues));
723
+ this.withLookupDataProvider(dataProvider);
724
+ this.withItemsLabelProperty('title', optionsTitlePath !== null);
725
+ this.withItemsValueProperty('value');
726
+ this.withItemsDisabledProperty('disabled');
727
+ }
728
+ get enumType() {
729
+ return this._enumType;
730
+ }
731
+ withDisabledOptions(...disabledOptions) {
732
+ for (const disabledOption of disabledOptions) {
733
+ const disabledOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, disabledOption) : disabledOption;
734
+ if (disabledOptionValue) {
735
+ const option = this._optionEnumValues.find(o => o.value === disabledOptionValue);
736
+ if (option) {
737
+ option.disabled = true;
738
+ }
739
+ }
740
+ }
741
+ return this;
742
+ }
743
+ withDefaultValueEnum(defaultValue) {
744
+ const defaultOptionValue = this._nameAsValue ? EnumUtil.getConstantName(this._enumType, defaultValue) : defaultValue;
745
+ if (defaultOptionValue) {
746
+ const option = this._optionEnumValues.find(o => o.value === defaultOptionValue);
747
+ if (option) {
748
+ this.withDefaultValue(this._itemsValueProperty ? option[this._itemsValueProperty] : option);
749
+ }
750
+ }
751
+ return this;
752
+ }
753
+ asAutocomplete(openOnFocus = true) {
754
+ super.asAutocomplete(openOnFocus, true);
755
+ return this;
756
+ }
757
+ copy() {
758
+ const field = new FieldLookupEnumDescriptor(this._editor, this._property, this._enumType, []);
759
+ this.copyFieldsTo(field);
760
+ field._lookupType = this._lookupType;
761
+ field._itemsLabelProperty = this._itemsLabelProperty;
762
+ field._itemsValueProperty = this._itemsValueProperty;
763
+ field._itemsDisabledProperty = this._itemsDisabledProperty;
764
+ field._dataKeyProperty = this._dataKeyProperty;
765
+ field._dataProvider = this._dataProvider;
766
+ return field;
767
+ }
768
+ }
769
+ export class FieldManyToManyEditorDescriptor extends AFieldDescriptor {
770
+ constructor(editor, property, mainTableDescriptor, lookupTableDescriptor) {
771
+ super(editor, property);
772
+ this._fieldType = FieldManyToManyEditorTypeEnum.DialogTableMultiselect;
773
+ this._lookupTableDataProvider = null;
774
+ this._actions = [];
775
+ this._hasLookupExcludeValues = false;
776
+ this._excludeFilterProperty = '';
777
+ this._excludeValueProperty = '';
778
+ this._mainTableDescriptor = mainTableDescriptor;
779
+ this._lookupTableDescriptor = lookupTableDescriptor;
780
+ this._actions.push(FieldManyToManyEditorActionEnum.Add, FieldManyToManyEditorActionEnum.Delete);
781
+ }
782
+ get fieldType() {
783
+ return this._fieldType;
784
+ }
785
+ get lookupTableDataProvider() {
786
+ return this._lookupTableDataProvider;
787
+ }
788
+ get actions() {
789
+ return this._actions;
790
+ }
791
+ get hasLookupExcludeValues() {
792
+ return this._hasLookupExcludeValues;
793
+ }
794
+ get excludeFilterProperty() {
795
+ return this._excludeFilterProperty;
796
+ }
797
+ get excludeValueProperty() {
798
+ return this._excludeValueProperty;
799
+ }
800
+ get mainTableDescriptor() {
801
+ return this._mainTableDescriptor;
802
+ }
803
+ get lookupTableDescriptor() {
804
+ return this._lookupTableDescriptor;
805
+ }
806
+ withLookup(getAll, serviceType) {
807
+ const dataProvider = new TableviewDataProvider(this._mainTableDescriptor.model.type);
808
+ if (serviceType) {
809
+ dataProvider.withServiceType(serviceType);
810
+ }
811
+ dataProvider.withGetAll(getAll);
812
+ this._lookupTableDataProvider = dataProvider;
813
+ return this;
814
+ }
815
+ withLookupDataProvider(dataProvider) {
816
+ this._lookupTableDataProvider = dataProvider;
817
+ return this;
818
+ }
819
+ withActions(actions = []) {
820
+ this.actions.push(...actions);
821
+ return this;
822
+ }
823
+ withLookupExclude(filterProperty, valueProperty, hasLookupExclude = true) {
824
+ this._hasLookupExcludeValues = hasLookupExclude;
825
+ this._excludeFilterProperty = filterProperty;
826
+ this._excludeValueProperty = valueProperty;
827
+ return this;
828
+ }
829
+ copy() {
830
+ const field = new FieldManyToManyEditorDescriptor(this._editor, this._property, this._mainTableDescriptor.copy(), this._lookupTableDescriptor.copy());
831
+ this.copyFieldsTo(field);
832
+ field._fieldType = this._fieldType;
833
+ field._actions = this._actions.map(a => a);
834
+ field._lookupTableDataProvider = this._lookupTableDataProvider;
835
+ field._hasLookupExcludeValues = this._hasLookupExcludeValues;
836
+ field._excludeFilterProperty = this._excludeFilterProperty;
837
+ field._excludeValueProperty = this._excludeValueProperty;
838
+ return field;
839
+ }
840
+ }
841
+ export class FieldManyEditorDescriptor extends AFieldDescriptor {
842
+ constructor(editor, property, tableviewDescriptor) {
843
+ super(editor, property);
844
+ this._fieldType = FieldManyEditorTypeEnum.DialogEditor;
845
+ this._fieldActions = [];
846
+ this._actions = [];
847
+ // this._modelType = modelType;
848
+ this._tableviewDescriptor = tableviewDescriptor;
849
+ this._fieldActions.push(FieldManyEditorActionEnum.View, FieldManyEditorActionEnum.Add, FieldManyEditorActionEnum.Edit, FieldManyEditorActionEnum.Delete);
850
+ }
851
+ get fieldType() {
852
+ return this._fieldType;
853
+ }
854
+ get fieldActions() {
855
+ return this._fieldActions;
856
+ }
857
+ get actions() {
858
+ return this._actions;
859
+ }
860
+ get tableviewDescriptor() {
861
+ return this._tableviewDescriptor;
862
+ }
863
+ get tableDescriptor() {
864
+ return this._tableviewDescriptor.table;
865
+ }
866
+ get editorForCreate() {
867
+ return this._tableviewDescriptor.addEditor;
868
+ }
869
+ get editorForRead() {
870
+ return this._tableviewDescriptor.detailsEditor;
871
+ }
872
+ get editorForUpdate() {
873
+ return this._tableviewDescriptor.editEditor;
874
+ }
875
+ withFieldAction(action) {
876
+ this._fieldActions.push(action);
877
+ return this;
878
+ }
879
+ withFieldActions(actions) {
880
+ this._fieldActions = actions;
881
+ return this;
882
+ }
883
+ withAction(action) {
884
+ this._actions.push(action);
885
+ return this;
886
+ }
887
+ copy() {
888
+ const field = new FieldManyEditorDescriptor(this._editor, this._property, this._tableviewDescriptor.copy());
889
+ this.copyFieldsTo(field);
890
+ field._fieldType = this._fieldType;
891
+ field._fieldActions = this._fieldActions.map(a => a);
892
+ return field;
893
+ }
894
+ }
895
+ export class AFieldGroupDescriptor extends AGenericFieldDescriptor {
896
+ constructor(editor, name) {
897
+ super(editor);
898
+ this._fields = [];
899
+ this._validations = [];
900
+ this._name = `${this.baseName}${name}`;
901
+ this._default = name === EditorDescriptor.defaultGroupName;
902
+ }
903
+ removeField(property, filterFunction) {
904
+ this._fields = filterFunction(this._fields);
905
+ return this._fields;
906
+ }
907
+ get title() {
908
+ return this._title;
909
+ }
910
+ get validations() {
911
+ return this._validations;
912
+ }
913
+ get baseName() {
914
+ return `${this.groupName()}_`;
915
+ }
916
+ get name() {
917
+ return this._name;
918
+ }
919
+ get default() {
920
+ return this._default;
921
+ }
922
+ withTitle(title) {
923
+ this._title = title;
924
+ return this;
925
+ }
926
+ withValidation(name, validator, message) {
927
+ this._validations.push(new FieldValidationDescriptor(name, validator, message));
928
+ return this;
929
+ }
930
+ }
931
+ export class FieldTabGroupDescriptor extends AFieldGroupDescriptor {
932
+ constructor(editor, name) {
933
+ super(editor, name);
934
+ }
935
+ get fields() {
936
+ return this._fields;
937
+ }
938
+ groupName() {
939
+ return 'tab';
940
+ }
941
+ addField(field) {
942
+ this._fields.push(field);
943
+ return this;
944
+ }
945
+ copy() {
946
+ const tab = new FieldTabGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
947
+ tab._title = this._title;
948
+ tab._fields = this.fields.map(f => f.copy());
949
+ tab._validations = this.validations.map(v => v.copy());
950
+ return tab;
951
+ }
952
+ }
953
+ export class FieldGroupDescriptor extends AFieldGroupDescriptor {
954
+ constructor(editor, name) {
955
+ super(editor, name);
956
+ this._type = FieldGroupTypeEnum.Fieldset;
957
+ if (this._default) {
958
+ this.asLogical();
959
+ }
960
+ }
961
+ get type() {
962
+ return this._type;
963
+ }
964
+ get fields() {
965
+ return this._fields;
966
+ }
967
+ groupName() {
968
+ return 'group';
969
+ }
970
+ addField(field) {
971
+ this._fields.push(field);
972
+ return this;
973
+ }
974
+ asLogical() {
975
+ this._type = FieldGroupTypeEnum.Logical;
976
+ return this;
977
+ }
978
+ copy() {
979
+ const group = new FieldGroupDescriptor(this._editor, this.name.substring(this.baseName.length));
980
+ group._type = this._type;
981
+ group._title = this._title;
982
+ group._fields = this.fields.map(f => f.copy());
983
+ group._validations = this.validations.map(v => v.copy());
984
+ return group;
985
+ }
986
+ }
987
987
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZGVzY3JpcHRvcnMvZmllbGQuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWtCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzNELE9BQU8sRUFBYSxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRzdDLE9BQU8sRUFBQyxpQkFBaUIsRUFBbUQsTUFBTSwyQkFBMkIsQ0FBQztBQUU5RyxPQUFPLEVBQTBDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFckgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUM3QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFaEQsT0FBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNsRSxPQUFPLEVBQUMsc0JBQXNCLEVBQW9CLGdCQUFnQixFQUFFLHlCQUF5QixFQUFtQixtQkFBbUIsRUFBQyxNQUFNLElBQUksQ0FBQztBQUUvSSxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QiwrQkFBK0IsRUFDL0IsNkJBQTZCLEVBQzdCLGFBQWEsRUFDaEIsTUFBTSxTQUFTLENBQUM7QUFFakIsTUFBTSxPQUFnQix1QkFBdUI7SUFJekMsWUFBc0IsTUFBNEI7UUFGeEMsWUFBTyxHQUFnQixFQUFFLENBQUM7UUFHaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNiLE9BQU8s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QUM7SUFFRCxJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQTJDLENBQUM7SUFDNUQsQ0FBQztJQUVNLFNBQVM7UUFDWixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQWdDO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxTQUFTO1FBQ1osSUFBSSxDQUFDLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLElBQUk7UUFDUCxNQUFNLEtBQUssR0FBRyxJQUFJLG9CQUFvQixDQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZ30gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YmplY3QsIG9mfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVJlc3VsdH0gZnJvbSAnLi4vYXBpL21vZGVscyc7XG5pbXBvcnQge01uZ0Zvcm1GaWVsZEV2ZW50LCBNbmdGb3JtRmllbGRFdmVudERhdGEsIE1uZ0Zvcm1GaWVsZEV2ZW50VHlwZUVudW19IGZyb20gJy4uL2NvbXBvbmVudHMvZm9ybS9tb2RlbHMnO1xuaW1wb3J0IHtGaWVsZEFjdGlvbkNvbnRleHR9IGZyb20gJy4uL2NvbXBvbmVudHMvZm9ybS9tb2RlbHMvZmllbGQtYWN0aW9uLWNvbnRleHQubW9kZWwnO1xuaW1wb3J0IHtJTG9va3VwRGF0YVByb3ZpZGVyLCBJVGFibGVEYXRhUHJvdmlkZXIsIExvb2t1cERhdGFQcm92aWRlciwgVGFibGV2aWV3RGF0YVByb3ZpZGVyfSBmcm9tICcuLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge0VudW1WYWx1ZX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TW5nQ29tbW9uc1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzJztcbmltcG9ydCB7QnV0dG9uU3R5bGVCdWlsZGVyfSBmcm9tICcuLi9zdHlsZXMnO1xuaW1wb3J0IHtTdHlsZUxldmVsRW51bX0gZnJvbSAnLi4vc3R5bGVzL21vZGVscyc7XG5pbXBvcnQge0NsYXNzVHlwZSwgRW51bUNvbnN0YW50VHlwZSwgRW51bVR5cGUsIE1uZ0ZpZWxkQXN5bmNWYWxpZGF0b3IsIE1uZ0ZpZWxkVmFsaWRhdGlvbk1lc3NhZ2UsIE1uZ0ZpZWxkVmFsaWRhdG9yfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0VudW1VdGlsLCBJMThuVXRpbHMsIE1vZGVsVXRpbCwgVHlwZVV0aWx9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7QWN0aW9uQnV0dG9uRGVzY3JpcHRvciwgQWN0aW9uRGVzY3JpcHRvciwgRWRpdG9yRGVzY3JpcHRvciwgRmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvciwgVGFibGVEZXNjcmlwdG9yLCBUYWJsZXZpZXdEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5pbXBvcnQge0ZpZWxkQ29uZmlnLCBGaWVsZExvb2t1cENvbmZpZywgSUxvb2t1cERlc2NyaXB0b3J9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICAgIEZpZWxkR3JvdXBUeXBlRW51bSxcbiAgICBGaWVsZElucHV0VHlwZUVudW0sXG4gICAgRmllbGRMb29rdXBUeXBlRW51bSxcbiAgICBGaWVsZE1hbnlFZGl0b3JBY3Rpb25FbnVtLFxuICAgIEZpZWxkTWFueUVkaXRvclR5cGVFbnVtLFxuICAgIEZpZWxkTWFueVRvTWFueUVkaXRvckFjdGlvbkVudW0sXG4gICAgRmllbGRNYW55VG9NYW55RWRpdG9yVHlwZUVudW0sXG4gICAgRmllbGRTaXplRW51bVxufSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9lZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+O1xuICAgIHByb3RlY3RlZCBfY29uZmlnOiBGaWVsZENvbmZpZyA9IHt9O1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4pIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yID0gZWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29uZmlnKGNvbmZpZzogRmllbGRDb25maWcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wcm9wZXJ0eTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfbGFiZWw/OiBzdHJpbmcgfCBudWxsO1xuXG4gICAgcHJvdGVjdGVkIF9wbGFjZWhvbGRlcj86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2hlbHBUZXh0Pzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9yZXF1aXJlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfcmVxdWlyZWRIaWRlTGFiZWxNYXJrZXIgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0VmFsdWU/OiBUO1xuICAgIHByb3RlY3RlZCBfZ2V0dGVyPzogKGl0ZW06IEVUKSA9PiBUO1xuICAgIHByb3RlY3RlZCBfc2V0dGVyPzogKGl0ZW06IEVULCB2YWx1ZTogVCkgPT4gdm9pZDtcbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRpb25zOiBBcnJheTxGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yPiA9IFtdO1xuICAgIHByb3RlY3RlZCBfYXN5bmNWYWxpZGF0aW9uczogQXJyYXk8RmllbGRWYWxpZGF0aW9uRGVzY3JpcHRvcj4gPSBbXTtcbiAgICBwcm90ZWN0ZWQgX3JlcXVpcmVkRXhwcmVzc2lvbj86IHN0cmluZyB8ICgoZmllbGQ/OiBGb3JtbHlGaWVsZENvbmZpZykgPT4gYm9vbGVhbikgfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHByb3RlY3RlZCBfZGlzYWJsZWRFeHByZXNzaW9uPzogc3RyaW5nIHwgKChmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJvdGVjdGVkIF9oaWRkZW5FeHByZXNzaW9uPzogc3RyaW5nIHwgKChmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBwcm90ZWN0ZWQgX2NsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfZmllbGRDbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9sYWJlbENsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfaW5wdXRDbGFzc05hbWUgPSAnJztcbiAgICBwcm90ZWN0ZWQgX3NpemU6IEZpZWxkU2l6ZUVudW0gPSBGaWVsZFNpemVFbnVtLk5vcm1hbDtcblxuICAgIC8vIGxvY2FsaXphdGlvblxuICAgIHByb3RlY3RlZCBfaXNMb2NhbGl6ZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2xvY2FsaXphdGlvblRhYmxldmlldz86IFRhYmxldmlld0Rlc2NyaXB0b3I8YW55PjtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfZXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PE1uZ0Zvcm1GaWVsZEV2ZW50PFQsIEVUPj4oKTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGVkaXRvcik7XG4gICAgICAgIHRoaXMuX3Byb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gSTE4blV0aWxzLlR5cGUuZ2V0UHJvcGVydHlLZXkodGhpcy5fZWRpdG9yLm1vZGVsLmkxOG5CYXNlS2V5LCBwcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWxwVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlbHBUZXh0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkSGlkZUxhYmVsTWFya2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWRIaWRlTGFiZWxNYXJrZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0dGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFzeW5jVmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hc3luY1ZhbGlkYXRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWRFeHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWRFeHByZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWRFeHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWRFeHByZXNzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGlkZGVuRXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGRlbkV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZENsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkQ2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGFiZWxDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbENsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlucHV0Q2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvY2FsaXphdGlvblRhYmxldmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsaXphdGlvblRhYmxldmlldztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZVNtYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gRmllbGRTaXplRW51bS5TbWFsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZUxhcmdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gRmllbGRTaXplRW51bS5MYXJnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzTG9jYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2NhbGl6ZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFic3RyYWN0IGNvcHkoKTogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD47XG5cbiAgICBwdWJsaWMgd2l0aExhYmVsKGxhYmVsOiBzdHJpbmcgfCBudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gbGFiZWw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUGxhY2Vob2xkZXIocGxhY2Vob2xkZXI6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEhlbHBUZXh0KGhlbHBUZXh0OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGVscFRleHQgPSBoZWxwVGV4dDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSZXF1aXJlZChyZXF1aXJlZCA9IHRydWUsIHJlcXVpcmVkRXhwcmVzc2lvbj86IHN0cmluZyB8ICgoZmllbGQ/OiBGb3JtbHlGaWVsZENvbmZpZykgPT4gYm9vbGVhbikgfCBPYnNlcnZhYmxlPGJvb2xlYW4+LCBoaWRlTGFiZWxNYXJrZXIgPSBmYWxzZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IHJlcXVpcmVkO1xuICAgICAgICBpZiAocmVxdWlyZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1aXJlZEV4cHJlc3Npb24gPSByZXF1aXJlZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVxdWlyZWRIaWRlTGFiZWxNYXJrZXIgPSBoaWRlTGFiZWxNYXJrZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGlzYWJsZWQoZGlzYWJsZWQgPSB0cnVlLCBkaXNhYmxlZEV4cHJlc3Npb24/OiBzdHJpbmcgfCAoKGZpZWxkPzogRm9ybWx5RmllbGRDb25maWcpID0+IGJvb2xlYW4pIHwgT2JzZXJ2YWJsZTxib29sZWFuPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICBpZiAoZGlzYWJsZWRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlZEV4cHJlc3Npb24gPSBkaXNhYmxlZEV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhIaWRkZW4oaGlkZGVuRXhwcmVzc2lvbjogc3RyaW5nIHwgKChmaWVsZD86IEZvcm1seUZpZWxkQ29uZmlnKSA9PiBib29sZWFuKSB8IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faGlkZGVuRXhwcmVzc2lvbiA9IGhpZGRlbkV4cHJlc3Npb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZTogVCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoR2V0dGVyKGdldHRlcjogKGl0ZW06IEVUKSA9PiBUKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2dldHRlciA9IGdldHRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXR0ZXIoc2V0dGVyOiAoaXRlbTogRVQsIHZhbHVlOiBUKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3NldHRlciA9IHNldHRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhWYWxpZGF0aW9uKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yPzogTW5nRmllbGRWYWxpZGF0b3IsIG1lc3NhZ2U/OiBNbmdGaWVsZFZhbGlkYXRpb25NZXNzYWdlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRpb25zLnB1c2gobmV3IEZpZWxkVmFsaWRhdGlvbkRlc2NyaXB0b3IobmFtZSwgdmFsaWRhdG9yLCBtZXNzYWdlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQXN5bmNWYWxpZGF0aW9uKG5hbWU6IHN0cmluZywgYXN5bmNWYWxpZGF0b3I/OiBNbmdGaWVsZEFzeW5jVmFsaWRhdG9yLCBtZXNzYWdlPzogTW5nRmllbGRWYWxpZGF0aW9uTWVzc2FnZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9hc3luY1ZhbGlkYXRpb25zLnB1c2gobmV3IEZpZWxkVmFsaWRhdGlvbkRlc2NyaXB0b3IobmFtZSwgYXN5bmNWYWxpZGF0b3IsIG1lc3NhZ2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcsIGxhYmVsQ2xhc3NOYW1lID0gJycsIGlucHV0Q2xhc3NOYW1lID0gJycsIGZpZWxkQ2xhc3NOYW1lPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fbGFiZWxDbGFzc05hbWUgPSBsYWJlbENsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5faW5wdXRDbGFzc05hbWUgPSBpbnB1dENsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5fZmllbGRDbGFzc05hbWUgPSBmaWVsZENsYXNzTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTaXplKHNpemU6IEZpZWxkU2l6ZUVudW0gPSBGaWVsZFNpemVFbnVtLk5vcm1hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYWRkcyBhbiBpY29uIHdpdGggdGV4dCBTaG93IGFsbCB0cmFuc2xhdGlvbnMgYWJvdmUgdGhlIGZpZWxkIGFuZCBhZnRlciBjbGlja2luZyBvbiBpdCwgaXQgZGlzcGxheXMgYSBuZXcgZGlhbG9nIHdpdGggdGFibGV2aWV3LlxuICAgICAqIFRoaXMgbmV3IHRhYmxlIHZpZXcgc2hvd3MgYWxsIGF2YWlsYWJsZSB0cmFuc2xhdGlvbnMgZm9yIHNwZWNpZmljIHByb3BlcnR5IGFuZCBhbGxvd3MgZWRpdGluZyBpdC5cbiAgICAgKiBAcGFyYW0gdGFibGV2aWV3IHdpdGggbG9va3VwIHByb3ZpZGVyIGZvciBsb2NhbGVzXG4gICAgICovXG4gICAgcHVibGljIGxvY2FsaXplZCh0YWJsZXZpZXc/OiBUYWJsZXZpZXdEZXNjcmlwdG9yPFQ+KTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5lZGl0b3IuaXNMb2NhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLmxvY2FsaXplZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzTG9jYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRhYmxldmlldykge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxpemF0aW9uVGFibGV2aWV3ID0gdGFibGV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxpemF0aW9uVGFibGV2aWV3RGVzY3JpcHRvciA9IG5ldyBUYWJsZXZpZXdEZXNjcmlwdG9yKHRoaXMuX2VkaXRvci5sb2NhbGl6YXRpb25CZWFuVHlwZSEpO1xuICAgICAgICAgICAgbG9jYWxpemF0aW9uVGFibGV2aWV3RGVzY3JpcHRvci5hZGRDb2x1bW4odGhpcy5fZWRpdG9yLmxvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5ISk7XG4gICAgICAgICAgICBsb2NhbGl6YXRpb25UYWJsZXZpZXdEZXNjcmlwdG9yLmFkZENvbHVtbih0aGlzLnByb3BlcnR5KTtcblxuICAgICAgICAgICAgbG9jYWxpemF0aW9uVGFibGV2aWV3RGVzY3JpcHRvclxuICAgICAgICAgICAgICAgIC5hZGRGaWVsZExvb2t1cCh0aGlzLl9lZGl0b3IubG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHkhLCBTdHJpbmcpXG4gICAgICAgICAgICAgICAgLndpdGhMb29rdXAoKHFwLCBzZXJ2aWNlKSA9PiBvZihzZXJ2aWNlIS5hcHBEYXRhTGFuZ3VhZ2VzKSwgTW5nQ29tbW9uc1NlcnZpY2UpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VkaXRvci5sb2NhbGVMb29rdXApIHtcbiAgICAgICAgICAgICAgICBsb2NhbGl6YXRpb25UYWJsZXZpZXdEZXNjcmlwdG9yLmFkZEZpZWxkTG9va3VwKHRoaXMuX2VkaXRvci5sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSEsIFN0cmluZykud2l0aExvb2t1cCgoKSA9PiB0aGlzLl9lZGl0b3IubG9jYWxlTG9va3VwISgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsaXphdGlvblRhYmxldmlld0Rlc2NyaXB0b3IuYWRkRmllbGQodGhpcy5wcm9wZXJ0eSk7XG5cbiAgICAgICAgICAgIC8vIHRoaXMgaXMgdXNlZCBpbiB0YWJsZS5jb21wb25lbnQgdG8gbWFyayByb3cgd2l0aCBkZWZhdWx0IGRhdGEgbGFuZ3VhZ2VcbiAgICAgICAgICAgIGxvY2FsaXphdGlvblRhYmxldmlld0Rlc2NyaXB0b3IudGFibGUud2l0aExvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5KHRoaXMuX2VkaXRvci5sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSEpO1xuXG4gICAgICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25UYWJsZXZpZXcgPSBuZXcgVGFibGV2aWV3RGVzY3JpcHRvcih0aGlzLl9lZGl0b3IubW9kZWwudHlwZSk7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25UYWJsZXZpZXcuYWRkRmllbGRNYW55RWRpdG9yKHRoaXMuX2VkaXRvci5sb2NhbGl6YXRpb25Mb2NhbGl6YXRpb25Qcm9wZXJ0eSEsIGxvY2FsaXphdGlvblRhYmxldmlld0Rlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0RXZlbnQodHlwZTogTW5nRm9ybUZpZWxkRXZlbnRUeXBlRW51bSwgY21wVHlwZTogVHlwZTxhbnk+LCBjbXBJbnN0YW5jZTogYW55LCBkYXRhPzogTW5nRm9ybUZpZWxkRXZlbnREYXRhPFQsIEVUPikge1xuICAgICAgICB0aGlzLl9ldmVudHNTdWJqZWN0Lm5leHQobmV3IE1uZ0Zvcm1GaWVsZEV2ZW50KHR5cGUsIGNtcFR5cGUsIGNtcEluc3RhbmNlLCBkYXRhKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBldmVudHMkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY29weUZpZWxkc1RvKG9iajogQUZpZWxkRGVzY3JpcHRvcjxULCBFVD4pIHtcbiAgICAgICAgb2JqLl9sYWJlbCA9IHRoaXMuX2xhYmVsO1xuICAgICAgICBvYmouX3BsYWNlaG9sZGVyID0gdGhpcy5fcGxhY2Vob2xkZXI7XG4gICAgICAgIG9iai5faGVscFRleHQgPSB0aGlzLl9oZWxwVGV4dDtcbiAgICAgICAgb2JqLl9yZXF1aXJlZCA9IHRoaXMuX3JlcXVpcmVkO1xuICAgICAgICBvYmouX2Rpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XG4gICAgICAgIG9iai5fZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICBvYmouX3JlcXVpcmVkRXhwcmVzc2lvbiA9IHRoaXMuX3JlcXVpcmVkRXhwcmVzc2lvbjtcbiAgICAgICAgb2JqLl9oaWRkZW5FeHByZXNzaW9uID0gdGhpcy5faGlkZGVuRXhwcmVzc2lvbjtcbiAgICAgICAgb2JqLl9kaXNhYmxlZEV4cHJlc3Npb24gPSB0aGlzLl9kaXNhYmxlZEV4cHJlc3Npb247XG4gICAgICAgIG9iai5fY2xhc3NOYW1lID0gdGhpcy5fY2xhc3NOYW1lO1xuICAgICAgICBvYmouX3NpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIG9iai5fZ2V0dGVyID0gdGhpcy5fZ2V0dGVyO1xuICAgICAgICBvYmouX3NldHRlciA9IHRoaXMuX3NldHRlcjtcbiAgICAgICAgb2JqLl9pc0xvY2FsaXplZCA9IHRoaXMuX2lzTG9jYWxpemVkO1xuICAgICAgICBvYmouX2xvY2FsaXphdGlvblRhYmxldmlldyA9IHRoaXMuX2xvY2FsaXphdGlvblRhYmxldmlldz8uY29weSgpO1xuICAgICAgICBvYmouX3ZhbGlkYXRpb25zID0gdGhpcy5fdmFsaWRhdGlvbnMubWFwKHZhbHVlID0+IHZhbHVlLmNvcHkoKSk7XG4gICAgICAgIG9iai5fYXN5bmNWYWxpZGF0aW9ucyA9IHRoaXMuX2FzeW5jVmFsaWRhdGlvbnMubWFwKHZhbHVlID0+IHZhbHVlLmNvcHkoKSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRJbnB1dERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUZpZWxkRGVzY3JpcHRvcjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlIHwgRmlsZSB8IEZpbGVbXSwgRVQ+IHtcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkSW5wdXRUeXBlRW51bSA9IEZpZWxkSW5wdXRUeXBlRW51bS5UZXh0O1xuXG4gICAgLy8gdGV4dGFyZWEgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX3Jvd3M/OiBudW1iZXI7XG5cbiAgICAvLyBudW1iZXIgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX251bWJlck1pbj86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJNYXg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyU3RlcD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9udW1iZXJBdXRvQ29ycmVjdCA9IHRydWU7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWluRnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbnVtYmVyVXNlR3JvdXBpbmcgPSB0cnVlO1xuICAgIHByaXZhdGUgX2xvY2FsZT86IHN0cmluZztcblxuICAgIC8vIGN1cnJlbmN5IHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9jdXJyZW5jeT86IHN0cmluZztcbiAgICBwcml2YXRlIF9jdXJyZW5jeURpc3BsYXk6ICdzeW1ib2wnIHwgJ2NvZGUnIHwgJ25hbWUnID0gJ3N5bWJvbCc7XG4gICAgcHJpdmF0ZSBfY3VycmVuY3lGcm9tUHJvcGVydHk/OiBzdHJpbmc7XG5cbiAgICAvLyByYWRpbyBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfcmFkaW9PcHRpb25zOiBBcnJheTxFbnVtVmFsdWU8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGU+PiA9IFtdO1xuXG4gICAgLy8gZGF0ZXBpY2tlciBzcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgcHJpdmF0ZSBfZGF0ZVBpY2tlckZvcm1hdD86IHN0cmluZztcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyTWluPzogRGF0ZTtcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyTWF4PzogRGF0ZTtcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyU2hvd1RpbWUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9kYXRlUGlja2VyU2hvd1NlY29uZHMgPSB0cnVlO1xuXG4gICAgLy8gaW5wdXQgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX21heExlbmd0aD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9taW5MZW5ndGg/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfcGF0dGVybj86IHN0cmluZyB8IFJlZ0V4cDtcblxuICAgIC8vIG1hc2sgc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHByaXZhdGUgX21hc2s/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfc2xvdENoYXI/OiBzdHJpbmc7XG5cbiAgICAvLyBmaWxlIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9maWxlTXVsdGlwbGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9maWxlTWF4RmlsZVNpemUgPSA1MDAwMDA7XG4gICAgcHJpdmF0ZSBfZmlsZUFjY2VwdD86IHN0cmluZztcbiAgICBwcml2YXRlIF9maWxlT25TZWxlY3RIYW5kbGVyPzogKGZpbGU6IEZpbGVbXSB8IG51bGwsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gdm9pZDtcblxuICAgIC8vIGltYWdlIHNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9pbWFnZVByZXZpZXcgPSB0cnVlO1xuICAgIHByaXZhdGUgX2ltYWdlVXJsSW5wdXRIaWRkZW5PbkRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAvLyBjdXN0b20gY29tcG9uZW50IHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9jdXN0b21Db21wb25lbnROYW1lPzogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBmaWVsZCB0byBnaXZlbiB0eXBlIHdpdGggYWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICAgKiBAcGFyYW0gZmllbGRUeXBlIGZpZWxkIHR5cGUgZW51bVxuICAgICAqIEBwYXJhbSBhcmdzIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgZmllbGQgKG9wdGlvbmFsKVxuICAgICAqL1xuICAgIHB1YmxpYyBhc1R5cGUoZmllbGRUeXBlOiBGaWVsZElucHV0VHlwZUVudW0sIC4uLmFyZ3M6IGFueVtdKTogdGhpcyB7XG4gICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5IaWRkZW46XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNIaWRkZW4oKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRJbnB1dFR5cGVFbnVtLkxhYmVsOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzTGFiZWwoKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRJbnB1dFR5cGVFbnVtLlRleHRhcmVhOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzVGV4dGFyZWEoLi4uYXJncyk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRJbnB1dFR5cGVFbnVtLkN1cnJlbmN5OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzQ3VycmVuY3koLi4uYXJncyk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5Td2l0Y2g6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNTd2l0Y2goKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRJbnB1dFR5cGVFbnVtLlJhZGlvOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzUmFkaW8oYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5EYXRlcGlja2VyOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzRGF0ZVBpY2tlciguLi5hcmdzKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRJbnB1dFR5cGVFbnVtLk1hc2s6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNNYXNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgY2FzZSBGaWVsZElucHV0VHlwZUVudW0uRmlsZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hc0ZpbGUoLi4uYXJncyk7XG4gICAgICAgICAgICBjYXNlIEZpZWxkSW5wdXRUeXBlRW51bS5JbWFnZUZpbGU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNJbWFnZUZpbGUoKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRJbnB1dFR5cGVFbnVtLkltYWdlVXJsOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFzSW1hZ2VVcmwoKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRJbnB1dFR5cGVFbnVtLkN1c3RvbTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hc0N1c3RvbUNvbXBvbmVudChhcmdzWzBdKTtcbiAgICAgICAgICAgIGNhc2UgRmllbGRJbnB1dFR5cGVFbnVtLlRleHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNUZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyTWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWluO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyTWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWF4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyU3RlcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclN0ZXA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJBdXRvQ29ycmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlckF1dG9Db3JyZWN0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbnVtYmVyTWluRnJhY3Rpb25EaWdpdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWJlck1heEZyYWN0aW9uRGlnaXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBudW1iZXJVc2VHcm91cGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclVzZUdyb3VwaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmFkaW9PcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmFkaW9PcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlckZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVQaWNrZXJGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlUGlja2VyTWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlck1pbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGVQaWNrZXJNYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlUGlja2VyTWF4O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlclNob3dUaW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZVBpY2tlclNob3dTZWNvbmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0ZVBpY2tlclNob3dTZWNvbmRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluTGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdHRlcm47XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYXNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFzaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNsb3RDaGFyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2xvdENoYXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlTXVsdGlwbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlTXVsdGlwbGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlTWF4RmlsZVNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlTWF4RmlsZVNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlQWNjZXB0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZUFjY2VwdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpbGVPblNlbGVjdEhhbmRsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlT25TZWxlY3RIYW5kbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaW1hZ2VQcmV2aWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1hZ2VQcmV2aWV3O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaW1hZ2VVcmxJbnB1dFZpc2libGVPbkRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW1hZ2VVcmxJbnB1dEhpZGRlbk9uRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXN0b21Db21wb25lbnROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbmN5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3k7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW5jeUZyb21Qcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbmN5RnJvbVByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVuY3lEaXNwbGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lEaXNwbGF5O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0hpZGRlbigpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLkhpZGRlbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzTGFiZWwoKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5MYWJlbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzVGV4dCgpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLlRleHQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc1RleHRhcmVhKHJvd3MgPSAzKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5UZXh0YXJlYTtcbiAgICAgICAgdGhpcy5fcm93cyA9IHJvd3M7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc051bWJlcigpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLk51bWJlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzQ3VycmVuY3koY3VycmVuY3lGcm9tUHJvcGVydHk/OiBzdHJpbmcsIGN1cnJlbmN5Pzogc3RyaW5nLCBjdXJyZW5jeURpc3BsYXk/OiAnc3ltYm9sJyB8ICdjb2RlJyB8ICduYW1lJyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0VHlwZUVudW0uQ3VycmVuY3k7XG4gICAgICAgIHRoaXMuX2N1cnJlbmN5RnJvbVByb3BlcnR5ID0gY3VycmVuY3lGcm9tUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2N1cnJlbmN5ID0gY3VycmVuY3kgPz8gdGhpcy5fY3VycmVuY3k7XG4gICAgICAgIHRoaXMuX2N1cnJlbmN5RGlzcGxheSA9IGN1cnJlbmN5RGlzcGxheSA/PyB0aGlzLl9jdXJyZW5jeURpc3BsYXk7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhOdW1iZXJGcmFjdGlvbnMoMiwgMik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzU3dpdGNoKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0VHlwZUVudW0uU3dpdGNoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNSYWRpbyhvcHRpb25zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5SYWRpbztcbiAgICAgICAgdGhpcy5fcmFkaW9PcHRpb25zID0gb3B0aW9ucy5tYXAobyA9PiA8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4+e3ZhbHVlOiBvLCB0aXRsZTogYCR7b3B0aW9uc1RpdGxlUGF0aCA/IGAke29wdGlvbnNUaXRsZVBhdGh9LmAgOiAnJ30ke299YH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNSYWRpb0Zyb21FbnVtKGVudW1UeXBlOiBFbnVtVHlwZSwgb3B0aW9uc1RpdGxlUGF0aD86IHN0cmluZyB8IG51bGwsIHZhbHVlcz86IEFycmF5PEVudW1Db25zdGFudFR5cGU+LCBuYW1lQXNWYWx1ZSA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5SYWRpbztcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zVGl0bGVQYXRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9uc1RpdGxlUGF0aCA9IFR5cGVVdGlsLmZpbmRFbnVtTmFtZShlbnVtVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmFkaW9PcHRpb25zID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpXG4gICAgICAgICAgICA/IEVudW1VdGlsLmZyb21WYWx1ZXNBc0VudW1WYWx1ZUFycmF5KGVudW1UeXBlLCB2YWx1ZXMsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZClcbiAgICAgICAgICAgIDogRW51bVV0aWwuZnJvbUNvbnN0YW50c0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0RhdGVQaWNrZXIoZm9ybWF0Pzogc3RyaW5nLCBtaW4/OiBEYXRlLCBtYXg/OiBEYXRlLCBzaG93VGltZT86IGJvb2xlYW4sIHNob3dTZWNvbmRzPzogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0VHlwZUVudW0uRGF0ZXBpY2tlcjtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlckZvcm1hdCA9IGZvcm1hdDtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlck1pbiA9IG1pbjtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlck1heCA9IG1heDtcbiAgICAgICAgdGhpcy5fZGF0ZVBpY2tlclNob3dUaW1lID0gc2hvd1RpbWUgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RhdGVQaWNrZXJTaG93U2Vjb25kcyA9IHNob3dTZWNvbmRzID8/IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc01hc2sobWFzazogc3RyaW5nLCBzbG90Q2hhcjogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5NYXNrO1xuICAgICAgICB0aGlzLl9tYXNrID0gbWFzaztcbiAgICAgICAgdGhpcy5fc2xvdENoYXIgPSBzbG90Q2hhcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzRmlsZShtdWx0aXBsZSA9IGZhbHNlLCBtYXhGaWxlU2l6ZSA9IDUwMDAwMCwgYWNjZXB0Pzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5GaWxlO1xuICAgICAgICB0aGlzLl9maWxlTXVsdGlwbGUgPSBtdWx0aXBsZTtcbiAgICAgICAgdGhpcy5fZmlsZU1heEZpbGVTaXplID0gbWF4RmlsZVNpemU7XG4gICAgICAgIHRoaXMuX2ZpbGVBY2NlcHQgPSBhY2NlcHQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0ltYWdlRmlsZShtdWx0aXBsZSA9IGZhbHNlLCBtYXhGaWxlU2l6ZSA9IDUwMDAwMCwgYWNjZXB0ID0gJ2ltYWdlLyonKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYXNGaWxlKG11bHRpcGxlLCBtYXhGaWxlU2l6ZSwgYWNjZXB0KTtcbiAgICAgICAgdGhpcy5fZmllbGRUeXBlID0gRmllbGRJbnB1dFR5cGVFbnVtLkltYWdlRmlsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzSW1hZ2VVcmwobXVsdGlwbGUgPSBmYWxzZSwgcHJldmlldyA9IHRydWUsIGlucHV0VmlzaWJsZU9uRGlzYWJsZWQgPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5JbWFnZVVybDtcbiAgICAgICAgdGhpcy5fZmlsZU11bHRpcGxlID0gbXVsdGlwbGU7XG4gICAgICAgIHRoaXMuX2ltYWdlUHJldmlldyA9IHByZXZpZXc7XG4gICAgICAgIHRoaXMuX2ltYWdlVXJsSW5wdXRIaWRkZW5PbkRpc2FibGVkID0gaW5wdXRWaXNpYmxlT25EaXNhYmxlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzQ3VzdG9tQ29tcG9uZW50KGN1c3RvbUNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZFR5cGUgPSBGaWVsZElucHV0VHlwZUVudW0uQ3VzdG9tO1xuICAgICAgICB0aGlzLl9jdXN0b21Db21wb25lbnROYW1lID0gY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhOdW1iZXJWYWxpZGF0aW9uKG1pbj86IG51bWJlciwgbWF4PzogbnVtYmVyLCBzdGVwPzogbnVtYmVyLCBhdXRvQ29ycmVjdCA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbnVtYmVyU3RlcCA9IHN0ZXAgPz8gdGhpcy5fbnVtYmVyU3RlcDtcbiAgICAgICAgdGhpcy5fbnVtYmVyQXV0b0NvcnJlY3QgPSBhdXRvQ29ycmVjdDtcbiAgICAgICAgdGhpcy5fbnVtYmVyTWluID0gbWluID8/IHRoaXMuX251bWJlck1pbiA/PyBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgdGhpcy5fbnVtYmVyTWF4ID0gbWF4ID8/IHRoaXMuX251bWJlck1heCA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gbG9jYWxlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aE51bWJlckZyYWN0aW9ucyhtaW4/OiBudW1iZXIsIG1heD86IG51bWJlcikge1xuICAgICAgICB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cyA9IG1pbjtcbiAgICAgICAgdGhpcy5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHMgPSBtYXg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTnVtYmVyR3JvdXBpbmcodXNlR3JvdXBpbmcgPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX251bWJlclVzZUdyb3VwaW5nID0gdXNlR3JvdXBpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVGV4dFZhbGlkYXRpb24obWluTGVuZ3RoPzogbnVtYmVyLCBtYXhMZW5ndGg/OiBudW1iZXIsIHBhdHRlcm4/OiBzdHJpbmcgfCBSZWdFeHApOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbWluTGVuZ3RoID0gbWluTGVuZ3RoO1xuICAgICAgICB0aGlzLl9tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgICAgIHRoaXMuX3BhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRleHRWYWxpZGF0aW9uRW1haWwoKTogdGhpcyB7XG4gICAgICAgIGlmICh0aGlzLmZpZWxkVHlwZSA9PT0gRmllbGRJbnB1dFR5cGVFbnVtLlRleHQpIHtcbiAgICAgICAgICAgIHRoaXMud2l0aFZhbGlkYXRpb24oJ2VtYWlsJywgVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGaWxlT25TZWxlY3RIYW5kbGVyKGZuOiAoZmlsZTogRmlsZVtdIHwgbnVsbCwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuX2ZpbGVPblNlbGVjdEhhbmRsZXIgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZElucHV0RGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2ZpZWxkVHlwZSA9IHRoaXMuX2ZpZWxkVHlwZTtcbiAgICAgICAgZmllbGQuX3Jvd3MgPSB0aGlzLl9yb3dzO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWluID0gdGhpcy5fbnVtYmVyTWluO1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWF4ID0gdGhpcy5fbnVtYmVyTWF4O1xuICAgICAgICBmaWVsZC5fbnVtYmVyU3RlcCA9IHRoaXMuX251bWJlclN0ZXA7XG4gICAgICAgIGZpZWxkLl9udW1iZXJBdXRvQ29ycmVjdCA9IHRoaXMuX251bWJlckF1dG9Db3JyZWN0O1xuICAgICAgICBmaWVsZC5fbnVtYmVyTWluRnJhY3Rpb25EaWdpdHMgPSB0aGlzLl9udW1iZXJNaW5GcmFjdGlvbkRpZ2l0cztcbiAgICAgICAgZmllbGQuX251bWJlck1heEZyYWN0aW9uRGlnaXRzID0gdGhpcy5fbnVtYmVyTWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgICAgIGZpZWxkLl9udW1iZXJVc2VHcm91cGluZyA9IHRoaXMuX251bWJlclVzZUdyb3VwaW5nO1xuICAgICAgICBmaWVsZC5fcmFkaW9PcHRpb25zID0gWy4uLnRoaXMuX3JhZGlvT3B0aW9uc107XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyRm9ybWF0ID0gdGhpcy5fZGF0ZVBpY2tlckZvcm1hdDtcbiAgICAgICAgZmllbGQuX2RhdGVQaWNrZXJNaW4gPSB0aGlzLl9kYXRlUGlja2VyTWluO1xuICAgICAgICBmaWVsZC5fZGF0ZVBpY2tlck1heCA9IHRoaXMuX2RhdGVQaWNrZXJNYXg7XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyU2hvd1RpbWUgPSB0aGlzLl9kYXRlUGlja2VyU2hvd1RpbWU7XG4gICAgICAgIGZpZWxkLl9kYXRlUGlja2VyU2hvd1NlY29uZHMgPSB0aGlzLl9kYXRlUGlja2VyU2hvd1NlY29uZHM7XG4gICAgICAgIGZpZWxkLl9tYXhMZW5ndGggPSB0aGlzLl9tYXhMZW5ndGg7XG4gICAgICAgIGZpZWxkLl9taW5MZW5ndGggPSB0aGlzLl9taW5MZW5ndGg7XG4gICAgICAgIGZpZWxkLl9wYXR0ZXJuID0gdGhpcy5fcGF0dGVybjtcbiAgICAgICAgZmllbGQuX21hc2sgPSB0aGlzLl9tYXNrO1xuICAgICAgICBmaWVsZC5fc2xvdENoYXIgPSB0aGlzLl9zbG90Q2hhcjtcbiAgICAgICAgZmllbGQuX2ZpbGVNdWx0aXBsZSA9IHRoaXMuX2ZpbGVNdWx0aXBsZTtcbiAgICAgICAgZmllbGQuX2ZpbGVNYXhGaWxlU2l6ZSA9IHRoaXMuX2ZpbGVNYXhGaWxlU2l6ZTtcbiAgICAgICAgZmllbGQuX2ZpbGVBY2NlcHQgPSB0aGlzLl9maWxlQWNjZXB0O1xuICAgICAgICBmaWVsZC5fZmlsZU9uU2VsZWN0SGFuZGxlciA9IHRoaXMuX2ZpbGVPblNlbGVjdEhhbmRsZXI7XG4gICAgICAgIGZpZWxkLl9pbWFnZVByZXZpZXcgPSB0aGlzLl9pbWFnZVByZXZpZXc7XG4gICAgICAgIGZpZWxkLl9pbWFnZVVybElucHV0SGlkZGVuT25EaXNhYmxlZCA9IHRoaXMuX2ltYWdlVXJsSW5wdXRIaWRkZW5PbkRpc2FibGVkO1xuICAgICAgICBmaWVsZC5fY3VzdG9tQ29tcG9uZW50TmFtZSA9IHRoaXMuX2N1c3RvbUNvbXBvbmVudE5hbWU7XG4gICAgICAgIGZpZWxkLl9sb2NhbGUgPSB0aGlzLl9sb2NhbGU7XG4gICAgICAgIGZpZWxkLl9jdXJyZW5jeSA9IHRoaXMuX2N1cnJlbmN5O1xuICAgICAgICBmaWVsZC5fY3VycmVuY3lEaXNwbGF5ID0gdGhpcy5fY3VycmVuY3lEaXNwbGF5O1xuICAgICAgICBmaWVsZC5fY3VycmVuY3lGcm9tUHJvcGVydHkgPSB0aGlzLl9jdXJyZW5jeUZyb21Qcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkQWN0aW9uRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPHZvaWQsIEVUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9maWVsZEFjdGlvbk5hbWU6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2ZpZWxkQWN0aW9uTmFtZUxvbmc6IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfYnV0dG9uID0gbmV3IEFjdGlvbkJ1dHRvbkRlc2NyaXB0b3IoKTtcblxuICAgIHByb3RlY3RlZCBfcnVuRnVuY3Rpb24/OiAoY3R4OiBGaWVsZEFjdGlvbkNvbnRleHQ8RVQ+KSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fZmllbGRBY3Rpb25OYW1lID0gcHJvcGVydHk7XG4gICAgICAgIGxldCBkaXNwbGF5TmFtZSA9IHByb3BlcnR5O1xuICAgICAgICBpZiAodGhpcy5fZWRpdG9yLm1vZGVsKSBkaXNwbGF5TmFtZSA9IGAke3RoaXMuX2VkaXRvci5tb2RlbC50eXBlTmFtZX0uJHtkaXNwbGF5TmFtZX1gO1xuICAgICAgICB0aGlzLl9maWVsZEFjdGlvbk5hbWVMb25nID0gZGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBidXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idXR0b247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5GdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQnV0dG9uRGVzY3JpcHRvcihidXR0b246IEFjdGlvbkJ1dHRvbkRlc2NyaXB0b3IpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYnV0dG9uID0gYnV0dG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEJ1dHRvbihsYWJlbD86IHN0cmluZyB8IG51bGwsIGljb246IHN0cmluZyB8IG51bGwgPSBudWxsLCBzdHlsZUxldmVsID0gU3R5bGVMZXZlbEVudW0uRGVmYXVsdCwgc3R5bGVUZXh0ID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYnV0dG9uID0gbmV3IEFjdGlvbkJ1dHRvbkRlc2NyaXB0b3IoKS53aXRoTGFiZWwobGFiZWwpLndpdGhJY29uKGljb24pLndpdGhTdHlsZUNsYXNzKG5ldyBCdXR0b25TdHlsZUJ1aWxkZXIoc3R5bGVMZXZlbCkud2l0aFRleHRCdXR0b24oc3R5bGVUZXh0KSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUnVuRnVuY3Rpb24oZm46IChjdHg6IEZpZWxkQWN0aW9uQ29udGV4dDxFVD4pID0+IHZvaWQpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcnVuRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRBY3Rpb25EZXNjcmlwdG9yPEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkQWN0aW9uRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuY29weUZpZWxkc1RvKGZpZWxkKTtcbiAgICAgICAgZmllbGQuX2J1dHRvbiA9IHRoaXMuX2J1dHRvbi5jb3B5KCk7XG4gICAgICAgIGZpZWxkLl9ydW5GdW5jdGlvbiA9IHRoaXMuX3J1bkZ1bmN0aW9uPy5iaW5kKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkTG9va3VwRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiBpbXBsZW1lbnRzIElMb29rdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX21vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+IHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgX2xvb2t1cFR5cGU6IEZpZWxkTG9va3VwVHlwZUVudW0gPSBGaWVsZExvb2t1cFR5cGVFbnVtLkRyb3Bkb3duO1xuICAgIHByb3RlY3RlZCBfaXRlbXNMYWJlbFByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfaXRlbXNMYWJlbFRyYW5zbGF0ZSA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfaXRlbXNWYWx1ZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfaXRlbXNEaXNhYmxlZFByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZGF0YUtleVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfZGF0YVByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+O1xuXG4gICAgcHJvdGVjdGVkIF9kcm9wZG93bkNsYXNzTmFtZSA9ICdtbmctZmlsdGVyLWxvb2t1cC1kcm9wZG93bic7XG5cbiAgICBwcm90ZWN0ZWQgX2F1dG9jb21wbGV0ZU9wZW5PbkZvY3VzID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9hdXRvY29tcGxldGVJbmxpbmVTZWFyY2ggPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2F1dG9jb21wbGV0ZUF1dG9DbGVhciA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfYXV0b2NvbXBsZXRlU2VsZWN0Rmlyc3QgPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBfZGlhbG9nVGFibGVEZXNjcmlwdG9yPzogVGFibGVEZXNjcmlwdG9yPFQ+O1xuICAgIHByb3RlY3RlZCBfZGlhbG9nVGFibGVEYXRhUHJvdmlkZXI/OiBJVGFibGVEYXRhUHJvdmlkZXI8VCwgYW55PjtcblxuICAgIHByb3RlY3RlZCBfY3VzdG9tQ29tcG9uZW50TmFtZT86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+IHwgbnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbW9kZWxUeXBlID0gbW9kZWxUeXBlO1xuICAgICAgICBNb2RlbFV0aWwudHJ5U2V0TG9va3VwSXRlbXNQcm9wZXJ0aWVzKHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9va3VwVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc0xhYmVsUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc0xhYmVsUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpdGVtc0xhYmVsVHJhbnNsYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNMYWJlbFRyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGl0ZW1zVmFsdWVQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGl0ZW1zRGlzYWJsZWRQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zRGlzYWJsZWRQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGFLZXlQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGFQcm92aWRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGF1dG9jb21wbGV0ZU9wZW5PbkZvY3VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0b2NvbXBsZXRlT3Blbk9uRm9jdXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhdXRvY29tcGxldGVJbmxpbmVTZWFyY2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvY29tcGxldGVJbmxpbmVTZWFyY2g7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhdXRvY29tcGxldGVBdXRvQ2xlYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hdXRvY29tcGxldGVBdXRvQ2xlYXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhdXRvY29tcGxldGVTZWxlY3RGaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9jb21wbGV0ZVNlbGVjdEZpcnN0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZHJvcGRvd25DbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcm9wZG93bkNsYXNzTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1RhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpYWxvZ1RhYmxlRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1RhYmxlRGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlhbG9nVGFibGVEYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXN0b21Db21wb25lbnROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ29tcG9uZW50TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEl0ZW1zTGFiZWxQcm9wZXJ0eShpdGVtc0xhYmVsUHJvcGVydHk6IHN0cmluZywgdHJhbnNsYXRlID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNMYWJlbFByb3BlcnR5ID0gaXRlbXNMYWJlbFByb3BlcnR5O1xuICAgICAgICB0aGlzLl9pdGVtc0xhYmVsVHJhbnNsYXRlID0gdHJhbnNsYXRlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eShpdGVtc1ZhbHVlUHJvcGVydHk6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSBpdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2RhdGFLZXlQcm9wZXJ0eSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJdGVtc0Rpc2FibGVkUHJvcGVydHkoaXRlbXNEaXNhYmxlZFByb3BlcnR5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXRlbXNEaXNhYmxlZFByb3BlcnR5ID0gaXRlbXNEaXNhYmxlZFByb3BlcnR5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERhdGFLZXlQcm9wZXJ0eShwcm9wZXJ0eTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFLZXlQcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwPFM+KGxvb2t1cDogKHF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtLCBzZXJ2aWNlPzogUywgc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PFQ+Piwgc2VydmljZVR5cGU/OiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8VCwgUz4odGhpcy5fbW9kZWxUeXBlKTtcbiAgICAgICAgaWYgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFNlcnZpY2VUeXBlKHNlcnZpY2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhUHJvdmlkZXIud2l0aExvb2t1cChsb29rdXApO1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSUxvb2t1cERhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhDb25maWcoY29uZmlnOiBGaWVsZExvb2t1cENvbmZpZyk6IHRoaXMge1xuICAgICAgICByZXR1cm4gc3VwZXIud2l0aENvbmZpZyhjb25maWcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0F1dG9jb21wbGV0ZShvcGVuT25Gb2N1cyA9IGZhbHNlLCBpbmxpbmVTZWFyY2ggPSBmYWxzZSwgc2VsZWN0Rmlyc3QgPSBmYWxzZSwgYXV0b0NsZWFyID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9va3VwVHlwZSA9IEZpZWxkTG9va3VwVHlwZUVudW0uQXV0b2NvbXBsZXRlO1xuICAgICAgICB0aGlzLl9hdXRvY29tcGxldGVBdXRvQ2xlYXIgPSBhdXRvQ2xlYXI7XG4gICAgICAgIHRoaXMuX2F1dG9jb21wbGV0ZVNlbGVjdEZpcnN0ID0gc2VsZWN0Rmlyc3Q7XG4gICAgICAgIHRoaXMuX2F1dG9jb21wbGV0ZU9wZW5PbkZvY3VzID0gb3Blbk9uRm9jdXM7XG4gICAgICAgIHRoaXMuX2F1dG9jb21wbGV0ZUlubGluZVNlYXJjaCA9IGlubGluZVNlYXJjaDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzRGlhbG9nKGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+LCB0YWJsZURhdGFQcm92aWRlcj86IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvb2t1cFR5cGUgPSBGaWVsZExvb2t1cFR5cGVFbnVtLkRpYWxvZztcbiAgICAgICAgdGhpcy5fZGlhbG9nVGFibGVEZXNjcmlwdG9yID0gbG9va3VwVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9kaWFsb2dUYWJsZURhdGFQcm92aWRlciA9IHRhYmxlRGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNDdXN0b21Db21wb25lbnQoY3VzdG9tQ29tcG9uZW50TmFtZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvb2t1cFR5cGUgPSBGaWVsZExvb2t1cFR5cGVFbnVtLkN1c3RvbTtcbiAgICAgICAgdGhpcy5fY3VzdG9tQ29tcG9uZW50TmFtZSA9IGN1c3RvbUNvbXBvbmVudE5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZExvb2t1cERlc2NyaXB0b3IodGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSwgdGhpcy5fbW9kZWxUeXBlKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fbG9va3VwVHlwZSA9IHRoaXMuX2xvb2t1cFR5cGU7XG4gICAgICAgIGZpZWxkLl9pdGVtc0xhYmVsUHJvcGVydHkgPSB0aGlzLl9pdGVtc0xhYmVsUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc0xhYmVsVHJhbnNsYXRlID0gdGhpcy5faXRlbXNMYWJlbFRyYW5zbGF0ZTtcbiAgICAgICAgZmllbGQuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2l0ZW1zRGlzYWJsZWRQcm9wZXJ0eSA9IHRoaXMuX2l0ZW1zRGlzYWJsZWRQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFLZXlQcm9wZXJ0eSA9IHRoaXMuX2RhdGFLZXlQcm9wZXJ0eTtcbiAgICAgICAgZmllbGQuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICAgICAgZmllbGQuX2Ryb3Bkb3duQ2xhc3NOYW1lID0gdGhpcy5fZHJvcGRvd25DbGFzc05hbWU7XG4gICAgICAgIGZpZWxkLl9hdXRvY29tcGxldGVPcGVuT25Gb2N1cyA9IHRoaXMuX2F1dG9jb21wbGV0ZU9wZW5PbkZvY3VzO1xuICAgICAgICBmaWVsZC5fYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoID0gdGhpcy5fYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoO1xuICAgICAgICBmaWVsZC5fZGlhbG9nVGFibGVEZXNjcmlwdG9yID0gdGhpcy5fZGlhbG9nVGFibGVEZXNjcmlwdG9yO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBGaWVsZExvb2t1cERlc2NyaXB0b3I8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4sIEVUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZW51bVR5cGU6IEVudW1UeXBlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbkVudW1WYWx1ZXM6IEVudW1WYWx1ZTxzdHJpbmcgfCBudW1iZXI+W107XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmFtZUFzVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIHByb3BlcnR5OiBzdHJpbmcsIGVudW1UeXBlOiBFbnVtVHlwZSwgb3B0aW9ucz86IEFycmF5PEVudW1Db25zdGFudFR5cGU+LCBuYW1lQXNWYWx1ZSA9IGZhbHNlLCBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5LCBudWxsKTtcbiAgICAgICAgdGhpcy5fZW51bVR5cGUgPSBlbnVtVHlwZTtcbiAgICAgICAgdGhpcy5fbmFtZUFzVmFsdWUgPSBuYW1lQXNWYWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zVGl0bGVQYXRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9uc1RpdGxlUGF0aCA9IFR5cGVVdGlsLmZpbmRFbnVtTmFtZShlbnVtVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb3B0aW9uRW51bVZhbHVlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucylcbiAgICAgICAgICAgID8gRW51bVV0aWwuZnJvbVZhbHVlc0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG9wdGlvbnMsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZClcbiAgICAgICAgICAgIDogRW51bVV0aWwuZnJvbUNvbnN0YW50c0FzRW51bVZhbHVlQXJyYXkoZW51bVR5cGUsIG5hbWVBc1ZhbHVlLCBvcHRpb25zVGl0bGVQYXRoID8/IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBMb29rdXBEYXRhUHJvdmlkZXI8RW51bVZhbHVlPHN0cmluZyB8IG51bWJlcj4sIGFueT4obnVsbCkud2l0aExvb2t1cCgoKSA9PiBvZih0aGlzLl9vcHRpb25FbnVtVmFsdWVzKSk7XG4gICAgICAgIHRoaXMud2l0aExvb2t1cERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXIpO1xuICAgICAgICB0aGlzLndpdGhJdGVtc0xhYmVsUHJvcGVydHkoJ3RpdGxlJywgb3B0aW9uc1RpdGxlUGF0aCAhPT0gbnVsbCk7XG4gICAgICAgIHRoaXMud2l0aEl0ZW1zVmFsdWVQcm9wZXJ0eSgndmFsdWUnKTtcbiAgICAgICAgdGhpcy53aXRoSXRlbXNEaXNhYmxlZFByb3BlcnR5KCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW51bVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbnVtVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpc2FibGVkT3B0aW9ucyguLi5kaXNhYmxlZE9wdGlvbnM6IEFycmF5PEVudW1Db25zdGFudFR5cGU+KTogdGhpcyB7XG4gICAgICAgIGZvciAoY29uc3QgZGlzYWJsZWRPcHRpb24gb2YgZGlzYWJsZWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNhYmxlZE9wdGlvblZhbHVlID0gdGhpcy5fbmFtZUFzVmFsdWUgPyBFbnVtVXRpbC5nZXRDb25zdGFudE5hbWUodGhpcy5fZW51bVR5cGUsIGRpc2FibGVkT3B0aW9uKSA6IGRpc2FibGVkT3B0aW9uO1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkT3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9vcHRpb25FbnVtVmFsdWVzLmZpbmQobyA9PiBvLnZhbHVlID09PSBkaXNhYmxlZE9wdGlvblZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGVmYXVsdFZhbHVlRW51bShkZWZhdWx0VmFsdWU6IEVudW1Db25zdGFudFR5cGUpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wdGlvblZhbHVlID0gdGhpcy5fbmFtZUFzVmFsdWUgPyBFbnVtVXRpbC5nZXRDb25zdGFudE5hbWUodGhpcy5fZW51bVR5cGUsIGRlZmF1bHRWYWx1ZSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIGlmIChkZWZhdWx0T3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX29wdGlvbkVudW1WYWx1ZXMuZmluZChvID0+IG8udmFsdWUgPT09IGRlZmF1bHRPcHRpb25WYWx1ZSk7XG4gICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aXRoRGVmYXVsdFZhbHVlKHRoaXMuX2l0ZW1zVmFsdWVQcm9wZXJ0eSA/IG9wdGlvblt0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHkgYXMga2V5b2Ygb2JqZWN0XSA6IG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGFzQXV0b2NvbXBsZXRlKG9wZW5PbkZvY3VzID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICBzdXBlci5hc0F1dG9jb21wbGV0ZShvcGVuT25Gb2N1cywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBjb3B5KCk6IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRMb29rdXBFbnVtRGVzY3JpcHRvcjxFVD4odGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSwgdGhpcy5fZW51bVR5cGUsIFtdKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fbG9va3VwVHlwZSA9IHRoaXMuX2xvb2t1cFR5cGU7XG4gICAgICAgIGZpZWxkLl9pdGVtc0xhYmVsUHJvcGVydHkgPSB0aGlzLl9pdGVtc0xhYmVsUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc1ZhbHVlUHJvcGVydHkgPSB0aGlzLl9pdGVtc1ZhbHVlUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9pdGVtc0Rpc2FibGVkUHJvcGVydHkgPSB0aGlzLl9pdGVtc0Rpc2FibGVkUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhS2V5UHJvcGVydHkgPSB0aGlzLl9kYXRhS2V5UHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9kYXRhUHJvdmlkZXIgPSB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPFQsIEVUPiBleHRlbmRzIEFGaWVsZERlc2NyaXB0b3I8VCwgRVQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIG1haW4gdGFibGUgY29tcG9uZW50XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9va3VwVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD47IC8vIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHdoZXJlIHNlbGVjdCB3aWxsIGJlIGFwcGxpZWRcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkTWFueVRvTWFueUVkaXRvclR5cGVFbnVtID0gRmllbGRNYW55VG9NYW55RWRpdG9yVHlwZUVudW0uRGlhbG9nVGFibGVNdWx0aXNlbGVjdDtcbiAgICBwcml2YXRlIF9sb29rdXBUYWJsZURhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPFQsIGFueT4gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF9hY3Rpb25zOiBBcnJheTxGaWVsZE1hbnlUb01hbnlFZGl0b3JBY3Rpb25FbnVtPiA9IFtdO1xuICAgIHByaXZhdGUgX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9leGNsdWRlRmlsdGVyUHJvcGVydHkgPSAnJztcbiAgICBwcml2YXRlIF9leGNsdWRlVmFsdWVQcm9wZXJ0eSA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZywgbWFpblRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPFQ+LCBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5fbWFpblRhYmxlRGVzY3JpcHRvciA9IG1haW5UYWJsZURlc2NyaXB0b3I7XG4gICAgICAgIHRoaXMuX2xvb2t1cFRhYmxlRGVzY3JpcHRvciA9IGxvb2t1cFRhYmxlRGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5fYWN0aW9ucy5wdXNoKEZpZWxkTWFueVRvTWFueUVkaXRvckFjdGlvbkVudW0uQWRkLCBGaWVsZE1hbnlUb01hbnlFZGl0b3JBY3Rpb25FbnVtLkRlbGV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb29rdXBUYWJsZURhdGFQcm92aWRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNMb29rdXBFeGNsdWRlVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzTG9va3VwRXhjbHVkZVZhbHVlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGV4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2x1ZGVGaWx0ZXJQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGV4Y2x1ZGVWYWx1ZVByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhjbHVkZVZhbHVlUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYWluVGFibGVEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFpblRhYmxlRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvb2t1cFRhYmxlRGVzY3JpcHRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cFRhYmxlRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cDxTPihnZXRBbGw6IChxdWVyeVBhcmFtOiBNZWRpdXNRdWVyeVBhcmFtLCBzZXJ2aWNlPzogUykgPT4gT2JzZXJ2YWJsZTxNZWRpdXNRdWVyeVJlc3VsdDxUPj4sIHNlcnZpY2VUeXBlPzogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgVGFibGV2aWV3RGF0YVByb3ZpZGVyPFQsIFM+KHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3IubW9kZWwudHlwZSk7XG4gICAgICAgIGlmIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhTZXJ2aWNlVHlwZShzZXJ2aWNlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhHZXRBbGwoZ2V0QWxsKTtcbiAgICAgICAgdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoTG9va3VwRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSVRhYmxlRGF0YVByb3ZpZGVyPFQsIGFueT4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG9va3VwVGFibGVEYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWN0aW9ucyhhY3Rpb25zOiBBcnJheTxGaWVsZE1hbnlUb01hbnlFZGl0b3JBY3Rpb25FbnVtPiA9IFtdKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWN0aW9ucy5wdXNoKC4uLmFjdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExvb2t1cEV4Y2x1ZGUoZmlsdGVyUHJvcGVydHk6IHN0cmluZywgdmFsdWVQcm9wZXJ0eTogc3RyaW5nLCBoYXNMb29rdXBFeGNsdWRlID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNMb29rdXBFeGNsdWRlVmFsdWVzID0gaGFzTG9va3VwRXhjbHVkZTtcbiAgICAgICAgdGhpcy5fZXhjbHVkZUZpbHRlclByb3BlcnR5ID0gZmlsdGVyUHJvcGVydHk7XG4gICAgICAgIHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5ID0gdmFsdWVQcm9wZXJ0eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yKHRoaXMuX2VkaXRvciwgdGhpcy5fcHJvcGVydHksIHRoaXMuX21haW5UYWJsZURlc2NyaXB0b3IuY29weSgpLCB0aGlzLl9sb29rdXBUYWJsZURlc2NyaXB0b3IuY29weSgpKTtcbiAgICAgICAgdGhpcy5jb3B5RmllbGRzVG8oZmllbGQpO1xuICAgICAgICBmaWVsZC5fZmllbGRUeXBlID0gdGhpcy5fZmllbGRUeXBlO1xuICAgICAgICBmaWVsZC5fYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMubWFwKGEgPT4gYSk7XG4gICAgICAgIGZpZWxkLl9sb29rdXBUYWJsZURhdGFQcm92aWRlciA9IHRoaXMuX2xvb2t1cFRhYmxlRGF0YVByb3ZpZGVyO1xuICAgICAgICBmaWVsZC5faGFzTG9va3VwRXhjbHVkZVZhbHVlcyA9IHRoaXMuX2hhc0xvb2t1cEV4Y2x1ZGVWYWx1ZXM7XG4gICAgICAgIGZpZWxkLl9leGNsdWRlRmlsdGVyUHJvcGVydHkgPSB0aGlzLl9leGNsdWRlRmlsdGVyUHJvcGVydHk7XG4gICAgICAgIGZpZWxkLl9leGNsdWRlVmFsdWVQcm9wZXJ0eSA9IHRoaXMuX2V4Y2x1ZGVWYWx1ZVByb3BlcnR5O1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcjxULCBFVD4gZXh0ZW5kcyBBRmllbGREZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFibGV2aWV3RGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIF9maWVsZFR5cGU6IEZpZWxkTWFueUVkaXRvclR5cGVFbnVtID0gRmllbGRNYW55RWRpdG9yVHlwZUVudW0uRGlhbG9nRWRpdG9yO1xuICAgIHByaXZhdGUgX2ZpZWxkQWN0aW9uczogQXJyYXk8RmllbGRNYW55RWRpdG9yQWN0aW9uRW51bT4gPSBbXTtcbiAgICBwcml2YXRlIF9hY3Rpb25zOiBBcnJheTxBY3Rpb25EZXNjcmlwdG9yPFQ+PiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yOiBFZGl0b3JEZXNjcmlwdG9yPEVUPiwgcHJvcGVydHk6IHN0cmluZywgdGFibGV2aWV3RGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3IsIHByb3BlcnR5KTtcbiAgICAgICAgLy8gdGhpcy5fbW9kZWxUeXBlID0gbW9kZWxUeXBlO1xuICAgICAgICB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yID0gdGFibGV2aWV3RGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5fZmllbGRBY3Rpb25zLnB1c2goRmllbGRNYW55RWRpdG9yQWN0aW9uRW51bS5WaWV3LCBGaWVsZE1hbnlFZGl0b3JBY3Rpb25FbnVtLkFkZCwgRmllbGRNYW55RWRpdG9yQWN0aW9uRW51bS5FZGl0LCBGaWVsZE1hbnlFZGl0b3JBY3Rpb25FbnVtLkRlbGV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZFR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZEFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZEFjdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhYmxldmlld0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGVEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci50YWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckZvckNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuYWRkRWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yRm9yUmVhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuZGV0YWlsc0VkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckZvclVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYmxldmlld0Rlc2NyaXB0b3IuZWRpdEVkaXRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpZWxkQWN0aW9uKGFjdGlvbjogRmllbGRNYW55RWRpdG9yQWN0aW9uRW51bSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZEFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZpZWxkQWN0aW9ucyhhY3Rpb25zOiBGaWVsZE1hbnlFZGl0b3JBY3Rpb25FbnVtW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmllbGRBY3Rpb25zID0gYWN0aW9ucztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhBY3Rpb24oYWN0aW9uOiBBY3Rpb25EZXNjcmlwdG9yPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2FjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY29weSgpOiBGaWVsZE1hbnlFZGl0b3JEZXNjcmlwdG9yPFQsIEVUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IodGhpcy5fZWRpdG9yLCB0aGlzLl9wcm9wZXJ0eSwgdGhpcy5fdGFibGV2aWV3RGVzY3JpcHRvci5jb3B5KCkpO1xuICAgICAgICB0aGlzLmNvcHlGaWVsZHNUbyhmaWVsZCk7XG4gICAgICAgIGZpZWxkLl9maWVsZFR5cGUgPSB0aGlzLl9maWVsZFR5cGU7XG4gICAgICAgIGZpZWxkLl9maWVsZEFjdGlvbnMgPSB0aGlzLl9maWVsZEFjdGlvbnMubWFwKGEgPT4gYSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IGV4dGVuZHMgQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX25hbWU6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2RlZmF1bHQ6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF90aXRsZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkczogQUdlbmVyaWNGaWVsZERlc2NyaXB0b3I8RVQ+W10gPSBbXTtcbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRpb25zOiBBcnJheTxGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yPiA9IFtdO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGVkaXRvcjogRWRpdG9yRGVzY3JpcHRvcjxFVD4sIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihlZGl0b3IpO1xuICAgICAgICB0aGlzLl9uYW1lID0gYCR7dGhpcy5iYXNlTmFtZX0ke25hbWV9YDtcbiAgICAgICAgdGhpcy5fZGVmYXVsdCA9IG5hbWUgPT09IEVkaXRvckRlc2NyaXB0b3IuZGVmYXVsdEdyb3VwTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlRmllbGQocHJvcGVydHk6IHN0cmluZywgZmlsdGVyRnVuY3Rpb246IChmaWVsZHM6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdKSA9PiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD5bXSk6IEFHZW5lcmljRmllbGREZXNjcmlwdG9yPEVUPltdIHtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gZmlsdGVyRnVuY3Rpb24odGhpcy5fZmllbGRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ2V0IGZpZWxkcygpOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD5bXTtcblxuICAgIHB1YmxpYyBnZXQgdmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJhc2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5ncm91cE5hbWUoKX1fYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHQ7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgZ3JvdXBOYW1lKCk6IHN0cmluZztcblxuICAgIGFic3RyYWN0IGFkZEZpZWxkKGZpZWxkOiBBR2VuZXJpY0ZpZWxkRGVzY3JpcHRvcjxFVD4pOiB0aGlzO1xuXG4gICAgYWJzdHJhY3QgY29weSgpOiBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+O1xuXG4gICAgcHVibGljIHdpdGhUaXRsZSh0aXRsZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVmFsaWRhdGlvbihuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcj86IE1uZ0ZpZWxkVmFsaWRhdG9yLCBtZXNzYWdlPzogTW5nRmllbGRWYWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgICB0aGlzLl92YWxpZGF0aW9ucy5wdXNoKG5ldyBGaWVsZFZhbGlkYXRpb25EZXNjcmlwdG9yKG5hbWUsIHZhbGlkYXRvciwgbWVzc2FnZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZFRhYkdyb3VwRGVzY3JpcHRvcjxFVD4gZXh0ZW5kcyBBRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcyBhcyBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4+O1xuICAgIH1cblxuICAgIHB1YmxpYyBncm91cE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICd0YWInO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZChmaWVsZDogRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRUYWJHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgdGFiID0gbmV3IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPEVUPih0aGlzLl9lZGl0b3IsIHRoaXMubmFtZS5zdWJzdHJpbmcodGhpcy5iYXNlTmFtZS5sZW5ndGgpKTtcbiAgICAgICAgdGFiLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICB0YWIuX2ZpZWxkcyA9IHRoaXMuZmllbGRzLm1hcChmID0+IGYuY29weSgpKTtcbiAgICAgICAgdGFiLl92YWxpZGF0aW9ucyA9IHRoaXMudmFsaWRhdGlvbnMubWFwKHYgPT4gdi5jb3B5KCkpO1xuICAgICAgICByZXR1cm4gdGFiO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpZWxkR3JvdXBEZXNjcmlwdG9yPEVUPiBleHRlbmRzIEFGaWVsZEdyb3VwRGVzY3JpcHRvcjxFVD4ge1xuICAgIHByaXZhdGUgX3R5cGUgPSBGaWVsZEdyb3VwVHlwZUVudW0uRmllbGRzZXQ7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvckRlc2NyaXB0b3I8RVQ+LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yLCBuYW1lKTtcbiAgICAgICAgaWYgKHRoaXMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXNMb2dpY2FsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmllbGRzKCk6IEFycmF5PEFGaWVsZERlc2NyaXB0b3I8YW55LCBFVD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpZWxkcyBhcyBBcnJheTxBRmllbGREZXNjcmlwdG9yPGFueSwgRVQ+PjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ3JvdXBOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnZ3JvdXAnO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZChmaWVsZDogQUZpZWxkRGVzY3JpcHRvcjxhbnksIEVUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc0xvZ2ljYWwoKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSBGaWVsZEdyb3VwVHlwZUVudW0uTG9naWNhbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgRmllbGRHcm91cERlc2NyaXB0b3I8RVQ+KHRoaXMuX2VkaXRvciwgdGhpcy5uYW1lLnN1YnN0cmluZyh0aGlzLmJhc2VOYW1lLmxlbmd0aCkpO1xuICAgICAgICBncm91cC5fdHlwZSA9IHRoaXMuX3R5cGU7XG4gICAgICAgIGdyb3VwLl90aXRsZSA9IHRoaXMuX3RpdGxlO1xuICAgICAgICBncm91cC5fZmllbGRzID0gdGhpcy5maWVsZHMubWFwKGYgPT4gZi5jb3B5KCkpO1xuICAgICAgICBncm91cC5fdmFsaWRhdGlvbnMgPSB0aGlzLnZhbGlkYXRpb25zLm1hcCh2ID0+IHYuY29weSgpKTtcbiAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgIH1cbn1cbiJdfQ==