@bravura/ui 3.8.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/CHANGELOG.md +585 -565
  2. package/LICENSE +6 -6
  3. package/README.md +3 -1
  4. package/alert/alert-container.component.d.ts +1 -1
  5. package/alert/alert-message.component.d.ts +1 -1
  6. package/behavior/await.directive.d.ts +1 -1
  7. package/behavior/observe-content-class.directive.d.ts +1 -1
  8. package/behavior/sizing.directive.d.ts +1 -1
  9. package/clip-note/clip-note.directive.d.ts +1 -1
  10. package/currency-input/currency-input.directive.d.ts +1 -1
  11. package/decimal-input/decimal-input.directive.d.ts +1 -1
  12. package/discrete-input/discrete-input.component.d.ts +1 -1
  13. package/esm2022/alert/alert-container.component.mjs +207 -0
  14. package/esm2022/alert/alert-message.component.mjs +101 -0
  15. package/esm2022/alert/alert.module.mjs +22 -0
  16. package/{esm2020 → esm2022}/alert/public-api.mjs +1 -1
  17. package/esm2022/alert/testing/test-api.mjs +44 -0
  18. package/esm2022/behavior/await.directive.mjs +133 -0
  19. package/esm2022/behavior/behavior.module.mjs +37 -0
  20. package/esm2022/behavior/observe-content-class.directive.mjs +63 -0
  21. package/{esm2020 → esm2022}/behavior/public-api.mjs +1 -1
  22. package/esm2022/behavior/sizing-monitor.directive.mjs +31 -0
  23. package/esm2022/behavior/sizing.directive.mjs +256 -0
  24. package/esm2022/clip-note/clip-note.component.mjs +216 -0
  25. package/esm2022/clip-note/clip-note.directive.mjs +141 -0
  26. package/esm2022/clip-note/clip-note.module.mjs +32 -0
  27. package/{esm2020 → esm2022}/clip-note/public-api.mjs +1 -1
  28. package/{esm2020 → esm2022}/common/common-utils.mjs +1 -1
  29. package/esm2022/common/common.module.mjs +53 -0
  30. package/{esm2020 → esm2022}/common/public-api.mjs +1 -1
  31. package/esm2022/currency-input/currency-input.directive.mjs +276 -0
  32. package/esm2022/currency-input/currency-input.module.mjs +19 -0
  33. package/{esm2020 → esm2022}/currency-input/public-api.mjs +1 -1
  34. package/esm2022/decimal-input/decimal-input.directive.mjs +122 -0
  35. package/{esm2020 → esm2022}/decimal-input/decimal-input.module.mjs +5 -5
  36. package/esm2022/discrete-input/discrete-input.component.mjs +337 -0
  37. package/esm2022/discrete-input/discrete-input.module.mjs +21 -0
  38. package/{esm2020 → esm2022}/discrete-input/public-api.mjs +1 -1
  39. package/esm2022/file-upload/file-upload.component.mjs +400 -0
  40. package/esm2022/file-upload/file-upload.module.mjs +44 -0
  41. package/esm2022/file-upload/file-upload.service.mjs +29 -0
  42. package/{esm2020 → esm2022}/file-upload/public-api.mjs +1 -1
  43. package/esm2022/form-field/form-field.component.mjs +82 -0
  44. package/esm2022/form-field/form-field.module.mjs +33 -0
  45. package/{esm2020 → esm2022}/form-field/public-api.mjs +1 -1
  46. package/esm2022/icon-font/icon-font.module.mjs +22 -0
  47. package/esm2022/icon-font/icon.directive.mjs +102 -0
  48. package/{esm2020 → esm2022}/icon-font/public-api.mjs +1 -1
  49. package/esm2022/icon-font/utilities.mjs +51 -0
  50. package/esm2022/panel/panel-section.component.mjs +41 -0
  51. package/esm2022/panel/panel.component.mjs +87 -0
  52. package/esm2022/panel/panel.module.mjs +23 -0
  53. package/{esm2020 → esm2022}/panel/public-api.mjs +1 -1
  54. package/esm2022/panel/tinted.directive.mjs +60 -0
  55. package/esm2022/phone-number/phone-number.directive.mjs +188 -0
  56. package/{esm2020 → esm2022}/phone-number/phone-number.module.mjs +5 -5
  57. package/esm2022/phone-number/phone-number.pipe.mjs +47 -0
  58. package/esm2022/phone-number/phone-number.validator.mjs +64 -0
  59. package/{esm2020 → esm2022}/phone-number/public-api.mjs +1 -1
  60. package/{esm2020 → esm2022}/public-api.mjs +1 -1
  61. package/esm2022/radio-panel/radio-panel-item.component.mjs +93 -0
  62. package/esm2022/radio-panel/radio-panel.component.mjs +81 -0
  63. package/{esm2020 → esm2022}/radio-panel/radio-panel.module.mjs +5 -5
  64. package/esm2022/radio-panel/testing/test-api.mjs +46 -0
  65. package/{esm2020 → esm2022}/selection-panel/public-api.mjs +1 -1
  66. package/esm2022/selection-panel/selection-panel-item.component.mjs +166 -0
  67. package/esm2022/selection-panel/selection-panel.directive.mjs +119 -0
  68. package/esm2022/selection-panel/selection-panel.module.mjs +23 -0
  69. package/{esm2020 → esm2022}/skeletons/public-api.mjs +1 -1
  70. package/esm2022/skeletons/skeleton-loader-presets.directive.mjs +83 -0
  71. package/esm2022/skeletons/skeleton-loader.component.mjs +76 -0
  72. package/esm2022/skeletons/skeletons.module.mjs +35 -0
  73. package/{esm2020 → esm2022}/stepper/public-api.mjs +1 -1
  74. package/{esm2020 → esm2022}/stepper/stepper-animation.mjs +1 -1
  75. package/esm2022/stepper/stepper.component.mjs +176 -0
  76. package/esm2022/stepper/stepper.module.mjs +52 -0
  77. package/{esm2020 → esm2022}/tooltip/public-api.mjs +1 -1
  78. package/esm2022/tooltip/tooltip.component.mjs +63 -0
  79. package/esm2022/tooltip/tooltip.directive.mjs +148 -0
  80. package/esm2022/tooltip/tooltip.module.mjs +25 -0
  81. package/{fesm2020 → fesm2022}/bravura-ui-alert-testing.mjs +2 -2
  82. package/fesm2022/bravura-ui-alert-testing.mjs.map +1 -0
  83. package/fesm2022/bravura-ui-alert.mjs +327 -0
  84. package/fesm2022/bravura-ui-alert.mjs.map +1 -0
  85. package/{fesm2020 → fesm2022}/bravura-ui-behavior.mjs +45 -45
  86. package/fesm2022/bravura-ui-behavior.mjs.map +1 -0
  87. package/{fesm2020 → fesm2022}/bravura-ui-clip-note.mjs +70 -70
  88. package/fesm2022/bravura-ui-clip-note.mjs.map +1 -0
  89. package/{fesm2020 → fesm2022}/bravura-ui-common.mjs +6 -6
  90. package/fesm2022/bravura-ui-common.mjs.map +1 -0
  91. package/{fesm2020 → fesm2022}/bravura-ui-currency-input.mjs +11 -11
  92. package/fesm2022/bravura-ui-currency-input.mjs.map +1 -0
  93. package/{fesm2020 → fesm2022}/bravura-ui-decimal-input.mjs +12 -12
  94. package/fesm2022/bravura-ui-decimal-input.mjs.map +1 -0
  95. package/{fesm2020 → fesm2022}/bravura-ui-discrete-input.mjs +48 -48
  96. package/fesm2022/bravura-ui-discrete-input.mjs.map +1 -0
  97. package/fesm2022/bravura-ui-file-upload.mjs +474 -0
  98. package/fesm2022/bravura-ui-file-upload.mjs.map +1 -0
  99. package/{fesm2020 → fesm2022}/bravura-ui-form-field.mjs +19 -19
  100. package/fesm2022/bravura-ui-form-field.mjs.map +1 -0
  101. package/{fesm2020 → fesm2022}/bravura-ui-icon-font.mjs +8 -8
  102. package/fesm2022/bravura-ui-icon-font.mjs.map +1 -0
  103. package/fesm2022/bravura-ui-panel.mjs +206 -0
  104. package/fesm2022/bravura-ui-panel.mjs.map +1 -0
  105. package/{fesm2020 → fesm2022}/bravura-ui-phone-number.mjs +30 -30
  106. package/fesm2022/bravura-ui-phone-number.mjs.map +1 -0
  107. package/{fesm2020 → fesm2022}/bravura-ui-radio-panel-testing.mjs +5 -6
  108. package/fesm2022/bravura-ui-radio-panel-testing.mjs.map +1 -0
  109. package/{fesm2020 → fesm2022}/bravura-ui-radio-panel.mjs +32 -32
  110. package/fesm2022/bravura-ui-radio-panel.mjs.map +1 -0
  111. package/fesm2022/bravura-ui-selection-panel.mjs +306 -0
  112. package/fesm2022/bravura-ui-selection-panel.mjs.map +1 -0
  113. package/{fesm2020 → fesm2022}/bravura-ui-skeletons.mjs +43 -43
  114. package/fesm2022/bravura-ui-skeletons.mjs.map +1 -0
  115. package/fesm2022/bravura-ui-stepper.mjs +251 -0
  116. package/fesm2022/bravura-ui-stepper.mjs.map +1 -0
  117. package/{fesm2020 → fesm2022}/bravura-ui-tooltip.mjs +32 -24
  118. package/fesm2022/bravura-ui-tooltip.mjs.map +1 -0
  119. package/fesm2022/bravura-ui.mjs.map +1 -0
  120. package/file-upload/file-upload.component.d.ts +1 -1
  121. package/form-field/form-field.component.d.ts +1 -1
  122. package/icon-font/icon.directive.d.ts +1 -1
  123. package/package.json +88 -132
  124. package/panel/panel.component.d.ts +1 -1
  125. package/panel/tinted.directive.d.ts +1 -1
  126. package/phone-number/phone-number.directive.d.ts +1 -1
  127. package/phone-number/phone-number.validator.d.ts +2 -2
  128. package/radio-panel/radio-panel-item.component.d.ts +1 -1
  129. package/radio-panel/radio-panel.component.d.ts +1 -1
  130. package/radio-panel/testing/test-api.d.ts +2 -3
  131. package/selection-panel/selection-panel-item.component.d.ts +1 -1
  132. package/selection-panel/selection-panel.directive.d.ts +1 -1
  133. package/skeletons/skeleton-loader-presets.directive.d.ts +3 -3
  134. package/stepper/stepper.component.d.ts +1 -1
  135. package/theme/_bui-card.scss +56 -56
  136. package/theme/_ui-theme.scss +3 -3
  137. package/theme/global-style-by-bootstrap.scss +3 -3
  138. package/theme/global-style-by-tailwind.scss +3 -3
  139. package/theme/scrollbar.scss +40 -40
  140. package/tooltip/tooltip.component.d.ts +2 -0
  141. package/tooltip/tooltip.directive.d.ts +3 -5
  142. package/esm2020/alert/alert-container.component.mjs +0 -207
  143. package/esm2020/alert/alert-message.component.mjs +0 -102
  144. package/esm2020/alert/alert.module.mjs +0 -22
  145. package/esm2020/alert/testing/test-api.mjs +0 -44
  146. package/esm2020/behavior/await.directive.mjs +0 -133
  147. package/esm2020/behavior/behavior.module.mjs +0 -37
  148. package/esm2020/behavior/observe-content-class.directive.mjs +0 -63
  149. package/esm2020/behavior/sizing-monitor.directive.mjs +0 -31
  150. package/esm2020/behavior/sizing.directive.mjs +0 -256
  151. package/esm2020/clip-note/clip-note.component.mjs +0 -216
  152. package/esm2020/clip-note/clip-note.directive.mjs +0 -141
  153. package/esm2020/clip-note/clip-note.module.mjs +0 -32
  154. package/esm2020/common/common.module.mjs +0 -53
  155. package/esm2020/currency-input/currency-input.directive.mjs +0 -276
  156. package/esm2020/currency-input/currency-input.module.mjs +0 -19
  157. package/esm2020/decimal-input/decimal-input.directive.mjs +0 -122
  158. package/esm2020/discrete-input/discrete-input.component.mjs +0 -337
  159. package/esm2020/discrete-input/discrete-input.module.mjs +0 -21
  160. package/esm2020/file-upload/file-upload.component.mjs +0 -400
  161. package/esm2020/file-upload/file-upload.module.mjs +0 -44
  162. package/esm2020/file-upload/file-upload.service.mjs +0 -29
  163. package/esm2020/form-field/form-field.component.mjs +0 -82
  164. package/esm2020/form-field/form-field.module.mjs +0 -33
  165. package/esm2020/icon-font/icon-font.module.mjs +0 -22
  166. package/esm2020/icon-font/icon.directive.mjs +0 -102
  167. package/esm2020/icon-font/utilities.mjs +0 -51
  168. package/esm2020/panel/panel-section.component.mjs +0 -41
  169. package/esm2020/panel/panel.component.mjs +0 -87
  170. package/esm2020/panel/panel.module.mjs +0 -23
  171. package/esm2020/panel/tinted.directive.mjs +0 -60
  172. package/esm2020/phone-number/phone-number.directive.mjs +0 -188
  173. package/esm2020/phone-number/phone-number.pipe.mjs +0 -47
  174. package/esm2020/phone-number/phone-number.validator.mjs +0 -64
  175. package/esm2020/radio-panel/radio-panel-item.component.mjs +0 -93
  176. package/esm2020/radio-panel/radio-panel.component.mjs +0 -81
  177. package/esm2020/radio-panel/testing/test-api.mjs +0 -47
  178. package/esm2020/selection-panel/selection-panel-item.component.mjs +0 -166
  179. package/esm2020/selection-panel/selection-panel.directive.mjs +0 -119
  180. package/esm2020/selection-panel/selection-panel.module.mjs +0 -23
  181. package/esm2020/skeletons/skeleton-loader-presets.directive.mjs +0 -83
  182. package/esm2020/skeletons/skeleton-loader.component.mjs +0 -76
  183. package/esm2020/skeletons/skeletons.module.mjs +0 -35
  184. package/esm2020/stepper/stepper.component.mjs +0 -176
  185. package/esm2020/stepper/stepper.module.mjs +0 -52
  186. package/esm2020/tooltip/tooltip.component.mjs +0 -54
  187. package/esm2020/tooltip/tooltip.directive.mjs +0 -149
  188. package/esm2020/tooltip/tooltip.module.mjs +0 -25
  189. package/fesm2015/bravura-ui-alert-testing.mjs +0 -64
  190. package/fesm2015/bravura-ui-alert-testing.mjs.map +0 -1
  191. package/fesm2015/bravura-ui-alert.mjs +0 -340
  192. package/fesm2015/bravura-ui-alert.mjs.map +0 -1
  193. package/fesm2015/bravura-ui-behavior.mjs +0 -515
  194. package/fesm2015/bravura-ui-behavior.mjs.map +0 -1
  195. package/fesm2015/bravura-ui-clip-note.mjs +0 -393
  196. package/fesm2015/bravura-ui-clip-note.mjs.map +0 -1
  197. package/fesm2015/bravura-ui-common.mjs +0 -96
  198. package/fesm2015/bravura-ui-common.mjs.map +0 -1
  199. package/fesm2015/bravura-ui-currency-input.mjs +0 -300
  200. package/fesm2015/bravura-ui-currency-input.mjs.map +0 -1
  201. package/fesm2015/bravura-ui-decimal-input.mjs +0 -145
  202. package/fesm2015/bravura-ui-decimal-input.mjs.map +0 -1
  203. package/fesm2015/bravura-ui-discrete-input.mjs +0 -365
  204. package/fesm2015/bravura-ui-discrete-input.mjs.map +0 -1
  205. package/fesm2015/bravura-ui-file-upload.mjs +0 -478
  206. package/fesm2015/bravura-ui-file-upload.mjs.map +0 -1
  207. package/fesm2015/bravura-ui-form-field.mjs +0 -120
  208. package/fesm2015/bravura-ui-form-field.mjs.map +0 -1
  209. package/fesm2015/bravura-ui-icon-font.mjs +0 -178
  210. package/fesm2015/bravura-ui-icon-font.mjs.map +0 -1
  211. package/fesm2015/bravura-ui-panel.mjs +0 -210
  212. package/fesm2015/bravura-ui-panel.mjs.map +0 -1
  213. package/fesm2015/bravura-ui-phone-number.mjs +0 -327
  214. package/fesm2015/bravura-ui-phone-number.mjs.map +0 -1
  215. package/fesm2015/bravura-ui-radio-panel-testing.mjs +0 -63
  216. package/fesm2015/bravura-ui-radio-panel-testing.mjs.map +0 -1
  217. package/fesm2015/bravura-ui-radio-panel.mjs +0 -200
  218. package/fesm2015/bravura-ui-radio-panel.mjs.map +0 -1
  219. package/fesm2015/bravura-ui-selection-panel.mjs +0 -311
  220. package/fesm2015/bravura-ui-selection-panel.mjs.map +0 -1
  221. package/fesm2015/bravura-ui-skeletons.mjs +0 -195
  222. package/fesm2015/bravura-ui-skeletons.mjs.map +0 -1
  223. package/fesm2015/bravura-ui-stepper.mjs +0 -253
  224. package/fesm2015/bravura-ui-stepper.mjs.map +0 -1
  225. package/fesm2015/bravura-ui-tooltip.mjs +0 -229
  226. package/fesm2015/bravura-ui-tooltip.mjs.map +0 -1
  227. package/fesm2015/bravura-ui.mjs.map +0 -1
  228. package/fesm2020/bravura-ui-alert-testing.mjs.map +0 -1
  229. package/fesm2020/bravura-ui-alert.mjs +0 -328
  230. package/fesm2020/bravura-ui-alert.mjs.map +0 -1
  231. package/fesm2020/bravura-ui-behavior.mjs.map +0 -1
  232. package/fesm2020/bravura-ui-clip-note.mjs.map +0 -1
  233. package/fesm2020/bravura-ui-common.mjs.map +0 -1
  234. package/fesm2020/bravura-ui-currency-input.mjs.map +0 -1
  235. package/fesm2020/bravura-ui-decimal-input.mjs.map +0 -1
  236. package/fesm2020/bravura-ui-discrete-input.mjs.map +0 -1
  237. package/fesm2020/bravura-ui-file-upload.mjs +0 -474
  238. package/fesm2020/bravura-ui-file-upload.mjs.map +0 -1
  239. package/fesm2020/bravura-ui-form-field.mjs.map +0 -1
  240. package/fesm2020/bravura-ui-icon-font.mjs.map +0 -1
  241. package/fesm2020/bravura-ui-panel.mjs +0 -206
  242. package/fesm2020/bravura-ui-panel.mjs.map +0 -1
  243. package/fesm2020/bravura-ui-phone-number.mjs.map +0 -1
  244. package/fesm2020/bravura-ui-radio-panel-testing.mjs.map +0 -1
  245. package/fesm2020/bravura-ui-radio-panel.mjs.map +0 -1
  246. package/fesm2020/bravura-ui-selection-panel.mjs +0 -306
  247. package/fesm2020/bravura-ui-selection-panel.mjs.map +0 -1
  248. package/fesm2020/bravura-ui-skeletons.mjs.map +0 -1
  249. package/fesm2020/bravura-ui-stepper.mjs +0 -251
  250. package/fesm2020/bravura-ui-stepper.mjs.map +0 -1
  251. package/fesm2020/bravura-ui-tooltip.mjs.map +0 -1
  252. package/fesm2020/bravura-ui.mjs +0 -8
  253. package/fesm2020/bravura-ui.mjs.map +0 -1
  254. /package/{esm2020 → esm2022}/alert/bravura-ui-alert.mjs +0 -0
  255. /package/{esm2020 → esm2022}/alert/testing/bravura-ui-alert-testing.mjs +0 -0
  256. /package/{esm2020 → esm2022}/behavior/bravura-ui-behavior.mjs +0 -0
  257. /package/{esm2020 → esm2022}/bravura-ui.mjs +0 -0
  258. /package/{esm2020 → esm2022}/clip-note/bravura-ui-clip-note.mjs +0 -0
  259. /package/{esm2020 → esm2022}/common/bravura-ui-common.mjs +0 -0
  260. /package/{esm2020 → esm2022}/currency-input/bravura-ui-currency-input.mjs +0 -0
  261. /package/{esm2020 → esm2022}/decimal-input/bravura-ui-decimal-input.mjs +0 -0
  262. /package/{esm2020 → esm2022}/decimal-input/public-api.mjs +0 -0
  263. /package/{esm2020 → esm2022}/discrete-input/bravura-ui-discrete-input.mjs +0 -0
  264. /package/{esm2020 → esm2022}/file-upload/bravura-ui-file-upload.mjs +0 -0
  265. /package/{esm2020 → esm2022}/form-field/bravura-ui-form-field.mjs +0 -0
  266. /package/{esm2020 → esm2022}/icon-font/bravura-ui-icon-font.mjs +0 -0
  267. /package/{esm2020 → esm2022}/panel/bravura-ui-panel.mjs +0 -0
  268. /package/{esm2020 → esm2022}/phone-number/bravura-ui-phone-number.mjs +0 -0
  269. /package/{esm2020 → esm2022}/radio-panel/bravura-ui-radio-panel.mjs +0 -0
  270. /package/{esm2020 → esm2022}/radio-panel/public-api.mjs +0 -0
  271. /package/{esm2020 → esm2022}/radio-panel/testing/bravura-ui-radio-panel-testing.mjs +0 -0
  272. /package/{esm2020 → esm2022}/selection-panel/bravura-ui-selection-panel.mjs +0 -0
  273. /package/{esm2020 → esm2022}/skeletons/bravura-ui-skeletons.mjs +0 -0
  274. /package/{esm2020 → esm2022}/stepper/bravura-ui-stepper.mjs +0 -0
  275. /package/{esm2020 → esm2022}/tooltip/bravura-ui-tooltip.mjs +0 -0
  276. /package/{fesm2015 → fesm2022}/bravura-ui.mjs +0 -0
@@ -0,0 +1,337 @@
1
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
+ import { Component, ElementRef, Inject, Input, Optional, Self, ViewChildren } from '@angular/core';
3
+ import { UntypedFormArray, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms';
4
+ import { mixinErrorState } from '@angular/material/core';
5
+ import { MatFormFieldControl, MAT_FORM_FIELD } from '@angular/material/form-field';
6
+ import { Subject } from 'rxjs';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/cdk/a11y";
9
+ import * as i2 from "@angular/forms";
10
+ import * as i3 from "@angular/material/core";
11
+ import * as i4 from "@angular/common";
12
+ import * as i5 from "@angular/material/form-field";
13
+ // Boilerplate for applying mixins to form field control for error state checking.
14
+ /** @ignore */
15
+ const _DiscreteInputBase = mixinErrorState(class {
16
+ constructor(
17
+ /** @ignore */ _defaultErrorStateMatcher,
18
+ /** @ignore */ _parentForm,
19
+ /** @ignore */ _parentFormGroup,
20
+ /** @ignore */ ngControl) {
21
+ this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
22
+ this._parentForm = _parentForm;
23
+ this._parentFormGroup = _parentFormGroup;
24
+ this.ngControl = ngControl;
25
+ this.stateChanges = new Subject();
26
+ }
27
+ });
28
+ /**
29
+ * Custom `MatFormFieldControl` with an individual input box for each character, suitable for fixed-length fields,
30
+ * such as secondary PIN inputs, TFNs, or BSB code etc.
31
+ *
32
+ * Accessibility features are not yet fully implemented.
33
+ *
34
+ * Example:
35
+ *
36
+ * ```html
37
+ * <mat-form-field>
38
+ * <bui-discrete-input></bui-discrete-input>
39
+ * </mat-form-field>
40
+ * ```
41
+ *
42
+ */
43
+ export class DiscreteInputComponent extends _DiscreteInputBase {
44
+ /** @ignore */
45
+ static { this.nextId = 0; }
46
+ /** @ignore */
47
+ get shouldLabelFloat() {
48
+ return true;
49
+ }
50
+ /** @ignore */
51
+ get empty() {
52
+ return this.parts.controls.every(c => !c.value);
53
+ }
54
+ /**
55
+ * Defines the length and grouping of the input.
56
+ * @default [2, 2, 2]
57
+ */
58
+ get sizeSpec() {
59
+ return this._sizeSpec;
60
+ }
61
+ set sizeSpec(spec) {
62
+ let size = 0;
63
+ this._separatorPos = [];
64
+ spec.forEach((n, i) => {
65
+ size += n;
66
+ if (i < spec.length - 1) {
67
+ this._separatorPos.push(size);
68
+ }
69
+ });
70
+ if (size !== this.parts.length) {
71
+ const v = this.value;
72
+ this.parts.clear({ emitEvent: false });
73
+ for (let i = 0; i < size; i++) {
74
+ this.parts.setControl(i, new UntypedFormControl(null, [Validators.required, Validators.minLength(1), Validators.maxLength(1)]));
75
+ }
76
+ this.value = v;
77
+ this._sizeSpec = spec;
78
+ }
79
+ }
80
+ /** The placeholder for this control. */
81
+ get placeholder() {
82
+ return this._placeholder;
83
+ }
84
+ set placeholder(value) {
85
+ this._placeholder = value;
86
+ this.stateChanges.next();
87
+ }
88
+ /** Whether the control is required. */
89
+ get required() {
90
+ return this._required;
91
+ }
92
+ set required(value) {
93
+ this._required = coerceBooleanProperty(value);
94
+ this.stateChanges.next();
95
+ }
96
+ /** Whether the control is disabled. */
97
+ get disabled() {
98
+ return this._disabled;
99
+ }
100
+ set disabled(value) {
101
+ this._disabled = coerceBooleanProperty(value);
102
+ this._disabled ? this.parts.disable() : this.parts.enable();
103
+ this.stateChanges.next();
104
+ }
105
+ /** The value of the control. */
106
+ get value() {
107
+ return this.parts.controls
108
+ .map(c => c.value)
109
+ .filter(c => c)
110
+ .join('');
111
+ }
112
+ set value(v) {
113
+ v = v || '';
114
+ for (let i = 0; i < this.parts.controls.length; i++) {
115
+ this.parts.controls[i]?.setValue(v[i]);
116
+ }
117
+ this.stateChanges.next();
118
+ }
119
+ /** @ignore */
120
+ get _colorSuffix() {
121
+ return this.errorState ? 'warn' : this._formField?.color || 'primary';
122
+ }
123
+ constructor(_focusMonitor, _elementRef, formField, control, _parentForm, _parentFormGroup, _defaultErrorStateMatcher) {
124
+ super(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, control);
125
+ this._focusMonitor = _focusMonitor;
126
+ this._elementRef = _elementRef;
127
+ /** The type of input boxes */
128
+ this.type = 'text';
129
+ /** Input boxes are separated in groups. This specifies the characters displayed between two groups. */
130
+ this.separator = ' ';
131
+ /** @ignore */ this.id = `bui-discrete-input-${DiscreteInputComponent.nextId++}`;
132
+ this.autocomplete = 'off';
133
+ this._sizeSpec = [];
134
+ this._required = false;
135
+ this._disabled = false;
136
+ this._separatorPos = [];
137
+ /** @ignore */ this.onChange = (_) => { };
138
+ /** @ignore */ this.onTouched = () => { };
139
+ /** @ignore */ this.errorState = false;
140
+ this.parts = new UntypedFormArray([]);
141
+ this.group = new UntypedFormGroup({ parts: this.parts });
142
+ this.sizeSpec = [2, 2, 2];
143
+ this._formField = formField;
144
+ this.focused = false;
145
+ this.stateChanges = new Subject();
146
+ this.ngControl = control;
147
+ if (this.ngControl != null) {
148
+ this.ngControl.valueAccessor = this;
149
+ }
150
+ this._focusMonitor.monitor(this._elementRef, true).subscribe(origin => {
151
+ if (this.focused && !origin) {
152
+ this.onTouched();
153
+ }
154
+ this.focused = !!origin;
155
+ this.stateChanges.next();
156
+ });
157
+ }
158
+ /** @ignore */
159
+ ngOnDestroy() {
160
+ this.stateChanges.complete();
161
+ this._focusMonitor.stopMonitoring(this._elementRef);
162
+ }
163
+ /** @ignore */
164
+ setDescribedByIds(ids) {
165
+ const controlElement = this._elementRef.nativeElement.querySelector('.bui-discrete-input-container');
166
+ controlElement.setAttribute('aria-describedby', ids.join(' '));
167
+ }
168
+ /** @ignore */
169
+ onContainerClick() {
170
+ const l = this.parts.controls.length;
171
+ for (let i = 0; i < l; i++) {
172
+ if (this.parts.controls[i].invalid || i === l - 1) {
173
+ this._focusMonitor.focusVia(this.inputParts.get(i), 'program');
174
+ break;
175
+ }
176
+ }
177
+ }
178
+ /** @ignore */
179
+ writeValue(v) {
180
+ this.value = v;
181
+ }
182
+ /** @ignore */
183
+ registerOnChange(fn) {
184
+ this.onChange = fn;
185
+ }
186
+ /** @ignore */
187
+ registerOnTouched(fn) {
188
+ this.onTouched = fn;
189
+ }
190
+ /** @ignore */
191
+ setDisabledState(isDisabled) {
192
+ this.disabled = isDisabled;
193
+ }
194
+ /** @ignore */
195
+ _handleInput(control, index, event) {
196
+ let v = control.value && control.value[0];
197
+ const rawValue = event.target.value;
198
+ if (rawValue.length > 1) {
199
+ this._replaceText(rawValue, event);
200
+ return;
201
+ }
202
+ control.setValue(v);
203
+ const nextElement = this.inputParts.get(index + 1);
204
+ if (!control.errors && nextElement) {
205
+ this._focusPart(nextElement);
206
+ }
207
+ this.onChange(this.value);
208
+ }
209
+ /** @ignore */
210
+ _handleBeforeInput(index, event) {
211
+ const v = event.data;
212
+ if (this.accept && v && !new RegExp(`[${this.accept}]`).test(v)) {
213
+ event.preventDefault();
214
+ event.stopPropagation();
215
+ return;
216
+ }
217
+ const inp = this.inputParts.get(index).nativeElement;
218
+ if (v && inp.value) {
219
+ inp.value = '';
220
+ }
221
+ }
222
+ /** @ignore */
223
+ _focusPart(elemRef) {
224
+ this._focusMonitor.focusVia(elemRef, 'program');
225
+ }
226
+ /** @ignore */
227
+ _consumeKey(event) {
228
+ event.stopPropagation();
229
+ event.preventDefault();
230
+ }
231
+ /** @ignore */
232
+ _leftArrow(index, event) {
233
+ this._consumeKey(event);
234
+ const prevElement = this.inputParts.get(index - 1);
235
+ if (prevElement) {
236
+ this._focusPart(prevElement);
237
+ }
238
+ }
239
+ /** @ignore */
240
+ _rightArrow(index, event) {
241
+ this._consumeKey(event);
242
+ const nextElement = this.inputParts.get(index + 1);
243
+ if (nextElement) {
244
+ this._focusPart(nextElement);
245
+ }
246
+ }
247
+ /** @ignore */
248
+ _handleBackspace(control, index) {
249
+ const prevElement = index && this.inputParts.get(index - 1);
250
+ if (!control.value && prevElement) {
251
+ this._focusMonitor.focusVia(prevElement, 'program');
252
+ }
253
+ else if (control.value) {
254
+ control.setValue('');
255
+ this.onChange(this.value);
256
+ }
257
+ }
258
+ /** @ignore */
259
+ _onPaste(event) {
260
+ let text = event.clipboardData?.getData('text');
261
+ this._replaceText(text, event);
262
+ }
263
+ /** @ignore */
264
+ _separatorRequired(index) {
265
+ return this._separatorPos.includes(index + 1);
266
+ }
267
+ /** @ignore */
268
+ _placeholderAt(index) {
269
+ return this._placeholder && this._placeholder[index];
270
+ }
271
+ /** @ignore */
272
+ ngDoCheck() {
273
+ if (this.ngControl) {
274
+ // We need to re-evaluate this on every change detection cycle, because there are some
275
+ // error triggers that we can't subscribe to (e.g. parent form submissions). This means
276
+ // that whatever logic is in here has to be super lean or we risk destroying the performance.
277
+ this.updateErrorState();
278
+ }
279
+ }
280
+ _replaceText(text, event) {
281
+ if (text) {
282
+ if (this.accept) {
283
+ text = text.replace(new RegExp(`[^${this.accept}]`, 'gi'), '');
284
+ }
285
+ this.value = text;
286
+ this.onChange(this.value);
287
+ }
288
+ event.preventDefault();
289
+ this.onContainerClick();
290
+ }
291
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: DiscreteInputComponent, deps: [{ token: i1.FocusMonitor }, { token: i0.ElementRef }, { token: MAT_FORM_FIELD, optional: true }, { token: i2.NgControl, optional: true, self: true }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i3.ErrorStateMatcher }], target: i0.ɵɵFactoryTarget.Component }); }
292
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.2", type: DiscreteInputComponent, selector: "bui-discrete-input", inputs: { type: "type", separator: "separator", accept: "accept", userAriaDescribedBy: ["aria-describedby", "userAriaDescribedBy"], autocomplete: "autocomplete", sizeSpec: "sizeSpec", placeholder: "placeholder", required: "required", disabled: "disabled", value: "value" }, host: { classAttribute: "bui-discrete-input bui-host" }, providers: [{ provide: MatFormFieldControl, useExisting: DiscreteInputComponent }], viewQueries: [{ propertyName: "inputParts", predicate: ["part"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div\r\n\trole=\"group\"\r\n\tclass=\"bui-discrete-input-container\"\r\n\t[formGroup]=\"group\"\r\n\t[attr.aria-labelledby]=\"_formField?.getLabelId()\"\r\n>\r\n\t<ng-container [formArrayName]=\"'parts'\">\r\n\t\t<ng-template ngFor [ngForOf]=\"parts.controls\" let-p let-i=\"index\">\r\n\t\t\t<input\r\n\t\t\t\tclass=\"bui-discrete-input-element bui-outline-{{ _colorSuffix }}\"\r\n\t\t\t\t[formControlName]=\"i\"\r\n\t\t\t\t[attr.aria-label]=\"'character ' + (i + 1)\"\r\n\t\t\t\t(input)=\"_handleInput(p, i, $event)\"\r\n\t\t\t\t(beforeinput)=\"_handleBeforeInput(i, $event)\"\r\n\t\t\t\t(keydown.backspace)=\"_handleBackspace(p, i)\"\r\n\t\t\t\t(keydown.arrowup)=\"_consumeKey($event)\"\r\n\t\t\t\t(keydown.arrowdown)=\"_consumeKey($event)\"\r\n\t\t\t\t(keydown.arrowleft)=\"_leftArrow(i, $event)\"\r\n\t\t\t\t(keydown.arrowright)=\"_rightArrow(i, $event)\"\r\n\t\t\t\t[attr.placeholder]=\"_placeholderAt(i)\"\r\n\t\t\t\t#part\r\n\t\t\t\t(click)=\"$event.stopPropagation()\"\r\n\t\t\t\t(paste)=\"_onPaste($event)\"\r\n\t\t\t\t[type]=\"['text', 'number', 'password'].includes(type) ? type : 'text'\"\r\n\t\t\t\t[attr.inputmode]=\"type === 'number' ? 'decimal' : undefined\"\r\n\t\t\t\tautocapitalize=\"none\"\r\n\t\t\t/>\r\n\t\t\t<span *ngIf=\"_separatorRequired(i)\" class=\"bui-discrete-input-spacer\">{{ separator }}</span>\r\n\t\t</ng-template>\r\n\t</ng-container>\r\n</div>\r\n", styles: [".bui-discrete-input-container{display:flex;align-items:center}.bui-discrete-input-element{border:1px solid rgba(128,128,128,.4);border-radius:3px;background:none;padding:0;text-align:center;width:1.5em;height:1.5em;font-size:inherit;color:currentColor;caret-color:auto}.bui-discrete-input-element:not(:last-child){margin-right:.25em}.bui-discrete-input-element:focus-visible{outline-style:solid;outline-width:2px;outline-offset:-1px}.bui-discrete-input-element[type=number]::-webkit-inner-spin-button,.bui-discrete-input-element[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.bui-discrete-input-element[type=number]{-moz-appearance:textfield}.bui-discrete-input-spacer{margin-right:.25em;vertical-align:middle}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }] }); }
293
+ }
294
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: DiscreteInputComponent, decorators: [{
295
+ type: Component,
296
+ args: [{ selector: 'bui-discrete-input', providers: [{ provide: MatFormFieldControl, useExisting: DiscreteInputComponent }], host: {
297
+ class: 'bui-discrete-input bui-host'
298
+ }, template: "<div\r\n\trole=\"group\"\r\n\tclass=\"bui-discrete-input-container\"\r\n\t[formGroup]=\"group\"\r\n\t[attr.aria-labelledby]=\"_formField?.getLabelId()\"\r\n>\r\n\t<ng-container [formArrayName]=\"'parts'\">\r\n\t\t<ng-template ngFor [ngForOf]=\"parts.controls\" let-p let-i=\"index\">\r\n\t\t\t<input\r\n\t\t\t\tclass=\"bui-discrete-input-element bui-outline-{{ _colorSuffix }}\"\r\n\t\t\t\t[formControlName]=\"i\"\r\n\t\t\t\t[attr.aria-label]=\"'character ' + (i + 1)\"\r\n\t\t\t\t(input)=\"_handleInput(p, i, $event)\"\r\n\t\t\t\t(beforeinput)=\"_handleBeforeInput(i, $event)\"\r\n\t\t\t\t(keydown.backspace)=\"_handleBackspace(p, i)\"\r\n\t\t\t\t(keydown.arrowup)=\"_consumeKey($event)\"\r\n\t\t\t\t(keydown.arrowdown)=\"_consumeKey($event)\"\r\n\t\t\t\t(keydown.arrowleft)=\"_leftArrow(i, $event)\"\r\n\t\t\t\t(keydown.arrowright)=\"_rightArrow(i, $event)\"\r\n\t\t\t\t[attr.placeholder]=\"_placeholderAt(i)\"\r\n\t\t\t\t#part\r\n\t\t\t\t(click)=\"$event.stopPropagation()\"\r\n\t\t\t\t(paste)=\"_onPaste($event)\"\r\n\t\t\t\t[type]=\"['text', 'number', 'password'].includes(type) ? type : 'text'\"\r\n\t\t\t\t[attr.inputmode]=\"type === 'number' ? 'decimal' : undefined\"\r\n\t\t\t\tautocapitalize=\"none\"\r\n\t\t\t/>\r\n\t\t\t<span *ngIf=\"_separatorRequired(i)\" class=\"bui-discrete-input-spacer\">{{ separator }}</span>\r\n\t\t</ng-template>\r\n\t</ng-container>\r\n</div>\r\n", styles: [".bui-discrete-input-container{display:flex;align-items:center}.bui-discrete-input-element{border:1px solid rgba(128,128,128,.4);border-radius:3px;background:none;padding:0;text-align:center;width:1.5em;height:1.5em;font-size:inherit;color:currentColor;caret-color:auto}.bui-discrete-input-element:not(:last-child){margin-right:.25em}.bui-discrete-input-element:focus-visible{outline-style:solid;outline-width:2px;outline-offset:-1px}.bui-discrete-input-element[type=number]::-webkit-inner-spin-button,.bui-discrete-input-element[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.bui-discrete-input-element[type=number]{-moz-appearance:textfield}.bui-discrete-input-spacer{margin-right:.25em;vertical-align:middle}\n"] }]
299
+ }], ctorParameters: () => [{ type: i1.FocusMonitor }, { type: i0.ElementRef }, { type: i5.MatFormField, decorators: [{
300
+ type: Optional
301
+ }, {
302
+ type: Inject,
303
+ args: [MAT_FORM_FIELD]
304
+ }] }, { type: i2.NgControl, decorators: [{
305
+ type: Optional
306
+ }, {
307
+ type: Self
308
+ }] }, { type: i2.NgForm, decorators: [{
309
+ type: Optional
310
+ }] }, { type: i2.FormGroupDirective, decorators: [{
311
+ type: Optional
312
+ }] }, { type: i3.ErrorStateMatcher }], propDecorators: { type: [{
313
+ type: Input
314
+ }], separator: [{
315
+ type: Input
316
+ }], accept: [{
317
+ type: Input
318
+ }], userAriaDescribedBy: [{
319
+ type: Input,
320
+ args: ['aria-describedby']
321
+ }], inputParts: [{
322
+ type: ViewChildren,
323
+ args: ['part', { read: ElementRef }]
324
+ }], autocomplete: [{
325
+ type: Input
326
+ }], sizeSpec: [{
327
+ type: Input
328
+ }], placeholder: [{
329
+ type: Input
330
+ }], required: [{
331
+ type: Input
332
+ }], disabled: [{
333
+ type: Input
334
+ }], value: [{
335
+ type: Input
336
+ }] } });
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY3JldGUtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvZGlzY3JldGUtaW5wdXQvZGlzY3JldGUtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvZGlzY3JldGUtaW5wdXQvZGlzY3JldGUtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUNOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBRVIsSUFBSSxFQUNKLFlBQVksRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR04sZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFJaEIsVUFBVSxFQUNWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFxQixlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RSxPQUFPLEVBQWdCLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFFL0Isa0ZBQWtGO0FBQ2xGLGNBQWM7QUFDZCxNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FDekM7SUFFQztJQUNDLGNBQWMsQ0FBUSx5QkFBNEM7SUFDbEUsY0FBYyxDQUFRLFdBQW1CO0lBQ3pDLGNBQWMsQ0FBUSxnQkFBb0M7SUFDMUQsY0FBYyxDQUFRLFNBQW9CO1FBSHBCLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBbUI7UUFDNUMsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFvQjtRQUNwQyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBTGxDLGlCQUFZLEdBQUcs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O0lBQ3pCLENBQUM7OEdBcFZXLHNCQUFzQix3RUE2SmIsY0FBYztrR0E3SnZCLHNCQUFzQix3WEFMdkIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyw0RkE0Q3BELFVBQVUsb0RDekd6QywyMkNBK0JBOzsyRkRtQ2Esc0JBQXNCO2tCQVRsQyxTQUFTOytCQUNDLG9CQUFvQixhQUduQixDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsd0JBQXdCLEVBQUUsQ0FBQyxRQUM1RTt3QkFDTCxLQUFLLEVBQUUsNkJBQTZCO3FCQUNwQzs7MEJBK0pDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsY0FBYzs7MEJBQ2pDLFFBQVE7OzBCQUFJLElBQUk7OzBCQUNoQixRQUFROzswQkFDUixRQUFRO3lFQTNJVixJQUFJO3NCQURILEtBQUs7Z0JBS04sU0FBUztzQkFEUixLQUFLO2dCQVFOLE1BQU07c0JBREwsS0FBSztnQkFNcUIsbUJBQW1CO3NCQUE3QyxLQUFLO3VCQUFDLGtCQUFrQjtnQkFFMkIsVUFBVTtzQkFBN0QsWUFBWTt1QkFBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQVMxQyxZQUFZO3NCQURYLEtBQUs7Z0JBNkJGLFFBQVE7c0JBRFgsS0FBSztnQkE2QkYsV0FBVztzQkFEZCxLQUFLO2dCQVdGLFFBQVE7c0JBRFgsS0FBSztnQkFXRixRQUFRO3NCQURYLEtBQUs7Z0JBWUYsS0FBSztzQkFEUixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5pbXBvcnQge1xyXG5cdENvbXBvbmVudCxcclxuXHRFbGVtZW50UmVmLFxyXG5cdEluamVjdCxcclxuXHRJbnB1dCxcclxuXHRPbkRlc3Ryb3ksXHJcblx0T3B0aW9uYWwsXHJcblx0UXVlcnlMaXN0LFxyXG5cdFNlbGYsXHJcblx0Vmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcblx0QWJzdHJhY3RDb250cm9sLFxyXG5cdENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxyXG5cdFVudHlwZWRGb3JtQXJyYXksXHJcblx0VW50eXBlZEZvcm1Db250cm9sLFxyXG5cdFVudHlwZWRGb3JtR3JvdXAsXHJcblx0Rm9ybUdyb3VwRGlyZWN0aXZlLFxyXG5cdE5nQ29udHJvbCxcclxuXHROZ0Zvcm0sXHJcblx0VmFsaWRhdG9yc1xyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRXJyb3JTdGF0ZU1hdGNoZXIsIG1peGluRXJyb3JTdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1hdEZvcm1GaWVsZENvbnRyb2wsIE1BVF9GT1JNX0ZJRUxEIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbi8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gZm9ybSBmaWVsZCBjb250cm9sIGZvciBlcnJvciBzdGF0ZSBjaGVja2luZy5cclxuLyoqIEBpZ25vcmUgKi9cclxuY29uc3QgX0Rpc2NyZXRlSW5wdXRCYXNlID0gbWl4aW5FcnJvclN0YXRlKFxyXG5cdGNsYXNzIHtcclxuXHRcdHJlYWRvbmx5IHN0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblx0XHRjb25zdHJ1Y3RvcihcclxuXHRcdFx0LyoqIEBpZ25vcmUgKi8gcHVibGljIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxyXG5cdFx0XHQvKiogQGlnbm9yZSAqLyBwdWJsaWMgX3BhcmVudEZvcm06IE5nRm9ybSxcclxuXHRcdFx0LyoqIEBpZ25vcmUgKi8gcHVibGljIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcclxuXHRcdFx0LyoqIEBpZ25vcmUgKi8gcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sXHJcblx0XHQpIHt9XHJcblx0fVxyXG4pO1xyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSBgTWF0Rm9ybUZpZWxkQ29udHJvbGAgd2l0aCBhbiBpbmRpdmlkdWFsIGlucHV0IGJveCBmb3IgZWFjaCBjaGFyYWN0ZXIsIHN1aXRhYmxlIGZvciBmaXhlZC1sZW5ndGggZmllbGRzLFxyXG4gKiBzdWNoIGFzIHNlY29uZGFyeSBQSU4gaW5wdXRzLCBURk5zLCBvciBCU0IgY29kZSBldGMuXHJcbiAqXHJcbiAqIEFjY2Vzc2liaWxpdHkgZmVhdHVyZXMgYXJlIG5vdCB5ZXQgZnVsbHkgaW1wbGVtZW50ZWQuXHJcbiAqXHJcbiAqIEV4YW1wbGU6XHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPG1hdC1mb3JtLWZpZWxkPlxyXG4gKiAgIDxidWktZGlzY3JldGUtaW5wdXQ+PC9idWktZGlzY3JldGUtaW5wdXQ+XHJcbiAqIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdidWktZGlzY3JldGUtaW5wdXQnLFxyXG5cdHRlbXBsYXRlVXJsOiAnZGlzY3JldGUtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWydkaXNjcmV0ZS1pbnB1dC5jb21wb25lbnQuc2NzcyddLFxyXG5cdHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IERpc2NyZXRlSW5wdXRDb21wb25lbnQgfV0sXHJcblx0aG9zdDoge1xyXG5cdFx0Y2xhc3M6ICdidWktZGlzY3JldGUtaW5wdXQgYnVpLWhvc3QnXHJcblx0fVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlzY3JldGVJbnB1dENvbXBvbmVudFxyXG5cdGV4dGVuZHMgX0Rpc2NyZXRlSW5wdXRCYXNlXHJcblx0aW1wbGVtZW50cyBNYXRGb3JtRmllbGRDb250cm9sPHN0cmluZz4sIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkRlc3Ryb3lcclxue1xyXG5cdC8qKiBAaWdub3JlICovXHJcblx0c3RhdGljIG5leHRJZCA9IDA7XHJcblxyXG5cdC8qKiBAaWdub3JlICovXHJcblx0c3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHQvKiogQGlnbm9yZSAqL1xyXG5cdHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9yZXF1aXJlZDogYm9vbGVhbiB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG5cdC8qKiBAaWdub3JlICovIHBhcnRzOiBVbnR5cGVkRm9ybUFycmF5O1xyXG5cdC8qKiBAaWdub3JlICovIGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cdC8qKiBFbWl0cyB3aGVuZXZlciB0aGUgY29tcG9uZW50IHN0YXRlIGNoYW5nZXMuICovXHJcblx0c3RhdGVDaGFuZ2VzOiBTdWJqZWN0PHZvaWQ+O1xyXG5cdC8qKiBXaGV0aGVyIHRoZSBjb250cm9sIGlzIGZvY3VzZWQuICovXHJcblx0Zm9jdXNlZDogYm9vbGVhbjtcclxuXHJcblx0LyoqIFRoZSB0eXBlIG9mIGlucHV0IGJveGVzICovXHJcblx0QElucHV0KClcclxuXHR0eXBlOiAndGV4dCcgfCAnbnVtYmVyJyB8ICdwYXNzd29yZCcgPSAndGV4dCc7XHJcblxyXG5cdC8qKiBJbnB1dCBib3hlcyBhcmUgc2VwYXJhdGVkIGluIGdyb3Vwcy4gVGhpcyBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlcnMgZGlzcGxheWVkIGJldHdlZW4gdHdvIGdyb3Vwcy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdHNlcGFyYXRvciA9ICcgJztcclxuXHJcblx0LyoqXHJcblx0ICogQSBsaXN0IG9mIGNoYXJhY3RlcnMgYWNjZXB0ZWQgaW4gdGhlIGlucHV0cywgZm9yIGV4YW1wbGUgYDAtOWAsIGBhLXpBLVowLTlgXHJcblx0ICogQGV4YW1wbGUgJzAtOSdcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGFjY2VwdD86IHN0cmluZztcclxuXHJcblx0LyoqIEBpZ25vcmUgKi8gaWQgPSBgYnVpLWRpc2NyZXRlLWlucHV0LSR7RGlzY3JldGVJbnB1dENvbXBvbmVudC5uZXh0SWQrK31gO1xyXG5cclxuXHQvKiogVmFsdWUgb2YgYXJpYS1kZXNjcmliZWRieSB0aGF0IHNob3VsZCBiZSBtZXJnZWQgd2l0aCB0aGUgZGVzY3JpYmVkLWJ5IGlkcyB3aGljaCBhcmUgc2V0IGJ5IHRoZSBmb3JtLWZpZWxkLiAqL1xyXG5cdEBJbnB1dCgnYXJpYS1kZXNjcmliZWRieScpIHVzZXJBcmlhRGVzY3JpYmVkQnk/OiBzdHJpbmc7XHJcblxyXG5cdEBWaWV3Q2hpbGRyZW4oJ3BhcnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSBpbnB1dFBhcnRzITogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+O1xyXG5cclxuXHQvKipAaWdub3JlICovXHJcblx0X2Zvcm1GaWVsZDogTWF0Rm9ybUZpZWxkO1xyXG5cclxuXHQvKipAaWdub3JlICovXHJcblx0bmdDb250cm9sOiBOZ0NvbnRyb2w7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0YXV0b2NvbXBsZXRlPzogc3RyaW5nID0gJ29mZic7XHJcblxyXG5cdHByaXZhdGUgX3NpemVTcGVjOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuXHRwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xyXG5cclxuXHRwcml2YXRlIF9wbGFjZWhvbGRlcj86IHN0cmluZztcclxuXHRwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xyXG5cdHByaXZhdGUgX3NlcGFyYXRvclBvczogbnVtYmVyW10gPSBbXTtcclxuXHJcblx0LyoqIEBpZ25vcmUgKi8gb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcclxuXHQvKiogQGlnbm9yZSAqLyBvblRvdWNoZWQgPSAoKSA9PiB7fTtcclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHRnZXQgc2hvdWxkTGFiZWxGbG9hdCgpIHtcclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHRnZXQgZW1wdHkoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wYXJ0cy5jb250cm9scy5ldmVyeShjID0+ICFjLnZhbHVlKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGxlbmd0aCBhbmQgZ3JvdXBpbmcgb2YgdGhlIGlucHV0LlxyXG5cdCAqIEBkZWZhdWx0IFsyLCAyLCAyXVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHNpemVTcGVjKCk6IG51bWJlcltdIHtcclxuXHRcdHJldHVybiB0aGlzLl9zaXplU3BlYztcclxuXHR9XHJcblx0c2V0IHNpemVTcGVjKHNwZWM6IG51bWJlcltdKSB7XHJcblx0XHRsZXQgc2l6ZSA9IDA7XHJcblx0XHR0aGlzLl9zZXBhcmF0b3JQb3MgPSBbXTtcclxuXHRcdHNwZWMuZm9yRWFjaCgobiwgaSkgPT4ge1xyXG5cdFx0XHRzaXplICs9IG47XHJcblx0XHRcdGlmIChpIDwgc3BlYy5sZW5ndGggLSAxKSB7XHJcblx0XHRcdFx0dGhpcy5fc2VwYXJhdG9yUG9zLnB1c2goc2l6ZSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0aWYgKHNpemUgIT09IHRoaXMucGFydHMubGVuZ3RoKSB7XHJcblx0XHRcdGNvbnN0IHYgPSB0aGlzLnZhbHVlO1xyXG5cdFx0XHR0aGlzLnBhcnRzLmNsZWFyKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuXHRcdFx0XHR0aGlzLnBhcnRzLnNldENvbnRyb2woXHJcblx0XHRcdFx0XHRpLFxyXG5cdFx0XHRcdFx0bmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEpXSlcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMudmFsdWUgPSB2O1xyXG5cdFx0XHR0aGlzLl9zaXplU3BlYyA9IHNwZWM7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKiogVGhlIHBsYWNlaG9sZGVyIGZvciB0aGlzIGNvbnRyb2wuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLl9wbGFjZWhvbGRlciE7XHJcblx0fVxyXG5cdHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xyXG5cdFx0dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG5cdH1cclxuXHJcblx0LyoqIFdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgcmVxdWlyZWQuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XHJcblx0fVxyXG5cdHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG5cdFx0dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG5cdH1cclxuXHJcblx0LyoqIFdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgZGlzYWJsZWQuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcblx0fVxyXG5cdHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG5cdFx0dGhpcy5fZGlzYWJsZWQgPyB0aGlzLnBhcnRzLmRpc2FibGUoKSA6IHRoaXMucGFydHMuZW5hYmxlKCk7XHJcblx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcblx0fVxyXG5cclxuXHQvKiogVGhlIHZhbHVlIG9mIHRoZSBjb250cm9sLiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHZhbHVlKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gdGhpcy5wYXJ0cy5jb250cm9sc1xyXG5cdFx0XHQubWFwKGMgPT4gYy52YWx1ZSlcclxuXHRcdFx0LmZpbHRlcihjID0+IGMpXHJcblx0XHRcdC5qb2luKCcnKTtcclxuXHR9XHJcblx0c2V0IHZhbHVlKHY6IHN0cmluZykge1xyXG5cdFx0diA9IHYgfHwgJyc7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFydHMuY29udHJvbHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dGhpcy5wYXJ0cy5jb250cm9sc1tpXT8uc2V0VmFsdWUodltpXSk7XHJcblx0XHR9XHJcblx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcblx0fVxyXG5cclxuXHQvKiogQGlnbm9yZSAqL1xyXG5cdGdldCBfY29sb3JTdWZmaXgoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLmVycm9yU3RhdGUgPyAnd2FybicgOiB0aGlzLl9mb3JtRmllbGQ/LmNvbG9yIHx8ICdwcmltYXJ5JztcclxuXHR9XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBfZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3IsXHJcblx0XHRwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuXHRcdEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0ZPUk1fRklFTEQpIGZvcm1GaWVsZDogTWF0Rm9ybUZpZWxkLFxyXG5cdFx0QE9wdGlvbmFsKCkgQFNlbGYoKSBjb250cm9sOiBOZ0NvbnRyb2wsXHJcblx0XHRAT3B0aW9uYWwoKSBfcGFyZW50Rm9ybTogTmdGb3JtLFxyXG5cdFx0QE9wdGlvbmFsKCkgX3BhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG5cdFx0X2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXJcclxuXHQpIHtcclxuXHRcdHN1cGVyKF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIF9wYXJlbnRGb3JtLCBfcGFyZW50Rm9ybUdyb3VwLCBjb250cm9sKTtcclxuXHRcdHRoaXMucGFydHMgPSBuZXcgVW50eXBlZEZvcm1BcnJheShbXSk7XHJcblx0XHR0aGlzLmdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoeyBwYXJ0czogdGhpcy5wYXJ0cyB9KTtcclxuXHRcdHRoaXMuc2l6ZVNwZWMgPSBbMiwgMiwgMl07XHJcblx0XHR0aGlzLl9mb3JtRmllbGQgPSBmb3JtRmllbGQ7XHJcblx0XHR0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuXHRcdHRoaXMuc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcblx0XHR0aGlzLm5nQ29udHJvbCA9IGNvbnRyb2w7XHJcblx0XHRpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG5cdFx0XHR0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcih0aGlzLl9lbGVtZW50UmVmLCB0cnVlKS5zdWJzY3JpYmUob3JpZ2luID0+IHtcclxuXHRcdFx0aWYgKHRoaXMuZm9jdXNlZCAmJiAhb3JpZ2luKSB7XHJcblx0XHRcdFx0dGhpcy5vblRvdWNoZWQoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmZvY3VzZWQgPSAhIW9yaWdpbjtcclxuXHRcdFx0dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKiogQGlnbm9yZSAqLyBlcnJvclN0YXRlID0gZmFsc2U7XHJcblx0LyoqIEBpZ25vcmUgKi8gY29udHJvbFR5cGU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblx0LyoqIEBpZ25vcmUgKi8gYXV0b2ZpbGxlZD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG5cdC8qKiBAaWdub3JlICovXHJcblx0bmdPbkRlc3Ryb3koKSB7XHJcblx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xyXG5cdFx0dGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpO1xyXG5cdH1cclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHRzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKSB7XHJcblx0XHRjb25zdCBjb250cm9sRWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYnVpLWRpc2NyZXRlLWlucHV0LWNvbnRhaW5lcicpO1xyXG5cdFx0Y29udHJvbEVsZW1lbnQhLnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGlkcy5qb2luKCcgJykpO1xyXG5cdH1cclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHRvbkNvbnRhaW5lckNsaWNrKCkge1xyXG5cdFx0Y29uc3QgbCA9IHRoaXMucGFydHMuY29udHJvbHMubGVuZ3RoO1xyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcclxuXHRcdFx0aWYgKHRoaXMucGFydHMuY29udHJvbHNbaV0uaW52YWxpZCB8fCBpID09PSBsIC0gMSkge1xyXG5cdFx0XHRcdHRoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLmlucHV0UGFydHMuZ2V0KGkpISwgJ3Byb2dyYW0nKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHR3cml0ZVZhbHVlKHY6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0dGhpcy52YWx1ZSA9IHY7XHJcblx0fVxyXG5cclxuXHQvKiogQGlnbm9yZSAqL1xyXG5cdHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG5cdFx0dGhpcy5vbkNoYW5nZSA9IGZuO1xyXG5cdH1cclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHRyZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcblx0XHR0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG5cdH1cclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHRzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHRcdHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHRfaGFuZGxlSW5wdXQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBpbmRleDogbnVtYmVyLCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuXHRcdGxldCB2ID0gY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlWzBdO1xyXG5cdFx0Y29uc3QgcmF3VmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG5cdFx0aWYgKHJhd1ZhbHVlLmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0dGhpcy5fcmVwbGFjZVRleHQocmF3VmFsdWUsIGV2ZW50KTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y29udHJvbC5zZXRWYWx1ZSh2KTtcclxuXHRcdGNvbnN0IG5leHRFbGVtZW50ID0gdGhpcy5pbnB1dFBhcnRzLmdldChpbmRleCArIDEpO1xyXG5cdFx0aWYgKCFjb250cm9sLmVycm9ycyAmJiBuZXh0RWxlbWVudCkge1xyXG5cdFx0XHR0aGlzLl9mb2N1c1BhcnQobmV4dEVsZW1lbnQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XHJcblx0fVxyXG5cclxuXHQvKiogQGlnbm9yZSAqL1xyXG5cdF9oYW5kbGVCZWZvcmVJbnB1dChpbmRleDogbnVtYmVyLCBldmVudDogSW5wdXRFdmVudCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgdiA9IGV2ZW50LmRhdGE7XHJcblx0XHRpZiAodGhpcy5hY2NlcHQgJiYgdiAmJiAhbmV3IFJlZ0V4cChgWyR7dGhpcy5hY2NlcHR9XWApLnRlc3QodikpIHtcclxuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGlucCA9IHRoaXMuaW5wdXRQYXJ0cy5nZXQoaW5kZXgpIS5uYXRpdmVFbGVtZW50O1xyXG5cdFx0aWYgKHYgJiYgaW5wLnZhbHVlKSB7XHJcblx0XHRcdGlucC52YWx1ZSA9ICcnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHRfZm9jdXNQYXJ0KGVsZW1SZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pIHtcclxuXHRcdHRoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYShlbGVtUmVmLCAncHJvZ3JhbScpO1xyXG5cdH1cclxuXHJcblx0LyoqIEBpZ25vcmUgKi9cclxuXHRfY29uc3VtZUtleShldmVudDogRXZlbnQpIHtcclxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHR9XHJcblxyXG5cdC8qKiBAaWdub3JlICovXHJcblx0X2xlZnRBcnJvdyhpbmRleDogbnVtYmVyLCBldmVudDogRXZlbnQpIHtcclxuXHRcdHRoaXMuX2NvbnN1bWVLZXkoZXZlbnQpO1xyXG5cdFx0Y29uc3QgcHJldkVsZW1lbnQgPSB0aGlzLmlucHV0UGFydHMuZ2V0KGluZGV4IC0gMSk7XHJcblx0XHRpZiAocHJldkVsZW1lbnQpIHtcclxuXHRcdFx0dGhpcy5fZm9jdXNQYXJ0KHByZXZFbGVtZW50KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKiBAaWdub3JlICovXHJcblx0X3JpZ2h0QXJyb3coaW5kZXg6IG51bWJlciwgZXZlbnQ6IEV2ZW50KSB7XHJcblx0XHR0aGlzLl9jb25zdW1lS2V5KGV2ZW50KTtcclxuXHRcdGNvbnN0IG5leHRFbGVtZW50ID0gdGhpcy5pbnB1dFBhcnRzLmdldChpbmRleCArIDEpO1xyXG5cdFx0aWYgKG5leHRFbGVtZW50KSB7XHJcblx0XHRcdHRoaXMuX2ZvY3VzUGFydChuZXh0RWxlbWVudCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKiogQGlnbm9yZSAqL1xyXG5cdF9oYW5kbGVCYWNrc3BhY2UoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcblx0XHRjb25zdCBwcmV2RWxlbWVudCA9IGluZGV4ICYmIHRoaXMuaW5wdXRQYXJ0cy5nZXQoaW5kZXggLSAxKTtcclxuXHRcdGlmICghY29udHJvbC52YWx1ZSAmJiBwcmV2RWxlbWVudCkge1xyXG5cdFx0XHR0aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEocHJldkVsZW1lbnQsICdwcm9ncmFtJyk7XHJcblx0XHR9IGVsc2UgaWYgKGNvbnRyb2wudmFsdWUpIHtcclxuXHRcdFx0Y29udHJvbC5zZXRWYWx1ZSgnJyk7XHJcblx0XHRcdHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKiogQGlnbm9yZSAqL1xyXG5cdF9vblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xyXG5cdFx0bGV0IHRleHQgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0Jyk7XHJcblx0XHR0aGlzLl9yZXBsYWNlVGV4dCh0ZXh0LCBldmVudCk7XHJcblx0fVxyXG5cclxuXHQvKiogQGlnbm9yZSAqL1xyXG5cdF9zZXBhcmF0b3JSZXF1aXJlZChpbmRleDogbnVtYmVyKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fc2VwYXJhdG9yUG9zLmluY2x1ZGVzKGluZGV4ICsgMSk7XHJcblx0fVxyXG5cclxuXHQvKiogQGlnbm9yZSAqL1xyXG5cdF9wbGFjZWhvbGRlckF0KGluZGV4OiBudW1iZXIpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wbGFjZWhvbGRlciAmJiB0aGlzLl9wbGFjZWhvbGRlcltpbmRleF07XHJcblx0fVxyXG5cclxuXHQvKiogQGlnbm9yZSAqL1xyXG5cdG5nRG9DaGVjaygpIHtcclxuXHRcdGlmICh0aGlzLm5nQ29udHJvbCkge1xyXG5cdFx0XHQvLyBXZSBuZWVkIHRvIHJlLWV2YWx1YXRlIHRoaXMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSwgYmVjYXVzZSB0aGVyZSBhcmUgc29tZVxyXG5cdFx0XHQvLyBlcnJvciB0cmlnZ2VycyB0aGF0IHdlIGNhbid0IHN1YnNjcmliZSB0byAoZS5nLiBwYXJlbnQgZm9ybSBzdWJtaXNzaW9ucykuIFRoaXMgbWVhbnNcclxuXHRcdFx0Ly8gdGhhdCB3aGF0ZXZlciBsb2dpYyBpcyBpbiBoZXJlIGhhcyB0byBiZSBzdXBlciBsZWFuIG9yIHdlIHJpc2sgZGVzdHJveWluZyB0aGUgcGVyZm9ybWFuY2UuXHJcblx0XHRcdHRoaXMudXBkYXRlRXJyb3JTdGF0ZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBfcmVwbGFjZVRleHQodGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLCBldmVudDogRXZlbnQpIHtcclxuXHRcdGlmICh0ZXh0KSB7XHJcblx0XHRcdGlmICh0aGlzLmFjY2VwdCkge1xyXG5cdFx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cChgW14ke3RoaXMuYWNjZXB0fV1gLCAnZ2knKSwgJycpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMudmFsdWUgPSB0ZXh0O1xyXG5cdFx0XHR0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHR0aGlzLm9uQ29udGFpbmVyQ2xpY2soKTtcclxuXHR9XHJcbn1cclxuIiwiPGRpdlxyXG5cdHJvbGU9XCJncm91cFwiXHJcblx0Y2xhc3M9XCJidWktZGlzY3JldGUtaW5wdXQtY29udGFpbmVyXCJcclxuXHRbZm9ybUdyb3VwXT1cImdyb3VwXCJcclxuXHRbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiX2Zvcm1GaWVsZD8uZ2V0TGFiZWxJZCgpXCJcclxuPlxyXG5cdDxuZy1jb250YWluZXIgW2Zvcm1BcnJheU5hbWVdPVwiJ3BhcnRzJ1wiPlxyXG5cdFx0PG5nLXRlbXBsYXRlIG5nRm9yIFtuZ0Zvck9mXT1cInBhcnRzLmNvbnRyb2xzXCIgbGV0LXAgbGV0LWk9XCJpbmRleFwiPlxyXG5cdFx0XHQ8aW5wdXRcclxuXHRcdFx0XHRjbGFzcz1cImJ1aS1kaXNjcmV0ZS1pbnB1dC1lbGVtZW50IGJ1aS1vdXRsaW5lLXt7IF9jb2xvclN1ZmZpeCB9fVwiXHJcblx0XHRcdFx0W2Zvcm1Db250cm9sTmFtZV09XCJpXCJcclxuXHRcdFx0XHRbYXR0ci5hcmlhLWxhYmVsXT1cIidjaGFyYWN0ZXIgJyArIChpICsgMSlcIlxyXG5cdFx0XHRcdChpbnB1dCk9XCJfaGFuZGxlSW5wdXQocCwgaSwgJGV2ZW50KVwiXHJcblx0XHRcdFx0KGJlZm9yZWlucHV0KT1cIl9oYW5kbGVCZWZvcmVJbnB1dChpLCAkZXZlbnQpXCJcclxuXHRcdFx0XHQoa2V5ZG93bi5iYWNrc3BhY2UpPVwiX2hhbmRsZUJhY2tzcGFjZShwLCBpKVwiXHJcblx0XHRcdFx0KGtleWRvd24uYXJyb3d1cCk9XCJfY29uc3VtZUtleSgkZXZlbnQpXCJcclxuXHRcdFx0XHQoa2V5ZG93bi5hcnJvd2Rvd24pPVwiX2NvbnN1bWVLZXkoJGV2ZW50KVwiXHJcblx0XHRcdFx0KGtleWRvd24uYXJyb3dsZWZ0KT1cIl9sZWZ0QXJyb3coaSwgJGV2ZW50KVwiXHJcblx0XHRcdFx0KGtleWRvd24uYXJyb3dyaWdodCk9XCJfcmlnaHRBcnJvdyhpLCAkZXZlbnQpXCJcclxuXHRcdFx0XHRbYXR0ci5wbGFjZWhvbGRlcl09XCJfcGxhY2Vob2xkZXJBdChpKVwiXHJcblx0XHRcdFx0I3BhcnRcclxuXHRcdFx0XHQoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuXHRcdFx0XHQocGFzdGUpPVwiX29uUGFzdGUoJGV2ZW50KVwiXHJcblx0XHRcdFx0W3R5cGVdPVwiWyd0ZXh0JywgJ251bWJlcicsICdwYXNzd29yZCddLmluY2x1ZGVzKHR5cGUpID8gdHlwZSA6ICd0ZXh0J1wiXHJcblx0XHRcdFx0W2F0dHIuaW5wdXRtb2RlXT1cInR5cGUgPT09ICdudW1iZXInID8gJ2RlY2ltYWwnIDogdW5kZWZpbmVkXCJcclxuXHRcdFx0XHRhdXRvY2FwaXRhbGl6ZT1cIm5vbmVcIlxyXG5cdFx0XHQvPlxyXG5cdFx0XHQ8c3BhbiAqbmdJZj1cIl9zZXBhcmF0b3JSZXF1aXJlZChpKVwiIGNsYXNzPVwiYnVpLWRpc2NyZXRlLWlucHV0LXNwYWNlclwiPnt7IHNlcGFyYXRvciB9fTwvc3Bhbj5cclxuXHRcdDwvbmctdGVtcGxhdGU+XHJcblx0PC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { DiscreteInputComponent } from './discrete-input.component';
4
+ import { MatFormFieldModule } from '@angular/material/form-field';
5
+ import { ReactiveFormsModule } from '@angular/forms';
6
+ import { A11yModule } from '@angular/cdk/a11y';
7
+ import * as i0 from "@angular/core";
8
+ export class DiscreteInputModule {
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: DiscreteInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.2", ngImport: i0, type: DiscreteInputModule, declarations: [DiscreteInputComponent], imports: [CommonModule, MatFormFieldModule, ReactiveFormsModule, A11yModule], exports: [DiscreteInputComponent] }); }
11
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: DiscreteInputModule, imports: [CommonModule, MatFormFieldModule, ReactiveFormsModule, A11yModule] }); }
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: DiscreteInputModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ declarations: [DiscreteInputComponent],
17
+ imports: [CommonModule, MatFormFieldModule, ReactiveFormsModule, A11yModule],
18
+ exports: [DiscreteInputComponent]
19
+ }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY3JldGUtaW5wdXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvZGlzY3JldGUtaW5wdXQvZGlzY3JldGUtaW5wdXQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFPL0MsTUFBTSxPQUFPLG1CQUFtQjs4R0FBbkIsbUJBQW1COytHQUFuQixtQkFBbUIsaUJBSmhCLHNCQUFzQixhQUMzQixZQUFZLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxhQUNqRSxzQkFBc0I7K0dBRXBCLG1CQUFtQixZQUhyQixZQUFZLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsVUFBVTs7MkZBRy9ELG1CQUFtQjtrQkFML0IsUUFBUTttQkFBQztvQkFDVCxZQUFZLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDdEMsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLFVBQVUsQ0FBQztvQkFDNUUsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ2pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRGlzY3JldGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vZGlzY3JldGUtaW5wdXQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG5cdGRlY2xhcmF0aW9uczogW0Rpc2NyZXRlSW5wdXRDb21wb25lbnRdLFxyXG5cdGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQTExeU1vZHVsZV0sXHJcblx0ZXhwb3J0czogW0Rpc2NyZXRlSW5wdXRDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEaXNjcmV0ZUlucHV0TW9kdWxlIHt9XHJcbiJdfQ==
@@ -1,3 +1,3 @@
1
1
  export { DiscreteInputModule } from './discrete-input.module';
2
2
  export { DiscreteInputComponent } from './discrete-input.component';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL2Rpc2NyZXRlLWlucHV0L3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBEaXNjcmV0ZUlucHV0TW9kdWxlIH0gZnJvbSAnLi9kaXNjcmV0ZS1pbnB1dC5tb2R1bGUnO1xuZXhwb3J0IHsgRGlzY3JldGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vZGlzY3JldGUtaW5wdXQuY29tcG9uZW50JztcbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL2Rpc2NyZXRlLWlucHV0L3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBEaXNjcmV0ZUlucHV0TW9kdWxlIH0gZnJvbSAnLi9kaXNjcmV0ZS1pbnB1dC5tb2R1bGUnO1xyXG5leHBvcnQgeyBEaXNjcmV0ZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9kaXNjcmV0ZS1pbnB1dC5jb21wb25lbnQnO1xyXG4iXX0=