@mediusinc/mng-commons 0.10.3-rc.2 → 0.11.0

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