@mediusinc/mng-commons 0.2.1-rc → 0.2.4

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 (327) hide show
  1. package/esm2020/lib/api/models/builders/query-param.builder.mjs +48 -0
  2. package/esm2020/lib/api/models/filter-match-type.model.mjs +26 -0
  3. package/esm2020/lib/api/models/filter-param.model.mjs +46 -0
  4. package/esm2020/lib/api/models/index.mjs +9 -0
  5. package/esm2020/lib/api/models/mappers.mjs +17 -0
  6. package/esm2020/lib/api/models/query-mode.model.mjs +19 -0
  7. package/esm2020/lib/api/models/query-param.model.mjs +69 -0
  8. package/esm2020/lib/api/models/query-result.model.mjs +45 -0
  9. package/esm2020/lib/api/models/serialization.model.mjs +2 -0
  10. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +72 -0
  11. package/esm2020/lib/api/services/index.mjs +2 -0
  12. package/esm2020/lib/api/utils/index.mjs +3 -0
  13. package/esm2020/lib/api/utils/medius-rest.util.mjs +122 -0
  14. package/esm2020/lib/api/utils/object-serializer.util.mjs +226 -0
  15. package/esm2020/lib/components/action/action.component.mjs +65 -0
  16. package/esm2020/lib/components/action/dialog/action-dialog.component.mjs +148 -0
  17. package/esm2020/lib/components/action/index.mjs +4 -0
  18. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +2 -0
  19. package/esm2020/lib/components/action/models/action-execution.model.mjs +58 -0
  20. package/esm2020/lib/components/action/models/index.mjs +3 -0
  21. package/esm2020/lib/components/action/route/action-route.component.mjs +144 -0
  22. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +114 -0
  23. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +113 -0
  24. package/esm2020/lib/components/form/editor/form-editor.component.mjs +141 -0
  25. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +19 -0
  26. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +19 -0
  27. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +16 -0
  28. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +26 -0
  29. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +109 -0
  30. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +122 -0
  31. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +17 -0
  32. package/esm2020/lib/components/form/formly/fields/index.mjs +8 -0
  33. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +17 -0
  34. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +16 -0
  35. package/esm2020/lib/components/form/formly/wrappers/index.mjs +3 -0
  36. package/esm2020/lib/components/form/index.mjs +4 -0
  37. package/esm2020/lib/components/form/models/form-editor.event.mjs +7 -0
  38. package/esm2020/lib/components/form/models/index.mjs +2 -0
  39. package/esm2020/lib/components/layout/breadcrumb.component.mjs +17 -0
  40. package/esm2020/lib/components/layout/footer.component.mjs +17 -0
  41. package/esm2020/lib/components/layout/index.mjs +7 -0
  42. package/esm2020/lib/components/layout/main-layout.component.mjs +54 -0
  43. package/esm2020/lib/components/layout/menu-item.component.mjs +173 -0
  44. package/esm2020/lib/components/layout/menu.component.mjs +20 -0
  45. package/esm2020/lib/components/layout/services/index.mjs +2 -0
  46. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +190 -0
  47. package/esm2020/lib/components/layout/topbar.component.mjs +59 -0
  48. package/esm2020/lib/components/tableview/index.mjs +6 -0
  49. package/esm2020/lib/components/tableview/models/index.mjs +2 -0
  50. package/esm2020/lib/components/tableview/models/table.event.mjs +16 -0
  51. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +24 -0
  52. package/esm2020/lib/components/tableview/services/index.mjs +2 -0
  53. package/esm2020/lib/components/tableview/services/tableview.component.service.mjs +17 -0
  54. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +74 -0
  55. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +25 -0
  56. package/esm2020/lib/components/tableview/table/table.component.mjs +307 -0
  57. package/esm2020/lib/components/tableview/tableview.component.mjs +82 -0
  58. package/esm2020/lib/config/formly.config.mjs +136 -0
  59. package/esm2020/lib/config/index.mjs +2 -0
  60. package/esm2020/lib/config/models/index.mjs +2 -0
  61. package/esm2020/lib/config/models/mng-config.model.mjs +2 -0
  62. package/esm2020/lib/data-providers/base.data-provider.mjs +24 -0
  63. package/esm2020/lib/data-providers/editor.data-provider.mjs +37 -0
  64. package/esm2020/lib/data-providers/index.mjs +6 -0
  65. package/esm2020/lib/data-providers/lookup.data-provider.mjs +16 -0
  66. package/esm2020/lib/data-providers/table.data-provider.mjs +2 -0
  67. package/esm2020/lib/data-providers/tableview.data-provider.mjs +17 -0
  68. package/esm2020/lib/descriptors/action.descriptor.mjs +332 -0
  69. package/esm2020/lib/descriptors/editor.descriptor.mjs +670 -0
  70. package/esm2020/lib/descriptors/field.validator.mjs +21 -0
  71. package/esm2020/lib/descriptors/index.mjs +8 -0
  72. package/esm2020/lib/descriptors/lookup.descriptor.mjs +2 -0
  73. package/esm2020/lib/descriptors/model.descriptor.mjs +34 -0
  74. package/esm2020/lib/descriptors/table.descriptor.mjs +401 -0
  75. package/esm2020/lib/descriptors/tableview.descriptor.mjs +131 -0
  76. package/esm2020/lib/directives/component.directive.mjs +23 -0
  77. package/esm2020/lib/directives/index.mjs +3 -0
  78. package/esm2020/lib/directives/template.directive.mjs +29 -0
  79. package/esm2020/lib/mng-commons.module.mjs +410 -0
  80. package/esm2020/lib/models/index.mjs +3 -0
  81. package/esm2020/lib/models/router.model.mjs +2 -0
  82. package/esm2020/lib/models/user.model.mjs +2 -0
  83. package/esm2020/lib/pipes/boolean.pipe.mjs +22 -0
  84. package/esm2020/lib/pipes/index.mjs +3 -0
  85. package/esm2020/lib/pipes/property-path.pipe.mjs +36 -0
  86. package/esm2020/lib/services/action.service.mjs +269 -0
  87. package/esm2020/lib/services/commons.service.mjs +354 -0
  88. package/esm2020/lib/services/configuration.service.mjs +78 -0
  89. package/esm2020/lib/services/index.mjs +5 -0
  90. package/esm2020/lib/services/navigation.service.mjs +48 -0
  91. package/esm2020/lib/services/providers/commons-init.provider.mjs +4 -0
  92. package/esm2020/lib/services/providers/config-service.provider.mjs +20 -0
  93. package/esm2020/lib/services/providers/formly-config.provider.mjs +31 -0
  94. package/esm2020/lib/services/providers/index.mjs +4 -0
  95. package/esm2020/lib/services/tokens/browser-storage.token.mjs +6 -0
  96. package/esm2020/lib/services/tokens/index.mjs +3 -0
  97. package/esm2020/lib/services/tokens/module-config.token.mjs +3 -0
  98. package/esm2020/lib/types/index.mjs +3 -0
  99. package/esm2020/lib/types/type.decorator.mjs +7 -0
  100. package/esm2020/lib/types/type.model.mjs +2 -0
  101. package/esm2020/lib/utils/editor-formly.util.mjs +176 -0
  102. package/esm2020/lib/utils/i18n.util.mjs +125 -0
  103. package/esm2020/lib/utils/index.mjs +6 -0
  104. package/esm2020/lib/utils/model.util.mjs +57 -0
  105. package/esm2020/lib/utils/toast.util.mjs +39 -0
  106. package/esm2020/lib/utils/type.util.mjs +39 -0
  107. package/esm2020/mediusinc-mng-commons.mjs +5 -0
  108. package/esm2020/public-api.mjs +36 -0
  109. package/fesm2015/mediusinc-mng-commons.mjs +6252 -0
  110. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -0
  111. package/fesm2020/mediusinc-mng-commons.mjs +6177 -0
  112. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -0
  113. package/lib/api/models/builders/query-param.builder.d.ts +11 -0
  114. package/{src/lib/api/models/query-mode.model.ts → lib/api/models/filter-match-type.model.d.ts} +11 -6
  115. package/lib/api/models/filter-param.model.d.ts +23 -0
  116. package/{src/lib/api/models/index.ts → lib/api/models/index.d.ts} +0 -2
  117. package/lib/api/models/mappers.d.ts +6 -0
  118. package/lib/api/models/query-mode.model.d.ts +16 -0
  119. package/lib/api/models/query-param.model.d.ts +31 -0
  120. package/lib/api/models/query-result.model.d.ts +36 -0
  121. package/{src/lib/api/models/serialization.model.ts → lib/api/models/serialization.model.d.ts} +0 -1
  122. package/lib/api/services/crud-api.abstract.service.d.ts +23 -0
  123. package/{src/lib/api/services/index.ts → lib/api/services/index.d.ts} +0 -0
  124. package/{src/lib/api/utils/index.ts → lib/api/utils/index.d.ts} +0 -0
  125. package/lib/api/utils/medius-rest.util.d.ts +12 -0
  126. package/lib/api/utils/object-serializer.util.d.ts +30 -0
  127. package/lib/components/action/action.component.d.ts +36 -0
  128. package/lib/components/action/dialog/action-dialog.component.d.ts +46 -0
  129. package/{src/lib/components/action/index.ts → lib/components/action/index.d.ts} +0 -0
  130. package/{src/lib/components/action/models/action-confirmation-service.model.ts → lib/components/action/models/action-confirmation-service.model.d.ts} +2 -3
  131. package/lib/components/action/models/action-execution.model.d.ts +53 -0
  132. package/{src/lib/components/action/models/index.ts → lib/components/action/models/index.d.ts} +0 -0
  133. package/lib/components/action/route/action-route.component.d.ts +32 -0
  134. package/lib/components/form/autocomplete/autocomplete.component.d.ts +36 -0
  135. package/lib/components/form/dropdown/dropdown.component.d.ts +34 -0
  136. package/lib/components/form/editor/form-editor.component.d.ts +39 -0
  137. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +11 -0
  138. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +11 -0
  139. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +6 -0
  140. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +12 -0
  141. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +17 -0
  142. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +36 -0
  143. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -0
  144. package/{src/lib/components/form/formly/fields/index.ts → lib/components/form/formly/fields/index.d.ts} +0 -0
  145. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +8 -0
  146. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +8 -0
  147. package/{src/lib/components/form/formly/wrappers/index.ts → lib/components/form/formly/wrappers/index.d.ts} +0 -0
  148. package/{src/lib/components/form/index.ts → lib/components/form/index.d.ts} +0 -0
  149. package/lib/components/form/models/form-editor.event.d.ts +5 -0
  150. package/{src/lib/components/form/models/index.ts → lib/components/form/models/index.d.ts} +0 -0
  151. package/lib/components/layout/breadcrumb.component.d.ts +8 -0
  152. package/lib/components/layout/footer.component.d.ts +9 -0
  153. package/{src/lib/components/layout/index.ts → lib/components/layout/index.d.ts} +0 -0
  154. package/lib/components/layout/main-layout.component.d.ts +21 -0
  155. package/lib/components/layout/menu-item.component.d.ts +29 -0
  156. package/lib/components/layout/menu.component.d.ts +10 -0
  157. package/{src/lib/components/layout/services/index.ts → lib/components/layout/services/index.d.ts} +0 -0
  158. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -0
  159. package/lib/components/layout/topbar.component.d.ts +25 -0
  160. package/{src/lib/components/tableview/index.ts → lib/components/tableview/index.d.ts} +0 -0
  161. package/{src/lib/components/tableview/models/index.ts → lib/components/tableview/models/index.d.ts} +0 -0
  162. package/lib/components/tableview/models/table.event.d.ts +17 -0
  163. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +14 -0
  164. package/{src/lib/components/tableview/services/index.ts → lib/components/tableview/services/index.d.ts} +0 -0
  165. package/lib/components/tableview/services/tableview.component.service.d.ts +13 -0
  166. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +22 -0
  167. package/lib/components/tableview/table/column-value/column-value.component.d.ts +12 -0
  168. package/lib/components/tableview/table/table.component.d.ts +79 -0
  169. package/lib/components/tableview/tableview.component.d.ts +35 -0
  170. package/lib/config/formly.config.d.ts +14 -0
  171. package/{src/lib/config/index.ts → lib/config/index.d.ts} +0 -0
  172. package/{src/lib/config/models/index.ts → lib/config/models/index.d.ts} +0 -0
  173. package/{src/lib/config/models/mng-config.model.ts → lib/config/models/mng-config.model.d.ts} +8 -9
  174. package/lib/data-providers/base.data-provider.d.ts +17 -0
  175. package/lib/data-providers/editor.data-provider.d.ts +25 -0
  176. package/{src/lib/data-providers/index.ts → lib/data-providers/index.d.ts} +0 -0
  177. package/lib/data-providers/lookup.data-provider.d.ts +14 -0
  178. package/{src/lib/data-providers/table.data-provider.ts → lib/data-providers/table.data-provider.d.ts} +3 -5
  179. package/lib/data-providers/tableview.data-provider.d.ts +15 -0
  180. package/lib/descriptors/action.descriptor.d.ts +148 -0
  181. package/lib/descriptors/editor.descriptor.d.ts +255 -0
  182. package/lib/descriptors/field.validator.d.ts +18 -0
  183. package/{src/lib/descriptors/index.ts → lib/descriptors/index.d.ts} +0 -0
  184. package/{src/lib/descriptors/lookup.descriptor.ts → lib/descriptors/lookup.descriptor.d.ts} +6 -9
  185. package/lib/descriptors/model.descriptor.d.ts +15 -0
  186. package/lib/descriptors/table.descriptor.d.ts +164 -0
  187. package/lib/descriptors/tableview.descriptor.d.ts +39 -0
  188. package/lib/directives/component.directive.d.ts +11 -0
  189. package/{src/lib/directives/index.ts → lib/directives/index.d.ts} +0 -0
  190. package/lib/directives/template.directive.d.ts +13 -0
  191. package/lib/mng-commons.module.d.ts +79 -0
  192. package/{src/lib/models/index.ts → lib/models/index.d.ts} +0 -0
  193. package/lib/models/router.model.d.ts +14 -0
  194. package/{src/lib/models/user.model.ts → lib/models/user.model.d.ts} +2 -3
  195. package/lib/pipes/boolean.pipe.d.ts +7 -0
  196. package/{src/lib/pipes/index.ts → lib/pipes/index.d.ts} +0 -0
  197. package/lib/pipes/property-path.pipe.d.ts +7 -0
  198. package/lib/services/action.service.d.ts +92 -0
  199. package/lib/services/commons.service.d.ts +72 -0
  200. package/lib/services/configuration.service.d.ts +35 -0
  201. package/{src/lib/services/index.ts → lib/services/index.d.ts} +0 -0
  202. package/lib/services/navigation.service.d.ts +14 -0
  203. package/lib/services/providers/commons-init.provider.d.ts +2 -0
  204. package/lib/services/providers/config-service.provider.d.ts +5 -0
  205. package/lib/services/providers/formly-config.provider.d.ts +4 -0
  206. package/{src/lib/services/providers/index.ts → lib/services/providers/index.d.ts} +0 -0
  207. package/lib/services/tokens/browser-storage.token.d.ts +2 -0
  208. package/{src/lib/services/tokens/index.ts → lib/services/tokens/index.d.ts} +0 -0
  209. package/lib/services/tokens/module-config.token.d.ts +3 -0
  210. package/{src/lib/types/index.ts → lib/types/index.d.ts} +0 -0
  211. package/lib/types/type.decorator.d.ts +2 -0
  212. package/lib/types/type.model.d.ts +10 -0
  213. package/lib/utils/editor-formly.util.d.ts +9 -0
  214. package/lib/utils/i18n.util.d.ts +18 -0
  215. package/{src/lib/utils/index.ts → lib/utils/index.d.ts} +0 -0
  216. package/lib/utils/model.util.d.ts +7 -0
  217. package/lib/utils/toast.util.d.ts +13 -0
  218. package/lib/utils/type.util.d.ts +15 -0
  219. package/mediusinc-mng-commons.d.ts +5 -0
  220. package/package.json +27 -6
  221. package/{src/public-api.ts → public-api.d.ts} +0 -17
  222. package/.browserslistrc +0 -16
  223. package/karma.conf.js +0 -51
  224. package/ng-package.json +0 -14
  225. package/src/lib/api/models/builders/query-param.builder.ts +0 -54
  226. package/src/lib/api/models/filter-match-type.model.ts +0 -25
  227. package/src/lib/api/models/filter-param.model.ts +0 -59
  228. package/src/lib/api/models/mappers.ts +0 -18
  229. package/src/lib/api/models/query-param.model.ts +0 -99
  230. package/src/lib/api/models/query-result.model.ts +0 -77
  231. package/src/lib/api/services/crud-api.abstract.service.ts +0 -113
  232. package/src/lib/api/utils/medius-rest.util.ts +0 -146
  233. package/src/lib/api/utils/object-serializer.util.ts +0 -227
  234. package/src/lib/components/action/action.component.html +0 -30
  235. package/src/lib/components/action/action.component.ts +0 -77
  236. package/src/lib/components/action/dialog/action-dialog.component.html +0 -26
  237. package/src/lib/components/action/dialog/action-dialog.component.ts +0 -171
  238. package/src/lib/components/action/models/action-execution.model.ts +0 -81
  239. package/src/lib/components/action/route/action-route.component.html +0 -1
  240. package/src/lib/components/action/route/action-route.component.ts +0 -159
  241. package/src/lib/components/form/autocomplete/autocomplete.component.html +0 -16
  242. package/src/lib/components/form/autocomplete/autocomplete.component.ts +0 -113
  243. package/src/lib/components/form/dropdown/dropdown.component.html +0 -29
  244. package/src/lib/components/form/dropdown/dropdown.component.ts +0 -109
  245. package/src/lib/components/form/editor/form-editor.component.html +0 -5
  246. package/src/lib/components/form/editor/form-editor.component.ts +0 -149
  247. package/src/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.html +0 -7
  248. package/src/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.ts +0 -21
  249. package/src/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.html +0 -9
  250. package/src/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.ts +0 -22
  251. package/src/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.html +0 -8
  252. package/src/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.ts +0 -10
  253. package/src/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.html +0 -56
  254. package/src/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.ts +0 -22
  255. package/src/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.html +0 -13
  256. package/src/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.scss +0 -4
  257. package/src/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.ts +0 -114
  258. package/src/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.html +0 -37
  259. package/src/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.ts +0 -133
  260. package/src/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.html +0 -10
  261. package/src/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.ts +0 -10
  262. package/src/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.html +0 -7
  263. package/src/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.ts +0 -13
  264. package/src/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.html +0 -6
  265. package/src/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.ts +0 -13
  266. package/src/lib/components/form/models/form-editor.event.ts +0 -7
  267. package/src/lib/components/layout/breadcrumb.component.html +0 -5
  268. package/src/lib/components/layout/breadcrumb.component.ts +0 -12
  269. package/src/lib/components/layout/footer.component.html +0 -7
  270. package/src/lib/components/layout/footer.component.ts +0 -15
  271. package/src/lib/components/layout/main-layout.component.html +0 -26
  272. package/src/lib/components/layout/main-layout.component.ts +0 -54
  273. package/src/lib/components/layout/menu-item.component.html +0 -41
  274. package/src/lib/components/layout/menu-item.component.ts +0 -170
  275. package/src/lib/components/layout/menu.component.html +0 -27
  276. package/src/lib/components/layout/menu.component.ts +0 -17
  277. package/src/lib/components/layout/services/main-layout.component.service.ts +0 -231
  278. package/src/lib/components/layout/topbar.component.html +0 -38
  279. package/src/lib/components/layout/topbar.component.ts +0 -62
  280. package/src/lib/components/tableview/models/table.event.ts +0 -22
  281. package/src/lib/components/tableview/route/tableview-route.abstract.component.ts +0 -31
  282. package/src/lib/components/tableview/services/tableview.component.service.ts +0 -22
  283. package/src/lib/components/tableview/table/column-filter/column-filter.component.html +0 -36
  284. package/src/lib/components/tableview/table/column-filter/column-filter.component.ts +0 -70
  285. package/src/lib/components/tableview/table/column-value/column-value.component.html +0 -14
  286. package/src/lib/components/tableview/table/column-value/column-value.component.ts +0 -19
  287. package/src/lib/components/tableview/table/table.component.html +0 -110
  288. package/src/lib/components/tableview/table/table.component.ts +0 -327
  289. package/src/lib/components/tableview/tableview.component.html +0 -37
  290. package/src/lib/components/tableview/tableview.component.ts +0 -78
  291. package/src/lib/config/formly.config.ts +0 -154
  292. package/src/lib/data-providers/base.data-provider.ts +0 -42
  293. package/src/lib/data-providers/editor.data-provider.ts +0 -60
  294. package/src/lib/data-providers/lookup.data-provider.ts +0 -29
  295. package/src/lib/data-providers/tableview.data-provider.ts +0 -29
  296. package/src/lib/descriptors/action.descriptor.ts +0 -439
  297. package/src/lib/descriptors/editor.descriptor.ts +0 -880
  298. package/src/lib/descriptors/field.validator.ts +0 -35
  299. package/src/lib/descriptors/model.descriptor.ts +0 -47
  300. package/src/lib/descriptors/table.descriptor.ts +0 -514
  301. package/src/lib/descriptors/tableview.descriptor.ts +0 -180
  302. package/src/lib/directives/component.directive.ts +0 -18
  303. package/src/lib/directives/template.directive.ts +0 -24
  304. package/src/lib/mng-commons.module.ts +0 -240
  305. package/src/lib/models/router.model.ts +0 -16
  306. package/src/lib/pipes/boolean.pipe.ts +0 -17
  307. package/src/lib/pipes/property-path.pipe.ts +0 -30
  308. package/src/lib/services/action.service.ts +0 -310
  309. package/src/lib/services/commons.service.ts +0 -407
  310. package/src/lib/services/configuration.service.ts +0 -98
  311. package/src/lib/services/navigation.service.ts +0 -42
  312. package/src/lib/services/providers/commons-init.provider.ts +0 -5
  313. package/src/lib/services/providers/config-service.provider.ts +0 -22
  314. package/src/lib/services/providers/formly-config.provider.ts +0 -39
  315. package/src/lib/services/tokens/browser-storage.token.ts +0 -9
  316. package/src/lib/services/tokens/module-config.token.ts +0 -5
  317. package/src/lib/types/type.decorator.ts +0 -7
  318. package/src/lib/types/type.model.ts +0 -12
  319. package/src/lib/utils/editor-formly.util.ts +0 -193
  320. package/src/lib/utils/i18n.util.ts +0 -148
  321. package/src/lib/utils/model.util.ts +0 -66
  322. package/src/lib/utils/toast.util.ts +0 -49
  323. package/src/lib/utils/type.util.ts +0 -44
  324. package/src/test.ts +0 -26
  325. package/tsconfig.lib.json +0 -15
  326. package/tsconfig.lib.prod.json +0 -10
  327. package/tsconfig.spec.json +0 -17
@@ -0,0 +1,332 @@
1
+ import { of, throwError } from 'rxjs';
2
+ import { TypeUtil } from '../utils';
3
+ export class ActionDescriptor {
4
+ constructor(model, actionName, parentType, parentProperty) {
5
+ this._type = ActionTypeEnum.Direct;
6
+ this._activationTrigger = ActionActivationTriggerEnum.OnClick;
7
+ this._position = ActionPositionEnum.ToolbarRight;
8
+ this._level = ActionLevelEnum.Default;
9
+ this._routeUrl = null;
10
+ this._className = '';
11
+ this._hasRunConfirmation = false;
12
+ this._hasRunNotificationSuccess = true;
13
+ this._hasRunNotificationError = true;
14
+ this._model = model;
15
+ this._actionName = actionName;
16
+ if ((parentType && !parentProperty) || (!parentProperty && parentProperty)) {
17
+ throw new Error(`Provide both the parent type and parent property or none: ${parentType}, ${parentProperty}.`);
18
+ }
19
+ this._parentType = parentType;
20
+ this._parentTypeName = parentType ? TypeUtil.findTypeName(parentType) : undefined;
21
+ this._parentProperty = parentProperty;
22
+ this._i18nModelActionBaseKey = this._parentTypeName
23
+ ? `${this._parentTypeName}.actions.${this._parentProperty}_${actionName}`
24
+ : `${this._model.typeName}.actions.${actionName}`;
25
+ }
26
+ get model() {
27
+ return this._model;
28
+ }
29
+ get parentTypeName() {
30
+ return this._parentTypeName;
31
+ }
32
+ get parentProperty() {
33
+ return this._parentProperty;
34
+ }
35
+ get i18nModelActionBaseKey() {
36
+ return this._i18nModelActionBaseKey;
37
+ }
38
+ get type() {
39
+ return this._type;
40
+ }
41
+ get activationTrigger() {
42
+ return this._activationTrigger;
43
+ }
44
+ get position() {
45
+ return this._position;
46
+ }
47
+ get level() {
48
+ return this._level;
49
+ }
50
+ get routeUrl() {
51
+ return this._routeUrl;
52
+ }
53
+ get title() {
54
+ return this._title;
55
+ }
56
+ get icon() {
57
+ return this._icon;
58
+ }
59
+ get tooltip() {
60
+ return this._tooltip;
61
+ }
62
+ get runFunction() {
63
+ if (!this._runFunction) {
64
+ throw new Error('Run function is not defined and cannot be invoked');
65
+ }
66
+ return this._runFunction;
67
+ }
68
+ get isVisibleFunction() {
69
+ return this._isVisibleFunction;
70
+ }
71
+ get isEnabledFunction() {
72
+ return this._isEnabledFunction;
73
+ }
74
+ get actionName() {
75
+ return this._actionName;
76
+ }
77
+ get className() {
78
+ return this._className;
79
+ }
80
+ get hasRunConfirmation() {
81
+ return this._hasRunConfirmation;
82
+ }
83
+ get runConfirmationIcon() {
84
+ return this._runConfirmationIcon;
85
+ }
86
+ get runConfirmationTitle() {
87
+ return this._runConfirmationTitle;
88
+ }
89
+ get runConfirmationMessage() {
90
+ return this._runConfirmationMessage;
91
+ }
92
+ get runConfirmationAcceptTitle() {
93
+ return this._runConfirmationAcceptTitle;
94
+ }
95
+ get runConfirmationRejectTitle() {
96
+ return this._runConfirmationRejectTitle;
97
+ }
98
+ get hasRunNotificationSuccess() {
99
+ return this._hasRunNotificationSuccess;
100
+ }
101
+ get runNotificationSuccessTitle() {
102
+ return this._runNotificationSuccessTitle;
103
+ }
104
+ get runNotificationSuccessMessage() {
105
+ return this._runNotificationSuccessMessage;
106
+ }
107
+ get hasRunNotificationError() {
108
+ return this._hasRunNotificationError;
109
+ }
110
+ get runNotificationErrorTitle() {
111
+ return this._runNotificationErrorTitle;
112
+ }
113
+ get runNotificationErrorMessage() {
114
+ return this._runNotificationErrorMessage;
115
+ }
116
+ withRunFunction(fn) {
117
+ this._runFunction = fn;
118
+ return this;
119
+ }
120
+ withIsVisibleFunction(fn) {
121
+ this._isVisibleFunction = fn;
122
+ return this;
123
+ }
124
+ withIsEnabledFunction(fn) {
125
+ this._isEnabledFunction = fn;
126
+ return this;
127
+ }
128
+ withRouteTrigger(routeUrl) {
129
+ this._activationTrigger = ActionActivationTriggerEnum.OnRoute;
130
+ this._routeUrl = routeUrl;
131
+ return this;
132
+ }
133
+ withLevel(level) {
134
+ this._level = level;
135
+ return this;
136
+ }
137
+ /**
138
+ * Overrides default title key with model action key (${model.typeName}.actions.${actionName}). Not relevant if parentType name is provided.
139
+ */
140
+ withModelTitle() {
141
+ this._title = `${this._i18nModelActionBaseKey}.title`;
142
+ return this;
143
+ }
144
+ /**
145
+ * Overrides default title key (${actionName}.title). If null, no title will be shown.
146
+ * @param title Title i18n key or title.
147
+ */
148
+ withTitle(title) {
149
+ this._title = title;
150
+ return this;
151
+ }
152
+ withIcon(icon) {
153
+ this._icon = icon;
154
+ return this;
155
+ }
156
+ withTooltip(tooltip) {
157
+ this._title = tooltip;
158
+ return this;
159
+ }
160
+ withClassName(className) {
161
+ this._className = className;
162
+ return this;
163
+ }
164
+ withPosition(position) {
165
+ this._position = position;
166
+ return this;
167
+ }
168
+ withRunConfirmation(icon = 'pi pi-exclamation-triangle', title, message, acceptTitle, rejectTitle) {
169
+ this._hasRunConfirmation = true;
170
+ this._runConfirmationIcon = icon;
171
+ this._runConfirmationTitle = title;
172
+ this._runConfirmationMessage = message;
173
+ this._runConfirmationAcceptTitle = acceptTitle;
174
+ this._runConfirmationRejectTitle = rejectTitle;
175
+ return this;
176
+ }
177
+ withRunNotificationSuccess(title, message, hasNotification = true) {
178
+ this._hasRunNotificationSuccess = hasNotification;
179
+ this._runNotificationSuccessTitle = title;
180
+ this._runNotificationSuccessMessage = message;
181
+ }
182
+ withRunNotificationError(title, message, hasNotification = true) {
183
+ this._hasRunNotificationError = hasNotification;
184
+ this._runNotificationErrorTitle = title;
185
+ this._runNotificationErrorMessage = message;
186
+ }
187
+ }
188
+ export class ActionEditorDescriptor extends ActionDescriptor {
189
+ constructor(editorDescriptor, actionName, parentType, parentProperty) {
190
+ super(editorDescriptor.model, actionName, parentType, parentProperty);
191
+ this._editorTitle = undefined;
192
+ this._hasFetchNotificationSuccess = false;
193
+ this._type = ActionTypeEnum.Editor;
194
+ this._editorDescriptor = editorDescriptor;
195
+ }
196
+ get editorTitle() {
197
+ return this._editorTitle;
198
+ }
199
+ get editorDescriptor() {
200
+ return this._editorDescriptor;
201
+ }
202
+ get hasFetchNotificationSuccess() {
203
+ return this._hasFetchNotificationSuccess;
204
+ }
205
+ get fetchNotificationSuccessTitle() {
206
+ return this._fetchNotificationSuccessTitle;
207
+ }
208
+ get fetchNotificationSuccessMessage() {
209
+ return this._fetchNotificationSuccessMessage;
210
+ }
211
+ get runFunction() {
212
+ throw new Error('Run function cannot be used in editor action. Use submit function instead!');
213
+ }
214
+ get fetchFunction() {
215
+ if (!this._fetchFunction) {
216
+ return (ctx) => {
217
+ console.warn(`Fetch function is not provided for function ${this._actionName}, using default and returning context item`, ctx.data?.item);
218
+ return of(ctx.data?.item ? ctx.data.item : {});
219
+ };
220
+ }
221
+ return this._fetchFunction;
222
+ }
223
+ get submitFunction() {
224
+ return this._submitFunction;
225
+ }
226
+ withEditorTitle(title) {
227
+ this._editorTitle = title;
228
+ return this;
229
+ }
230
+ withRunFunction(fn) {
231
+ return this.withSubmitFunction(fn);
232
+ }
233
+ withFetchFunction(fn) {
234
+ this._fetchFunction = fn;
235
+ return this;
236
+ }
237
+ withSubmitFunction(fn) {
238
+ this._submitFunction = fn;
239
+ return this;
240
+ }
241
+ withFetchNotificationError(title, message, hasNotification = true) {
242
+ this._hasFetchNotificationSuccess = hasNotification;
243
+ this._fetchNotificationSuccessTitle = title;
244
+ this._fetchNotificationSuccessMessage = message;
245
+ }
246
+ }
247
+ export class ActionEditorDetailsDescriptor extends ActionEditorDescriptor {
248
+ constructor(editorDescriptor) {
249
+ super(editorDescriptor, 'details');
250
+ this.withPosition(ActionPositionEnum.RowClick);
251
+ this.withRouteTrigger(':itemId');
252
+ this.withFetchFunction(ctx => ctx.dataProvider?.fetch && ctx.data?.itemId
253
+ ? ctx.dataProvider.fetch(ctx.data?.itemId, ctx.serviceInstance)
254
+ : throwError(new Error(`Data provider fetch function or item id ${ctx.data?.itemId} is missing.`)));
255
+ this.withClassName('mng-details-dynamic-dialog');
256
+ }
257
+ }
258
+ export class ActionEditorAddDescriptor extends ActionEditorDescriptor {
259
+ constructor(editorDescriptor) {
260
+ super(editorDescriptor, 'add');
261
+ this.withPosition(ActionPositionEnum.ToolbarLeft);
262
+ this.withRouteTrigger('add');
263
+ this.withSubmitFunction(ctx => ctx.dataProvider?.create
264
+ ? ctx.dataProvider.create(ctx.data?.item, ctx.serviceInstance)
265
+ : throwError(new Error(`Data provider create function is missing.`)));
266
+ this.withLevel(ActionLevelEnum.Success);
267
+ this.withIcon('pi pi-plus');
268
+ this.withClassName('mng-details-dynamic-dialog');
269
+ }
270
+ }
271
+ export class ActionEditorEditDescriptor extends ActionEditorDescriptor {
272
+ constructor(editorDescriptor) {
273
+ super(editorDescriptor, 'edit');
274
+ this.withPosition(ActionPositionEnum.RowInline);
275
+ this.withTitle(null);
276
+ this.withRouteTrigger(':itemId/edit');
277
+ this.withFetchFunction(ctx => ctx.dataProvider?.fetch && ctx.data?.itemId
278
+ ? ctx.dataProvider.fetch(ctx.data.itemId, ctx.serviceInstance)
279
+ : throwError(new Error(`Data provider fetch function or item id ${ctx.data?.itemId} is missing.`)));
280
+ this.withSubmitFunction(ctx => ctx.dataProvider?.update && ctx.data?.itemId
281
+ ? ctx.dataProvider.update(ctx.data.itemId, ctx.data?.item, ctx.serviceInstance)
282
+ : throwError(new Error(`Data provider update function or item id ${ctx.data?.itemId} is missing.`)));
283
+ this.withIcon('pi pi-pencil');
284
+ this.withClassName('mng-details-dynamic-dialog');
285
+ }
286
+ }
287
+ export class ActionDeleteDescriptor extends ActionDescriptor {
288
+ constructor(model) {
289
+ super(model, 'delete');
290
+ this.withPosition(ActionPositionEnum.RowInline);
291
+ this.withTitle(null);
292
+ this.withRunFunction(ctx => {
293
+ const editorDataProvider = ctx.dataProvider;
294
+ return editorDataProvider?.delete && ctx.data?.itemId
295
+ ? editorDataProvider.delete(ctx.data.itemId, ctx.data.item, ctx.serviceInstance)
296
+ : throwError(new Error(`Data provider delete function or item id ${ctx.data?.itemId} is missing.`));
297
+ });
298
+ this.withLevel(ActionLevelEnum.Danger);
299
+ this.withIcon('pi pi-trash');
300
+ this.withRunConfirmation(undefined);
301
+ }
302
+ }
303
+ export var ActionPositionEnum;
304
+ (function (ActionPositionEnum) {
305
+ ActionPositionEnum[ActionPositionEnum["ToolbarLeft"] = 0] = "ToolbarLeft";
306
+ ActionPositionEnum[ActionPositionEnum["ToolbarRight"] = 1] = "ToolbarRight";
307
+ ActionPositionEnum[ActionPositionEnum["TableHeader"] = 2] = "TableHeader";
308
+ ActionPositionEnum[ActionPositionEnum["RowInline"] = 3] = "RowInline";
309
+ ActionPositionEnum[ActionPositionEnum["RowClick"] = 4] = "RowClick";
310
+ })(ActionPositionEnum || (ActionPositionEnum = {}));
311
+ export var ActionActivationTriggerEnum;
312
+ (function (ActionActivationTriggerEnum) {
313
+ ActionActivationTriggerEnum[ActionActivationTriggerEnum["OnClick"] = 0] = "OnClick";
314
+ ActionActivationTriggerEnum[ActionActivationTriggerEnum["OnRoute"] = 1] = "OnRoute"; // action is triggered for activation by route url
315
+ })(ActionActivationTriggerEnum || (ActionActivationTriggerEnum = {}));
316
+ export var ActionTypeEnum;
317
+ (function (ActionTypeEnum) {
318
+ ActionTypeEnum[ActionTypeEnum["Direct"] = 0] = "Direct";
319
+ ActionTypeEnum[ActionTypeEnum["Editor"] = 1] = "Editor"; // editor providing middle step for activation
320
+ })(ActionTypeEnum || (ActionTypeEnum = {}));
321
+ export var ActionLevelEnum;
322
+ (function (ActionLevelEnum) {
323
+ ActionLevelEnum[ActionLevelEnum["Default"] = 0] = "Default";
324
+ ActionLevelEnum[ActionLevelEnum["Primary"] = 1] = "Primary";
325
+ ActionLevelEnum[ActionLevelEnum["Secondary"] = 2] = "Secondary";
326
+ ActionLevelEnum[ActionLevelEnum["Info"] = 3] = "Info";
327
+ ActionLevelEnum[ActionLevelEnum["Help"] = 4] = "Help";
328
+ ActionLevelEnum[ActionLevelEnum["Success"] = 5] = "Success";
329
+ ActionLevelEnum[ActionLevelEnum["Warning"] = 6] = "Warning";
330
+ ActionLevelEnum[ActionLevelEnum["Danger"] = 7] = "Danger";
331
+ })(ActionLevelEnum || (ActionLevelEnum = {}));
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2FjdGlvbi5kZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYSxFQUFFLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBTWhELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFbEMsTUFBTSxPQUFPLGdCQUFnQjtJQXVDekIsWUFBWSxLQUF5QixFQUFFLFVBQWtCLEVBQUUsVUFBMkIsRUFBRSxjQUF1QjtRQS9CckcsVUFBSyxHQUFtQixjQUFjLENBQUMsTUFBTSxDQUFDO1FBQzlDLHVCQUFrQixHQUFnQywyQkFBMkIsQ0FBQyxPQUFPLENBQUM7UUFDdEYsY0FBUyxHQUF1QixrQkFBa0IsQ0FBQyxZQUFZLENBQUM7UUFDaEUsV0FBTSxHQUFvQixlQUFlLENBQUMsT0FBTyxDQUFDO1FBRWxELGNBQVMsR0FBZ0IsSUFBSSxDQUFDO1FBSTlCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFPMUIsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBT25DLCtCQUEwQixHQUFZLElBQUksQ0FBQztRQUk3Qyw2QkFBd0IsR0FBWSxJQUFJLENBQUM7UUFLN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksY0FBYyxDQUFDLEVBQUU7WUFDeEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsVUFBVSxLQUFLLGNBQWMsR0FBRyxDQUFDLENBQUM7U0FDbEg7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxD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QUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNKO0FBRUQsTUFBTSxDQUFOLElBQVksa0JBTVg7QUFORCxXQUFZLGtCQUFrQjtJQUMxQix5RUFBVyxDQUFBO0lBQ1gsMkVBQVksQ0FBQTtJQUNaLHlFQUFXLENBQUE7SUFDWCxxRUFBUyxDQUFBO0lBQ1QsbUVBQVEsQ0FBQTtBQUNaLENBQUMsRUFOVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBTTdCO0FBRUQsTUFBTSxDQUFOLElBQVksMkJBR1g7QUFIRCxXQUFZLDJCQUEyQjtJQUNuQyxtRkFBTyxDQUFBO0lBQ1AsbUZBQU8sQ0FBQSxDQUFDLGtEQUFrRDtBQUM5RCxDQUFDLEVBSFcsMkJBQTJCLEtBQTNCLDJCQUEyQixRQUd0QztBQUVELE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDdEIsdURBQU0sQ0FBQTtJQUNOLHVEQUFNLENBQUEsQ0FBQyw4Q0FBOEM7QUFDekQsQ0FBQyxFQUhXLGNBQWMsS0FBZCxjQUFjLFFBR3pCO0FBRUQsTUFBTSxDQUFOLElBQVksZUFTWDtBQVRELFdBQVksZUFBZTtJQUN2QiwyREFBTyxDQUFBO0lBQ1AsMkRBQU8sQ0FBQTtJQUNQLCtEQUFTLENBQUE7SUFDVCxxREFBSSxDQUFBO0lBQ0oscURBQUksQ0FBQTtJQUNKLDJEQUFPLENBQUE7SUFDUCwyREFBTyxDQUFBO0lBQ1AseURBQU0sQ0FBQTtBQUNWLENBQUMsRUFUVyxlQUFlLEtBQWYsZUFBZSxRQVMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0NsYXNzVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9yLCBNb2RlbERlc2NyaXB0b3J9IGZyb20gJy4vJztcbmltcG9ydCB7SURhdGFQcm92aWRlciwgSUVkaXRvckRhdGFQcm92aWRlcn0gZnJvbSAnLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtBY3Rpb25FeGVjQ29udGV4dH0gZnJvbSAnLi4vY29tcG9uZW50cy9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7VHlwZVV0aWx9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbW9kZWw6IE1vZGVsRGVzY3JpcHRvcjxUPjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2FjdGlvbk5hbWU6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3BhcmVudFR5cGU/OiBDbGFzc1R5cGU8YW55PjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3BhcmVudFR5cGVOYW1lPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcGFyZW50UHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9pMThuTW9kZWxBY3Rpb25CYXNlS2V5OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX3R5cGU6IEFjdGlvblR5cGVFbnVtID0gQWN0aW9uVHlwZUVudW0uRGlyZWN0O1xuICAgIHByb3RlY3RlZCBfYWN0aXZhdGlvblRyaWdnZXI6IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bSA9IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PbkNsaWNrO1xuICAgIHByb3RlY3RlZCBfcG9zaXRpb246IEFjdGlvblBvc2l0aW9uRW51bSA9IEFjdGlvblBvc2l0aW9uRW51bS5Ub29sYmFyUmlnaHQ7XG4gICAgcHJvdGVjdGVkIF9sZXZlbDogQWN0aW9uTGV2ZWxFbnVtID0gQWN0aW9uTGV2ZWxFbnVtLkRlZmF1bHQ7XG5cbiAgICBwcm90ZWN0ZWQgX3JvdXRlVXJsOiBzdHJpbmd8bnVsbCA9IG51bGw7XG5cbiAgICBwcm90ZWN0ZWQgX3RpdGxlPzogc3RyaW5nfG51bGw7XG4gICAgcHJvdGVjdGVkIF9pY29uPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfY2xhc3NOYW1lOiBzdHJpbmcgPSAnJztcbiAgICBwcm90ZWN0ZWQgX3Rvb2x0aXA/OiBzdHJpbmd8bnVsbDtcblxuICAgIHByb3RlY3RlZCBfcnVuRnVuY3Rpb24/OiAoY3R4OiBBY3Rpb25FeGVjQ29udGV4dDxULCBhbnksIElEYXRhUHJvdmlkZXI8VCwgYW55Pj4pID0+IE9ic2VydmFibGU8VD47XG4gICAgcHJvdGVjdGVkIF9pc1Zpc2libGVGdW5jdGlvbj86IChjdHg6IEFjdGlvbkV4ZWNDb250ZXh0PFQsIGFueSwgSURhdGFQcm92aWRlcjxULCBhbnk+PikgPT4gT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwcm90ZWN0ZWQgX2lzRW5hYmxlZEZ1bmN0aW9uPzogKGN0eDogQWN0aW9uRXhlY0NvbnRleHQ8VCwgYW55LCBJRGF0YVByb3ZpZGVyPFQsIGFueT4+KSA9PiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgcHJpdmF0ZSBfaGFzUnVuQ29uZmlybWF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcnVuQ29uZmlybWF0aW9uSWNvbj86IHN0cmluZztcbiAgICBwcml2YXRlIF9ydW5Db25maXJtYXRpb25UaXRsZT86IHN0cmluZztcbiAgICBwcml2YXRlIF9ydW5Db25maXJtYXRpb25NZXNzYWdlPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3J1bkNvbmZpcm1hdGlvbkFjY2VwdFRpdGxlPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3J1bkNvbmZpcm1hdGlvblJlamVjdFRpdGxlPzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzOiBib29sZWFuID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9oYXNSdW5Ob3RpZmljYXRpb25FcnJvcjogYm9vbGVhbiA9IHRydWU7XG4gICAgcHJpdmF0ZSBfcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZT86IHN0cmluZztcbiAgICBwcml2YXRlIF9ydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFQ+LCBhY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmVudFR5cGU/OiBDbGFzc1R5cGU8YW55PiwgcGFyZW50UHJvcGVydHk/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5fYWN0aW9uTmFtZSA9IGFjdGlvbk5hbWU7XG5cbiAgICAgICAgaWYgKChwYXJlbnRUeXBlICYmICFwYXJlbnRQcm9wZXJ0eSkgfHwgKCFwYXJlbnRQcm9wZXJ0eSAmJiBwYXJlbnRQcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZSBib3RoIHRoZSBwYXJlbnQgdHlwZSBhbmQgcGFyZW50IHByb3BlcnR5IG9yIG5vbmU6ICR7cGFyZW50VHlwZX0sICR7cGFyZW50UHJvcGVydHl9LmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BhcmVudFR5cGUgPSBwYXJlbnRUeXBlO1xuICAgICAgICB0aGlzLl9wYXJlbnRUeXBlTmFtZSA9IHBhcmVudFR5cGUgPyBUeXBlVXRpbC5maW5kVHlwZU5hbWUocGFyZW50VHlwZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3BhcmVudFByb3BlcnR5ID0gcGFyZW50UHJvcGVydHk7XG5cbiAgICAgICAgdGhpcy5faTE4bk1vZGVsQWN0aW9uQmFzZUtleSA9IHRoaXMuX3BhcmVudFR5cGVOYW1lXG4gICAgICAgICAgICA/IGAke3RoaXMuX3BhcmVudFR5cGVOYW1lfS5hY3Rpb25zLiR7dGhpcy5fcGFyZW50UHJvcGVydHl9XyR7YWN0aW9uTmFtZX1gXG4gICAgICAgICAgICA6IGAke3RoaXMuX21vZGVsLnR5cGVOYW1lfS5hY3Rpb25zLiR7YWN0aW9uTmFtZX1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9kZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHBhcmVudFR5cGVOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50VHlwZU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJlbnRQcm9wZXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFByb3BlcnR5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaTE4bk1vZGVsQWN0aW9uQmFzZUtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFjdGl2YXRpb25UcmlnZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZhdGlvblRyaWdnZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvdXRlVXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm91dGVVcmw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWNvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ljb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0b29sdGlwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG9vbHRpcDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkZ1bmN0aW9uKCk6IChjdHg6IEFjdGlvbkV4ZWNDb250ZXh0PFQsIGFueSwgSURhdGFQcm92aWRlcjxULCBhbnk+PikgPT4gT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGlmICghdGhpcy5fcnVuRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUnVuIGZ1bmN0aW9uIGlzIG5vdCBkZWZpbmVkIGFuZCBjYW5ub3QgYmUgaW52b2tlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5GdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzVmlzaWJsZUZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlRnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0VuYWJsZWRGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRW5hYmxlZEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9uTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgZ2V0IGhhc1J1bkNvbmZpcm1hdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1J1bkNvbmZpcm1hdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgcnVuQ29uZmlybWF0aW9uSWNvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkNvbmZpcm1hdGlvbkljb247XG4gICAgfVxuXG4gICAgZ2V0IHJ1bkNvbmZpcm1hdGlvblRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uVGl0bGU7XG4gICAgfVxuXG4gICAgZ2V0IHJ1bkNvbmZpcm1hdGlvbk1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Db25maXJtYXRpb25NZXNzYWdlO1xuICAgIH1cblxuICAgIGdldCBydW5Db25maXJtYXRpb25BY2NlcHRUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkNvbmZpcm1hdGlvbkFjY2VwdFRpdGxlO1xuICAgIH1cblxuICAgIGdldCBydW5Db25maXJtYXRpb25SZWplY3RUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bkNvbmZpcm1hdGlvblJlamVjdFRpdGxlO1xuICAgIH1cblxuICAgIGdldCBoYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcztcbiAgICB9XG5cbiAgICBnZXQgcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlO1xuICAgIH1cblxuICAgIGdldCBydW5Ob3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlO1xuICAgIH1cblxuICAgIGdldCBoYXNSdW5Ob3RpZmljYXRpb25FcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yO1xuICAgIH1cblxuICAgIGdldCBydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZTtcbiAgICB9XG5cbiAgICBnZXQgcnVuTm90aWZpY2F0aW9uRXJyb3JNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uRXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUnVuRnVuY3Rpb248Uz4oZm46IChjdHg6IEFjdGlvbkV4ZWNDb250ZXh0PFQsIFMsIElEYXRhUHJvdmlkZXI8VCwgUz4+KSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3J1bkZ1bmN0aW9uID0gZm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSXNWaXNpYmxlRnVuY3Rpb248Uz4oZm46IChjdHg6IEFjdGlvbkV4ZWNDb250ZXh0PFQsIFMsIElEYXRhUHJvdmlkZXI8VCwgUz4+KSA9PiBPYnNlcnZhYmxlPGJvb2xlYW4+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzVmlzaWJsZUZ1bmN0aW9uID0gZm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSXNFbmFibGVkRnVuY3Rpb248Uz4oZm46IChjdHg6IEFjdGlvbkV4ZWNDb250ZXh0PFQsIFMsIElEYXRhUHJvdmlkZXI8VCwgUz4+KSA9PiBPYnNlcnZhYmxlPGJvb2xlYW4+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzRW5hYmxlZEZ1bmN0aW9uID0gZm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUm91dGVUcmlnZ2VyKHJvdXRlVXJsOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGlvblRyaWdnZXIgPSBBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0uT25Sb3V0ZTtcbiAgICAgICAgdGhpcy5fcm91dGVVcmwgPSByb3V0ZVVybDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhMZXZlbChsZXZlbDogQWN0aW9uTGV2ZWxFbnVtKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xldmVsID0gbGV2ZWw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IHRpdGxlIGtleSB3aXRoIG1vZGVsIGFjdGlvbiBrZXkgKCR7bW9kZWwudHlwZU5hbWV9LmFjdGlvbnMuJHthY3Rpb25OYW1lfSkuIE5vdCByZWxldmFudCBpZiBwYXJlbnRUeXBlIG5hbWUgaXMgcHJvdmlkZWQuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhNb2RlbFRpdGxlKCk6IHRoaXMge1xuICAgICAgICB0aGlzLl90aXRsZSA9IGAke3RoaXMuX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXl9LnRpdGxlYDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgdGl0bGUga2V5ICgke2FjdGlvbk5hbWV9LnRpdGxlKS4gSWYgbnVsbCwgbm8gdGl0bGUgd2lsbCBiZSBzaG93bi5cbiAgICAgKiBAcGFyYW0gdGl0bGUgVGl0bGUgaTE4biBrZXkgb3IgdGl0bGUuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhUaXRsZSh0aXRsZTogc3RyaW5nfG51bGwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJY29uKGljb246IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9pY29uID0gaWNvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhUb29sdGlwKHRvb2x0aXA6IHN0cmluZ3xudWxsKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdG9vbHRpcDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBvc2l0aW9uKHBvc2l0aW9uOiBBY3Rpb25Qb3NpdGlvbkVudW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSdW5Db25maXJtYXRpb24oaWNvbjogc3RyaW5nID0gJ3BpIHBpLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJywgdGl0bGU/OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIGFjY2VwdFRpdGxlPzogc3RyaW5nLCByZWplY3RUaXRsZT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNSdW5Db25maXJtYXRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25JY29uID0gaWNvbjtcbiAgICAgICAgdGhpcy5fcnVuQ29uZmlybWF0aW9uVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fcnVuQ29uZmlybWF0aW9uTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvbkFjY2VwdFRpdGxlID0gYWNjZXB0VGl0bGU7XG4gICAgICAgIHRoaXMuX3J1bkNvbmZpcm1hdGlvblJlamVjdFRpdGxlID0gcmVqZWN0VGl0bGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUnVuTm90aWZpY2F0aW9uU3VjY2Vzcyh0aXRsZT86IHN0cmluZywgbWVzc2FnZT86IHN0cmluZywgaGFzTm90aWZpY2F0aW9uOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzID0gaGFzTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUnVuTm90aWZpY2F0aW9uRXJyb3IodGl0bGU/OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcsIGhhc05vdGlmaWNhdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uRXJyb3IgPSBoYXNOb3RpZmljYXRpb247XG4gICAgICAgIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fcnVuTm90aWZpY2F0aW9uRXJyb3JNZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IGV4dGVuZHMgQWN0aW9uRGVzY3JpcHRvcjxUPiB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9lZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+O1xuXG4gICAgcHJvdGVjdGVkIF9lZGl0b3JUaXRsZT86IHN0cmluZyA9IHVuZGVmaW5lZDtcblxuICAgIHByaXZhdGUgX2hhc0ZldGNoTm90aWZpY2F0aW9uU3VjY2VzczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlPzogc3RyaW5nO1xuICAgIHByaXZhdGUgX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgX2ZldGNoRnVuY3Rpb24/OiAoY3R4OiBBY3Rpb25FeGVjQ29udGV4dDxULCBhbnksIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgYW55Pj4pID0+IE9ic2VydmFibGU8VD47XG4gICAgcHJvdGVjdGVkIF9zdWJtaXRGdW5jdGlvbj86IChjdHg6IEFjdGlvbkV4ZWNDb250ZXh0PFQsIGFueSwgSUVkaXRvckRhdGFQcm92aWRlcjxULCBhbnk+PikgPT4gT2JzZXJ2YWJsZTxUPjtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD4sIGFjdGlvbk5hbWU6IHN0cmluZywgcGFyZW50VHlwZT86IENsYXNzVHlwZTxhbnk+LCBwYXJlbnRQcm9wZXJ0eT86IHN0cmluZykge1xuICAgICAgICBzdXBlcihlZGl0b3JEZXNjcmlwdG9yLm1vZGVsLCBhY3Rpb25OYW1lLCBwYXJlbnRUeXBlLCBwYXJlbnRQcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuX3R5cGUgPSBBY3Rpb25UeXBlRW51bS5FZGl0b3I7XG4gICAgICAgIHRoaXMuX2VkaXRvckRlc2NyaXB0b3IgPSBlZGl0b3JEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckRlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIGdldCBoYXNGZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNGZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgZ2V0IGZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzVGl0bGU7XG4gICAgfVxuXG4gICAgZ2V0IGZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgcnVuRnVuY3Rpb24oKTogKGN0eDogQWN0aW9uRXhlY0NvbnRleHQ8VCwgYW55LCBJRGF0YVByb3ZpZGVyPFQsIGFueT4+KSA9PiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdW4gZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgaW4gZWRpdG9yIGFjdGlvbi4gVXNlIHN1Ym1pdCBmdW5jdGlvbiBpbnN0ZWFkIScpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmV0Y2hGdW5jdGlvbigpOiAoY3R4OiBBY3Rpb25FeGVjQ29udGV4dDxULCBhbnksIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgYW55Pj4pID0+IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBpZiAoIXRoaXMuX2ZldGNoRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAoY3R4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGZXRjaCBmdW5jdGlvbiBpcyBub3QgcHJvdmlkZWQgZm9yIGZ1bmN0aW9uICR7dGhpcy5fYWN0aW9uTmFtZX0sIHVzaW5nIGRlZmF1bHQgYW5kIHJldHVybmluZyBjb250ZXh0IGl0ZW1gLCBjdHguZGF0YT8uaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGN0eC5kYXRhPy5pdGVtID8gY3R4LmRhdGEuaXRlbSA6IHt9IGFzIFQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9mZXRjaEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3VibWl0RnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJtaXRGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEVkaXRvclRpdGxlKHRpdGxlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhSdW5GdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uRXhlY0NvbnRleHQ8VCwgUywgSURhdGFQcm92aWRlcjxULCBTPj4pID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFN1Ym1pdEZ1bmN0aW9uKGZuIGFzIChjdHg6IEFjdGlvbkV4ZWNDb250ZXh0PFQsIFMsIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgUz4+KSA9PiBPYnNlcnZhYmxlPFQ+KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZldGNoRnVuY3Rpb248Uz4oZm46IChjdHg6IEFjdGlvbkV4ZWNDb250ZXh0PFQsIFMsIElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgUz4+KSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2ZldGNoRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTdWJtaXRGdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uRXhlY0NvbnRleHQ8VCwgUywgSUVkaXRvckRhdGFQcm92aWRlcjxULCBTPj4pID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fc3VibWl0RnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhGZXRjaE5vdGlmaWNhdGlvbkVycm9yKHRpdGxlPzogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nLCBoYXNOb3RpZmljYXRpb246IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX2hhc0ZldGNoTm90aWZpY2F0aW9uU3VjY2VzcyA9IGhhc05vdGlmaWNhdGlvbjtcbiAgICAgICAgdGhpcy5fZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yRGV0YWlsc0Rlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvckRlc2NyaXB0b3IsICdkZXRhaWxzJyk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dDbGljayk7XG4gICAgICAgIHRoaXMud2l0aFJvdXRlVHJpZ2dlcignOml0ZW1JZCcpO1xuICAgICAgICB0aGlzLndpdGhGZXRjaEZ1bmN0aW9uKGN0eCA9PiBjdHguZGF0YVByb3ZpZGVyPy5mZXRjaCAmJiBjdHguZGF0YT8uaXRlbUlkXG4gICAgICAgICAgICA/IGN0eC5kYXRhUHJvdmlkZXIuZmV0Y2goY3R4LmRhdGE/Lml0ZW1JZCwgY3R4LnNlcnZpY2VJbnN0YW5jZSlcbiAgICAgICAgICAgIDogdGhyb3dFcnJvcihuZXcgRXJyb3IoYERhdGEgcHJvdmlkZXIgZmV0Y2ggZnVuY3Rpb24gb3IgaXRlbSBpZCAke2N0eC5kYXRhPy5pdGVtSWR9IGlzIG1pc3NpbmcuYCkpKTtcbiAgICAgICAgdGhpcy53aXRoQ2xhc3NOYW1lKCdtbmctZGV0YWlscy1keW5hbWljLWRpYWxvZycpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkVkaXRvckFkZERlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvckRlc2NyaXB0b3IsICdhZGQnKTtcbiAgICAgICAgdGhpcy53aXRoUG9zaXRpb24oQWN0aW9uUG9zaXRpb25FbnVtLlRvb2xiYXJMZWZ0KTtcbiAgICAgICAgdGhpcy53aXRoUm91dGVUcmlnZ2VyKCdhZGQnKTtcbiAgICAgICAgdGhpcy53aXRoU3VibWl0RnVuY3Rpb24oY3R4ID0+IGN0eC5kYXRhUHJvdmlkZXI/LmNyZWF0ZVxuICAgICAgICAgICAgPyBjdHguZGF0YVByb3ZpZGVyLmNyZWF0ZShjdHguZGF0YT8uaXRlbSwgY3R4LnNlcnZpY2VJbnN0YW5jZSlcbiAgICAgICAgICAgIDogdGhyb3dFcnJvcihuZXcgRXJyb3IoYERhdGEgcHJvdmlkZXIgY3JlYXRlIGZ1bmN0aW9uIGlzIG1pc3NpbmcuYCkpKTtcbiAgICAgICAgdGhpcy53aXRoTGV2ZWwoQWN0aW9uTGV2ZWxFbnVtLlN1Y2Nlc3MpO1xuICAgICAgICB0aGlzLndpdGhJY29uKCdwaSBwaS1wbHVzJyk7XG4gICAgICAgIHRoaXMud2l0aENsYXNzTmFtZSgnbW5nLWRldGFpbHMtZHluYW1pYy1kaWFsb2cnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25FZGl0b3JFZGl0RGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRvckRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yRGVzY3JpcHRvciwgJ2VkaXQnKTtcbiAgICAgICAgdGhpcy53aXRoUG9zaXRpb24oQWN0aW9uUG9zaXRpb25FbnVtLlJvd0lubGluZSk7XG4gICAgICAgIHRoaXMud2l0aFRpdGxlKG51bGwpO1xuICAgICAgICB0aGlzLndpdGhSb3V0ZVRyaWdnZXIoJzppdGVtSWQvZWRpdCcpO1xuICAgICAgICB0aGlzLndpdGhGZXRjaEZ1bmN0aW9uKGN0eCA9PiBjdHguZGF0YVByb3ZpZGVyPy5mZXRjaCAmJiBjdHguZGF0YT8uaXRlbUlkXG4gICAgICAgICAgICA/IGN0eC5kYXRhUHJvdmlkZXIuZmV0Y2goY3R4LmRhdGEuaXRlbUlkLCBjdHguc2VydmljZUluc3RhbmNlKVxuICAgICAgICAgICAgOiB0aHJvd0Vycm9yKG5ldyBFcnJvcihgRGF0YSBwcm92aWRlciBmZXRjaCBmdW5jdGlvbiBvciBpdGVtIGlkICR7Y3R4LmRhdGE/Lml0ZW1JZH0gaXMgbWlzc2luZy5gKSkpO1xuICAgICAgICB0aGlzLndpdGhTdWJtaXRGdW5jdGlvbihjdHggPT4gY3R4LmRhdGFQcm92aWRlcj8udXBkYXRlICYmIGN0eC5kYXRhPy5pdGVtSWRcbiAgICAgICAgICAgID8gY3R4LmRhdGFQcm92aWRlci51cGRhdGUoY3R4LmRhdGEuaXRlbUlkLCBjdHguZGF0YT8uaXRlbSwgY3R4LnNlcnZpY2VJbnN0YW5jZSlcbiAgICAgICAgICAgIDogdGhyb3dFcnJvcihuZXcgRXJyb3IoYERhdGEgcHJvdmlkZXIgdXBkYXRlIGZ1bmN0aW9uIG9yIGl0ZW0gaWQgJHtjdHguZGF0YT8uaXRlbUlkfSBpcyBtaXNzaW5nLmApKSk7XG4gICAgICAgIHRoaXMud2l0aEljb24oJ3BpIHBpLXBlbmNpbCcpO1xuICAgICAgICB0aGlzLndpdGhDbGFzc05hbWUoJ21uZy1kZXRhaWxzLWR5bmFtaWMtZGlhbG9nJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRGVsZXRlRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIGNvbnN0cnVjdG9yKG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIobW9kZWwsICdkZWxldGUnKTtcbiAgICAgICAgdGhpcy53aXRoUG9zaXRpb24oQWN0aW9uUG9zaXRpb25FbnVtLlJvd0lubGluZSk7XG4gICAgICAgIHRoaXMud2l0aFRpdGxlKG51bGwpO1xuICAgICAgICB0aGlzLndpdGhSdW5GdW5jdGlvbihjdHggPT4ge1xuICAgICAgICAgICAgY29uc3QgZWRpdG9yRGF0YVByb3ZpZGVyID0gY3R4LmRhdGFQcm92aWRlciBhcyBJRWRpdG9yRGF0YVByb3ZpZGVyPFQsIGFueT47XG4gICAgICAgICAgICByZXR1cm4gZWRpdG9yRGF0YVByb3ZpZGVyPy5kZWxldGUgJiYgY3R4LmRhdGE/Lml0ZW1JZFxuICAgICAgICAgICAgICAgID8gZWRpdG9yRGF0YVByb3ZpZGVyLmRlbGV0ZShjdHguZGF0YS5pdGVtSWQsIGN0eC5kYXRhLml0ZW0sIGN0eC5zZXJ2aWNlSW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgOiB0aHJvd0Vycm9yKG5ldyBFcnJvcihgRGF0YSBwcm92aWRlciBkZWxldGUgZnVuY3Rpb24gb3IgaXRlbSBpZCAke2N0eC5kYXRhPy5pdGVtSWR9IGlzIG1pc3NpbmcuYCkpXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndpdGhMZXZlbChBY3Rpb25MZXZlbEVudW0uRGFuZ2VyKTtcbiAgICAgICAgdGhpcy53aXRoSWNvbigncGkgcGktdHJhc2gnKTtcbiAgICAgICAgdGhpcy53aXRoUnVuQ29uZmlybWF0aW9uKHVuZGVmaW5lZCk7XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBBY3Rpb25Qb3NpdGlvbkVudW0ge1xuICAgIFRvb2xiYXJMZWZ0LFxuICAgIFRvb2xiYXJSaWdodCxcbiAgICBUYWJsZUhlYWRlcixcbiAgICBSb3dJbmxpbmUsXG4gICAgUm93Q2xpY2tcbn1cblxuZXhwb3J0IGVudW0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtIHtcbiAgICBPbkNsaWNrLCAvLyBhY3Rpb24gaXMgdHJpZ2dlcmVkIGZvciBhY3RpdmF0aW9uIG9uIGNsaWNrXG4gICAgT25Sb3V0ZSAvLyBhY3Rpb24gaXMgdHJpZ2dlcmVkIGZvciBhY3RpdmF0aW9uIGJ5IHJvdXRlIHVybFxufVxuXG5leHBvcnQgZW51bSBBY3Rpb25UeXBlRW51bSB7XG4gICAgRGlyZWN0LCAvLyBhY3Rpb24gaXMgZGlyZWN0bHkgYWN0aXZhdGVkIGFuZCBleGVjdXRlZFxuICAgIEVkaXRvciAvLyBlZGl0b3IgcHJvdmlkaW5nIG1pZGRsZSBzdGVwIGZvciBhY3RpdmF0aW9uXG59XG5cbmV4cG9ydCBlbnVtIEFjdGlvbkxldmVsRW51bSB7XG4gICAgRGVmYXVsdCxcbiAgICBQcmltYXJ5LFxuICAgIFNlY29uZGFyeSxcbiAgICBJbmZvLFxuICAgIEhlbHAsXG4gICAgU3VjY2VzcyxcbiAgICBXYXJuaW5nLFxuICAgIERhbmdlclxufVxuIl19