@mediusinc/mng-commons 0.9.1-rc.2 → 0.9.1

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 (303) hide show
  1. package/dev-scripts/version-info.js +2 -0
  2. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  3. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  4. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  5. package/esm2020/lib/api/models/index.mjs +8 -8
  6. package/esm2020/lib/api/models/mappers.mjs +12 -12
  7. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  8. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  9. package/esm2020/lib/api/models/query-result.model.mjs +17 -17
  10. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  11. package/esm2020/lib/api/services/api.abstract.service.mjs +55 -55
  12. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +66 -66
  13. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +22 -22
  14. package/esm2020/lib/api/services/index.mjs +3 -3
  15. package/esm2020/lib/api/utils/index.mjs +2 -2
  16. package/esm2020/lib/api/utils/medius-rest.util.mjs +151 -151
  17. package/esm2020/lib/api/utils/object-serializer.util.mjs +243 -243
  18. package/esm2020/lib/components/action/action.component.mjs +177 -177
  19. package/esm2020/lib/components/action/editor/action-editor.component.mjs +247 -247
  20. package/esm2020/lib/components/action/index.mjs +3 -3
  21. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  22. package/esm2020/lib/components/action/models/action-execution.model.mjs +234 -234
  23. package/esm2020/lib/components/action/models/index.mjs +2 -2
  24. package/esm2020/lib/components/action/route/action-route.component.mjs +124 -124
  25. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +268 -268
  26. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +160 -160
  27. package/esm2020/lib/components/form/editor/form-editor.component.mjs +189 -189
  28. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +18 -18
  29. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +42 -42
  30. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +24 -24
  31. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +96 -96
  32. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +16 -16
  33. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +178 -178
  34. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +154 -154
  35. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +126 -126
  36. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  37. package/esm2020/lib/components/form/formly/fields/index.mjs +9 -9
  38. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +14 -14
  39. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +14 -14
  40. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  41. package/esm2020/lib/components/form/index.mjs +3 -3
  42. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  43. package/esm2020/lib/components/form/models/index.mjs +1 -1
  44. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  45. package/esm2020/lib/components/layout/footer.component.mjs +17 -17
  46. package/esm2020/lib/components/layout/index.mjs +7 -7
  47. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  48. package/esm2020/lib/components/layout/menu-item.component.mjs +216 -216
  49. package/esm2020/lib/components/layout/menu.component.mjs +21 -21
  50. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  51. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +192 -192
  52. package/esm2020/lib/components/layout/topbar.component.mjs +57 -57
  53. package/esm2020/lib/components/layout/version.component.mjs +57 -57
  54. package/esm2020/lib/components/tableview/index.mjs +6 -6
  55. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  56. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  57. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +57 -57
  58. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +61 -54
  59. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +102 -102
  60. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +70 -70
  61. package/esm2020/lib/components/tableview/table/table.component.mjs +433 -428
  62. package/esm2020/lib/components/tableview/tableview.component.mjs +91 -91
  63. package/esm2020/lib/config/formly.config.mjs +180 -180
  64. package/esm2020/lib/config/index.mjs +1 -1
  65. package/esm2020/lib/config/models/index.mjs +1 -1
  66. package/esm2020/lib/config/models/mng-config.model.mjs +1 -1
  67. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  68. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  69. package/esm2020/lib/data-providers/index.mjs +5 -5
  70. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  71. package/esm2020/lib/data-providers/table.data-provider.mjs +16 -16
  72. package/esm2020/lib/data-providers/tableview.data-provider.mjs +16 -16
  73. package/esm2020/lib/descriptors/action.descriptor.mjs +565 -565
  74. package/esm2020/lib/descriptors/column.descriptor.mjs +265 -261
  75. package/esm2020/lib/descriptors/editor.descriptor.mjs +146 -146
  76. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +20 -20
  77. package/esm2020/lib/descriptors/field.descriptor.mjs +806 -800
  78. package/esm2020/lib/descriptors/filter.descriptor.mjs +289 -262
  79. package/esm2020/lib/descriptors/index.mjs +9 -9
  80. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  81. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  82. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  83. package/esm2020/lib/descriptors/model.descriptor.mjs +33 -33
  84. package/esm2020/lib/descriptors/table.descriptor.mjs +198 -197
  85. package/esm2020/lib/descriptors/tableview.descriptor.mjs +134 -134
  86. package/esm2020/lib/descriptors/types/action.type.mjs +52 -52
  87. package/esm2020/lib/descriptors/types/column.type.mjs +10 -10
  88. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  89. package/esm2020/lib/descriptors/types/field.type.mjs +52 -52
  90. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  91. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  92. package/esm2020/lib/descriptors/types/table.type.mjs +16 -16
  93. package/esm2020/lib/directives/component.directive.mjs +43 -43
  94. package/esm2020/lib/directives/index.mjs +2 -2
  95. package/esm2020/lib/directives/template.directive.mjs +27 -27
  96. package/esm2020/lib/mng-commons.module.mjs +437 -437
  97. package/esm2020/lib/models/column-value.model.mjs +1 -1
  98. package/esm2020/lib/models/enum.model.mjs +1 -1
  99. package/esm2020/lib/models/error.model.mjs +1 -1
  100. package/esm2020/lib/models/index.mjs +7 -7
  101. package/esm2020/lib/models/menu.model.mjs +1 -1
  102. package/esm2020/lib/models/user.model.mjs +1 -1
  103. package/esm2020/lib/models/version.model.mjs +1 -1
  104. package/esm2020/lib/models/view-container.model.mjs +1 -1
  105. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  106. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  107. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  108. package/esm2020/lib/pipes/index.mjs +5 -5
  109. package/esm2020/lib/pipes/json-path.pipe.mjs +79 -79
  110. package/esm2020/lib/pipes/link-formatter.pipe.mjs +38 -38
  111. package/esm2020/lib/router/index.mjs +1 -1
  112. package/esm2020/lib/router/models/index.mjs +1 -1
  113. package/esm2020/lib/router/models/router.model.mjs +1 -1
  114. package/esm2020/lib/router/route-builder.mjs +431 -431
  115. package/esm2020/lib/services/action-executor.service.mjs +536 -536
  116. package/esm2020/lib/services/commons.service.mjs +331 -331
  117. package/esm2020/lib/services/configuration.service.mjs +110 -110
  118. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  119. package/esm2020/lib/services/index.mjs +6 -6
  120. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  121. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  122. package/esm2020/lib/services/internal/index.mjs +2 -2
  123. package/esm2020/lib/services/navigation.service.mjs +47 -47
  124. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  125. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  126. package/esm2020/lib/services/providers/index.mjs +2 -2
  127. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  128. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  129. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  130. package/esm2020/lib/services/tokens/index.mjs +4 -4
  131. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  132. package/esm2020/lib/services/version.service.mjs +37 -37
  133. package/esm2020/lib/services/view-container.component.service.mjs +34 -34
  134. package/esm2020/lib/types/index.mjs +2 -2
  135. package/esm2020/lib/types/type.decorator.mjs +12 -12
  136. package/esm2020/lib/types/type.model.mjs +1 -1
  137. package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
  138. package/esm2020/lib/utils/editor-formly.util.mjs +210 -210
  139. package/esm2020/lib/utils/enum.util.mjs +81 -81
  140. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  141. package/esm2020/lib/utils/index.mjs +7 -7
  142. package/esm2020/lib/utils/model.util.mjs +59 -59
  143. package/esm2020/lib/utils/notification.util.mjs +45 -45
  144. package/esm2020/lib/utils/route.util.mjs +23 -23
  145. package/esm2020/lib/utils/styles.util.mjs +40 -40
  146. package/esm2020/lib/utils/type.util.mjs +76 -76
  147. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  148. package/esm2020/public-api.mjs +41 -41
  149. package/fesm2015/mediusinc-mng-commons.mjs +10001 -9950
  150. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  151. package/fesm2020/mediusinc-mng-commons.mjs +9861 -9812
  152. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  153. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  154. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  155. package/lib/api/models/filter-param.model.d.ts +23 -23
  156. package/lib/api/models/index.d.ts +8 -8
  157. package/lib/api/models/mappers.d.ts +6 -6
  158. package/lib/api/models/query-mode.model.d.ts +16 -16
  159. package/lib/api/models/query-param.model.d.ts +31 -31
  160. package/lib/api/models/query-result.model.d.ts +23 -23
  161. package/lib/api/models/serialization.model.d.ts +8 -8
  162. package/lib/api/services/api.abstract.service.d.ts +24 -24
  163. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  164. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  165. package/lib/api/services/index.d.ts +3 -3
  166. package/lib/api/utils/index.d.ts +2 -2
  167. package/lib/api/utils/medius-rest.util.d.ts +15 -15
  168. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  169. package/lib/components/action/action.component.d.ts +69 -69
  170. package/lib/components/action/editor/action-editor.component.d.ts +64 -64
  171. package/lib/components/action/index.d.ts +3 -3
  172. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  173. package/lib/components/action/models/action-execution.model.d.ts +129 -129
  174. package/lib/components/action/models/index.d.ts +2 -2
  175. package/lib/components/action/route/action-route.component.d.ts +31 -31
  176. package/lib/components/form/autocomplete/autocomplete.component.d.ts +53 -53
  177. package/lib/components/form/dropdown/dropdown.component.d.ts +44 -44
  178. package/lib/components/form/editor/form-editor.component.d.ts +45 -45
  179. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +12 -12
  180. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +14 -14
  181. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +13 -13
  182. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +21 -21
  183. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +6 -6
  184. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +45 -45
  185. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +22 -22
  186. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  187. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  188. package/lib/components/form/formly/fields/index.d.ts +9 -9
  189. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +6 -6
  190. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +6 -6
  191. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  192. package/lib/components/form/index.d.ts +3 -3
  193. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  194. package/lib/components/form/models/index.d.ts +1 -1
  195. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  196. package/lib/components/layout/footer.component.d.ts +9 -9
  197. package/lib/components/layout/index.d.ts +7 -7
  198. package/lib/components/layout/main-layout.component.d.ts +20 -20
  199. package/lib/components/layout/menu-item.component.d.ts +37 -37
  200. package/lib/components/layout/menu.component.d.ts +10 -10
  201. package/lib/components/layout/services/index.d.ts +1 -1
  202. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  203. package/lib/components/layout/topbar.component.d.ts +24 -24
  204. package/lib/components/layout/version.component.d.ts +19 -19
  205. package/lib/components/tableview/index.d.ts +6 -6
  206. package/lib/components/tableview/models/index.d.ts +1 -1
  207. package/lib/components/tableview/models/table.event.d.ts +17 -17
  208. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +20 -20
  209. package/lib/components/tableview/route/tableview-route.component.d.ts +21 -18
  210. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +32 -32
  211. package/lib/components/tableview/table/column-value/column-value.component.d.ts +29 -29
  212. package/lib/components/tableview/table/table.component.d.ts +105 -105
  213. package/lib/components/tableview/tableview.component.d.ts +41 -41
  214. package/lib/config/formly.config.d.ts +15 -15
  215. package/lib/config/index.d.ts +1 -1
  216. package/lib/config/models/index.d.ts +1 -1
  217. package/lib/config/models/mng-config.model.d.ts +36 -36
  218. package/lib/data-providers/base.data-provider.d.ts +14 -14
  219. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  220. package/lib/data-providers/index.d.ts +5 -5
  221. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  222. package/lib/data-providers/table.data-provider.d.ts +14 -14
  223. package/lib/data-providers/tableview.data-provider.d.ts +15 -15
  224. package/lib/descriptors/action.descriptor.d.ts +227 -227
  225. package/lib/descriptors/column.descriptor.d.ts +82 -81
  226. package/lib/descriptors/editor.descriptor.d.ts +37 -37
  227. package/lib/descriptors/field-validation.descriptor.d.ts +18 -18
  228. package/lib/descriptors/field.descriptor.d.ts +289 -287
  229. package/lib/descriptors/filter.descriptor.d.ts +106 -97
  230. package/lib/descriptors/index.d.ts +9 -9
  231. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  232. package/lib/descriptors/interfaces/index.d.ts +2 -2
  233. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  234. package/lib/descriptors/model.descriptor.d.ts +15 -15
  235. package/lib/descriptors/table.descriptor.d.ts +66 -66
  236. package/lib/descriptors/tableview.descriptor.d.ts +42 -42
  237. package/lib/descriptors/types/action.type.d.ts +45 -45
  238. package/lib/descriptors/types/column.type.d.ts +9 -9
  239. package/lib/descriptors/types/editor.type.d.ts +6 -6
  240. package/lib/descriptors/types/field.type.d.ts +44 -44
  241. package/lib/descriptors/types/filter.type.d.ts +27 -27
  242. package/lib/descriptors/types/index.d.ts +6 -6
  243. package/lib/descriptors/types/table.type.d.ts +13 -13
  244. package/lib/directives/component.directive.d.ts +16 -16
  245. package/lib/directives/index.d.ts +2 -2
  246. package/lib/directives/template.directive.d.ts +13 -13
  247. package/lib/mng-commons.module.d.ts +87 -87
  248. package/lib/models/column-value.model.d.ts +4 -4
  249. package/lib/models/enum.model.d.ts +6 -6
  250. package/lib/models/error.model.d.ts +14 -14
  251. package/lib/models/index.d.ts +7 -7
  252. package/lib/models/menu.model.d.ts +25 -25
  253. package/lib/models/user.model.d.ts +8 -8
  254. package/lib/models/version.model.d.ts +18 -18
  255. package/lib/models/view-container.model.d.ts +6 -6
  256. package/lib/pipes/boolean.pipe.d.ts +7 -7
  257. package/lib/pipes/enum.pipe.d.ts +8 -8
  258. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  259. package/lib/pipes/index.d.ts +5 -5
  260. package/lib/pipes/json-path.pipe.d.ts +13 -13
  261. package/lib/pipes/link-formatter.pipe.d.ts +11 -11
  262. package/lib/router/index.d.ts +1 -1
  263. package/lib/router/models/index.d.ts +1 -1
  264. package/lib/router/models/router.model.d.ts +22 -22
  265. package/lib/router/route-builder.d.ts +86 -86
  266. package/lib/services/action-executor.service.d.ts +149 -149
  267. package/lib/services/commons.service.d.ts +73 -73
  268. package/lib/services/configuration.service.d.ts +36 -36
  269. package/lib/services/error-mapper.service.d.ts +7 -7
  270. package/lib/services/index.d.ts +6 -6
  271. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  272. package/lib/services/internal/commons-init.service.d.ts +16 -16
  273. package/lib/services/internal/index.d.ts +2 -2
  274. package/lib/services/navigation.service.d.ts +14 -14
  275. package/lib/services/providers/config-service.provider.d.ts +6 -6
  276. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  277. package/lib/services/providers/index.d.ts +2 -2
  278. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  279. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  280. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  281. package/lib/services/tokens/index.d.ts +4 -4
  282. package/lib/services/tokens/module-config.token.d.ts +3 -3
  283. package/lib/services/version.service.d.ts +13 -13
  284. package/lib/services/view-container.component.service.d.ts +22 -22
  285. package/lib/types/index.d.ts +2 -2
  286. package/lib/types/type.decorator.d.ts +4 -4
  287. package/lib/types/type.model.d.ts +20 -20
  288. package/lib/utils/action-data-provider.util.d.ts +20 -20
  289. package/lib/utils/editor-formly.util.d.ts +10 -10
  290. package/lib/utils/enum.util.d.ts +50 -50
  291. package/lib/utils/i18n.util.d.ts +56 -56
  292. package/lib/utils/index.d.ts +7 -7
  293. package/lib/utils/model.util.d.ts +8 -8
  294. package/lib/utils/notification.util.d.ts +11 -11
  295. package/lib/utils/route.util.d.ts +4 -4
  296. package/lib/utils/styles.util.d.ts +14 -14
  297. package/lib/utils/type.util.d.ts +36 -36
  298. package/mediusinc-mng-commons.d.ts +5 -5
  299. package/package.json +6 -6
  300. package/public-api.d.ts +30 -30
  301. package/scss/mng-overrides/_theme_tableview.scss +0 -4
  302. package/version-info.json +6 -6
  303. package/mediusinc-mng-commons-0.9.1-rc.2.tgz +0 -0
@@ -1,566 +1,566 @@
1
- import { of } from 'rxjs';
2
- import { DataProvider, EditorDataProvider } from '../data-providers';
3
- import { ActionDataProviderUtil, TypeUtil } from '../utils';
4
- import { ModelDescriptor } from './';
5
- import { ActionActivationTriggerEnum, ActionEditorDialogSizeEnum, ActionEditorSubmitTypeEnum, ActionLevelEnum, ActionPositionEnum, ActionSizeEnum, ActionTypeEnum } from './types';
6
- export class ActionDescriptor {
7
- constructor(model, actionName, parentType, parentProperty) {
8
- this._type = ActionTypeEnum.Direct;
9
- this._activationTrigger = ActionActivationTriggerEnum.OnClick;
10
- this._position = ActionPositionEnum.ToolbarRight;
11
- this._level = ActionLevelEnum.Default;
12
- this._routeUrl = null;
13
- this._className = '';
14
- this._size = ActionSizeEnum.Normal;
15
- this._isStyleText = false;
16
- this._isStyleOutlined = false;
17
- this._isStyleRaised = false;
18
- this._hasRunConfirmation = false;
19
- this._hasRunNotificationSuccess = true;
20
- this._hasRunNotificationError = true;
21
- this._model = model;
22
- this._actionName = actionName;
23
- if ((parentType && !parentProperty) || (!parentProperty && parentProperty)) {
24
- throw new Error(`Provide both the parent type and parent property or none: ${parentType}, ${parentProperty}.`);
25
- }
26
- this._parentType = parentType;
27
- this._parentTypeName = parentType ? TypeUtil.findTypeName(parentType) : undefined;
28
- this._parentProperty = parentProperty;
29
- if (this._parentTypeName || this._model) {
30
- this._i18nModelActionBaseKey = this._parentTypeName
31
- ? `${this._parentTypeName}.actions.${this._parentProperty}_${actionName}`
32
- : `${this._model.typeName}.actions.${actionName}`;
33
- }
34
- let displayName = actionName;
35
- if (this._model)
36
- displayName = `${this._model.typeName}.${displayName}`;
37
- if (this._parentTypeName) {
38
- displayName = `${this._parentTypeName}.${this._parentProperty}_${displayName}`;
39
- }
40
- this._actionNameLong = displayName;
41
- }
42
- get model() {
43
- return this._model;
44
- }
45
- get parentTypeName() {
46
- return this._parentTypeName;
47
- }
48
- get parentProperty() {
49
- return this._parentProperty;
50
- }
51
- get i18nModelActionBaseKey() {
52
- return this._i18nModelActionBaseKey;
53
- }
54
- get type() {
55
- return this._type;
56
- }
57
- get activationTrigger() {
58
- return this._activationTrigger;
59
- }
60
- get position() {
61
- return this._position;
62
- }
63
- get level() {
64
- return this._level;
65
- }
66
- get routeUrl() {
67
- return this._routeUrl;
68
- }
69
- get title() {
70
- return this._title;
71
- }
72
- get icon() {
73
- return this._icon;
74
- }
75
- get tooltip() {
76
- return this._tooltip;
77
- }
78
- get dataProvider() {
79
- return this._dataProvider;
80
- }
81
- get hasRunFunction() {
82
- return typeof this._runFunction === 'function';
83
- }
84
- get runFunction() {
85
- if (!this._runFunction) {
86
- throw new Error('Run function is not defined and cannot be invoked');
87
- }
88
- return this._runFunction;
89
- }
90
- get isVisibleFunction() {
91
- return this._isVisibleFunction;
92
- }
93
- get isEnabledFunction() {
94
- return this._isEnabledFunction;
95
- }
96
- get actionName() {
97
- return this._actionName;
98
- }
99
- get actionNameLong() {
100
- return this._actionNameLong;
101
- }
102
- get className() {
103
- return this._className;
104
- }
105
- get isStyleText() {
106
- return this._isStyleText;
107
- }
108
- get isStyleOutlined() {
109
- return this._isStyleOutlined;
110
- }
111
- get isStyleRaised() {
112
- return this._isStyleRaised;
113
- }
114
- get size() {
115
- return this._size;
116
- }
117
- get isSizeExtraSmall() {
118
- return this._size === ActionSizeEnum.ExtraSmall;
119
- }
120
- get isSizeSmall() {
121
- return this._size === ActionSizeEnum.Small;
122
- }
123
- get isSizeLarge() {
124
- return this._size === ActionSizeEnum.Large;
125
- }
126
- get isSizeExtraLarge() {
127
- return this._size === ActionSizeEnum.ExtraLarge;
128
- }
129
- get hasRunConfirmation() {
130
- return this._hasRunConfirmation;
131
- }
132
- get runConfirmationIcon() {
133
- return this._runConfirmationIcon;
134
- }
135
- get runConfirmationTitle() {
136
- return this._runConfirmationTitle;
137
- }
138
- get runConfirmationMessage() {
139
- return this._runConfirmationMessage;
140
- }
141
- get runConfirmationAcceptTitle() {
142
- return this._runConfirmationAcceptTitle;
143
- }
144
- get runConfirmationRejectTitle() {
145
- return this._runConfirmationRejectTitle;
146
- }
147
- get runConfirmationConfigMapFn() {
148
- return this._runConfirmationConfigMapFn;
149
- }
150
- get hasRunNotificationSuccess() {
151
- return this._hasRunNotificationSuccess;
152
- }
153
- get runNotificationSuccessTitle() {
154
- return this._runNotificationSuccessTitle;
155
- }
156
- get runNotificationSuccessMessage() {
157
- return this._runNotificationSuccessMessage;
158
- }
159
- get hasRunNotificationError() {
160
- return this._hasRunNotificationError;
161
- }
162
- get runNotificationErrorTitle() {
163
- return this._runNotificationErrorTitle;
164
- }
165
- get runNotificationErrorMessage() {
166
- return this._runNotificationErrorMessage;
167
- }
168
- get afterRunAction() {
169
- return this._afterRunAction;
170
- }
171
- get onRunErrorAction() {
172
- return this._onRunErrorAction;
173
- }
174
- withDataProvider(dataProvider) {
175
- this._dataProvider = dataProvider;
176
- return this;
177
- }
178
- withServiceType(serviceType) {
179
- if (!this._model) {
180
- throw new Error(`Cannot set data provider if no model type is provided for action ${this._actionName}`);
181
- }
182
- this._dataProvider = new DataProvider(this._model.type, serviceType);
183
- return this;
184
- }
185
- withRunFunction(fn) {
186
- this._runFunction = fn;
187
- return this;
188
- }
189
- withIsVisibleFunction(fn) {
190
- this._isVisibleFunction = fn;
191
- return this;
192
- }
193
- withIsEnabledFunction(fn) {
194
- this._isEnabledFunction = fn;
195
- return this;
196
- }
197
- withRouteTrigger(routeUrl) {
198
- this._activationTrigger = ActionActivationTriggerEnum.OnRoute;
199
- this._routeUrl = routeUrl;
200
- return this;
201
- }
202
- withLevel(level) {
203
- this._level = level;
204
- return this;
205
- }
206
- /**
207
- * Overrides default title key with model action key (${model.typeName}.actions.${actionName}). Not relevant if parentType name is provided.
208
- */
209
- withModelTitle() {
210
- this._title = `${this._i18nModelActionBaseKey}.title`;
211
- return this;
212
- }
213
- /**
214
- * Overrides default title key (${actionName}.title). If null, no title will be shown.
215
- * @param title Title i18n key or title.
216
- */
217
- withTitle(title) {
218
- this._title = title;
219
- return this;
220
- }
221
- withIcon(icon) {
222
- this._icon = icon;
223
- return this;
224
- }
225
- withTooltip(tooltip) {
226
- this._title = tooltip;
227
- return this;
228
- }
229
- withClassName(className) {
230
- this._className = className;
231
- return this;
232
- }
233
- withSize(size = ActionSizeEnum.Normal) {
234
- this._size = size;
235
- return this;
236
- }
237
- withStyle(styleText = false, styleOutlined = false, styleRaised = false) {
238
- this._isStyleText = styleText;
239
- this._isStyleOutlined = styleOutlined;
240
- this._isStyleRaised = styleRaised;
241
- return this;
242
- }
243
- withPosition(position) {
244
- this._position = position;
245
- return this;
246
- }
247
- /**
248
- * Add a confirmation dialogue to the action
249
- * @param icon the icon to display on the confirmation dialogue
250
- * @param title the title of the confirmation dialogue
251
- * @param message the message on the confirmation dialogue
252
- * @param acceptTitle the title of the accepting button
253
- * @param rejectTitle the title of the rejecting button
254
- * @param runConfirmationConfigMapFn function used to generate the confirmation dialogue. **WARNING** changing the *accept* and *reject* methods of the *confirmConfig* parameter
255
- * may lead to unexpected behaviour
256
- */
257
- withRunConfirmation(icon = 'pi pi-exclamation-triangle', title, message, acceptTitle, rejectTitle, runConfirmationConfigMapFn) {
258
- this._hasRunConfirmation = true;
259
- this._runConfirmationIcon = icon;
260
- this._runConfirmationTitle = title;
261
- this._runConfirmationMessage = message;
262
- this._runConfirmationAcceptTitle = acceptTitle;
263
- this._runConfirmationRejectTitle = rejectTitle;
264
- this._runConfirmationConfigMapFn = runConfirmationConfigMapFn;
265
- return this;
266
- }
267
- withRunNotificationSuccess(title, message, hasNotification = true) {
268
- this._hasRunNotificationSuccess = hasNotification;
269
- this._runNotificationSuccessTitle = title;
270
- this._runNotificationSuccessMessage = message;
271
- return this;
272
- }
273
- withRunNotificationError(title, message, hasNotification = true) {
274
- this._hasRunNotificationError = hasNotification;
275
- this._runNotificationErrorTitle = title;
276
- this._runNotificationErrorMessage = message;
277
- return this;
278
- }
279
- withAfterRunAction(action) {
280
- this._afterRunAction = action;
281
- return this;
282
- }
283
- withOnRunErrorAction(action) {
284
- this._onRunErrorAction = action;
285
- return this;
286
- }
287
- }
288
- export class ActionSimpleDescriptor extends ActionDescriptor {
289
- constructor(actionName, modelType, idProperty, titleProperty) {
290
- const model = modelType ? new ModelDescriptor(modelType, idProperty, titleProperty) : null;
291
- super(model, actionName);
292
- }
293
- }
294
- export class ActionEditorDescriptor extends ActionDescriptor {
295
- constructor(editorDescriptor, actionName, parentType, parentProperty) {
296
- super(editorDescriptor.model, actionName, parentType, parentProperty);
297
- this._editorActions = [];
298
- this._editorTitle = undefined;
299
- this._hasFetchNotificationSuccess = false;
300
- this._dialogSize = ActionEditorDialogSizeEnum.Normal;
301
- this._type = ActionTypeEnum.Editor;
302
- this._editorDescriptor = editorDescriptor;
303
- this._editorActions.push(new ActionEditorSubmitDescriptor(this), new ActionEditorSubmitDescriptor(this, ActionEditorSubmitTypeEnum.Cancel));
304
- }
305
- get editorTitle() {
306
- return this._editorTitle;
307
- }
308
- get editorDescriptor() {
309
- return this._editorDescriptor;
310
- }
311
- get dialogSize() {
312
- return this._dialogSize;
313
- }
314
- get dialogClassName() {
315
- return this._dialogClassName;
316
- }
317
- get hasFetchNotificationSuccess() {
318
- return this._hasFetchNotificationSuccess;
319
- }
320
- get fetchNotificationSuccessTitle() {
321
- return this._fetchNotificationSuccessTitle;
322
- }
323
- get fetchNotificationSuccessMessage() {
324
- return this._fetchNotificationSuccessMessage;
325
- }
326
- get dataProvider() {
327
- return this._dataProvider;
328
- }
329
- get runFunction() {
330
- throw new Error('Run function cannot be used in editor action. Use submit function instead!');
331
- }
332
- get fetchFunction() {
333
- if (!this._fetchFunction) {
334
- return ctx => {
335
- console.debug(`Fetch function is not provided for function ${this._actionNameLong}, using default and returning context item`, ctx.parameters?.item);
336
- return of(ctx.parameters?.item ? ctx.parameters.item : {});
337
- };
338
- }
339
- return this._fetchFunction;
340
- }
341
- get submitFunction() {
342
- return this._submitFunction;
343
- }
344
- get editorActions() {
345
- return this._editorActions;
346
- }
347
- get editorComponent() {
348
- return this._editorComponent;
349
- }
350
- withEditorTitle(title) {
351
- this._editorTitle = title;
352
- return this;
353
- }
354
- withDataProvider(dataProvider) {
355
- this._dataProvider = dataProvider;
356
- return this;
357
- }
358
- withServiceType(serviceType) {
359
- if (!this._model) {
360
- throw new Error(`Cannot set data provider if no model type is provided for action ${this._actionName}`);
361
- }
362
- this._dataProvider = new EditorDataProvider(this._model.type, serviceType);
363
- return this;
364
- }
365
- withDialogSize(size = ActionEditorDialogSizeEnum.Normal) {
366
- this._dialogSize = size;
367
- return this;
368
- }
369
- withDialogClassName(className) {
370
- this._dialogClassName = className;
371
- return this;
372
- }
373
- withRunFunction(fn) {
374
- return this.withSubmitFunction(fn);
375
- }
376
- withFetchFunction(fn) {
377
- this._fetchFunction = fn;
378
- return this;
379
- }
380
- withSubmitFunction(fn) {
381
- this._submitFunction = fn;
382
- return this;
383
- }
384
- withFetchNotificationError(title, message, hasNotification = true) {
385
- this._hasFetchNotificationSuccess = hasNotification;
386
- this._fetchNotificationSuccessTitle = title;
387
- this._fetchNotificationSuccessMessage = message;
388
- return this;
389
- }
390
- withEditorAction(action) {
391
- this._editorActions.push(action);
392
- return this;
393
- }
394
- withEditorActions(actions) {
395
- this._editorActions = actions;
396
- return this;
397
- }
398
- withEditorComponent(editorComponent) {
399
- this._editorComponent = editorComponent;
400
- return this;
401
- }
402
- }
403
- export class ActionEditorSubmitDescriptor extends ActionDescriptor {
404
- constructor(editorAction, submitType = ActionEditorSubmitTypeEnum.Submit) {
405
- super(editorAction.model, submitType === ActionEditorSubmitTypeEnum.Submit ? 'submit' : 'cancel');
406
- this._editorAction = editorAction;
407
- this._submitType = submitType;
408
- this._position = ActionPositionEnum.FooterRight;
409
- this._isStyleText = true;
410
- }
411
- get submitType() {
412
- return this._submitType;
413
- }
414
- }
415
- export class ActionEditorDetailsDescriptor extends ActionEditorDescriptor {
416
- constructor(editorDescriptor) {
417
- super(editorDescriptor, ActionEditorDetailsDescriptor.ACTION_NAME);
418
- this.withPosition(ActionPositionEnum.RowClick);
419
- this.withRouteTrigger(':itemId');
420
- this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
421
- this.withEditorActions([new ActionEditorSubmitDescriptor(this, ActionEditorSubmitTypeEnum.Cancel)]);
422
- }
423
- withServiceType(serviceType) {
424
- return this.withServiceFetchFunction(serviceType);
425
- }
426
- withServiceFetchFunction(serviceType, fetchFn) {
427
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
428
- if (fetchFn) {
429
- dataProvider.withFetch(fetchFn);
430
- }
431
- this._dataProvider = dataProvider;
432
- return this;
433
- }
434
- }
435
- ActionEditorDetailsDescriptor.ACTION_NAME = 'details';
436
- export class ActionEditorAddDescriptor extends ActionEditorDescriptor {
437
- constructor(editorDescriptor) {
438
- super(editorDescriptor, ActionEditorAddDescriptor.ACTION_NAME);
439
- this.withPosition(ActionPositionEnum.ToolbarLeft);
440
- this.withRouteTrigger('add');
441
- this.withSubmitFunction(ActionDataProviderUtil.runCreateOrFail);
442
- this.withLevel(ActionLevelEnum.Success);
443
- this.withIcon('pi pi-plus');
444
- }
445
- withServiceType(serviceType) {
446
- return this.withServiceSubmitFunction(serviceType);
447
- }
448
- withServiceSubmitFunction(serviceType, createFn, fetchFn) {
449
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
450
- if (createFn) {
451
- dataProvider.withCreate(createFn);
452
- }
453
- if (fetchFn) {
454
- dataProvider.withFetch(fetchFn);
455
- }
456
- this._dataProvider = dataProvider;
457
- return this;
458
- }
459
- }
460
- ActionEditorAddDescriptor.ACTION_NAME = 'add';
461
- export class ActionEditorEditDescriptor extends ActionEditorDescriptor {
462
- constructor(editorDescriptor) {
463
- super(editorDescriptor, ActionEditorEditDescriptor.ACTION_NAME);
464
- this.withPosition(ActionPositionEnum.RowInline);
465
- this.withTitle(null);
466
- this.withRouteTrigger(':itemId/edit');
467
- this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
468
- this.withSubmitFunction(ActionDataProviderUtil.runUpdateOrFail);
469
- this.withIcon('pi pi-pencil');
470
- }
471
- withServiceType(serviceType) {
472
- return this.withServiceSubmitFunction(serviceType);
473
- }
474
- withServiceSubmitFunction(serviceType, updateFn, fetchFn) {
475
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
476
- if (updateFn) {
477
- dataProvider.withUpdate(updateFn);
478
- }
479
- if (fetchFn) {
480
- dataProvider.withFetch(fetchFn);
481
- }
482
- this._dataProvider = dataProvider;
483
- return this;
484
- }
485
- }
486
- ActionEditorEditDescriptor.ACTION_NAME = 'edit';
487
- export class ActionDeleteDescriptor extends ActionDescriptor {
488
- constructor(model) {
489
- super(model, ActionDeleteDescriptor.ACTION_NAME);
490
- this.withPosition(ActionPositionEnum.RowInline);
491
- this.withTitle(null);
492
- this.withRunFunction(ActionDataProviderUtil.runDeleteOrFail);
493
- this.withLevel(ActionLevelEnum.Danger);
494
- this.withIcon('pi pi-trash');
495
- this.withRunConfirmation(undefined);
496
- }
497
- withServiceType(serviceType) {
498
- return this.withServiceDeleteFunction(serviceType);
499
- }
500
- withServiceDeleteFunction(serviceType, deleteFn) {
501
- const dataProvider = new EditorDataProvider(this._model.type, serviceType);
502
- if (deleteFn) {
503
- dataProvider.withDelete(deleteFn);
504
- }
505
- this._dataProvider = dataProvider;
506
- return this;
507
- }
508
- }
509
- ActionDeleteDescriptor.ACTION_NAME = 'delete';
510
- export class ActionLinkDescriptor extends ActionDescriptor {
511
- constructor(model = null, actionName = 'link') {
512
- super(model, actionName);
513
- this._url = '';
514
- this._pathSegments = [];
515
- this._replaceUrl = false;
516
- this._target = '_self';
517
- this._isStyleLink = false;
518
- }
519
- get url() {
520
- return this._url;
521
- }
522
- get pathSegments() {
523
- return this._pathSegments;
524
- }
525
- get queryParams() {
526
- return this._queryParams;
527
- }
528
- get queryParamsHandling() {
529
- return this._queryParamsHandling;
530
- }
531
- get replaceUrl() {
532
- return this._replaceUrl;
533
- }
534
- get target() {
535
- return this._target;
536
- }
537
- get isStyleLink() {
538
- return this._isStyleLink;
539
- }
540
- withHref(url) {
541
- this._url = url;
542
- return this;
543
- }
544
- withRouterLink(...pathSegments) {
545
- this._pathSegments = pathSegments;
546
- return this;
547
- }
548
- withQueryParams(queryParams, queryParamsHandling) {
549
- this._queryParams = queryParams;
550
- this._queryParamsHandling = queryParamsHandling;
551
- return this;
552
- }
553
- withReplaceUrl(replaceUrl = false) {
554
- this._replaceUrl = replaceUrl;
555
- return this;
556
- }
557
- withTarget(target = '_self') {
558
- this._target = target;
559
- return this;
560
- }
561
- withStyleLink(isStyleLink) {
562
- this._isStyleLink = isStyleLink;
563
- return this;
564
- }
565
- }
1
+ import { of } from 'rxjs';
2
+ import { DataProvider, EditorDataProvider } from '../data-providers';
3
+ import { ActionDataProviderUtil, TypeUtil } from '../utils';
4
+ import { ModelDescriptor } from './';
5
+ import { ActionActivationTriggerEnum, ActionEditorDialogSizeEnum, ActionEditorSubmitTypeEnum, ActionLevelEnum, ActionPositionEnum, ActionSizeEnum, ActionTypeEnum } from './types';
6
+ export class ActionDescriptor {
7
+ constructor(model, actionName, parentType, parentProperty) {
8
+ this._type = ActionTypeEnum.Direct;
9
+ this._activationTrigger = ActionActivationTriggerEnum.OnClick;
10
+ this._position = ActionPositionEnum.ToolbarRight;
11
+ this._level = ActionLevelEnum.Default;
12
+ this._routeUrl = null;
13
+ this._className = '';
14
+ this._size = ActionSizeEnum.Normal;
15
+ this._isStyleText = false;
16
+ this._isStyleOutlined = false;
17
+ this._isStyleRaised = false;
18
+ this._hasRunConfirmation = false;
19
+ this._hasRunNotificationSuccess = true;
20
+ this._hasRunNotificationError = true;
21
+ this._model = model;
22
+ this._actionName = actionName;
23
+ if ((parentType && !parentProperty) || (!parentProperty && parentProperty)) {
24
+ throw new Error(`Provide both the parent type and parent property or none: ${parentType}, ${parentProperty}.`);
25
+ }
26
+ this._parentType = parentType;
27
+ this._parentTypeName = parentType ? TypeUtil.findTypeName(parentType) : undefined;
28
+ this._parentProperty = parentProperty;
29
+ if (this._parentTypeName || this._model) {
30
+ this._i18nModelActionBaseKey = this._parentTypeName
31
+ ? `${this._parentTypeName}.actions.${this._parentProperty}_${actionName}`
32
+ : `${this._model.typeName}.actions.${actionName}`;
33
+ }
34
+ let displayName = actionName;
35
+ if (this._model)
36
+ displayName = `${this._model.typeName}.${displayName}`;
37
+ if (this._parentTypeName) {
38
+ displayName = `${this._parentTypeName}.${this._parentProperty}_${displayName}`;
39
+ }
40
+ this._actionNameLong = displayName;
41
+ }
42
+ get model() {
43
+ return this._model;
44
+ }
45
+ get parentTypeName() {
46
+ return this._parentTypeName;
47
+ }
48
+ get parentProperty() {
49
+ return this._parentProperty;
50
+ }
51
+ get i18nModelActionBaseKey() {
52
+ return this._i18nModelActionBaseKey;
53
+ }
54
+ get type() {
55
+ return this._type;
56
+ }
57
+ get activationTrigger() {
58
+ return this._activationTrigger;
59
+ }
60
+ get position() {
61
+ return this._position;
62
+ }
63
+ get level() {
64
+ return this._level;
65
+ }
66
+ get routeUrl() {
67
+ return this._routeUrl;
68
+ }
69
+ get title() {
70
+ return this._title;
71
+ }
72
+ get icon() {
73
+ return this._icon;
74
+ }
75
+ get tooltip() {
76
+ return this._tooltip;
77
+ }
78
+ get dataProvider() {
79
+ return this._dataProvider;
80
+ }
81
+ get hasRunFunction() {
82
+ return typeof this._runFunction === 'function';
83
+ }
84
+ get runFunction() {
85
+ if (!this._runFunction) {
86
+ throw new Error('Run function is not defined and cannot be invoked');
87
+ }
88
+ return this._runFunction;
89
+ }
90
+ get isVisibleFunction() {
91
+ return this._isVisibleFunction;
92
+ }
93
+ get isEnabledFunction() {
94
+ return this._isEnabledFunction;
95
+ }
96
+ get actionName() {
97
+ return this._actionName;
98
+ }
99
+ get actionNameLong() {
100
+ return this._actionNameLong;
101
+ }
102
+ get className() {
103
+ return this._className;
104
+ }
105
+ get isStyleText() {
106
+ return this._isStyleText;
107
+ }
108
+ get isStyleOutlined() {
109
+ return this._isStyleOutlined;
110
+ }
111
+ get isStyleRaised() {
112
+ return this._isStyleRaised;
113
+ }
114
+ get size() {
115
+ return this._size;
116
+ }
117
+ get isSizeExtraSmall() {
118
+ return this._size === ActionSizeEnum.ExtraSmall;
119
+ }
120
+ get isSizeSmall() {
121
+ return this._size === ActionSizeEnum.Small;
122
+ }
123
+ get isSizeLarge() {
124
+ return this._size === ActionSizeEnum.Large;
125
+ }
126
+ get isSizeExtraLarge() {
127
+ return this._size === ActionSizeEnum.ExtraLarge;
128
+ }
129
+ get hasRunConfirmation() {
130
+ return this._hasRunConfirmation;
131
+ }
132
+ get runConfirmationIcon() {
133
+ return this._runConfirmationIcon;
134
+ }
135
+ get runConfirmationTitle() {
136
+ return this._runConfirmationTitle;
137
+ }
138
+ get runConfirmationMessage() {
139
+ return this._runConfirmationMessage;
140
+ }
141
+ get runConfirmationAcceptTitle() {
142
+ return this._runConfirmationAcceptTitle;
143
+ }
144
+ get runConfirmationRejectTitle() {
145
+ return this._runConfirmationRejectTitle;
146
+ }
147
+ get runConfirmationConfigMapFn() {
148
+ return this._runConfirmationConfigMapFn;
149
+ }
150
+ get hasRunNotificationSuccess() {
151
+ return this._hasRunNotificationSuccess;
152
+ }
153
+ get runNotificationSuccessTitle() {
154
+ return this._runNotificationSuccessTitle;
155
+ }
156
+ get runNotificationSuccessMessage() {
157
+ return this._runNotificationSuccessMessage;
158
+ }
159
+ get hasRunNotificationError() {
160
+ return this._hasRunNotificationError;
161
+ }
162
+ get runNotificationErrorTitle() {
163
+ return this._runNotificationErrorTitle;
164
+ }
165
+ get runNotificationErrorMessage() {
166
+ return this._runNotificationErrorMessage;
167
+ }
168
+ get afterRunAction() {
169
+ return this._afterRunAction;
170
+ }
171
+ get onRunErrorAction() {
172
+ return this._onRunErrorAction;
173
+ }
174
+ withDataProvider(dataProvider) {
175
+ this._dataProvider = dataProvider;
176
+ return this;
177
+ }
178
+ withServiceType(serviceType) {
179
+ if (!this._model) {
180
+ throw new Error(`Cannot set data provider if no model type is provided for action ${this._actionName}`);
181
+ }
182
+ this._dataProvider = new DataProvider(this._model.type, serviceType);
183
+ return this;
184
+ }
185
+ withRunFunction(fn) {
186
+ this._runFunction = fn;
187
+ return this;
188
+ }
189
+ withIsVisibleFunction(fn) {
190
+ this._isVisibleFunction = fn;
191
+ return this;
192
+ }
193
+ withIsEnabledFunction(fn) {
194
+ this._isEnabledFunction = fn;
195
+ return this;
196
+ }
197
+ withRouteTrigger(routeUrl) {
198
+ this._activationTrigger = ActionActivationTriggerEnum.OnRoute;
199
+ this._routeUrl = routeUrl;
200
+ return this;
201
+ }
202
+ withLevel(level) {
203
+ this._level = level;
204
+ return this;
205
+ }
206
+ /**
207
+ * Overrides default title key with model action key (${model.typeName}.actions.${actionName}). Not relevant if parentType name is provided.
208
+ */
209
+ withModelTitle() {
210
+ this._title = `${this._i18nModelActionBaseKey}.title`;
211
+ return this;
212
+ }
213
+ /**
214
+ * Overrides default title key (${actionName}.title). If null, no title will be shown.
215
+ * @param title Title i18n key or title.
216
+ */
217
+ withTitle(title) {
218
+ this._title = title;
219
+ return this;
220
+ }
221
+ withIcon(icon) {
222
+ this._icon = icon;
223
+ return this;
224
+ }
225
+ withTooltip(tooltip) {
226
+ this._title = tooltip;
227
+ return this;
228
+ }
229
+ withClassName(className) {
230
+ this._className = className;
231
+ return this;
232
+ }
233
+ withSize(size = ActionSizeEnum.Normal) {
234
+ this._size = size;
235
+ return this;
236
+ }
237
+ withStyle(styleText = false, styleOutlined = false, styleRaised = false) {
238
+ this._isStyleText = styleText;
239
+ this._isStyleOutlined = styleOutlined;
240
+ this._isStyleRaised = styleRaised;
241
+ return this;
242
+ }
243
+ withPosition(position) {
244
+ this._position = position;
245
+ return this;
246
+ }
247
+ /**
248
+ * Add a confirmation dialogue to the action
249
+ * @param icon the icon to display on the confirmation dialogue
250
+ * @param title the title of the confirmation dialogue
251
+ * @param message the message on the confirmation dialogue
252
+ * @param acceptTitle the title of the accepting button
253
+ * @param rejectTitle the title of the rejecting button
254
+ * @param runConfirmationConfigMapFn function used to generate the confirmation dialogue. **WARNING** changing the *accept* and *reject* methods of the *confirmConfig* parameter
255
+ * may lead to unexpected behaviour
256
+ */
257
+ withRunConfirmation(icon = 'pi pi-exclamation-triangle', title, message, acceptTitle, rejectTitle, runConfirmationConfigMapFn) {
258
+ this._hasRunConfirmation = true;
259
+ this._runConfirmationIcon = icon;
260
+ this._runConfirmationTitle = title;
261
+ this._runConfirmationMessage = message;
262
+ this._runConfirmationAcceptTitle = acceptTitle;
263
+ this._runConfirmationRejectTitle = rejectTitle;
264
+ this._runConfirmationConfigMapFn = runConfirmationConfigMapFn;
265
+ return this;
266
+ }
267
+ withRunNotificationSuccess(title, message, hasNotification = true) {
268
+ this._hasRunNotificationSuccess = hasNotification;
269
+ this._runNotificationSuccessTitle = title;
270
+ this._runNotificationSuccessMessage = message;
271
+ return this;
272
+ }
273
+ withRunNotificationError(title, message, hasNotification = true) {
274
+ this._hasRunNotificationError = hasNotification;
275
+ this._runNotificationErrorTitle = title;
276
+ this._runNotificationErrorMessage = message;
277
+ return this;
278
+ }
279
+ withAfterRunAction(action) {
280
+ this._afterRunAction = action;
281
+ return this;
282
+ }
283
+ withOnRunErrorAction(action) {
284
+ this._onRunErrorAction = action;
285
+ return this;
286
+ }
287
+ }
288
+ export class ActionSimpleDescriptor extends ActionDescriptor {
289
+ constructor(actionName, modelType, idProperty, titleProperty) {
290
+ const model = modelType ? new ModelDescriptor(modelType, idProperty, titleProperty) : null;
291
+ super(model, actionName);
292
+ }
293
+ }
294
+ export class ActionEditorDescriptor extends ActionDescriptor {
295
+ constructor(editorDescriptor, actionName, parentType, parentProperty) {
296
+ super(editorDescriptor.model, actionName, parentType, parentProperty);
297
+ this._editorActions = [];
298
+ this._editorTitle = undefined;
299
+ this._hasFetchNotificationSuccess = false;
300
+ this._dialogSize = ActionEditorDialogSizeEnum.Normal;
301
+ this._type = ActionTypeEnum.Editor;
302
+ this._editorDescriptor = editorDescriptor;
303
+ this._editorActions.push(new ActionEditorSubmitDescriptor(this), new ActionEditorSubmitDescriptor(this, ActionEditorSubmitTypeEnum.Cancel));
304
+ }
305
+ get editorTitle() {
306
+ return this._editorTitle;
307
+ }
308
+ get editorDescriptor() {
309
+ return this._editorDescriptor;
310
+ }
311
+ get dialogSize() {
312
+ return this._dialogSize;
313
+ }
314
+ get dialogClassName() {
315
+ return this._dialogClassName;
316
+ }
317
+ get hasFetchNotificationSuccess() {
318
+ return this._hasFetchNotificationSuccess;
319
+ }
320
+ get fetchNotificationSuccessTitle() {
321
+ return this._fetchNotificationSuccessTitle;
322
+ }
323
+ get fetchNotificationSuccessMessage() {
324
+ return this._fetchNotificationSuccessMessage;
325
+ }
326
+ get dataProvider() {
327
+ return this._dataProvider;
328
+ }
329
+ get runFunction() {
330
+ throw new Error('Run function cannot be used in editor action. Use submit function instead!');
331
+ }
332
+ get fetchFunction() {
333
+ if (!this._fetchFunction) {
334
+ return ctx => {
335
+ console.debug(`Fetch function is not provided for function ${this._actionNameLong}, using default and returning context item`, ctx.parameters?.item);
336
+ return of(ctx.parameters?.item ? ctx.parameters.item : {});
337
+ };
338
+ }
339
+ return this._fetchFunction;
340
+ }
341
+ get submitFunction() {
342
+ return this._submitFunction;
343
+ }
344
+ get editorActions() {
345
+ return this._editorActions;
346
+ }
347
+ get editorComponent() {
348
+ return this._editorComponent;
349
+ }
350
+ withEditorTitle(title) {
351
+ this._editorTitle = title;
352
+ return this;
353
+ }
354
+ withDataProvider(dataProvider) {
355
+ this._dataProvider = dataProvider;
356
+ return this;
357
+ }
358
+ withServiceType(serviceType) {
359
+ if (!this._model) {
360
+ throw new Error(`Cannot set data provider if no model type is provided for action ${this._actionName}`);
361
+ }
362
+ this._dataProvider = new EditorDataProvider(this._model.type, serviceType);
363
+ return this;
364
+ }
365
+ withDialogSize(size = ActionEditorDialogSizeEnum.Normal) {
366
+ this._dialogSize = size;
367
+ return this;
368
+ }
369
+ withDialogClassName(className) {
370
+ this._dialogClassName = className;
371
+ return this;
372
+ }
373
+ withRunFunction(fn) {
374
+ return this.withSubmitFunction(fn);
375
+ }
376
+ withFetchFunction(fn) {
377
+ this._fetchFunction = fn;
378
+ return this;
379
+ }
380
+ withSubmitFunction(fn) {
381
+ this._submitFunction = fn;
382
+ return this;
383
+ }
384
+ withFetchNotificationError(title, message, hasNotification = true) {
385
+ this._hasFetchNotificationSuccess = hasNotification;
386
+ this._fetchNotificationSuccessTitle = title;
387
+ this._fetchNotificationSuccessMessage = message;
388
+ return this;
389
+ }
390
+ withEditorAction(action) {
391
+ this._editorActions.push(action);
392
+ return this;
393
+ }
394
+ withEditorActions(actions) {
395
+ this._editorActions = actions;
396
+ return this;
397
+ }
398
+ withEditorComponent(editorComponent) {
399
+ this._editorComponent = editorComponent;
400
+ return this;
401
+ }
402
+ }
403
+ export class ActionEditorSubmitDescriptor extends ActionDescriptor {
404
+ constructor(editorAction, submitType = ActionEditorSubmitTypeEnum.Submit) {
405
+ super(editorAction.model, submitType === ActionEditorSubmitTypeEnum.Submit ? 'submit' : 'cancel');
406
+ this._editorAction = editorAction;
407
+ this._submitType = submitType;
408
+ this._position = ActionPositionEnum.FooterRight;
409
+ this._isStyleText = true;
410
+ }
411
+ get submitType() {
412
+ return this._submitType;
413
+ }
414
+ }
415
+ export class ActionEditorDetailsDescriptor extends ActionEditorDescriptor {
416
+ constructor(editorDescriptor) {
417
+ super(editorDescriptor, ActionEditorDetailsDescriptor.ACTION_NAME);
418
+ this.withPosition(ActionPositionEnum.RowClick);
419
+ this.withRouteTrigger(':itemId');
420
+ this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
421
+ this.withEditorActions([new ActionEditorSubmitDescriptor(this, ActionEditorSubmitTypeEnum.Cancel)]);
422
+ }
423
+ withServiceType(serviceType) {
424
+ return this.withServiceFetchFunction(serviceType);
425
+ }
426
+ withServiceFetchFunction(serviceType, fetchFn) {
427
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
428
+ if (fetchFn) {
429
+ dataProvider.withFetch(fetchFn);
430
+ }
431
+ this._dataProvider = dataProvider;
432
+ return this;
433
+ }
434
+ }
435
+ ActionEditorDetailsDescriptor.ACTION_NAME = 'details';
436
+ export class ActionEditorAddDescriptor extends ActionEditorDescriptor {
437
+ constructor(editorDescriptor) {
438
+ super(editorDescriptor, ActionEditorAddDescriptor.ACTION_NAME);
439
+ this.withPosition(ActionPositionEnum.ToolbarLeft);
440
+ this.withRouteTrigger('add');
441
+ this.withSubmitFunction(ActionDataProviderUtil.runCreateOrFail);
442
+ this.withLevel(ActionLevelEnum.Success);
443
+ this.withIcon('pi pi-plus');
444
+ }
445
+ withServiceType(serviceType) {
446
+ return this.withServiceSubmitFunction(serviceType);
447
+ }
448
+ withServiceSubmitFunction(serviceType, createFn, fetchFn) {
449
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
450
+ if (createFn) {
451
+ dataProvider.withCreate(createFn);
452
+ }
453
+ if (fetchFn) {
454
+ dataProvider.withFetch(fetchFn);
455
+ }
456
+ this._dataProvider = dataProvider;
457
+ return this;
458
+ }
459
+ }
460
+ ActionEditorAddDescriptor.ACTION_NAME = 'add';
461
+ export class ActionEditorEditDescriptor extends ActionEditorDescriptor {
462
+ constructor(editorDescriptor) {
463
+ super(editorDescriptor, ActionEditorEditDescriptor.ACTION_NAME);
464
+ this.withPosition(ActionPositionEnum.RowInline);
465
+ this.withTitle(null);
466
+ this.withRouteTrigger(':itemId/edit');
467
+ this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
468
+ this.withSubmitFunction(ActionDataProviderUtil.runUpdateOrFail);
469
+ this.withIcon('pi pi-pencil');
470
+ }
471
+ withServiceType(serviceType) {
472
+ return this.withServiceSubmitFunction(serviceType);
473
+ }
474
+ withServiceSubmitFunction(serviceType, updateFn, fetchFn) {
475
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
476
+ if (updateFn) {
477
+ dataProvider.withUpdate(updateFn);
478
+ }
479
+ if (fetchFn) {
480
+ dataProvider.withFetch(fetchFn);
481
+ }
482
+ this._dataProvider = dataProvider;
483
+ return this;
484
+ }
485
+ }
486
+ ActionEditorEditDescriptor.ACTION_NAME = 'edit';
487
+ export class ActionDeleteDescriptor extends ActionDescriptor {
488
+ constructor(model) {
489
+ super(model, ActionDeleteDescriptor.ACTION_NAME);
490
+ this.withPosition(ActionPositionEnum.RowInline);
491
+ this.withTitle(null);
492
+ this.withRunFunction(ActionDataProviderUtil.runDeleteOrFail);
493
+ this.withLevel(ActionLevelEnum.Danger);
494
+ this.withIcon('pi pi-trash');
495
+ this.withRunConfirmation(undefined);
496
+ }
497
+ withServiceType(serviceType) {
498
+ return this.withServiceDeleteFunction(serviceType);
499
+ }
500
+ withServiceDeleteFunction(serviceType, deleteFn) {
501
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
502
+ if (deleteFn) {
503
+ dataProvider.withDelete(deleteFn);
504
+ }
505
+ this._dataProvider = dataProvider;
506
+ return this;
507
+ }
508
+ }
509
+ ActionDeleteDescriptor.ACTION_NAME = 'delete';
510
+ export class ActionLinkDescriptor extends ActionDescriptor {
511
+ constructor(model = null, actionName = 'link') {
512
+ super(model, actionName);
513
+ this._url = '';
514
+ this._pathSegments = [];
515
+ this._replaceUrl = false;
516
+ this._target = '_self';
517
+ this._isStyleLink = false;
518
+ }
519
+ get url() {
520
+ return this._url;
521
+ }
522
+ get pathSegments() {
523
+ return this._pathSegments;
524
+ }
525
+ get queryParams() {
526
+ return this._queryParams;
527
+ }
528
+ get queryParamsHandling() {
529
+ return this._queryParamsHandling;
530
+ }
531
+ get replaceUrl() {
532
+ return this._replaceUrl;
533
+ }
534
+ get target() {
535
+ return this._target;
536
+ }
537
+ get isStyleLink() {
538
+ return this._isStyleLink;
539
+ }
540
+ withHref(url) {
541
+ this._url = url;
542
+ return this;
543
+ }
544
+ withRouterLink(...pathSegments) {
545
+ this._pathSegments = pathSegments;
546
+ return this;
547
+ }
548
+ withQueryParams(queryParams, queryParamsHandling) {
549
+ this._queryParams = queryParams;
550
+ this._queryParamsHandling = queryParamsHandling;
551
+ return this;
552
+ }
553
+ withReplaceUrl(replaceUrl = false) {
554
+ this._replaceUrl = replaceUrl;
555
+ return this;
556
+ }
557
+ withTarget(target = '_self') {
558
+ this._target = target;
559
+ return this;
560
+ }
561
+ withStyleLink(isStyleLink) {
562
+ this._isStyleLink = isStyleLink;
563
+ return this;
564
+ }
565
+ }
566
566
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2FjdGlvbi5kZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBYSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHcEMsT0FBTyxFQUFDLFlBQVksRUFBRSxrQkFBa0IsRUFBcUMsTUFBTSxtQkFBbUIsQ0FBQztBQUV2RyxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQzFELE9BQU8sRUFBbUIsZUFBZSxFQUFDLE1BQU0sSUFBSSxDQUFDO0FBQ3JELE9BQU8sRUFBQywyQkFBMkIsRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVqTCxNQUFNLE9BQU8sZ0JBQWdCO0lBaUR6QixZQUFZLEtBQWdDLEVBQUUsVUFBa0IsRUFBRSxVQUEyQixFQUFFLGNBQXVCO1FBeEM1RyxVQUFLLEdBQW1CLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDOUMsdUJBQWtCLEdBQWdDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQztRQUN0RixjQUFTLEdBQXVCLGtCQUFrQixDQUFDLFlBQVksQ0FBQztRQUNoRSxXQUFNLEdBQW9CLGVBQWUsQ0FBQyxPQUFPLENBQUM7UUFFbEQsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFLaEMsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixVQUFLLEdBQW1CLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDOUMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBT3ZCLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQVE1QiwrQkFBMEIsR0FBRyxJQUFJ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QUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1R5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQYXJhbXMsIFF1ZXJ5UGFyYW1zSGFuZGxpbmd9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7Q29uZmlybWF0aW9ufSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtBY3Rpb25Db250ZXh0LCBBY3Rpb25Db250ZXh0VmFsaWRhdGlvbn0gZnJvbSAnLi4vY29tcG9uZW50cy9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7RGF0YVByb3ZpZGVyLCBFZGl0b3JEYXRhUHJvdmlkZXIsIElEYXRhUHJvdmlkZXIsIElFZGl0b3JEYXRhUHJvdmlkZXJ9IGZyb20gJy4uL2RhdGEtcHJvdmlkZXJzJztcbmltcG9ydCB7Q2xhc3NUeXBlLCBJZFR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7QWN0aW9uRGF0YVByb3ZpZGVyVXRpbCwgVHlwZVV0aWx9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7RWRpdG9yRGVzY3JpcHRvciwgTW9kZWxEZXNjcmlwdG9yfSBmcm9tICcuLyc7XG5pbXBvcnQge0FjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bSwgQWN0aW9uRWRpdG9yRGlhbG9nU2l6ZUVudW0sIEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLCBBY3Rpb25MZXZlbEVudW0sIEFjdGlvblBvc2l0aW9uRW51bSwgQWN0aW9uU2l6ZUVudW0sIEFjdGlvblR5cGVFbnVtfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPiB8IG51bGw7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hY3Rpb25OYW1lOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hY3Rpb25OYW1lTG9uZzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcGFyZW50VHlwZT86IENsYXNzVHlwZTxhbnk+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcGFyZW50VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wYXJlbnRQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXk/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX3R5cGU6IEFjdGlvblR5cGVFbnVtID0gQWN0aW9uVHlwZUVudW0uRGlyZWN0O1xuICAgIHByb3RlY3RlZCBfYWN0aXZhdGlvblRyaWdnZXI6IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bSA9IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PbkNsaWNrO1xuICAgIHByb3RlY3RlZCBfcG9zaXRpb246IEFjdGlvblBvc2l0aW9uRW51bSA9IEFjdGlvblBvc2l0aW9uRW51bS5Ub29sYmFyUmlnaHQ7XG4gICAgcHJvdGVjdGVkIF9sZXZlbDogQWN0aW9uTGV2ZWxFbnVtID0gQWN0aW9uTGV2ZWxFbnVtLkRlZmF1bHQ7XG5cbiAgICBwcm90ZWN0ZWQgX3JvdXRlVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCBfdGl0bGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIHByb3RlY3RlZCBfaWNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgcHJvdGVjdGVkIF90b29sdGlwPzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgX2NsYXNzTmFtZSA9ICcnO1xuICAgIHByb3RlY3RlZCBfc2l6ZTogQWN0aW9uU2l6ZUVudW0gPSBBY3Rpb25TaXplRW51bS5Ob3JtYWw7XG4gICAgcHJvdGVjdGVkIF9pc1N0eWxlVGV4dCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfaXNTdHlsZU91dGxpbmVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9pc1N0eWxlUmFpc2VkID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgX2RhdGFQcm92aWRlcj86IElEYXRhUHJvdmlkZXI8VCwgYW55PjtcbiAgICBwcm90ZWN0ZWQgX3J1bkZ1bmN0aW9uPzogKGN0eDogQWN0aW9uQ29udGV4dDxULCBhbnk+KSA9PiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQgfCBudWxsPjtcbiAgICBwcm90ZWN0ZWQgX2lzVmlzaWJsZUZ1bmN0aW9uPzogKGN0eDogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248VCwgYW55PikgPT4gT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwcm90ZWN0ZWQgX2lzRW5hYmxlZEZ1bmN0aW9uPzogKGN0eDogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248VCwgYW55PikgPT4gT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIHByb3RlY3RlZCBfaGFzUnVuQ29uZmlybWF0aW9uID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9ydW5Db25maXJtYXRpb25JY29uPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcnVuQ29uZmlybWF0aW9uVGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ydW5Db25maXJtYXRpb25NZXNzYWdlPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcnVuQ29uZmlybWF0aW9uQWNjZXB0VGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ydW5Db25maXJtYXRpb25SZWplY3RUaXRsZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX3J1bkNvbmZpcm1hdGlvbkNvbmZpZ01hcEZuPzogKGN0eDogQWN0aW9uQ29udGV4dDxULCBhbnk+LCBjb25maXJtQ29uZmlnOiBDb25maXJtYXRpb24pID0+IENvbmZpcm1hdGlvbjtcblxuICAgIHByb3RlY3RlZCBfaGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcyA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9ydW5Ob3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfaGFzUnVuTm90aWZpY2F0aW9uRXJyb3IgPSB0cnVlO1xuICAgIHByb3RlY3RlZCBfcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfYWZ0ZXJSdW5BY3Rpb24/OiBBY3Rpb25EZXNjcmlwdG9yPHVua25vd24+O1xuICAgIHByb3RlY3RlZCBfb25SdW5FcnJvckFjdGlvbj86IEFjdGlvbkRlc2NyaXB0b3I8dW5rbm93bj47XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFQ+IHwgbnVsbCwgYWN0aW9uTmFtZTogc3RyaW5nLCBwYXJlbnRUeXBlPzogQ2xhc3NUeXBlPGFueT4sIHBhcmVudFByb3BlcnR5Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMuX2FjdGlvbk5hbWUgPSBhY3Rpb25OYW1lO1xuXG4gICAgICAgIGlmICgocGFyZW50VHlwZSAmJiAhcGFyZW50UHJvcGVydHkpIHx8ICghcGFyZW50UHJvcGVydHkgJiYgcGFyZW50UHJvcGVydHkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGUgYm90aCB0aGUgcGFyZW50IHR5cGUgYW5kIHBhcmVudCBwcm9wZXJ0eSBvciBub25lOiAke3BhcmVudFR5cGV9LCAke3BhcmVudFByb3BlcnR5fS5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wYXJlbnRUeXBlID0gcGFyZW50VHlwZTtcbiAgICAgICAgdGhpcy5fcGFyZW50VHlwZU5hbWUgPSBwYXJlbnRUeXBlID8gVHlwZVV0aWwuZmluZFR5cGVOYW1lKHBhcmVudFR5cGUpIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9wYXJlbnRQcm9wZXJ0eSA9IHBhcmVudFByb3BlcnR5O1xuXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnRUeXBlTmFtZSB8fCB0aGlzLl9tb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5faTE4bk1vZGVsQWN0aW9uQmFzZUtleSA9IHRoaXMuX3BhcmVudFR5cGVOYW1lXG4gICAgICAgICAgICAgICAgPyBgJHt0aGlzLl9wYXJlbnRUeXBlTmFtZX0uYWN0aW9ucy4ke3RoaXMuX3BhcmVudFByb3BlcnR5fV8ke2FjdGlvbk5hbWV9YFxuICAgICAgICAgICAgICAgIDogYCR7dGhpcy5fbW9kZWwhLnR5cGVOYW1lfS5hY3Rpb25zLiR7YWN0aW9uTmFtZX1gO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkaXNwbGF5TmFtZSA9IGFjdGlvbk5hbWU7XG4gICAgICAgIGlmICh0aGlzLl9tb2RlbCkgZGlzcGxheU5hbWUgPSBgJHt0aGlzLl9tb2RlbC50eXBlTmFtZX0uJHtkaXNwbGF5TmFtZX1gO1xuICAgICAgICBpZiAodGhpcy5fcGFyZW50VHlwZU5hbWUpIHtcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lID0gYCR7dGhpcy5fcGFyZW50VHlwZU5hbWV9LiR7dGhpcy5fcGFyZW50UHJvcGVydHl9XyR7ZGlzcGxheU5hbWV9YDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hY3Rpb25OYW1lTG9uZyA9IGRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhcmVudFR5cGVOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50VHlwZU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJlbnRQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaTE4bk1vZGVsQWN0aW9uQmFzZUtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGl2YXRpb25UcmlnZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZhdGlvblRyaWdnZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvdXRlVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm91dGVVcmw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWNvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ljb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG9vbHRpcDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGFQcm92aWRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFQcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc1J1bkZ1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX3J1bkZ1bmN0aW9uID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuRnVuY3Rpb24oKTogKGN0eDogQWN0aW9uQ29udGV4dDxULCBhbnk+KSA9PiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQgfCBudWxsPiB7XG4gICAgICAgIGlmICghdGhpcy5fcnVuRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUnVuIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgaW52b2tlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5GdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzVmlzaWJsZUZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlRnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0VuYWJsZWRGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRW5hYmxlZEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9uTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25OYW1lTG9uZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWVMb25nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIGdldCBpc1N0eWxlVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU3R5bGVUZXh0O1xuICAgIH1cblxuICAgIGdldCBpc1N0eWxlT3V0bGluZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1N0eWxlT3V0bGluZWQ7XG4gICAgfVxuXG4gICAgZ2V0IGlzU3R5bGVSYWlzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1N0eWxlUmFpc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc1NpemVFeHRyYVNtYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gQWN0aW9uU2l6ZUVudW0uRXh0cmFTbWFsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU2l6ZVNtYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZSA9PT0gQWN0aW9uU2l6ZUVudW0uU21hbGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc1NpemVMYXJnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemUgPT09IEFjdGlvblNpemVFbnVtLkxhcmdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNTaXplRXh0cmFMYXJnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemUgPT09IEFjdGlvblNpemVFbnVtLkV4dHJhTGFyZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSdW5Db25maXJtYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNSdW5Db25maXJtYXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Db25maXJtYXRpb25JY29uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uSWNvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkNvbmZpcm1hdGlvblRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uVGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Db25maXJtYXRpb25NZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uTWVzc2FnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkNvbmZpcm1hdGlvbkFjY2VwdFRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uQWNjZXB0VGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Db25maXJtYXRpb25SZWplY3RUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkNvbmZpcm1hdGlvblJlamVjdFRpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuQ29uZmlybWF0aW9uQ29uZmlnTWFwRm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Db25maXJtYXRpb25Db25maWdNYXBGbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc1J1bk5vdGlmaWNhdGlvblN1Y2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc1J1bk5vdGlmaWNhdGlvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uRXJyb3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFmdGVyUnVuQWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWZ0ZXJSdW5BY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvblJ1bkVycm9yQWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25SdW5FcnJvckFjdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERhdGFQcm92aWRlcihkYXRhUHJvdmlkZXI6IElEYXRhUHJvdmlkZXI8VCwgYW55Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2VydmljZVR5cGU8Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tb2RlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2V0IGRhdGEgcHJvdmlkZXIgaWYgbm8gbW9kZWwgdHlwZSBpcyBwcm92aWRlZCBmb3IgYWN0aW9uICR7dGhpcy5fYWN0aW9uTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBuZXcgRGF0YVByb3ZpZGVyKHRoaXMuX21vZGVsLnR5cGUsIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSdW5GdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dDxULCBTPikgPT4gT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkIHwgbnVsbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcnVuRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJc1Zpc2libGVGdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248VCwgUz4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNWaXNpYmxlRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJc0VuYWJsZWRGdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248VCwgUz4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNFbmFibGVkRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSb3V0ZVRyaWdnZXIocm91dGVVcmw6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9hY3RpdmF0aW9uVHJpZ2dlciA9IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlO1xuICAgICAgICB0aGlzLl9yb3V0ZVVybCA9IHJvdXRlVXJsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aExldmVsKGxldmVsOiBBY3Rpb25MZXZlbEVudW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgdGl0bGUga2V5IHdpdGggbW9kZWwgYWN0aW9uIGtleSAoJHttb2RlbC50eXBlTmFtZX0uYWN0aW9ucy4ke2FjdGlvbk5hbWV9KS4gTm90IHJlbGV2YW50IGlmIHBhcmVudFR5cGUgbmFtZSBpcyBwcm92aWRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aE1vZGVsVGl0bGUoKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gYCR7dGhpcy5faTE4bk1vZGVsQWN0aW9uQmFzZUtleX0udGl0bGVgO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCB0aXRsZSBrZXkgKCR7YWN0aW9uTmFtZX0udGl0bGUpLiBJZiBudWxsLCBubyB0aXRsZSB3aWxsIGJlIHNob3duLlxuICAgICAqIEBwYXJhbSB0aXRsZSBUaXRsZSBpMThuIGtleSBvciB0aXRsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFRpdGxlKHRpdGxlOiBzdHJpbmcgfCBudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSWNvbihpY29uOiBzdHJpbmcgfCBudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ljb24gPSBpY29uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRvb2x0aXAodG9vbHRpcDogc3RyaW5nIHwgbnVsbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl90aXRsZSA9IHRvb2x0aXA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTaXplKHNpemU6IEFjdGlvblNpemVFbnVtID0gQWN0aW9uU2l6ZUVudW0uTm9ybWFsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFN0eWxlKHN0eWxlVGV4dCA9IGZhbHNlLCBzdHlsZU91dGxpbmVkID0gZmFsc2UsIHN0eWxlUmFpc2VkID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNTdHlsZVRleHQgPSBzdHlsZVRleHQ7XG4gICAgICAgIHRoaXMuX2lzU3R5bGVPdXRsaW5lZCA9IHN0eWxlT3V0bGluZWQ7XG4gICAgICAgIHRoaXMuX2lzU3R5bGVSYWlzZWQgPSBzdHlsZVJhaXNlZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhQb3NpdGlvbihwb3NpdGlvbjogQWN0aW9uUG9zaXRpb25FbnVtKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNvbmZpcm1hdGlvbiBkaWFsb2d1ZSB0byB0aGUgYWN0aW9uXG4gICAgICogQHBhcmFtIGljb24gdGhlIGljb24gdG8gZGlzcGxheSBvbiB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ3VlXG4gICAgICogQHBhcmFtIHRpdGxlIHRoZSB0aXRsZSBvZiB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ3VlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb24gdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2d1ZVxuICAgICAqIEBwYXJhbSBhY2NlcHRUaXRsZSB0aGUgdGl0bGUgb2YgdGhlIGFjY2VwdGluZyBidXR0b25cbiAgICAgKiBAcGFyYW0gcmVqZWN0VGl0bGUgdGhlIHRpdGxlIG9mIHRoZSByZWplY3RpbmcgYnV0dG9uXG4gICAgICogQHBhcmFtIHJ1bkNvbmZpcm1hdGlvbkNvbmZpZ01hcEZuIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2d1ZS4gKipXQVJOSU5HKiogY2hhbmdpbmcgdGhlICphY2NlcHQqIGFuZCAqcmVqZWN0KiBtZXRob2RzIG9mIHRoZSAqY29uZmlybUNvbmZpZyogcGFyYW1ldGVyXG4gICAgICogbWF5IGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvdXJcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aFJ1bkNvbmZpcm1hdGlvbihcbiAgICAgICAgaWNvbiA9ICdwaSBwaS1leGNsYW1hdGlvbi10cmlhbmdsZScsXG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxuICAgICAgICBtZXNzYWdlPzogc3RyaW5nLFxuICAgICAgICBhY2NlcHRUaXRsZT86IHN0cmluZyxcbiAgICAgICAgcmVqZWN0VGl0bGU/OiBzdHJpbmcsXG4gICAgICAgIHJ1bkNvbmZpcm1hdGlvbkNvbmZpZ01hcEZuPzogKGN0eDogQWN0aW9uQ29udGV4dDxULCBhbnk+LCBjb25maXJtQ29uZmlnOiBDb25maXJtYXRpb24pID0+IENvbmZpcm1hdGlvblxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNSdW5Db25maXJtYXRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25JY29uID0gaWNvbjtcbiAgICAgICAgdGhpcy5fcnVuQ29uZmlybWF0aW9uVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fcnVuQ29uZmlybWF0aW9uTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvbkFjY2VwdFRpdGxlID0gYWNjZXB0VGl0bGU7XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvblJlamVjdFRpdGxlID0gcmVqZWN0VGl0bGU7XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvbkNvbmZpZ01hcEZuID0gcnVuQ29uZmlybWF0aW9uQ29uZmlnTWFwRm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUnVuTm90aWZpY2F0aW9uU3VjY2Vzcyh0aXRsZT86IHN0cmluZywgbWVzc2FnZT86IHN0cmluZywgaGFzTm90aWZpY2F0aW9uID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzID0gaGFzTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJ1bk5vdGlmaWNhdGlvbkVycm9yKHRpdGxlPzogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nLCBoYXNOb3RpZmljYXRpb24gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yID0gaGFzTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLl9ydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWZ0ZXJSdW5BY3Rpb248UlQ+KGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxSVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYWZ0ZXJSdW5BY3Rpb24gPSBhY3Rpb24gYXMgQWN0aW9uRGVzY3JpcHRvcjx1bmtub3duPjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhPblJ1bkVycm9yQWN0aW9uPFJUPihhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3I8UlQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX29uUnVuRXJyb3JBY3Rpb24gPSBhY3Rpb24gYXMgQWN0aW9uRGVzY3JpcHRvcjx1bmtub3duPjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uU2ltcGxlRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIGNvbnN0cnVjdG9yKGFjdGlvbk5hbWU6IHN0cmluZywgbW9kZWxUeXBlPzogQ2xhc3NUeXBlPFQ+LCBpZFByb3BlcnR5Pzogc3RyaW5nLCB0aXRsZVByb3BlcnR5Pzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9kZWxUeXBlID8gbmV3IE1vZGVsRGVzY3JpcHRvcjxUPihtb2RlbFR5cGUsIGlkUHJvcGVydHksIHRpdGxlUHJvcGVydHkpIDogbnVsbDtcbiAgICAgICAgc3VwZXIobW9kZWwsIGFjdGlvbk5hbWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25EZXNjcmlwdG9yPFQ+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+O1xuXG4gICAgcHJvdGVjdGVkIF9lZGl0b3JBY3Rpb25zOiBBY3Rpb25EZXNjcmlwdG9yPFQ+W10gPSBbXTtcbiAgICBwcm90ZWN0ZWQgX2VkaXRvclRpdGxlPzogc3RyaW5nIHwgbnVsbCA9IHVuZGVmaW5lZDtcblxuICAgIHByb3RlY3RlZCBfaGFzRmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX2RpYWxvZ1NpemU6IEFjdGlvbkVkaXRvckRpYWxvZ1NpemVFbnVtID0gQWN0aW9uRWRpdG9yRGlhbG9nU2l6ZUVudW0uTm9ybWFsO1xuICAgIHByb3RlY3RlZCBfZGlhbG9nQ2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIF9kYXRhUHJvdmlkZXI/OiBJRWRpdG9yRGF0YVByb3ZpZGVyPFQsIGFueT47XG4gICAgcHJvdGVjdGVkIF9mZXRjaEZ1bmN0aW9uPzogKGN0eDogQWN0aW9uQ29udGV4dDxULCBhbnk+KSA9PiBPYnNlcnZhYmxlPFQ+O1xuICAgIHByb3RlY3RlZCBfc3VibWl0RnVuY3Rpb24/OiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIGFueT4pID0+IE9ic2VydmFibGU8VD47XG5cbiAgICBwcm90ZWN0ZWQgX2VkaXRvckNvbXBvbmVudD86IFR5cGU8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD4sIGFjdGlvbk5hbWU6IHN0cmluZywgcGFyZW50VHlwZT86IENsYXNzVHlwZTxhbnk+LCBwYXJlbnRQcm9wZXJ0eT86IHN0cmluZykge1xuICAgICAgICBzdXBlcihlZGl0b3JEZXNjcmlwdG9yLm1vZGVsLCBhY3Rpb25OYW1lLCBwYXJlbnRUeXBlLCBwYXJlbnRQcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX3R5cGUgPSBBY3Rpb25UeXBlRW51bS5FZGl0b3I7XG4gICAgICAgIHRoaXMuX2VkaXRvckRlc2NyaXB0b3IgPSBlZGl0b3JEZXNjcmlwdG9yO1xuICAgICAgICB0aGlzLl9lZGl0b3JBY3Rpb25zLnB1c2gobmV3IEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3IodGhpcyksIG5ldyBBY3Rpb25FZGl0b3JTdWJtaXREZXNjcmlwdG9yKHRoaXMsIEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLkNhbmNlbCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckRlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlhbG9nU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpYWxvZ1NpemU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkaWFsb2dDbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaWFsb2dDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNGZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNGZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBkYXRhUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBydW5GdW5jdGlvbigpOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIHVua25vd24+KSA9PiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW4gZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgaW4gZWRpdG9yIGFjdGlvbi4gVXNlIHN1Ym1pdCBmdW5jdGlvbiBpbnN0ZWFkIScpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmV0Y2hGdW5jdGlvbigpOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIHVua25vd24+KSA9PiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9mZXRjaEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gY3R4ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBGZXRjaCBmdW5jdGlvbiBpcyBub3QgcHJvdmlkZWQgZm9yIGZ1bmN0aW9uICR7dGhpcy5fYWN0aW9uTmFtZUxvbmd9LCB1c2luZyBkZWZhdWx0IGFuZCByZXR1cm5pbmcgY29udGV4dCBpdGVtYCwgY3R4LnBhcmFtZXRlcnM/Lml0ZW0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihjdHgucGFyYW1ldGVycz8uaXRlbSA/IGN0eC5wYXJhbWV0ZXJzLml0ZW0gOiAoe30gYXMgVCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1Ym1pdEZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VibWl0RnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JBY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yQWN0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvckNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEVkaXRvclRpdGxlKHRpdGxlOiBzdHJpbmcgfCBudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2VkaXRvclRpdGxlID0gdGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSUVkaXRvckRhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgZGF0YSBwcm92aWRlciBpZiBubyBtb2RlbCB0eXBlIGlzIHByb3ZpZGVkIGZvciBhY3Rpb24gJHt0aGlzLl9hY3Rpb25OYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IG5ldyBFZGl0b3JEYXRhUHJvdmlkZXIodGhpcy5fbW9kZWwudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aERpYWxvZ1NpemUoc2l6ZSA9IEFjdGlvbkVkaXRvckRpYWxvZ1NpemVFbnVtLk5vcm1hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaWFsb2dTaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaWFsb2dDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGlhbG9nQ2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFJ1bkZ1bmN0aW9uPFM+KGZuOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTdWJtaXRGdW5jdGlvbihmbiBhcyAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KSA9PiBPYnNlcnZhYmxlPFQ+KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZldGNoRnVuY3Rpb248Uz4oZm46IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmV0Y2hGdW5jdGlvbiA9IGZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFN1Ym1pdEZ1bmN0aW9uPFM+KGZuOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3N1Ym1pdEZ1bmN0aW9uID0gZm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmV0Y2hOb3RpZmljYXRpb25FcnJvcih0aXRsZT86IHN0cmluZywgbWVzc2FnZT86IHN0cmluZywgaGFzTm90aWZpY2F0aW9uID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNGZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3MgPSBoYXNOb3RpZmljYXRpb247XG4gICAgICAgIHRoaXMuX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEVkaXRvckFjdGlvbihhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3I8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRWRpdG9yQWN0aW9ucyhhY3Rpb25zOiBBY3Rpb25EZXNjcmlwdG9yPFQ+W10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yQWN0aW9ucyA9IGFjdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRWRpdG9yQ29tcG9uZW50KGVkaXRvckNvbXBvbmVudDogVHlwZTxhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2VkaXRvckNvbXBvbmVudCA9IGVkaXRvckNvbXBvbmVudDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VkaXRvckFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdWJtaXRUeXBlOiBBY3Rpb25FZGl0b3JTdWJtaXRUeXBlRW51bTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPiwgc3VibWl0VHlwZSA9IEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLlN1Ym1pdCkge1xuICAgICAgICBzdXBlcihlZGl0b3JBY3Rpb24ubW9kZWwsIHN1Ym1pdFR5cGUgPT09IEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLlN1Ym1pdCA/ICdzdWJtaXQnIDogJ2NhbmNlbCcpO1xuICAgICAgICB0aGlzLl9lZGl0b3JBY3Rpb24gPSBlZGl0b3JBY3Rpb247XG4gICAgICAgIHRoaXMuX3N1Ym1pdFR5cGUgPSBzdWJtaXRUeXBlO1xuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IEFjdGlvblBvc2l0aW9uRW51bS5Gb290ZXJSaWdodDtcbiAgICAgICAgdGhpcy5faXNTdHlsZVRleHQgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3VibWl0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1Ym1pdFR5cGU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yRGV0YWlsc0Rlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2RldGFpbHMnO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yRGVzY3JpcHRvcjogRWRpdG9yRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3JEZXNjcmlwdG9yLCBBY3Rpb25FZGl0b3JEZXRhaWxzRGVzY3JpcHRvci5BQ1RJT05fTkFNRSk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dDbGljayk7XG4gICAgICAgIHRoaXMud2l0aFJvdXRlVHJpZ2dlcignOml0ZW1JZCcpO1xuICAgICAgICB0aGlzLndpdGhGZXRjaEZ1bmN0aW9uKEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuRmV0Y2hPckZhaWwpO1xuICAgICAgICB0aGlzLndpdGhFZGl0b3JBY3Rpb25zKFtuZXcgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvcih0aGlzLCBBY3Rpb25FZGl0b3JTdWJtaXRUeXBlRW51bS5DYW5jZWwpXSk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU2VydmljZUZldGNoRnVuY3Rpb24oc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2VydmljZUZldGNoRnVuY3Rpb248Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4sIGZldGNoRm4/OiAoaWQ6IElkVHlwZSwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IEVkaXRvckRhdGFQcm92aWRlcih0aGlzLl9tb2RlbCEudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICBpZiAoZmV0Y2hGbikge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhGZXRjaChmZXRjaEZuKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVkaXRvckFkZERlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2FkZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvckRlc2NyaXB0b3IsIEFjdGlvbkVkaXRvckFkZERlc2NyaXB0b3IuQUNUSU9OX05BTUUpO1xuICAgICAgICB0aGlzLndpdGhQb3NpdGlvbihBY3Rpb25Qb3NpdGlvbkVudW0uVG9vbGJhckxlZnQpO1xuICAgICAgICB0aGlzLndpdGhSb3V0ZVRyaWdnZXIoJ2FkZCcpO1xuICAgICAgICB0aGlzLndpdGhTdWJtaXRGdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkNyZWF0ZU9yRmFpbCk7XG4gICAgICAgIHRoaXMud2l0aExldmVsKEFjdGlvbkxldmVsRW51bS5TdWNjZXNzKTtcbiAgICAgICAgdGhpcy53aXRoSWNvbigncGkgcGktcGx1cycpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoU2VydmljZVR5cGU8Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNlcnZpY2VTdWJtaXRGdW5jdGlvbihzZXJ2aWNlVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXJ2aWNlU3VibWl0RnVuY3Rpb248Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4sIGNyZWF0ZUZuPzogKGl0ZW0/OiBULCBzZXJ2aWNlPzogUykgPT4gT2JzZXJ2YWJsZTxUPiwgZmV0Y2hGbj86IChpZDogSWRUeXBlLCBzZXJ2aWNlPzogUykgPT4gT2JzZXJ2YWJsZTxUPik6IHRoaXMge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgRWRpdG9yRGF0YVByb3ZpZGVyKHRoaXMuX21vZGVsIS50eXBlLCBzZXJ2aWNlVHlwZSk7XG4gICAgICAgIGlmIChjcmVhdGVGbikge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhDcmVhdGUoY3JlYXRlRm4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmZXRjaEZuKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aEZldGNoKGZldGNoRm4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yRWRpdERlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2VkaXQnO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yRGVzY3JpcHRvcjogRWRpdG9yRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3JEZXNjcmlwdG9yLCBBY3Rpb25FZGl0b3JFZGl0RGVzY3JpcHRvci5BQ1RJT05fTkFNRSk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dJbmxpbmUpO1xuICAgICAgICB0aGlzLndpdGhUaXRsZShudWxsKTtcbiAgICAgICAgdGhpcy53aXRoUm91dGVUcmlnZ2VyKCc6aXRlbUlkL2VkaXQnKTtcbiAgICAgICAgdGhpcy53aXRoRmV0Y2hGdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1bkZldGNoT3JGYWlsKTtcbiAgICAgICAgdGhpcy53aXRoU3VibWl0RnVuY3Rpb24oQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5VcGRhdGVPckZhaWwpO1xuICAgICAgICB0aGlzLndpdGhJY29uKCdwaSBwaS1wZW5jaWwnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFNlcnZpY2VUeXBlPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZXJ2aWNlU3VibWl0RnVuY3Rpb24oc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2VydmljZVN1Ym1pdEZ1bmN0aW9uPFM+KFxuICAgICAgICBzZXJ2aWNlVHlwZTogVHlwZTxTPixcbiAgICAgICAgdXBkYXRlRm4/OiAoaWQ6IElkVHlwZSwgaXRlbT86IFQsIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPFQ+LFxuICAgICAgICBmZXRjaEZuPzogKGlkOiBJZFR5cGUsIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPFQ+XG4gICAgKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBFZGl0b3JEYXRhUHJvdmlkZXIodGhpcy5fbW9kZWwhLnR5cGUsIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgaWYgKHVwZGF0ZUZuKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aFVwZGF0ZSh1cGRhdGVGbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZldGNoRm4pIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoRmV0Y2goZmV0Y2hGbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25EZWxldGVEZXNjcmlwdG9yPFQ+IGV4dGVuZHMgQWN0aW9uRGVzY3JpcHRvcjxUPiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBBQ1RJT05fTkFNRSA9ICdkZWxldGUnO1xuXG4gICAgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihtb2RlbCwgQWN0aW9uRGVsZXRlRGVzY3JpcHRvci5BQ1RJT05fTkFNRSk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dJbmxpbmUpO1xuICAgICAgICB0aGlzLndpdGhUaXRsZShudWxsKTtcbiAgICAgICAgdGhpcy53aXRoUnVuRnVuY3Rpb24oQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5EZWxldGVPckZhaWwpO1xuICAgICAgICB0aGlzLndpdGhMZXZlbChBY3Rpb25MZXZlbEVudW0uRGFuZ2VyKTtcbiAgICAgICAgdGhpcy53aXRoSWNvbigncGkgcGktdHJhc2gnKTtcbiAgICAgICAgdGhpcy53aXRoUnVuQ29uZmlybWF0aW9uKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoU2VydmljZURlbGV0ZUZ1bmN0aW9uKHNlcnZpY2VUeXBlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFNlcnZpY2VEZWxldGVGdW5jdGlvbjxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPiwgZGVsZXRlRm4/OiAoaWQ6IElkVHlwZSwgaXRlbT86IFQsIHNlcnZpY2U/OiBTKSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGRhdGFQcm92aWRlciA9IG5ldyBFZGl0b3JEYXRhUHJvdmlkZXIodGhpcy5fbW9kZWwhLnR5cGUsIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgaWYgKGRlbGV0ZUZuKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aERlbGV0ZShkZWxldGVGbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25MaW5rRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIHByaXZhdGUgX3VybCA9ICcnO1xuICAgIHByaXZhdGUgX3BhdGhTZWdtZW50czogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtcz86IFBhcmFtcztcbiAgICBwcml2YXRlIF9xdWVyeVBhcmFtc0hhbmRsaW5nPzogUXVlcnlQYXJhbXNIYW5kbGluZztcbiAgICBwcml2YXRlIF9yZXBsYWNlVXJsID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfdGFyZ2V0ID0gJ19zZWxmJztcbiAgICBwcml2YXRlIF9pc1N0eWxlTGluayA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IobW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPiB8IG51bGwgPSBudWxsLCBhY3Rpb25OYW1lID0gJ2xpbmsnKSB7XG4gICAgICAgIHN1cGVyKG1vZGVsLCBhY3Rpb25OYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGF0aFNlZ21lbnRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhdGhTZWdtZW50cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHF1ZXJ5UGFyYW1zKCk6IFBhcmFtcyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWVyeVBhcmFtcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHF1ZXJ5UGFyYW1zSGFuZGxpbmcoKTogUXVlcnlQYXJhbXNIYW5kbGluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWVyeVBhcmFtc0hhbmRsaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVwbGFjZVVybCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcGxhY2VVcmw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YXJnZXQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzU3R5bGVMaW5rKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNTdHlsZUxpbms7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhIcmVmKHVybDogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSb3V0ZXJMaW5rKC4uLnBhdGhTZWdtZW50czogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcGF0aFNlZ21lbnRzID0gcGF0aFNlZ21lbnRzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zOiBQYXJhbXMsIHF1ZXJ5UGFyYW1zSGFuZGxpbmc/OiBRdWVyeVBhcmFtc0hhbmRsaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7XG4gICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1zSGFuZGxpbmcgPSBxdWVyeVBhcmFtc0hhbmRsaW5nO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJlcGxhY2VVcmwocmVwbGFjZVVybCA9IGZhbHNlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3JlcGxhY2VVcmwgPSByZXBsYWNlVXJsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRhcmdldCh0YXJnZXQ6ICdfc2VsZicgfCAnX2JsYW5rJyA9ICdfc2VsZicpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFN0eWxlTGluayhpc1N0eWxlTGluazogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9pc1N0eWxlTGluayA9IGlzU3R5bGVMaW5rO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iXX0=