@angular/material 19.0.0-next.1 → 19.0.0-next.3

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 (642) hide show
  1. package/_index.scss +3 -4
  2. package/button/_button-base.scss +2 -2
  3. package/button/index.d.ts +2 -10
  4. package/checkbox/_checkbox-common.scss +4 -4
  5. package/checkbox/index.d.ts +0 -7
  6. package/chips/index.d.ts +1 -10
  7. package/core/_core.scss +1 -7
  8. package/core/focus-indicators/_private.scss +21 -82
  9. package/core/index.d.ts +10 -167
  10. package/core/ripple/_ripple.scss +1 -1
  11. package/core/style/_elevation.scss +1 -1
  12. package/core/style/_menu-common.scss +1 -1
  13. package/core/style/_sass-utils.scss +4 -0
  14. package/core/theming/_palettes.scss +132 -45
  15. package/core/tokens/_m3-system.scss +93 -20
  16. package/core/tokens/m3/definitions/_md-sys-color.scss +6 -6
  17. package/core/tokens/m3/mat/_sidenav.scss +0 -1
  18. package/fesm2022/autocomplete.mjs +14 -14
  19. package/fesm2022/autocomplete.mjs.map +1 -1
  20. package/fesm2022/badge.mjs +11 -11
  21. package/fesm2022/badge.mjs.map +1 -1
  22. package/fesm2022/bottom-sheet.mjs +11 -11
  23. package/fesm2022/bottom-sheet.mjs.map +1 -1
  24. package/fesm2022/button-toggle.mjs +11 -11
  25. package/fesm2022/button-toggle.mjs.map +1 -1
  26. package/fesm2022/button.mjs +42 -53
  27. package/fesm2022/button.mjs.map +1 -1
  28. package/fesm2022/card.mjs +46 -46
  29. package/fesm2022/checkbox.mjs +16 -19
  30. package/fesm2022/checkbox.mjs.map +1 -1
  31. package/fesm2022/chips.mjs +46 -57
  32. package/fesm2022/chips.mjs.map +1 -1
  33. package/fesm2022/core.mjs +122 -256
  34. package/fesm2022/core.mjs.map +1 -1
  35. package/fesm2022/datepicker.mjs +87 -87
  36. package/fesm2022/datepicker.mjs.map +1 -1
  37. package/fesm2022/dialog.mjs +26 -26
  38. package/fesm2022/dialog.mjs.map +1 -1
  39. package/fesm2022/divider.mjs +7 -7
  40. package/fesm2022/expansion.mjs +28 -28
  41. package/fesm2022/expansion.mjs.map +1 -1
  42. package/fesm2022/form-field.mjs +36 -36
  43. package/fesm2022/form-field.mjs.map +1 -1
  44. package/fesm2022/grid-list.mjs +22 -22
  45. package/fesm2022/icon/testing.mjs +7 -7
  46. package/fesm2022/icon.mjs +10 -10
  47. package/fesm2022/input.mjs +7 -7
  48. package/fesm2022/list.mjs +59 -59
  49. package/fesm2022/list.mjs.map +1 -1
  50. package/fesm2022/menu.mjs +18 -18
  51. package/fesm2022/menu.mjs.map +1 -1
  52. package/fesm2022/paginator.mjs +11 -11
  53. package/fesm2022/paginator.mjs.map +1 -1
  54. package/fesm2022/progress-bar.mjs +8 -8
  55. package/fesm2022/progress-bar.mjs.map +1 -1
  56. package/fesm2022/progress-spinner.mjs +8 -8
  57. package/fesm2022/progress-spinner.mjs.map +1 -1
  58. package/fesm2022/radio.mjs +11 -11
  59. package/fesm2022/radio.mjs.map +1 -1
  60. package/fesm2022/select.mjs +12 -12
  61. package/fesm2022/select.mjs.map +1 -1
  62. package/fesm2022/sidenav.mjs +26 -26
  63. package/fesm2022/sidenav.mjs.map +1 -1
  64. package/fesm2022/slide-toggle.mjs +16 -16
  65. package/fesm2022/slide-toggle.mjs.map +1 -1
  66. package/fesm2022/slider.mjs +18 -18
  67. package/fesm2022/slider.mjs.map +1 -1
  68. package/fesm2022/snack-bar.mjs +23 -23
  69. package/fesm2022/snack-bar.mjs.map +1 -1
  70. package/fesm2022/sort.mjs +14 -14
  71. package/fesm2022/sort.mjs.map +1 -1
  72. package/fesm2022/stepper.mjs +33 -33
  73. package/fesm2022/stepper.mjs.map +1 -1
  74. package/fesm2022/table.mjs +57 -57
  75. package/fesm2022/table.mjs.map +1 -1
  76. package/fesm2022/tabs.mjs +48 -48
  77. package/fesm2022/tabs.mjs.map +1 -1
  78. package/fesm2022/toolbar.mjs +11 -11
  79. package/fesm2022/toolbar.mjs.map +1 -1
  80. package/fesm2022/tooltip.mjs +26 -17
  81. package/fesm2022/tooltip.mjs.map +1 -1
  82. package/fesm2022/tree.mjs +25 -25
  83. package/form-field/_form-field-high-contrast.scss +4 -4
  84. package/form-field/_mdc-text-field-structure.scss +2 -2
  85. package/list/_list-inherited-structure.scss +1 -1
  86. package/list/_list-item-hcm-indicator.scss +1 -1
  87. package/package.json +2 -146
  88. package/prebuilt-themes/azure-blue.css +1 -1
  89. package/prebuilt-themes/cyan-orange.css +1 -1
  90. package/prebuilt-themes/deeppurple-amber.css +1 -1
  91. package/prebuilt-themes/indigo-pink.css +1 -1
  92. package/prebuilt-themes/magenta-violet.css +1 -1
  93. package/prebuilt-themes/pink-bluegrey.css +1 -1
  94. package/prebuilt-themes/purple-green.css +1 -1
  95. package/prebuilt-themes/rose-red.css +1 -1
  96. package/schematics/ng-add/index.js +1 -1
  97. package/schematics/ng-add/index.mjs +1 -1
  98. package/schematics/ng-generate/m3-theme/index_bundled.js +2 -2
  99. package/schematics/ng-update/index_bundled.js +27 -27
  100. package/tabs/_tabs-common.scss +2 -2
  101. package/tree/index.d.ts +2 -2
  102. package/core/focus-indicators/_focus-indicators-theme.scss +0 -11
  103. package/core/focus-indicators/_focus-indicators.scss +0 -6
  104. package/esm2022/autocomplete/animations.mjs +0 -24
  105. package/esm2022/autocomplete/autocomplete-origin.mjs +0 -31
  106. package/esm2022/autocomplete/autocomplete-trigger.mjs +0 -902
  107. package/esm2022/autocomplete/autocomplete.mjs +0 -238
  108. package/esm2022/autocomplete/autocomplete_public_index.mjs +0 -5
  109. package/esm2022/autocomplete/index.mjs +0 -9
  110. package/esm2022/autocomplete/module.mjs +0 -61
  111. package/esm2022/autocomplete/public-api.mjs +0 -14
  112. package/esm2022/autocomplete/testing/autocomplete-harness-filters.mjs +0 -9
  113. package/esm2022/autocomplete/testing/autocomplete-harness.mjs +0 -105
  114. package/esm2022/autocomplete/testing/index.mjs +0 -9
  115. package/esm2022/autocomplete/testing/public-api.mjs +0 -10
  116. package/esm2022/badge/badge-module.mjs +0 -27
  117. package/esm2022/badge/badge.mjs +0 -288
  118. package/esm2022/badge/badge_public_index.mjs +0 -5
  119. package/esm2022/badge/index.mjs +0 -9
  120. package/esm2022/badge/public-api.mjs +0 -10
  121. package/esm2022/badge/testing/badge-harness-filters.mjs +0 -9
  122. package/esm2022/badge/testing/badge-harness.mjs +0 -71
  123. package/esm2022/badge/testing/index.mjs +0 -9
  124. package/esm2022/badge/testing/public-api.mjs +0 -10
  125. package/esm2022/bottom-sheet/bottom-sheet-animations.mjs +0 -26
  126. package/esm2022/bottom-sheet/bottom-sheet-config.mjs +0 -48
  127. package/esm2022/bottom-sheet/bottom-sheet-container.mjs +0 -85
  128. package/esm2022/bottom-sheet/bottom-sheet-module.mjs +0 -28
  129. package/esm2022/bottom-sheet/bottom-sheet-ref.mjs +0 -104
  130. package/esm2022/bottom-sheet/bottom-sheet.mjs +0 -115
  131. package/esm2022/bottom-sheet/bottom-sheet_public_index.mjs +0 -5
  132. package/esm2022/bottom-sheet/index.mjs +0 -9
  133. package/esm2022/bottom-sheet/public-api.mjs +0 -14
  134. package/esm2022/bottom-sheet/testing/bottom-sheet-harness-filters.mjs +0 -9
  135. package/esm2022/bottom-sheet/testing/bottom-sheet-harness.mjs +0 -35
  136. package/esm2022/bottom-sheet/testing/index.mjs +0 -9
  137. package/esm2022/bottom-sheet/testing/public-api.mjs +0 -10
  138. package/esm2022/button/button-base.mjs +0 -230
  139. package/esm2022/button/button.mjs +0 -67
  140. package/esm2022/button/button_public_index.mjs +0 -5
  141. package/esm2022/button/fab.mjs +0 -166
  142. package/esm2022/button/icon-button.mjs +0 -56
  143. package/esm2022/button/index.mjs +0 -9
  144. package/esm2022/button/module.mjs +0 -65
  145. package/esm2022/button/public-api.mjs +0 -13
  146. package/esm2022/button/testing/button-harness-filters.mjs +0 -9
  147. package/esm2022/button/testing/button-harness.mjs +0 -80
  148. package/esm2022/button/testing/index.mjs +0 -9
  149. package/esm2022/button/testing/public-api.mjs +0 -10
  150. package/esm2022/button-toggle/button-toggle-module.mjs +0 -24
  151. package/esm2022/button-toggle/button-toggle.mjs +0 -651
  152. package/esm2022/button-toggle/button-toggle_public_index.mjs +0 -5
  153. package/esm2022/button-toggle/index.mjs +0 -9
  154. package/esm2022/button-toggle/public-api.mjs +0 -10
  155. package/esm2022/button-toggle/testing/button-toggle-group-harness-filters.mjs +0 -9
  156. package/esm2022/button-toggle/testing/button-toggle-group-harness.mjs +0 -47
  157. package/esm2022/button-toggle/testing/button-toggle-harness-filters.mjs +0 -9
  158. package/esm2022/button-toggle/testing/button-toggle-harness.mjs +0 -105
  159. package/esm2022/button-toggle/testing/index.mjs +0 -9
  160. package/esm2022/button-toggle/testing/public-api.mjs +0 -12
  161. package/esm2022/card/card.mjs +0 -273
  162. package/esm2022/card/card_public_index.mjs +0 -5
  163. package/esm2022/card/index.mjs +0 -9
  164. package/esm2022/card/module.mjs +0 -67
  165. package/esm2022/card/public-api.mjs +0 -10
  166. package/esm2022/card/testing/card-harness-filters.mjs +0 -9
  167. package/esm2022/card/testing/card-harness.mjs +0 -50
  168. package/esm2022/card/testing/index.mjs +0 -9
  169. package/esm2022/card/testing/public-api.mjs +0 -10
  170. package/esm2022/checkbox/checkbox-config.mjs +0 -22
  171. package/esm2022/checkbox/checkbox-required-validator.mjs +0 -41
  172. package/esm2022/checkbox/checkbox.mjs +0 -443
  173. package/esm2022/checkbox/checkbox_public_index.mjs +0 -5
  174. package/esm2022/checkbox/index.mjs +0 -9
  175. package/esm2022/checkbox/module.mjs +0 -41
  176. package/esm2022/checkbox/public-api.mjs +0 -12
  177. package/esm2022/checkbox/testing/checkbox-harness-filters.mjs +0 -9
  178. package/esm2022/checkbox/testing/checkbox-harness.mjs +0 -138
  179. package/esm2022/checkbox/testing/index.mjs +0 -9
  180. package/esm2022/checkbox/testing/public-api.mjs +0 -9
  181. package/esm2022/chips/chip-action.mjs +0 -113
  182. package/esm2022/chips/chip-edit-input.mjs +0 -61
  183. package/esm2022/chips/chip-grid.mjs +0 -420
  184. package/esm2022/chips/chip-icons.mjs +0 -107
  185. package/esm2022/chips/chip-input.mjs +0 -192
  186. package/esm2022/chips/chip-listbox.mjs +0 -369
  187. package/esm2022/chips/chip-option.mjs +0 -190
  188. package/esm2022/chips/chip-row.mjs +0 -173
  189. package/esm2022/chips/chip-set.mjs +0 -283
  190. package/esm2022/chips/chip-text-control.mjs +0 -9
  191. package/esm2022/chips/chip.mjs +0 -322
  192. package/esm2022/chips/chips_public_index.mjs +0 -5
  193. package/esm2022/chips/index.mjs +0 -9
  194. package/esm2022/chips/module.mjs +0 -85
  195. package/esm2022/chips/public-api.mjs +0 -20
  196. package/esm2022/chips/testing/chip-avatar-harness.mjs +0 -22
  197. package/esm2022/chips/testing/chip-edit-input-harness.mjs +0 -33
  198. package/esm2022/chips/testing/chip-grid-harness.mjs +0 -45
  199. package/esm2022/chips/testing/chip-harness-filters.mjs +0 -9
  200. package/esm2022/chips/testing/chip-harness.mjs +0 -62
  201. package/esm2022/chips/testing/chip-input-harness.mjs +0 -85
  202. package/esm2022/chips/testing/chip-listbox-harness.mjs +0 -61
  203. package/esm2022/chips/testing/chip-option-harness.mjs +0 -45
  204. package/esm2022/chips/testing/chip-remove-harness.mjs +0 -26
  205. package/esm2022/chips/testing/chip-row-harness.mjs +0 -40
  206. package/esm2022/chips/testing/chip-set-harness.mjs +0 -26
  207. package/esm2022/chips/testing/index.mjs +0 -9
  208. package/esm2022/chips/testing/public-api.mjs +0 -19
  209. package/esm2022/chips/tokens.mjs +0 -39
  210. package/esm2022/core/animation/animation.mjs +0 -21
  211. package/esm2022/core/common-behaviors/color.mjs +0 -33
  212. package/esm2022/core/common-behaviors/common-module.mjs +0 -127
  213. package/esm2022/core/common-behaviors/constructor.mjs +0 -9
  214. package/esm2022/core/common-behaviors/disable-ripple.mjs +0 -24
  215. package/esm2022/core/common-behaviors/disabled.mjs +0 -23
  216. package/esm2022/core/common-behaviors/error-state.mjs +0 -66
  217. package/esm2022/core/common-behaviors/index.mjs +0 -15
  218. package/esm2022/core/common-behaviors/initialized.mjs +0 -62
  219. package/esm2022/core/common-behaviors/tabindex.mjs +0 -25
  220. package/esm2022/core/core_public_index.mjs +0 -5
  221. package/esm2022/core/datetime/date-adapter.mjs +0 -109
  222. package/esm2022/core/datetime/date-formats.mjs +0 -10
  223. package/esm2022/core/datetime/index.mjs +0 -46
  224. package/esm2022/core/datetime/native-date-adapter.mjs +0 -221
  225. package/esm2022/core/datetime/native-date-formats.mjs +0 -19
  226. package/esm2022/core/error/error-options.mjs +0 -33
  227. package/esm2022/core/index.mjs +0 -9
  228. package/esm2022/core/internal-form-field/internal-form-field.mjs +0 -29
  229. package/esm2022/core/line/line.mjs +0 -64
  230. package/esm2022/core/option/index.mjs +0 -30
  231. package/esm2022/core/option/optgroup.mjs +0 -71
  232. package/esm2022/core/option/option-parent.mjs +0 -13
  233. package/esm2022/core/option/option.mjs +0 -283
  234. package/esm2022/core/private/index.mjs +0 -9
  235. package/esm2022/core/private/ripple-loader.mjs +0 -160
  236. package/esm2022/core/public-api.mjs +0 -19
  237. package/esm2022/core/ripple/index.mjs +0 -27
  238. package/esm2022/core/ripple/ripple-event-manager.mjs +0 -69
  239. package/esm2022/core/ripple/ripple-ref.mjs +0 -39
  240. package/esm2022/core/ripple/ripple-renderer.mjs +0 -354
  241. package/esm2022/core/ripple/ripple.mjs +0 -156
  242. package/esm2022/core/selection/index.mjs +0 -10
  243. package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox-module.mjs +0 -24
  244. package/esm2022/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +0 -62
  245. package/esm2022/core/testing/index.mjs +0 -9
  246. package/esm2022/core/testing/optgroup-harness-filters.mjs +0 -9
  247. package/esm2022/core/testing/optgroup-harness.mjs +0 -43
  248. package/esm2022/core/testing/option-harness-filters.mjs +0 -9
  249. package/esm2022/core/testing/option-harness.mjs +0 -53
  250. package/esm2022/core/testing/public-api.mjs +0 -12
  251. package/esm2022/core/version.mjs +0 -11
  252. package/esm2022/datepicker/aria-accessible-name.mjs +0 -159
  253. package/esm2022/datepicker/calendar-body.mjs +0 -509
  254. package/esm2022/datepicker/calendar.mjs +0 -426
  255. package/esm2022/datepicker/date-range-input-parts.mjs +0 -372
  256. package/esm2022/datepicker/date-range-input.mjs +0 -369
  257. package/esm2022/datepicker/date-range-picker.mjs +0 -51
  258. package/esm2022/datepicker/date-range-selection-strategy.mjs +0 -97
  259. package/esm2022/datepicker/date-selection-model.mjs +0 -188
  260. package/esm2022/datepicker/datepicker-actions.mjs +0 -91
  261. package/esm2022/datepicker/datepicker-animations.mjs +0 -35
  262. package/esm2022/datepicker/datepicker-base.mjs +0 -609
  263. package/esm2022/datepicker/datepicker-errors.mjs +0 -14
  264. package/esm2022/datepicker/datepicker-input-base.mjs +0 -311
  265. package/esm2022/datepicker/datepicker-input.mjs +0 -200
  266. package/esm2022/datepicker/datepicker-intl.mjs +0 -69
  267. package/esm2022/datepicker/datepicker-module.mjs +0 -138
  268. package/esm2022/datepicker/datepicker-toggle.mjs +0 -113
  269. package/esm2022/datepicker/datepicker.mjs +0 -38
  270. package/esm2022/datepicker/datepicker_public_index.mjs +0 -5
  271. package/esm2022/datepicker/index.mjs +0 -9
  272. package/esm2022/datepicker/month-view.mjs +0 -460
  273. package/esm2022/datepicker/multi-year-view.mjs +0 -330
  274. package/esm2022/datepicker/public-api.mjs +0 -27
  275. package/esm2022/datepicker/testing/calendar-cell-harness.mjs +0 -138
  276. package/esm2022/datepicker/testing/calendar-harness.mjs +0 -83
  277. package/esm2022/datepicker/testing/date-range-input-harness.mjs +0 -98
  278. package/esm2022/datepicker/testing/datepicker-harness-filters.mjs +0 -9
  279. package/esm2022/datepicker/testing/datepicker-input-harness-base.mjs +0 -81
  280. package/esm2022/datepicker/testing/datepicker-input-harness.mjs +0 -58
  281. package/esm2022/datepicker/testing/datepicker-toggle-harness.mjs +0 -41
  282. package/esm2022/datepicker/testing/datepicker-trigger-harness-base.mjs +0 -65
  283. package/esm2022/datepicker/testing/index.mjs +0 -9
  284. package/esm2022/datepicker/testing/public-api.mjs +0 -14
  285. package/esm2022/datepicker/year-view.mjs +0 -324
  286. package/esm2022/dialog/dialog-animations.mjs +0 -38
  287. package/esm2022/dialog/dialog-config.mjs +0 -59
  288. package/esm2022/dialog/dialog-container.mjs +0 -253
  289. package/esm2022/dialog/dialog-content-directives.mjs +0 -212
  290. package/esm2022/dialog/dialog-ref.mjs +0 -177
  291. package/esm2022/dialog/dialog.mjs +0 -212
  292. package/esm2022/dialog/dialog_public_index.mjs +0 -5
  293. package/esm2022/dialog/index.mjs +0 -9
  294. package/esm2022/dialog/module.mjs +0 -45
  295. package/esm2022/dialog/public-api.mjs +0 -15
  296. package/esm2022/dialog/testing/dialog-harness-filters.mjs +0 -9
  297. package/esm2022/dialog/testing/dialog-harness.mjs +0 -84
  298. package/esm2022/dialog/testing/dialog-opener.mjs +0 -58
  299. package/esm2022/dialog/testing/index.mjs +0 -10
  300. package/esm2022/dialog/testing/public-api.mjs +0 -10
  301. package/esm2022/divider/divider-module.mjs +0 -24
  302. package/esm2022/divider/divider.mjs +0 -48
  303. package/esm2022/divider/divider_public_index.mjs +0 -5
  304. package/esm2022/divider/index.mjs +0 -9
  305. package/esm2022/divider/public-api.mjs +0 -10
  306. package/esm2022/divider/testing/divider-harness-filters.mjs +0 -9
  307. package/esm2022/divider/testing/divider-harness.mjs +0 -22
  308. package/esm2022/divider/testing/index.mjs +0 -9
  309. package/esm2022/divider/testing/public-api.mjs +0 -10
  310. package/esm2022/expansion/accordion-base.mjs +0 -14
  311. package/esm2022/expansion/accordion.mjs +0 -96
  312. package/esm2022/expansion/expansion-animations.mjs +0 -51
  313. package/esm2022/expansion/expansion-module.mjs +0 -65
  314. package/esm2022/expansion/expansion-panel-base.mjs +0 -14
  315. package/esm2022/expansion/expansion-panel-content.mjs +0 -35
  316. package/esm2022/expansion/expansion-panel-header.mjs +0 -218
  317. package/esm2022/expansion/expansion-panel.mjs +0 -211
  318. package/esm2022/expansion/expansion_public_index.mjs +0 -5
  319. package/esm2022/expansion/index.mjs +0 -9
  320. package/esm2022/expansion/public-api.mjs +0 -16
  321. package/esm2022/expansion/testing/accordion-harness.mjs +0 -31
  322. package/esm2022/expansion/testing/expansion-harness-filters.mjs +0 -9
  323. package/esm2022/expansion/testing/expansion-harness.mjs +0 -128
  324. package/esm2022/expansion/testing/index.mjs +0 -9
  325. package/esm2022/expansion/testing/public-api.mjs +0 -11
  326. package/esm2022/form-field/directives/error.mjs +0 -48
  327. package/esm2022/form-field/directives/floating-label.mjs +0 -135
  328. package/esm2022/form-field/directives/hint.mjs +0 -40
  329. package/esm2022/form-field/directives/label.mjs +0 -22
  330. package/esm2022/form-field/directives/line-ripple.mjs +0 -60
  331. package/esm2022/form-field/directives/notched-outline.mjs +0 -66
  332. package/esm2022/form-field/directives/prefix.mjs +0 -38
  333. package/esm2022/form-field/directives/suffix.mjs +0 -38
  334. package/esm2022/form-field/form-field-animations.mjs +0 -24
  335. package/esm2022/form-field/form-field-control.mjs +0 -11
  336. package/esm2022/form-field/form-field-errors.mjs +0 -20
  337. package/esm2022/form-field/form-field.mjs +0 -620
  338. package/esm2022/form-field/form-field_public_index.mjs +0 -5
  339. package/esm2022/form-field/index.mjs +0 -9
  340. package/esm2022/form-field/module.mjs +0 -51
  341. package/esm2022/form-field/public-api.mjs +0 -18
  342. package/esm2022/form-field/testing/control/form-field-control-harness.mjs +0 -15
  343. package/esm2022/form-field/testing/control/index.mjs +0 -9
  344. package/esm2022/form-field/testing/error-harness.mjs +0 -29
  345. package/esm2022/form-field/testing/form-field-harness-filters.mjs +0 -9
  346. package/esm2022/form-field/testing/form-field-harness.mjs +0 -179
  347. package/esm2022/form-field/testing/index.mjs +0 -9
  348. package/esm2022/form-field/testing/public-api.mjs +0 -15
  349. package/esm2022/grid-list/grid-list-base.mjs +0 -14
  350. package/esm2022/grid-list/grid-list-module.mjs +0 -59
  351. package/esm2022/grid-list/grid-list.mjs +0 -146
  352. package/esm2022/grid-list/grid-list_public_index.mjs +0 -5
  353. package/esm2022/grid-list/grid-tile.mjs +0 -128
  354. package/esm2022/grid-list/index.mjs +0 -9
  355. package/esm2022/grid-list/public-api.mjs +0 -14
  356. package/esm2022/grid-list/testing/grid-list-harness-filters.mjs +0 -9
  357. package/esm2022/grid-list/testing/grid-list-harness.mjs +0 -76
  358. package/esm2022/grid-list/testing/grid-tile-harness.mjs +0 -71
  359. package/esm2022/grid-list/testing/index.mjs +0 -9
  360. package/esm2022/grid-list/testing/public-api.mjs +0 -11
  361. package/esm2022/grid-list/tile-coordinator.mjs +0 -145
  362. package/esm2022/grid-list/tile-styler.mjs +0 -231
  363. package/esm2022/icon/fake-svgs.mjs +0 -62
  364. package/esm2022/icon/icon-module.mjs +0 -24
  365. package/esm2022/icon/icon-registry.mjs +0 -592
  366. package/esm2022/icon/icon.mjs +0 -379
  367. package/esm2022/icon/icon_public_index.mjs +0 -5
  368. package/esm2022/icon/index.mjs +0 -9
  369. package/esm2022/icon/public-api.mjs +0 -11
  370. package/esm2022/icon/testing/fake-icon-registry.mjs +0 -92
  371. package/esm2022/icon/testing/icon-harness-filters.mjs +0 -14
  372. package/esm2022/icon/testing/icon-harness.mjs +0 -60
  373. package/esm2022/icon/testing/index.mjs +0 -9
  374. package/esm2022/icon/testing/public-api.mjs +0 -11
  375. package/esm2022/icon/testing/testing_public_index.mjs +0 -5
  376. package/esm2022/icon/trusted-types.mjs +0 -43
  377. package/esm2022/index.mjs +0 -14
  378. package/esm2022/input/index.mjs +0 -9
  379. package/esm2022/input/input-errors.mjs +0 -12
  380. package/esm2022/input/input-value-accessor.mjs +0 -16
  381. package/esm2022/input/input.mjs +0 -524
  382. package/esm2022/input/input_public_index.mjs +0 -5
  383. package/esm2022/input/module.mjs +0 -26
  384. package/esm2022/input/public-api.mjs +0 -14
  385. package/esm2022/input/testing/index.mjs +0 -9
  386. package/esm2022/input/testing/input-harness-filters.mjs +0 -9
  387. package/esm2022/input/testing/input-harness.mjs +0 -119
  388. package/esm2022/input/testing/native-option-harness.mjs +0 -42
  389. package/esm2022/input/testing/native-select-harness-filters.mjs +0 -9
  390. package/esm2022/input/testing/native-select-harness.mjs +0 -79
  391. package/esm2022/input/testing/public-api.mjs +0 -13
  392. package/esm2022/list/action-list.mjs +0 -31
  393. package/esm2022/list/index.mjs +0 -9
  394. package/esm2022/list/list-base.mjs +0 -284
  395. package/esm2022/list/list-item-sections.mjs +0 -144
  396. package/esm2022/list/list-module.mjs +0 -97
  397. package/esm2022/list/list-option-types.mjs +0 -16
  398. package/esm2022/list/list-option.mjs +0 -295
  399. package/esm2022/list/list.mjs +0 -103
  400. package/esm2022/list/list_public_index.mjs +0 -5
  401. package/esm2022/list/nav-list.mjs +0 -37
  402. package/esm2022/list/public-api.mjs +0 -18
  403. package/esm2022/list/selection-list.mjs +0 -391
  404. package/esm2022/list/subheader.mjs +0 -28
  405. package/esm2022/list/testing/action-list-harness.mjs +0 -59
  406. package/esm2022/list/testing/index.mjs +0 -9
  407. package/esm2022/list/testing/list-harness-base.mjs +0 -95
  408. package/esm2022/list/testing/list-harness-filters.mjs +0 -9
  409. package/esm2022/list/testing/list-harness.mjs +0 -41
  410. package/esm2022/list/testing/list-item-harness-base.mjs +0 -162
  411. package/esm2022/list/testing/nav-list-harness.mjs +0 -69
  412. package/esm2022/list/testing/public-api.mjs +0 -14
  413. package/esm2022/list/testing/selection-list-harness.mjs +0 -122
  414. package/esm2022/list/tokens.mjs +0 -11
  415. package/esm2022/menu/index.mjs +0 -9
  416. package/esm2022/menu/menu-animations.mjs +0 -61
  417. package/esm2022/menu/menu-content.mjs +0 -87
  418. package/esm2022/menu/menu-errors.mjs +0 -35
  419. package/esm2022/menu/menu-item.mjs +0 -148
  420. package/esm2022/menu/menu-panel.mjs +0 -14
  421. package/esm2022/menu/menu-positions.mjs +0 -9
  422. package/esm2022/menu/menu-trigger.mjs +0 -542
  423. package/esm2022/menu/menu.mjs +0 -405
  424. package/esm2022/menu/menu_public_index.mjs +0 -5
  425. package/esm2022/menu/module.mjs +0 -63
  426. package/esm2022/menu/public-api.mjs +0 -16
  427. package/esm2022/menu/testing/index.mjs +0 -9
  428. package/esm2022/menu/testing/menu-harness-filters.mjs +0 -9
  429. package/esm2022/menu/testing/menu-harness.mjs +0 -166
  430. package/esm2022/menu/testing/public-api.mjs +0 -10
  431. package/esm2022/paginator/index.mjs +0 -9
  432. package/esm2022/paginator/module.mjs +0 -28
  433. package/esm2022/paginator/paginator-intl.mjs +0 -62
  434. package/esm2022/paginator/paginator.mjs +0 -266
  435. package/esm2022/paginator/paginator_public_index.mjs +0 -5
  436. package/esm2022/paginator/public-api.mjs +0 -11
  437. package/esm2022/paginator/testing/index.mjs +0 -9
  438. package/esm2022/paginator/testing/paginator-harness-filters.mjs +0 -9
  439. package/esm2022/paginator/testing/paginator-harness.mjs +0 -98
  440. package/esm2022/paginator/testing/public-api.mjs +0 -10
  441. package/esm2022/progress-bar/index.mjs +0 -9
  442. package/esm2022/progress-bar/module.mjs +0 -24
  443. package/esm2022/progress-bar/progress-bar.mjs +0 -181
  444. package/esm2022/progress-bar/progress-bar_public_index.mjs +0 -5
  445. package/esm2022/progress-bar/public-api.mjs +0 -10
  446. package/esm2022/progress-bar/testing/index.mjs +0 -9
  447. package/esm2022/progress-bar/testing/progress-bar-harness-filters.mjs +0 -9
  448. package/esm2022/progress-bar/testing/progress-bar-harness.mjs +0 -33
  449. package/esm2022/progress-bar/testing/public-api.mjs +0 -10
  450. package/esm2022/progress-bar/testing/testing_public_index.mjs +0 -5
  451. package/esm2022/progress-spinner/index.mjs +0 -9
  452. package/esm2022/progress-spinner/module.mjs +0 -25
  453. package/esm2022/progress-spinner/progress-spinner.mjs +0 -166
  454. package/esm2022/progress-spinner/progress-spinner_public_index.mjs +0 -5
  455. package/esm2022/progress-spinner/public-api.mjs +0 -10
  456. package/esm2022/progress-spinner/testing/index.mjs +0 -9
  457. package/esm2022/progress-spinner/testing/progress-spinner-harness-filters.mjs +0 -9
  458. package/esm2022/progress-spinner/testing/progress-spinner-harness.mjs +0 -35
  459. package/esm2022/progress-spinner/testing/public-api.mjs +0 -10
  460. package/esm2022/progress-spinner/testing/testing_public_index.mjs +0 -5
  461. package/esm2022/radio/index.mjs +0 -9
  462. package/esm2022/radio/module.mjs +0 -25
  463. package/esm2022/radio/public-api.mjs +0 -10
  464. package/esm2022/radio/radio.mjs +0 -680
  465. package/esm2022/radio/radio_public_index.mjs +0 -5
  466. package/esm2022/radio/testing/index.mjs +0 -9
  467. package/esm2022/radio/testing/public-api.mjs +0 -10
  468. package/esm2022/radio/testing/radio-harness-filters.mjs +0 -9
  469. package/esm2022/radio/testing/radio-harness.mjs +0 -228
  470. package/esm2022/select/index.mjs +0 -9
  471. package/esm2022/select/module.mjs +0 -59
  472. package/esm2022/select/public-api.mjs +0 -15
  473. package/esm2022/select/select-animations.mjs +0 -38
  474. package/esm2022/select/select-errors.mjs +0 -35
  475. package/esm2022/select/select.mjs +0 -1160
  476. package/esm2022/select/select_public_index.mjs +0 -5
  477. package/esm2022/select/testing/index.mjs +0 -9
  478. package/esm2022/select/testing/public-api.mjs +0 -10
  479. package/esm2022/select/testing/select-harness-filters.mjs +0 -9
  480. package/esm2022/select/testing/select-harness.mjs +0 -129
  481. package/esm2022/sidenav/drawer-animations.mjs +0 -33
  482. package/esm2022/sidenav/drawer.mjs +0 -863
  483. package/esm2022/sidenav/index.mjs +0 -9
  484. package/esm2022/sidenav/public-api.mjs +0 -12
  485. package/esm2022/sidenav/sidenav-module.mjs +0 -60
  486. package/esm2022/sidenav/sidenav.mjs +0 -148
  487. package/esm2022/sidenav/sidenav_public_index.mjs +0 -5
  488. package/esm2022/sidenav/testing/drawer-container-harness.mjs +0 -36
  489. package/esm2022/sidenav/testing/drawer-content-harness.mjs +0 -23
  490. package/esm2022/sidenav/testing/drawer-harness-filters.mjs +0 -9
  491. package/esm2022/sidenav/testing/drawer-harness.mjs +0 -49
  492. package/esm2022/sidenav/testing/index.mjs +0 -9
  493. package/esm2022/sidenav/testing/public-api.mjs +0 -15
  494. package/esm2022/sidenav/testing/sidenav-container-harness.mjs +0 -36
  495. package/esm2022/sidenav/testing/sidenav-content-harness.mjs +0 -23
  496. package/esm2022/sidenav/testing/sidenav-harness.mjs +0 -28
  497. package/esm2022/slide-toggle/index.mjs +0 -9
  498. package/esm2022/slide-toggle/module.mjs +0 -41
  499. package/esm2022/slide-toggle/public-api.mjs +0 -12
  500. package/esm2022/slide-toggle/slide-toggle-config.mjs +0 -14
  501. package/esm2022/slide-toggle/slide-toggle-required-validator.mjs +0 -44
  502. package/esm2022/slide-toggle/slide-toggle.mjs +0 -273
  503. package/esm2022/slide-toggle/slide-toggle_public_index.mjs +0 -5
  504. package/esm2022/slide-toggle/testing/index.mjs +0 -9
  505. package/esm2022/slide-toggle/testing/public-api.mjs +0 -10
  506. package/esm2022/slide-toggle/testing/slide-toggle-harness-filters.mjs +0 -9
  507. package/esm2022/slide-toggle/testing/slide-toggle-harness.mjs +0 -110
  508. package/esm2022/slider/index.mjs +0 -9
  509. package/esm2022/slider/module.mjs +0 -39
  510. package/esm2022/slider/public-api.mjs +0 -13
  511. package/esm2022/slider/slider-input.mjs +0 -701
  512. package/esm2022/slider/slider-interface.mjs +0 -56
  513. package/esm2022/slider/slider-thumb.mjs +0 -231
  514. package/esm2022/slider/slider.mjs +0 -746
  515. package/esm2022/slider/slider_public_index.mjs +0 -5
  516. package/esm2022/slider/testing/index.mjs +0 -9
  517. package/esm2022/slider/testing/public-api.mjs +0 -11
  518. package/esm2022/slider/testing/slider-harness-filters.mjs +0 -7
  519. package/esm2022/slider/testing/slider-harness.mjs +0 -67
  520. package/esm2022/slider/testing/slider-thumb-harness.mjs +0 -95
  521. package/esm2022/snack-bar/index.mjs +0 -9
  522. package/esm2022/snack-bar/module.mjs +0 -47
  523. package/esm2022/snack-bar/public-api.mjs +0 -16
  524. package/esm2022/snack-bar/simple-snack-bar.mjs +0 -40
  525. package/esm2022/snack-bar/snack-bar-animations.mjs +0 -30
  526. package/esm2022/snack-bar/snack-bar-config.mjs +0 -33
  527. package/esm2022/snack-bar/snack-bar-container.mjs +0 -277
  528. package/esm2022/snack-bar/snack-bar-content.mjs +0 -55
  529. package/esm2022/snack-bar/snack-bar-ref.mjs +0 -89
  530. package/esm2022/snack-bar/snack-bar.mjs +0 -267
  531. package/esm2022/snack-bar/snack-bar_public_index.mjs +0 -5
  532. package/esm2022/snack-bar/testing/index.mjs +0 -9
  533. package/esm2022/snack-bar/testing/public-api.mjs +0 -10
  534. package/esm2022/snack-bar/testing/snack-bar-harness-filters.mjs +0 -9
  535. package/esm2022/snack-bar/testing/snack-bar-harness.mjs +0 -101
  536. package/esm2022/sort/index.mjs +0 -9
  537. package/esm2022/sort/public-api.mjs +0 -14
  538. package/esm2022/sort/sort-animations.mjs +0 -69
  539. package/esm2022/sort/sort-direction.mjs +0 -9
  540. package/esm2022/sort/sort-errors.mjs +0 -24
  541. package/esm2022/sort/sort-header-intl.mjs +0 -41
  542. package/esm2022/sort/sort-header.mjs +0 -317
  543. package/esm2022/sort/sort-module.mjs +0 -27
  544. package/esm2022/sort/sort.mjs +0 -155
  545. package/esm2022/sort/sort_public_index.mjs +0 -5
  546. package/esm2022/sort/testing/index.mjs +0 -9
  547. package/esm2022/sort/testing/public-api.mjs +0 -11
  548. package/esm2022/sort/testing/sort-harness-filters.mjs +0 -2
  549. package/esm2022/sort/testing/sort-harness.mjs +0 -36
  550. package/esm2022/sort/testing/sort-header-harness.mjs +0 -56
  551. package/esm2022/stepper/index.mjs +0 -9
  552. package/esm2022/stepper/public-api.mjs +0 -17
  553. package/esm2022/stepper/step-content.mjs +0 -27
  554. package/esm2022/stepper/step-header.mjs +0 -105
  555. package/esm2022/stepper/step-label.mjs +0 -22
  556. package/esm2022/stepper/stepper-animations.mjs +0 -47
  557. package/esm2022/stepper/stepper-button.mjs +0 -43
  558. package/esm2022/stepper/stepper-icon.mjs +0 -30
  559. package/esm2022/stepper/stepper-intl.mjs +0 -43
  560. package/esm2022/stepper/stepper-module.mjs +0 -88
  561. package/esm2022/stepper/stepper.mjs +0 -205
  562. package/esm2022/stepper/stepper_public_index.mjs +0 -5
  563. package/esm2022/stepper/testing/index.mjs +0 -9
  564. package/esm2022/stepper/testing/public-api.mjs +0 -12
  565. package/esm2022/stepper/testing/step-harness-filters.mjs +0 -7
  566. package/esm2022/stepper/testing/step-harness.mjs +0 -90
  567. package/esm2022/stepper/testing/stepper-button-harnesses.mjs +0 -48
  568. package/esm2022/stepper/testing/stepper-harness.mjs +0 -51
  569. package/esm2022/table/cell.mjs +0 -147
  570. package/esm2022/table/index.mjs +0 -9
  571. package/esm2022/table/module.mjs +0 -93
  572. package/esm2022/table/public-api.mjs +0 -14
  573. package/esm2022/table/row.mjs +0 -163
  574. package/esm2022/table/table-data-source.mjs +0 -317
  575. package/esm2022/table/table.mjs +0 -122
  576. package/esm2022/table/table_public_index.mjs +0 -5
  577. package/esm2022/table/testing/cell-harness.mjs +0 -77
  578. package/esm2022/table/testing/index.mjs +0 -9
  579. package/esm2022/table/testing/public-api.mjs +0 -12
  580. package/esm2022/table/testing/row-harness.mjs +0 -84
  581. package/esm2022/table/testing/table-harness-filters.mjs +0 -2
  582. package/esm2022/table/testing/table-harness.mjs +0 -86
  583. package/esm2022/table/text-column.mjs +0 -60
  584. package/esm2022/tabs/index.mjs +0 -9
  585. package/esm2022/tabs/ink-bar.mjs +0 -149
  586. package/esm2022/tabs/module.mjs +0 -60
  587. package/esm2022/tabs/paginated-tab-header.mjs +0 -539
  588. package/esm2022/tabs/public-api.mjs +0 -21
  589. package/esm2022/tabs/tab-body.mjs +0 -199
  590. package/esm2022/tabs/tab-config.mjs +0 -11
  591. package/esm2022/tabs/tab-content.mjs +0 -32
  592. package/esm2022/tabs/tab-group.mjs +0 -469
  593. package/esm2022/tabs/tab-header.mjs +0 -86
  594. package/esm2022/tabs/tab-label-wrapper.mjs +0 -49
  595. package/esm2022/tabs/tab-label.mjs +0 -44
  596. package/esm2022/tabs/tab-nav-bar/tab-nav-bar.mjs +0 -388
  597. package/esm2022/tabs/tab.mjs +0 -128
  598. package/esm2022/tabs/tabs-animations.mjs +0 -45
  599. package/esm2022/tabs/tabs_public_index.mjs +0 -5
  600. package/esm2022/tabs/testing/index.mjs +0 -9
  601. package/esm2022/tabs/testing/public-api.mjs +0 -13
  602. package/esm2022/tabs/testing/tab-group-harness.mjs +0 -56
  603. package/esm2022/tabs/testing/tab-harness-filters.mjs +0 -2
  604. package/esm2022/tabs/testing/tab-harness.mjs +0 -66
  605. package/esm2022/tabs/testing/tab-link-harness.mjs +0 -40
  606. package/esm2022/tabs/testing/tab-nav-bar-harness.mjs +0 -66
  607. package/esm2022/tabs/testing/tab-nav-panel-harness.mjs +0 -27
  608. package/esm2022/toolbar/index.mjs +0 -9
  609. package/esm2022/toolbar/public-api.mjs +0 -10
  610. package/esm2022/toolbar/testing/index.mjs +0 -9
  611. package/esm2022/toolbar/testing/public-api.mjs +0 -10
  612. package/esm2022/toolbar/testing/toolbar-harness-filters.mjs +0 -9
  613. package/esm2022/toolbar/testing/toolbar-harness.mjs +0 -44
  614. package/esm2022/toolbar/toolbar-module.mjs +0 -24
  615. package/esm2022/toolbar/toolbar.mjs +0 -84
  616. package/esm2022/toolbar/toolbar_public_index.mjs +0 -5
  617. package/esm2022/tooltip/index.mjs +0 -9
  618. package/esm2022/tooltip/module.mjs +0 -29
  619. package/esm2022/tooltip/public-api.mjs +0 -11
  620. package/esm2022/tooltip/testing/index.mjs +0 -9
  621. package/esm2022/tooltip/testing/public-api.mjs +0 -10
  622. package/esm2022/tooltip/testing/tooltip-harness-filters.mjs +0 -9
  623. package/esm2022/tooltip/testing/tooltip-harness.mjs +0 -66
  624. package/esm2022/tooltip/tooltip-animations.mjs +0 -24
  625. package/esm2022/tooltip/tooltip.mjs +0 -920
  626. package/esm2022/tooltip/tooltip_public_index.mjs +0 -5
  627. package/esm2022/tree/data-source/flat-data-source.mjs +0 -156
  628. package/esm2022/tree/data-source/nested-data-source.mjs +0 -38
  629. package/esm2022/tree/index.mjs +0 -9
  630. package/esm2022/tree/node.mjs +0 -220
  631. package/esm2022/tree/outlet.mjs +0 -46
  632. package/esm2022/tree/padding.mjs +0 -46
  633. package/esm2022/tree/public-api.mjs +0 -16
  634. package/esm2022/tree/testing/index.mjs +0 -9
  635. package/esm2022/tree/testing/node-harness.mjs +0 -73
  636. package/esm2022/tree/testing/public-api.mjs +0 -11
  637. package/esm2022/tree/testing/tree-harness-filters.mjs +0 -9
  638. package/esm2022/tree/testing/tree-harness.mjs +0 -123
  639. package/esm2022/tree/toggle.mjs +0 -27
  640. package/esm2022/tree/tree-module.mjs +0 -50
  641. package/esm2022/tree/tree.mjs +0 -34
  642. package/esm2022/tree/tree_public_index.mjs +0 -5
@@ -1,372 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Google LLC All Rights Reserved.
4
- *
5
- * Use of this source code is governed by an MIT-style license that can be
6
- * found in the LICENSE file at https://angular.io/license
7
- */
8
- import { Directionality } from '@angular/cdk/bidi';
9
- import { BACKSPACE, LEFT_ARROW, RIGHT_ARROW } from '@angular/cdk/keycodes';
10
- import { Directive, ElementRef, Inject, InjectionToken, Injector, Input, Optional, inject, } from '@angular/core';
11
- import { FormGroupDirective, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl, NgForm, Validators, } from '@angular/forms';
12
- import { DateAdapter, ErrorStateMatcher, MAT_DATE_FORMATS, _ErrorStateTracker, } from '@angular/material/core';
13
- import { _computeAriaAccessibleName } from './aria-accessible-name';
14
- import { DateRange } from './date-selection-model';
15
- import { MatDatepickerInputBase } from './datepicker-input-base';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "@angular/material/core";
18
- import * as i2 from "@angular/forms";
19
- /**
20
- * Used to provide the date range input wrapper component
21
- * to the parts without circular dependencies.
22
- */
23
- export const MAT_DATE_RANGE_INPUT_PARENT = new InjectionToken('MAT_DATE_RANGE_INPUT_PARENT');
24
- /**
25
- * Base class for the individual inputs that can be projected inside a `mat-date-range-input`.
26
- */
27
- class MatDateRangeInputPartBase extends MatDatepickerInputBase {
28
- /** Object used to control when error messages are shown. */
29
- get errorStateMatcher() {
30
- return this._errorStateTracker.matcher;
31
- }
32
- set errorStateMatcher(value) {
33
- this._errorStateTracker.matcher = value;
34
- }
35
- /** Whether the input is in an error state. */
36
- get errorState() {
37
- return this._errorStateTracker.errorState;
38
- }
39
- set errorState(value) {
40
- this._errorStateTracker.errorState = value;
41
- }
42
- constructor(_rangeInput, _elementRef, _defaultErrorStateMatcher, _injector, _parentForm, _parentFormGroup, dateAdapter, dateFormats) {
43
- super(_elementRef, dateAdapter, dateFormats);
44
- this._rangeInput = _rangeInput;
45
- this._elementRef = _elementRef;
46
- this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
47
- this._injector = _injector;
48
- this._parentForm = _parentForm;
49
- this._parentFormGroup = _parentFormGroup;
50
- this._dir = inject(Directionality, { optional: true });
51
- this._errorStateTracker = new _ErrorStateTracker(this._defaultErrorStateMatcher, null, this._parentFormGroup, this._parentForm, this.stateChanges);
52
- }
53
- ngOnInit() {
54
- // We need the date input to provide itself as a `ControlValueAccessor` and a `Validator`, while
55
- // injecting its `NgControl` so that the error state is handled correctly. This introduces a
56
- // circular dependency, because both `ControlValueAccessor` and `Validator` depend on the input
57
- // itself. Usually we can work around it for the CVA, but there's no API to do it for the
58
- // validator. We work around it here by injecting the `NgControl` in `ngOnInit`, after
59
- // everything has been resolved.
60
- const ngControl = this._injector.get(NgControl, null, { optional: true, self: true });
61
- if (ngControl) {
62
- this.ngControl = ngControl;
63
- this._errorStateTracker.ngControl = ngControl;
64
- }
65
- }
66
- ngDoCheck() {
67
- if (this.ngControl) {
68
- // We need to re-evaluate this on every change detection cycle, because there are some
69
- // error triggers that we can't subscribe to (e.g. parent form submissions). This means
70
- // that whatever logic is in here has to be super lean or we risk destroying the performance.
71
- this.updateErrorState();
72
- }
73
- }
74
- /** Gets whether the input is empty. */
75
- isEmpty() {
76
- return this._elementRef.nativeElement.value.length === 0;
77
- }
78
- /** Gets the placeholder of the input. */
79
- _getPlaceholder() {
80
- return this._elementRef.nativeElement.placeholder;
81
- }
82
- /** Focuses the input. */
83
- focus() {
84
- this._elementRef.nativeElement.focus();
85
- }
86
- /** Gets the value that should be used when mirroring the input's size. */
87
- getMirrorValue() {
88
- const element = this._elementRef.nativeElement;
89
- const value = element.value;
90
- return value.length > 0 ? value : element.placeholder;
91
- }
92
- /** Refreshes the error state of the input. */
93
- updateErrorState() {
94
- this._errorStateTracker.updateErrorState();
95
- }
96
- /** Handles `input` events on the input element. */
97
- _onInput(value) {
98
- super._onInput(value);
99
- this._rangeInput._handleChildValueChange();
100
- }
101
- /** Opens the datepicker associated with the input. */
102
- _openPopup() {
103
- this._rangeInput._openDatepicker();
104
- }
105
- /** Gets the minimum date from the range input. */
106
- _getMinDate() {
107
- return this._rangeInput.min;
108
- }
109
- /** Gets the maximum date from the range input. */
110
- _getMaxDate() {
111
- return this._rangeInput.max;
112
- }
113
- /** Gets the date filter function from the range input. */
114
- _getDateFilter() {
115
- return this._rangeInput.dateFilter;
116
- }
117
- _parentDisabled() {
118
- return this._rangeInput._groupDisabled;
119
- }
120
- _shouldHandleChangeEvent({ source }) {
121
- return source !== this._rangeInput._startInput && source !== this._rangeInput._endInput;
122
- }
123
- _assignValueProgrammatically(value) {
124
- super._assignValueProgrammatically(value);
125
- const opposite = (this === this._rangeInput._startInput
126
- ? this._rangeInput._endInput
127
- : this._rangeInput._startInput);
128
- opposite?._validatorOnChange();
129
- }
130
- /** return the ARIA accessible name of the input element */
131
- _getAccessibleName() {
132
- return _computeAriaAccessibleName(this._elementRef.nativeElement);
133
- }
134
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatDateRangeInputPartBase, deps: [{ token: MAT_DATE_RANGE_INPUT_PARENT }, { token: i0.ElementRef }, { token: i1.ErrorStateMatcher }, { token: i0.Injector }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i1.DateAdapter, optional: true }, { token: MAT_DATE_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
135
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0-next.2", type: MatDateRangeInputPartBase, isStandalone: true, inputs: { errorStateMatcher: "errorStateMatcher" }, usesInheritance: true, ngImport: i0 }); }
136
- }
137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatDateRangeInputPartBase, decorators: [{
138
- type: Directive,
139
- args: [{ standalone: true }]
140
- }], ctorParameters: () => [{ type: undefined, decorators: [{
141
- type: Inject,
142
- args: [MAT_DATE_RANGE_INPUT_PARENT]
143
- }] }, { type: i0.ElementRef }, { type: i1.ErrorStateMatcher }, { type: i0.Injector }, { type: i2.NgForm, decorators: [{
144
- type: Optional
145
- }] }, { type: i2.FormGroupDirective, decorators: [{
146
- type: Optional
147
- }] }, { type: i1.DateAdapter, decorators: [{
148
- type: Optional
149
- }] }, { type: undefined, decorators: [{
150
- type: Optional
151
- }, {
152
- type: Inject,
153
- args: [MAT_DATE_FORMATS]
154
- }] }], propDecorators: { errorStateMatcher: [{
155
- type: Input
156
- }] } });
157
- /** Input for entering the start date in a `mat-date-range-input`. */
158
- export class MatStartDate extends MatDateRangeInputPartBase {
159
- constructor(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats) {
160
- super(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats);
161
- /** Validator that checks that the start date isn't after the end date. */
162
- this._startValidator = (control) => {
163
- const start = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));
164
- const end = this._model ? this._model.selection.end : null;
165
- return !start || !end || this._dateAdapter.compareDate(start, end) <= 0
166
- ? null
167
- : { 'matStartDateInvalid': { 'end': end, 'actual': start } };
168
- };
169
- this._validator = Validators.compose([...super._getValidators(), this._startValidator]);
170
- }
171
- _getValueFromModel(modelValue) {
172
- return modelValue.start;
173
- }
174
- _shouldHandleChangeEvent(change) {
175
- if (!super._shouldHandleChangeEvent(change)) {
176
- return false;
177
- }
178
- else {
179
- return !change.oldValue?.start
180
- ? !!change.selection.start
181
- : !change.selection.start ||
182
- !!this._dateAdapter.compareDate(change.oldValue.start, change.selection.start);
183
- }
184
- }
185
- _assignValueToModel(value) {
186
- if (this._model) {
187
- const range = new DateRange(value, this._model.selection.end);
188
- this._model.updateSelection(range, this);
189
- }
190
- }
191
- _formatValue(value) {
192
- super._formatValue(value);
193
- // Any time the input value is reformatted we need to tell the parent.
194
- this._rangeInput._handleChildValueChange();
195
- }
196
- _onKeydown(event) {
197
- const endInput = this._rangeInput._endInput;
198
- const element = this._elementRef.nativeElement;
199
- const isLtr = this._dir?.value !== 'rtl';
200
- // If the user hits RIGHT (LTR) when at the end of the input (and no
201
- // selection), move the cursor to the start of the end input.
202
- if (((event.keyCode === RIGHT_ARROW && isLtr) || (event.keyCode === LEFT_ARROW && !isLtr)) &&
203
- element.selectionStart === element.value.length &&
204
- element.selectionEnd === element.value.length) {
205
- event.preventDefault();
206
- endInput._elementRef.nativeElement.setSelectionRange(0, 0);
207
- endInput.focus();
208
- }
209
- else {
210
- super._onKeydown(event);
211
- }
212
- }
213
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatStartDate, deps: [{ token: MAT_DATE_RANGE_INPUT_PARENT }, { token: i0.ElementRef }, { token: i1.ErrorStateMatcher }, { token: i0.Injector }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i1.DateAdapter, optional: true }, { token: MAT_DATE_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
214
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0-next.2", type: MatStartDate, isStandalone: true, selector: "input[matStartDate]", outputs: { dateChange: "dateChange", dateInput: "dateInput" }, host: { attributes: { "type": "text" }, listeners: { "input": "_onInput($event.target.value)", "change": "_onChange()", "keydown": "_onKeydown($event)", "blur": "_onBlur()" }, properties: { "disabled": "disabled", "attr.aria-haspopup": "_rangeInput.rangePicker ? \"dialog\" : null", "attr.aria-owns": "_rangeInput._ariaOwns\n ? _rangeInput._ariaOwns()\n : (_rangeInput.rangePicker?.opened && _rangeInput.rangePicker.id) || null", "attr.min": "_getMinDate() ? _dateAdapter.toIso8601(_getMinDate()) : null", "attr.max": "_getMaxDate() ? _dateAdapter.toIso8601(_getMaxDate()) : null" }, classAttribute: "mat-start-date mat-date-range-input-inner" }, providers: [
215
- { provide: NG_VALUE_ACCESSOR, useExisting: MatStartDate, multi: true },
216
- { provide: NG_VALIDATORS, useExisting: MatStartDate, multi: true },
217
- ], usesInheritance: true, ngImport: i0 }); }
218
- }
219
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatStartDate, decorators: [{
220
- type: Directive,
221
- args: [{
222
- selector: 'input[matStartDate]',
223
- host: {
224
- 'class': 'mat-start-date mat-date-range-input-inner',
225
- '[disabled]': 'disabled',
226
- '(input)': '_onInput($event.target.value)',
227
- '(change)': '_onChange()',
228
- '(keydown)': '_onKeydown($event)',
229
- '[attr.aria-haspopup]': '_rangeInput.rangePicker ? "dialog" : null',
230
- '[attr.aria-owns]': `_rangeInput._ariaOwns
231
- ? _rangeInput._ariaOwns()
232
- : (_rangeInput.rangePicker?.opened && _rangeInput.rangePicker.id) || null`,
233
- '[attr.min]': '_getMinDate() ? _dateAdapter.toIso8601(_getMinDate()) : null',
234
- '[attr.max]': '_getMaxDate() ? _dateAdapter.toIso8601(_getMaxDate()) : null',
235
- '(blur)': '_onBlur()',
236
- 'type': 'text',
237
- },
238
- providers: [
239
- { provide: NG_VALUE_ACCESSOR, useExisting: MatStartDate, multi: true },
240
- { provide: NG_VALIDATORS, useExisting: MatStartDate, multi: true },
241
- ],
242
- // These need to be specified explicitly, because some tooling doesn't
243
- // seem to pick them up from the base class. See #20932.
244
- outputs: ['dateChange', 'dateInput'],
245
- standalone: true,
246
- }]
247
- }], ctorParameters: () => [{ type: undefined, decorators: [{
248
- type: Inject,
249
- args: [MAT_DATE_RANGE_INPUT_PARENT]
250
- }] }, { type: i0.ElementRef }, { type: i1.ErrorStateMatcher }, { type: i0.Injector }, { type: i2.NgForm, decorators: [{
251
- type: Optional
252
- }] }, { type: i2.FormGroupDirective, decorators: [{
253
- type: Optional
254
- }] }, { type: i1.DateAdapter, decorators: [{
255
- type: Optional
256
- }] }, { type: undefined, decorators: [{
257
- type: Optional
258
- }, {
259
- type: Inject,
260
- args: [MAT_DATE_FORMATS]
261
- }] }] });
262
- /** Input for entering the end date in a `mat-date-range-input`. */
263
- export class MatEndDate extends MatDateRangeInputPartBase {
264
- constructor(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats) {
265
- super(rangeInput, elementRef, defaultErrorStateMatcher, injector, parentForm, parentFormGroup, dateAdapter, dateFormats);
266
- /** Validator that checks that the end date isn't before the start date. */
267
- this._endValidator = (control) => {
268
- const end = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));
269
- const start = this._model ? this._model.selection.start : null;
270
- return !end || !start || this._dateAdapter.compareDate(end, start) >= 0
271
- ? null
272
- : { 'matEndDateInvalid': { 'start': start, 'actual': end } };
273
- };
274
- this._validator = Validators.compose([...super._getValidators(), this._endValidator]);
275
- }
276
- _getValueFromModel(modelValue) {
277
- return modelValue.end;
278
- }
279
- _shouldHandleChangeEvent(change) {
280
- if (!super._shouldHandleChangeEvent(change)) {
281
- return false;
282
- }
283
- else {
284
- return !change.oldValue?.end
285
- ? !!change.selection.end
286
- : !change.selection.end ||
287
- !!this._dateAdapter.compareDate(change.oldValue.end, change.selection.end);
288
- }
289
- }
290
- _assignValueToModel(value) {
291
- if (this._model) {
292
- const range = new DateRange(this._model.selection.start, value);
293
- this._model.updateSelection(range, this);
294
- }
295
- }
296
- _moveCaretToEndOfStartInput() {
297
- const startInput = this._rangeInput._startInput._elementRef.nativeElement;
298
- const value = startInput.value;
299
- if (value.length > 0) {
300
- startInput.setSelectionRange(value.length, value.length);
301
- }
302
- startInput.focus();
303
- }
304
- _onKeydown(event) {
305
- const element = this._elementRef.nativeElement;
306
- const isLtr = this._dir?.value !== 'rtl';
307
- // If the user is pressing backspace on an empty end input, move focus back to the start.
308
- if (event.keyCode === BACKSPACE && !element.value) {
309
- this._moveCaretToEndOfStartInput();
310
- }
311
- // If the user hits LEFT (LTR) when at the start of the input (and no
312
- // selection), move the cursor to the end of the start input.
313
- else if (((event.keyCode === LEFT_ARROW && isLtr) || (event.keyCode === RIGHT_ARROW && !isLtr)) &&
314
- element.selectionStart === 0 &&
315
- element.selectionEnd === 0) {
316
- event.preventDefault();
317
- this._moveCaretToEndOfStartInput();
318
- }
319
- else {
320
- super._onKeydown(event);
321
- }
322
- }
323
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatEndDate, deps: [{ token: MAT_DATE_RANGE_INPUT_PARENT }, { token: i0.ElementRef }, { token: i1.ErrorStateMatcher }, { token: i0.Injector }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i1.DateAdapter, optional: true }, { token: MAT_DATE_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
324
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0-next.2", type: MatEndDate, isStandalone: true, selector: "input[matEndDate]", outputs: { dateChange: "dateChange", dateInput: "dateInput" }, host: { attributes: { "type": "text" }, listeners: { "input": "_onInput($event.target.value)", "change": "_onChange()", "keydown": "_onKeydown($event)", "blur": "_onBlur()" }, properties: { "disabled": "disabled", "attr.aria-haspopup": "_rangeInput.rangePicker ? \"dialog\" : null", "attr.aria-owns": "_rangeInput._ariaOwns\n ? _rangeInput._ariaOwns()\n : (_rangeInput.rangePicker?.opened && _rangeInput.rangePicker.id) || null", "attr.min": "_getMinDate() ? _dateAdapter.toIso8601(_getMinDate()) : null", "attr.max": "_getMaxDate() ? _dateAdapter.toIso8601(_getMaxDate()) : null" }, classAttribute: "mat-end-date mat-date-range-input-inner" }, providers: [
325
- { provide: NG_VALUE_ACCESSOR, useExisting: MatEndDate, multi: true },
326
- { provide: NG_VALIDATORS, useExisting: MatEndDate, multi: true },
327
- ], usesInheritance: true, ngImport: i0 }); }
328
- }
329
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0-next.2", ngImport: i0, type: MatEndDate, decorators: [{
330
- type: Directive,
331
- args: [{
332
- selector: 'input[matEndDate]',
333
- host: {
334
- 'class': 'mat-end-date mat-date-range-input-inner',
335
- '[disabled]': 'disabled',
336
- '(input)': '_onInput($event.target.value)',
337
- '(change)': '_onChange()',
338
- '(keydown)': '_onKeydown($event)',
339
- '[attr.aria-haspopup]': '_rangeInput.rangePicker ? "dialog" : null',
340
- '[attr.aria-owns]': `_rangeInput._ariaOwns
341
- ? _rangeInput._ariaOwns()
342
- : (_rangeInput.rangePicker?.opened && _rangeInput.rangePicker.id) || null`,
343
- '[attr.min]': '_getMinDate() ? _dateAdapter.toIso8601(_getMinDate()) : null',
344
- '[attr.max]': '_getMaxDate() ? _dateAdapter.toIso8601(_getMaxDate()) : null',
345
- '(blur)': '_onBlur()',
346
- 'type': 'text',
347
- },
348
- providers: [
349
- { provide: NG_VALUE_ACCESSOR, useExisting: MatEndDate, multi: true },
350
- { provide: NG_VALIDATORS, useExisting: MatEndDate, multi: true },
351
- ],
352
- // These need to be specified explicitly, because some tooling doesn't
353
- // seem to pick them up from the base class. See #20932.
354
- outputs: ['dateChange', 'dateInput'],
355
- standalone: true,
356
- }]
357
- }], ctorParameters: () => [{ type: undefined, decorators: [{
358
- type: Inject,
359
- args: [MAT_DATE_RANGE_INPUT_PARENT]
360
- }] }, { type: i0.ElementRef }, { type: i1.ErrorStateMatcher }, { type: i0.Injector }, { type: i2.NgForm, decorators: [{
361
- type: Optional
362
- }] }, { type: i2.FormGroupDirective, decorators: [{
363
- type: Optional
364
- }] }, { type: i1.DateAdapter, decorators: [{
365
- type: Optional
366
- }] }, { type: undefined, decorators: [{
367
- type: Optional
368
- }, {
369
- type: Inject,
370
- args: [MAT_DATE_FORMATS]
371
- }] }] });
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1pbnB1dC1wYXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9kYXRlcGlja2VyL2RhdGUtcmFuZ2UtaW5wdXQtcGFydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxTQUFTLEVBRVQsVUFBVSxFQUNWLE1BQU0sRUFDTixjQUFjLEVBQ2QsUUFBUSxFQUNSLEtBQUssRUFFTCxRQUFRLEVBRVIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUdOLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUVoQixrQkFBa0IsR0FDbkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsU0FBUyxFQUEyQixNQUFNLHdCQUF3QixDQUFDO0FBQzNFLE9BQU8sRUFBZSxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDOzs7O0FBcUI3RTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLGNBQWMsQ0FDM0QsNkJBQTZCLENBQzlCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQ2UseUJBQ2IsU0FBUSxzQkFBb0M7SUFlNUMsNERBQTREO0lBQzVELElBQ0ksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxLQUF3QjtRQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUMxQyxDQUFDO0lBRUQsOENBQThDO0lBQzlDLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsS0FBYztRQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM3QyxDQUFDO0lBRUQsWUFDOEMsV0FBdUMsRUFDbkUsV0FBeUMsRUFDbEQseUJBQTRDLEVBQzNDLFNBQW1CLEVBQ1IsV0FBbUIsRUFDbkIsZ0JBQW9DLEVBQzNDLFdBQTJCLEVBQ0QsV0FBMkI7UUFFakUsS0FBSyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFURCxnQkFBVyxHQUFYLFdBQVcsQ0FBNEI7UUFDbkUsZ0JBQVcsR0FBWCxXQUFXLENBQThCO1FBQ2xELDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBbUI7UUFDM0MsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNSLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ25CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUExQnRDLFNBQUksR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUErQmpFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUM5QyxJQUFJLENBQUMseUJBQXlCLEVBQzlCLElBQUksRUFDSixJQUFJLENBQUMsZ0JBQWdCLEVBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxZQUFZLENBQ2xCLENBQUM7SUFDSixDQUFDO0lBRUQsUUFBUTtRQUNOLGdHQUFnRztRQUNoRyw0RkFBNEY7UUFDNUYsK0ZBQStGO1FBQy9GLHlGQUF5RjtRQUN6RixzRkFBc0Y7UUFDdEYsZ0NBQWdDO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBRXBGLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixzRkFBc0Y7WUFDdEYsdUZBQXVGO1lBQ3ZGLDZGQUE2RjtZQUM3RixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztJQUNwRCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLEtBQUs7UUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLGNBQWM7UUFDWixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUMvQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzVCLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUN4RCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLGdCQUFnQjtRQUNkLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRCxtREFBbUQ7SUFDMUMsUUFBUSxDQUFDLEtBQWE7UUFDN0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELHNEQUFzRDtJQUM1QyxVQUFVO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztJQUM5QixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO0lBQzlCLENBQUM7SUFFRCwwREFBMEQ7SUFDaEQsY0FBYztRQUN0QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO0lBQ3JDLENBQUM7SUFFa0IsZUFBZTtRQUNoQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDO0lBQ3pDLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxFQUFDLE1BQU0sRUFBeUM7UUFDakYsT0FBTyxNQUFNLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO0lBQzFGLENBQUM7SUFFa0IsNEJBQTRCLENBQUMsS0FBZTtRQUM3RCxLQUFLLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsTUFBTSxRQUFRLEdBQUcsQ0FDZixJQUFJLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXO1lBQ25DLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVM7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUNXLENBQUM7UUFDOUMsUUFBUSxFQUFFLGtCQUFrQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxrQkFBa0I7UUFDaEIsT0FBTywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7cUhBdkpZLHlCQUF5QixrQkFrQzVCLDJCQUEyQixtT0FPZixnQkFBZ0I7eUdBekN6Qix5QkFBeUI7O2tHQUF6Qix5QkFBeUI7a0JBRHZDLFNBQVM7bUJBQUMsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFDOzswQkFtQ3hCLE1BQU07MkJBQUMsMkJBQTJCOzswQkFJbEMsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0I7eUNBdkJsQyxpQkFBaUI7c0JBRHBCLEtBQUs7O0FBeUlSLHFFQUFxRTtBQTJCckUsTUFBTSxPQUFPLFlBQWdCLFNBQVEseUJBQTRCO0lBWS9ELFlBQ3VDLFVBQXNDLEVBQzNFLFVBQXdDLEVBQ3hDLHdCQUEyQyxFQUMzQyxRQUFrQixFQUNOLFVBQWtCLEVBQ2xCLGVBQW1DLEVBQ25DLFdBQTJCLEVBQ0QsV0FBMkI7UUFFakUsS0FBSyxDQUNILFVBQVUsRUFDVixVQUFVLEVBQ1Ysd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLENBQ1osQ0FBQztRQTlCSiwwRUFBMEU7UUFDbEUsb0JBQWUsR0FBZ0IsQ0FBQyxPQUF3QixFQUEyQixFQUFFO1lBQzNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQ2hELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FDN0MsQ0FBQztZQUNGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzNELE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JFLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFDLEVBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUM7UUF3QlEsZUFBVSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUY3RixDQUFDO0lBSVMsa0JBQWtCLENBQUMsVUFBd0I7UUFDbkQsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFa0Isd0JBQXdCLENBQ3pDLE1BQThDO1FBRTlDLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSztnQkFDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUs7Z0JBQzFCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSztvQkFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkYsQ0FBQztJQUNILENBQUM7SUFFUyxtQkFBbUIsQ0FBQyxLQUFlO1FBQzNDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFa0IsWUFBWSxDQUFDLEtBQWU7UUFDN0MsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxQixzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFUSxVQUFVLENBQUMsS0FBb0I7UUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEtBQUssS0FBSyxDQUFDO1FBRXpDLG9FQUFvRTtRQUNwRSw2REFBNkQ7UUFDN0QsSUFDRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxXQUFXLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RGLE9BQU8sQ0FBQyxjQUFjLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQy9DLE9BQU8sQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQzdDLENBQUM7WUFDRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNELFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7cUhBckZVLFlBQVksa0JBYWIsMkJBQTJCLG1PQU9mLGdCQUFnQjt5R0FwQjNCLFlBQVksc3hCQVRaO1lBQ1QsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO1lBQ3BFLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7U0FDakU7O2tHQU1VLFlBQVk7a0JBMUJ4QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUsMkNBQTJDO3dCQUNwRCxZQUFZLEVBQUUsVUFBVTt3QkFDeEIsU0FBUyxFQUFFLCtCQUErQjt3QkFDMUMsVUFBVSxFQUFFLGFBQWE7d0JBQ3pCLFdBQVcsRUFBRSxvQkFBb0I7d0JBQ2pDLHNCQUFzQixFQUFFLDJDQUEyQzt3QkFDbkUsa0JBQWtCLEVBQUU7O2tGQUUwRDt3QkFDOUUsWUFBWSxFQUFFLDhEQUE4RDt3QkFDNUUsWUFBWSxFQUFFLDhEQUE4RDt3QkFDNUUsUUFBUSxFQUFFLFdBQVc7d0JBQ3JCLE1BQU0sRUFBRSxNQUFNO3FCQUNmO29CQUNELFNBQVMsRUFBRTt3QkFDVCxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLGNBQWMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO3dCQUNwRSxFQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxjQUFjLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztxQkFDakU7b0JBQ0Qsc0VBQXNFO29CQUN0RSx3REFBd0Q7b0JBQ3hELE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUM7b0JBQ3BDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBY0ksTUFBTTsyQkFBQywyQkFBMkI7OzBCQUlsQyxRQUFROzswQkFDUixRQUFROzswQkFDUixRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQjs7QUFvRXhDLG1FQUFtRTtBQTJCbkUsTUFBTSxPQUFPLFVBQWMsU0FBUSx5QkFBNEI7SUFVN0QsWUFDdUMsVUFBc0MsRUFDM0UsVUFBd0MsRUFDeEMsd0JBQTJDLEVBQzNDLFFBQWtCLEVBQ04sVUFBa0IsRUFDbEIsZUFBbUMsRUFDbkMsV0FBMkIsRUFDRCxXQUEyQjtRQUVqRSxLQUFLLENBQ0gsVUFBVSxFQUNWLFVBQVUsRUFDVix3QkFBd0IsRUFDeEIsUUFBUSxFQUNSLFVBQVUsRUFDVixlQUFlLEVBQ2YsV0FBVyxFQUNYLFdBQVcsQ0FDWixDQUFDO1FBNUJKLDJFQUEyRTtRQUNuRSxrQkFBYSxHQUFnQixDQUFDLE9BQXdCLEVBQTJCLEVBQUU7WUFDekYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMvRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMvRCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDO2dCQUNyRSxDQUFDLENBQUMsSUFBSTtnQkFDTixDQUFDLENBQUMsRUFBQyxtQkFBbUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBQyxFQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDO1FBd0JRLGVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFGM0YsQ0FBQztJQUlTLGtCQUFrQixDQUFDLFVBQXdCO1FBQ25ELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRWtCLHdCQUF3QixDQUN6QyxNQUE4QztRQUU5QyxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEdBQUc7Z0JBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHO2dCQUN4QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUc7b0JBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25GLENBQUM7SUFDSCxDQUFDO0lBRVMsbUJBQW1CLENBQUMsS0FBZTtRQUMzQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBRU8sMkJBQTJCO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDMUUsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUUvQixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckIsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVRLFVBQVUsQ0FBQyxLQUFvQjtRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssS0FBSyxLQUFLLENBQUM7UUFFekMseUZBQXlGO1FBQ3pGLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDckMsQ0FBQztRQUNELHFFQUFxRTtRQUNyRSw2REFBNkQ7YUFDeEQsSUFDSCxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RGLE9BQU8sQ0FBQyxjQUFjLEtBQUssQ0FBQztZQUM1QixPQUFPLENBQUMsWUFBWSxLQUFLLENBQUMsRUFDMUIsQ0FBQztZQUNELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7cUhBekZVLFVBQVUsa0JBV1gsMkJBQTJCLG1PQU9mLGdCQUFnQjt5R0FsQjNCLFVBQVUsa3hCQVRWO1lBQ1QsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO1lBQ2xFLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7U0FDL0Q7O2tHQU1VLFVBQVU7a0JBMUJ0QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUseUNBQXlDO3dCQUNsRCxZQUFZLEVBQUUsVUFBVTt3QkFDeEIsU0FBUyxFQUFFLCtCQUErQjt3QkFDMUMsVUFBVSxFQUFFLGFBQWE7d0JBQ3pCLFdBQVcsRUFBRSxvQkFBb0I7d0JBQ2pDLHNCQUFzQixFQUFFLDJDQUEyQzt3QkFDbkUsa0JBQWtCLEVBQUU7O2tGQUUwRDt3QkFDOUUsWUFBWSxFQUFFLDhEQUE4RDt3QkFDNUUsWUFBWSxFQUFFLDhEQUE4RDt3QkFDNUUsUUFBUSxFQUFFLFdBQVc7d0JBQ3JCLE1BQU0sRUFBRSxNQUFNO3FCQUNmO29CQUNELFNBQVMsRUFBRTt3QkFDVCxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO3dCQUNsRSxFQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztxQkFDL0Q7b0JBQ0Qsc0VBQXNFO29CQUN0RSx3REFBd0Q7b0JBQ3hELE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUM7b0JBQ3BDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBWUksTUFBTTsyQkFBQywyQkFBMkI7OzBCQUlsQyxRQUFROzswQkFDUixRQUFROzswQkFDUixRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQge0JBQ0tTUEFDRSwgTEVGVF9BUlJPVywgUklHSFRfQVJST1d9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIERvQ2hlY2ssXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgU2lnbmFsLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yRm4sXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIERhdGVBZGFwdGVyLFxuICBFcnJvclN0YXRlTWF0Y2hlcixcbiAgTUFUX0RBVEVfRk9STUFUUyxcbiAgTWF0RGF0ZUZvcm1hdHMsXG4gIF9FcnJvclN0YXRlVHJhY2tlcixcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQge19jb21wdXRlQXJpYUFjY2Vzc2libGVOYW1lfSBmcm9tICcuL2FyaWEtYWNjZXNzaWJsZS1uYW1lJztcbmltcG9ydCB7RGF0ZVJhbmdlLCBEYXRlU2VsZWN0aW9uTW9kZWxDaGFuZ2V9IGZyb20gJy4vZGF0ZS1zZWxlY3Rpb24tbW9kZWwnO1xuaW1wb3J0IHtEYXRlRmlsdGVyRm4sIE1hdERhdGVwaWNrZXJJbnB1dEJhc2V9IGZyb20gJy4vZGF0ZXBpY2tlci1pbnB1dC1iYXNlJztcblxuLyoqIFBhcmVudCBjb21wb25lbnQgdGhhdCBzaG91bGQgYmUgd3JhcHBlZCBhcm91bmQgYE1hdFN0YXJ0RGF0ZWAgYW5kIGBNYXRFbmREYXRlYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWF0RGF0ZVJhbmdlSW5wdXRQYXJlbnQ8RD4ge1xuICBpZDogc3RyaW5nO1xuICBtaW46IEQgfCBudWxsO1xuICBtYXg6IEQgfCBudWxsO1xuICBkYXRlRmlsdGVyOiBEYXRlRmlsdGVyRm48RD47XG4gIHJhbmdlUGlja2VyOiB7XG4gICAgb3BlbmVkOiBib29sZWFuO1xuICAgIGlkOiBzdHJpbmc7XG4gIH07XG4gIC8vIEBicmVha2luZy1jaGFuZ2UgMjAuMC4wIHByb3BlcnR5IHRvIGJlY29tZSByZXF1aXJlZC5cbiAgX2FyaWFPd25zPzogU2lnbmFsPHN0cmluZyB8IG51bGw+O1xuICBfc3RhcnRJbnB1dDogTWF0RGF0ZVJhbmdlSW5wdXRQYXJ0QmFzZTxEPjtcbiAgX2VuZElucHV0OiBNYXREYXRlUmFuZ2VJbnB1dFBhcnRCYXNlPEQ+O1xuICBfZ3JvdXBEaXNhYmxlZDogYm9vbGVhbjtcbiAgX2hhbmRsZUNoaWxkVmFsdWVDaGFuZ2UoKTogdm9pZDtcbiAgX29wZW5EYXRlcGlja2VyKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVXNlZCB0byBwcm92aWRlIHRoZSBkYXRlIHJhbmdlIGlucHV0IHdyYXBwZXIgY29tcG9uZW50XG4gKiB0byB0aGUgcGFydHMgd2l0aG91dCBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVRfREFURV9SQU5HRV9JTlBVVF9QQVJFTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWF0RGF0ZVJhbmdlSW5wdXRQYXJlbnQ8dW5rbm93bj4+KFxuICAnTUFUX0RBVEVfUkFOR0VfSU5QVVRfUEFSRU5UJyxcbik7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgdGhlIGluZGl2aWR1YWwgaW5wdXRzIHRoYXQgY2FuIGJlIHByb2plY3RlZCBpbnNpZGUgYSBgbWF0LWRhdGUtcmFuZ2UtaW5wdXRgLlxuICovXG5ARGlyZWN0aXZlKHtzdGFuZGFsb25lOiB0cnVlfSlcbmFic3RyYWN0IGNsYXNzIE1hdERhdGVSYW5nZUlucHV0UGFydEJhc2U8RD5cbiAgZXh0ZW5kcyBNYXREYXRlcGlja2VySW5wdXRCYXNlPERhdGVSYW5nZTxEPj5cbiAgaW1wbGVtZW50cyBPbkluaXQsIERvQ2hlY2tcbntcbiAgLyoqXG4gICAqIEZvcm0gY29udHJvbCBib3VuZCB0byB0aGlzIGlucHV0IHBhcnQuXG4gICAqIEBkb2NzLXByaXZhdGVcbiAgICovXG4gIG5nQ29udHJvbDogTmdDb250cm9sO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvdmVycmlkZSBfdmFsaWRhdG9yOiBWYWxpZGF0b3JGbiB8IG51bGw7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvdmVycmlkZSBfYXNzaWduVmFsdWVUb01vZGVsKHZhbHVlOiBEIHwgbnVsbCk6IHZvaWQ7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvdmVycmlkZSBfZ2V0VmFsdWVGcm9tTW9kZWwobW9kZWxWYWx1ZTogRGF0ZVJhbmdlPEQ+KTogRCB8IG51bGw7XG4gIHByb3RlY3RlZCByZWFkb25seSBfZGlyID0gaW5qZWN0KERpcmVjdGlvbmFsaXR5LCB7b3B0aW9uYWw6IHRydWV9KTtcbiAgcHJpdmF0ZSBfZXJyb3JTdGF0ZVRyYWNrZXI6IF9FcnJvclN0YXRlVHJhY2tlcjtcblxuICAvKiogT2JqZWN0IHVzZWQgdG8gY29udHJvbCB3aGVuIGVycm9yIG1lc3NhZ2VzIGFyZSBzaG93bi4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGVycm9yU3RhdGVNYXRjaGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9lcnJvclN0YXRlVHJhY2tlci5tYXRjaGVyO1xuICB9XG4gIHNldCBlcnJvclN0YXRlTWF0Y2hlcih2YWx1ZTogRXJyb3JTdGF0ZU1hdGNoZXIpIHtcbiAgICB0aGlzLl9lcnJvclN0YXRlVHJhY2tlci5tYXRjaGVyID0gdmFsdWU7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgaW5wdXQgaXMgaW4gYW4gZXJyb3Igc3RhdGUuICovXG4gIGdldCBlcnJvclN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9lcnJvclN0YXRlVHJhY2tlci5lcnJvclN0YXRlO1xuICB9XG4gIHNldCBlcnJvclN0YXRlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZXJyb3JTdGF0ZVRyYWNrZXIuZXJyb3JTdGF0ZSA9IHZhbHVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfREFURV9SQU5HRV9JTlBVVF9QQVJFTlQpIHB1YmxpYyBfcmFuZ2VJbnB1dDogTWF0RGF0ZVJhbmdlSW5wdXRQYXJlbnQ8RD4sXG4gICAgcHVibGljIG92ZXJyaWRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIHB1YmxpYyBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIF9wYXJlbnRGb3JtOiBOZ0Zvcm0sXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBAT3B0aW9uYWwoKSBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RD4sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfREFURV9GT1JNQVRTKSBkYXRlRm9ybWF0czogTWF0RGF0ZUZvcm1hdHMsXG4gICkge1xuICAgIHN1cGVyKF9lbGVtZW50UmVmLCBkYXRlQWRhcHRlciwgZGF0ZUZvcm1hdHMpO1xuICAgIHRoaXMuX2Vycm9yU3RhdGVUcmFja2VyID0gbmV3IF9FcnJvclN0YXRlVHJhY2tlcihcbiAgICAgIHRoaXMuX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcixcbiAgICAgIG51bGwsXG4gICAgICB0aGlzLl9wYXJlbnRGb3JtR3JvdXAsXG4gICAgICB0aGlzLl9wYXJlbnRGb3JtLFxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMsXG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIFdlIG5lZWQgdGhlIGRhdGUgaW5wdXQgdG8gcHJvdmlkZSBpdHNlbGYgYXMgYSBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIGFuZCBhIGBWYWxpZGF0b3JgLCB3aGlsZVxuICAgIC8vIGluamVjdGluZyBpdHMgYE5nQ29udHJvbGAgc28gdGhhdCB0aGUgZXJyb3Igc3RhdGUgaXMgaGFuZGxlZCBjb3JyZWN0bHkuIFRoaXMgaW50cm9kdWNlcyBhXG4gICAgLy8gY2lyY3VsYXIgZGVwZW5kZW5jeSwgYmVjYXVzZSBib3RoIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgYW5kIGBWYWxpZGF0b3JgIGRlcGVuZCBvbiB0aGUgaW5wdXRcbiAgICAvLyBpdHNlbGYuIFVzdWFsbHkgd2UgY2FuIHdvcmsgYXJvdW5kIGl0IGZvciB0aGUgQ1ZBLCBidXQgdGhlcmUncyBubyBBUEkgdG8gZG8gaXQgZm9yIHRoZVxuICAgIC8vIHZhbGlkYXRvci4gV2Ugd29yayBhcm91bmQgaXQgaGVyZSBieSBpbmplY3RpbmcgdGhlIGBOZ0NvbnRyb2xgIGluIGBuZ09uSW5pdGAsIGFmdGVyXG4gICAgLy8gZXZlcnl0aGluZyBoYXMgYmVlbiByZXNvbHZlZC5cbiAgICBjb25zdCBuZ0NvbnRyb2wgPSB0aGlzLl9pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsLCB7b3B0aW9uYWw6IHRydWUsIHNlbGY6IHRydWV9KTtcblxuICAgIGlmIChuZ0NvbnRyb2wpIHtcbiAgICAgIHRoaXMubmdDb250cm9sID0gbmdDb250cm9sO1xuICAgICAgdGhpcy5fZXJyb3JTdGF0ZVRyYWNrZXIubmdDb250cm9sID0gbmdDb250cm9sO1xuICAgIH1cbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgdGhpcyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLCBiZWNhdXNlIHRoZXJlIGFyZSBzb21lXG4gICAgICAvLyBlcnJvciB0cmlnZ2VycyB0aGF0IHdlIGNhbid0IHN1YnNjcmliZSB0byAoZS5nLiBwYXJlbnQgZm9ybSBzdWJtaXNzaW9ucykuIFRoaXMgbWVhbnNcbiAgICAgIC8vIHRoYXQgd2hhdGV2ZXIgbG9naWMgaXMgaW4gaGVyZSBoYXMgdG8gYmUgc3VwZXIgbGVhbiBvciB3ZSByaXNrIGRlc3Ryb3lpbmcgdGhlIHBlcmZvcm1hbmNlLlxuICAgICAgdGhpcy51cGRhdGVFcnJvclN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEdldHMgd2hldGhlciB0aGUgaW5wdXQgaXMgZW1wdHkuICovXG4gIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZS5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgcGxhY2Vob2xkZXIgb2YgdGhlIGlucHV0LiAqL1xuICBfZ2V0UGxhY2Vob2xkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIHRoZSBpbnB1dC4gKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgdmFsdWUgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIG1pcnJvcmluZyB0aGUgaW5wdXQncyBzaXplLiAqL1xuICBnZXRNaXJyb3JWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LnZhbHVlO1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiBlbGVtZW50LnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgLyoqIFJlZnJlc2hlcyB0aGUgZXJyb3Igc3RhdGUgb2YgdGhlIGlucHV0LiAqL1xuICB1cGRhdGVFcnJvclN0YXRlKCkge1xuICAgIHRoaXMuX2Vycm9yU3RhdGVUcmFja2VyLnVwZGF0ZUVycm9yU3RhdGUoKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGBpbnB1dGAgZXZlbnRzIG9uIHRoZSBpbnB1dCBlbGVtZW50LiAqL1xuICBvdmVycmlkZSBfb25JbnB1dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIuX29uSW5wdXQodmFsdWUpO1xuICAgIHRoaXMuX3JhbmdlSW5wdXQuX2hhbmRsZUNoaWxkVmFsdWVDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKiBPcGVucyB0aGUgZGF0ZXBpY2tlciBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0LiAqL1xuICBwcm90ZWN0ZWQgX29wZW5Qb3B1cCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yYW5nZUlucHV0Ll9vcGVuRGF0ZXBpY2tlcigpO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIG1pbmltdW0gZGF0ZSBmcm9tIHRoZSByYW5nZSBpbnB1dC4gKi9cbiAgX2dldE1pbkRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlSW5wdXQubWluO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIG1heGltdW0gZGF0ZSBmcm9tIHRoZSByYW5nZSBpbnB1dC4gKi9cbiAgX2dldE1heERhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlSW5wdXQubWF4O1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGRhdGUgZmlsdGVyIGZ1bmN0aW9uIGZyb20gdGhlIHJhbmdlIGlucHV0LiAqL1xuICBwcm90ZWN0ZWQgX2dldERhdGVGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlSW5wdXQuZGF0ZUZpbHRlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBfcGFyZW50RGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JhbmdlSW5wdXQuX2dyb3VwRGlzYWJsZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3Nob3VsZEhhbmRsZUNoYW5nZUV2ZW50KHtzb3VyY2V9OiBEYXRlU2VsZWN0aW9uTW9kZWxDaGFuZ2U8RGF0ZVJhbmdlPEQ+Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzb3VyY2UgIT09IHRoaXMuX3JhbmdlSW5wdXQuX3N0YXJ0SW5wdXQgJiYgc291cmNlICE9PSB0aGlzLl9yYW5nZUlucHV0Ll9lbmRJbnB1dDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBfYXNzaWduVmFsdWVQcm9ncmFtbWF0aWNhbGx5KHZhbHVlOiBEIHwgbnVsbCkge1xuICAgIHN1cGVyLl9hc3NpZ25WYWx1ZVByb2dyYW1tYXRpY2FsbHkodmFsdWUpO1xuICAgIGNvbnN0IG9wcG9zaXRlID0gKFxuICAgICAgdGhpcyA9PT0gdGhpcy5fcmFuZ2VJbnB1dC5fc3RhcnRJbnB1dFxuICAgICAgICA/IHRoaXMuX3JhbmdlSW5wdXQuX2VuZElucHV0XG4gICAgICAgIDogdGhpcy5fcmFuZ2VJbnB1dC5fc3RhcnRJbnB1dFxuICAgICkgYXMgTWF0RGF0ZVJhbmdlSW5wdXRQYXJ0QmFzZTxEPiB8IHVuZGVmaW5lZDtcbiAgICBvcHBvc2l0ZT8uX3ZhbGlkYXRvck9uQ2hhbmdlKCk7XG4gIH1cblxuICAvKiogcmV0dXJuIHRoZSBBUklBIGFjY2Vzc2libGUgbmFtZSBvZiB0aGUgaW5wdXQgZWxlbWVudCAqL1xuICBfZ2V0QWNjZXNzaWJsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gX2NvbXB1dGVBcmlhQWNjZXNzaWJsZU5hbWUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgfVxufVxuXG4vKiogSW5wdXQgZm9yIGVudGVyaW5nIHRoZSBzdGFydCBkYXRlIGluIGEgYG1hdC1kYXRlLXJhbmdlLWlucHV0YC4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2lucHV0W21hdFN0YXJ0RGF0ZV0nLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ21hdC1zdGFydC1kYXRlIG1hdC1kYXRlLXJhbmdlLWlucHV0LWlubmVyJyxcbiAgICAnW2Rpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gICAgJyhpbnB1dCknOiAnX29uSW5wdXQoJGV2ZW50LnRhcmdldC52YWx1ZSknLFxuICAgICcoY2hhbmdlKSc6ICdfb25DaGFuZ2UoKScsXG4gICAgJyhrZXlkb3duKSc6ICdfb25LZXlkb3duKCRldmVudCknLFxuICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdfcmFuZ2VJbnB1dC5yYW5nZVBpY2tlciA/IFwiZGlhbG9nXCIgOiBudWxsJyxcbiAgICAnW2F0dHIuYXJpYS1vd25zXSc6IGBfcmFuZ2VJbnB1dC5fYXJpYU93bnNcbiAgICAgICAgPyBfcmFuZ2VJbnB1dC5fYXJpYU93bnMoKVxuICAgICAgICA6IChfcmFuZ2VJbnB1dC5yYW5nZVBpY2tlcj8ub3BlbmVkICYmIF9yYW5nZUlucHV0LnJhbmdlUGlja2VyLmlkKSB8fCBudWxsYCxcbiAgICAnW2F0dHIubWluXSc6ICdfZ2V0TWluRGF0ZSgpID8gX2RhdGVBZGFwdGVyLnRvSXNvODYwMShfZ2V0TWluRGF0ZSgpKSA6IG51bGwnLFxuICAgICdbYXR0ci5tYXhdJzogJ19nZXRNYXhEYXRlKCkgPyBfZGF0ZUFkYXB0ZXIudG9Jc284NjAxKF9nZXRNYXhEYXRlKCkpIDogbnVsbCcsXG4gICAgJyhibHVyKSc6ICdfb25CbHVyKCknLFxuICAgICd0eXBlJzogJ3RleHQnLFxuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7cHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBNYXRTdGFydERhdGUsIG11bHRpOiB0cnVlfSxcbiAgICB7cHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlRXhpc3Rpbmc6IE1hdFN0YXJ0RGF0ZSwgbXVsdGk6IHRydWV9LFxuICBdLFxuICAvLyBUaGVzZSBuZWVkIHRvIGJlIHNwZWNpZmllZCBleHBsaWNpdGx5LCBiZWNhdXNlIHNvbWUgdG9vbGluZyBkb2Vzbid0XG4gIC8vIHNlZW0gdG8gcGljayB0aGVtIHVwIGZyb20gdGhlIGJhc2UgY2xhc3MuIFNlZSAjMjA5MzIuXG4gIG91dHB1dHM6IFsnZGF0ZUNoYW5nZScsICdkYXRlSW5wdXQnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTWF0U3RhcnREYXRlPEQ+IGV4dGVuZHMgTWF0RGF0ZVJhbmdlSW5wdXRQYXJ0QmFzZTxEPiB7XG4gIC8qKiBWYWxpZGF0b3IgdGhhdCBjaGVja3MgdGhhdCB0aGUgc3RhcnQgZGF0ZSBpc24ndCBhZnRlciB0aGUgZW5kIGRhdGUuICovXG4gIHByaXZhdGUgX3N0YXJ0VmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwoXG4gICAgICB0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKSxcbiAgICApO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX21vZGVsID8gdGhpcy5fbW9kZWwuc2VsZWN0aW9uLmVuZCA6IG51bGw7XG4gICAgcmV0dXJuICFzdGFydCB8fCAhZW5kIHx8IHRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKHN0YXJ0LCBlbmQpIDw9IDBcbiAgICAgID8gbnVsbFxuICAgICAgOiB7J21hdFN0YXJ0RGF0ZUludmFsaWQnOiB7J2VuZCc6IGVuZCwgJ2FjdHVhbCc6IHN0YXJ0fX07XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfREFURV9SQU5HRV9JTlBVVF9QQVJFTlQpIHJhbmdlSW5wdXQ6IE1hdERhdGVSYW5nZUlucHV0UGFyZW50PEQ+LFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sXG4gICAgZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKCkgcGFyZW50Rm9ybTogTmdGb3JtLFxuICAgIEBPcHRpb25hbCgpIHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIEBPcHRpb25hbCgpIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEPixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9EQVRFX0ZPUk1BVFMpIGRhdGVGb3JtYXRzOiBNYXREYXRlRm9ybWF0cyxcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICByYW5nZUlucHV0LFxuICAgICAgZWxlbWVudFJlZixcbiAgICAgIGRlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcixcbiAgICAgIGluamVjdG9yLFxuICAgICAgcGFyZW50Rm9ybSxcbiAgICAgIHBhcmVudEZvcm1Hcm91cCxcbiAgICAgIGRhdGVBZGFwdGVyLFxuICAgICAgZGF0ZUZvcm1hdHMsXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfdmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKFsuLi5zdXBlci5fZ2V0VmFsaWRhdG9ycygpLCB0aGlzLl9zdGFydFZhbGlkYXRvcl0pO1xuXG4gIHByb3RlY3RlZCBfZ2V0VmFsdWVGcm9tTW9kZWwobW9kZWxWYWx1ZTogRGF0ZVJhbmdlPEQ+KSB7XG4gICAgcmV0dXJuIG1vZGVsVmFsdWUuc3RhcnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3Nob3VsZEhhbmRsZUNoYW5nZUV2ZW50KFxuICAgIGNoYW5nZTogRGF0ZVNlbGVjdGlvbk1vZGVsQ2hhbmdlPERhdGVSYW5nZTxEPj4sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuX3Nob3VsZEhhbmRsZUNoYW5nZUV2ZW50KGNoYW5nZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICFjaGFuZ2Uub2xkVmFsdWU/LnN0YXJ0XG4gICAgICAgID8gISFjaGFuZ2Uuc2VsZWN0aW9uLnN0YXJ0XG4gICAgICAgIDogIWNoYW5nZS5zZWxlY3Rpb24uc3RhcnQgfHxcbiAgICAgICAgICAgICEhdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUoY2hhbmdlLm9sZFZhbHVlLnN0YXJ0LCBjaGFuZ2Uuc2VsZWN0aW9uLnN0YXJ0KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Fzc2lnblZhbHVlVG9Nb2RlbCh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5fbW9kZWwpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gbmV3IERhdGVSYW5nZSh2YWx1ZSwgdGhpcy5fbW9kZWwuc2VsZWN0aW9uLmVuZCk7XG4gICAgICB0aGlzLl9tb2RlbC51cGRhdGVTZWxlY3Rpb24ocmFuZ2UsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBfZm9ybWF0VmFsdWUodmFsdWU6IEQgfCBudWxsKSB7XG4gICAgc3VwZXIuX2Zvcm1hdFZhbHVlKHZhbHVlKTtcblxuICAgIC8vIEFueSB0aW1lIHRoZSBpbnB1dCB2YWx1ZSBpcyByZWZvcm1hdHRlZCB3ZSBuZWVkIHRvIHRlbGwgdGhlIHBhcmVudC5cbiAgICB0aGlzLl9yYW5nZUlucHV0Ll9oYW5kbGVDaGlsZFZhbHVlQ2hhbmdlKCk7XG4gIH1cblxuICBvdmVycmlkZSBfb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgZW5kSW5wdXQgPSB0aGlzLl9yYW5nZUlucHV0Ll9lbmRJbnB1dDtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGlzTHRyID0gdGhpcy5fZGlyPy52YWx1ZSAhPT0gJ3J0bCc7XG5cbiAgICAvLyBJZiB0aGUgdXNlciBoaXRzIFJJR0hUIChMVFIpIHdoZW4gYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgKGFuZCBub1xuICAgIC8vIHNlbGVjdGlvbiksIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGVuZCBpbnB1dC5cbiAgICBpZiAoXG4gICAgICAoKGV2ZW50LmtleUNvZGUgPT09IFJJR0hUX0FSUk9XICYmIGlzTHRyKSB8fCAoZXZlbnQua2V5Q29kZSA9PT0gTEVGVF9BUlJPVyAmJiAhaXNMdHIpKSAmJlxuICAgICAgZWxlbWVudC5zZWxlY3Rpb25TdGFydCA9PT0gZWxlbWVudC52YWx1ZS5sZW5ndGggJiZcbiAgICAgIGVsZW1lbnQuc2VsZWN0aW9uRW5kID09PSBlbGVtZW50LnZhbHVlLmxlbmd0aFxuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGVuZElucHV0Ll9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgMCk7XG4gICAgICBlbmRJbnB1dC5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5fb25LZXlkb3duKGV2ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIElucHV0IGZvciBlbnRlcmluZyB0aGUgZW5kIGRhdGUgaW4gYSBgbWF0LWRhdGUtcmFuZ2UtaW5wdXRgLiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbbWF0RW5kRGF0ZV0nLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ21hdC1lbmQtZGF0ZSBtYXQtZGF0ZS1yYW5nZS1pbnB1dC1pbm5lcicsXG4gICAgJ1tkaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICcoaW5wdXQpJzogJ19vbklucHV0KCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAnKGNoYW5nZSknOiAnX29uQ2hhbmdlKCknLFxuICAgICcoa2V5ZG93biknOiAnX29uS2V5ZG93bigkZXZlbnQpJyxcbiAgICAnW2F0dHIuYXJpYS1oYXNwb3B1cF0nOiAnX3JhbmdlSW5wdXQucmFuZ2VQaWNrZXIgPyBcImRpYWxvZ1wiIDogbnVsbCcsXG4gICAgJ1thdHRyLmFyaWEtb3duc10nOiBgX3JhbmdlSW5wdXQuX2FyaWFPd25zXG4gICAgICAgID8gX3JhbmdlSW5wdXQuX2FyaWFPd25zKClcbiAgICAgICAgOiAoX3JhbmdlSW5wdXQucmFuZ2VQaWNrZXI/Lm9wZW5lZCAmJiBfcmFuZ2VJbnB1dC5yYW5nZVBpY2tlci5pZCkgfHwgbnVsbGAsXG4gICAgJ1thdHRyLm1pbl0nOiAnX2dldE1pbkRhdGUoKSA/IF9kYXRlQWRhcHRlci50b0lzbzg2MDEoX2dldE1pbkRhdGUoKSkgOiBudWxsJyxcbiAgICAnW2F0dHIubWF4XSc6ICdfZ2V0TWF4RGF0ZSgpID8gX2RhdGVBZGFwdGVyLnRvSXNvODYwMShfZ2V0TWF4RGF0ZSgpKSA6IG51bGwnLFxuICAgICcoYmx1ciknOiAnX29uQmx1cigpJyxcbiAgICAndHlwZSc6ICd0ZXh0JyxcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge3Byb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogTWF0RW5kRGF0ZSwgbXVsdGk6IHRydWV9LFxuICAgIHtwcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogTWF0RW5kRGF0ZSwgbXVsdGk6IHRydWV9LFxuICBdLFxuICAvLyBUaGVzZSBuZWVkIHRvIGJlIHNwZWNpZmllZCBleHBsaWNpdGx5LCBiZWNhdXNlIHNvbWUgdG9vbGluZyBkb2Vzbid0XG4gIC8vIHNlZW0gdG8gcGljayB0aGVtIHVwIGZyb20gdGhlIGJhc2UgY2xhc3MuIFNlZSAjMjA5MzIuXG4gIG91dHB1dHM6IFsnZGF0ZUNoYW5nZScsICdkYXRlSW5wdXQnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTWF0RW5kRGF0ZTxEPiBleHRlbmRzIE1hdERhdGVSYW5nZUlucHV0UGFydEJhc2U8RD4ge1xuICAvKiogVmFsaWRhdG9yIHRoYXQgY2hlY2tzIHRoYXQgdGhlIGVuZCBkYXRlIGlzbid0IGJlZm9yZSB0aGUgc3RhcnQgZGF0ZS4gKi9cbiAgcHJpdmF0ZSBfZW5kVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgZW5kID0gdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWUpKTtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX21vZGVsID8gdGhpcy5fbW9kZWwuc2VsZWN0aW9uLnN0YXJ0IDogbnVsbDtcbiAgICByZXR1cm4gIWVuZCB8fCAhc3RhcnQgfHwgdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUoZW5kLCBzdGFydCkgPj0gMFxuICAgICAgPyBudWxsXG4gICAgICA6IHsnbWF0RW5kRGF0ZUludmFsaWQnOiB7J3N0YXJ0Jzogc3RhcnQsICdhY3R1YWwnOiBlbmR9fTtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1BVF9EQVRFX1JBTkdFX0lOUFVUX1BBUkVOVCkgcmFuZ2VJbnB1dDogTWF0RGF0ZVJhbmdlSW5wdXRQYXJlbnQ8RD4sXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICBkZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBAT3B0aW9uYWwoKSBwYXJlbnRGb3JtOiBOZ0Zvcm0sXG4gICAgQE9wdGlvbmFsKCkgcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgQE9wdGlvbmFsKCkgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPEQ+LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RBVEVfRk9STUFUUykgZGF0ZUZvcm1hdHM6IE1hdERhdGVGb3JtYXRzLFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIHJhbmdlSW5wdXQsXG4gICAgICBlbGVtZW50UmVmLFxuICAgICAgZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyLFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBwYXJlbnRGb3JtLFxuICAgICAgcGFyZW50Rm9ybUdyb3VwLFxuICAgICAgZGF0ZUFkYXB0ZXIsXG4gICAgICBkYXRlRm9ybWF0cyxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIF92YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoWy4uLnN1cGVyLl9nZXRWYWxpZGF0b3JzKCksIHRoaXMuX2VuZFZhbGlkYXRvcl0pO1xuXG4gIHByb3RlY3RlZCBfZ2V0VmFsdWVGcm9tTW9kZWwobW9kZWxWYWx1ZTogRGF0ZVJhbmdlPEQ+KSB7XG4gICAgcmV0dXJuIG1vZGVsVmFsdWUuZW5kO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9zaG91bGRIYW5kbGVDaGFuZ2VFdmVudChcbiAgICBjaGFuZ2U6IERhdGVTZWxlY3Rpb25Nb2RlbENoYW5nZTxEYXRlUmFuZ2U8RD4+LFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXN1cGVyLl9zaG91bGRIYW5kbGVDaGFuZ2VFdmVudChjaGFuZ2UpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAhY2hhbmdlLm9sZFZhbHVlPy5lbmRcbiAgICAgICAgPyAhIWNoYW5nZS5zZWxlY3Rpb24uZW5kXG4gICAgICAgIDogIWNoYW5nZS5zZWxlY3Rpb24uZW5kIHx8XG4gICAgICAgICAgICAhIXRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKGNoYW5nZS5vbGRWYWx1ZS5lbmQsIGNoYW5nZS5zZWxlY3Rpb24uZW5kKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Fzc2lnblZhbHVlVG9Nb2RlbCh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5fbW9kZWwpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gbmV3IERhdGVSYW5nZSh0aGlzLl9tb2RlbC5zZWxlY3Rpb24uc3RhcnQsIHZhbHVlKTtcbiAgICAgIHRoaXMuX21vZGVsLnVwZGF0ZVNlbGVjdGlvbihyYW5nZSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbW92ZUNhcmV0VG9FbmRPZlN0YXJ0SW5wdXQoKSB7XG4gICAgY29uc3Qgc3RhcnRJbnB1dCA9IHRoaXMuX3JhbmdlSW5wdXQuX3N0YXJ0SW5wdXQuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXJ0SW5wdXQudmFsdWU7XG5cbiAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgc3RhcnRJbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSh2YWx1ZS5sZW5ndGgsIHZhbHVlLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgc3RhcnRJbnB1dC5mb2N1cygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgX29uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaXNMdHIgPSB0aGlzLl9kaXI/LnZhbHVlICE9PSAncnRsJztcblxuICAgIC8vIElmIHRoZSB1c2VyIGlzIHByZXNzaW5nIGJhY2tzcGFjZSBvbiBhbiBlbXB0eSBlbmQgaW5wdXQsIG1vdmUgZm9jdXMgYmFjayB0byB0aGUgc3RhcnQuXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEJBQ0tTUEFDRSAmJiAhZWxlbWVudC52YWx1ZSkge1xuICAgICAgdGhpcy5fbW92ZUNhcmV0VG9FbmRPZlN0YXJ0SW5wdXQoKTtcbiAgICB9XG4gICAgLy8gSWYgdGhlIHVzZXIgaGl0cyBMRUZUIChMVFIpIHdoZW4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCAoYW5kIG5vXG4gICAgLy8gc2VsZWN0aW9uKSwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIHN0YXJ0IGlucHV0LlxuICAgIGVsc2UgaWYgKFxuICAgICAgKChldmVudC5rZXlDb2RlID09PSBMRUZUX0FSUk9XICYmIGlzTHRyKSB8fCAoZXZlbnQua2V5Q29kZSA9PT0gUklHSFRfQVJST1cgJiYgIWlzTHRyKSkgJiZcbiAgICAgIGVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgPT09IDAgJiZcbiAgICAgIGVsZW1lbnQuc2VsZWN0aW9uRW5kID09PSAwXG4gICAgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5fbW92ZUNhcmV0VG9FbmRPZlN0YXJ0SW5wdXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIuX29uS2V5ZG93bihldmVudCk7XG4gICAgfVxuICB9XG59XG4iXX0=