@mediusinc/mng-commons 2.6.0 → 3.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/README.md +17 -6
  2. package/dev-scripts/version-info.js +1 -0
  3. package/esm2022/lib/api/models/filter-param.model.mjs +33 -0
  4. package/esm2022/lib/api/models/query-param.model.mjs +68 -0
  5. package/esm2022/lib/api/models/query-result.model.mjs +24 -0
  6. package/esm2022/lib/api/utils/medius-rest.util.mjs +255 -0
  7. package/esm2022/lib/api/utils/object-serializer.util.mjs +258 -0
  8. package/esm2022/lib/components/action/action.component.mjs +304 -0
  9. package/esm2022/lib/components/action/editor/action-editor.component.mjs +386 -0
  10. package/esm2022/lib/components/action/localization/data-language-dropdown.component.mjs +54 -0
  11. package/{esm2020 → esm2022}/lib/components/action/models/action-execution.model.mjs +1 -1
  12. package/esm2022/lib/components/action/models/tableview-action-default-categories.model.mjs +11 -0
  13. package/{esm2020 → esm2022}/lib/components/action/route/action-route.component.mjs +4 -4
  14. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +300 -0
  15. package/{esm2020 → esm2022}/lib/components/form/date-range/date-range.component.mjs +5 -5
  16. package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +212 -0
  17. package/esm2022/lib/components/form/editor/form-editor.component.mjs +288 -0
  18. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +4 -4
  19. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +5 -5
  20. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.mjs +4 -4
  21. package/esm2022/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +39 -0
  22. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +5 -5
  25. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +4 -4
  26. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +7 -7
  27. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +4 -4
  28. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +4 -4
  29. package/esm2022/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +19 -0
  30. package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +4 -4
  31. package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +4 -4
  32. package/esm2022/lib/components/form/models/form-editor.event.mjs +49 -0
  33. package/esm2022/lib/components/layout/breadcrumb.component.mjs +34 -0
  34. package/{esm2020 → esm2022}/lib/components/layout/footer.component.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/components/layout/main-layout.component.mjs +4 -4
  36. package/esm2022/lib/components/layout/menu-item.component.mjs +296 -0
  37. package/{esm2020 → esm2022}/lib/components/layout/menu.component.mjs +4 -4
  38. package/{esm2020 → esm2022}/lib/components/layout/services/main-layout.component.service.mjs +4 -4
  39. package/{esm2020 → esm2022}/lib/components/layout/topbar-user.component.mjs +4 -4
  40. package/{esm2020 → esm2022}/lib/components/layout/topbar.component.mjs +4 -4
  41. package/{esm2020 → esm2022}/lib/components/layout/version.component.mjs +4 -4
  42. package/{esm2020 → esm2022}/lib/components/pages/error/error-page.component.mjs +4 -4
  43. package/{esm2020 → esm2022}/lib/components/pages/not-found/not-found-page.component.mjs +4 -4
  44. package/{esm2020 → esm2022}/lib/components/tableview/models/table.event.mjs +1 -1
  45. package/{esm2020 → esm2022}/lib/components/tableview/route/tableview-route.abstract.component.mjs +5 -5
  46. package/{esm2020 → esm2022}/lib/components/tableview/route/tableview-route.component.mjs +4 -4
  47. package/esm2022/lib/components/tableview/table/column-filter/column-filter.component.mjs +124 -0
  48. package/esm2022/lib/components/tableview/table/column-value/column-value.component.mjs +110 -0
  49. package/esm2022/lib/components/tableview/table/table.component.mjs +747 -0
  50. package/esm2022/lib/components/tableview/tableview.component.mjs +147 -0
  51. package/esm2022/lib/descriptors/action/action.descriptor.mjs +634 -0
  52. package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +304 -0
  53. package/esm2022/lib/descriptors/editor/field.descriptor.mjs +1088 -0
  54. package/esm2022/lib/descriptors/table/table.descriptor.mjs +542 -0
  55. package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +352 -0
  56. package/{esm2020 → esm2022}/lib/descriptors/types/table.type.mjs +1 -5
  57. package/{esm2020 → esm2022}/lib/directives/component.directive.mjs +5 -5
  58. package/{esm2020 → esm2022}/lib/directives/template.directive.mjs +5 -5
  59. package/esm2022/lib/mng-commons.module.mjs +465 -0
  60. package/{esm2020 → esm2022}/lib/pipes/boolean.pipe.mjs +4 -4
  61. package/{esm2020 → esm2022}/lib/pipes/class-map.pipe.mjs +4 -4
  62. package/{esm2020 → esm2022}/lib/pipes/enum.pipe.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/pipes/enumerate-async.pipe.mjs +4 -4
  64. package/{esm2020 → esm2022}/lib/pipes/enumerate.pipe.mjs +4 -4
  65. package/{esm2020 → esm2022}/lib/pipes/getter.pipe.mjs +4 -4
  66. package/{esm2020 → esm2022}/lib/pipes/i18n-property.pipe.mjs +4 -4
  67. package/{esm2020 → esm2022}/lib/pipes/json-path.pipe.mjs +4 -4
  68. package/{esm2020 → esm2022}/lib/pipes/locale-default-row-class.pipe.mjs +4 -4
  69. package/{esm2020 → esm2022}/lib/pipes/parametrize.pipe.mjs +4 -4
  70. package/{esm2020 → esm2022}/lib/pipes/template.pipe.mjs +4 -4
  71. package/esm2022/lib/router/route-builder.mjs +308 -0
  72. package/esm2022/lib/router/routes-builder.mjs +61 -0
  73. package/esm2022/lib/security/authorization.guard.mjs +15 -0
  74. package/{esm2020 → esm2022}/lib/security/authorization.service.mjs +4 -4
  75. package/esm2022/lib/services/action-executor.service.mjs +703 -0
  76. package/{esm2020 → esm2022}/lib/services/commons.service.mjs +4 -4
  77. package/esm2022/lib/services/configuration.service.mjs +150 -0
  78. package/{esm2020 → esm2022}/lib/services/internal/commons-init.service.mjs +4 -4
  79. package/{esm2020 → esm2022}/lib/services/mng-localstorage-config.service.mjs +4 -4
  80. package/{esm2020 → esm2022}/lib/services/navigation.service.mjs +4 -4
  81. package/{esm2020 → esm2022}/lib/services/router.service.mjs +4 -4
  82. package/{esm2020 → esm2022}/lib/services/version.service.mjs +4 -4
  83. package/{esm2020 → esm2022}/lib/services/view-container.component.service.mjs +4 -4
  84. package/esm2022/lib/styles/styles.util.mjs +42 -0
  85. package/esm2022/lib/types/type.model.mjs +2 -0
  86. package/esm2022/lib/utils/date.util.mjs +120 -0
  87. package/esm2022/lib/utils/tableview.util.mjs +193 -0
  88. package/esm2022/lib/utils/type.util.mjs +94 -0
  89. package/{fesm2020 → fesm2022}/mediusinc-mng-commons.mjs +952 -940
  90. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -0
  91. package/lib/api/utils/medius-rest.util.d.ts +4 -3
  92. package/lib/components/action/action.component.d.ts +1 -1
  93. package/lib/components/action/editor/action-editor.component.d.ts +6 -9
  94. package/lib/components/action/localization/data-language-dropdown.component.d.ts +1 -1
  95. package/lib/components/form/autocomplete/autocomplete.component.d.ts +4 -4
  96. package/lib/components/form/date-range/date-range.component.d.ts +1 -1
  97. package/lib/components/form/dropdown/dropdown.component.d.ts +3 -3
  98. package/lib/components/form/editor/form-editor.component.d.ts +1 -1
  99. package/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.d.ts +1 -1
  100. package/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.d.ts +1 -0
  101. package/lib/components/layout/breadcrumb.component.d.ts +5 -0
  102. package/lib/components/layout/menu-item.component.d.ts +1 -1
  103. package/lib/components/layout/version.component.d.ts +1 -1
  104. package/lib/components/tableview/models/table.event.d.ts +2 -2
  105. package/lib/components/tableview/route/tableview-route.component.d.ts +1 -1
  106. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +2 -2
  107. package/lib/components/tableview/table/column-value/column-value.component.d.ts +1 -1
  108. package/lib/components/tableview/table/table.component.d.ts +6 -7
  109. package/lib/components/tableview/tableview.component.d.ts +7 -11
  110. package/lib/descriptors/editor/editor.descriptor.d.ts +1 -1
  111. package/lib/descriptors/editor/field.descriptor.d.ts +3 -1
  112. package/lib/descriptors/table/table.descriptor.d.ts +8 -3
  113. package/lib/descriptors/tableview/tableview.descriptor.d.ts +4 -4
  114. package/lib/descriptors/types/table.type.d.ts +1 -5
  115. package/lib/directives/component.directive.d.ts +1 -1
  116. package/lib/directives/template.directive.d.ts +1 -1
  117. package/lib/router/route-builder.d.ts +6 -10
  118. package/lib/router/routes-builder.d.ts +0 -5
  119. package/lib/security/authorization.guard.d.ts +2 -11
  120. package/lib/services/action-executor.service.d.ts +1 -15
  121. package/lib/utils/route.util.d.ts +8 -19
  122. package/lib/utils/tableview.util.d.ts +5 -0
  123. package/package.json +12 -19
  124. package/esm2020/lib/api/models/filter-param.model.mjs +0 -33
  125. package/esm2020/lib/api/models/query-param.model.mjs +0 -68
  126. package/esm2020/lib/api/models/query-result.model.mjs +0 -24
  127. package/esm2020/lib/api/utils/medius-rest.util.mjs +0 -246
  128. package/esm2020/lib/api/utils/object-serializer.util.mjs +0 -258
  129. package/esm2020/lib/components/action/action.component.mjs +0 -303
  130. package/esm2020/lib/components/action/editor/action-editor.component.mjs +0 -390
  131. package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +0 -47
  132. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +0 -11
  133. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +0 -303
  134. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +0 -214
  135. package/esm2020/lib/components/form/editor/form-editor.component.mjs +0 -288
  136. package/esm2020/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -54
  137. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -19
  138. package/esm2020/lib/components/form/models/form-editor.event.mjs +0 -49
  139. package/esm2020/lib/components/layout/breadcrumb.component.mjs +0 -19
  140. package/esm2020/lib/components/layout/menu-item.component.mjs +0 -294
  141. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +0 -126
  142. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +0 -108
  143. package/esm2020/lib/components/tableview/table/table.component.mjs +0 -749
  144. package/esm2020/lib/components/tableview/tableview.component.mjs +0 -146
  145. package/esm2020/lib/descriptors/action/action.descriptor.mjs +0 -634
  146. package/esm2020/lib/descriptors/editor/editor.descriptor.mjs +0 -304
  147. package/esm2020/lib/descriptors/editor/field.descriptor.mjs +0 -1083
  148. package/esm2020/lib/descriptors/table/table.descriptor.mjs +0 -521
  149. package/esm2020/lib/descriptors/tableview/tableview.descriptor.mjs +0 -347
  150. package/esm2020/lib/mng-commons.module.mjs +0 -469
  151. package/esm2020/lib/router/route-builder.mjs +0 -312
  152. package/esm2020/lib/router/routes-builder.mjs +0 -68
  153. package/esm2020/lib/security/authorization.guard.mjs +0 -30
  154. package/esm2020/lib/services/action-executor.service.mjs +0 -722
  155. package/esm2020/lib/services/configuration.service.mjs +0 -150
  156. package/esm2020/lib/styles/styles.util.mjs +0 -42
  157. package/esm2020/lib/types/type.model.mjs +0 -2
  158. package/esm2020/lib/utils/date.util.mjs +0 -120
  159. package/esm2020/lib/utils/tableview.util.mjs +0 -171
  160. package/esm2020/lib/utils/type.util.mjs +0 -94
  161. package/fesm2015/mediusinc-mng-commons.mjs +0 -15900
  162. package/fesm2015/mediusinc-mng-commons.mjs.map +0 -1
  163. package/fesm2020/mediusinc-mng-commons.mjs.map +0 -1
  164. /package/{esm2020 → esm2022}/index.mjs +0 -0
  165. /package/{esm2020 → esm2022}/lib/api/models/builders/query-param.builder.mjs +0 -0
  166. /package/{esm2020 → esm2022}/lib/api/models/filter-match-type.model.mjs +0 -0
  167. /package/{esm2020 → esm2022}/lib/api/models/index.mjs +0 -0
  168. /package/{esm2020 → esm2022}/lib/api/models/mappers.mjs +0 -0
  169. /package/{esm2020 → esm2022}/lib/api/models/query-mode.model.mjs +0 -0
  170. /package/{esm2020 → esm2022}/lib/api/models/serialization.model.mjs +0 -0
  171. /package/{esm2020 → esm2022}/lib/api/services/api.abstract.service.mjs +0 -0
  172. /package/{esm2020 → esm2022}/lib/api/services/crud-api.abstract.service.mjs +0 -0
  173. /package/{esm2020 → esm2022}/lib/api/services/get-all-api.abstract.service.mjs +0 -0
  174. /package/{esm2020 → esm2022}/lib/api/services/index.mjs +0 -0
  175. /package/{esm2020 → esm2022}/lib/api/utils/index.mjs +0 -0
  176. /package/{esm2020 → esm2022}/lib/components/action/index.mjs +0 -0
  177. /package/{esm2020 → esm2022}/lib/components/action/models/action-component.model.mjs +0 -0
  178. /package/{esm2020 → esm2022}/lib/components/action/models/action-confirmation-service.model.mjs +0 -0
  179. /package/{esm2020 → esm2022}/lib/components/action/models/index.mjs +0 -0
  180. /package/{esm2020 → esm2022}/lib/components/form/formly/fields/index.mjs +0 -0
  181. /package/{esm2020 → esm2022}/lib/components/form/formly/formly.config.mjs +0 -0
  182. /package/{esm2020 → esm2022}/lib/components/form/formly/index.mjs +0 -0
  183. /package/{esm2020 → esm2022}/lib/components/form/formly/models/formly-config.model.mjs +0 -0
  184. /package/{esm2020 → esm2022}/lib/components/form/formly/models/formly-field.model.mjs +0 -0
  185. /package/{esm2020 → esm2022}/lib/components/form/formly/models/index.mjs +0 -0
  186. /package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/index.mjs +0 -0
  187. /package/{esm2020 → esm2022}/lib/components/form/index.mjs +0 -0
  188. /package/{esm2020 → esm2022}/lib/components/form/models/field-action-context.model.mjs +0 -0
  189. /package/{esm2020 → esm2022}/lib/components/form/models/form-editor.interface.mjs +0 -0
  190. /package/{esm2020 → esm2022}/lib/components/form/models/index.mjs +0 -0
  191. /package/{esm2020 → esm2022}/lib/components/layout/index.mjs +0 -0
  192. /package/{esm2020 → esm2022}/lib/components/layout/services/index.mjs +0 -0
  193. /package/{esm2020 → esm2022}/lib/components/pages/index.mjs +0 -0
  194. /package/{esm2020 → esm2022}/lib/components/tableview/index.mjs +0 -0
  195. /package/{esm2020 → esm2022}/lib/components/tableview/models/index.mjs +0 -0
  196. /package/{esm2020 → esm2022}/lib/components/tableview/table/models/index.mjs +0 -0
  197. /package/{esm2020 → esm2022}/lib/components/tableview/table/models/table.interface.mjs +0 -0
  198. /package/{esm2020 → esm2022}/lib/data-providers/base.data-provider.mjs +0 -0
  199. /package/{esm2020 → esm2022}/lib/data-providers/editor.data-provider.mjs +0 -0
  200. /package/{esm2020 → esm2022}/lib/data-providers/index.mjs +0 -0
  201. /package/{esm2020 → esm2022}/lib/data-providers/lookup.data-provider.mjs +0 -0
  202. /package/{esm2020 → esm2022}/lib/data-providers/table.data-provider.mjs +0 -0
  203. /package/{esm2020 → esm2022}/lib/data-providers/tableview-crud.data-provider.mjs +0 -0
  204. /package/{esm2020 → esm2022}/lib/data-providers/tableview.data-provider.mjs +0 -0
  205. /package/{esm2020 → esm2022}/lib/descriptors/action/action-button.descriptor.mjs +0 -0
  206. /package/{esm2020 → esm2022}/lib/descriptors/action/action-confirmation.descriptor.mjs +0 -0
  207. /package/{esm2020 → esm2022}/lib/descriptors/action/index.mjs +0 -0
  208. /package/{esm2020 → esm2022}/lib/descriptors/editor/field-validation.descriptor.mjs +0 -0
  209. /package/{esm2020 → esm2022}/lib/descriptors/editor/index.mjs +0 -0
  210. /package/{esm2020 → esm2022}/lib/descriptors/filter/filter.descriptor.mjs +0 -0
  211. /package/{esm2020 → esm2022}/lib/descriptors/filter/index.mjs +0 -0
  212. /package/{esm2020 → esm2022}/lib/descriptors/index.mjs +0 -0
  213. /package/{esm2020 → esm2022}/lib/descriptors/interfaces/field-config.interface.mjs +0 -0
  214. /package/{esm2020 → esm2022}/lib/descriptors/interfaces/index.mjs +0 -0
  215. /package/{esm2020 → esm2022}/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +0 -0
  216. /package/{esm2020 → esm2022}/lib/descriptors/model.descriptor.mjs +0 -0
  217. /package/{esm2020 → esm2022}/lib/descriptors/table/column.descriptor.mjs +0 -0
  218. /package/{esm2020 → esm2022}/lib/descriptors/table/index.mjs +0 -0
  219. /package/{esm2020 → esm2022}/lib/descriptors/tableview/index.mjs +0 -0
  220. /package/{esm2020 → esm2022}/lib/descriptors/types/action.type.mjs +0 -0
  221. /package/{esm2020 → esm2022}/lib/descriptors/types/column.type.mjs +0 -0
  222. /package/{esm2020 → esm2022}/lib/descriptors/types/editor.type.mjs +0 -0
  223. /package/{esm2020 → esm2022}/lib/descriptors/types/field.type.mjs +0 -0
  224. /package/{esm2020 → esm2022}/lib/descriptors/types/filter.type.mjs +0 -0
  225. /package/{esm2020 → esm2022}/lib/descriptors/types/index.mjs +0 -0
  226. /package/{esm2020 → esm2022}/lib/directives/index.mjs +0 -0
  227. /package/{esm2020 → esm2022}/lib/models/column-value.model.mjs +0 -0
  228. /package/{esm2020 → esm2022}/lib/models/config.model.mjs +0 -0
  229. /package/{esm2020 → esm2022}/lib/models/enum.model.mjs +0 -0
  230. /package/{esm2020 → esm2022}/lib/models/error-internal.model.mjs +0 -0
  231. /package/{esm2020 → esm2022}/lib/models/error.model.mjs +0 -0
  232. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  233. /package/{esm2020 → esm2022}/lib/models/menu.model.mjs +0 -0
  234. /package/{esm2020 → esm2022}/lib/models/tableview-attr.model.mjs +0 -0
  235. /package/{esm2020 → esm2022}/lib/models/user.model.mjs +0 -0
  236. /package/{esm2020 → esm2022}/lib/models/version.model.mjs +0 -0
  237. /package/{esm2020 → esm2022}/lib/models/view-container.model.mjs +0 -0
  238. /package/{esm2020 → esm2022}/lib/pipes/index.mjs +0 -0
  239. /package/{esm2020 → esm2022}/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +0 -0
  240. /package/{esm2020 → esm2022}/lib/pipes/models/internal/index.mjs +0 -0
  241. /package/{esm2020 → esm2022}/lib/provide-commons.mjs +0 -0
  242. /package/{esm2020 → esm2022}/lib/router/index.mjs +0 -0
  243. /package/{esm2020 → esm2022}/lib/router/models/index.mjs +0 -0
  244. /package/{esm2020 → esm2022}/lib/router/models/router.model.mjs +0 -0
  245. /package/{esm2020 → esm2022}/lib/router/tableview-route-builder.mjs +0 -0
  246. /package/{esm2020 → esm2022}/lib/security/authorization.util.mjs +0 -0
  247. /package/{esm2020 → esm2022}/lib/security/index.mjs +0 -0
  248. /package/{esm2020 → esm2022}/lib/security/model/authorization.type.mjs +0 -0
  249. /package/{esm2020 → esm2022}/lib/security/model/index.mjs +0 -0
  250. /package/{esm2020 → esm2022}/lib/security/model/permission-service.interface.mjs +0 -0
  251. /package/{esm2020 → esm2022}/lib/security/model/permissions.model.mjs +0 -0
  252. /package/{esm2020 → esm2022}/lib/services/error-mapper.service.mjs +0 -0
  253. /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
  254. /package/{esm2020 → esm2022}/lib/services/internal/commons-init.provider.mjs +0 -0
  255. /package/{esm2020 → esm2022}/lib/services/internal/index.mjs +0 -0
  256. /package/{esm2020 → esm2022}/lib/services/providers/config-service.provider.mjs +0 -0
  257. /package/{esm2020 → esm2022}/lib/services/providers/formly-config.provider.mjs +0 -0
  258. /package/{esm2020 → esm2022}/lib/services/providers/index.mjs +0 -0
  259. /package/{esm2020 → esm2022}/lib/services/tokens/browser-storage.token.mjs +0 -0
  260. /package/{esm2020 → esm2022}/lib/services/tokens/commons-init.token.mjs +0 -0
  261. /package/{esm2020 → esm2022}/lib/services/tokens/default-setting.token.mjs +0 -0
  262. /package/{esm2020 → esm2022}/lib/services/tokens/index.mjs +0 -0
  263. /package/{esm2020 → esm2022}/lib/services/tokens/module-config.token.mjs +0 -0
  264. /package/{esm2020 → esm2022}/lib/styles/button-style.builder.mjs +0 -0
  265. /package/{esm2020 → esm2022}/lib/styles/index.mjs +0 -0
  266. /package/{esm2020 → esm2022}/lib/styles/models/index.mjs +0 -0
  267. /package/{esm2020 → esm2022}/lib/styles/models/style-level.enum.mjs +0 -0
  268. /package/{esm2020 → esm2022}/lib/styles/models/style-size.enum.mjs +0 -0
  269. /package/{esm2020 → esm2022}/lib/types/i18n.type.mjs +0 -0
  270. /package/{esm2020 → esm2022}/lib/types/index.mjs +0 -0
  271. /package/{esm2020 → esm2022}/lib/types/mng-localstorage-config-value.type.mjs +0 -0
  272. /package/{esm2020 → esm2022}/lib/types/type.decorator.mjs +0 -0
  273. /package/{esm2020 → esm2022}/lib/utils/action-data-provider.util.mjs +0 -0
  274. /package/{esm2020 → esm2022}/lib/utils/editor-formly.util.mjs +0 -0
  275. /package/{esm2020 → esm2022}/lib/utils/enum.util.mjs +0 -0
  276. /package/{esm2020 → esm2022}/lib/utils/export.util.mjs +0 -0
  277. /package/{esm2020 → esm2022}/lib/utils/file.util.mjs +0 -0
  278. /package/{esm2020 → esm2022}/lib/utils/i18n.util.mjs +0 -0
  279. /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
  280. /package/{esm2020 → esm2022}/lib/utils/model.util.mjs +0 -0
  281. /package/{esm2020 → esm2022}/lib/utils/notification.util.mjs +0 -0
  282. /package/{esm2020 → esm2022}/lib/utils/object.util.mjs +0 -0
  283. /package/{esm2020 → esm2022}/lib/utils/route.util.mjs +0 -0
  284. /package/{esm2020 → esm2022}/lib/utils/string.util.mjs +0 -0
  285. /package/{esm2020 → esm2022}/lib/validators/field.validator.mjs +0 -0
  286. /package/{esm2020 → esm2022}/lib/validators/index.mjs +0 -0
  287. /package/{esm2020 → esm2022}/mediusinc-mng-commons.mjs +0 -0
@@ -0,0 +1,634 @@
1
+ import { of } from 'rxjs';
2
+ import { ModelDescriptor } from '../';
3
+ import { TableviewActionDefaultCategories } from '../../components/action/models';
4
+ import { DataProvider, EditorDataProvider } from '../../data-providers';
5
+ import { MngErrorInternal } from '../../models';
6
+ import { ButtonStyleBuilder } from '../../styles';
7
+ import { StyleLevelEnum, StyleSizeEnum } from '../../styles/models';
8
+ import { ActionDataProviderUtil, TypeUtil } from '../../utils';
9
+ import { ActionActivationTriggerEnum, ActionEditorSubmitTypeEnum, ActionPositionEnum, ActionTypeEnum } from '../types';
10
+ import { ActionButtonDescriptor } from './action-button.descriptor';
11
+ import { ActionConfirmationDialogDescriptor } from './action-confirmation.descriptor';
12
+ export class ActionDescriptor {
13
+ constructor(model, actionName, parentType, parentProperty) {
14
+ this._type = ActionTypeEnum.Direct;
15
+ this._activationTrigger = ActionActivationTriggerEnum.OnClick;
16
+ this._position = ActionPositionEnum.ToolbarRight;
17
+ this._level = StyleLevelEnum.Default;
18
+ this._routeUrl = null;
19
+ this._hasRunNotificationSuccess = true;
20
+ this._hasRunNotificationError = true;
21
+ //button
22
+ this._button = new ActionButtonDescriptor();
23
+ // multiple row selection
24
+ this._hasItemsSelection = false;
25
+ // subactions
26
+ this._subactionsAsMenu = false;
27
+ this._subactions = [];
28
+ this._model = model;
29
+ this._actionName = actionName;
30
+ if ((parentType && !parentProperty) || (!parentProperty && parentProperty)) {
31
+ throw new MngErrorInternal(`Provide both the parent type and parent property or none: ${parentType}, ${parentProperty}.`, 'ActionDescriptor error').consoleError();
32
+ }
33
+ this._parentType = parentType;
34
+ this._parentTypeName = parentType ? TypeUtil.findTypeName(parentType) : undefined;
35
+ this._parentProperty = parentProperty;
36
+ this.setI18nModelActionBaseKey();
37
+ let displayName = actionName;
38
+ if (this._model)
39
+ displayName = `${this._model.typeName}.${displayName}`;
40
+ if (this._parentTypeName) {
41
+ displayName = `${this._parentTypeName}.${this._parentProperty}_${displayName}`;
42
+ }
43
+ this._actionNameLong = displayName;
44
+ }
45
+ get model() {
46
+ return this._model;
47
+ }
48
+ get parentTypeName() {
49
+ return this._parentTypeName;
50
+ }
51
+ get parentProperty() {
52
+ return this._parentProperty;
53
+ }
54
+ get i18nModelActionBaseKey() {
55
+ return this._i18nModelActionBaseKey;
56
+ }
57
+ get type() {
58
+ return this._type;
59
+ }
60
+ get activationTrigger() {
61
+ return this._activationTrigger;
62
+ }
63
+ get position() {
64
+ return this._position;
65
+ }
66
+ get level() {
67
+ return this._level;
68
+ }
69
+ get routeUrl() {
70
+ return this._routeUrl;
71
+ }
72
+ get dataProvider() {
73
+ return this._dataProvider;
74
+ }
75
+ get hasRunFunction() {
76
+ return typeof this._runFunction === 'function';
77
+ }
78
+ get runFunction() {
79
+ if (!this._runFunction) {
80
+ throw new MngErrorInternal('Run function is not defined and cannot be invoked', 'ActionDescriptor error').consoleError();
81
+ }
82
+ return this._runFunction;
83
+ }
84
+ get isVisibleFunction() {
85
+ return this._isVisibleFunction;
86
+ }
87
+ get isEnabledFunction() {
88
+ return this._isEnabledFunction;
89
+ }
90
+ get actionName() {
91
+ return this._actionName;
92
+ }
93
+ get actionNameLong() {
94
+ return this._actionNameLong;
95
+ }
96
+ get className() {
97
+ return this.button.styleClass.customClass;
98
+ }
99
+ get runConfirmationDialogDescriptor() {
100
+ return this._runConfirmationDialogDescriptor;
101
+ }
102
+ get hasRunConfirmation() {
103
+ return this._runConfirmationDialogDescriptor !== null && this._runConfirmationDialogDescriptor !== undefined;
104
+ }
105
+ get hasRunNotificationSuccess() {
106
+ return this._hasRunNotificationSuccess;
107
+ }
108
+ get runNotificationSuccessTitle() {
109
+ return this._runNotificationSuccessTitle;
110
+ }
111
+ get runNotificationSuccessMessage() {
112
+ return this._runNotificationSuccessMessage;
113
+ }
114
+ get hasRunNotificationError() {
115
+ return this._hasRunNotificationError;
116
+ }
117
+ get runNotificationErrorTitle() {
118
+ return this._runNotificationErrorTitle;
119
+ }
120
+ get runNotificationErrorMessage() {
121
+ return this._runNotificationErrorMessage;
122
+ }
123
+ get afterRunAction() {
124
+ return this._afterRunAction;
125
+ }
126
+ get onRunErrorAction() {
127
+ return this._onRunErrorAction;
128
+ }
129
+ get permissions() {
130
+ return this._permissions;
131
+ }
132
+ get tableviewCategory() {
133
+ return this._tableviewCategory;
134
+ }
135
+ get hasItemsSelection() {
136
+ return this._hasItemsSelection;
137
+ }
138
+ get button() {
139
+ return this._button;
140
+ }
141
+ get component() {
142
+ return this._component;
143
+ }
144
+ get positionTableviewCategories() {
145
+ return this._positionTableviewCategories;
146
+ }
147
+ get subactionsAsMenu() {
148
+ return this._subactionsAsMenu;
149
+ }
150
+ get subactions() {
151
+ return this._subactions;
152
+ }
153
+ setI18nModelActionBaseKey(base) {
154
+ if (this._parentTypeName || this._model) {
155
+ this._i18nModelActionBaseKey = this._parentTypeName
156
+ ? `${this._parentTypeName}.actions.${this._parentProperty}_${this._actionName}`
157
+ : `${base ?? this._model.i18nBaseKey}.actions.${this._actionName}`;
158
+ }
159
+ }
160
+ withDataProvider(dataProvider) {
161
+ this._dataProvider = dataProvider;
162
+ return this;
163
+ }
164
+ withServiceType(serviceType) {
165
+ if (!this._model) {
166
+ throw new MngErrorInternal(`Cannot set data provider if no model type is provided for action ${this._actionName}`, 'ActionDescriptor error').consoleError();
167
+ }
168
+ this._dataProvider = new DataProvider(this._model.type, serviceType);
169
+ return this;
170
+ }
171
+ withRunFunction(fn) {
172
+ this._runFunction = fn;
173
+ return this;
174
+ }
175
+ withIsVisibleFunction(fn) {
176
+ this._isVisibleFunction = fn;
177
+ return this;
178
+ }
179
+ withIsEnabledFunction(fn) {
180
+ this._isEnabledFunction = fn;
181
+ return this;
182
+ }
183
+ withRouteTrigger(routeUrl) {
184
+ this._activationTrigger = ActionActivationTriggerEnum.OnRoute;
185
+ this._routeUrl = routeUrl;
186
+ return this;
187
+ }
188
+ withPosition(position) {
189
+ this._position = position;
190
+ return this;
191
+ }
192
+ /**
193
+ * creates confirmation action with default style based on action descriptor
194
+ */
195
+ withRunConfirmation() {
196
+ this._runConfirmationDialogDescriptor = new ActionConfirmationDialogDescriptor();
197
+ this._runConfirmationDialogDescriptor.acceptButton.styleClass.withActionLevel(this._level);
198
+ this._runConfirmationDialogDescriptor.rejectButton?.styleClass.withActionLevel(this._level);
199
+ return this._runConfirmationDialogDescriptor;
200
+ }
201
+ /**
202
+ * Add a configuration dialogue to action using ActionConfigurationDescriptor
203
+ * @param runConfirmationDialogDescriptor descriptor with customizable information for dialog
204
+ */
205
+ withRunConfirmationDescriptor(runConfirmationDialogDescriptor) {
206
+ this._runConfirmationDialogDescriptor = runConfirmationDialogDescriptor;
207
+ return this;
208
+ }
209
+ withRunNotificationSuccess(title, message, hasNotification = true) {
210
+ this._hasRunNotificationSuccess = hasNotification;
211
+ this._runNotificationSuccessTitle = title;
212
+ this._runNotificationSuccessMessage = message;
213
+ return this;
214
+ }
215
+ withRunNotificationError(title, message, hasNotification = true) {
216
+ this._hasRunNotificationError = hasNotification;
217
+ this._runNotificationErrorTitle = title;
218
+ this._runNotificationErrorMessage = message;
219
+ return this;
220
+ }
221
+ withAfterRunAction(action) {
222
+ this._afterRunAction = action;
223
+ return this;
224
+ }
225
+ withOnRunErrorAction(action) {
226
+ this._onRunErrorAction = action;
227
+ return this;
228
+ }
229
+ withPermissions(permissions) {
230
+ if (this._tableviewCategory) {
231
+ console.warn(`Permissions set on action ${this._actionNameLong} with route type '${this._tableviewCategory}' will be omitted in route guard validation.`);
232
+ }
233
+ this._permissions = permissions;
234
+ return this;
235
+ }
236
+ withTableviewCategory(permissionsRouteType) {
237
+ this._tableviewCategory = permissionsRouteType;
238
+ return this;
239
+ }
240
+ withButtonDescriptor(button) {
241
+ this._button = button;
242
+ return this;
243
+ }
244
+ withButton(label, icon = null, styleLevel = StyleLevelEnum.Default, styleText = false) {
245
+ this._button = new ActionButtonDescriptor().withLabel(label).withIcon(icon).withStyleClass(new ButtonStyleBuilder(styleLevel).withTextButton(styleText));
246
+ return this;
247
+ }
248
+ withItemsSelection(hasSelection = true) {
249
+ this._hasItemsSelection = hasSelection;
250
+ this._isEnabledFunction = this._isEnabledFunction ?? (ctx => of((ctx.parameters.selectedItems?.length ?? 0) > 0));
251
+ return this;
252
+ }
253
+ withComponent(component) {
254
+ this._component = component;
255
+ return this;
256
+ }
257
+ withPositionTableviewCategories(positionTableviewCategories) {
258
+ this._positionTableviewCategories = positionTableviewCategories;
259
+ return this;
260
+ }
261
+ withI18nBase(base) {
262
+ if (typeof base !== 'string') {
263
+ base = TypeUtil.findTypeName(base);
264
+ }
265
+ this.setI18nModelActionBaseKey(base);
266
+ return this;
267
+ }
268
+ withSubactionsAsMenu() {
269
+ this._subactionsAsMenu = true;
270
+ return this;
271
+ }
272
+ withSubactions(...subactions) {
273
+ this._subactions.push(...subactions);
274
+ return this;
275
+ }
276
+ copyTo(descriptor) {
277
+ descriptor._i18nModelActionBaseKey = this._i18nModelActionBaseKey;
278
+ descriptor._type = this._type;
279
+ descriptor._activationTrigger = this._activationTrigger;
280
+ descriptor._position = this._position;
281
+ descriptor._level = this._level;
282
+ descriptor._positionTableviewCategories = this._positionTableviewCategories;
283
+ descriptor._tableviewCategory = this._tableviewCategory;
284
+ descriptor._routeUrl = this._routeUrl;
285
+ descriptor._dataProvider = this._dataProvider;
286
+ descriptor._runFunction = this._runFunction;
287
+ descriptor._isVisibleFunction = this._isVisibleFunction;
288
+ descriptor._isEnabledFunction = this._isEnabledFunction;
289
+ descriptor._runConfirmationDialogDescriptor = this._runConfirmationDialogDescriptor;
290
+ descriptor._hasRunNotificationSuccess = this._hasRunNotificationSuccess;
291
+ descriptor._runNotificationSuccessTitle = this._runNotificationSuccessTitle;
292
+ descriptor._runNotificationSuccessMessage = this._runNotificationSuccessMessage;
293
+ descriptor._hasRunNotificationError = this._hasRunNotificationError;
294
+ descriptor._runNotificationErrorTitle = this._runNotificationErrorTitle;
295
+ descriptor._runNotificationErrorMessage = this._runNotificationErrorMessage;
296
+ descriptor._afterRunAction = this._afterRunAction;
297
+ descriptor._onRunErrorAction = this._onRunErrorAction;
298
+ descriptor._permissions = this._permissions;
299
+ descriptor._button = this._button.copy();
300
+ descriptor._hasItemsSelection = this._hasItemsSelection;
301
+ descriptor._component = this._component;
302
+ descriptor._subactionsAsMenu = this._subactionsAsMenu;
303
+ descriptor._subactions = this._subactions;
304
+ return descriptor;
305
+ }
306
+ }
307
+ export class ActionSimpleDescriptor extends ActionDescriptor {
308
+ constructor(actionName, modelType, idProperty, titleProperty, i18nBaseKey) {
309
+ const model = modelType ? new ModelDescriptor(modelType, idProperty, titleProperty, i18nBaseKey) : null;
310
+ super(model, actionName);
311
+ }
312
+ }
313
+ export class ActionEditorDescriptor extends ActionDescriptor {
314
+ constructor(editorDescriptor, actionName, parentType, parentProperty) {
315
+ super(editorDescriptor.model, actionName, parentType, parentProperty);
316
+ this._editorActions = [];
317
+ this._editorTitle = undefined;
318
+ this._editorTitleParams = undefined;
319
+ this._hasFetchNotificationSuccess = false;
320
+ this._dialogSize = StyleSizeEnum.Normal;
321
+ this._dataProvider = undefined;
322
+ this._resubmitRefetch = true;
323
+ this._type = ActionTypeEnum.Editor;
324
+ this._editorDescriptor = editorDescriptor;
325
+ this._editorActions.push(ActionEditorSubmitDescriptor.forPrimary(this), ActionEditorSubmitDescriptor.forSecondary(this));
326
+ }
327
+ get editorTitle() {
328
+ return this._editorTitle;
329
+ }
330
+ get editorTitleParams() {
331
+ return this._editorTitleParams;
332
+ }
333
+ get editorDescriptor() {
334
+ return this._editorDescriptor;
335
+ }
336
+ get dialogSize() {
337
+ return this._dialogSize;
338
+ }
339
+ get dialogClassName() {
340
+ return this._dialogClassName;
341
+ }
342
+ get hasFetchNotificationSuccess() {
343
+ return this._hasFetchNotificationSuccess;
344
+ }
345
+ get fetchNotificationSuccessTitle() {
346
+ return this._fetchNotificationSuccessTitle;
347
+ }
348
+ get fetchNotificationSuccessMessage() {
349
+ return this._fetchNotificationSuccessMessage;
350
+ }
351
+ get dataProvider() {
352
+ return this._dataProvider;
353
+ }
354
+ get runFunction() {
355
+ throw new MngErrorInternal('Run function cannot be used in editor action. Use submit function instead!', 'ActionDescriptor error').consoleError();
356
+ }
357
+ get fetchFunction() {
358
+ return this._fetchFunction;
359
+ }
360
+ get submitFunction() {
361
+ return this._submitFunction;
362
+ }
363
+ get editorActions() {
364
+ return this._editorActions;
365
+ }
366
+ get editorComponent() {
367
+ return this._editorComponent;
368
+ }
369
+ get resubmitEnabled() {
370
+ return this._resubmitEnabled;
371
+ }
372
+ get resubmitRefetch() {
373
+ return this._resubmitRefetch;
374
+ }
375
+ withEditorTitle(title, params) {
376
+ this._editorTitle = title;
377
+ this._editorTitleParams = params;
378
+ return this;
379
+ }
380
+ withDataProvider(dataProvider) {
381
+ this._dataProvider = dataProvider;
382
+ return this;
383
+ }
384
+ withServiceType(serviceType) {
385
+ if (!this._model) {
386
+ throw new MngErrorInternal(`Cannot set data provider if no model type is provided for action ${this._actionName}`, 'ActionDescriptor error').consoleError();
387
+ }
388
+ this._dataProvider = new EditorDataProvider(this._model.type, serviceType);
389
+ return this;
390
+ }
391
+ withDialogSize(size = StyleSizeEnum.Normal) {
392
+ this._dialogSize = size;
393
+ return this;
394
+ }
395
+ withDialogClassName(className) {
396
+ this._dialogClassName = className;
397
+ return this;
398
+ }
399
+ withRunFunction(fn) {
400
+ return this.withSubmitFunction(fn);
401
+ }
402
+ withFetchFunction(fn) {
403
+ this._fetchFunction = fn;
404
+ return this;
405
+ }
406
+ withSubmitFunction(fn) {
407
+ this._submitFunction = fn;
408
+ return this;
409
+ }
410
+ withFetchNotificationError(title, message, hasNotification = true) {
411
+ this._hasFetchNotificationSuccess = hasNotification;
412
+ this._fetchNotificationSuccessTitle = title;
413
+ this._fetchNotificationSuccessMessage = message;
414
+ return this;
415
+ }
416
+ withEditorAction(action) {
417
+ this._editorActions.push(action);
418
+ return this;
419
+ }
420
+ withEditorActions(actions) {
421
+ this._editorActions = actions;
422
+ return this;
423
+ }
424
+ withEditorComponent(editorComponent) {
425
+ this._editorComponent = editorComponent;
426
+ return this;
427
+ }
428
+ withResubmit(enabled, refetch = true) {
429
+ this._resubmitEnabled = enabled;
430
+ this._resubmitRefetch = refetch;
431
+ return this;
432
+ }
433
+ }
434
+ export class ActionEditorSubmitDescriptor extends ActionDescriptor {
435
+ constructor(editorAction, submitType = ActionEditorSubmitTypeEnum.Submit) {
436
+ super(editorAction.model, submitType === ActionEditorSubmitTypeEnum.Submit ? `${editorAction.actionName}.submit` : `${editorAction.actionName}.cancel`);
437
+ this._editorAction = editorAction;
438
+ this._submitType = submitType;
439
+ this._position = ActionPositionEnum.FooterRight;
440
+ this.button.styleClass.withActionLevel(editorAction.level).withTextButton();
441
+ }
442
+ /**
443
+ * creates primary action with primary button style
444
+ * @param editorAction
445
+ * @param submitType
446
+ */
447
+ static forPrimary(editorAction, submitType = ActionEditorSubmitTypeEnum.Submit) {
448
+ return new ActionEditorSubmitDescriptor(editorAction, submitType).withButtonDescriptor(new ActionButtonDescriptor().withStyleClass(new ButtonStyleBuilder()));
449
+ }
450
+ /**
451
+ * creates secondary button with text button style
452
+ * @param editorAction
453
+ * @param submitType
454
+ */
455
+ static forSecondary(editorAction, submitType = ActionEditorSubmitTypeEnum.Cancel) {
456
+ return new ActionEditorSubmitDescriptor(editorAction, submitType).withButtonDescriptor(new ActionButtonDescriptor().withStyleClass(new ButtonStyleBuilder().withTextButton()));
457
+ }
458
+ get submitType() {
459
+ return this._submitType;
460
+ }
461
+ }
462
+ export class ActionEditorDetailsDescriptor extends ActionEditorDescriptor {
463
+ static { this.ACTION_NAME = 'details'; }
464
+ constructor(editorDescriptor) {
465
+ super(editorDescriptor, ActionEditorDetailsDescriptor.ACTION_NAME);
466
+ this.withPosition(ActionPositionEnum.RowClick);
467
+ this.withRouteTrigger(':itemId');
468
+ this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
469
+ this.withEditorActions([new ActionEditorSubmitDescriptor(this, ActionEditorSubmitTypeEnum.Cancel)]);
470
+ this.withTableviewCategory(TableviewActionDefaultCategories.DETAILS);
471
+ }
472
+ withServiceType(serviceType) {
473
+ return this.withServiceFetchFunction(serviceType);
474
+ }
475
+ withServiceFetchFunction(serviceType, fetchFn) {
476
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
477
+ if (fetchFn) {
478
+ dataProvider.withFetch(fetchFn);
479
+ }
480
+ this._dataProvider = dataProvider;
481
+ return this;
482
+ }
483
+ }
484
+ export class ActionEditorAddDescriptor extends ActionEditorDescriptor {
485
+ static { this.ACTION_NAME = 'add'; }
486
+ constructor(editorDescriptor) {
487
+ super(editorDescriptor, ActionEditorAddDescriptor.ACTION_NAME);
488
+ this.withPosition(ActionPositionEnum.ToolbarLeft);
489
+ this.withRouteTrigger('add');
490
+ this.withSubmitFunction(ActionDataProviderUtil.runCreateOrFail);
491
+ this.button.withIcon('pi pi-plus');
492
+ this.withTableviewCategory(TableviewActionDefaultCategories.ADD);
493
+ }
494
+ withServiceType(serviceType) {
495
+ return this.withServiceSubmitFunction(serviceType);
496
+ }
497
+ withServiceSubmitFunction(serviceType, createFn, fetchFn) {
498
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
499
+ if (createFn) {
500
+ dataProvider.withCreate(createFn);
501
+ }
502
+ if (fetchFn) {
503
+ dataProvider.withFetch(fetchFn);
504
+ }
505
+ this._dataProvider = dataProvider;
506
+ return this;
507
+ }
508
+ }
509
+ export class ActionEditorEditDescriptor extends ActionEditorDescriptor {
510
+ static { this.ACTION_NAME = 'edit'; }
511
+ constructor(editorDescriptor) {
512
+ super(editorDescriptor, ActionEditorEditDescriptor.ACTION_NAME);
513
+ this.withPosition(ActionPositionEnum.RowInline);
514
+ this.button.styleClass.withSize(StyleSizeEnum.Small);
515
+ this.withRouteTrigger(':itemId/edit');
516
+ this.withFetchFunction(ActionDataProviderUtil.runFetchOrFail);
517
+ this.withSubmitFunction(ActionDataProviderUtil.runUpdateOrFail);
518
+ this.withTableviewCategory(TableviewActionDefaultCategories.EDIT);
519
+ this.button.withLabel(null).withIcon('pi pi-pencil');
520
+ }
521
+ withServiceType(serviceType) {
522
+ return this.withServiceSubmitFunction(serviceType);
523
+ }
524
+ withServiceSubmitFunction(serviceType, updateFn, fetchFn) {
525
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
526
+ if (updateFn) {
527
+ dataProvider.withUpdate(updateFn);
528
+ }
529
+ if (fetchFn) {
530
+ dataProvider.withFetch(fetchFn);
531
+ }
532
+ this._dataProvider = dataProvider;
533
+ return this;
534
+ }
535
+ }
536
+ export class ActionDeleteDescriptor extends ActionDescriptor {
537
+ static { this.ACTION_NAME = 'delete'; }
538
+ constructor(model) {
539
+ super(model, ActionDeleteDescriptor.ACTION_NAME);
540
+ this.withPosition(ActionPositionEnum.RowInline);
541
+ this.button.styleClass.withSize(StyleSizeEnum.Small);
542
+ this.withRunFunction(ActionDataProviderUtil.runDeleteOrFail);
543
+ this.button.styleClass.withActionLevel(StyleLevelEnum.Danger);
544
+ this.withRunConfirmation();
545
+ this.withTableviewCategory(TableviewActionDefaultCategories.DELETE);
546
+ this.button.withLabel(null).withIcon('pi pi-trash');
547
+ }
548
+ withServiceType(serviceType) {
549
+ return this.withServiceDeleteFunction(serviceType);
550
+ }
551
+ withServiceDeleteFunction(serviceType, deleteFn) {
552
+ const dataProvider = new EditorDataProvider(this._model.type, serviceType);
553
+ if (deleteFn) {
554
+ dataProvider.withDelete(deleteFn);
555
+ }
556
+ this._dataProvider = dataProvider;
557
+ return this;
558
+ }
559
+ }
560
+ export class ActionLinkDescriptor extends ActionDescriptor {
561
+ constructor(model = null, actionName = 'link') {
562
+ super(model, actionName);
563
+ this._url = '';
564
+ this._pathSegments = [];
565
+ this._replaceUrl = false;
566
+ this._target = '_self';
567
+ this._isStyleLink = false;
568
+ }
569
+ static fromActionDescriptor(actionDescriptor) {
570
+ const descriptor = new ActionLinkDescriptor(actionDescriptor.model, actionDescriptor.actionName);
571
+ actionDescriptor.copyTo(descriptor);
572
+ descriptor._dataProvider = undefined;
573
+ descriptor._runConfirmationDialogDescriptor = undefined;
574
+ descriptor._hasRunNotificationSuccess = false;
575
+ descriptor._runNotificationSuccessTitle = undefined;
576
+ descriptor._runNotificationSuccessMessage = undefined;
577
+ descriptor._hasRunNotificationError = false;
578
+ descriptor._runNotificationErrorTitle = undefined;
579
+ descriptor._runNotificationErrorMessage = undefined;
580
+ descriptor._afterRunAction = undefined;
581
+ descriptor._onRunErrorAction = undefined;
582
+ descriptor._hasItemsSelection = false;
583
+ descriptor._subactionsAsMenu = false;
584
+ descriptor._subactions = [];
585
+ return descriptor;
586
+ }
587
+ get url() {
588
+ return this._url;
589
+ }
590
+ get pathSegments() {
591
+ return this._pathSegments;
592
+ }
593
+ get queryParams() {
594
+ return this._queryParams;
595
+ }
596
+ get queryParamsHandling() {
597
+ return this._queryParamsHandling;
598
+ }
599
+ get replaceUrl() {
600
+ return this._replaceUrl;
601
+ }
602
+ get target() {
603
+ return this._target;
604
+ }
605
+ get isStyleLink() {
606
+ return this._isStyleLink;
607
+ }
608
+ withHref(url) {
609
+ this._url = url;
610
+ return this;
611
+ }
612
+ withRouterLink(...pathSegments) {
613
+ this._pathSegments = pathSegments;
614
+ return this;
615
+ }
616
+ withQueryParams(queryParams, queryParamsHandling) {
617
+ this._queryParams = queryParams;
618
+ this._queryParamsHandling = queryParamsHandling;
619
+ return this;
620
+ }
621
+ withReplaceUrl(replaceUrl = false) {
622
+ this._replaceUrl = replaceUrl;
623
+ return this;
624
+ }
625
+ withTarget(target = '_self') {
626
+ this._target = target;
627
+ return this;
628
+ }
629
+ withStyleLink(isStyleLink) {
630
+ this._isStyleLink = isStyleLink;
631
+ return this;
632
+ }
633
+ }
634
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2FjdGlvbi9hY3Rpb24uZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxLQUFLLENBQUM7QUFDcEMsT0FBTyxFQUEyRCxnQ0FBZ0MsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQzFJLE9BQU8sRUFBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQXFDLE1BQU0sc0JBQXNCLENBQUM7QUFDMUcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTlDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFFLGFBQWEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRWxFLE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0QsT0FBTyxFQUFDLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNySCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRixNQUFNLE9BQU8sZ0JBQWdCO0lBcUR6QixZQUFZLEtBQWdDLEVBQUUsVUFBa0IsRUFBRSxVQUErQixFQUFFLGNBQXVCO1FBM0NoSCxVQUFLLEdBQW1CLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDOUMsdUJBQWtCLEdBQWdDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQztRQUN0RixjQUFTLEdBQXVCLGtCQUFrQixDQUFDLFlBQVksQ0FBQztRQUNoRSxX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LENBQUM7SUFFTSxhQUFhLENBQUMsV0FBb0I7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UGFyYW1zLCBRdWVyeVBhcmFtc0hhbmRsaW5nfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtNb2RlbERlc2NyaXB0b3J9IGZyb20gJy4uLyc7XG5pbXBvcnQge0FjdGlvbkNvbnRleHQsIEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uLCBJQWN0aW9uQ29tcG9uZW50LCBUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllc30gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7RGF0YVByb3ZpZGVyLCBFZGl0b3JEYXRhUHJvdmlkZXIsIElEYXRhUHJvdmlkZXIsIElFZGl0b3JEYXRhUHJvdmlkZXJ9IGZyb20gJy4uLy4uL2RhdGEtcHJvdmlkZXJzJztcbmltcG9ydCB7TW5nRXJyb3JJbnRlcm5hbH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7QVBlcm1pc3Npb25zfSBmcm9tICcuLi8uLi9zZWN1cml0eS9tb2RlbCc7XG5pbXBvcnQge0J1dHRvblN0eWxlQnVpbGRlcn0gZnJvbSAnLi4vLi4vc3R5bGVzJztcbmltcG9ydCB7U3R5bGVMZXZlbEVudW0sIFN0eWxlU2l6ZUVudW19IGZyb20gJy4uLy4uL3N0eWxlcy9tb2RlbHMnO1xuaW1wb3J0IHtDbGFzc1R5cGUsIElkVHlwZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLCBUeXBlVXRpbH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9yfSBmcm9tICcuLi9lZGl0b3InO1xuaW1wb3J0IHtBY3Rpb25BY3RpdmF0aW9uVHJpZ2dlckVudW0sIEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLCBBY3Rpb25Qb3NpdGlvbkVudW0sIEFjdGlvblR5cGVFbnVtfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0FjdGlvbkJ1dHRvbkRlc2NyaXB0b3J9IGZyb20gJy4vYWN0aW9uLWJ1dHRvbi5kZXNjcmlwdG9yJztcbmltcG9ydCB7QWN0aW9uQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvcn0gZnJvbSAnLi9hY3Rpb24tY29uZmlybWF0aW9uLmRlc2NyaXB0b3InO1xuXG5leHBvcnQgY2xhc3MgQWN0aW9uRGVzY3JpcHRvcjxUPiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9tb2RlbDogTW9kZWxEZXNjcmlwdG9yPFQ+IHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2FjdGlvbk5hbWU6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2FjdGlvbk5hbWVMb25nOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wYXJlbnRUeXBlPzogQ2xhc3NUeXBlPHVua25vd24+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfcGFyZW50VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9wYXJlbnRQcm9wZXJ0eT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfaTE4bk1vZGVsQWN0aW9uQmFzZUtleT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfdHlwZTogQWN0aW9uVHlwZUVudW0gPSBBY3Rpb25UeXBlRW51bS5EaXJlY3Q7XG4gICAgcHJvdGVjdGVkIF9hY3RpdmF0aW9uVHJpZ2dlcjogQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtID0gQWN0aW9uQWN0aXZhdGlvblRyaWdnZXJFbnVtLk9uQ2xpY2s7XG4gICAgcHJvdGVjdGVkIF9wb3NpdGlvbjogQWN0aW9uUG9zaXRpb25FbnVtID0gQWN0aW9uUG9zaXRpb25FbnVtLlRvb2xiYXJSaWdodDtcbiAgICBwcm90ZWN0ZWQgX2xldmVsOiBTdHlsZUxldmVsRW51bSA9IFN0eWxlTGV2ZWxFbnVtLkRlZmF1bHQ7XG4gICAgcHJpdmF0ZSBfcG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzPzogc3RyaW5nW107XG4gICAgcHJvdGVjdGVkIF90YWJsZXZpZXdDYXRlZ29yeT86IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBfcm91dGVVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJvdGVjdGVkIF9kYXRhUHJvdmlkZXI/OiBJRGF0YVByb3ZpZGVyPFQsIGFueT47XG4gICAgcHJvdGVjdGVkIF9ydW5GdW5jdGlvbj86IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgYW55PikgPT4gT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkIHwgbnVsbD47XG4gICAgcHJvdGVjdGVkIF9pc1Zpc2libGVGdW5jdGlvbj86IChjdHg6IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPFQsIGFueT4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgcHJvdGVjdGVkIF9pc0VuYWJsZWRGdW5jdGlvbj86IChjdHg6IEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPFQsIGFueT4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBwcm90ZWN0ZWQgX3J1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I/OiBBY3Rpb25Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yPFQ+O1xuXG4gICAgcHJvdGVjdGVkIF9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzID0gdHJ1ZTtcbiAgICBwcm90ZWN0ZWQgX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZT86IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlPzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9oYXNSdW5Ob3RpZmljYXRpb25FcnJvciA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9ydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlPzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcnVuTm90aWZpY2F0aW9uRXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9hZnRlclJ1bkFjdGlvbj86IEFjdGlvbkRlc2NyaXB0b3I8dW5rbm93bj47XG4gICAgcHJvdGVjdGVkIF9vblJ1bkVycm9yQWN0aW9uPzogQWN0aW9uRGVzY3JpcHRvcjxUPjtcblxuICAgIC8vIHNlY3VyaXR5XG4gICAgcHJvdGVjdGVkIF9wZXJtaXNzaW9ucz86IEFQZXJtaXNzaW9ucztcblxuICAgIC8vYnV0dG9uXG4gICAgcHJvdGVjdGVkIF9idXR0b24gPSBuZXcgQWN0aW9uQnV0dG9uRGVzY3JpcHRvcigpO1xuXG4gICAgLy8gbXVsdGlwbGUgcm93IHNlbGVjdGlvblxuICAgIHByb3RlY3RlZCBfaGFzSXRlbXNTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgIC8vIGN1c3RvbSBhY3Rpb24gY29tcG9uZW50XG4gICAgcHJvdGVjdGVkIF9jb21wb25lbnQ/OiBUeXBlPElBY3Rpb25Db21wb25lbnQ8VD4+O1xuXG4gICAgLy8gc3ViYWN0aW9uc1xuICAgIHByb3RlY3RlZCBfc3ViYWN0aW9uc0FzTWVudSA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfc3ViYWN0aW9uczogQXJyYXk8QWN0aW9uRGVzY3JpcHRvcjxUPj4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKG1vZGVsOiBNb2RlbERlc2NyaXB0b3I8VD4gfCBudWxsLCBhY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmVudFR5cGU/OiBDbGFzc1R5cGU8dW5rbm93bj4sIHBhcmVudFByb3BlcnR5Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgICAgIHRoaXMuX2FjdGlvbk5hbWUgPSBhY3Rpb25OYW1lO1xuXG4gICAgICAgIGlmICgocGFyZW50VHlwZSAmJiAhcGFyZW50UHJvcGVydHkpIHx8ICghcGFyZW50UHJvcGVydHkgJiYgcGFyZW50UHJvcGVydHkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTW5nRXJyb3JJbnRlcm5hbChgUHJvdmlkZSBib3RoIHRoZSBwYXJlbnQgdHlwZSBhbmQgcGFyZW50IHByb3BlcnR5IG9yIG5vbmU6ICR7cGFyZW50VHlwZX0sICR7cGFyZW50UHJvcGVydHl9LmAsICdBY3Rpb25EZXNjcmlwdG9yIGVycm9yJykuY29uc29sZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGFyZW50VHlwZSA9IHBhcmVudFR5cGU7XG4gICAgICAgIHRoaXMuX3BhcmVudFR5cGVOYW1lID0gcGFyZW50VHlwZSA/IFR5cGVVdGlsLmZpbmRUeXBlTmFtZShwYXJlbnRUeXBlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fcGFyZW50UHJvcGVydHkgPSBwYXJlbnRQcm9wZXJ0eTtcblxuICAgICAgICB0aGlzLnNldEkxOG5Nb2RlbEFjdGlvbkJhc2VLZXkoKTtcblxuICAgICAgICBsZXQgZGlzcGxheU5hbWUgPSBhY3Rpb25OYW1lO1xuICAgICAgICBpZiAodGhpcy5fbW9kZWwpIGRpc3BsYXlOYW1lID0gYCR7dGhpcy5fbW9kZWwudHlwZU5hbWV9LiR7ZGlzcGxheU5hbWV9YDtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGVOYW1lKSB7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGAke3RoaXMuX3BhcmVudFR5cGVOYW1lfS4ke3RoaXMuX3BhcmVudFByb3BlcnR5fV8ke2Rpc3BsYXlOYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWN0aW9uTmFtZUxvbmcgPSBkaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXJlbnRUeXBlTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFR5cGVOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyZW50UHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGkxOG5Nb2RlbEFjdGlvbkJhc2VLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pMThuTW9kZWxBY3Rpb25CYXNlS2V5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3RpdmF0aW9uVHJpZ2dlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2YXRpb25UcmlnZ2VyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxldmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3V0ZVVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlVXJsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzUnVuRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fcnVuRnVuY3Rpb24gPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5GdW5jdGlvbigpOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIGFueT4pID0+IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZCB8IG51bGw+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9ydW5GdW5jdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1uZ0Vycm9ySW50ZXJuYWwoJ1J1biBmdW5jdGlvbiBpcyBub3QgZGVmaW5lZCBhbmQgY2Fubm90IGJlIGludm9rZWQnLCAnQWN0aW9uRGVzY3JpcHRvciBlcnJvcicpLmNvbnNvbGVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5GdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlzVmlzaWJsZUZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlRnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0VuYWJsZWRGdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRW5hYmxlZEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aW9uTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3Rpb25OYW1lTG9uZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGlvbk5hbWVMb25nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idXR0b24uc3R5bGVDbGFzcy5jdXN0b21DbGFzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzUnVuQ29uZmlybWF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvciAhPT0gbnVsbCAmJiB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzUnVuTm90aWZpY2F0aW9uU3VjY2VzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJ1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYXNSdW5Ob3RpZmljYXRpb25FcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yVGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Ob3RpZmljYXRpb25FcnJvck1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhZnRlclJ1bkFjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyUnVuQWN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb25SdW5FcnJvckFjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uUnVuRXJyb3JBY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwZXJtaXNzaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFibGV2aWV3Q2F0ZWdvcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90YWJsZXZpZXdDYXRlZ29yeTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0l0ZW1zU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzSXRlbXNTZWxlY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBidXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idXR0b247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvblRhYmxldmlld0NhdGVnb3JpZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzdWJhY3Rpb25zQXNNZW51KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3ViYWN0aW9uc0FzTWVudTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1YmFjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJhY3Rpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRJMThuTW9kZWxBY3Rpb25CYXNlS2V5KGJhc2U/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudFR5cGVOYW1lIHx8IHRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLl9pMThuTW9kZWxBY3Rpb25CYXNlS2V5ID0gdGhpcy5fcGFyZW50VHlwZU5hbWVcbiAgICAgICAgICAgICAgICA/IGAke3RoaXMuX3BhcmVudFR5cGVOYW1lfS5hY3Rpb25zLiR7dGhpcy5fcGFyZW50UHJvcGVydHl9XyR7dGhpcy5fYWN0aW9uTmFtZX1gXG4gICAgICAgICAgICAgICAgOiBgJHtiYXNlID8/IHRoaXMuX21vZGVsIS5pMThuQmFzZUtleX0uYWN0aW9ucy4ke3RoaXMuX2FjdGlvbk5hbWV9YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSURhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTW5nRXJyb3JJbnRlcm5hbChgQ2Fubm90IHNldCBkYXRhIHByb3ZpZGVyIGlmIG5vIG1vZGVsIHR5cGUgaXMgcHJvdmlkZWQgZm9yIGFjdGlvbiAke3RoaXMuX2FjdGlvbk5hbWV9YCwgJ0FjdGlvbkRlc2NyaXB0b3IgZXJyb3InKS5jb25zb2xlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBuZXcgRGF0YVByb3ZpZGVyKHRoaXMuX21vZGVsLnR5cGUsIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSdW5GdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dDxULCBTPikgPT4gT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkIHwgbnVsbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcnVuRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJc1Zpc2libGVGdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248VCwgUz4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNWaXNpYmxlRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhJc0VuYWJsZWRGdW5jdGlvbjxTPihmbjogKGN0eDogQWN0aW9uQ29udGV4dFZhbGlkYXRpb248VCwgUz4pID0+IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5faXNFbmFibGVkRnVuY3Rpb24gPSBmbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSb3V0ZVRyaWdnZXIocm91dGVVcmw6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9hY3RpdmF0aW9uVHJpZ2dlciA9IEFjdGlvbkFjdGl2YXRpb25UcmlnZ2VyRW51bS5PblJvdXRlO1xuICAgICAgICB0aGlzLl9yb3V0ZVVybCA9IHJvdXRlVXJsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBvc2l0aW9uKHBvc2l0aW9uOiBBY3Rpb25Qb3NpdGlvbkVudW0pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3JlYXRlcyBjb25maXJtYXRpb24gYWN0aW9uIHdpdGggZGVmYXVsdCBzdHlsZSBiYXNlZCBvbiBhY3Rpb24gZGVzY3JpcHRvclxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoUnVuQ29uZmlybWF0aW9uKCk6IEFjdGlvbkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I8VD4ge1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yID0gbmV3IEFjdGlvbkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I8VD4oKTtcbiAgICAgICAgdGhpcy5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvci5hY2NlcHRCdXR0b24uc3R5bGVDbGFzcy53aXRoQWN0aW9uTGV2ZWwodGhpcy5fbGV2ZWwpO1xuICAgICAgICB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yLnJlamVjdEJ1dHRvbj8uc3R5bGVDbGFzcy53aXRoQWN0aW9uTGV2ZWwodGhpcy5fbGV2ZWwpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNvbmZpZ3VyYXRpb24gZGlhbG9ndWUgdG8gYWN0aW9uIHVzaW5nIEFjdGlvbkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIHJ1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3IgZGVzY3JpcHRvciB3aXRoIGN1c3RvbWl6YWJsZSBpbmZvcm1hdGlvbiBmb3IgZGlhbG9nXG4gICAgICovXG4gICAgcHVibGljIHdpdGhSdW5Db25maXJtYXRpb25EZXNjcmlwdG9yKHJ1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I6IEFjdGlvbkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvciA9IHJ1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3I7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUnVuTm90aWZpY2F0aW9uU3VjY2Vzcyh0aXRsZT86IHN0cmluZywgbWVzc2FnZT86IHN0cmluZywgaGFzTm90aWZpY2F0aW9uID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzID0gaGFzTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJ1bk5vdGlmaWNhdGlvbkVycm9yKHRpdGxlPzogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nLCBoYXNOb3RpZmljYXRpb24gPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2hhc1J1bk5vdGlmaWNhdGlvbkVycm9yID0gaGFzTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLl9ydW5Ob3RpZmljYXRpb25FcnJvclRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWZ0ZXJSdW5BY3Rpb248UlQ+KGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxSVD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYWZ0ZXJSdW5BY3Rpb24gPSBhY3Rpb24gYXMgQWN0aW9uRGVzY3JpcHRvcjx1bmtub3duPjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhPblJ1bkVycm9yQWN0aW9uKGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvcjxUPik6IHRoaXMge1xuICAgICAgICB0aGlzLl9vblJ1bkVycm9yQWN0aW9uID0gYWN0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFBlcm1pc3Npb25zKHBlcm1pc3Npb25zOiBBUGVybWlzc2lvbnMpOiB0aGlzIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhYmxldmlld0NhdGVnb3J5KSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFBlcm1pc3Npb25zIHNldCBvbiBhY3Rpb24gJHt0aGlzLl9hY3Rpb25OYW1lTG9uZ30gd2l0aCByb3V0ZSB0eXBlICcke3RoaXMuX3RhYmxldmlld0NhdGVnb3J5fScgd2lsbCBiZSBvbWl0dGVkIGluIHJvdXRlIGd1YXJkIHZhbGlkYXRpb24uYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhUYWJsZXZpZXdDYXRlZ29yeShwZXJtaXNzaW9uc1JvdXRlVHlwZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3RhYmxldmlld0NhdGVnb3J5ID0gcGVybWlzc2lvbnNSb3V0ZVR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQnV0dG9uRGVzY3JpcHRvcihidXR0b246IEFjdGlvbkJ1dHRvbkRlc2NyaXB0b3IpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYnV0dG9uID0gYnV0dG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEJ1dHRvbihsYWJlbD86IHN0cmluZyB8IG51bGwsIGljb246IHN0cmluZyB8IG51bGwgPSBudWxsLCBzdHlsZUxldmVsID0gU3R5bGVMZXZlbEVudW0uRGVmYXVsdCwgc3R5bGVUZXh0ID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fYnV0dG9uID0gbmV3IEFjdGlvbkJ1dHRvbkRlc2NyaXB0b3IoKS53aXRoTGFiZWwobGFiZWwpLndpdGhJY29uKGljb24pLndpdGhTdHlsZUNsYXNzKG5ldyBCdXR0b25TdHlsZUJ1aWxkZXIoc3R5bGVMZXZlbCkud2l0aFRleHRCdXR0b24oc3R5bGVUZXh0KSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoSXRlbXNTZWxlY3Rpb24oaGFzU2VsZWN0aW9uID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNJdGVtc1NlbGVjdGlvbiA9IGhhc1NlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5faXNFbmFibGVkRnVuY3Rpb24gPSB0aGlzLl9pc0VuYWJsZWRGdW5jdGlvbiA/PyAoY3R4ID0+IG9mKChjdHgucGFyYW1ldGVycy5zZWxlY3RlZEl0ZW1zPy5sZW5ndGggPz8gMCkgPiAwKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTxJQWN0aW9uQ29tcG9uZW50PFQ+Pik6IHRoaXMge1xuICAgICAgICB0aGlzLl9jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzKHBvc2l0aW9uVGFibGV2aWV3Q2F0ZWdvcmllczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzID0gcG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEkxOG5CYXNlKGJhc2U6IENsYXNzVHlwZTx1bmtub3duPiB8IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBpZiAodHlwZW9mIGJhc2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBiYXNlID0gVHlwZVV0aWwuZmluZFR5cGVOYW1lKGJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0STE4bk1vZGVsQWN0aW9uQmFzZUtleShiYXNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTdWJhY3Rpb25zQXNNZW51KCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zdWJhY3Rpb25zQXNNZW51ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTdWJhY3Rpb25zKC4uLnN1YmFjdGlvbnM6IEFycmF5PEFjdGlvbkRlc2NyaXB0b3I8VD4+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3N1YmFjdGlvbnMucHVzaCguLi5zdWJhY3Rpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHlUbyhkZXNjcmlwdG9yOiBBY3Rpb25EZXNjcmlwdG9yPFQ+KTogQWN0aW9uRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGRlc2NyaXB0b3IuX2kxOG5Nb2RlbEFjdGlvbkJhc2VLZXkgPSB0aGlzLl9pMThuTW9kZWxBY3Rpb25CYXNlS2V5O1xuICAgICAgICBkZXNjcmlwdG9yLl90eXBlID0gdGhpcy5fdHlwZTtcbiAgICAgICAgZGVzY3JpcHRvci5fYWN0aXZhdGlvblRyaWdnZXIgPSB0aGlzLl9hY3RpdmF0aW9uVHJpZ2dlcjtcbiAgICAgICAgZGVzY3JpcHRvci5fcG9zaXRpb24gPSB0aGlzLl9wb3NpdGlvbjtcbiAgICAgICAgZGVzY3JpcHRvci5fbGV2ZWwgPSB0aGlzLl9sZXZlbDtcbiAgICAgICAgZGVzY3JpcHRvci5fcG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzID0gdGhpcy5fcG9zaXRpb25UYWJsZXZpZXdDYXRlZ29yaWVzO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX3RhYmxldmlld0NhdGVnb3J5ID0gdGhpcy5fdGFibGV2aWV3Q2F0ZWdvcnk7XG4gICAgICAgIGRlc2NyaXB0b3IuX3JvdXRlVXJsID0gdGhpcy5fcm91dGVVcmw7XG4gICAgICAgIGRlc2NyaXB0b3IuX2RhdGFQcm92aWRlciA9IHRoaXMuX2RhdGFQcm92aWRlcjtcblxuICAgICAgICBkZXNjcmlwdG9yLl9ydW5GdW5jdGlvbiA9IHRoaXMuX3J1bkZ1bmN0aW9uO1xuICAgICAgICBkZXNjcmlwdG9yLl9pc1Zpc2libGVGdW5jdGlvbiA9IHRoaXMuX2lzVmlzaWJsZUZ1bmN0aW9uO1xuICAgICAgICBkZXNjcmlwdG9yLl9pc0VuYWJsZWRGdW5jdGlvbiA9IHRoaXMuX2lzRW5hYmxlZEZ1bmN0aW9uO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bkNvbmZpcm1hdGlvbkRpYWxvZ0Rlc2NyaXB0b3IgPSB0aGlzLl9ydW5Db25maXJtYXRpb25EaWFsb2dEZXNjcmlwdG9yO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX2hhc1J1bk5vdGlmaWNhdGlvblN1Y2Nlc3MgPSB0aGlzLl9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzO1xuICAgICAgICBkZXNjcmlwdG9yLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGUgPSB0aGlzLl9ydW5Ob3RpZmljYXRpb25TdWNjZXNzVGl0bGU7XG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlID0gdGhpcy5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2U7XG5cbiAgICAgICAgZGVzY3JpcHRvci5faGFzUnVuTm90aWZpY2F0aW9uRXJyb3IgPSB0aGlzLl9oYXNSdW5Ob3RpZmljYXRpb25FcnJvcjtcbiAgICAgICAgZGVzY3JpcHRvci5fcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZSA9IHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yVGl0bGU7XG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZSA9IHRoaXMuX3J1bk5vdGlmaWNhdGlvbkVycm9yTWVzc2FnZTtcblxuICAgICAgICBkZXNjcmlwdG9yLl9hZnRlclJ1bkFjdGlvbiA9IHRoaXMuX2FmdGVyUnVuQWN0aW9uO1xuICAgICAgICBkZXNjcmlwdG9yLl9vblJ1bkVycm9yQWN0aW9uID0gdGhpcy5fb25SdW5FcnJvckFjdGlvbjtcblxuICAgICAgICBkZXNjcmlwdG9yLl9wZXJtaXNzaW9ucyA9IHRoaXMuX3Blcm1pc3Npb25zO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX2J1dHRvbiA9IHRoaXMuX2J1dHRvbi5jb3B5KCk7XG5cbiAgICAgICAgZGVzY3JpcHRvci5faGFzSXRlbXNTZWxlY3Rpb24gPSB0aGlzLl9oYXNJdGVtc1NlbGVjdGlvbjtcbiAgICAgICAgZGVzY3JpcHRvci5fY29tcG9uZW50ID0gdGhpcy5fY29tcG9uZW50O1xuICAgICAgICBkZXNjcmlwdG9yLl9zdWJhY3Rpb25zQXNNZW51ID0gdGhpcy5fc3ViYWN0aW9uc0FzTWVudTtcbiAgICAgICAgZGVzY3JpcHRvci5fc3ViYWN0aW9ucyA9IHRoaXMuX3N1YmFjdGlvbnM7XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uU2ltcGxlRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIGNvbnN0cnVjdG9yKGFjdGlvbk5hbWU6IHN0cmluZywgbW9kZWxUeXBlPzogQ2xhc3NUeXBlPFQ+LCBpZFByb3BlcnR5Pzogc3RyaW5nLCB0aXRsZVByb3BlcnR5Pzogc3RyaW5nLCBpMThuQmFzZUtleT86IHN0cmluZyB8IENsYXNzVHlwZTx1bmtub3duPikge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vZGVsVHlwZSA/IG5ldyBNb2RlbERlc2NyaXB0b3I8VD4obW9kZWxUeXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5LCBpMThuQmFzZUtleSkgOiBudWxsO1xuICAgICAgICBzdXBlcihtb2RlbCwgYWN0aW9uTmFtZSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VkaXRvckRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD47XG5cbiAgICBwcm90ZWN0ZWQgX2VkaXRvckFjdGlvbnM6IEFjdGlvbkRlc2NyaXB0b3I8VD5bXSA9IFtdO1xuICAgIHByb3RlY3RlZCBfZWRpdG9yVGl0bGU/OiBzdHJpbmcgfCBudWxsID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfZWRpdG9yVGl0bGVQYXJhbXM/OiBhbnkgPSB1bmRlZmluZWQ7XG5cbiAgICBwcm90ZWN0ZWQgX2hhc0ZldGNoTm90aWZpY2F0aW9uU3VjY2VzcyA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzVGl0bGU/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlPzogc3RyaW5nO1xuXG4gICAgcHJvdGVjdGVkIF9kaWFsb2dTaXplID0gU3R5bGVTaXplRW51bS5Ob3JtYWw7XG4gICAgcHJvdGVjdGVkIF9kaWFsb2dDbGFzc05hbWU/OiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2RhdGFQcm92aWRlcj86IElFZGl0b3JEYXRhUHJvdmlkZXI8VCwgYW55PiA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgX2ZldGNoRnVuY3Rpb24/OiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIGFueT4pID0+IE9ic2VydmFibGU8VD47XG4gICAgcHJvdGVjdGVkIF9zdWJtaXRGdW5jdGlvbj86IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgYW55PikgPT4gT2JzZXJ2YWJsZTxUPjtcblxuICAgIHByb3RlY3RlZCBfZWRpdG9yQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuXG4gICAgcHJvdGVjdGVkIF9yZXN1Ym1pdEVuYWJsZWQ/OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfcmVzdWJtaXRSZWZldGNoID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD4sIGFjdGlvbk5hbWU6IHN0cmluZywgcGFyZW50VHlwZT86IENsYXNzVHlwZTx1bmtub3duPiwgcGFyZW50UHJvcGVydHk/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yRGVzY3JpcHRvci5tb2RlbCwgYWN0aW9uTmFtZSwgcGFyZW50VHlwZSwgcGFyZW50UHJvcGVydHkpO1xuICAgICAgICB0aGlzLl90eXBlID0gQWN0aW9uVHlwZUVudW0uRWRpdG9yO1xuICAgICAgICB0aGlzLl9lZGl0b3JEZXNjcmlwdG9yID0gZWRpdG9yRGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5fZWRpdG9yQWN0aW9ucy5wdXNoKEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3IuZm9yUHJpbWFyeSh0aGlzKSwgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvci5mb3JTZWNvbmRhcnkodGhpcykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZWRpdG9yVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0b3JUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvclRpdGxlUGFyYW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yVGl0bGVQYXJhbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JEZXNjcmlwdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yRGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ1NpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaWFsb2dTaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGlhbG9nQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlhbG9nQ2xhc3NOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFzRmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzRmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmV0Y2hOb3RpZmljYXRpb25TdWNjZXNzVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3NNZXNzYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgZGF0YVByb3ZpZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVByb3ZpZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgcnVuRnVuY3Rpb24oKTogKGN0eDogQWN0aW9uQ29udGV4dDxULCB1bmtub3duPikgPT4gT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIHRocm93IG5ldyBNbmdFcnJvckludGVybmFsKCdSdW4gZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgaW4gZWRpdG9yIGFjdGlvbi4gVXNlIHN1Ym1pdCBmdW5jdGlvbiBpbnN0ZWFkIScsICdBY3Rpb25EZXNjcmlwdG9yIGVycm9yJykuY29uc29sZUVycm9yKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmZXRjaEZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1Ym1pdEZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VibWl0RnVuY3Rpb247XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBlZGl0b3JBY3Rpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yQWN0aW9ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVkaXRvckNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkaXRvckNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc3VibWl0RW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VibWl0RW5hYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlc3VibWl0UmVmZXRjaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VibWl0UmVmZXRjaDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEVkaXRvclRpdGxlKHRpdGxlOiBzdHJpbmcgfCBudWxsLCBwYXJhbXM/OiBhbnkpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgdGhpcy5fZWRpdG9yVGl0bGVQYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoRGF0YVByb3ZpZGVyKGRhdGFQcm92aWRlcjogSUVkaXRvckRhdGFQcm92aWRlcjxULCBhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIHdpdGhTZXJ2aWNlVHlwZTxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPik6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMuX21vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTW5nRXJyb3JJbnRlcm5hbChgQ2Fubm90IHNldCBkYXRhIHByb3ZpZGVyIGlmIG5vIG1vZGVsIHR5cGUgaXMgcHJvdmlkZWQgZm9yIGFjdGlvbiAke3RoaXMuX2FjdGlvbk5hbWV9YCwgJ0FjdGlvbkRlc2NyaXB0b3IgZXJyb3InKS5jb25zb2xlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBuZXcgRWRpdG9yRGF0YVByb3ZpZGVyKHRoaXMuX21vZGVsLnR5cGUsIHNlcnZpY2VUeXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaWFsb2dTaXplKHNpemUgPSBTdHlsZVNpemVFbnVtLk5vcm1hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kaWFsb2dTaXplID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhEaWFsb2dDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZGlhbG9nQ2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFJ1bkZ1bmN0aW9uPFM+KGZuOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTdWJtaXRGdW5jdGlvbihmbiBhcyAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KSA9PiBPYnNlcnZhYmxlPFQ+KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEZldGNoRnVuY3Rpb248Uz4oZm46IChjdHg6IEFjdGlvbkNvbnRleHQ8VCwgUz4pID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZmV0Y2hGdW5jdGlvbiA9IGZuO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFN1Ym1pdEZ1bmN0aW9uPFM+KGZuOiAoY3R4OiBBY3Rpb25Db250ZXh0PFQsIFM+KSA9PiBPYnNlcnZhYmxlPFQ+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3N1Ym1pdEZ1bmN0aW9uID0gZm47XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRmV0Y2hOb3RpZmljYXRpb25FcnJvcih0aXRsZT86IHN0cmluZywgbWVzc2FnZT86IHN0cmluZywgaGFzTm90aWZpY2F0aW9uID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9oYXNGZXRjaE5vdGlmaWNhdGlvblN1Y2Nlc3MgPSBoYXNOb3RpZmljYXRpb247XG4gICAgICAgIHRoaXMuX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc1RpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX2ZldGNoTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEVkaXRvckFjdGlvbihhY3Rpb246IEFjdGlvbkRlc2NyaXB0b3I8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRWRpdG9yQWN0aW9ucyhhY3Rpb25zOiBBY3Rpb25EZXNjcmlwdG9yPFQ+W10pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZWRpdG9yQWN0aW9ucyA9IGFjdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRWRpdG9yQ29tcG9uZW50KGVkaXRvckNvbXBvbmVudDogVHlwZTxhbnk+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2VkaXRvckNvbXBvbmVudCA9IGVkaXRvckNvbXBvbmVudDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSZXN1Ym1pdChlbmFibGVkPzogYm9vbGVhbiwgcmVmZXRjaCA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcmVzdWJtaXRFbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgdGhpcy5fcmVzdWJtaXRSZWZldGNoID0gcmVmZXRjaDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VkaXRvckFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdWJtaXRUeXBlOiBBY3Rpb25FZGl0b3JTdWJtaXRUeXBlRW51bTtcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPiwgc3VibWl0VHlwZSA9IEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLlN1Ym1pdCkge1xuICAgICAgICBzdXBlcihlZGl0b3JBY3Rpb24ubW9kZWwsIHN1Ym1pdFR5cGUgPT09IEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLlN1Ym1pdCA/IGAke2VkaXRvckFjdGlvbi5hY3Rpb25OYW1lfS5zdWJtaXRgIDogYCR7ZWRpdG9yQWN0aW9uLmFjdGlvbk5hbWV9LmNhbmNlbGApO1xuICAgICAgICB0aGlzLl9lZGl0b3JBY3Rpb24gPSBlZGl0b3JBY3Rpb247XG4gICAgICAgIHRoaXMuX3N1Ym1pdFR5cGUgPSBzdWJtaXRUeXBlO1xuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IEFjdGlvblBvc2l0aW9uRW51bS5Gb290ZXJSaWdodDtcblxuICAgICAgICB0aGlzLmJ1dHRvbi5zdHlsZUNsYXNzLndpdGhBY3Rpb25MZXZlbChlZGl0b3JBY3Rpb24ubGV2ZWwpLndpdGhUZXh0QnV0dG9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3JlYXRlcyBwcmltYXJ5IGFjdGlvbiB3aXRoIHByaW1hcnkgYnV0dG9uIHN0eWxlXG4gICAgICogQHBhcmFtIGVkaXRvckFjdGlvblxuICAgICAqIEBwYXJhbSBzdWJtaXRUeXBlXG4gICAgICovXG4gICAgc3RhdGljIGZvclByaW1hcnk8VD4oZWRpdG9yQWN0aW9uOiBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+LCBzdWJtaXRUeXBlID0gQWN0aW9uRWRpdG9yU3VibWl0VHlwZUVudW0uU3VibWl0KTogQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgQWN0aW9uRWRpdG9yU3VibWl0RGVzY3JpcHRvcihlZGl0b3JBY3Rpb24sIHN1Ym1pdFR5cGUpLndpdGhCdXR0b25EZXNjcmlwdG9yKG5ldyBBY3Rpb25CdXR0b25EZXNjcmlwdG9yKCkud2l0aFN0eWxlQ2xhc3MobmV3IEJ1dHRvblN0eWxlQnVpbGRlcigpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY3JlYXRlcyBzZWNvbmRhcnkgYnV0dG9uIHdpdGggdGV4dCBidXR0b24gc3R5bGVcbiAgICAgKiBAcGFyYW0gZWRpdG9yQWN0aW9uXG4gICAgICogQHBhcmFtIHN1Ym1pdFR5cGVcbiAgICAgKi9cbiAgICBzdGF0aWMgZm9yU2Vjb25kYXJ5PFQ+KGVkaXRvckFjdGlvbjogQWN0aW9uRWRpdG9yRGVzY3JpcHRvcjxUPiwgc3VibWl0VHlwZSA9IEFjdGlvbkVkaXRvclN1Ym1pdFR5cGVFbnVtLkNhbmNlbCk6IEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3I8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3IoZWRpdG9yQWN0aW9uLCBzdWJtaXRUeXBlKS53aXRoQnV0dG9uRGVzY3JpcHRvcihcbiAgICAgICAgICAgIG5ldyBBY3Rpb25CdXR0b25EZXNjcmlwdG9yKCkud2l0aFN0eWxlQ2xhc3MobmV3IEJ1dHRvblN0eWxlQnVpbGRlcigpLndpdGhUZXh0QnV0dG9uKCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzdWJtaXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VibWl0VHlwZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpb25FZGl0b3JEZXRhaWxzRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQUNUSU9OX05BTUUgPSAnZGV0YWlscyc7XG5cbiAgICBjb25zdHJ1Y3RvcihlZGl0b3JEZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKGVkaXRvckRlc2NyaXB0b3IsIEFjdGlvbkVkaXRvckRldGFpbHNEZXNjcmlwdG9yLkFDVElPTl9OQU1FKTtcbiAgICAgICAgdGhpcy53aXRoUG9zaXRpb24oQWN0aW9uUG9zaXRpb25FbnVtLlJvd0NsaWNrKTtcbiAgICAgICAgdGhpcy53aXRoUm91dGVUcmlnZ2VyKCc6aXRlbUlkJyk7XG4gICAgICAgIHRoaXMud2l0aEZldGNoRnVuY3Rpb24oQWN0aW9uRGF0YVByb3ZpZGVyVXRpbC5ydW5GZXRjaE9yRmFpbCk7XG5cbiAgICAgICAgdGhpcy53aXRoRWRpdG9yQWN0aW9ucyhbbmV3IEFjdGlvbkVkaXRvclN1Ym1pdERlc2NyaXB0b3IodGhpcywgQWN0aW9uRWRpdG9yU3VibWl0VHlwZUVudW0uQ2FuY2VsKV0pO1xuICAgICAgICB0aGlzLndpdGhUYWJsZXZpZXdDYXRlZ29yeShUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllcy5ERVRBSUxTKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFNlcnZpY2VUeXBlPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZXJ2aWNlRmV0Y2hGdW5jdGlvbihzZXJ2aWNlVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXJ2aWNlRmV0Y2hGdW5jdGlvbjxTPihzZXJ2aWNlVHlwZTogVHlwZTxTPiwgZmV0Y2hGbj86IChpZDogSWRUeXBlLCBzZXJ2aWNlPzogUykgPT4gT2JzZXJ2YWJsZTxUPik6IHRoaXMge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgRWRpdG9yRGF0YVByb3ZpZGVyKHRoaXMuX21vZGVsIS50eXBlLCBzZXJ2aWNlVHlwZSk7XG4gICAgICAgIGlmIChmZXRjaEZuKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aEZldGNoKGZldGNoRm4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yQWRkRGVzY3JpcHRvcjxUPiBleHRlbmRzIEFjdGlvbkVkaXRvckRlc2NyaXB0b3I8VD4ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQUNUSU9OX05BTUUgPSAnYWRkJztcblxuICAgIGNvbnN0cnVjdG9yKGVkaXRvckRlc2NyaXB0b3I6IEVkaXRvckRlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgc3VwZXIoZWRpdG9yRGVzY3JpcHRvciwgQWN0aW9uRWRpdG9yQWRkRGVzY3JpcHRvci5BQ1RJT05fTkFNRSk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Ub29sYmFyTGVmdCk7XG4gICAgICAgIHRoaXMud2l0aFJvdXRlVHJpZ2dlcignYWRkJyk7XG4gICAgICAgIHRoaXMud2l0aFN1Ym1pdEZ1bmN0aW9uKEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuQ3JlYXRlT3JGYWlsKTtcblxuICAgICAgICB0aGlzLmJ1dHRvbi53aXRoSWNvbigncGkgcGktcGx1cycpO1xuICAgICAgICB0aGlzLndpdGhUYWJsZXZpZXdDYXRlZ29yeShUYWJsZXZpZXdBY3Rpb25EZWZhdWx0Q2F0ZWdvcmllcy5BREQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoU2VydmljZVR5cGU8Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNlcnZpY2VTdWJtaXRGdW5jdGlvbihzZXJ2aWNlVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXJ2aWNlU3VibWl0RnVuY3Rpb248Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4sIGNyZWF0ZUZuPzogKGl0ZW0/OiBULCBzZXJ2aWNlPzogUykgPT4gT2JzZXJ2YWJsZTxUPiwgZmV0Y2hGbj86IChpZDogSWRUeXBlLCBzZXJ2aWNlPzogUykgPT4gT2JzZXJ2YWJsZTxUPik6IHRoaXMge1xuICAgICAgICBjb25zdCBkYXRhUHJvdmlkZXIgPSBuZXcgRWRpdG9yRGF0YVByb3ZpZGVyKHRoaXMuX21vZGVsIS50eXBlLCBzZXJ2aWNlVHlwZSk7XG4gICAgICAgIGlmIChjcmVhdGVGbikge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhDcmVhdGUoY3JlYXRlRm4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmZXRjaEZuKSB7XG4gICAgICAgICAgICBkYXRhUHJvdmlkZXIud2l0aEZldGNoKGZldGNoRm4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aW9uRWRpdG9yRWRpdERlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25FZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2VkaXQnO1xuXG4gICAgY29uc3RydWN0b3IoZWRpdG9yRGVzY3JpcHRvcjogRWRpdG9yRGVzY3JpcHRvcjxUPikge1xuICAgICAgICBzdXBlcihlZGl0b3JEZXNjcmlwdG9yLCBBY3Rpb25FZGl0b3JFZGl0RGVzY3JpcHRvci5BQ1RJT05fTkFNRSk7XG4gICAgICAgIHRoaXMud2l0aFBvc2l0aW9uKEFjdGlvblBvc2l0aW9uRW51bS5Sb3dJbmxpbmUpO1xuICAgICAgICB0aGlzLmJ1dHRvbi5zdHlsZUNsYXNzLndpdGhTaXplKFN0eWxlU2l6ZUVudW0uU21hbGwpO1xuICAgICAgICB0aGlzLndpdGhSb3V0ZVRyaWdnZXIoJzppdGVtSWQvZWRpdCcpO1xuICAgICAgICB0aGlzLndpdGhGZXRjaEZ1bmN0aW9uKEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuRmV0Y2hPckZhaWwpO1xuICAgICAgICB0aGlzLndpdGhTdWJtaXRGdW5jdGlvbihBY3Rpb25EYXRhUHJvdmlkZXJVdGlsLnJ1blVwZGF0ZU9yRmFpbCk7XG4gICAgICAgIHRoaXMud2l0aFRhYmxldmlld0NhdGVnb3J5KFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzLkVESVQpO1xuICAgICAgICB0aGlzLmJ1dHRvbi53aXRoTGFiZWwobnVsbCkud2l0aEljb24oJ3BpIHBpLXBlbmNpbCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSB3aXRoU2VydmljZVR5cGU8Uz4oc2VydmljZVR5cGU6IFR5cGU8Uz4pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFNlcnZpY2VTdWJtaXRGdW5jdGlvbihzZXJ2aWNlVHlwZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhTZXJ2aWNlU3VibWl0RnVuY3Rpb248Uz4oXG4gICAgICAgIHNlcnZpY2VUeXBlOiBUeXBlPFM+LFxuICAgICAgICB1cGRhdGVGbj86IChpZDogSWRUeXBlLCBpdGVtPzogVCwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD4sXG4gICAgICAgIGZldGNoRm4/OiAoaWQ6IElkVHlwZSwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD5cbiAgICApOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IEVkaXRvckRhdGFQcm92aWRlcih0aGlzLl9tb2RlbCEudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICBpZiAodXBkYXRlRm4pIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoVXBkYXRlKHVwZGF0ZUZuKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmV0Y2hGbikge1xuICAgICAgICAgICAgZGF0YVByb3ZpZGVyLndpdGhGZXRjaChmZXRjaEZuKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkRlbGV0ZURlc2NyaXB0b3I8VD4gZXh0ZW5kcyBBY3Rpb25EZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDVElPTl9OQU1FID0gJ2RlbGV0ZSc7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFQ+KSB7XG4gICAgICAgIHN1cGVyKG1vZGVsLCBBY3Rpb25EZWxldGVEZXNjcmlwdG9yLkFDVElPTl9OQU1FKTtcbiAgICAgICAgdGhpcy53aXRoUG9zaXRpb24oQWN0aW9uUG9zaXRpb25FbnVtLlJvd0lubGluZSk7XG4gICAgICAgIHRoaXMuYnV0dG9uLnN0eWxlQ2xhc3Mud2l0aFNpemUoU3R5bGVTaXplRW51bS5TbWFsbCk7XG4gICAgICAgIHRoaXMud2l0aFJ1bkZ1bmN0aW9uKEFjdGlvbkRhdGFQcm92aWRlclV0aWwucnVuRGVsZXRlT3JGYWlsKTtcbiAgICAgICAgdGhpcy5idXR0b24uc3R5bGVDbGFzcy53aXRoQWN0aW9uTGV2ZWwoU3R5bGVMZXZlbEVudW0uRGFuZ2VyKTtcbiAgICAgICAgdGhpcy53aXRoUnVuQ29uZmlybWF0aW9uKCk7XG4gICAgICAgIHRoaXMud2l0aFRhYmxldmlld0NhdGVnb3J5KFRhYmxldmlld0FjdGlvbkRlZmF1bHRDYXRlZ29yaWVzLkRFTEVURSk7XG4gICAgICAgIHRoaXMuYnV0dG9uLndpdGhMYWJlbChudWxsKS53aXRoSWNvbigncGkgcGktdHJhc2gnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd2l0aFNlcnZpY2VUeXBlPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhTZXJ2aWNlRGVsZXRlRnVuY3Rpb24oc2VydmljZVR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU2VydmljZURlbGV0ZUZ1bmN0aW9uPFM+KHNlcnZpY2VUeXBlOiBUeXBlPFM+LCBkZWxldGVGbj86IChpZDogSWRUeXBlLCBpdGVtPzogVCwgc2VydmljZT86IFMpID0+IE9ic2VydmFibGU8VD4pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZGF0YVByb3ZpZGVyID0gbmV3IEVkaXRvckRhdGFQcm92aWRlcih0aGlzLl9tb2RlbCEudHlwZSwgc2VydmljZVR5cGUpO1xuICAgICAgICBpZiAoZGVsZXRlRm4pIHtcbiAgICAgICAgICAgIGRhdGFQcm92aWRlci53aXRoRGVsZXRlKGRlbGV0ZUZuKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGlvbkxpbmtEZXNjcmlwdG9yPFQ+IGV4dGVuZHMgQWN0aW9uRGVzY3JpcHRvcjxUPiB7XG4gICAgcHJpdmF0ZSBfdXJsID0gJyc7XG4gICAgcHJpdmF0ZSBfcGF0aFNlZ21lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zSGFuZGxpbmc/OiBRdWVyeVBhcmFtc0hhbmRsaW5nO1xuICAgIHByaXZhdGUgX3JlcGxhY2VVcmwgPSBmYWxzZTtcbiAgICBwcml2YXRlIF90YXJnZXQgPSAnX3NlbGYnO1xuICAgIHByaXZhdGUgX2lzU3R5bGVMaW5rID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogTW9kZWxEZXNjcmlwdG9yPFQ+IHwgbnVsbCA9IG51bGwsIGFjdGlvbk5hbWUgPSAnbGluaycpIHtcbiAgICAgICAgc3VwZXIobW9kZWwsIGFjdGlvbk5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUFjdGlvbkRlc2NyaXB0b3I8VD4oYWN0aW9uRGVzY3JpcHRvcjogQWN0aW9uRGVzY3JpcHRvcjxUPik6IEFjdGlvbkxpbmtEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBBY3Rpb25MaW5rRGVzY3JpcHRvcjxUPihhY3Rpb25EZXNjcmlwdG9yLm1vZGVsLCBhY3Rpb25EZXNjcmlwdG9yLmFjdGlvbk5hbWUpO1xuXG4gICAgICAgIGFjdGlvbkRlc2NyaXB0b3IuY29weVRvKGRlc2NyaXB0b3IpO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX2RhdGFQcm92aWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgZGVzY3JpcHRvci5fcnVuQ29uZmlybWF0aW9uRGlhbG9nRGVzY3JpcHRvciA9IHVuZGVmaW5lZDtcblxuICAgICAgICBkZXNjcmlwdG9yLl9oYXNSdW5Ob3RpZmljYXRpb25TdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIGRlc2NyaXB0b3IuX3J1bk5vdGlmaWNhdGlvblN1Y2Nlc3NUaXRsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZGVzY3JpcHRvci5fcnVuTm90aWZpY2F0aW9uU3VjY2Vzc01lc3NhZ2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgZGVzY3JpcHRvci5faGFzUnVuTm90aWZpY2F0aW9uRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgZGVzY3JpcHRvci5fcnVuTm90aWZpY2F0aW9uRXJyb3JUaXRsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgZGVzY3JpcHRvci5fcnVuTm90aWZpY2F0aW9uRXJyb3JNZXNzYWdlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX2FmdGVyUnVuQWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBkZXNjcmlwdG9yLl9vblJ1bkVycm9yQWN0aW9uID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGRlc2NyaXB0b3IuX2hhc0l0ZW1zU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIGRlc2NyaXB0b3IuX3N1YmFjdGlvbnNBc01lbnUgPSBmYWxzZTtcbiAgICAgICAgZGVzY3JpcHRvci5fc3ViYWN0aW9ucyA9IFtdO1xuXG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cmw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYXRoU2VnbWVudHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF0aFNlZ21lbnRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcXVlcnlQYXJhbXMoKTogUGFyYW1zIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5UGFyYW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcXVlcnlQYXJhbXNIYW5kbGluZygpOiBRdWVyeVBhcmFtc0hhbmRsaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3F1ZXJ5UGFyYW1zSGFuZGxpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXBsYWNlVXJsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVwbGFjZVVybDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRhcmdldCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFyZ2V0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNTdHlsZUxpbmsoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1N0eWxlTGluaztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEhyZWYodXJsOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJvdXRlckxpbmsoLi4ucGF0aFNlZ21lbnRzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9wYXRoU2VnbWVudHMgPSBwYXRoU2VnbWVudHM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUXVlcnlQYXJhbXMocXVlcnlQYXJhbXM6IFBhcmFtcywgcXVlcnlQYXJhbXNIYW5kbGluZz86IFF1ZXJ5UGFyYW1zSGFuZGxpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcXVlcnlQYXJhbXMgPSBxdWVyeVBhcmFtcztcbiAgICAgICAgdGhpcy5fcXVlcnlQYXJhbXNIYW5kbGluZyA9IHF1ZXJ5UGFyYW1zSGFuZGxpbmc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoUmVwbGFjZVVybChyZXBsYWNlVXJsID0gZmFsc2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcmVwbGFjZVVybCA9IHJlcGxhY2VVcmw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoVGFyZ2V0KHRhcmdldDogJ19zZWxmJyB8ICdfYmxhbmsnID0gJ19zZWxmJyk6IHRoaXMge1xuICAgICAgICB0aGlzLl90YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoU3R5bGVMaW5rKGlzU3R5bGVMaW5rOiBib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2lzU3R5bGVMaW5rID0gaXNTdHlsZUxpbms7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiJdfQ==