@messaia/cdk 18.2.3 → 19.0.0-rc01

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 (659) hide show
  1. package/fesm2022/messaia-cdk.mjs +1147 -932
  2. package/fesm2022/messaia-cdk.mjs.map +1 -1
  3. package/lib/base/components/base.component.d.ts +1 -1
  4. package/lib/base/components/generic-embedded-list.component.d.ts +1 -1
  5. package/lib/base/components/generic-form-base.component.d.ts +1 -1
  6. package/lib/base/components/generic-form.component.d.ts +1 -1
  7. package/lib/base/components/generic-list.component.d.ts +7 -3
  8. package/lib/base/components/generic-reactive-form.component.d.ts +1 -1
  9. package/lib/base/helpers/auth-helper.d.ts +1 -1
  10. package/lib/chips/components/chips.component.d.ts +5 -16
  11. package/lib/common/functions/utils.d.ts +1 -1
  12. package/lib/common/helpers/app-storage.d.ts +1 -1
  13. package/lib/common/styles/_layout.scss +1 -1
  14. package/lib/common/styles/_variables.scss +4 -25
  15. package/lib/common/styles/colors/_colors-dark.scss +2 -0
  16. package/lib/common/styles/colors/_colors.scss +4 -4
  17. package/lib/common/styles/core/_button.scss +7 -21
  18. package/lib/common/styles/core/_card.scss +13 -97
  19. package/lib/common/styles/core/_core.scss +8 -21
  20. package/lib/common/styles/core/_sidenav.scss +9 -7
  21. package/lib/common/styles/core/_structure.scss +4 -11
  22. package/lib/common/styles/font/_font.scss +5 -13
  23. package/lib/common/styles/m2/_common-theme.scss +10 -10
  24. package/lib/common/styles/m3/_common-theme.scss +27 -10
  25. package/lib/common/styles/platform.scss +10 -8
  26. package/lib/common/styles/utilities/_general.scss +55 -51
  27. package/lib/common/styles/utilities/_pull.scss +23 -30
  28. package/lib/common/styles/utilities/_push.scss +23 -30
  29. package/lib/common/styles/utilities/_size.scss +3 -3
  30. package/lib/common/styles/utilities/_utilities.scss +14 -14
  31. package/lib/common/theming/_m2-all-theme.scss +4 -11
  32. package/lib/common/theming/_m3-all-theme.scss +18 -0
  33. package/lib/form-validators/directives/base-directive.d.ts +1 -1
  34. package/lib/form-validators/directives/template-validations/base-validator.directive.d.ts +1 -1
  35. package/lib/form-validators/directives/template-validations/control-expression-process.d.ts +1 -1
  36. package/lib/form-validators/services/rx-form-array.d.ts +2 -2
  37. package/lib/form-validators/util/reset-form.d.ts +3 -3
  38. package/lib/forms/directives/mat-form-field-editor.directive.d.ts +31 -28
  39. package/lib/forms/helpers/abstract-mat-form-field.d.ts +147 -91
  40. package/lib/forms/helpers/abstract-select-form-field.component.d.ts +144 -67
  41. package/lib/forms/helpers/value-accessor-base.d.ts +1 -1
  42. package/lib/layout/_m2-layout-theme.scss +14 -50
  43. package/lib/layout/layout-toggle.class.d.ts +1 -1
  44. package/lib/list/components/list.component.d.ts +3 -15
  45. package/lib/select/components/select.component.d.ts +3 -16
  46. package/lib/table/components/filter-select/filter-select.component.d.ts +2 -3
  47. package/package.json +3 -5
  48. package/esm2022/lib/base/base.module.mjs +0 -114
  49. package/esm2022/lib/base/components/base.component.mjs +0 -904
  50. package/esm2022/lib/base/components/dynamic-table-config-dialog/dynamic-table-config-dialog.comnponent.mjs +0 -123
  51. package/esm2022/lib/base/components/generic-embedded-list.component.mjs +0 -197
  52. package/esm2022/lib/base/components/generic-form-base.component.mjs +0 -891
  53. package/esm2022/lib/base/components/generic-form.component.mjs +0 -44
  54. package/esm2022/lib/base/components/generic-list.component.mjs +0 -966
  55. package/esm2022/lib/base/components/generic-reactive-form.component.mjs +0 -101
  56. package/esm2022/lib/base/components/task-dialog/task-dialog.component.mjs +0 -147
  57. package/esm2022/lib/base/constants/common.mjs +0 -92
  58. package/esm2022/lib/base/constants/global-roles.mjs +0 -9
  59. package/esm2022/lib/base/enums/message-type.mjs +0 -7
  60. package/esm2022/lib/base/helpers/auth-helper.mjs +0 -53
  61. package/esm2022/lib/base/interceptors/base.interceptor.mjs +0 -168
  62. package/esm2022/lib/base/interceptors/caching-interceptor.mjs +0 -67
  63. package/esm2022/lib/base/interceptors/loading.interceptor.mjs +0 -64
  64. package/esm2022/lib/base/interfaces/ibase-component.mjs +0 -2
  65. package/esm2022/lib/base/interfaces/igeneric-form-base.mjs +0 -2
  66. package/esm2022/lib/base/interfaces/igeneric-list-component.mjs +0 -2
  67. package/esm2022/lib/base/interfaces/igeneric-reactive-form-base.mjs +0 -2
  68. package/esm2022/lib/base/models/auth-user.mjs +0 -18
  69. package/esm2022/lib/base/models/task-dialog-data.mjs +0 -85
  70. package/esm2022/lib/base/public_api.mjs +0 -2
  71. package/esm2022/lib/base/services/file.service.mjs +0 -18
  72. package/esm2022/lib/base/services/loading-screen.service.mjs +0 -45
  73. package/esm2022/lib/base/services/print.service.mjs +0 -41
  74. package/esm2022/lib/chips/chips.module.mjs +0 -77
  75. package/esm2022/lib/chips/components/chips.component.mjs +0 -702
  76. package/esm2022/lib/chips/directives/autocomplete-option.directive.mjs +0 -18
  77. package/esm2022/lib/chips/directives/chip.directive.mjs +0 -18
  78. package/esm2022/lib/chips/public_api.mjs +0 -3
  79. package/esm2022/lib/common/animations/collapse/collapse.animation.mjs +0 -33
  80. package/esm2022/lib/common/animations/common/interfaces.mjs +0 -2
  81. package/esm2022/lib/common/behaviors/constructor.mjs +0 -2
  82. package/esm2022/lib/common/behaviors/control-value-accesor.mixin.mjs +0 -41
  83. package/esm2022/lib/common/behaviors/disabled.mixin.mjs +0 -24
  84. package/esm2022/lib/common/common.module.mjs +0 -176
  85. package/esm2022/lib/common/constants/constants.mjs +0 -3
  86. package/esm2022/lib/common/directives/autofocus.directive.mjs +0 -62
  87. package/esm2022/lib/common/directives/delayed-hover.directive.mjs +0 -133
  88. package/esm2022/lib/common/directives/disable-control.directive.mjs +0 -35
  89. package/esm2022/lib/common/enums/app-event-type.mjs +0 -6
  90. package/esm2022/lib/common/enums/filter-glue.mjs +0 -16
  91. package/esm2022/lib/common/enums/filter-operator.mjs +0 -15
  92. package/esm2022/lib/common/enums/salutation.mjs +0 -7
  93. package/esm2022/lib/common/functions/decorators.mjs +0 -22
  94. package/esm2022/lib/common/functions/functions.mjs +0 -22
  95. package/esm2022/lib/common/functions/utils.mjs +0 -271
  96. package/esm2022/lib/common/helpers/app-storage.mjs +0 -77
  97. package/esm2022/lib/common/helpers/delegate.mjs +0 -2
  98. package/esm2022/lib/common/helpers/dynamic-builder.mjs +0 -52
  99. package/esm2022/lib/common/helpers/dynamic-component-compiler.mjs +0 -11
  100. package/esm2022/lib/common/models/action-item.mjs +0 -77
  101. package/esm2022/lib/common/models/app-event.mjs +0 -21
  102. package/esm2022/lib/common/models/app-setting.mjs +0 -92
  103. package/esm2022/lib/common/models/audit-entity.mjs +0 -53
  104. package/esm2022/lib/common/models/audit-user.mjs +0 -24
  105. package/esm2022/lib/common/models/base-entity.mjs +0 -40
  106. package/esm2022/lib/common/models/common-error.mjs +0 -29
  107. package/esm2022/lib/common/models/common-handler-context.mjs +0 -45
  108. package/esm2022/lib/common/models/displayname-number-projection.mjs +0 -56
  109. package/esm2022/lib/common/models/displayname-projection.mjs +0 -38
  110. package/esm2022/lib/common/models/entity.mjs +0 -2
  111. package/esm2022/lib/common/models/enum-item.mjs +0 -2
  112. package/esm2022/lib/common/models/enum-metadata.mjs +0 -44
  113. package/esm2022/lib/common/models/filter-field.mjs +0 -2
  114. package/esm2022/lib/common/models/filter.mjs +0 -2
  115. package/esm2022/lib/common/models/icommon-handler-context.mjs +0 -2
  116. package/esm2022/lib/common/models/icon.mjs +0 -42
  117. package/esm2022/lib/common/models/key-value.mjs +0 -11
  118. package/esm2022/lib/common/models/modifiable-entity.mjs +0 -22
  119. package/esm2022/lib/common/models/name-number-projection.mjs +0 -35
  120. package/esm2022/lib/common/models/name-projection.mjs +0 -25
  121. package/esm2022/lib/common/models/permission.mjs +0 -29
  122. package/esm2022/lib/common/models/save-action.mjs +0 -7
  123. package/esm2022/lib/common/models/suffix-button.mjs +0 -15
  124. package/esm2022/lib/common/models/title-projection.mjs +0 -25
  125. package/esm2022/lib/common/pipes/bind.mjs +0 -31
  126. package/esm2022/lib/common/pipes/data-source.pipe.mjs +0 -15
  127. package/esm2022/lib/common/pipes/enum.pipe.mjs +0 -41
  128. package/esm2022/lib/common/pipes/file-size.pipe.mjs +0 -35
  129. package/esm2022/lib/common/pipes/filter.pipe.mjs +0 -54
  130. package/esm2022/lib/common/pipes/first-letter.mjs +0 -24
  131. package/esm2022/lib/common/pipes/form-array.pipe.mjs +0 -14
  132. package/esm2022/lib/common/pipes/form-control.pipe.mjs +0 -14
  133. package/esm2022/lib/common/pipes/form-group.pipe.mjs +0 -14
  134. package/esm2022/lib/common/pipes/func.pipe.mjs +0 -14
  135. package/esm2022/lib/common/pipes/join.pipe.mjs +0 -26
  136. package/esm2022/lib/common/pipes/keys.mjs +0 -18
  137. package/esm2022/lib/common/pipes/map.pipe.mjs +0 -48
  138. package/esm2022/lib/common/pipes/month-name.pipe.mjs +0 -25
  139. package/esm2022/lib/common/pipes/nested-property.mjs +0 -29
  140. package/esm2022/lib/common/pipes/only-number.mjs +0 -58
  141. package/esm2022/lib/common/pipes/order.pipe.mjs +0 -269
  142. package/esm2022/lib/common/pipes/placeholder.pipe.mjs +0 -26
  143. package/esm2022/lib/common/pipes/property-join.pipe.mjs +0 -27
  144. package/esm2022/lib/common/pipes/safe-html.pipe.mjs +0 -32
  145. package/esm2022/lib/common/pipes/split.pipe.mjs +0 -25
  146. package/esm2022/lib/common/pipes/time.pipe.mjs +0 -21
  147. package/esm2022/lib/common/pipes/titlecase.pipe.mjs +0 -14
  148. package/esm2022/lib/common/pipes/truncate.pipe.mjs +0 -15
  149. package/esm2022/lib/common/pipes/values.mjs +0 -14
  150. package/esm2022/lib/common/public_api.mjs +0 -41
  151. package/esm2022/lib/common/services/base.service.mjs +0 -19
  152. package/esm2022/lib/common/services/context-helper.mjs +0 -17
  153. package/esm2022/lib/common/services/enum.service.mjs +0 -81
  154. package/esm2022/lib/common/services/event-queue.service.mjs +0 -31
  155. package/esm2022/lib/common/services/service-locator.mjs +0 -25
  156. package/esm2022/lib/common/templates/templates.mjs +0 -87
  157. package/esm2022/lib/dialogs/alert-dialog/alert-dialog.component.mjs +0 -46
  158. package/esm2022/lib/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -60
  159. package/esm2022/lib/dialogs/dialog.component.mjs +0 -59
  160. package/esm2022/lib/dialogs/dialogs.module.mjs +0 -72
  161. package/esm2022/lib/dialogs/prompt-dialog/prompt-dialog.component.mjs +0 -44
  162. package/esm2022/lib/dialogs/public_api.mjs +0 -2
  163. package/esm2022/lib/dialogs/services/dialog.service.mjs +0 -154
  164. package/esm2022/lib/file/file-input.component.mjs +0 -334
  165. package/esm2022/lib/file/file.module.mjs +0 -37
  166. package/esm2022/lib/file/public_api.mjs +0 -2
  167. package/esm2022/lib/form-validators/abstract/typed-form.mjs +0 -13
  168. package/esm2022/lib/form-validators/algorithm/luhn-algorithm.mjs +0 -33
  169. package/esm2022/lib/form-validators/const/app-validators.const.mjs +0 -68
  170. package/esm2022/lib/form-validators/const/app.const.mjs +0 -65
  171. package/esm2022/lib/form-validators/const/config-names.const.mjs +0 -33
  172. package/esm2022/lib/form-validators/const/config-required-fields.const.mjs +0 -35
  173. package/esm2022/lib/form-validators/const/decorators.const.mjs +0 -23
  174. package/esm2022/lib/form-validators/const/events.const.mjs +0 -53
  175. package/esm2022/lib/form-validators/const/html-elements.const.mjs +0 -25
  176. package/esm2022/lib/form-validators/const/iban-country-wise-regex.const.mjs +0 -80
  177. package/esm2022/lib/form-validators/const/index.mjs +0 -6
  178. package/esm2022/lib/form-validators/const/operators.const.mjs +0 -7
  179. package/esm2022/lib/form-validators/const/validation-alphabet-locale.const.mjs +0 -9
  180. package/esm2022/lib/form-validators/const/validator.const.mjs +0 -29
  181. package/esm2022/lib/form-validators/core/annotation-types.mjs +0 -75
  182. package/esm2022/lib/form-validators/core/default-container.mjs +0 -500
  183. package/esm2022/lib/form-validators/decorators/allOf.decorator.mjs +0 -10
  184. package/esm2022/lib/form-validators/decorators/alpha.decorator.mjs +0 -10
  185. package/esm2022/lib/form-validators/decorators/alphaNumeric.decorator.mjs +0 -10
  186. package/esm2022/lib/form-validators/decorators/and.decorator.mjs +0 -6
  187. package/esm2022/lib/form-validators/decorators/ascii.decorator.mjs +0 -6
  188. package/esm2022/lib/form-validators/decorators/async.decorator.mjs +0 -6
  189. package/esm2022/lib/form-validators/decorators/base-decorator.function.mjs +0 -7
  190. package/esm2022/lib/form-validators/decorators/choice.decorator.mjs +0 -10
  191. package/esm2022/lib/form-validators/decorators/compare.decorator.mjs +0 -6
  192. package/esm2022/lib/form-validators/decorators/compose.decorator.mjs +0 -6
  193. package/esm2022/lib/form-validators/decorators/contains.decorator.mjs +0 -10
  194. package/esm2022/lib/form-validators/decorators/credit-card.decorator.mjs +0 -10
  195. package/esm2022/lib/form-validators/decorators/cusip.decorator.mjs +0 -6
  196. package/esm2022/lib/form-validators/decorators/custom.decorator.mjs +0 -10
  197. package/esm2022/lib/form-validators/decorators/dataUri.decorator.mjs +0 -6
  198. package/esm2022/lib/form-validators/decorators/date.decorator.mjs +0 -10
  199. package/esm2022/lib/form-validators/decorators/different.decorator.mjs +0 -6
  200. package/esm2022/lib/form-validators/decorators/digit.decorator.mjs +0 -6
  201. package/esm2022/lib/form-validators/decorators/email.decorator.mjs +0 -6
  202. package/esm2022/lib/form-validators/decorators/endsWith.decorator.mjs +0 -10
  203. package/esm2022/lib/form-validators/decorators/even.decorator.mjs +0 -6
  204. package/esm2022/lib/form-validators/decorators/extension.decorator.mjs +0 -10
  205. package/esm2022/lib/form-validators/decorators/factor.decorator.mjs +0 -10
  206. package/esm2022/lib/form-validators/decorators/file.decorator.mjs +0 -10
  207. package/esm2022/lib/form-validators/decorators/fileSize.decorator.mjs +0 -10
  208. package/esm2022/lib/form-validators/decorators/greater-than-equal-to.decorator.mjs +0 -10
  209. package/esm2022/lib/form-validators/decorators/greater-than.decorator.mjs +0 -10
  210. package/esm2022/lib/form-validators/decorators/grid.decorator.mjs +0 -6
  211. package/esm2022/lib/form-validators/decorators/hexColor.decorator.mjs +0 -6
  212. package/esm2022/lib/form-validators/decorators/image.decorator.mjs +0 -10
  213. package/esm2022/lib/form-validators/decorators/index.mjs +0 -93
  214. package/esm2022/lib/form-validators/decorators/json.decorator.mjs +0 -6
  215. package/esm2022/lib/form-validators/decorators/latLong.decorator.mjs +0 -6
  216. package/esm2022/lib/form-validators/decorators/latitude.decorator.mjs +0 -6
  217. package/esm2022/lib/form-validators/decorators/leapYear.decorator.mjs +0 -6
  218. package/esm2022/lib/form-validators/decorators/less-than-equal-to.decorator.mjs +0 -10
  219. package/esm2022/lib/form-validators/decorators/less-than.decorator.mjs +0 -10
  220. package/esm2022/lib/form-validators/decorators/longitude.decorator.mjs +0 -6
  221. package/esm2022/lib/form-validators/decorators/lowercase.decorator.mjs +0 -6
  222. package/esm2022/lib/form-validators/decorators/mac.decorator.mjs +0 -6
  223. package/esm2022/lib/form-validators/decorators/mask.decorator.mjs +0 -6
  224. package/esm2022/lib/form-validators/decorators/maxDate.decorator.mjs +0 -10
  225. package/esm2022/lib/form-validators/decorators/maxLength.decorator.mjs +0 -10
  226. package/esm2022/lib/form-validators/decorators/maxNumber.decorator.mjs +0 -10
  227. package/esm2022/lib/form-validators/decorators/maxTime.decorator.mjs +0 -10
  228. package/esm2022/lib/form-validators/decorators/minDate.decorator.mjs +0 -10
  229. package/esm2022/lib/form-validators/decorators/minLength.decorator.mjs +0 -10
  230. package/esm2022/lib/form-validators/decorators/minNumber.decorator.mjs +0 -10
  231. package/esm2022/lib/form-validators/decorators/minTime.decorator.mjs +0 -10
  232. package/esm2022/lib/form-validators/decorators/model.decorator.mjs +0 -7
  233. package/esm2022/lib/form-validators/decorators/non-validation-decorators/disable.decorator.mjs +0 -8
  234. package/esm2022/lib/form-validators/decorators/non-validation-decorators/elementClass.decorator.mjs +0 -8
  235. package/esm2022/lib/form-validators/decorators/non-validation-decorators/error.decorator.mjs +0 -8
  236. package/esm2022/lib/form-validators/decorators/non-validation-decorators/update-on.decorator.mjs +0 -6
  237. package/esm2022/lib/form-validators/decorators/noneOf.decorator.mjs +0 -10
  238. package/esm2022/lib/form-validators/decorators/not.decorator.mjs +0 -6
  239. package/esm2022/lib/form-validators/decorators/notEmpty.decorator.mjs +0 -6
  240. package/esm2022/lib/form-validators/decorators/numeric.decorator.mjs +0 -10
  241. package/esm2022/lib/form-validators/decorators/odd.decorator.mjs +0 -6
  242. package/esm2022/lib/form-validators/decorators/oneOf.decorator.mjs +0 -10
  243. package/esm2022/lib/form-validators/decorators/or.decorator.mjs +0 -6
  244. package/esm2022/lib/form-validators/decorators/password.decorator.mjs +0 -10
  245. package/esm2022/lib/form-validators/decorators/pattern.decorator.mjs +0 -10
  246. package/esm2022/lib/form-validators/decorators/port.decorator.mjs +0 -6
  247. package/esm2022/lib/form-validators/decorators/primeNumber.decorator.mjs +0 -6
  248. package/esm2022/lib/form-validators/decorators/prop-array.decorator.mjs +0 -18
  249. package/esm2022/lib/form-validators/decorators/prop-object.decorator.mjs +0 -8
  250. package/esm2022/lib/form-validators/decorators/prop.decorator.mjs +0 -18
  251. package/esm2022/lib/form-validators/decorators/range.decorator.mjs +0 -10
  252. package/esm2022/lib/form-validators/decorators/required.decorator.mjs +0 -6
  253. package/esm2022/lib/form-validators/decorators/requiredTrue.decorator.mjs +0 -6
  254. package/esm2022/lib/form-validators/decorators/rule.decorator.mjs +0 -6
  255. package/esm2022/lib/form-validators/decorators/sanitize/blacklist.decorator.mjs +0 -8
  256. package/esm2022/lib/form-validators/decorators/sanitize/escape.decorator.mjs +0 -8
  257. package/esm2022/lib/form-validators/decorators/sanitize/ltrim.decorator.mjs +0 -8
  258. package/esm2022/lib/form-validators/decorators/sanitize/prefix.decorator.mjs +0 -8
  259. package/esm2022/lib/form-validators/decorators/sanitize/rtrim.decorator.mjs +0 -8
  260. package/esm2022/lib/form-validators/decorators/sanitize/sanitize.decorator.mjs +0 -8
  261. package/esm2022/lib/form-validators/decorators/sanitize/stripLow.decorator.mjs +0 -8
  262. package/esm2022/lib/form-validators/decorators/sanitize/suffix.decorator.mjs +0 -8
  263. package/esm2022/lib/form-validators/decorators/sanitize/toBoolean.decorator.mjs +0 -8
  264. package/esm2022/lib/form-validators/decorators/sanitize/toDate.decorator.mjs +0 -8
  265. package/esm2022/lib/form-validators/decorators/sanitize/toDouble.decorator.mjs +0 -8
  266. package/esm2022/lib/form-validators/decorators/sanitize/toFloat.decorator.mjs +0 -8
  267. package/esm2022/lib/form-validators/decorators/sanitize/toInt.decorator.mjs +0 -8
  268. package/esm2022/lib/form-validators/decorators/sanitize/toString.decorator.mjs +0 -8
  269. package/esm2022/lib/form-validators/decorators/sanitize/trim.decorator.mjs +0 -8
  270. package/esm2022/lib/form-validators/decorators/sanitize/whitelist.decorator.mjs +0 -8
  271. package/esm2022/lib/form-validators/decorators/startsWith.decorator.mjs +0 -10
  272. package/esm2022/lib/form-validators/decorators/time.decorator.mjs +0 -10
  273. package/esm2022/lib/form-validators/decorators/unique.decorator.mjs +0 -6
  274. package/esm2022/lib/form-validators/decorators/uppercase.decorator.mjs +0 -6
  275. package/esm2022/lib/form-validators/decorators/url.decorator.mjs +0 -10
  276. package/esm2022/lib/form-validators/directives/base-directive.mjs +0 -75
  277. package/esm2022/lib/form-validators/directives/control-host.directive.mjs +0 -55
  278. package/esm2022/lib/form-validators/directives/html-control-template.directive.mjs +0 -36
  279. package/esm2022/lib/form-validators/directives/rx-form.directive.mjs +0 -234
  280. package/esm2022/lib/form-validators/directives/template-validations/async-validation.directive.mjs +0 -40
  281. package/esm2022/lib/form-validators/directives/template-validations/base-validator.directive.mjs +0 -76
  282. package/esm2022/lib/form-validators/directives/template-validations/control-expression-process.mjs +0 -60
  283. package/esm2022/lib/form-validators/directives/template-validations/file-control.directive.mjs +0 -122
  284. package/esm2022/lib/form-validators/directives/template-validations/image-file-control.directive.mjs +0 -74
  285. package/esm2022/lib/form-validators/directives/template-validations/rxformcontrol.directive.mjs +0 -394
  286. package/esm2022/lib/form-validators/domain/disable-provider.mjs +0 -198
  287. package/esm2022/lib/form-validators/domain/element-processor/decimal.provider.mjs +0 -134
  288. package/esm2022/lib/form-validators/domain/element-processor/mask.provider.mjs +0 -453
  289. package/esm2022/lib/form-validators/domain/form-data.mjs +0 -93
  290. package/esm2022/lib/form-validators/enums/error-message-binding-strategy.mjs +0 -11
  291. package/esm2022/lib/form-validators/enums/index.mjs +0 -5
  292. package/esm2022/lib/form-validators/enums/ip-version.mjs +0 -7
  293. package/esm2022/lib/form-validators/enums/numeric-value-type.mjs +0 -7
  294. package/esm2022/lib/form-validators/enums/reset-type.mjs +0 -10
  295. package/esm2022/lib/form-validators/enums/url-validation-type.mjs +0 -7
  296. package/esm2022/lib/form-validators/models/config/alpha-config.mjs +0 -2
  297. package/esm2022/lib/form-validators/models/config/array-config.mjs +0 -2
  298. package/esm2022/lib/form-validators/models/config/base-config-fn.mjs +0 -2
  299. package/esm2022/lib/form-validators/models/config/base-config.mjs +0 -2
  300. package/esm2022/lib/form-validators/models/config/base-date-config.mjs +0 -2
  301. package/esm2022/lib/form-validators/models/config/choice-config.mjs +0 -2
  302. package/esm2022/lib/form-validators/models/config/compare-config.mjs +0 -2
  303. package/esm2022/lib/form-validators/models/config/component-config.mjs +0 -2
  304. package/esm2022/lib/form-validators/models/config/compose-config.mjs +0 -2
  305. package/esm2022/lib/form-validators/models/config/contains-config.mjs +0 -2
  306. package/esm2022/lib/form-validators/models/config/credit-card-config.mjs +0 -2
  307. package/esm2022/lib/form-validators/models/config/custom-config.mjs +0 -2
  308. package/esm2022/lib/form-validators/models/config/date-config.mjs +0 -2
  309. package/esm2022/lib/form-validators/models/config/default-config.mjs +0 -2
  310. package/esm2022/lib/form-validators/models/config/digit-config.mjs +0 -2
  311. package/esm2022/lib/form-validators/models/config/disable-config.mjs +0 -2
  312. package/esm2022/lib/form-validators/models/config/element-class-config.mjs +0 -2
  313. package/esm2022/lib/form-validators/models/config/email-config.mjs +0 -2
  314. package/esm2022/lib/form-validators/models/config/error-config.mjs +0 -2
  315. package/esm2022/lib/form-validators/models/config/extension-config.mjs +0 -2
  316. package/esm2022/lib/form-validators/models/config/factor-config.mjs +0 -2
  317. package/esm2022/lib/form-validators/models/config/field-config.mjs +0 -2
  318. package/esm2022/lib/form-validators/models/config/file-config.mjs +0 -2
  319. package/esm2022/lib/form-validators/models/config/hex-color-config.mjs +0 -2
  320. package/esm2022/lib/form-validators/models/config/iban-config.mjs +0 -2
  321. package/esm2022/lib/form-validators/models/config/image-config.mjs +0 -2
  322. package/esm2022/lib/form-validators/models/config/index.mjs +0 -35
  323. package/esm2022/lib/form-validators/models/config/ip-config.mjs +0 -2
  324. package/esm2022/lib/form-validators/models/config/logical-operator-config.mjs +0 -2
  325. package/esm2022/lib/form-validators/models/config/mask-config.mjs +0 -2
  326. package/esm2022/lib/form-validators/models/config/max-date-config.mjs +0 -2
  327. package/esm2022/lib/form-validators/models/config/message-config.mjs +0 -2
  328. package/esm2022/lib/form-validators/models/config/min-date-config.mjs +0 -2
  329. package/esm2022/lib/form-validators/models/config/model-config.mjs +0 -2
  330. package/esm2022/lib/form-validators/models/config/number-config.mjs +0 -2
  331. package/esm2022/lib/form-validators/models/config/numeric-config.mjs +0 -2
  332. package/esm2022/lib/form-validators/models/config/password-config.mjs +0 -2
  333. package/esm2022/lib/form-validators/models/config/pattern-config.mjs +0 -2
  334. package/esm2022/lib/form-validators/models/config/prop-config.mjs +0 -2
  335. package/esm2022/lib/form-validators/models/config/props-config.mjs +0 -2
  336. package/esm2022/lib/form-validators/models/config/range-config.mjs +0 -2
  337. package/esm2022/lib/form-validators/models/config/relational-operator-config.mjs +0 -2
  338. package/esm2022/lib/form-validators/models/config/required-config.mjs +0 -2
  339. package/esm2022/lib/form-validators/models/config/rule-config.mjs +0 -2
  340. package/esm2022/lib/form-validators/models/config/sanitize-config.mjs +0 -2
  341. package/esm2022/lib/form-validators/models/config/size-config.mjs +0 -2
  342. package/esm2022/lib/form-validators/models/config/string-comparison-config.mjs +0 -2
  343. package/esm2022/lib/form-validators/models/config/string-value-config.mjs +0 -2
  344. package/esm2022/lib/form-validators/models/config/time-config.mjs +0 -2
  345. package/esm2022/lib/form-validators/models/config/todate-config.mjs +0 -2
  346. package/esm2022/lib/form-validators/models/config/unique-config.mjs +0 -2
  347. package/esm2022/lib/form-validators/models/config/update-on-config.mjs +0 -2
  348. package/esm2022/lib/form-validators/models/config/url-config.mjs +0 -2
  349. package/esm2022/lib/form-validators/models/control-info.mjs +0 -2
  350. package/esm2022/lib/form-validators/models/data-sanitizer.mjs +0 -2
  351. package/esm2022/lib/form-validators/models/decorator-configuration.mjs +0 -2
  352. package/esm2022/lib/form-validators/models/form-builder-configuration.mjs +0 -58
  353. package/esm2022/lib/form-validators/models/index.mjs +0 -3
  354. package/esm2022/lib/form-validators/models/instance-container.mjs +0 -2
  355. package/esm2022/lib/form-validators/models/interface/array-prop-instance-config.interface.mjs +0 -2
  356. package/esm2022/lib/form-validators/models/interface/auto-instance-config.interface.mjs +0 -2
  357. package/esm2022/lib/form-validators/models/interface/form-data-config.mjs +0 -2
  358. package/esm2022/lib/form-validators/models/interface/i-abstract-control.mjs +0 -30
  359. package/esm2022/lib/form-validators/models/interface/i-form-group.mjs +0 -2
  360. package/esm2022/lib/form-validators/models/interface/instance-argument.interface.mjs +0 -2
  361. package/esm2022/lib/form-validators/models/interface/object-prop-instance-config.interface.mjs +0 -2
  362. package/esm2022/lib/form-validators/models/interface/options.mjs +0 -2
  363. package/esm2022/lib/form-validators/models/password-validation.model.mjs +0 -2
  364. package/esm2022/lib/form-validators/models/prop-validation-config.mjs +0 -2
  365. package/esm2022/lib/form-validators/models/property-info.mjs +0 -2
  366. package/esm2022/lib/form-validators/public_api.mjs +0 -26
  367. package/esm2022/lib/form-validators/reactive-form-validators/allOf.validator.mjs +0 -33
  368. package/esm2022/lib/form-validators/reactive-form-validators/alpha.validator.mjs +0 -15
  369. package/esm2022/lib/form-validators/reactive-form-validators/alphaNumeric.validator.mjs +0 -15
  370. package/esm2022/lib/form-validators/reactive-form-validators/and.validator.mjs +0 -38
  371. package/esm2022/lib/form-validators/reactive-form-validators/ascii.validator.mjs +0 -15
  372. package/esm2022/lib/form-validators/reactive-form-validators/async/base.async.validator.mjs +0 -45
  373. package/esm2022/lib/form-validators/reactive-form-validators/choice.validator.mjs +0 -31
  374. package/esm2022/lib/form-validators/reactive-form-validators/compare.validator.mjs +0 -32
  375. package/esm2022/lib/form-validators/reactive-form-validators/compose.validator.mjs +0 -34
  376. package/esm2022/lib/form-validators/reactive-form-validators/conditional-change.validator.mjs +0 -63
  377. package/esm2022/lib/form-validators/reactive-form-validators/contains.validator.mjs +0 -22
  378. package/esm2022/lib/form-validators/reactive-form-validators/credit-card.validator.mjs +0 -48
  379. package/esm2022/lib/form-validators/reactive-form-validators/cusip.validator.mjs +0 -38
  380. package/esm2022/lib/form-validators/reactive-form-validators/custom.validator.mjs +0 -25
  381. package/esm2022/lib/form-validators/reactive-form-validators/dataUri.validator.mjs +0 -9
  382. package/esm2022/lib/form-validators/reactive-form-validators/date.validator.mjs +0 -8
  383. package/esm2022/lib/form-validators/reactive-form-validators/different.validator.mjs +0 -19
  384. package/esm2022/lib/form-validators/reactive-form-validators/digit.validator.mjs +0 -9
  385. package/esm2022/lib/form-validators/reactive-form-validators/email.validator.mjs +0 -9
  386. package/esm2022/lib/form-validators/reactive-form-validators/endsWith.validator.mjs +0 -23
  387. package/esm2022/lib/form-validators/reactive-form-validators/even.validator.mjs +0 -15
  388. package/esm2022/lib/form-validators/reactive-form-validators/extension.validator.mjs +0 -40
  389. package/esm2022/lib/form-validators/reactive-form-validators/factor.validator.mjs +0 -37
  390. package/esm2022/lib/form-validators/reactive-form-validators/file.validator.mjs +0 -26
  391. package/esm2022/lib/form-validators/reactive-form-validators/fileSize.validator.mjs +0 -34
  392. package/esm2022/lib/form-validators/reactive-form-validators/greater-than-equal-to.validator.mjs +0 -8
  393. package/esm2022/lib/form-validators/reactive-form-validators/greater-than.validator.mjs +0 -8
  394. package/esm2022/lib/form-validators/reactive-form-validators/grid.validator.mjs +0 -31
  395. package/esm2022/lib/form-validators/reactive-form-validators/hexcolor.validator.mjs +0 -9
  396. package/esm2022/lib/form-validators/reactive-form-validators/iban.validator.mjs +0 -28
  397. package/esm2022/lib/form-validators/reactive-form-validators/image.validator.mjs +0 -52
  398. package/esm2022/lib/form-validators/reactive-form-validators/index.mjs +0 -66
  399. package/esm2022/lib/form-validators/reactive-form-validators/ip.validator.mjs +0 -28
  400. package/esm2022/lib/form-validators/reactive-form-validators/json.validator.mjs +0 -26
  401. package/esm2022/lib/form-validators/reactive-form-validators/latLong.validator.mjs +0 -18
  402. package/esm2022/lib/form-validators/reactive-form-validators/latitude.validator.mjs +0 -9
  403. package/esm2022/lib/form-validators/reactive-form-validators/leapYear.validator.mjs +0 -16
  404. package/esm2022/lib/form-validators/reactive-form-validators/less-than-equal-to.validator.mjs +0 -8
  405. package/esm2022/lib/form-validators/reactive-form-validators/less-than.validator.mjs +0 -8
  406. package/esm2022/lib/form-validators/reactive-form-validators/longitude.validator.mjs +0 -9
  407. package/esm2022/lib/form-validators/reactive-form-validators/lowercase.validator.mjs +0 -15
  408. package/esm2022/lib/form-validators/reactive-form-validators/mac.validator.mjs +0 -9
  409. package/esm2022/lib/form-validators/reactive-form-validators/mask.validator.mjs +0 -14
  410. package/esm2022/lib/form-validators/reactive-form-validators/maxDate.validator.mjs +0 -8
  411. package/esm2022/lib/form-validators/reactive-form-validators/maxLength.validator.mjs +0 -17
  412. package/esm2022/lib/form-validators/reactive-form-validators/maxNumber.validator.mjs +0 -17
  413. package/esm2022/lib/form-validators/reactive-form-validators/maxTime.validator.mjs +0 -8
  414. package/esm2022/lib/form-validators/reactive-form-validators/minDate.validator.mjs +0 -8
  415. package/esm2022/lib/form-validators/reactive-form-validators/minLength.validator.mjs +0 -16
  416. package/esm2022/lib/form-validators/reactive-form-validators/minNumber.validator.mjs +0 -16
  417. package/esm2022/lib/form-validators/reactive-form-validators/minTime.validator.mjs +0 -8
  418. package/esm2022/lib/form-validators/reactive-form-validators/noneOf.validator.mjs +0 -24
  419. package/esm2022/lib/form-validators/reactive-form-validators/not.validator.mjs +0 -25
  420. package/esm2022/lib/form-validators/reactive-form-validators/notEmpty.validator.mjs +0 -17
  421. package/esm2022/lib/form-validators/reactive-form-validators/numeric.validator.mjs +0 -22
  422. package/esm2022/lib/form-validators/reactive-form-validators/odd.validator.mjs +0 -17
  423. package/esm2022/lib/form-validators/reactive-form-validators/oneOf.validator.mjs +0 -26
  424. package/esm2022/lib/form-validators/reactive-form-validators/or.validator.mjs +0 -25
  425. package/esm2022/lib/form-validators/reactive-form-validators/password.validator.mjs +0 -35
  426. package/esm2022/lib/form-validators/reactive-form-validators/pattern.validator.mjs +0 -19
  427. package/esm2022/lib/form-validators/reactive-form-validators/port.validator.mjs +0 -19
  428. package/esm2022/lib/form-validators/reactive-form-validators/primeNumber.validator.mjs +0 -27
  429. package/esm2022/lib/form-validators/reactive-form-validators/range.validator.mjs +0 -17
  430. package/esm2022/lib/form-validators/reactive-form-validators/required.validator.mjs +0 -17
  431. package/esm2022/lib/form-validators/reactive-form-validators/requiredTrue.validator.mjs +0 -16
  432. package/esm2022/lib/form-validators/reactive-form-validators/rule.validator.mjs +0 -22
  433. package/esm2022/lib/form-validators/reactive-form-validators/startsWith.validator.mjs +0 -25
  434. package/esm2022/lib/form-validators/reactive-form-validators/time.validator.mjs +0 -19
  435. package/esm2022/lib/form-validators/reactive-form-validators/unique.validator.mjs +0 -77
  436. package/esm2022/lib/form-validators/reactive-form-validators/uppercase.validator.mjs +0 -16
  437. package/esm2022/lib/form-validators/reactive-form-validators/url.validator.mjs +0 -28
  438. package/esm2022/lib/form-validators/services/base-form-builder.mjs +0 -220
  439. package/esm2022/lib/form-validators/services/entity.service.mjs +0 -76
  440. package/esm2022/lib/form-validators/services/form-control.mjs +0 -370
  441. package/esm2022/lib/form-validators/services/form-group.mjs +0 -2
  442. package/esm2022/lib/form-validators/services/reactive-form.module.mjs +0 -52
  443. package/esm2022/lib/form-validators/services/rx-form-array.mjs +0 -114
  444. package/esm2022/lib/form-validators/services/rx-form-builder.mjs +0 -1035
  445. package/esm2022/lib/form-validators/services/rx-form-group.mjs +0 -451
  446. package/esm2022/lib/form-validators/services/typed-form-builder.mjs +0 -25
  447. package/esm2022/lib/form-validators/util/alphabet-regex.locale.mjs +0 -29
  448. package/esm2022/lib/form-validators/util/app-util.mjs +0 -161
  449. package/esm2022/lib/form-validators/util/check-length.mjs +0 -11
  450. package/esm2022/lib/form-validators/util/config-provider.mjs +0 -37
  451. package/esm2022/lib/form-validators/util/date-checker.function.mjs +0 -52
  452. package/esm2022/lib/form-validators/util/date-provider.mjs +0 -108
  453. package/esm2022/lib/form-validators/util/form-const.mjs +0 -3
  454. package/esm2022/lib/form-validators/util/form-provider.mjs +0 -87
  455. package/esm2022/lib/form-validators/util/index.mjs +0 -7
  456. package/esm2022/lib/form-validators/util/instance-provider.function.mjs +0 -63
  457. package/esm2022/lib/form-validators/util/ip-checker.mjs +0 -19
  458. package/esm2022/lib/form-validators/util/linq.mjs +0 -157
  459. package/esm2022/lib/form-validators/util/object-maker.mjs +0 -68
  460. package/esm2022/lib/form-validators/util/reactive-form-config.mjs +0 -25
  461. package/esm2022/lib/form-validators/util/regex-rules.mjs +0 -37
  462. package/esm2022/lib/form-validators/util/regex-validator.mjs +0 -74
  463. package/esm2022/lib/form-validators/util/relational-checker.function.mjs +0 -92
  464. package/esm2022/lib/form-validators/util/reset-form.mjs +0 -57
  465. package/esm2022/lib/form-validators/util/sanitizers.mjs +0 -140
  466. package/esm2022/lib/form-validators/util/time-checker.function.mjs +0 -50
  467. package/esm2022/lib/form-validators/util/type.mjs +0 -2
  468. package/esm2022/lib/form-validators/util/validator-value-checker.mjs +0 -21
  469. package/esm2022/lib/form-validators/validators-extension/allOf-validator.extension.mjs +0 -11
  470. package/esm2022/lib/form-validators/validators-extension/alpha-validator.extension.mjs +0 -11
  471. package/esm2022/lib/form-validators/validators-extension/alphaNumeric-validator.extension.mjs +0 -11
  472. package/esm2022/lib/form-validators/validators-extension/and-validator.extension.mjs +0 -7
  473. package/esm2022/lib/form-validators/validators-extension/ascii-validator.extension.mjs +0 -7
  474. package/esm2022/lib/form-validators/validators-extension/base-validator.function.mjs +0 -34
  475. package/esm2022/lib/form-validators/validators-extension/choice-validator.extension.mjs +0 -11
  476. package/esm2022/lib/form-validators/validators-extension/compare-validator.extension.mjs +0 -7
  477. package/esm2022/lib/form-validators/validators-extension/compose-validator.extension.mjs +0 -7
  478. package/esm2022/lib/form-validators/validators-extension/contains-validator.extension.mjs +0 -11
  479. package/esm2022/lib/form-validators/validators-extension/credit-card-validator.extension.mjs +0 -11
  480. package/esm2022/lib/form-validators/validators-extension/cusip-validator.extension.mjs +0 -7
  481. package/esm2022/lib/form-validators/validators-extension/custom-validator.extension.mjs +0 -11
  482. package/esm2022/lib/form-validators/validators-extension/dataUri-validator.extension.mjs +0 -7
  483. package/esm2022/lib/form-validators/validators-extension/date-validator.extension.mjs +0 -11
  484. package/esm2022/lib/form-validators/validators-extension/different-validator.extension.mjs +0 -7
  485. package/esm2022/lib/form-validators/validators-extension/digit-validator.extension.mjs +0 -7
  486. package/esm2022/lib/form-validators/validators-extension/email-validator.extension.mjs +0 -7
  487. package/esm2022/lib/form-validators/validators-extension/endsWith-validator.extension.mjs +0 -11
  488. package/esm2022/lib/form-validators/validators-extension/even-validator.extension.mjs +0 -7
  489. package/esm2022/lib/form-validators/validators-extension/extension-validator.extension.mjs +0 -10
  490. package/esm2022/lib/form-validators/validators-extension/factor-validator.extension.mjs +0 -11
  491. package/esm2022/lib/form-validators/validators-extension/file-validator.extension.mjs +0 -10
  492. package/esm2022/lib/form-validators/validators-extension/fileSize-validator.extension.mjs +0 -10
  493. package/esm2022/lib/form-validators/validators-extension/greater-than-equal-to-validator.extension.mjs +0 -11
  494. package/esm2022/lib/form-validators/validators-extension/greater-than-validator.extension.mjs +0 -11
  495. package/esm2022/lib/form-validators/validators-extension/grid-validator.extension.mjs +0 -7
  496. package/esm2022/lib/form-validators/validators-extension/hexcolor-validator.extension.mjs +0 -7
  497. package/esm2022/lib/form-validators/validators-extension/iban-validator.extension.mjs +0 -11
  498. package/esm2022/lib/form-validators/validators-extension/image-validator.extension.mjs +0 -10
  499. package/esm2022/lib/form-validators/validators-extension/index.mjs +0 -68
  500. package/esm2022/lib/form-validators/validators-extension/ip-validator.extension.mjs +0 -11
  501. package/esm2022/lib/form-validators/validators-extension/json-validator.extension.mjs +0 -7
  502. package/esm2022/lib/form-validators/validators-extension/latLong-validator.extension.mjs +0 -7
  503. package/esm2022/lib/form-validators/validators-extension/latitude-validator.extension.mjs +0 -7
  504. package/esm2022/lib/form-validators/validators-extension/leapYear-validator.extension.mjs +0 -7
  505. package/esm2022/lib/form-validators/validators-extension/less-than-equal-to-validator.extension.mjs +0 -11
  506. package/esm2022/lib/form-validators/validators-extension/less-than-validator.extension.mjs +0 -11
  507. package/esm2022/lib/form-validators/validators-extension/longitude-validator.extension.mjs +0 -7
  508. package/esm2022/lib/form-validators/validators-extension/lowercase-validator.extension.mjs +0 -7
  509. package/esm2022/lib/form-validators/validators-extension/mac-validator.extension.mjs +0 -7
  510. package/esm2022/lib/form-validators/validators-extension/mask-validator.extension.mjs +0 -7
  511. package/esm2022/lib/form-validators/validators-extension/maxDate-validator.extension.mjs +0 -11
  512. package/esm2022/lib/form-validators/validators-extension/maxLength-validator.extension.mjs +0 -11
  513. package/esm2022/lib/form-validators/validators-extension/maxNumber-validator.extension.mjs +0 -11
  514. package/esm2022/lib/form-validators/validators-extension/maxTime-validator.extension.mjs +0 -11
  515. package/esm2022/lib/form-validators/validators-extension/minDate-validator.extension.mjs +0 -11
  516. package/esm2022/lib/form-validators/validators-extension/minLength-validator.extension.mjs +0 -11
  517. package/esm2022/lib/form-validators/validators-extension/minNumber-validator.extension.mjs +0 -11
  518. package/esm2022/lib/form-validators/validators-extension/minTime-validator.extension.mjs +0 -11
  519. package/esm2022/lib/form-validators/validators-extension/noneOf-validator.extension.mjs +0 -11
  520. package/esm2022/lib/form-validators/validators-extension/not-validator.extension.mjs +0 -7
  521. package/esm2022/lib/form-validators/validators-extension/notEmpty-validator.extension.mjs +0 -7
  522. package/esm2022/lib/form-validators/validators-extension/numeric-validator.extension.mjs +0 -11
  523. package/esm2022/lib/form-validators/validators-extension/odd-validator.extension.mjs +0 -7
  524. package/esm2022/lib/form-validators/validators-extension/oneOf-validator.extension.mjs +0 -11
  525. package/esm2022/lib/form-validators/validators-extension/or-validator.extension.mjs +0 -7
  526. package/esm2022/lib/form-validators/validators-extension/password-validator.extension.mjs +0 -11
  527. package/esm2022/lib/form-validators/validators-extension/pattern-validator.extension.mjs +0 -11
  528. package/esm2022/lib/form-validators/validators-extension/port-validator.extension.mjs +0 -7
  529. package/esm2022/lib/form-validators/validators-extension/primeNumber-validator.extension.mjs +0 -7
  530. package/esm2022/lib/form-validators/validators-extension/range-validator.extension.mjs +0 -11
  531. package/esm2022/lib/form-validators/validators-extension/required-validator.extension.mjs +0 -7
  532. package/esm2022/lib/form-validators/validators-extension/requiredTrue-validator.extension.mjs +0 -7
  533. package/esm2022/lib/form-validators/validators-extension/rxweb-validators.mjs +0 -108
  534. package/esm2022/lib/form-validators/validators-extension/startsWith-validator.extension.mjs +0 -11
  535. package/esm2022/lib/form-validators/validators-extension/time-validator.extension.mjs +0 -11
  536. package/esm2022/lib/form-validators/validators-extension/unique-validator.extension.mjs +0 -7
  537. package/esm2022/lib/form-validators/validators-extension/uppercase-validator.extension.mjs +0 -7
  538. package/esm2022/lib/form-validators/validators-extension/url-validator.extension.mjs +0 -11
  539. package/esm2022/lib/form-validators/validators-function/alpha-validation.function.mjs +0 -71
  540. package/esm2022/lib/form-validators/validators-function/regex-validation.function.mjs +0 -33
  541. package/esm2022/lib/forms/components/datepicker/datepicker-header.component.mjs +0 -84
  542. package/esm2022/lib/forms/components/generic-form/generic-form.component.mjs +0 -602
  543. package/esm2022/lib/forms/constants/constants.mjs +0 -4
  544. package/esm2022/lib/forms/directives/mat-form-field-editor.directive.mjs +0 -197
  545. package/esm2022/lib/forms/directives/mat-form-field-readonly.directive.mjs +0 -34
  546. package/esm2022/lib/forms/directives/parse-decimal-directive.mjs +0 -87
  547. package/esm2022/lib/forms/directives/vd-generic-form-custom-field.directive.mjs +0 -35
  548. package/esm2022/lib/forms/enums/form-field-type.mjs +0 -23
  549. package/esm2022/lib/forms/forms.module.mjs +0 -168
  550. package/esm2022/lib/forms/functions/decorators.mjs +0 -136
  551. package/esm2022/lib/forms/functions/functions.mjs +0 -72
  552. package/esm2022/lib/forms/helpers/abstract-mat-form-field.mjs +0 -308
  553. package/esm2022/lib/forms/helpers/abstract-select-form-field.component.mjs +0 -492
  554. package/esm2022/lib/forms/helpers/value-accessor-base.mjs +0 -146
  555. package/esm2022/lib/forms/models/form-definition.mjs +0 -63
  556. package/esm2022/lib/forms/models/form-field-definition.mjs +0 -468
  557. package/esm2022/lib/forms/models/form-field-group-definition.mjs +0 -55
  558. package/esm2022/lib/forms/pipes/field-func.pipe.mjs +0 -23
  559. package/esm2022/lib/forms/pipes/group-filter.pipe.mjs +0 -34
  560. package/esm2022/lib/forms/public_api.mjs +0 -5
  561. package/esm2022/lib/forms/validators/empty-string-reset.directive.mjs +0 -25
  562. package/esm2022/lib/forms/validators/equal-validator.directive.mjs +0 -69
  563. package/esm2022/lib/forms/validators/native-element-injector.directive.mjs +0 -41
  564. package/esm2022/lib/forms/validators/unique-validator-directive.mjs +0 -88
  565. package/esm2022/lib/http/http.module.mjs +0 -15
  566. package/esm2022/lib/http/models/response.mjs +0 -24
  567. package/esm2022/lib/http/public_api.mjs +0 -2
  568. package/esm2022/lib/http/services/generic.service.mjs +0 -331
  569. package/esm2022/lib/layout/dynamic-menu/dynamic-menu.component.mjs +0 -103
  570. package/esm2022/lib/layout/layout-card-over/layout-card-over.component.mjs +0 -49
  571. package/esm2022/lib/layout/layout-compact/layout-compact.component.mjs +0 -193
  572. package/esm2022/lib/layout/layout-footer/layout-footer.component.mjs +0 -37
  573. package/esm2022/lib/layout/layout-manage-list/layout-manage-list.component.mjs +0 -150
  574. package/esm2022/lib/layout/layout-manage-list/layout-manage-list.directives.mjs +0 -108
  575. package/esm2022/lib/layout/layout-nav/layout-nav.component.mjs +0 -146
  576. package/esm2022/lib/layout/layout-nav-list/layout-nav-list.component.mjs +0 -141
  577. package/esm2022/lib/layout/layout-nav-list/layout-nav-list.directives.mjs +0 -105
  578. package/esm2022/lib/layout/layout-toggle.class.mjs +0 -89
  579. package/esm2022/lib/layout/layout.component.mjs +0 -230
  580. package/esm2022/lib/layout/layout.directives.mjs +0 -81
  581. package/esm2022/lib/layout/layout.module.mjs +0 -144
  582. package/esm2022/lib/layout/list-toolbar/list-toolbar.component.mjs +0 -47
  583. package/esm2022/lib/layout/navigation-drawer/navigation-drawer.component.mjs +0 -275
  584. package/esm2022/lib/layout/public_api.mjs +0 -2
  585. package/esm2022/lib/list/components/list.component.mjs +0 -78
  586. package/esm2022/lib/list/directives/vd-list-option.directive.mjs +0 -23
  587. package/esm2022/lib/list/list.module.mjs +0 -36
  588. package/esm2022/lib/list/public_api.mjs +0 -3
  589. package/esm2022/lib/media/directives/media-toggle.directive.mjs +0 -154
  590. package/esm2022/lib/media/media.module.mjs +0 -35
  591. package/esm2022/lib/media/public_api.mjs +0 -2
  592. package/esm2022/lib/media/services/media.service.mjs +0 -110
  593. package/esm2022/lib/menu/components/menu.component.mjs +0 -95
  594. package/esm2022/lib/menu/enums/menu-scope.mjs +0 -6
  595. package/esm2022/lib/menu/menu.module.mjs +0 -64
  596. package/esm2022/lib/menu/models/menu-client.mjs +0 -39
  597. package/esm2022/lib/menu/models/menu-department.mjs +0 -39
  598. package/esm2022/lib/menu/models/menu-item-client.mjs +0 -39
  599. package/esm2022/lib/menu/models/menu-item-department.mjs +0 -39
  600. package/esm2022/lib/menu/models/menu-item.mjs +0 -351
  601. package/esm2022/lib/menu/models/menu-settings.mjs +0 -13
  602. package/esm2022/lib/menu/models/menu.mjs +0 -224
  603. package/esm2022/lib/menu/public_api.mjs +0 -3
  604. package/esm2022/lib/menu/resolvers/menu-form-includes.resolve.mjs +0 -50
  605. package/esm2022/lib/menu/resolvers/menu-item-form-includes.resolve.mjs +0 -50
  606. package/esm2022/lib/menu/resolvers/menu-list-projection.resolve.mjs +0 -51
  607. package/esm2022/lib/menu/resolvers/menu-settings.resolve.mjs +0 -24
  608. package/esm2022/lib/menu/services/menu-items.service.mjs +0 -19
  609. package/esm2022/lib/menu/services/menu.resolve.mjs +0 -68
  610. package/esm2022/lib/menu/services/menu.service.mjs +0 -19
  611. package/esm2022/lib/search/public_api.mjs +0 -2
  612. package/esm2022/lib/search/search.module.mjs +0 -33
  613. package/esm2022/lib/select/components/select.component.mjs +0 -215
  614. package/esm2022/lib/select/directives/vd-select-option.directive.mjs +0 -23
  615. package/esm2022/lib/select/directives/vd-select-trigger.directive.mjs +0 -23
  616. package/esm2022/lib/select/public_api.mjs +0 -4
  617. package/esm2022/lib/select/select.module.mjs +0 -48
  618. package/esm2022/lib/table/components/dynamic-table/dynamic-table.component.mjs +0 -810
  619. package/esm2022/lib/table/components/filter-clear/filter-clear.component.mjs +0 -36
  620. package/esm2022/lib/table/components/filter-date/filter-date.component.mjs +0 -146
  621. package/esm2022/lib/table/components/filter-input/filter-input.component.mjs +0 -198
  622. package/esm2022/lib/table/components/filter-select/filter-select.component.mjs +0 -375
  623. package/esm2022/lib/table/constants/constants.mjs +0 -3
  624. package/esm2022/lib/table/directives/data-source-filter.directive.mjs +0 -49
  625. package/esm2022/lib/table/directives/vd-table-field.directive.mjs +0 -35
  626. package/esm2022/lib/table/enums/grid.mjs +0 -12
  627. package/esm2022/lib/table/enums/table-column-type.mjs +0 -17
  628. package/esm2022/lib/table/functions/decorators.mjs +0 -163
  629. package/esm2022/lib/table/functions/functions.mjs +0 -28
  630. package/esm2022/lib/table/models/facet-value.mjs +0 -47
  631. package/esm2022/lib/table/models/facet.mjs +0 -48
  632. package/esm2022/lib/table/models/pagination.mjs +0 -27
  633. package/esm2022/lib/table/models/table-column-config.mjs +0 -128
  634. package/esm2022/lib/table/models/table-column.mjs +0 -270
  635. package/esm2022/lib/table/models/table-config.mjs +0 -41
  636. package/esm2022/lib/table/models/table-definition.mjs +0 -110
  637. package/esm2022/lib/table/models/table-query-config.mjs +0 -26
  638. package/esm2022/lib/table/paginator-intl.mjs +0 -41
  639. package/esm2022/lib/table/public_api.mjs +0 -2
  640. package/esm2022/lib/table/table.data-source.mjs +0 -326
  641. package/esm2022/lib/table/table.module.mjs +0 -165
  642. package/esm2022/lib/table/table.static-data-source.mjs +0 -198
  643. package/esm2022/messaia-cdk.mjs +0 -5
  644. package/esm2022/public_api.mjs +0 -19
  645. package/lib/common/styles/_elevation.scss +0 -147
  646. package/lib/common/styles/_rtl.scss +0 -28
  647. package/lib/common/styles/_styles.scss +0 -12
  648. package/lib/common/styles/_theme-functions.scss +0 -4
  649. package/lib/common/styles/_typography.scss +0 -76
  650. package/lib/common/styles/core/_content.scss +0 -42
  651. package/lib/common/styles/core/_divider.scss +0 -14
  652. package/lib/common/styles/core/_icons.scss +0 -27
  653. package/lib/common/styles/core/_list.scss +0 -8
  654. package/lib/common/styles/core/_toolbar.scss +0 -31
  655. package/lib/common/styles/core/_whiteframe.scss +0 -111
  656. package/lib/common/styles/m2/_theme-functions.scss +0 -21
  657. package/lib/common/styles/m3/_theme-functions.scss +0 -21
  658. package/lib/common/theming/_all-theme.scss +0 -27
  659. package/lib/common/typography/_all-typography.scss +0 -33
@@ -1,891 +0,0 @@
1
- import { ChangeDetectorRef, Directive, HostListener, Input, Type, ViewChild, ViewChildren } from '@angular/core';
2
- import { FormGroup } from '@angular/forms';
3
- import { MatStepper } from '@angular/material/stepper';
4
- import { ActivatedRoute } from '@angular/router';
5
- import { Observable, map, tap } from 'rxjs';
6
- import { Utils } from '../../common/functions/utils';
7
- import { Permission } from '../../common/models/permission';
8
- import { SaveAction } from '../../common/models/save-action';
9
- import { getFormDefinition } from '../../forms/functions/functions';
10
- import { BaseComponent } from './base.component';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/router";
13
- // @dynamic
14
- export class GenericFormBaseComponent extends BaseComponent {
15
- entityCtor;
16
- service;
17
- route;
18
- changeDetectorRef;
19
- /**
20
- * The action of the form (add | edit).
21
- */
22
- action = 'add';
23
- /**
24
- * Indicates if the form is in edit mode.
25
- */
26
- isEditMode = false;
27
- /**
28
- * Save action enumeration.
29
- */
30
- SaveAction = SaveAction;
31
- /**
32
- * Navigation routes.
33
- */
34
- editSaveAndCloseRoute = '../../';
35
- addSaveAndCloseRoute = '../';
36
- addSaveAndEditRoute = '../edit/';
37
- addSaveAndNewRoute = '../add';
38
- listRoute = this.addSaveAndCloseRoute;
39
- /**
40
- * The ID of the item to load.
41
- */
42
- _id;
43
- /**
44
- * The ID of the item to load.
45
- */
46
- get id() { return this._id; }
47
- set id(id) {
48
- if (this._id != id) {
49
- this._id = id;
50
- this.action = 'edit';
51
- this.isEditMode = true;
52
- this.listRoute = this.editSaveAndCloseRoute;
53
- }
54
- }
55
- /**
56
- * The current item to add or edit.
57
- */
58
- _item;
59
- /**
60
- * The current item to add or edit.
61
- */
62
- get item() { return this._item; }
63
- set item(item) {
64
- if (this._item !== item) {
65
- this._item = item;
66
- this.id ??= item?.id;
67
- this.buildFields();
68
- }
69
- }
70
- /**
71
- * Represents the request errors.
72
- */
73
- errors = new Array();
74
- /**
75
- * Includes fields for query.
76
- */
77
- includes = [];
78
- /**
79
- * Update includes fields for query.
80
- */
81
- updateIncludes = [];
82
- /**
83
- * Projection fields for query.
84
- */
85
- projection;
86
- /**
87
- * Query parameters.
88
- */
89
- query = {};
90
- /**
91
- * Read-only flag.
92
- */
93
- readonly = false;
94
- /**
95
- * Disabled flag.
96
- */
97
- disabled = false;
98
- /**
99
- * The current date.
100
- */
101
- currentDate = new Date();
102
- /**
103
- * Date & time input mask.
104
- */
105
- dateTimeMask = [/[0-3]/, /[0-9]/, '.', /[0-1]/, /[0-9]/, '.', 2, 0, /[1-2]/, /[0-9]/, ' ', /[0-2]/, /[0-9]/, ':', /[0-5]/, /[0-9]/];
106
- /**
107
- * Date input mask.
108
- */
109
- dateMask = [/[0-3]/, /[0-9]/, '.', /[0-1]/, /[0-9]/, '.', 2, 0, /[1-2]/, /[0-9]/];
110
- /**
111
- * Time input mask.
112
- */
113
- timeMask = [/[0-2]/, /[0-9]/, ':', /[0-5]/, /[0-9]/];
114
- /**
115
- * Date validation pattern.
116
- */
117
- datePattern = `(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[1,3-9]|1[0-2])\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$|^(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4(?:(?:1[6-9]|[2-9]\\d)?\\d{2})`;
118
- /**
119
- * Phone prefix validation pattern.
120
- */
121
- phonePrefixPattern = '^(0\\d{2,6})$';
122
- /**
123
- * Phone number validation pattern.
124
- */
125
- phoneNumberPattern = '^(\\d{3,30})$';
126
- /**
127
- * Password validation pattern.
128
- */
129
- passwordPattern = '^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&#.])[A-Za-z\\d$@$!%*?&#.]{6,}$';
130
- /**
131
- * Editor options including default modules and toolbar configuration.
132
- */
133
- editorOptions = {
134
- modules: {
135
- toolbar: [
136
- ['bold', 'italic', 'underline'],
137
- [{ 'list': 'ordered' }, { 'list': 'bullet' }],
138
- [{ 'indent': '-1' }, { 'indent': '+1' }],
139
- [{ 'size': ['small', false, 'large', 'huge'] }],
140
- [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
141
- [{ 'color': new Array() }, { 'background': new Array() }],
142
- ['link', 'image']
143
- ],
144
- clipboard: {
145
- matchVisual: false
146
- }
147
- }
148
- };
149
- /**
150
- * If true, shows the 'Delete' menu.
151
- */
152
- deletable = true;
153
- /**
154
- * Toolbar menu items.
155
- */
156
- toolbarMenuItems = [];
157
- /**
158
- * Toolbar action buttons.
159
- */
160
- toolbarActions = [{
161
- icon: 'refresh',
162
- tooltip: $localize `:@@refreshPage:Refresh the page`,
163
- event: () => this.reloadPage(),
164
- }];
165
- /**
166
- * MatStepper reference.
167
- */
168
- matStepper;
169
- /**
170
- * Reference to the input elements.
171
- */
172
- input;
173
- /**
174
- * Form group instance.
175
- */
176
- _form;
177
- /**
178
- * Form group.
179
- */
180
- get form() { return this._form; }
181
- set form(form) {
182
- this._form = form;
183
- this.onAfterFormBuild();
184
- }
185
- /**
186
- * Form definition.
187
- */
188
- formDefinition;
189
- /**
190
- * Field groups definition.
191
- */
192
- fieldGroups;
193
- /**
194
- * Constructor.
195
- * @param service The service to manage the entity.
196
- * @param route The activated route.
197
- * @param changeDetectorRef The change detector reference.
198
- */
199
- constructor(entityCtor, service, route, changeDetectorRef) {
200
- super(route, changeDetectorRef);
201
- this.entityCtor = entityCtor;
202
- this.service = service;
203
- this.route = route;
204
- this.changeDetectorRef = changeDetectorRef;
205
- this.listRoute = this.addSaveAndCloseRoute;
206
- }
207
- /**
208
- * Called after the constructor, initializing input properties,
209
- * and the first call to ngOnChanges.
210
- */
211
- ngOnInit() {
212
- super.ngOnInit();
213
- this.init();
214
- }
215
- /**
216
- * Lifecycle hook that is called after a component's view has been fully initialized.
217
- */
218
- ngAfterViewInit() {
219
- this.handleExpansionPanelChanges = this.isEditMode;
220
- super.ngAfterViewInit();
221
- /* Set page title */
222
- this.title = this.titleService.getTitle();
223
- /* Set focus */
224
- this.focus();
225
- /*
226
- * Force a new change detection cycle since change detections
227
- * have finished when `ngAfterViewInit` is executed.
228
- */
229
- this.changeDetectorRef.detectChanges();
230
- /* Listen for stepper selection changes */
231
- this.matStepper?.selectionChange?.subscribe((event) => this.onAfterStepChange(event));
232
- /* Select the appropriate step based on the URL hash and mark previous steps as completed */
233
- this.selectStepBasedOnUrlHash();
234
- }
235
- /**
236
- * Called before any other lifecycle hook. Use it to inject dependencies,
237
- * but avoid any serious work here.
238
- * @param changes The changes object.
239
- */
240
- ngOnChanges(changes) {
241
- if ((changes?.id?.currentValue && changes.id.currentValue !== changes.id.previousValue) ||
242
- (changes?.item?.currentValue && changes.item.currentValue !== changes.item.previousValue)) {
243
- this.loadItem();
244
- }
245
- }
246
- /**
247
- * Loads an item by ID.
248
- * This method fetches the item if the component is in edit mode and the service endpoint is defined.
249
- *
250
- * @param callback - A function to be called after the item has been successfully loaded.
251
- * This function will receive the loaded item as an argument.
252
- */
253
- loadItem(callback) {
254
- if (this.isEditMode && this.service?.endpoint) {
255
- /* Set loading state to true to indicate that an item is being loaded */
256
- this.isLoading = true;
257
- /* Trigger change detection to update the view with the loading state */
258
- this.changeDetectorRef.detectChanges();
259
- /* Call the asynchronous method to load the item */
260
- this.loadItemAsync().subscribe({
261
- /* Handle the response when the item is successfully loaded */
262
- next: (item) => {
263
- /* Set loading state to false to indicate that loading has completed */
264
- this.isLoading = false;
265
- /* Execute the callback if provided, passing the loaded item */
266
- if (callback) {
267
- callback(item);
268
- }
269
- },
270
- /* Handle any errors that occur during the loading process */
271
- error: (error) => this.parseErrors(error)
272
- });
273
- }
274
- }
275
- /**
276
- * Loads an item by ID asynchronously.
277
- * @returns An Observable of the loaded entity.
278
- */
279
- loadItemAsync() {
280
- if (this.id) {
281
- return this.service.get(this.id, Object.assign(this.query || {}, {
282
- includes: this.includes?.length ? this.includes : this.updateIncludes,
283
- projection: this.projection?.join(','),
284
- observe: 'response'
285
- }), { 'Disable-Cache': 'Yes' }, true, true).pipe(map((response) => {
286
- /* Read permissions from the http headers */
287
- const permissions = response?.headers?.get('Permissions')?.split(';') ?? [];
288
- return {
289
- entity: Object.assign(this.newInstance(), response.body),
290
- permissions: new Permission({
291
- canCreate: permissions.includes('Create'),
292
- canRead: permissions.includes('Read'),
293
- canUpdate: permissions.includes('Update'),
294
- canDelete: permissions.includes('Delete'),
295
- }),
296
- };
297
- }), tap(x => {
298
- /* Set the loaded item */
299
- this.item = Object.assign(this.newInstance(), x.entity);
300
- /* Check if the user has permission to create, read, update, and delete */
301
- this.canCreate ||= x.permissions.canCreate;
302
- this.canRead ||= x.permissions.canRead;
303
- this.canUpdate ||= x.permissions.canUpdate;
304
- this.canDelete ||= x.permissions.canDelete;
305
- /* Build the form */
306
- this.buildForm();
307
- /* Trigger event afterItemLoaded */
308
- this.onAfterItemLoaded();
309
- }));
310
- }
311
- return new Observable();
312
- }
313
- /**
314
- * Saves data into the database.
315
- * This method validates the form, checks if it's valid, and sends data to the server to either update or create a new record.
316
- * @param action The save action to perform.
317
- * @param form The form to validate and save.
318
- */
319
- save(action = SaveAction.SaveAndClose, form) {
320
- /* Validate the form data before proceeding */
321
- this.validateForm(form);
322
- /* Ensure that the form reference is set and validated */
323
- form = this.form || form;
324
- /* Exit if the form is invalid */
325
- if (form && !this.isFormValid(form)) {
326
- return;
327
- }
328
- /* Set a flag to prevent duplicate form submissions */
329
- this.isSaving = true;
330
- /* If in edit mode, update the record */
331
- if (this.isEditMode) {
332
- /* The data has not changed? */
333
- if (form && form.pristine) {
334
- this.onAfterSubmit(action);
335
- return;
336
- }
337
- /* Send the data to the server */
338
- this.update({ params: Utils.toHttpParams({ includes: this.updateIncludes }) }).subscribe({
339
- next: (response) => {
340
- /* Apply saved data to the form */
341
- this.onAfterSubmit(action, response);
342
- /* If the user clicks 'apply' reload the page */
343
- if (action == SaveAction.SaveAndEdit) {
344
- if (this.reload.observed) {
345
- this.reload.emit(this.formValue);
346
- }
347
- else {
348
- this.reloadPage();
349
- }
350
- }
351
- },
352
- /* Process any errors from the server response */
353
- error: (error) => this.parseErrors(error)
354
- });
355
- }
356
- /* Otherwise, create a new one */
357
- else {
358
- /* Send the data to the server */
359
- this.create().subscribe({
360
- next: (response) => {
361
- this.id = response?.value?.id;
362
- this.onAfterSubmit(action, response);
363
- if (form) {
364
- Object.keys(form.controls).forEach(key => {
365
- let ctr = form.controls[key];
366
- ctr.markAsPristine();
367
- ctr.markAsUntouched();
368
- ctr.updateValueAndValidity();
369
- });
370
- }
371
- },
372
- /* Process any errors from the server response */
373
- error: (error) => this.parseErrors(error)
374
- });
375
- }
376
- /* Detect changes */
377
- this.changeDetectorRef.detectChanges();
378
- }
379
- /**
380
- * Saves data and navigates to the edit view.
381
- */
382
- apply() {
383
- this.save(SaveAction.SaveAndEdit);
384
- }
385
- /**
386
- * Deletes the current record.
387
- * This method shows a confirmation dialog and deletes the record if the user confirms.
388
- * @param httpHeaders Optional HTTP headers to include in the delete request.
389
- */
390
- delete(httpHeaders) {
391
- this.showDeleteItemDialog().subscribe((accept) => {
392
- if (accept && this.id) {
393
- this.service.delete(this.id, undefined, { headers: httpHeaders ?? this.toHttpHeaders({ 'Show-Message': 'yes' }) })
394
- .subscribe(response => {
395
- this.back();
396
- }, error => {
397
- console.debug(error);
398
- });
399
- }
400
- });
401
- }
402
- /**
403
- * Initializes the form.
404
- * This method sets up the form by extracting query parameters, setting the entity ID, and building the form.
405
- */
406
- init() {
407
- /* Get the entity ID from the query */
408
- if (!this.id && !this.item) {
409
- /* Assign query params into query object */
410
- let ignoredParams = ['id', 'returnurl', 'panelId'];
411
- Object.assign(this.query, this.sanitizeObject(this.route.snapshot.params || {}, ...ignoredParams), this.sanitizeObject(this.route.snapshot.data?.query || {}, ...ignoredParams), this.sanitizeObject(this.route.snapshot.queryParams || {}, ...ignoredParams));
412
- /* Get id from the url */
413
- let id = this.route.snapshot.paramMap.get('id');
414
- if (id > 0) {
415
- this.id = id;
416
- }
417
- else if (!this.id && this.route.snapshot?.data?.id) {
418
- this.id = this.route.snapshot?.data?.id;
419
- }
420
- this.onAfterSetId();
421
- }
422
- /* Create a new instance of the TEntity */
423
- if (!this.isEditMode && !this.form) {
424
- this.item = Object.assign(this.newInstance(), this.item || {}, this.query || {});
425
- this.buildForm();
426
- }
427
- /* Set panel ID from query */
428
- this.subtitle ||= this.route.snapshot?.data?.subtitle;
429
- }
430
- /**
431
- * Builds the form fields.
432
- * This method constructs form fields based on the entity's form definition and includes necessary navigation and menu items.
433
- */
434
- buildFields() {
435
- /* Get form definition */
436
- this.formDefinition = getFormDefinition(this.newInstance());
437
- /* Set includes from form definition, if any */
438
- this.formDefinition?.includes?.forEach(x => this.include(x.entity, x.update));
439
- /* Add toolbar menu items, if any */
440
- if (this.formDefinition?.toolbarMenuItems?.length) {
441
- this.toolbarMenuItems ??= [];
442
- this.toolbarMenuItems = this.toolbarMenuItems.concat(...this.formDefinition?.toolbarMenuItems);
443
- this.toolbarMenuItems.forEach((x, i) => x.index ??= i);
444
- }
445
- /*
446
- Assign a value to `this.deletable` only if it is currently falsy.
447
- Use the `deletable` property from `formDefinition`, defaulting to `false` if undefined.
448
- */
449
- this.deletable &&= (this.formDefinition.deletable ?? false);
450
- /* Create the form fields using the entity type */
451
- this.fieldGroups = this.formDefinition?.fieldGroups?.filter(x => !x.hidden);
452
- /* Add list menu items */
453
- this.addToolbarMenuItems();
454
- }
455
- /**
456
- * Builds a new form.
457
- * This method should be implemented to construct the form for the specific entity.
458
- */
459
- buildForm() { }
460
- /**
461
- * Validates the form.
462
- * This method sets the form as submitted, updates its validity, and optionally logs debug information.
463
- * @param form The form to validate.
464
- */
465
- validateForm(form) {
466
- var form = form || this.form;
467
- /* Set the form as submitted */
468
- if (form && form instanceof FormGroup) {
469
- /* Set form as submitted */
470
- form['submitted'] = true;
471
- /* Update value and validity */
472
- form.updateValueAndValidity();
473
- }
474
- /* Print some debug information */
475
- this.debugForm(form);
476
- }
477
- /**
478
- * Checks if the form is valid.
479
- * This method validates the form, marks invalid controls, and shows error messages if any.
480
- * @param form The form to check for validity.
481
- * @returns A boolean indicating whether the form is valid.
482
- */
483
- isFormValid(form) {
484
- /* Print some debug information */
485
- this.debugForm(form);
486
- /* If the form is not valid */
487
- if (form && !form.valid) {
488
- /* Mark invalid controls as dirty and touched */
489
- Object.keys(form.controls)
490
- .filter(x => !form.controls[x].valid)
491
- .forEach(key => this.invalidateControl(form.controls[key]));
492
- /* Show error messages */
493
- (async () => {
494
- /* Wait until 'mat-error' is displayed */
495
- await new Promise(y => setTimeout(y, 200));
496
- /* Parse the error messages */
497
- var errors = Array();
498
- Object.keys(form.controls)
499
- .filter(x => !form.controls[x].valid)
500
- .forEach(key => {
501
- /* Get error text */
502
- var error = this.getElementError(form.controls[key]?.nativeElement);
503
- if (error) {
504
- errors.push(error);
505
- }
506
- });
507
- /* Build error message */
508
- var message = errors.length ? errors.slice(0, 3).join('\n') : $localize `:@@snackbar.error.required-fields:All fields marked with an asterisk (*) are required.`;
509
- /* Show a notice */
510
- this.snackBarService.open(message, 'Ok', { duration: 3000, panelClass: ['error'] });
511
- return false;
512
- })();
513
- return false;
514
- }
515
- return true;
516
- }
517
- /**
518
- * Resets form controls.
519
- * This method marks all controls in the form as pristine, untouched, and updates their validity.
520
- * @param form The form to reset.
521
- */
522
- resetForm(form) {
523
- if (!form) {
524
- return;
525
- }
526
- Object.keys(form.controls).forEach(key => {
527
- let ctr = form.controls[key];
528
- ctr.markAsPristine();
529
- ctr.markAsUntouched();
530
- ctr.updateValueAndValidity();
531
- });
532
- }
533
- /**
534
- * Invalidates controls recursively.
535
- * This method marks all controls in the group as dirty and touched if they are invalid.
536
- * @param control The control or group of controls to invalidate.
537
- */
538
- invalidateControl(control) {
539
- /* Check the control against null */
540
- if (!control) {
541
- return;
542
- }
543
- /* Check if the control is a group */
544
- let formGroup = control;
545
- if (formGroup?.controls) {
546
- Object.keys(formGroup.controls)
547
- .filter(x => !formGroup.controls[x].valid)
548
- .forEach(x => this.invalidateControl(formGroup.controls[x]));
549
- }
550
- else {
551
- control.markAsDirty();
552
- control.markAsTouched();
553
- }
554
- }
555
- /**
556
- * Shows form errors.
557
- * This method logs form control errors to the console if debugging is enabled.
558
- * @param form The form to debug.
559
- */
560
- debugForm(form) {
561
- if (form && this.debug) {
562
- console.log('Form:', form);
563
- Object.keys(form.controls).forEach(key => {
564
- const controlErrors = form.controls[key].errors;
565
- if (controlErrors != null) {
566
- Object.keys(controlErrors).forEach(keyError => {
567
- console.log('Key control: ' + key + ', keyError: ' + keyError + ', err value: ', controlErrors[keyError]);
568
- });
569
- }
570
- });
571
- }
572
- }
573
- /**
574
- * Adds toolbar menu items.
575
- * This method adds the 'Delete' menu item to the toolbar if the entity is deletable.
576
- */
577
- addToolbarMenuItems() {
578
- /* Add 'Delete' menu item */
579
- if (this.deletable) {
580
- this.toolbarMenuItems.push({
581
- title: $localize `:@@delete:Delete`,
582
- icon: 'delete_forever',
583
- iconClass: 'tc-orange-800',
584
- event: () => this.delete(),
585
- disable: () => !this.id,
586
- hide: () => !this.canDeleteItem(),
587
- index: 1000
588
- });
589
- }
590
- if (this.toolbarMenuItems.length) {
591
- /* Sort the menu items by index */
592
- Utils.sortArray(this.toolbarMenuItems, 'index');
593
- /* Add the toolbar menu items to the the toolbar actions */
594
- this.toolbarActions.push({ icon: 'more_vert', items: this.toolbarMenuItems });
595
- }
596
- }
597
- /**
598
- * Loads the previous URL in the history list.
599
- * This method navigates back to the previous URL or performs specific actions based on the save action.
600
- * @param action The save action that determines the navigation behavior.
601
- */
602
- back(action = SaveAction.SaveAndClose) {
603
- if (this.reload.observed) {
604
- /* If there are observers for the reload event, emit the current form value */
605
- this.reload.emit(this.formValue);
606
- }
607
- else {
608
- /* No observers, proceed with navigation logic */
609
- if (action == SaveAction.SaveAndClose && this.returnUrl) {
610
- /* Navigate to the return URL if action is SaveAndClose and returnUrl is set */
611
- this.navigateToReturnUrl();
612
- }
613
- else {
614
- /* No returnUrl, continue with other actions */
615
- if (action == SaveAction.SaveAndClose) {
616
- /* Go back to the previous page in history */
617
- this.location.back();
618
- }
619
- else if (action == SaveAction.SaveAndEdit && parseInt(this.id?.toString() ?? '0') > 0) {
620
- /* For SaveAndEdit action with a valid ID */
621
- if (!this.currentBaseRoute?.endsWith('/add')) {
622
- /* Reload the page if the current route does not end with '/add' */
623
- this.reloadPage();
624
- }
625
- else {
626
- /* Navigate to the edit route */
627
- this.router.navigate([`${this.addSaveAndEditRoute}${this.id}`], { relativeTo: this.route });
628
- /* Replace the current history entry to remove this page from the history */
629
- this.location.replaceState(this.router.createUrlTree([`${this.addSaveAndEditRoute}${this.id}`], { relativeTo: this.route }).toString());
630
- }
631
- }
632
- else if (action == SaveAction.SaveAndNew) {
633
- /* Handle SaveAndNew action */
634
- this.afterReload();
635
- }
636
- }
637
- }
638
- }
639
- /**
640
- * Sets the return URL.
641
- * This method sets the return URL and updates the list route accordingly.
642
- * @param returnUrl The URL to return to after the current action is complete.
643
- */
644
- setReturnUrl(returnUrl) {
645
- super.setReturnUrl(returnUrl);
646
- this.listRoute = this.returnUrl || this.listRoute;
647
- }
648
- /**
649
- * Creates a new instance of TEntity.
650
- * This method initializes a new entity using the provided constructor.
651
- * @param init Optional partial initialization object.
652
- * @returns A new instance of TEntity.
653
- */
654
- newInstance(init) {
655
- return new this.entityCtor(init);
656
- }
657
- /**
658
- * Creates the entity.
659
- * This method sends a request to create a new entity on the server.
660
- * @param httpOptions Optional HTTP options for the request.
661
- * @param httpHeaders Optional HTTP headers for the request.
662
- * @returns An Observable of the created TEntity.
663
- */
664
- create(httpOptions, httpHeaders) {
665
- this.onBeforeCreate();
666
- return this.service.create(this.formValue, undefined, Object.assign(httpOptions || {}, { headers: httpHeaders ?? this.toHttpHeaders({ 'Show-Message': 'yes' }) }), false);
667
- }
668
- /**
669
- * Updates the entity.
670
- * This method sends a request to update an existing entity on the server.
671
- * @param httpOptions Optional HTTP options for the request.
672
- * @param httpHeaders Optional HTTP headers for the request.
673
- * @returns An Observable of the updated TEntity.
674
- */
675
- update(httpOptions, httpHeaders) {
676
- this.onBeforeUpdate();
677
- return this.service.update(this.id, Object.assign(this.item, this.formValue), undefined, Object.assign(httpOptions || {}, { headers: httpHeaders ?? this.toHttpHeaders({ 'Show-Message': 'yes' }), }), false);
678
- }
679
- /**
680
- * Includes specified navigations.
681
- * This method adds specified navigation properties to the includes array,
682
- * optionally adding them to the updateIncludes array as well.
683
- * @param inc The navigation property to include.
684
- * @param update Whether to include in updateIncludes array.
685
- */
686
- include(inc, update = false) {
687
- this.includes.push(inc);
688
- if (update) {
689
- this.updateIncludes.push(inc);
690
- }
691
- }
692
- /**
693
- * Checks if the item is deletable.
694
- * This method determines if the current item can be deleted based on its properties.
695
- * @returns True if the item can be deleted, false otherwise.
696
- */
697
- canDeleteItem() { return this.canDelete && (!this.item?.hasOwnProperty('deletable') || this.item['deletable']); }
698
- /**
699
- * Event emitted when the ID is set.
700
- * This method triggers the loading of the item when the ID is set.
701
- */
702
- onAfterSetId() {
703
- if (this.id) {
704
- this.loadItem();
705
- }
706
- }
707
- /**
708
- * Event emitted when the selected step has changed.
709
- * This method handles actions to be taken when the stepper selection changes.
710
- * @param $event The stepper selection event.
711
- */
712
- onAfterStepChange($event) { }
713
- /**
714
- * Sets the selected step in the stepper based on the URL hash.
715
- * Marks all previous steps as completed.
716
- */
717
- selectStepBasedOnUrlHash() {
718
- /* Ensure we are not in edit mode, and that both the stepper and URL hash are available */
719
- if (!this.isEditMode && this.matStepper && this.urlHash) {
720
- /* Find the step that matches the state from the URL hash */
721
- const matchedStep = this.matStepper.steps.find((step) => step.state === this.urlHash);
722
- if (matchedStep) {
723
- /* Get the index of the matched step */
724
- const matchedIndex = this.matStepper.steps.toArray().indexOf(matchedStep);
725
- /* Mark all previous steps as completed */
726
- this.matStepper.steps.forEach((step, index) => {
727
- if (index < matchedIndex) {
728
- step.completed = true;
729
- }
730
- });
731
- /* Set the selected step based on the matched state */
732
- this.matStepper.selectedIndex = matchedIndex;
733
- }
734
- }
735
- }
736
- /**
737
- * Event emitted when the entity has been loaded.
738
- * This method handles actions to be taken after the entity is loaded.
739
- */
740
- onAfterItemLoaded() { }
741
- /**
742
- * Event emitted before the form is built.
743
- * This method allows performing operations before the form is constructed.
744
- */
745
- onBeforeFormBuild() { }
746
- /**
747
- * Event emitted when the form has been built.
748
- * This method handles actions to be taken after the form is constructed,
749
- * such as disabling form controls if the form is set to be disabled.
750
- */
751
- onAfterFormBuild() {
752
- if (this.form && this.disabled) {
753
- Object.keys(this.form.controls).forEach(key => {
754
- let control = this.form.controls[key];
755
- control?.disable({ emitEvent: false });
756
- });
757
- }
758
- }
759
- /**
760
- * Event emitted when the entity has been created.
761
- */
762
- onBeforeCreate() { }
763
- /**
764
- * Event emitted when the entity has been updated.
765
- */
766
- onBeforeUpdate() { }
767
- /**
768
- * Called before data submission.
769
- * This method allows performing operations before submitting data.
770
- */
771
- beforeSubmit(_ = SaveAction.SaveAndClose) { }
772
- /**
773
- * Event emitted after data submission.
774
- * This method handles post-submission actions such as resetting the saving state,
775
- * updating the change detector, and navigating back based on the save action.
776
- * @param action The save action taken (e.g., SaveAndClose, SaveAndNew).
777
- * @param response The response received after submission.
778
- */
779
- onAfterSubmit(action = SaveAction.SaveAndClose, response = null) {
780
- /* Reset the saving flag once data is successfully sent */
781
- this.isSaving = false;
782
- this.changeDetectorRef.detectChanges();
783
- this.back(action);
784
- }
785
- /**
786
- * Called after the page is reloaded.
787
- * This method reinitializes the item with a new instance and applies any query parameters.
788
- */
789
- afterReload() {
790
- this.item = Object.assign(this.newInstance(), this.query);
791
- }
792
- /**
793
- * Sets focus to the first input element.
794
- * Ensures the first input element in the form is focused for user convenience.
795
- */
796
- focus() {
797
- if (this.input && this.input.first && this.input.first.nativeElement) {
798
- this.input.first.nativeElement.focus();
799
- }
800
- }
801
- /**
802
- * Retrieves the error message for a given native element.
803
- * This method navigates through the DOM structure to find error messages associated with form fields.
804
- * @param nativeElement The DOM element to check for errors.
805
- * @returns The error message associated with the element, or undefined if no error is found.
806
- */
807
- getElementError(nativeElement) {
808
- /* Get parent element 'mat-form-field' */
809
- var matFormField = nativeElement?.closest('.mat-form-field');
810
- if (!matFormField) {
811
- return undefined;
812
- }
813
- /* Get child element 'mat-error' */
814
- var matErrors = matFormField.querySelectorAll('.mat-error');
815
- if (!matErrors) {
816
- return undefined;
817
- }
818
- /* Get child element 'mat-label' */
819
- var matLabel = matFormField.querySelector('mat-label');
820
- if (!matLabel) {
821
- return undefined;
822
- }
823
- /* Get error texts */
824
- var errorsArray = Array.prototype.slice.call(matErrors)
825
- ?.filter((x) => x.textContent)
826
- ?.map((x) => x.textContent);
827
- return `'${matLabel.textContent}': ${errorsArray?.join(', ')}`;
828
- }
829
- /**
830
- * Responds to user-initiated keyboard events.
831
- * This method listens for specific key combinations and triggers save actions or form cancellation.
832
- * @param event The keyboard event triggered by the user.
833
- */
834
- handleKeyboardEvent(event) {
835
- if (event.ctrlKey || event.metaKey) {
836
- switch (event.key) {
837
- case 's':
838
- event.preventDefault();
839
- this.save(SaveAction.SaveAndClose);
840
- break;
841
- case 'd':
842
- event.preventDefault();
843
- this.save(SaveAction.SaveAndNew);
844
- break;
845
- case 'e':
846
- event.preventDefault();
847
- this.save(SaveAction.SaveAndEdit);
848
- break;
849
- }
850
- }
851
- /* Cancel the form if the user presses the ESC key */
852
- if (event.keyCode == 27) {
853
- this.back();
854
- }
855
- }
856
- /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GenericFormBaseComponent, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
857
- /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: GenericFormBaseComponent, inputs: { id: "id", _item: "_item", item: "item", includes: "includes", updateIncludes: "updateIncludes", projection: "projection", query: "query", readonly: "readonly", disabled: "disabled", form: "form" }, host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, viewQueries: [{ propertyName: "matStepper", first: true, predicate: MatStepper, descendants: true }, { propertyName: "input", predicate: ["focus"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
858
- }
859
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GenericFormBaseComponent, decorators: [{
860
- type: Directive
861
- }], ctorParameters: () => [{ type: i0.Type }, { type: undefined }, { type: i1.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { id: [{
862
- type: Input
863
- }], _item: [{
864
- type: Input
865
- }], item: [{
866
- type: Input
867
- }], includes: [{
868
- type: Input
869
- }], updateIncludes: [{
870
- type: Input
871
- }], projection: [{
872
- type: Input
873
- }], query: [{
874
- type: Input
875
- }], readonly: [{
876
- type: Input
877
- }], disabled: [{
878
- type: Input
879
- }], matStepper: [{
880
- type: ViewChild,
881
- args: [MatStepper]
882
- }], input: [{
883
- type: ViewChildren,
884
- args: ['focus']
885
- }], form: [{
886
- type: Input
887
- }], handleKeyboardEvent: [{
888
- type: HostListener,
889
- args: ['document:keydown', ['$event']]
890
- }] } });
891
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1mb3JtLWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvYmFzZS9jb21wb25lbnRzL2dlbmVyaWMtZm9ybS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQTRCLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNJLE9BQU8sRUFBbUIsU0FBUyxFQUE0QixNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUdyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTXBFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7O0FBRWpELFdBQVc7QUFFWCxNQUFNLE9BQWdCLHdCQUE0RixTQUFRLGFBQWE7SUF3TzlIO0lBQ0c7SUFDQTtJQUNBO0lBMU9YOztHQUVFO0lBQ0ssTUFBTSxHQUFXLEtBQUssQ0FBQztJQUU5Qjs7T0FFRztJQUNJLFVBQVUsR0FBWSxLQUFLLENBQUM7SUFFbkM7O09BRUc7SUFDSSxVQUFVLEdBQXNCLFVBQVUsQ0FBQztJQUVsRDs7T0FFRztJQUNJ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QUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDakMsTUFBTTtnQkFFUCxLQUFLLEdBQUc7b0JBQ1AsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDbEMsTUFBTTtZQUNSLENBQUM7UUFDRixDQUFDO1FBRUQscURBQXFEO1FBQ3JELElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDYixDQUFDO0lBQ0YsQ0FBQzswSEFwK0JvQix3QkFBd0I7OEdBQXhCLHdCQUF3QixrV0EwTGxDLFVBQVU7OzJGQTFMQSx3QkFBd0I7a0JBRDdDLFNBQVM7MkpBbUNFLEVBQUU7c0JBRFosS0FBSztnQkFlSSxLQUFLO3NCQURkLEtBQUs7Z0JBT0ssSUFBSTtzQkFEZCxLQUFLO2dCQW1CQyxRQUFRO3NCQURkLEtBQUs7Z0JBT0MsY0FBYztzQkFEcEIsS0FBSztnQkFPQyxVQUFVO3NCQURoQixLQUFLO2dCQU9DLEtBQUs7c0JBRFgsS0FBSztnQkFPQyxRQUFRO3NCQURkLEtBQUs7Z0JBT0MsUUFBUTtzQkFEZCxLQUFLO2dCQXNGSSxVQUFVO3NCQURuQixTQUFTO3VCQUFDLFVBQVU7Z0JBT2QsS0FBSztzQkFEWCxZQUFZO3VCQUFDLE9BQU87Z0JBWVYsSUFBSTtzQkFEZCxLQUFLO2dCQWl3QkMsbUJBQW1CO3NCQUR6QixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RlcHBlclNlbGVjdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3N0ZXBwZXInO1xyXG5pbXBvcnQgeyBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBUeXBlLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCwgTmdGb3JtLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRTdGVwcGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc3RlcHBlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9jb21tb24vZnVuY3Rpb25zL3V0aWxzJztcclxuaW1wb3J0IHsgQWN0aW9uSXRlbSB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvYWN0aW9uLWl0ZW0nO1xyXG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9lbnRpdHknO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9wZXJtaXNzaW9uJztcclxuaW1wb3J0IHsgU2F2ZUFjdGlvbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvc2F2ZS1hY3Rpb24nO1xyXG5pbXBvcnQgeyBnZXRGb3JtRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Zvcm1zL2Z1bmN0aW9ucy9mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBGb3JtRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Zvcm1zL21vZGVscy9mb3JtLWRlZmluaXRpb24nO1xyXG5pbXBvcnQgeyBGb3JtRmllbGRHcm91cERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9mb3Jtcy9tb2RlbHMvZm9ybS1maWVsZC1ncm91cC1kZWZpbml0aW9uJztcclxuaW1wb3J0IHsgQXBpUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9odHRwL21vZGVscy9yZXNwb25zZSc7XHJcbmltcG9ydCB7IEdlbmVyaWNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaHR0cC9zZXJ2aWNlcy9nZW5lcmljLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pZ2VuZXJpYy1mb3JtLWJhc2UnO1xyXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9iYXNlLmNvbXBvbmVudCc7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudDxURW50aXR5IGV4dGVuZHMgSUVudGl0eSwgVFNlcnZpY2UgZXh0ZW5kcyBHZW5lcmljU2VydmljZTxURW50aXR5Pj4gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgSUdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudDxURW50aXR5PiwgT25DaGFuZ2VzIHtcclxuXHQvKipcclxuICogVGhlIGFjdGlvbiBvZiB0aGUgZm9ybSAoYWRkIHwgZWRpdCkuXHJcbiAqL1xyXG5cdHB1YmxpYyBhY3Rpb246IHN0cmluZyA9ICdhZGQnO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhlIGZvcm0gaXMgaW4gZWRpdCBtb2RlLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhdmUgYWN0aW9uIGVudW1lcmF0aW9uLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBTYXZlQWN0aW9uOiB0eXBlb2YgU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb247XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5hdmlnYXRpb24gcm91dGVzLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZGl0U2F2ZUFuZENsb3NlUm91dGU6IHN0cmluZyA9ICcuLi8uLi8nO1xyXG5cdHB1YmxpYyBhZGRTYXZlQW5kQ2xvc2VSb3V0ZTogc3RyaW5nID0gJy4uLyc7XHJcblx0cHVibGljIGFkZFNhdmVBbmRFZGl0Um91dGU6IHN0cmluZyA9ICcuLi9lZGl0Lyc7XHJcblx0cHVibGljIGFkZFNhdmVBbmROZXdSb3V0ZTogc3RyaW5nID0gJy4uL2FkZCc7XHJcblx0cHVibGljIGxpc3RSb3V0ZTogc3RyaW5nID0gdGhpcy5hZGRTYXZlQW5kQ2xvc2VSb3V0ZTtcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIElEIG9mIHRoZSBpdGVtIHRvIGxvYWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIF9pZD86IG51bWJlciB8IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIElEIG9mIHRoZSBpdGVtIHRvIGxvYWQuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9pZDsgfVxyXG5cdHB1YmxpYyBzZXQgaWQoaWQ6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG5cdFx0aWYgKHRoaXMuX2lkICE9IGlkKSB7XHJcblx0XHRcdHRoaXMuX2lkID0gaWQ7XHJcblx0XHRcdHRoaXMuYWN0aW9uID0gJ2VkaXQnO1xyXG5cdFx0XHR0aGlzLmlzRWRpdE1vZGUgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmxpc3RSb3V0ZSA9IHRoaXMuZWRpdFNhdmVBbmRDbG9zZVJvdXRlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgaXRlbSB0byBhZGQgb3IgZWRpdC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHByb3RlY3RlZCBfaXRlbT86IFRFbnRpdHk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjdXJyZW50IGl0ZW0gdG8gYWRkIG9yIGVkaXQuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGl0ZW0oKTogVEVudGl0eSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9pdGVtOyB9XHJcblx0cHVibGljIHNldCBpdGVtKGl0ZW06IFRFbnRpdHkgfCB1bmRlZmluZWQpIHtcclxuXHRcdGlmICh0aGlzLl9pdGVtICE9PSBpdGVtKSB7XHJcblx0XHRcdHRoaXMuX2l0ZW0gPSBpdGVtO1xyXG5cdFx0XHR0aGlzLmlkID8/PSBpdGVtPy5pZDtcclxuXHRcdFx0dGhpcy5idWlsZEZpZWxkcygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgcmVxdWVzdCBlcnJvcnMuXHJcblx0ICovXHJcblx0cHVibGljIGVycm9yczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluY2x1ZGVzIGZpZWxkcyBmb3IgcXVlcnkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgaW5jbHVkZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSBpbmNsdWRlcyBmaWVsZHMgZm9yIHF1ZXJ5LlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHVwZGF0ZUluY2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBQcm9qZWN0aW9uIGZpZWxkcyBmb3IgcXVlcnkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcHJvamVjdGlvbj86IHN0cmluZ1tdO1xyXG5cclxuXHQvKipcclxuXHQgKiBRdWVyeSBwYXJhbWV0ZXJzLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHF1ZXJ5OiBhbnkgPSB7fTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVhZC1vbmx5IGZsYWcuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRGlzYWJsZWQgZmxhZy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY3VycmVudCBkYXRlLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjdXJyZW50RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERhdGUgJiB0aW1lIGlucHV0IG1hc2suXHJcblx0ICovXHJcblx0cHVibGljIGRhdGVUaW1lTWFzayA9IFsvWzAtM10vLCAvWzAtOV0vLCAnLicsIC9bMC0xXS8sIC9bMC05XS8sICcuJywgMiwgMCwgL1sxLTJdLywgL1swLTldLywgJyAnLCAvWzAtMl0vLCAvWzAtOV0vLCAnOicsIC9bMC01XS8sIC9bMC05XS9dO1xyXG5cclxuXHQvKipcclxuXHQgKiBEYXRlIGlucHV0IG1hc2suXHJcblx0ICovXHJcblx0cHVibGljIGRhdGVNYXNrID0gWy9bMC0zXS8sIC9bMC05XS8sICcuJywgL1swLTFdLywgL1swLTldLywgJy4nLCAyLCAwLCAvWzEtMl0vLCAvWzAtOV0vXTtcclxuXHJcblx0LyoqXHJcblx0ICogVGltZSBpbnB1dCBtYXNrLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0aW1lTWFzayA9IFsvWzAtMl0vLCAvWzAtOV0vLCAnOicsIC9bMC01XS8sIC9bMC05XS9dO1xyXG5cclxuXHQvKipcclxuXHQgKiBEYXRlIHZhbGlkYXRpb24gcGF0dGVybi5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGF0ZVBhdHRlcm46IHN0cmluZyA9IGAoPzooPzozMShcXFxcL3wtfFxcXFwuKSg/OjA/WzEzNTc4XXwxWzAyXSkpXFxcXDF8KD86KD86Mjl8MzApKFxcXFwvfC18XFxcXC4pKD86MD9bMSwzLTldfDFbMC0yXSlcXFxcMikpKD86KD86MVs2LTldfFsyLTldXFxcXGQpP1xcXFxkezJ9KSR8Xig/OjI5KFxcXFwvfC18XFxcXC4pMD8yXFxcXDMoPzooPzooPzoxWzYtOV18WzItOV1cXFxcZCk/KD86MFs0OF18WzI0NjhdWzA0OF18WzEzNTc5XVsyNl0pfCg/Oig/OjE2fFsyNDY4XVswNDhdfFszNTc5XVsyNl0pMDApKSkpJHxeKD86MD9bMS05XXwxXFxcXGR8MlswLThdKShcXFxcL3wtfFxcXFwuKSg/Oig/OjA/WzEtOV0pfCg/OjFbMC0yXSkpXFxcXDQoPzooPzoxWzYtOV18WzItOV1cXFxcZCk/XFxcXGR7Mn0pYDtcclxuXHJcblx0LyoqXHJcblx0ICogUGhvbmUgcHJlZml4IHZhbGlkYXRpb24gcGF0dGVybi5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGhvbmVQcmVmaXhQYXR0ZXJuOiBzdHJpbmcgPSAnXigwXFxcXGR7Miw2fSkkJztcclxuXHJcblx0LyoqXHJcblx0ICogUGhvbmUgbnVtYmVyIHZhbGlkYXRpb24gcGF0dGVybi5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGhvbmVOdW1iZXJQYXR0ZXJuOiBzdHJpbmcgPSAnXihcXFxcZHszLDMwfSkkJztcclxuXHJcblx0LyoqXHJcblx0ICogUGFzc3dvcmQgdmFsaWRhdGlvbiBwYXR0ZXJuLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXNzd29yZFBhdHRlcm46IHN0cmluZyA9ICdeKD89LipbYS16XSkoPz0uKltBLVpdKSg/PS4qXFxcXGQpKD89LipbJEAkISUqPyYjLl0pW0EtWmEtelxcXFxkJEAkISUqPyYjLl17Nix9JCc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVkaXRvciBvcHRpb25zIGluY2x1ZGluZyBkZWZhdWx0IG1vZHVsZXMgYW5kIHRvb2xiYXIgY29uZmlndXJhdGlvbi5cclxuXHQgKi9cclxuXHRwdWJsaWMgZWRpdG9yT3B0aW9ucyA9IHtcclxuXHRcdG1vZHVsZXM6IHtcclxuXHRcdFx0dG9vbGJhcjogW1xyXG5cdFx0XHRcdFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJ10sXHJcblx0XHRcdFx0W3sgJ2xpc3QnOiAnb3JkZXJlZCcgfSwgeyAnbGlzdCc6ICdidWxsZXQnIH1dLFxyXG5cdFx0XHRcdFt7ICdpbmRlbnQnOiAnLTEnIH0sIHsgJ2luZGVudCc6ICcrMScgfV0sXHJcblx0XHRcdFx0W3sgJ3NpemUnOiBbJ3NtYWxsJywgZmFsc2UsICdsYXJnZScsICdodWdlJ10gfV0sXHJcblx0XHRcdFx0W3sgJ2hlYWRlcic6IFsxLCAyLCAzLCA0LCA1LCA2LCBmYWxzZV0gfV0sXHJcblx0XHRcdFx0W3sgJ2NvbG9yJzogbmV3IEFycmF5PGFueT4oKSB9LCB7ICdiYWNrZ3JvdW5kJzogbmV3IEFycmF5PGFueT4oKSB9XSxcclxuXHRcdFx0XHRbJ2xpbmsnLCAnaW1hZ2UnXVxyXG5cdFx0XHRdLFxyXG5cdFx0XHRjbGlwYm9hcmQ6IHtcclxuXHRcdFx0XHRtYXRjaFZpc3VhbDogZmFsc2VcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRydWUsIHNob3dzIHRoZSAnRGVsZXRlJyBtZW51LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBkZWxldGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBUb29sYmFyIG1lbnUgaXRlbXMuXHJcblx0ICovXHJcblx0cHVibGljIHRvb2xiYXJNZW51SXRlbXM6IEFjdGlvbkl0ZW1bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBUb29sYmFyIGFjdGlvbiBidXR0b25zLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0b29sYmFyQWN0aW9uczogQWN0aW9uSXRlbTxURW50aXR5LCBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+PltdID0gW3tcclxuXHRcdGljb246ICdyZWZyZXNoJyxcclxuXHRcdHRvb2x0aXA6ICRsb2NhbGl6ZWA6QEByZWZyZXNoUGFnZTpSZWZyZXNoIHRoZSBwYWdlYCxcclxuXHRcdGV2ZW50OiAoKSA9PiB0aGlzLnJlbG9hZFBhZ2UoKSxcclxuXHR9XTtcclxuXHJcblx0LyoqXHJcblx0ICogTWF0U3RlcHBlciByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRTdGVwcGVyKVxyXG5cdHByb3RlY3RlZCBtYXRTdGVwcGVyPzogTWF0U3RlcHBlcjtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBlbGVtZW50cy5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKCdmb2N1cycpXHJcblx0cHVibGljIGlucHV0OiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvcm0gZ3JvdXAgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cHVibGljIF9mb3JtPzogTmdGb3JtIHwgRm9ybUdyb3VwO1xyXG5cclxuXHQvKipcclxuXHQgKiBGb3JtIGdyb3VwLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCBmb3JtKCk6IE5nRm9ybSB8IEZvcm1Hcm91cCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb3JtOyB9XHJcblx0cHVibGljIHNldCBmb3JtKGZvcm06IE5nRm9ybSB8IEZvcm1Hcm91cCB8IHVuZGVmaW5lZCkge1xyXG5cdFx0dGhpcy5fZm9ybSA9IGZvcm07XHJcblx0XHR0aGlzLm9uQWZ0ZXJGb3JtQnVpbGQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIGZvcm0gdmFsdWUuXHJcblx0ICovXHJcblx0cHVibGljIGFic3RyYWN0IGdldCBmb3JtVmFsdWUoKTogVEVudGl0eSB8IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogRm9ybSBkZWZpbml0aW9uLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBmb3JtRGVmaW5pdGlvbj86IEZvcm1EZWZpbml0aW9uO1xyXG5cclxuXHQvKipcclxuXHQgKiBGaWVsZCBncm91cHMgZGVmaW5pdGlvbi5cclxuXHQgKi9cclxuXHRwdWJsaWMgZmllbGRHcm91cHM/OiBGb3JtRmllbGRHcm91cERlZmluaXRpb25bXTtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3IuXHJcblx0ICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gbWFuYWdlIHRoZSBlbnRpdHkuXHJcblx0ICogQHBhcmFtIHJvdXRlIFRoZSBhY3RpdmF0ZWQgcm91dGUuXHJcblx0ICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIFRoZSBjaGFuZ2UgZGV0ZWN0b3IgcmVmZXJlbmNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIGVudGl0eUN0b3I6IFR5cGU8VEVudGl0eT4sXHJcblx0XHRwcm90ZWN0ZWQgc2VydmljZTogVFNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG5cdFx0cHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG5cdCkge1xyXG5cdFx0c3VwZXIocm91dGUsIGNoYW5nZURldGVjdG9yUmVmKTtcclxuXHRcdHRoaXMubGlzdFJvdXRlID0gdGhpcy5hZGRTYXZlQW5kQ2xvc2VSb3V0ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxlZCBhZnRlciB0aGUgY29uc3RydWN0b3IsIGluaXRpYWxpemluZyBpbnB1dCBwcm9wZXJ0aWVzLCBcclxuXHQgKiBhbmQgdGhlIGZpcnN0IGNhbGwgdG8gbmdPbkNoYW5nZXMuXHJcblx0ICovXHJcblx0cHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0c3VwZXIubmdPbkluaXQoKTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgYSBjb21wb25lbnQncyB2aWV3IGhhcyBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmhhbmRsZUV4cGFuc2lvblBhbmVsQ2hhbmdlcyA9IHRoaXMuaXNFZGl0TW9kZTtcclxuXHRcdHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG5cclxuXHRcdC8qIFNldCBwYWdlIHRpdGxlICovXHJcblx0XHR0aGlzLnRpdGxlID0gdGhpcy50aXRsZVNlcnZpY2UuZ2V0VGl0bGUoKTtcclxuXHJcblx0XHQvKiBTZXQgZm9jdXMgKi9cclxuXHRcdHRoaXMuZm9jdXMoKTtcclxuXHJcblx0XHQvKiBcclxuXHRcdCAqIEZvcmNlIGEgbmV3IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUgc2luY2UgY2hhbmdlIGRldGVjdGlvbnMgXHJcblx0XHQgKiBoYXZlIGZpbmlzaGVkIHdoZW4gYG5nQWZ0ZXJWaWV3SW5pdGAgaXMgZXhlY3V0ZWQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuXHRcdC8qIExpc3RlbiBmb3Igc3RlcHBlciBzZWxlY3Rpb24gY2hhbmdlcyAqL1xyXG5cdFx0dGhpcy5tYXRTdGVwcGVyPy5zZWxlY3Rpb25DaGFuZ2U/LnN1YnNjcmliZSgoZXZlbnQ6IFN0ZXBwZXJTZWxlY3Rpb25FdmVudCkgPT4gdGhpcy5vbkFmdGVyU3RlcENoYW5nZShldmVudCkpO1xyXG5cclxuXHRcdC8qIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgc3RlcCBiYXNlZCBvbiB0aGUgVVJMIGhhc2ggYW5kIG1hcmsgcHJldmlvdXMgc3RlcHMgYXMgY29tcGxldGVkICovXHJcblx0XHR0aGlzLnNlbGVjdFN0ZXBCYXNlZE9uVXJsSGFzaCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbGlmZWN5Y2xlIGhvb2suIFVzZSBpdCB0byBpbmplY3QgZGVwZW5kZW5jaWVzLCBcclxuXHQgKiBidXQgYXZvaWQgYW55IHNlcmlvdXMgd29yayBoZXJlLlxyXG5cdCAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBjaGFuZ2VzIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG5cdFx0aWYgKFxyXG5cdFx0XHQoY2hhbmdlcz8uaWQ/LmN1cnJlbnRWYWx1ZSAmJiBjaGFuZ2VzLmlkLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5pZC5wcmV2aW91c1ZhbHVlKSB8fFxyXG5cdFx0XHQoY2hhbmdlcz8uaXRlbT8uY3VycmVudFZhbHVlICYmIGNoYW5nZXMuaXRlbS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuaXRlbS5wcmV2aW91c1ZhbHVlKVxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMubG9hZEl0ZW0oKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIGFuIGl0ZW0gYnkgSUQuXHJcblx0ICogVGhpcyBtZXRob2QgZmV0Y2hlcyB0aGUgaXRlbSBpZiB0aGUgY29tcG9uZW50IGlzIGluIGVkaXQgbW9kZSBhbmQgdGhlIHNlcnZpY2UgZW5kcG9pbnQgaXMgZGVmaW5lZC5cclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgaXRlbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkLlxyXG5cdCAqICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWNlaXZlIHRoZSBsb2FkZWQgaXRlbSBhcyBhbiBhcmd1bWVudC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbG9hZEl0ZW0oY2FsbGJhY2s/OiAoaXRlbTogeyBlbnRpdHk6IFRFbnRpdHksIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uIH0pID0+IHZvaWQpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy5zZXJ2aWNlPy5lbmRwb2ludCkge1xyXG5cdFx0XHQvKiBTZXQgbG9hZGluZyBzdGF0ZSB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgYW4gaXRlbSBpcyBiZWluZyBsb2FkZWQgKi9cclxuXHRcdFx0dGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0LyogVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdmlldyB3aXRoIHRoZSBsb2FkaW5nIHN0YXRlICovXHJcblx0XHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuXHRcdFx0LyogQ2FsbCB0aGUgYXN5bmNocm9ub3VzIG1ldGhvZCB0byBsb2FkIHRoZSBpdGVtICovXHJcblx0XHRcdHRoaXMubG9hZEl0ZW1Bc3luYygpLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0LyogSGFuZGxlIHRoZSByZXNwb25zZSB3aGVuIHRoZSBpdGVtIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQgKi9cclxuXHRcdFx0XHRuZXh0OiAoaXRlbSkgPT4ge1xyXG5cdFx0XHRcdFx0LyogU2V0IGxvYWRpbmcgc3RhdGUgdG8gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCBsb2FkaW5nIGhhcyBjb21wbGV0ZWQgKi9cclxuXHRcdFx0XHRcdHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0LyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgaWYgcHJvdmlkZWQsIHBhc3NpbmcgdGhlIGxvYWRlZCBpdGVtICovXHJcblx0XHRcdFx0XHRpZiAoY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdFx0Y2FsbGJhY2soaXRlbSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBIYW5kbGUgYW55IGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyB0aGUgbG9hZGluZyBwcm9jZXNzICovXHJcblx0XHRcdFx0ZXJyb3I6IChlcnJvcikgPT4gdGhpcy5wYXJzZUVycm9ycyhlcnJvcilcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMb2FkcyBhbiBpdGVtIGJ5IElEIGFzeW5jaHJvbm91c2x5LlxyXG5cdCAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgb2YgdGhlIGxvYWRlZCBlbnRpdHkuXHJcblx0ICovXHJcblx0cHVibGljIGxvYWRJdGVtQXN5bmMoKTogT2JzZXJ2YWJsZTx7IGVudGl0eTogVEVudGl0eSwgcGVybWlzc2lvbnM6IFBlcm1pc3Npb24gfT4ge1xyXG5cdFx0aWYgKHRoaXMuaWQpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuc2VydmljZS5nZXQodGhpcy5pZCwgT2JqZWN0LmFzc2lnbih0aGlzLnF1ZXJ5IHx8IHt9LCB7XHJcblx0XHRcdFx0aW5jbHVkZXM6IHRoaXMuaW5jbHVkZXM/Lmxlbmd0aCA/IHRoaXMuaW5jbHVkZXMgOiB0aGlzLnVwZGF0ZUluY2x1ZGVzLFxyXG5cdFx0XHRcdHByb2plY3Rpb246IHRoaXMucHJvamVjdGlvbj8uam9pbignLCcpLFxyXG5cdFx0XHRcdG9ic2VydmU6ICdyZXNwb25zZSdcclxuXHRcdFx0fSksIHsgJ0Rpc2FibGUtQ2FjaGUnOiAnWWVzJyB9LCB0cnVlLCB0cnVlKS5waXBlKFxyXG5cdFx0XHRcdG1hcCgocmVzcG9uc2UpID0+IHtcclxuXHRcdFx0XHRcdC8qIFJlYWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgaHR0cCBoZWFkZXJzICovXHJcblx0XHRcdFx0XHRjb25zdCBwZXJtaXNzaW9ucyA9IHJlc3BvbnNlPy5oZWFkZXJzPy5nZXQoJ1Blcm1pc3Npb25zJyk/LnNwbGl0KCc7JykgPz8gW107XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0ZW50aXR5OiBPYmplY3QuYXNzaWduKHRoaXMubmV3SW5zdGFuY2UoKSwgcmVzcG9uc2UuYm9keSBhcyBURW50aXR5KSxcclxuXHRcdFx0XHRcdFx0cGVybWlzc2lvbnM6IG5ldyBQZXJtaXNzaW9uKHtcclxuXHRcdFx0XHRcdFx0XHRjYW5DcmVhdGU6IHBlcm1pc3Npb25zLmluY2x1ZGVzKCdDcmVhdGUnKSxcclxuXHRcdFx0XHRcdFx0XHRjYW5SZWFkOiBwZXJtaXNzaW9ucy5pbmNsdWRlcygnUmVhZCcpLFxyXG5cdFx0XHRcdFx0XHRcdGNhblVwZGF0ZTogcGVybWlzc2lvbnMuaW5jbHVkZXMoJ1VwZGF0ZScpLFxyXG5cdFx0XHRcdFx0XHRcdGNhbkRlbGV0ZTogcGVybWlzc2lvbnMuaW5jbHVkZXMoJ0RlbGV0ZScpLFxyXG5cdFx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0XHR0YXAoeCA9PiB7XHJcblx0XHRcdFx0XHQvKiBTZXQgdGhlIGxvYWRlZCBpdGVtICovXHJcblx0XHRcdFx0XHR0aGlzLml0ZW0gPSBPYmplY3QuYXNzaWduKHRoaXMubmV3SW5zdGFuY2UoKSwgPFRFbnRpdHk+eC5lbnRpdHkpO1xyXG5cclxuXHRcdFx0XHRcdC8qIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlICovXHJcblx0XHRcdFx0XHR0aGlzLmNhbkNyZWF0ZSB8fD0geC5wZXJtaXNzaW9ucy5jYW5DcmVhdGU7XHJcblx0XHRcdFx0XHR0aGlzLmNhblJlYWQgfHw9IHgucGVybWlzc2lvbnMuY2FuUmVhZDtcclxuXHRcdFx0XHRcdHRoaXMuY2FuVXBkYXRlIHx8PSB4LnBlcm1pc3Npb25zLmNhblVwZGF0ZTtcclxuXHRcdFx0XHRcdHRoaXMuY2FuRGVsZXRlIHx8PSB4LnBlcm1pc3Npb25zLmNhbkRlbGV0ZTtcclxuXHJcblx0XHRcdFx0XHQvKiBCdWlsZCB0aGUgZm9ybSAqL1xyXG5cdFx0XHRcdFx0dGhpcy5idWlsZEZvcm0oKTtcclxuXHJcblx0XHRcdFx0XHQvKiBUcmlnZ2VyIGV2ZW50IGFmdGVySXRlbUxvYWRlZCAqL1xyXG5cdFx0XHRcdFx0dGhpcy5vbkFmdGVySXRlbUxvYWRlZCgpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBPYnNlcnZhYmxlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTYXZlcyBkYXRhIGludG8gdGhlIGRhdGFiYXNlLlxyXG5cdCAqIFRoaXMgbWV0aG9kIHZhbGlkYXRlcyB0aGUgZm9ybSwgY2hlY2tzIGlmIGl0J3MgdmFsaWQsIGFuZCBzZW5kcyBkYXRhIHRvIHRoZSBzZXJ2ZXIgdG8gZWl0aGVyIHVwZGF0ZSBvciBjcmVhdGUgYSBuZXcgcmVjb3JkLlxyXG5cdCAqIEBwYXJhbSBhY3Rpb24gVGhlIHNhdmUgYWN0aW9uIHRvIHBlcmZvcm0uXHJcblx0ICogQHBhcmFtIGZvcm0gVGhlIGZvcm0gdG8gdmFsaWRhdGUgYW5kIHNhdmUuXHJcblx0ICovXHJcblx0cHVibGljIHNhdmUoYWN0aW9uOiBTYXZlQWN0aW9uID0gU2F2ZUFjdGlvbi5TYXZlQW5kQ2xvc2UsIGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdC8qIFZhbGlkYXRlIHRoZSBmb3JtIGRhdGEgYmVmb3JlIHByb2NlZWRpbmcgKi9cclxuXHRcdHRoaXMudmFsaWRhdGVGb3JtKGZvcm0pO1xyXG5cclxuXHRcdC8qIEVuc3VyZSB0aGF0IHRoZSBmb3JtIHJlZmVyZW5jZSBpcyBzZXQgYW5kIHZhbGlkYXRlZCAqL1xyXG5cdFx0Zm9ybSA9IHRoaXMuZm9ybSB8fCBmb3JtO1xyXG5cclxuXHRcdC8qIEV4aXQgaWYgdGhlIGZvcm0gaXMgaW52YWxpZCAqL1xyXG5cdFx0aWYgKGZvcm0gJiYgIXRoaXMuaXNGb3JtVmFsaWQoZm9ybSkpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNldCBhIGZsYWcgdG8gcHJldmVudCBkdXBsaWNhdGUgZm9ybSBzdWJtaXNzaW9ucyAqL1xyXG5cdFx0dGhpcy5pc1NhdmluZyA9IHRydWU7XHJcblxyXG5cdFx0LyogSWYgaW4gZWRpdCBtb2RlLCB1cGRhdGUgdGhlIHJlY29yZCAqL1xyXG5cdFx0aWYgKHRoaXMuaXNFZGl0TW9kZSkge1xyXG5cdFx0XHQvKiBUaGUgZGF0YSBoYXMgbm90IGNoYW5nZWQ/ICovXHJcblx0XHRcdGlmIChmb3JtICYmIGZvcm0ucHJpc3RpbmUpIHtcclxuXHRcdFx0XHR0aGlzLm9uQWZ0ZXJTdWJtaXQoYWN0aW9uKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFNlbmQgdGhlIGRhdGEgdG8gdGhlIHNlcnZlciAqL1xyXG5cdFx0XHR0aGlzLnVwZGF0ZSh7IHBhcmFtczogVXRpbHMudG9IdHRwUGFyYW1zKHsgaW5jbHVkZXM6IHRoaXMudXBkYXRlSW5jbHVkZXMgfSkgfSkuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuXHRcdFx0XHRcdC8qIEFwcGx5IHNhdmVkIGRhdGEgdG8gdGhlIGZvcm0gKi9cclxuXHRcdFx0XHRcdHRoaXMub25BZnRlclN1Ym1pdChhY3Rpb24sIHJlc3BvbnNlKTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiB0aGUgdXNlciBjbGlja3MgJ2FwcGx5JyByZWxvYWQgdGhlIHBhZ2UgKi9cclxuXHRcdFx0XHRcdGlmIChhY3Rpb24gPT0gU2F2ZUFjdGlvbi5TYXZlQW5kRWRpdCkge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5yZWxvYWQub2JzZXJ2ZWQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnJlbG9hZC5lbWl0KHRoaXMuZm9ybVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnJlbG9hZFBhZ2UoKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblxyXG5cdFx0XHRcdC8qIFByb2Nlc3MgYW55IGVycm9ycyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgKi9cclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB0aGlzLnBhcnNlRXJyb3JzKGVycm9yKVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdC8qIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IG9uZSAqL1xyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdC8qIFNlbmQgdGhlIGRhdGEgdG8gdGhlIHNlcnZlciAqL1xyXG5cdFx0XHR0aGlzLmNyZWF0ZTxBcGlSZXNwb25zZTxURW50aXR5Pj4oKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5pZCA9IHJlc3BvbnNlPy52YWx1ZT8uaWQ7XHJcblx0XHRcdFx0XHR0aGlzLm9uQWZ0ZXJTdWJtaXQoYWN0aW9uLCByZXNwb25zZSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0T2JqZWN0LmtleXMoZm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBjdHIgPSBmb3JtIS5jb250cm9sc1trZXldO1xyXG5cdFx0XHRcdFx0XHRcdGN0ci5tYXJrQXNQcmlzdGluZSgpO1xyXG5cdFx0XHRcdFx0XHRcdGN0ci5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHRcdFx0XHRcdFx0XHRjdHIudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cclxuXHRcdFx0XHQvKiBQcm9jZXNzIGFueSBlcnJvcnMgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlICovXHJcblx0XHRcdFx0ZXJyb3I6IChlcnJvcikgPT4gdGhpcy5wYXJzZUVycm9ycyhlcnJvcilcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogRGV0ZWN0IGNoYW5nZXMgKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2F2ZXMgZGF0YSBhbmQgbmF2aWdhdGVzIHRvIHRoZSBlZGl0IHZpZXcuXHJcblx0ICovXHJcblx0cHVibGljIGFwcGx5KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zYXZlKFNhdmVBY3Rpb24uU2F2ZUFuZEVkaXQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVsZXRlcyB0aGUgY3VycmVudCByZWNvcmQuXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvd3MgYSBjb25maXJtYXRpb24gZGlhbG9nIGFuZCBkZWxldGVzIHRoZSByZWNvcmQgaWYgdGhlIHVzZXIgY29uZmlybXMuXHJcblx0ICogQHBhcmFtIGh0dHBIZWFkZXJzIE9wdGlvbmFsIEhUVFAgaGVhZGVycyB0byBpbmNsdWRlIGluIHRoZSBkZWxldGUgcmVxdWVzdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGVsZXRlKGh0dHBIZWFkZXJzPzogSHR0cEhlYWRlcnMpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2hvd0RlbGV0ZUl0ZW1EaWFsb2coKS5zdWJzY3JpYmUoKGFjY2VwdDogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRpZiAoYWNjZXB0ICYmIHRoaXMuaWQpIHtcclxuXHRcdFx0XHR0aGlzLnNlcnZpY2UuZGVsZXRlKHRoaXMuaWQhLCB1bmRlZmluZWQsIHsgaGVhZGVyczogaHR0cEhlYWRlcnMgPz8gdGhpcy50b0h0dHBIZWFkZXJzKHsgJ1Nob3ctTWVzc2FnZSc6ICd5ZXMnIH0pIH0pXHJcblx0XHRcdFx0XHQuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5iYWNrKCk7XHJcblx0XHRcdFx0XHR9LCBlcnJvciA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZGVidWcoZXJyb3IpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGZvcm0uXHJcblx0ICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUgZm9ybSBieSBleHRyYWN0aW5nIHF1ZXJ5IHBhcmFtZXRlcnMsIHNldHRpbmcgdGhlIGVudGl0eSBJRCwgYW5kIGJ1aWxkaW5nIHRoZSBmb3JtLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBpbml0KCk6IHZvaWQge1xyXG5cdFx0LyogR2V0IHRoZSBlbnRpdHkgSUQgZnJvbSB0aGUgcXVlcnkgKi9cclxuXHRcdGlmICghdGhpcy5pZCAmJiAhdGhpcy5pdGVtKSB7XHJcblx0XHRcdC8qIEFzc2lnbiBxdWVyeSBwYXJhbXMgaW50byBxdWVyeSBvYmplY3QgKi9cclxuXHRcdFx0bGV0IGlnbm9yZWRQYXJhbXM6IHN0cmluZ1tdID0gWydpZCcsICdyZXR1cm51cmwnLCAncGFuZWxJZCddO1xyXG5cdFx0XHRPYmplY3QuYXNzaWduKHRoaXMucXVlcnksXHJcblx0XHRcdFx0dGhpcy5zYW5pdGl6ZU9iamVjdCh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcyB8fCB7fSwgLi4uaWdub3JlZFBhcmFtcyksXHJcblx0XHRcdFx0dGhpcy5zYW5pdGl6ZU9iamVjdCh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGE/LnF1ZXJ5IHx8IHt9LCAuLi5pZ25vcmVkUGFyYW1zKSxcclxuXHRcdFx0XHR0aGlzLnNhbml0aXplT2JqZWN0KHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfHwge30sIC4uLmlnbm9yZWRQYXJhbXMpXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHQvKiBHZXQgaWQgZnJvbSB0aGUgdXJsICovXHJcblx0XHRcdGxldCBpZCA9IDxhbnk+dGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJyk7XHJcblx0XHRcdGlmIChpZCA+IDApIHtcclxuXHRcdFx0XHR0aGlzLmlkID0gaWQ7XHJcblx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuaWQgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdD8uZGF0YT8uaWQpIHtcclxuXHRcdFx0XHR0aGlzLmlkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdD8uZGF0YT8uaWQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMub25BZnRlclNldElkKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBURW50aXR5ICovXHJcblx0XHRpZiAoIXRoaXMuaXNFZGl0TW9kZSAmJiAhdGhpcy5mb3JtKSB7XHJcblx0XHRcdHRoaXMuaXRlbSA9IE9iamVjdC5hc3NpZ24odGhpcy5uZXdJbnN0YW5jZSgpLCB0aGlzLml0ZW0gfHwge30sIHRoaXMucXVlcnkgfHwge30pO1xyXG5cdFx0XHR0aGlzLmJ1aWxkRm9ybSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNldCBwYW5lbCBJRCBmcm9tIHF1ZXJ5ICovXHJcblx0XHR0aGlzLnN1YnRpdGxlIHx8PSB0aGlzLnJvdXRlLnNuYXBzaG90Py5kYXRhPy5zdWJ0aXRsZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ1aWxkcyB0aGUgZm9ybSBmaWVsZHMuXHJcblx0ICogVGhpcyBtZXRob2QgY29uc3RydWN0cyBmb3JtIGZpZWxkcyBiYXNlZCBvbiB0aGUgZW50aXR5J3MgZm9ybSBkZWZpbml0aW9uIGFuZCBpbmNsdWRlcyBuZWNlc3NhcnkgbmF2aWdhdGlvbiBhbmQgbWVudSBpdGVtcy5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgYnVpbGRGaWVsZHMoKTogdm9pZCB7XHJcblx0XHQvKiBHZXQgZm9ybSBkZWZpbml0aW9uICovXHJcblx0XHR0aGlzLmZvcm1EZWZpbml0aW9uID0gZ2V0Rm9ybURlZmluaXRpb24odGhpcy5uZXdJbnN0YW5jZSgpKTtcclxuXHJcblx0XHQvKiBTZXQgaW5jbHVkZXMgZnJvbSBmb3JtIGRlZmluaXRpb24sIGlmIGFueSAqL1xyXG5cdFx0dGhpcy5mb3JtRGVmaW5pdGlvbj8uaW5jbHVkZXM/LmZvckVhY2goeCA9PiB0aGlzLmluY2x1ZGUoeC5lbnRpdHksIHgudXBkYXRlKSk7XHJcblxyXG5cdFx0LyogQWRkIHRvb2xiYXIgbWVudSBpdGVtcywgaWYgYW55ICovXHJcblx0XHRpZiAodGhpcy5mb3JtRGVmaW5pdGlvbj8udG9vbGJhck1lbnVJdGVtcz8ubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcyA/Pz0gW107XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcyA9IHRoaXMudG9vbGJhck1lbnVJdGVtcy5jb25jYXQoLi4udGhpcy5mb3JtRGVmaW5pdGlvbj8udG9vbGJhck1lbnVJdGVtcyk7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcy5mb3JFYWNoKCh4LCBpKSA9PiB4LmluZGV4ID8/PSBpKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBcclxuXHRcdEFzc2lnbiBhIHZhbHVlIHRvIGB0aGlzLmRlbGV0YWJsZWAgb25seSBpZiBpdCBpcyBjdXJyZW50bHkgZmFsc3kuIFxyXG5cdFx0VXNlIHRoZSBgZGVsZXRhYmxlYCBwcm9wZXJ0eSBmcm9tIGBmb3JtRGVmaW5pdGlvbmAsIGRlZmF1bHRpbmcgdG8gYGZhbHNlYCBpZiB1bmRlZmluZWQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVsZXRhYmxlICYmPSAodGhpcy5mb3JtRGVmaW5pdGlvbi5kZWxldGFibGUgPz8gZmFsc2UpO1xyXG5cclxuXHRcdC8qIENyZWF0ZSB0aGUgZm9ybSBmaWVsZHMgdXNpbmcgdGhlIGVudGl0eSB0eXBlICovXHJcblx0XHR0aGlzLmZpZWxkR3JvdXBzID0gdGhpcy5mb3JtRGVmaW5pdGlvbj8uZmllbGRHcm91cHM/LmZpbHRlcih4ID0+ICF4LmhpZGRlbik7XHJcblxyXG5cdFx0LyogQWRkIGxpc3QgbWVudSBpdGVtcyAqL1xyXG5cdFx0dGhpcy5hZGRUb29sYmFyTWVudUl0ZW1zKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCdWlsZHMgYSBuZXcgZm9ybS5cclxuXHQgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gY29uc3RydWN0IHRoZSBmb3JtIGZvciB0aGUgc3BlY2lmaWMgZW50aXR5LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBidWlsZEZvcm0oKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVmFsaWRhdGVzIHRoZSBmb3JtLlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gYXMgc3VibWl0dGVkLCB1cGRhdGVzIGl0cyB2YWxpZGl0eSwgYW5kIG9wdGlvbmFsbHkgbG9ncyBkZWJ1ZyBpbmZvcm1hdGlvbi5cclxuXHQgKiBAcGFyYW0gZm9ybSBUaGUgZm9ybSB0byB2YWxpZGF0ZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgdmFsaWRhdGVGb3JtKGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdHZhciBmb3JtID0gZm9ybSB8fCB0aGlzLmZvcm07XHJcblxyXG5cdFx0LyogU2V0IHRoZSBmb3JtIGFzIHN1Ym1pdHRlZCAqL1xyXG5cdFx0aWYgKGZvcm0gJiYgZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG5cdFx0XHQvKiBTZXQgZm9ybSBhcyBzdWJtaXR0ZWQgKi9cclxuXHRcdFx0KGZvcm0gYXMgYW55KVsnc3VibWl0dGVkJ10gPSB0cnVlO1xyXG5cclxuXHRcdFx0LyogVXBkYXRlIHZhbHVlIGFuZCB2YWxpZGl0eSAqL1xyXG5cdFx0XHRmb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBQcmludCBzb21lIGRlYnVnIGluZm9ybWF0aW9uICovXHJcblx0XHR0aGlzLmRlYnVnRm9ybShmb3JtKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZm9ybSBpcyB2YWxpZC5cclxuXHQgKiBUaGlzIG1ldGhvZCB2YWxpZGF0ZXMgdGhlIGZvcm0sIG1hcmtzIGludmFsaWQgY29udHJvbHMsIGFuZCBzaG93cyBlcnJvciBtZXNzYWdlcyBpZiBhbnkuXHJcblx0ICogQHBhcmFtIGZvcm0gVGhlIGZvcm0gdG8gY2hlY2sgZm9yIHZhbGlkaXR5LlxyXG5cdCAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZvcm0gaXMgdmFsaWQuXHJcblx0ICovXHJcblx0cHVibGljIGlzRm9ybVZhbGlkKGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiBib29sZWFuIHtcclxuXHRcdC8qIFByaW50IHNvbWUgZGVidWcgaW5mb3JtYXRpb24gKi9cclxuXHRcdHRoaXMuZGVidWdGb3JtKGZvcm0pO1xyXG5cclxuXHRcdC8qIElmIHRoZSBmb3JtIGlzIG5vdCB2YWxpZCAqL1xyXG5cdFx0aWYgKGZvcm0gJiYgIWZvcm0udmFsaWQpIHtcclxuXHRcdFx0LyogTWFyayBpbnZhbGlkIGNvbnRyb2xzIGFzIGRpcnR5IGFuZCB0b3VjaGVkICovXHJcblx0XHRcdE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpXHJcblx0XHRcdFx0LmZpbHRlcih4ID0+ICFmb3JtLmNvbnRyb2xzW3hdLnZhbGlkKVxyXG5cdFx0XHRcdC5mb3JFYWNoKGtleSA9PiB0aGlzLmludmFsaWRhdGVDb250cm9sKGZvcm0uY29udHJvbHNba2V5XSkpO1xyXG5cclxuXHRcdFx0LyogU2hvdyBlcnJvciBtZXNzYWdlcyAqL1xyXG5cdFx0XHQoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdC8qIFdhaXQgdW50aWwgJ21hdC1lcnJvcicgaXMgZGlzcGxheWVkICovXHJcblx0XHRcdFx0YXdhaXQgbmV3IFByb21pc2UoeSA9PiBzZXRUaW1lb3V0KHksIDIwMCkpO1xyXG5cclxuXHRcdFx0XHQvKiBQYXJzZSB0aGUgZXJyb3IgbWVzc2FnZXMgKi9cclxuXHRcdFx0XHR2YXIgZXJyb3JzID0gQXJyYXk8c3RyaW5nPigpO1xyXG5cdFx0XHRcdE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpXHJcblx0XHRcdFx0XHQuZmlsdGVyKHggPT4gIWZvcm0uY29udHJvbHNbeF0udmFsaWQpXHJcblx0XHRcdFx0XHQuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRcdFx0XHQvKiBHZXQgZXJyb3IgdGV4dCAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgZXJyb3IgPSB0aGlzLmdldEVsZW1lbnRFcnJvcigoZm9ybS5jb250cm9sc1trZXldIGFzIGFueSk/Lm5hdGl2ZUVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHRpZiAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRlcnJvcnMucHVzaChlcnJvcik7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHQvKiBCdWlsZCBlcnJvciBtZXNzYWdlICovXHJcblx0XHRcdFx0dmFyIG1lc3NhZ2UgPSBlcnJvcnMubGVuZ3RoID8gZXJyb3JzLnNsaWNlKDAsIDMpLmpvaW4oJ1xcbicpIDogJGxvY2FsaXplYDpAQHNuYWNrYmFyLmVycm9yLnJlcXVpcmVkLWZpZWxkczpBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgcmVxdWlyZWQuYDtcclxuXHJcblx0XHRcdFx0LyogU2hvdyBhIG5vdGljZSAqL1xyXG5cdFx0XHRcdHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4obWVzc2FnZSwgJ09rJywgeyBkdXJhdGlvbjogMzAwMCwgcGFuZWxDbGFzczogWydlcnJvciddIH0pO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fSkoKTtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0cyBmb3JtIGNvbnRyb2xzLlxyXG5cdCAqIFRoaXMgbWV0aG9kIG1hcmtzIGFsbCBjb250cm9scyBpbiB0aGUgZm9ybSBhcyBwcmlzdGluZSwgdW50b3VjaGVkLCBhbmQgdXBkYXRlcyB0aGVpciB2YWxpZGl0eS5cclxuXHQgKiBAcGFyYW0gZm9ybSBUaGUgZm9ybSB0byByZXNldC5cclxuXHQgKi9cclxuXHRwdWJsaWMgcmVzZXRGb3JtKGZvcm06IE5nRm9ybSk6IHZvaWQge1xyXG5cdFx0aWYgKCFmb3JtKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcblx0XHRcdGxldCBjdHIgPSBmb3JtLmNvbnRyb2xzW2tleV07XHJcblx0XHRcdGN0ci5tYXJrQXNQcmlzdGluZSgpO1xyXG5cdFx0XHRjdHIubWFya0FzVW50b3VjaGVkKCk7XHJcblx0XHRcdGN0ci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludmFsaWRhdGVzIGNvbnRyb2xzIHJlY3Vyc2l2ZWx5LlxyXG5cdCAqIFRoaXMgbWV0aG9kIG1hcmtzIGFsbCBjb250cm9scyBpbiB0aGUgZ3JvdXAgYXMgZGlydHkgYW5kIHRvdWNoZWQgaWYgdGhleSBhcmUgaW52YWxpZC5cclxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBvciBncm91cCBvZiBjb250cm9scyB0byBpbnZhbGlkYXRlLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBpbnZhbGlkYXRlQ29udHJvbChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcclxuXHRcdC8qIENoZWNrIHRoZSBjb250cm9sIGFnYWluc3QgbnVsbCAqL1xyXG5cdFx0aWYgKCFjb250cm9sKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBDaGVjayBpZiB0aGUgY29udHJvbCBpcyBhIGdyb3VwICovXHJcblx0XHRsZXQgZm9ybUdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XHJcblx0XHRpZiAoZm9ybUdyb3VwPy5jb250cm9scykge1xyXG5cdFx0XHRPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpXHJcblx0XHRcdFx0LmZpbHRlcih4ID0+ICFmb3JtR3JvdXAuY29udHJvbHNbeF0udmFsaWQpXHJcblx0XHRcdFx0LmZvckVhY2goeCA9PiB0aGlzLmludmFsaWRhdGVDb250cm9sKGZvcm1Hcm91cC5jb250cm9sc1t4XSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG5cdFx0XHRjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3dzIGZvcm0gZXJyb3JzLlxyXG5cdCAqIFRoaXMgbWV0aG9kIGxvZ3MgZm9ybSBjb250cm9sIGVycm9ycyB0byB0aGUgY29uc29sZSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC5cclxuXHQgKiBAcGFyYW0gZm9ybSBUaGUgZm9ybSB0byBkZWJ1Zy5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgZGVidWdGb3JtKGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdGlmIChmb3JtICYmIHRoaXMuZGVidWcpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coJ0Zvcm06JywgZm9ybSk7XHJcblx0XHRcdE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcclxuXHRcdFx0XHRjb25zdCBjb250cm9sRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IGZvcm0uY29udHJvbHNba2V5XS5lcnJvcnM7XHJcblx0XHRcdFx0aWYgKGNvbnRyb2xFcnJvcnMgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoY29udHJvbEVycm9ycykuZm9yRWFjaChrZXlFcnJvciA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdLZXkgY29udHJvbDogJyArIGtleSArICcsIGtleUVycm9yOiAnICsga2V5RXJyb3IgKyAnLCBlcnIgdmFsdWU6ICcsIGNvbnRyb2xFcnJvcnNba2V5RXJyb3JdKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRvb2xiYXIgbWVudSBpdGVtcy5cclxuXHQgKiBUaGlzIG1ldGhvZCBhZGRzIHRoZSAnRGVsZXRlJyBtZW51IGl0ZW0gdG8gdGhlIHRvb2xiYXIgaWYgdGhlIGVudGl0eSBpcyBkZWxldGFibGUuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGFkZFRvb2xiYXJNZW51SXRlbXMoKTogdm9pZCB7XHJcblx0XHQvKiBBZGQgJ0RlbGV0ZScgbWVudSBpdGVtICovXHJcblx0XHRpZiAodGhpcy5kZWxldGFibGUpIHtcclxuXHRcdFx0dGhpcy50b29sYmFyTWVudUl0ZW1zLnB1c2goe1xyXG5cdFx0XHRcdHRpdGxlOiAkbG9jYWxpemVgOkBAZGVsZXRlOkRlbGV0ZWAsXHJcblx0XHRcdFx0aWNvbjogJ2RlbGV0ZV9mb3JldmVyJyxcclxuXHRcdFx0XHRpY29uQ2xhc3M6ICd0Yy1vcmFuZ2UtODAwJyxcclxuXHRcdFx0XHRldmVudDogKCkgPT4gdGhpcy5kZWxldGUoKSxcclxuXHRcdFx0XHRkaXNhYmxlOiAoKSA9PiAhdGhpcy5pZCxcclxuXHRcdFx0XHRoaWRlOiAoKSA9PiAhdGhpcy5jYW5EZWxldGVJdGVtKCksXHJcblx0XHRcdFx0aW5kZXg6IDEwMDBcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMudG9vbGJhck1lbnVJdGVtcy5sZW5ndGgpIHtcclxuXHRcdFx0LyogU29ydCB0aGUgbWVudSBpdGVtcyBieSBpbmRleCAqL1xyXG5cdFx0XHRVdGlscy5zb3J0QXJyYXkodGhpcy50b29sYmFyTWVudUl0ZW1zLCAnaW5kZXgnKTtcclxuXHJcblx0XHRcdC8qIEFkZCB0aGUgdG9vbGJhciBtZW51IGl0ZW1zIHRvIHRoZSB0aGUgdG9vbGJhciBhY3Rpb25zICovXHJcblx0XHRcdHRoaXMudG9vbGJhckFjdGlvbnMucHVzaCh7IGljb246ICdtb3JlX3ZlcnQnLCBpdGVtczogdGhpcy50b29sYmFyTWVudUl0ZW1zIH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9hZHMgdGhlIHByZXZpb3VzIFVSTCBpbiB0aGUgaGlzdG9yeSBsaXN0LlxyXG5cdCAqIFRoaXMgbWV0aG9kIG5hdmlnYXRlcyBiYWNrIHRvIHRoZSBwcmV2aW91cyBVUkwgb3IgcGVyZm9ybXMgc3BlY2lmaWMgYWN0aW9ucyBiYXNlZCBvbiB0aGUgc2F2ZSBhY3Rpb24uXHJcblx0ICogQHBhcmFtIGFjdGlvbiBUaGUgc2F2ZSBhY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBuYXZpZ2F0aW9uIGJlaGF2aW9yLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBiYWNrKGFjdGlvbjogU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5yZWxvYWQub2JzZXJ2ZWQpIHtcclxuXHRcdFx0LyogSWYgdGhlcmUgYXJlIG9ic2VydmVycyBmb3IgdGhlIHJlbG9hZCBldmVudCwgZW1pdCB0aGUgY3VycmVudCBmb3JtIHZhbHVlICovXHJcblx0XHRcdHRoaXMucmVsb2FkLmVtaXQodGhpcy5mb3JtVmFsdWUpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0LyogTm8gb2JzZXJ2ZXJzLCBwcm9jZWVkIHdpdGggbmF2aWdhdGlvbiBsb2dpYyAqL1xyXG5cdFx0XHRpZiAoYWN0aW9uID09IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlICYmIHRoaXMucmV0dXJuVXJsKSB7XHJcblx0XHRcdFx0LyogTmF2aWdhdGUgdG8gdGhlIHJldHVybiBVUkwgaWYgYWN0aW9uIGlzIFNhdmVBbmRDbG9zZSBhbmQgcmV0dXJuVXJsIGlzIHNldCAqL1xyXG5cdFx0XHRcdHRoaXMubmF2aWdhdGVUb1JldHVyblVybCgpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8qIE5vIHJldHVyblVybCwgY29udGludWUgd2l0aCBvdGhlciBhY3Rpb25zICovXHJcblx0XHRcdFx0aWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmRDbG9zZSkge1xyXG5cdFx0XHRcdFx0LyogR28gYmFjayB0byB0aGUgcHJldmlvdXMgcGFnZSBpbiBoaXN0b3J5ICovXHJcblx0XHRcdFx0XHR0aGlzLmxvY2F0aW9uLmJhY2soKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmRFZGl0ICYmIHBhcnNlSW50KHRoaXMuaWQ/LnRvU3RyaW5nKCkgPz8gJzAnKSA+IDApIHtcclxuXHRcdFx0XHRcdC8qIEZvciBTYXZlQW5kRWRpdCBhY3Rpb24gd2l0aCBhIHZhbGlkIElEICovXHJcblx0XHRcdFx0XHRpZiAoIXRoaXMuY3VycmVudEJhc2VSb3V0ZT8uZW5kc1dpdGgoJy9hZGQnKSkge1xyXG5cdFx0XHRcdFx0XHQvKiBSZWxvYWQgdGhlIHBhZ2UgaWYgdGhlIGN1cnJlbnQgcm91dGUgZG9lcyBub3QgZW5kIHdpdGggJy9hZGQnICovXHJcblx0XHRcdFx0XHRcdHRoaXMucmVsb2FkUGFnZSgpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogTmF2aWdhdGUgdG8gdGhlIGVkaXQgcm91dGUgKi9cclxuXHRcdFx0XHRcdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3RoaXMuYWRkU2F2ZUFuZEVkaXRSb3V0ZX0ke3RoaXMuaWR9YF0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIFJlcGxhY2UgdGhlIGN1cnJlbnQgaGlzdG9yeSBlbnRyeSB0byByZW1vdmUgdGhpcyBwYWdlIGZyb20gdGhlIGhpc3RvcnkgKi9cclxuXHRcdFx0XHRcdFx0dGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUodGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbYCR7dGhpcy5hZGRTYXZlQW5kRWRpdFJvdXRlfSR7dGhpcy5pZH1gXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pLnRvU3RyaW5nKCkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uID09IFNhdmVBY3Rpb24uU2F2ZUFuZE5ldykge1xyXG5cdFx0XHRcdFx0LyogSGFuZGxlIFNhdmVBbmROZXcgYWN0aW9uICovXHJcblx0XHRcdFx0XHR0aGlzLmFmdGVyUmVsb2FkKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSByZXR1cm4gVVJMLlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIHJldHVybiBVUkwgYW5kIHVwZGF0ZXMgdGhlIGxpc3Qgcm91dGUgYWNjb3JkaW5nbHkuXHJcblx0ICogQHBhcmFtIHJldHVyblVybCBUaGUgVVJMIHRvIHJldHVybiB0byBhZnRlciB0aGUgY3VycmVudCBhY3Rpb24gaXMgY29tcGxldGUuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNldFJldHVyblVybChyZXR1cm5Vcmw6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0c3VwZXIuc2V0UmV0dXJuVXJsKHJldHVyblVybCk7XHJcblx0XHR0aGlzLmxpc3RSb3V0ZSA9IHRoaXMucmV0dXJuVXJsIHx8IHRoaXMubGlzdFJvdXRlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBURW50aXR5LlxyXG5cdCAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGEgbmV3IGVudGl0eSB1c2luZyB0aGUgcHJvdmlkZWQgY29uc3RydWN0b3IuXHJcblx0ICogQHBhcmFtIGluaXQgT3B0aW9uYWwgcGFydGlhbCBpbml0aWFsaXphdGlvbiBvYmplY3QuXHJcblx0ICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgVEVudGl0eS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgbmV3SW5zdGFuY2UoaW5pdD86IFBhcnRpYWw8VEVudGl0eT4pOiBURW50aXR5IHtcclxuXHRcdHJldHVybiBuZXcgdGhpcy5lbnRpdHlDdG9yKGluaXQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgZW50aXR5LlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNlbmRzIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBuZXcgZW50aXR5IG9uIHRoZSBzZXJ2ZXIuXHJcblx0ICogQHBhcmFtIGh0dHBPcHRpb25zIE9wdGlvbmFsIEhUVFAgb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3QuXHJcblx0ICogQHBhcmFtIGh0dHBIZWFkZXJzIE9wdGlvbmFsIEhUVFAgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3QuXHJcblx0ICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBvZiB0aGUgY3JlYXRlZCBURW50aXR5LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBjcmVhdGU8VEVudGl0eT4oaHR0cE9wdGlvbnM/OiBPYmplY3QsIGh0dHBIZWFkZXJzPzogSHR0cEhlYWRlcnMpOiBPYnNlcnZhYmxlPFRFbnRpdHk+IHtcclxuXHRcdHRoaXMub25CZWZvcmVDcmVhdGUoKTtcclxuXHRcdHJldHVybiB0aGlzLnNlcnZpY2UuY3JlYXRlPFRFbnRpdHk+KFxyXG5cdFx0XHR0aGlzLmZvcm1WYWx1ZSxcclxuXHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRPYmplY3QuYXNzaWduKGh0dHBPcHRpb25zIHx8IHt9LCB7IGhlYWRlcnM6IGh0dHBIZWFkZXJzID8/IHRoaXMudG9IdHRwSGVhZGVycyh7ICdTaG93LU1lc3NhZ2UnOiAneWVzJyB9KSB9KSxcclxuXHRcdFx0ZmFsc2VcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBlbnRpdHkuXHJcblx0ICogVGhpcyBtZXRob2Qgc2VuZHMgYSByZXF1ZXN0IHRvIHVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHkgb24gdGhlIHNlcnZlci5cclxuXHQgKiBAcGFyYW0gaHR0cE9wdGlvbnMgT3B0aW9uYWwgSFRUUCBvcHRpb25zIGZvciB0aGUgcmVxdWVzdC5cclxuXHQgKiBAcGFyYW0gaHR0cEhlYWRlcnMgT3B0aW9uYWwgSFRUUCBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdC5cclxuXHQgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIG9mIHRoZSB1cGRhdGVkIFRFbnRpdHkuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHVwZGF0ZShodHRwT3B0aW9ucz86IE9iamVjdCwgaHR0cEhlYWRlcnM/OiBIdHRwSGVhZGVycyk6IE9ic2VydmFibGU8VEVudGl0eT4ge1xyXG5cdFx0dGhpcy5vbkJlZm9yZVVwZGF0ZSgpO1xyXG5cdFx0cmV0dXJuIHRoaXMuc2VydmljZS51cGRhdGUodGhpcy5pZCEsXHJcblx0XHRcdE9iamVjdC5hc3NpZ24odGhpcy5pdGVtISwgdGhpcy5mb3JtVmFsdWUpLFxyXG5cdFx0XHR1bmRlZmluZWQsXHJcblx0XHRcdE9iamVjdC5hc3NpZ24oaHR0cE9wdGlvbnMgfHwge30sIHsgaGVhZGVyczogaHR0cEhlYWRlcnMgPz8gdGhpcy50b0h0dHBIZWFkZXJzKHsgJ1Nob3ctTWVzc2FnZSc6ICd5ZXMnIH0pLCB9KSxcclxuXHRcdFx0ZmFsc2VcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmNsdWRlcyBzcGVjaWZpZWQgbmF2aWdhdGlvbnMuXHJcblx0ICogVGhpcyBtZXRob2QgYWRkcyBzcGVjaWZpZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIHRvIHRoZSBpbmNsdWRlcyBhcnJheSxcclxuXHQgKiBvcHRpb25hbGx5IGFkZGluZyB0aGVtIHRvIHRoZSB1cGRhdGVJbmNsdWRlcyBhcnJheSBhcyB3ZWxsLlxyXG5cdCAqIEBwYXJhbSBpbmMgVGhlIG5hdmlnYXRpb24gcHJvcGVydHkgdG8gaW5jbHVkZS5cclxuXHQgKiBAcGFyYW0gdXBkYXRlIFdoZXRoZXIgdG8gaW5jbHVkZSBpbiB1cGRhdGVJbmNsdWRlcyBhcnJheS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgaW5jbHVkZShpbmM6IHN0cmluZywgdXBkYXRlOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHRcdHRoaXMuaW5jbHVkZXMucHVzaChpbmMpO1xyXG5cdFx0aWYgKHVwZGF0ZSkge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZUluY2x1ZGVzLnB1c2goaW5jKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgaXRlbSBpcyBkZWxldGFibGUuXHJcblx0ICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBpdGVtIGNhbiBiZSBkZWxldGVkIGJhc2VkIG9uIGl0cyBwcm9wZXJ0aWVzLlxyXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGl0ZW0gY2FuIGJlIGRlbGV0ZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgY2FuRGVsZXRlSXRlbSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY2FuRGVsZXRlICYmICghdGhpcy5pdGVtPy5oYXNPd25Qcm9wZXJ0eSgnZGVsZXRhYmxlJykgfHwgKHRoaXMuaXRlbSBhcyBhbnkpWydkZWxldGFibGUnXSk7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBJRCBpcyBzZXQuXHJcblx0ICogVGhpcyBtZXRob2QgdHJpZ2dlcnMgdGhlIGxvYWRpbmcgb2YgdGhlIGl0ZW0gd2hlbiB0aGUgSUQgaXMgc2V0LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyU2V0SWQoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5pZCkge1xyXG5cdFx0XHR0aGlzLmxvYWRJdGVtKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdGVkIHN0ZXAgaGFzIGNoYW5nZWQuXHJcblx0ICogVGhpcyBtZXRob2QgaGFuZGxlcyBhY3Rpb25zIHRvIGJlIHRha2VuIHdoZW4gdGhlIHN0ZXBwZXIgc2VsZWN0aW9uIGNoYW5nZXMuXHJcblx0ICogQHBhcmFtICRldmVudCBUaGUgc3RlcHBlciBzZWxlY3Rpb24gZXZlbnQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIG9uQWZ0ZXJTdGVwQ2hhbmdlKCRldmVudDogU3RlcHBlclNlbGVjdGlvbkV2ZW50KTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc2VsZWN0ZWQgc3RlcCBpbiB0aGUgc3RlcHBlciBiYXNlZCBvbiB0aGUgVVJMIGhhc2guXHJcblx0ICogTWFya3MgYWxsIHByZXZpb3VzIHN0ZXBzIGFzIGNvbXBsZXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgc2VsZWN0U3RlcEJhc2VkT25VcmxIYXNoKCk6IHZvaWQge1xyXG5cdFx0LyogRW5zdXJlIHdlIGFyZSBub3QgaW4gZWRpdCBtb2RlLCBhbmQgdGhhdCBib3RoIHRoZSBzdGVwcGVyIGFuZCBVUkwgaGFzaCBhcmUgYXZhaWxhYmxlICovXHJcblx0XHRpZiAoIXRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLm1hdFN0ZXBwZXIgJiYgdGhpcy51cmxIYXNoKSB7XHJcblxyXG5cdFx0XHQvKiBGaW5kIHRoZSBzdGVwIHRoYXQgbWF0Y2hlcyB0aGUgc3RhdGUgZnJvbSB0aGUgVVJMIGhhc2ggKi9cclxuXHRcdFx0Y29uc3QgbWF0Y2hlZFN0ZXAgPSB0aGlzLm1hdFN0ZXBwZXIuc3RlcHMuZmluZCgoc3RlcCkgPT4gc3RlcC5zdGF0ZSA9PT0gdGhpcy51cmxIYXNoKTtcclxuXHJcblx0XHRcdGlmIChtYXRjaGVkU3RlcCkge1xyXG5cdFx0XHRcdC8qIEdldCB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgc3RlcCAqL1xyXG5cdFx0XHRcdGNvbnN0IG1hdGNoZWRJbmRleCA9IHRoaXMubWF0U3RlcHBlci5zdGVwcy50b0FycmF5KCkuaW5kZXhPZihtYXRjaGVkU3RlcCk7XHJcblxyXG5cdFx0XHRcdC8qIE1hcmsgYWxsIHByZXZpb3VzIHN0ZXBzIGFzIGNvbXBsZXRlZCAqL1xyXG5cdFx0XHRcdHRoaXMubWF0U3RlcHBlci5zdGVwcy5mb3JFYWNoKChzdGVwLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGluZGV4IDwgbWF0Y2hlZEluZGV4KSB7XHJcblx0XHRcdFx0XHRcdHN0ZXAuY29tcGxldGVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0LyogU2V0IHRoZSBzZWxlY3RlZCBzdGVwIGJhc2VkIG9uIHRoZSBtYXRjaGVkIHN0YXRlICovXHJcblx0XHRcdFx0dGhpcy5tYXRTdGVwcGVyLnNlbGVjdGVkSW5kZXggPSBtYXRjaGVkSW5kZXg7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZW50aXR5IGhhcyBiZWVuIGxvYWRlZC5cclxuXHQgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGFjdGlvbnMgdG8gYmUgdGFrZW4gYWZ0ZXIgdGhlIGVudGl0eSBpcyBsb2FkZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIG9uQWZ0ZXJJdGVtTG9hZGVkKCk6IHZvaWQgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgYmVmb3JlIHRoZSBmb3JtIGlzIGJ1aWx0LlxyXG5cdCAqIFRoaXMgbWV0aG9kIGFsbG93cyBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgYmVmb3JlIHRoZSBmb3JtIGlzIGNvbnN0cnVjdGVkLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkJlZm9yZUZvcm1CdWlsZCgpOiB2b2lkIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGZvcm0gaGFzIGJlZW4gYnVpbHQuXHJcblx0ICogVGhpcyBtZXRob2QgaGFuZGxlcyBhY3Rpb25zIHRvIGJlIHRha2VuIGFmdGVyIHRoZSBmb3JtIGlzIGNvbnN0cnVjdGVkLFxyXG5cdCAqIHN1Y2ggYXMgZGlzYWJsaW5nIGZvcm0gY29udHJvbHMgaWYgdGhlIGZvcm0gaXMgc2V0IHRvIGJlIGRpc2FibGVkLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyRm9ybUJ1aWxkKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZm9ybSAmJiB0aGlzLmRpc2FibGVkKSB7XHJcblx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRcdGxldCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSB0aGlzLmZvcm0hLmNvbnRyb2xzW2tleV07XHJcblx0XHRcdFx0Y29udHJvbD8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGUoKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBlbnRpdHkgaGFzIGJlZW4gdXBkYXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25CZWZvcmVVcGRhdGUoKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGVkIGJlZm9yZSBkYXRhIHN1Ym1pc3Npb24uXHJcblx0ICogVGhpcyBtZXRob2QgYWxsb3dzIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyBiZWZvcmUgc3VibWl0dGluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBiZWZvcmVTdWJtaXQoXzogU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCBhZnRlciBkYXRhIHN1Ym1pc3Npb24uXHJcblx0ICogVGhpcyBtZXRob2QgaGFuZGxlcyBwb3N0LXN1Ym1pc3Npb24gYWN0aW9ucyBzdWNoIGFzIHJlc2V0dGluZyB0aGUgc2F2aW5nIHN0YXRlLFxyXG5cdCAqIHVwZGF0aW5nIHRoZSBjaGFuZ2UgZGV0ZWN0b3IsIGFuZCBuYXZpZ2F0aW5nIGJhY2sgYmFzZWQgb24gdGhlIHNhdmUgYWN0aW9uLlxyXG5cdCAqIEBwYXJhbSBhY3Rpb24gVGhlIHNhdmUgYWN0aW9uIHRha2VuIChlLmcuLCBTYXZlQW5kQ2xvc2UsIFNhdmVBbmROZXcpLlxyXG5cdCAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgYWZ0ZXIgc3VibWlzc2lvbi5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25BZnRlclN1Ym1pdChhY3Rpb246IFNhdmVBY3Rpb24gPSBTYXZlQWN0aW9uLlNhdmVBbmRDbG9zZSwgcmVzcG9uc2U6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuXHRcdC8qIFJlc2V0IHRoZSBzYXZpbmcgZmxhZyBvbmNlIGRhdGEgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQgKi9cclxuXHRcdHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdFx0dGhpcy5iYWNrKGFjdGlvbik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxsZWQgYWZ0ZXIgdGhlIHBhZ2UgaXMgcmVsb2FkZWQuXHJcblx0ICogVGhpcyBtZXRob2QgcmVpbml0aWFsaXplcyB0aGUgaXRlbSB3aXRoIGEgbmV3IGluc3RhbmNlIGFuZCBhcHBsaWVzIGFueSBxdWVyeSBwYXJhbWV0ZXJzLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBhZnRlclJlbG9hZCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaXRlbSA9IE9iamVjdC5hc3NpZ24odGhpcy5uZXdJbnN0YW5jZSgpLCB0aGlzLnF1ZXJ5KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgZm9jdXMgdG8gdGhlIGZpcnN0IGlucHV0IGVsZW1lbnQuXHJcblx0ICogRW5zdXJlcyB0aGUgZmlyc3QgaW5wdXQgZWxlbWVudCBpbiB0aGUgZm9ybSBpcyBmb2N1c2VkIGZvciB1c2VyIGNvbnZlbmllbmNlLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBmb2N1cygpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmlucHV0ICYmIHRoaXMuaW5wdXQuZmlyc3QgJiYgdGhpcy5pbnB1dC5maXJzdC5uYXRpdmVFbGVtZW50KSB7XHJcblx0XHRcdHRoaXMuaW5wdXQuZmlyc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0cmlldmVzIHRoZSBlcnJvciBtZXNzYWdlIGZvciBhIGdpdmVuIG5hdGl2ZSBlbGVtZW50LlxyXG5cdCAqIFRoaXMgbWV0aG9kIG5hdmlnYXRlcyB0aHJvdWdoIHRoZSBET00gc3RydWN0dXJlIHRvIGZpbmQgZXJyb3IgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIGZvcm0gZmllbGRzLlxyXG5cdCAqIEBwYXJhbSBuYXRpdmVFbGVtZW50IFRoZSBET00gZWxlbWVudCB0byBjaGVjayBmb3IgZXJyb3JzLlxyXG5cdCAqIEByZXR1cm5zIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCwgb3IgdW5kZWZpbmVkIGlmIG5vIGVycm9yIGlzIGZvdW5kLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBnZXRFbGVtZW50RXJyb3IobmF0aXZlRWxlbWVudDogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuXHRcdC8qIEdldCBwYXJlbnQgZWxlbWVudCAnbWF0LWZvcm0tZmllbGQnICovXHJcblx0XHR2YXIgbWF0Rm9ybUZpZWxkID0gbmF0aXZlRWxlbWVudD8uY2xvc2VzdCgnLm1hdC1mb3JtLWZpZWxkJyk7XHJcblx0XHRpZiAoIW1hdEZvcm1GaWVsZCkge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEdldCBjaGlsZCBlbGVtZW50ICdtYXQtZXJyb3InICovXHJcblx0XHR2YXIgbWF0RXJyb3JzID0gbWF0Rm9ybUZpZWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtZXJyb3InKTtcclxuXHRcdGlmICghbWF0RXJyb3JzKSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogR2V0IGNoaWxkIGVsZW1lbnQgJ21hdC1sYWJlbCcgKi9cclxuXHRcdHZhciBtYXRMYWJlbCA9IG1hdEZvcm1GaWVsZC5xdWVyeVNlbGVjdG9yKCdtYXQtbGFiZWwnKTtcclxuXHRcdGlmICghbWF0TGFiZWwpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBHZXQgZXJyb3IgdGV4dHMgKi9cclxuXHRcdHZhciBlcnJvcnNBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG1hdEVycm9ycylcclxuXHRcdFx0Py5maWx0ZXIoKHg6IGFueSkgPT4geC50ZXh0Q29udGVudClcclxuXHRcdFx0Py5tYXAoKHg6IGFueSkgPT4geC50ZXh0Q29udGVudCk7XHJcblxyXG5cdFx0cmV0dXJuIGAnJHttYXRMYWJlbC50ZXh0Q29udGVudH0nOiAke2Vycm9yc0FycmF5Py5qb2luKCcsICcpfWA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNwb25kcyB0byB1c2VyLWluaXRpYXRlZCBrZXlib2FyZCBldmVudHMuXHJcblx0ICogVGhpcyBtZXRob2QgbGlzdGVucyBmb3Igc3BlY2lmaWMga2V5IGNvbWJpbmF0aW9ucyBhbmQgdHJpZ2dlcnMgc2F2ZSBhY3Rpb25zIG9yIGZvcm0gY2FuY2VsbGF0aW9uLlxyXG5cdCAqIEBwYXJhbSBldmVudCBUaGUga2V5Ym9hcmQgZXZlbnQgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyLlxyXG5cdCAqL1xyXG5cdEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG5cdHB1YmxpYyBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcblx0XHRpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XHJcblx0XHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcblx0XHRcdFx0Y2FzZSAncyc6XHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0dGhpcy5zYXZlKFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdkJzpcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR0aGlzLnNhdmUoU2F2ZUFjdGlvbi5TYXZlQW5kTmV3KTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdlJzpcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR0aGlzLnNhdmUoU2F2ZUFjdGlvbi5TYXZlQW5kRWRpdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qIENhbmNlbCB0aGUgZm9ybSBpZiB0aGUgdXNlciBwcmVzc2VzIHRoZSBFU0Mga2V5ICovXHJcblx0XHRpZiAoZXZlbnQua2V5Q29kZSA9PSAyNykge1xyXG5cdFx0XHR0aGlzLmJhY2soKTtcclxuXHRcdH1cclxuXHR9XHJcbn0iXX0=