@angular/material 13.0.0-next.4 → 13.0.0-next.8

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 (1684) hide show
  1. package/autocomplete/autocomplete-module.d.ts +11 -7
  2. package/autocomplete/autocomplete-origin.d.ts +5 -0
  3. package/autocomplete/autocomplete-trigger.d.ts +5 -0
  4. package/autocomplete/autocomplete.d.ts +6 -1
  5. package/autocomplete/package.json +5 -5
  6. package/autocomplete/testing/package.json +5 -5
  7. package/badge/badge-module.d.ts +7 -7
  8. package/badge/badge.d.ts +19 -15
  9. package/badge/package.json +5 -5
  10. package/badge/testing/package.json +5 -5
  11. package/bottom-sheet/bottom-sheet-container.d.ts +6 -3
  12. package/bottom-sheet/bottom-sheet-module.d.ts +8 -7
  13. package/bottom-sheet/bottom-sheet.d.ts +3 -7
  14. package/bottom-sheet/package.json +5 -5
  15. package/bottom-sheet/testing/package.json +5 -5
  16. package/button/button-module.d.ts +6 -7
  17. package/button/button.d.ts +6 -1
  18. package/button/package.json +5 -5
  19. package/button/testing/package.json +5 -5
  20. package/button-toggle/button-toggle-module.d.ts +6 -7
  21. package/button-toggle/button-toggle.d.ts +6 -1
  22. package/button-toggle/package.json +5 -5
  23. package/button-toggle/testing/package.json +5 -5
  24. package/card/card-module.d.ts +6 -7
  25. package/card/card.d.ts +29 -7
  26. package/card/package.json +5 -5
  27. package/card/testing/package.json +5 -5
  28. package/checkbox/checkbox-module.d.ts +11 -7
  29. package/checkbox/checkbox-required-validator.d.ts +3 -0
  30. package/checkbox/checkbox.d.ts +4 -1
  31. package/checkbox/package.json +5 -5
  32. package/checkbox/testing/package.json +5 -5
  33. package/chips/chip-input.d.ts +3 -0
  34. package/chips/chip-list.d.ts +4 -1
  35. package/chips/chip.d.ts +10 -1
  36. package/chips/chips-module.d.ts +8 -7
  37. package/chips/package.json +5 -5
  38. package/chips/testing/package.json +5 -5
  39. package/core/common-behaviors/color.d.ts +2 -6
  40. package/core/common-behaviors/common-module.d.ts +5 -4
  41. package/core/common-behaviors/disable-ripple.d.ts +2 -6
  42. package/core/common-behaviors/disabled.d.ts +2 -6
  43. package/core/common-behaviors/error-state.d.ts +2 -6
  44. package/core/common-behaviors/index.d.ts +7 -6
  45. package/core/common-behaviors/initialized.d.ts +2 -6
  46. package/core/common-behaviors/tabindex.d.ts +2 -6
  47. package/core/datetime/index.d.ts +8 -7
  48. package/core/datetime/native-date-adapter.d.ts +3 -0
  49. package/core/error/error-options.d.ts +5 -7
  50. package/core/index.d.ts +0 -1
  51. package/core/line/line.d.ts +7 -0
  52. package/core/option/index.d.ts +10 -7
  53. package/core/option/optgroup.d.ts +6 -1
  54. package/core/option/option.d.ts +5 -0
  55. package/core/package.json +5 -5
  56. package/core/ripple/index.d.ts +7 -7
  57. package/core/ripple/ripple.d.ts +3 -0
  58. package/core/selection/index.d.ts +6 -7
  59. package/core/selection/pseudo-checkbox/pseudo-checkbox.d.ts +3 -7
  60. package/core/testing/package.json +5 -5
  61. package/core/typography/_typography.scss +7 -2
  62. package/datepicker/_datepicker-theme.scss +1 -4
  63. package/datepicker/calendar-body.d.ts +3 -0
  64. package/datepicker/calendar.d.ts +5 -0
  65. package/datepicker/date-range-input-parts.d.ts +8 -1
  66. package/datepicker/date-range-input.d.ts +3 -0
  67. package/datepicker/date-range-picker.d.ts +3 -7
  68. package/datepicker/date-range-selection-strategy.d.ts +3 -0
  69. package/datepicker/date-selection-model.d.ts +7 -0
  70. package/datepicker/datepicker-actions.d.ts +7 -0
  71. package/datepicker/datepicker-base.d.ts +7 -12
  72. package/datepicker/datepicker-input-base.d.ts +3 -0
  73. package/datepicker/datepicker-input.d.ts +3 -0
  74. package/datepicker/datepicker-intl.d.ts +3 -7
  75. package/datepicker/datepicker-module.d.ts +24 -7
  76. package/datepicker/datepicker-toggle.d.ts +5 -0
  77. package/datepicker/datepicker.d.ts +3 -7
  78. package/datepicker/index.d.ts +0 -4
  79. package/datepicker/month-view.d.ts +3 -7
  80. package/datepicker/multi-year-view.d.ts +3 -7
  81. package/datepicker/package.json +5 -5
  82. package/datepicker/testing/package.json +5 -5
  83. package/datepicker/year-view.d.ts +3 -7
  84. package/dialog/dialog-container.d.ts +5 -0
  85. package/dialog/dialog-content-directives.d.ts +9 -0
  86. package/dialog/dialog-module.d.ts +9 -7
  87. package/dialog/dialog.d.ts +5 -7
  88. package/dialog/package.json +5 -5
  89. package/dialog/testing/dialog-harness.d.ts +14 -11
  90. package/dialog/testing/package.json +5 -5
  91. package/divider/divider-module.d.ts +6 -7
  92. package/divider/divider.d.ts +3 -7
  93. package/divider/package.json +5 -5
  94. package/divider/testing/package.json +5 -5
  95. package/esm2020/autocomplete/autocomplete-module.mjs +58 -0
  96. package/esm2020/autocomplete/autocomplete-origin.mjs +38 -0
  97. package/esm2020/autocomplete/autocomplete-trigger.mjs +651 -0
  98. package/esm2020/autocomplete/autocomplete.mjs +216 -0
  99. package/{esm2015/autocomplete/index.js → esm2020/autocomplete/index.mjs} +0 -0
  100. package/{esm2015/autocomplete/public-api.js → esm2020/autocomplete/public-api.mjs} +0 -0
  101. package/{esm2015/autocomplete/testing/autocomplete-harness-filters.js → esm2020/autocomplete/testing/autocomplete-harness-filters.mjs} +0 -0
  102. package/esm2020/autocomplete/testing/autocomplete-harness.mjs +101 -0
  103. package/{esm2015/autocomplete/testing/index.js → esm2020/autocomplete/testing/index.mjs} +0 -0
  104. package/{esm2015/autocomplete/testing/public-api.js → esm2020/autocomplete/testing/public-api.mjs} +0 -0
  105. package/esm2020/badge/badge-module.mjs +33 -0
  106. package/esm2020/badge/badge.mjs +228 -0
  107. package/{esm2015/badge/index.js → esm2020/badge/index.mjs} +0 -0
  108. package/{esm2015/badge/public-api.js → esm2020/badge/public-api.mjs} +0 -0
  109. package/{esm2015/badge/testing/badge-harness-filters.js → esm2020/badge/testing/badge-harness-filters.mjs} +0 -0
  110. package/esm2020/badge/testing/badge-harness.mjs +72 -0
  111. package/{esm2015/badge/testing/index.js → esm2020/badge/testing/index.mjs} +0 -0
  112. package/{esm2015/badge/testing/public-api.js → esm2020/badge/testing/public-api.mjs} +0 -0
  113. package/{esm2015/bottom-sheet/bottom-sheet-animations.js → esm2020/bottom-sheet/bottom-sheet-animations.mjs} +0 -0
  114. package/{esm2015/bottom-sheet/bottom-sheet-config.js → esm2020/bottom-sheet/bottom-sheet-config.mjs} +0 -0
  115. package/esm2020/bottom-sheet/bottom-sheet-container.mjs +230 -0
  116. package/esm2020/bottom-sheet/bottom-sheet-module.mjs +38 -0
  117. package/esm2020/bottom-sheet/bottom-sheet-ref.mjs +91 -0
  118. package/esm2020/bottom-sheet/bottom-sheet.mjs +172 -0
  119. package/{esm2015/bottom-sheet/index.js → esm2020/bottom-sheet/index.mjs} +0 -0
  120. package/{esm2015/bottom-sheet/public-api.js → esm2020/bottom-sheet/public-api.mjs} +0 -0
  121. package/{esm2015/bottom-sheet/testing/bottom-sheet-harness-filters.js → esm2020/bottom-sheet/testing/bottom-sheet-harness-filters.mjs} +0 -0
  122. package/esm2020/bottom-sheet/testing/bottom-sheet-harness.mjs +35 -0
  123. package/{esm2015/bottom-sheet/testing/index.js → esm2020/bottom-sheet/testing/index.mjs} +0 -0
  124. package/{esm2015/bottom-sheet/testing/public-api.js → esm2020/bottom-sheet/testing/public-api.mjs} +0 -0
  125. package/esm2020/button/button-module.mjs +42 -0
  126. package/esm2020/button/button.mjs +153 -0
  127. package/{esm2015/button/index.js → esm2020/button/index.mjs} +0 -0
  128. package/{esm2015/button/public-api.js → esm2020/button/public-api.mjs} +0 -0
  129. package/{esm2015/button/testing/button-harness-filters.js → esm2020/button/testing/button-harness-filters.mjs} +0 -0
  130. package/esm2020/button/testing/button-harness.mjs +51 -0
  131. package/{esm2015/button/testing/index.js → esm2020/button/testing/index.mjs} +0 -0
  132. package/{esm2015/button/testing/public-api.js → esm2020/button/testing/public-api.mjs} +0 -0
  133. package/esm2020/button-toggle/button-toggle-module.mjs +25 -0
  134. package/esm2020/button-toggle/button-toggle.mjs +470 -0
  135. package/{esm2015/button-toggle/index.js → esm2020/button-toggle/index.mjs} +0 -0
  136. package/{esm2015/button-toggle/public-api.js → esm2020/button-toggle/public-api.mjs} +0 -0
  137. package/{esm2015/button-toggle/testing/button-toggle-group-harness-filters.js → esm2020/button-toggle/testing/button-toggle-group-harness-filters.mjs} +0 -0
  138. package/esm2020/button-toggle/testing/button-toggle-group-harness.mjs +45 -0
  139. package/{esm2015/button-toggle/testing/button-toggle-harness-filters.js → esm2020/button-toggle/testing/button-toggle-harness-filters.mjs} +0 -0
  140. package/esm2020/button-toggle/testing/button-toggle-harness.mjs +98 -0
  141. package/{esm2015/button-toggle/testing/index.js → esm2020/button-toggle/testing/index.mjs} +0 -0
  142. package/{esm2015/button-toggle/testing/public-api.js → esm2020/button-toggle/testing/public-api.mjs} +0 -0
  143. package/esm2020/card/card-module.mjs +61 -0
  144. package/esm2020/card/card.mjs +247 -0
  145. package/{esm2015/card/index.js → esm2020/card/index.mjs} +0 -0
  146. package/{esm2015/card/public-api.js → esm2020/card/public-api.mjs} +0 -0
  147. package/{esm2015/card/testing/card-harness-filters.js → esm2020/card/testing/card-harness-filters.mjs} +0 -0
  148. package/esm2020/card/testing/card-harness.mjs +43 -0
  149. package/{esm2015/card/testing/index.js → esm2020/card/testing/index.mjs} +0 -0
  150. package/{esm2015/card/testing/public-api.js → esm2020/card/testing/public-api.mjs} +0 -0
  151. package/{esm2015/checkbox/checkbox-config.js → esm2020/checkbox/checkbox-config.mjs} +0 -0
  152. package/esm2020/checkbox/checkbox-module.mjs +46 -0
  153. package/esm2020/checkbox/checkbox-required-validator.mjs +33 -0
  154. package/esm2020/checkbox/checkbox.mjs +403 -0
  155. package/{esm2015/checkbox/index.js → esm2020/checkbox/index.mjs} +0 -0
  156. package/{esm2015/checkbox/public-api.js → esm2020/checkbox/public-api.mjs} +0 -0
  157. package/{esm2015/checkbox/testing/checkbox-harness-filters.js → esm2020/checkbox/testing/checkbox-harness-filters.mjs} +0 -0
  158. package/esm2020/checkbox/testing/checkbox-harness.mjs +123 -0
  159. package/{esm2015/checkbox/testing/index.js → esm2020/checkbox/testing/index.mjs} +0 -0
  160. package/{esm2015/checkbox/testing/public-api.js → esm2020/checkbox/testing/public-api.mjs} +0 -0
  161. package/{esm2015/chips/chip-default-options.js → esm2020/chips/chip-default-options.mjs} +0 -0
  162. package/esm2020/chips/chip-input.mjs +192 -0
  163. package/esm2020/chips/chip-list.mjs +673 -0
  164. package/{esm2015/chips/chip-text-control.js → esm2020/chips/chip-text-control.mjs} +0 -0
  165. package/esm2020/chips/chip.mjs +415 -0
  166. package/esm2020/chips/chips-module.mjs +64 -0
  167. package/{esm2015/chips/index.js → esm2020/chips/index.mjs} +0 -0
  168. package/{esm2015/chips/public-api.js → esm2020/chips/public-api.mjs} +0 -0
  169. package/{esm2015/chips/testing/chip-avatar-harness.js → esm2020/chips/testing/chip-avatar-harness.mjs} +0 -0
  170. package/{esm2015/chips/testing/chip-harness-filters.js → esm2020/chips/testing/chip-harness-filters.mjs} +0 -0
  171. package/esm2020/chips/testing/chip-harness.mjs +91 -0
  172. package/esm2020/chips/testing/chip-input-harness.mjs +82 -0
  173. package/esm2020/chips/testing/chip-list-harness.mjs +82 -0
  174. package/esm2020/chips/testing/chip-listbox-harness.mjs +44 -0
  175. package/esm2020/chips/testing/chip-option-harness.mjs +45 -0
  176. package/esm2020/chips/testing/chip-remove-harness.mjs +26 -0
  177. package/{esm2015/chips/testing/index.js → esm2020/chips/testing/index.mjs} +0 -0
  178. package/{esm2015/chips/testing/public-api.js → esm2020/chips/testing/public-api.mjs} +0 -0
  179. package/{esm2015/core/animation/animation.js → esm2020/core/animation/animation.mjs} +0 -0
  180. package/esm2020/core/common-behaviors/color.mjs +31 -0
  181. package/esm2020/core/common-behaviors/common-module.mjs +122 -0
  182. package/{esm2015/core/common-behaviors/constructor.js → esm2020/core/common-behaviors/constructor.mjs} +0 -0
  183. package/esm2020/core/common-behaviors/disable-ripple.mjs +20 -0
  184. package/esm2020/core/common-behaviors/disabled.mjs +19 -0
  185. package/esm2020/core/common-behaviors/error-state.mjs +36 -0
  186. package/esm2020/core/common-behaviors/index.mjs +15 -0
  187. package/esm2020/core/common-behaviors/initialized.mjs +58 -0
  188. package/esm2020/core/common-behaviors/tabindex.mjs +23 -0
  189. package/{esm2015/core/datetime/date-adapter.js → esm2020/core/datetime/date-adapter.mjs} +0 -0
  190. package/{esm2015/core/datetime/date-formats.js → esm2020/core/datetime/date-formats.mjs} +0 -0
  191. package/esm2020/core/datetime/index.mjs +47 -0
  192. package/esm2020/core/datetime/native-date-adapter.mjs +218 -0
  193. package/{esm2015/core/datetime/native-date-formats.js → esm2020/core/datetime/native-date-formats.mjs} +0 -0
  194. package/esm2020/core/error/error-options.mjs +33 -0
  195. package/esm2020/core/index.mjs +5 -0
  196. package/esm2020/core/line/line.mjs +64 -0
  197. package/esm2020/core/option/index.mjs +32 -0
  198. package/esm2020/core/option/optgroup.mjs +73 -0
  199. package/{esm2015/core/option/option-parent.js → esm2020/core/option/option-parent.mjs} +0 -0
  200. package/esm2020/core/option/option.mjs +276 -0
  201. package/{esm2015/core/public-api.js → esm2020/core/public-api.mjs} +0 -0
  202. package/esm2020/core/ripple/index.mjs +29 -0
  203. package/{esm2015/core/ripple/ripple-ref.js → esm2020/core/ripple/ripple-ref.mjs} +0 -0
  204. package/esm2020/core/ripple/ripple-renderer.mjs +261 -0
  205. package/esm2020/core/ripple/ripple.mjs +152 -0
  206. package/esm2020/core/selection/index.mjs +26 -0
  207. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +54 -0
  208. package/{esm2015/core/testing/index.js → esm2020/core/testing/index.mjs} +0 -0
  209. package/{esm2015/core/testing/optgroup-harness-filters.js → esm2020/core/testing/optgroup-harness-filters.mjs} +0 -0
  210. package/esm2020/core/testing/optgroup-harness.mjs +44 -0
  211. package/{esm2015/core/testing/option-harness-filters.js → esm2020/core/testing/option-harness-filters.mjs} +0 -0
  212. package/esm2020/core/testing/option-harness.mjs +54 -0
  213. package/{esm2015/core/testing/public-api.js → esm2020/core/testing/public-api.mjs} +0 -0
  214. package/esm2020/core/version.mjs +11 -0
  215. package/esm2020/datepicker/calendar-body.mjs +298 -0
  216. package/esm2020/datepicker/calendar.mjs +354 -0
  217. package/esm2020/datepicker/date-range-input-parts.mjs +342 -0
  218. package/esm2020/datepicker/date-range-input.mjs +331 -0
  219. package/esm2020/datepicker/date-range-picker.mjs +48 -0
  220. package/esm2020/datepicker/date-range-selection-strategy.mjs +59 -0
  221. package/esm2020/datepicker/date-selection-model.mjs +187 -0
  222. package/esm2020/datepicker/datepicker-actions.mjs +89 -0
  223. package/{esm2015/datepicker/datepicker-animations.js → esm2020/datepicker/datepicker-animations.mjs} +0 -0
  224. package/esm2020/datepicker/datepicker-base.mjs +549 -0
  225. package/{esm2015/datepicker/datepicker-errors.js → esm2020/datepicker/datepicker-errors.mjs} +0 -0
  226. package/esm2020/datepicker/datepicker-input-base.mjs +298 -0
  227. package/esm2020/datepicker/datepicker-input.mjs +183 -0
  228. package/esm2020/datepicker/datepicker-intl.mjs +53 -0
  229. package/esm2020/datepicker/datepicker-module.mjs +148 -0
  230. package/esm2020/datepicker/datepicker-toggle.mjs +113 -0
  231. package/esm2020/datepicker/datepicker.mjs +37 -0
  232. package/esm2020/datepicker/index.mjs +5 -0
  233. package/esm2020/datepicker/month-view.mjs +364 -0
  234. package/esm2020/datepicker/multi-year-view.mjs +289 -0
  235. package/{esm2015/datepicker/public-api.js → esm2020/datepicker/public-api.mjs} +0 -0
  236. package/esm2020/datepicker/testing/calendar-cell-harness.mjs +138 -0
  237. package/esm2020/datepicker/testing/calendar-harness.mjs +76 -0
  238. package/esm2020/datepicker/testing/date-range-input-harness.mjs +99 -0
  239. package/{esm2015/datepicker/testing/datepicker-harness-filters.js → esm2020/datepicker/testing/datepicker-harness-filters.mjs} +0 -0
  240. package/esm2020/datepicker/testing/datepicker-input-harness-base.mjs +81 -0
  241. package/esm2020/datepicker/testing/datepicker-input-harness.mjs +58 -0
  242. package/esm2020/datepicker/testing/datepicker-toggle-harness.mjs +41 -0
  243. package/esm2020/datepicker/testing/datepicker-trigger-harness-base.mjs +65 -0
  244. package/{esm2015/datepicker/testing/index.js → esm2020/datepicker/testing/index.mjs} +0 -0
  245. package/{esm2015/datepicker/testing/public-api.js → esm2020/datepicker/testing/public-api.mjs} +0 -0
  246. package/esm2020/datepicker/year-view.mjs +281 -0
  247. package/{esm2015/dialog/dialog-animations.js → esm2020/dialog/dialog-animations.mjs} +0 -0
  248. package/{esm2015/dialog/dialog-config.js → esm2020/dialog/dialog-config.mjs} +0 -0
  249. package/esm2020/dialog/dialog-container.mjs +282 -0
  250. package/esm2020/dialog/dialog-content-directives.mjs +172 -0
  251. package/esm2020/dialog/dialog-module.mjs +69 -0
  252. package/esm2020/dialog/dialog-ref.mjs +196 -0
  253. package/esm2020/dialog/dialog.mjs +358 -0
  254. package/{esm2015/dialog/index.js → esm2020/dialog/index.mjs} +0 -0
  255. package/{esm2015/dialog/public-api.js → esm2020/dialog/public-api.mjs} +0 -0
  256. package/{esm2015/dialog/testing/dialog-harness-filters.js → esm2020/dialog/testing/dialog-harness-filters.mjs} +0 -0
  257. package/esm2020/dialog/testing/dialog-harness.mjs +83 -0
  258. package/{esm2015/dialog/testing/index.js → esm2020/dialog/testing/index.mjs} +0 -0
  259. package/{esm2015/dialog/testing/public-api.js → esm2020/dialog/testing/public-api.mjs} +0 -0
  260. package/esm2020/divider/divider-module.mjs +25 -0
  261. package/esm2020/divider/divider.mjs +40 -0
  262. package/{esm2015/divider/index.js → esm2020/divider/index.mjs} +0 -0
  263. package/{esm2015/divider/public-api.js → esm2020/divider/public-api.mjs} +0 -0
  264. package/{esm2015/divider/testing/divider-harness-filters.js → esm2020/divider/testing/divider-harness-filters.mjs} +0 -0
  265. package/esm2020/divider/testing/divider-harness.mjs +22 -0
  266. package/{esm2015/divider/testing/index.js → esm2020/divider/testing/index.mjs} +0 -0
  267. package/{esm2015/divider/testing/public-api.js → esm2020/divider/testing/public-api.mjs} +0 -0
  268. package/{esm2015/expansion/accordion-base.js → esm2020/expansion/accordion-base.mjs} +0 -0
  269. package/esm2020/expansion/accordion.mjs +93 -0
  270. package/{esm2015/expansion/expansion-animations.js → esm2020/expansion/expansion-animations.mjs} +0 -0
  271. package/esm2020/expansion/expansion-module.mjs +59 -0
  272. package/esm2020/expansion/expansion-panel-content.mjs +27 -0
  273. package/esm2020/expansion/expansion-panel-header.mjs +226 -0
  274. package/esm2020/expansion/expansion-panel.mjs +195 -0
  275. package/{esm2015/expansion/index.js → esm2020/expansion/index.mjs} +0 -0
  276. package/{esm2015/expansion/public-api.js → esm2020/expansion/public-api.mjs} +0 -0
  277. package/esm2020/expansion/testing/accordion-harness.mjs +31 -0
  278. package/{esm2015/expansion/testing/expansion-harness-filters.js → esm2020/expansion/testing/expansion-harness-filters.mjs} +0 -0
  279. package/esm2020/expansion/testing/expansion-harness.mjs +120 -0
  280. package/{esm2015/expansion/testing/index.js → esm2020/expansion/testing/index.mjs} +0 -0
  281. package/{esm2015/expansion/testing/public-api.js → esm2020/expansion/testing/public-api.mjs} +0 -0
  282. package/esm2020/form-field/error.mjs +47 -0
  283. package/{esm2015/form-field/form-field-animations.js → esm2020/form-field/form-field-animations.mjs} +0 -0
  284. package/esm2020/form-field/form-field-control.mjs +11 -0
  285. package/{esm2015/form-field/form-field-errors.js → esm2020/form-field/form-field-errors.mjs} +0 -0
  286. package/esm2020/form-field/form-field-module.mjs +73 -0
  287. package/esm2020/form-field/form-field.mjs +510 -0
  288. package/esm2020/form-field/hint.mjs +49 -0
  289. package/{esm2015/form-field/index.js → esm2020/form-field/index.mjs} +0 -0
  290. package/esm2020/form-field/label.mjs +21 -0
  291. package/esm2020/form-field/placeholder.mjs +26 -0
  292. package/esm2020/form-field/prefix.mjs +28 -0
  293. package/{esm2015/form-field/public-api.js → esm2020/form-field/public-api.mjs} +0 -0
  294. package/esm2020/form-field/suffix.mjs +28 -0
  295. package/{esm2015/form-field/testing/control/form-field-control-harness.js → esm2020/form-field/testing/control/form-field-control-harness.mjs} +0 -0
  296. package/{esm2015/form-field/testing/control/index.js → esm2020/form-field/testing/control/index.mjs} +0 -0
  297. package/{esm2015/form-field/testing/form-field-harness-filters.js → esm2020/form-field/testing/form-field-harness-filters.mjs} +0 -0
  298. package/esm2020/form-field/testing/form-field-harness.mjs +181 -0
  299. package/{esm2015/form-field/testing/index.js → esm2020/form-field/testing/index.mjs} +0 -0
  300. package/{esm2015/form-field/testing/public-api.js → esm2020/form-field/testing/public-api.mjs} +0 -0
  301. package/{esm2015/grid-list/grid-list-base.js → esm2020/grid-list/grid-list-base.mjs} +0 -0
  302. package/esm2020/grid-list/grid-list-module.mjs +55 -0
  303. package/esm2020/grid-list/grid-list.mjs +135 -0
  304. package/esm2020/grid-list/grid-tile.mjs +117 -0
  305. package/esm2020/grid-list/index.mjs +5 -0
  306. package/{esm2015/grid-list/public-api.js → esm2020/grid-list/public-api.mjs} +0 -0
  307. package/{esm2015/grid-list/testing/grid-list-harness-filters.js → esm2020/grid-list/testing/grid-list-harness-filters.mjs} +0 -0
  308. package/esm2020/grid-list/testing/grid-list-harness.mjs +72 -0
  309. package/esm2020/grid-list/testing/grid-tile-harness.mjs +65 -0
  310. package/{esm2015/grid-list/testing/index.js → esm2020/grid-list/testing/index.mjs} +0 -0
  311. package/{esm2015/grid-list/testing/public-api.js → esm2020/grid-list/testing/public-api.mjs} +0 -0
  312. package/{esm2015/grid-list/tile-coordinator.js → esm2020/grid-list/tile-coordinator.mjs} +0 -0
  313. package/{esm2015/grid-list/tile-styler.js → esm2020/grid-list/tile-styler.mjs} +0 -0
  314. package/{esm2015/icon/fake-svgs.js → esm2020/icon/fake-svgs.mjs} +0 -0
  315. package/esm2020/icon/icon-module.mjs +25 -0
  316. package/esm2020/icon/icon-registry.mjs +582 -0
  317. package/esm2020/icon/icon.mjs +357 -0
  318. package/{esm2015/icon/index.js → esm2020/icon/index.mjs} +0 -0
  319. package/{esm2015/icon/public-api.js → esm2020/icon/public-api.mjs} +0 -0
  320. package/esm2020/icon/testing/fake-icon-registry.mjs +92 -0
  321. package/{esm2015/icon/testing/icon-harness-filters.js → esm2020/icon/testing/icon-harness-filters.mjs} +0 -0
  322. package/esm2020/icon/testing/icon-harness.mjs +54 -0
  323. package/{esm2015/icon/testing/index.js → esm2020/icon/testing/index.mjs} +0 -0
  324. package/{esm2015/icon/testing/public-api.js → esm2020/icon/testing/public-api.mjs} +0 -0
  325. package/esm2020/icon/trusted-types.mjs +43 -0
  326. package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  327. package/{esm2015/input/index.js → esm2020/input/index.mjs} +0 -0
  328. package/{esm2015/input/input-errors.js → esm2020/input/input-errors.mjs} +0 -0
  329. package/esm2020/input/input-module.mjs +51 -0
  330. package/{esm2015/input/input-value-accessor.js → esm2020/input/input-value-accessor.mjs} +0 -0
  331. package/esm2020/input/input.mjs +428 -0
  332. package/esm2020/input/public-api.mjs +12 -0
  333. package/{esm2015/input/testing/index.js → esm2020/input/testing/index.mjs} +0 -0
  334. package/{esm2015/input/testing/input-harness-filters.js → esm2020/input/testing/input-harness-filters.mjs} +0 -0
  335. package/esm2020/input/testing/input-harness.mjs +113 -0
  336. package/esm2020/input/testing/native-option-harness.mjs +42 -0
  337. package/{esm2015/input/testing/native-select-harness-filters.js → esm2020/input/testing/native-select-harness-filters.mjs} +0 -0
  338. package/esm2020/input/testing/native-select-harness.mjs +79 -0
  339. package/{esm2015/input/testing/public-api.js → esm2020/input/testing/public-api.mjs} +0 -0
  340. package/{esm2015/list/index.js → esm2020/list/index.mjs} +0 -0
  341. package/esm2020/list/list-module.mjs +71 -0
  342. package/esm2020/list/list.mjs +216 -0
  343. package/{esm2015/list/public-api.js → esm2020/list/public-api.mjs} +0 -0
  344. package/esm2020/list/selection-list.mjs +612 -0
  345. package/esm2020/list/testing/action-list-harness.mjs +59 -0
  346. package/{esm2015/list/testing/index.js → esm2020/list/testing/index.mjs} +0 -0
  347. package/esm2020/list/testing/list-harness-base.mjs +88 -0
  348. package/{esm2015/list/testing/list-harness-filters.js → esm2020/list/testing/list-harness-filters.mjs} +0 -0
  349. package/{esm2015/list/testing/list-harness.js → esm2020/list/testing/list-harness.mjs} +0 -0
  350. package/esm2020/list/testing/list-item-harness-base.mjs +72 -0
  351. package/esm2020/list/testing/nav-list-harness.mjs +64 -0
  352. package/{esm2015/list/testing/public-api.js → esm2020/list/testing/public-api.mjs} +0 -0
  353. package/esm2020/list/testing/selection-list-harness.mjs +125 -0
  354. package/esm2020/menu/index.mjs +5 -0
  355. package/{esm2015/menu/menu-animations.js → esm2020/menu/menu-animations.mjs} +0 -0
  356. package/esm2020/menu/menu-content.mjs +97 -0
  357. package/{esm2015/menu/menu-errors.js → esm2020/menu/menu-errors.mjs} +0 -0
  358. package/esm2020/menu/menu-item.mjs +164 -0
  359. package/esm2020/menu/menu-module.mjs +58 -0
  360. package/{esm2015/menu/menu-panel.js → esm2020/menu/menu-panel.mjs} +0 -0
  361. package/{esm2015/menu/menu-positions.js → esm2020/menu/menu-positions.mjs} +0 -0
  362. package/esm2020/menu/menu-trigger.mjs +540 -0
  363. package/esm2020/menu/menu.mjs +401 -0
  364. package/esm2020/menu/public-api.mjs +16 -0
  365. package/{esm2015/menu/testing/index.js → esm2020/menu/testing/index.mjs} +0 -0
  366. package/{esm2015/menu/testing/menu-harness-filters.js → esm2020/menu/testing/menu-harness-filters.mjs} +0 -0
  367. package/esm2020/menu/testing/menu-harness.mjs +183 -0
  368. package/{esm2015/menu/testing/public-api.js → esm2020/menu/testing/public-api.mjs} +0 -0
  369. package/{esm2015/paginator/index.js → esm2020/paginator/index.mjs} +0 -0
  370. package/esm2020/paginator/paginator-intl.mjs +64 -0
  371. package/esm2020/paginator/paginator-module.mjs +47 -0
  372. package/esm2020/paginator/paginator.mjs +268 -0
  373. package/{esm2015/paginator/public-api.js → esm2020/paginator/public-api.mjs} +0 -0
  374. package/{esm2015/paginator/testing/index.js → esm2020/paginator/testing/index.mjs} +0 -0
  375. package/{esm2015/paginator/testing/paginator-harness-filters.js → esm2020/paginator/testing/paginator-harness-filters.mjs} +0 -0
  376. package/esm2020/paginator/testing/paginator-harness.mjs +91 -0
  377. package/{esm2015/paginator/testing/public-api.js → esm2020/paginator/testing/public-api.mjs} +0 -0
  378. package/{esm2015/progress-bar/index.js → esm2020/progress-bar/index.mjs} +0 -0
  379. package/esm2020/progress-bar/progress-bar-module.mjs +26 -0
  380. package/esm2020/progress-bar/progress-bar.mjs +187 -0
  381. package/{esm2015/progress-bar/public-api.js → esm2020/progress-bar/public-api.mjs} +0 -0
  382. package/{esm2015/progress-bar/testing/index.js → esm2020/progress-bar/testing/index.mjs} +0 -0
  383. package/{esm2015/progress-bar/testing/progress-bar-harness-filters.js → esm2020/progress-bar/testing/progress-bar-harness-filters.mjs} +0 -0
  384. package/esm2020/progress-bar/testing/progress-bar-harness.mjs +34 -0
  385. package/{esm2015/progress-bar/testing/public-api.js → esm2020/progress-bar/testing/public-api.mjs} +0 -0
  386. package/{esm2015/progress-spinner/index.js → esm2020/progress-spinner/index.mjs} +0 -0
  387. package/esm2020/progress-spinner/progress-spinner-module.mjs +36 -0
  388. package/esm2020/progress-spinner/progress-spinner.mjs +280 -0
  389. package/{esm2015/progress-spinner/public-api.js → esm2020/progress-spinner/public-api.mjs} +0 -0
  390. package/{esm2015/progress-spinner/testing/index.js → esm2020/progress-spinner/testing/index.mjs} +0 -0
  391. package/{esm2015/progress-spinner/testing/progress-spinner-harness-filters.js → esm2020/progress-spinner/testing/progress-spinner-harness-filters.mjs} +0 -0
  392. package/esm2020/progress-spinner/testing/progress-spinner-harness.mjs +35 -0
  393. package/{esm2015/progress-spinner/testing/public-api.js → esm2020/progress-spinner/testing/public-api.mjs} +0 -0
  394. package/{esm2015/radio/index.js → esm2020/radio/index.mjs} +0 -0
  395. package/{esm2015/radio/public-api.js → esm2020/radio/public-api.mjs} +0 -0
  396. package/esm2020/radio/radio-module.mjs +25 -0
  397. package/esm2020/radio/radio.mjs +570 -0
  398. package/{esm2015/radio/testing/index.js → esm2020/radio/testing/index.mjs} +0 -0
  399. package/{esm2015/radio/testing/public-api.js → esm2020/radio/testing/public-api.mjs} +0 -0
  400. package/{esm2015/radio/testing/radio-harness-filters.js → esm2020/radio/testing/radio-harness-filters.mjs} +0 -0
  401. package/esm2020/radio/testing/radio-harness.mjs +231 -0
  402. package/{esm2015/select/index.js → esm2020/select/index.mjs} +0 -0
  403. package/{esm2015/select/public-api.js → esm2020/select/public-api.mjs} +0 -0
  404. package/{esm2015/select/select-animations.js → esm2020/select/select-animations.mjs} +0 -0
  405. package/{esm2015/select/select-errors.js → esm2020/select/select-errors.mjs} +0 -0
  406. package/esm2020/select/select-module.mjs +58 -0
  407. package/esm2020/select/select.mjs +1188 -0
  408. package/{esm2015/select/testing/index.js → esm2020/select/testing/index.mjs} +0 -0
  409. package/{esm2015/select/testing/public-api.js → esm2020/select/testing/public-api.mjs} +0 -0
  410. package/{esm2015/select/testing/select-harness-filters.js → esm2020/select/testing/select-harness-filters.mjs} +0 -0
  411. package/esm2020/select/testing/select-harness.mjs +130 -0
  412. package/{esm2015/sidenav/drawer-animations.js → esm2020/sidenav/drawer-animations.mjs} +0 -0
  413. package/esm2020/sidenav/drawer.mjs +788 -0
  414. package/esm2020/sidenav/index.mjs +5 -0
  415. package/{esm2015/sidenav/public-api.js → esm2020/sidenav/public-api.mjs} +0 -0
  416. package/esm2020/sidenav/sidenav-module.mjs +71 -0
  417. package/esm2020/sidenav/sidenav.mjs +115 -0
  418. package/esm2020/sidenav/testing/drawer-container-harness.mjs +36 -0
  419. package/{esm2015/sidenav/testing/drawer-content-harness.js → esm2020/sidenav/testing/drawer-content-harness.mjs} +0 -0
  420. package/{esm2015/sidenav/testing/drawer-harness-filters.js → esm2020/sidenav/testing/drawer-harness-filters.mjs} +0 -0
  421. package/esm2020/sidenav/testing/drawer-harness.mjs +50 -0
  422. package/{esm2015/sidenav/testing/index.js → esm2020/sidenav/testing/index.mjs} +0 -0
  423. package/{esm2015/sidenav/testing/public-api.js → esm2020/sidenav/testing/public-api.mjs} +0 -0
  424. package/esm2020/sidenav/testing/sidenav-container-harness.mjs +36 -0
  425. package/{esm2015/sidenav/testing/sidenav-content-harness.js → esm2020/sidenav/testing/sidenav-content-harness.mjs} +0 -0
  426. package/esm2020/sidenav/testing/sidenav-harness.mjs +29 -0
  427. package/{esm2015/slide-toggle/index.js → esm2020/slide-toggle/index.mjs} +0 -0
  428. package/{esm2015/slide-toggle/public-api.js → esm2020/slide-toggle/public-api.mjs} +0 -0
  429. package/{esm2015/slide-toggle/slide-toggle-config.js → esm2020/slide-toggle/slide-toggle-config.mjs} +0 -0
  430. package/esm2020/slide-toggle/slide-toggle-module.mjs +57 -0
  431. package/esm2020/slide-toggle/slide-toggle-required-validator.mjs +36 -0
  432. package/esm2020/slide-toggle/slide-toggle.mjs +253 -0
  433. package/{esm2015/slide-toggle/testing/index.js → esm2020/slide-toggle/testing/index.mjs} +0 -0
  434. package/{esm2015/slide-toggle/testing/public-api.js → esm2020/slide-toggle/testing/public-api.mjs} +0 -0
  435. package/{esm2015/slide-toggle/testing/slide-toggle-harness-filters.js → esm2020/slide-toggle/testing/slide-toggle-harness-filters.mjs} +0 -0
  436. package/esm2020/slide-toggle/testing/slide-toggle-harness.mjs +110 -0
  437. package/{esm2015/slider/index.js → esm2020/slider/index.mjs} +0 -0
  438. package/{esm2015/slider/public-api.js → esm2020/slider/public-api.mjs} +0 -0
  439. package/esm2020/slider/slider-module.mjs +26 -0
  440. package/esm2020/slider/slider.mjs +801 -0
  441. package/{esm2015/slider/testing/index.js → esm2020/slider/testing/index.mjs} +0 -0
  442. package/{esm2015/slider/testing/public-api.js → esm2020/slider/testing/public-api.mjs} +0 -0
  443. package/{esm2015/slider/testing/slider-harness-filters.js → esm2020/slider/testing/slider-harness-filters.mjs} +0 -0
  444. package/esm2020/slider/testing/slider-harness.mjs +114 -0
  445. package/{esm2015/snack-bar/index.js → esm2020/snack-bar/index.mjs} +0 -0
  446. package/{esm2015/snack-bar/public-api.js → esm2020/snack-bar/public-api.mjs} +0 -0
  447. package/esm2020/snack-bar/simple-snack-bar.mjs +44 -0
  448. package/{esm2015/snack-bar/snack-bar-animations.js → esm2020/snack-bar/snack-bar-animations.mjs} +0 -0
  449. package/{esm2015/snack-bar/snack-bar-config.js → esm2020/snack-bar/snack-bar-config.mjs} +0 -0
  450. package/esm2020/snack-bar/snack-bar-container.mjs +205 -0
  451. package/esm2020/snack-bar/snack-bar-module.mjs +47 -0
  452. package/esm2020/snack-bar/snack-bar-ref.mjs +90 -0
  453. package/esm2020/snack-bar/snack-bar.mjs +265 -0
  454. package/{esm2015/snack-bar/testing/index.js → esm2020/snack-bar/testing/index.mjs} +0 -0
  455. package/{esm2015/snack-bar/testing/public-api.js → esm2020/snack-bar/testing/public-api.mjs} +0 -0
  456. package/{esm2015/snack-bar/testing/snack-bar-harness-filters.js → esm2020/snack-bar/testing/snack-bar-harness-filters.mjs} +0 -0
  457. package/esm2020/snack-bar/testing/snack-bar-harness.mjs +118 -0
  458. package/{esm2015/sort/index.js → esm2020/sort/index.mjs} +0 -0
  459. package/{esm2015/sort/public-api.js → esm2020/sort/public-api.mjs} +0 -0
  460. package/{esm2015/sort/sort-animations.js → esm2020/sort/sort-animations.mjs} +0 -0
  461. package/{esm2015/sort/sort-direction.js → esm2020/sort/sort-direction.mjs} +0 -0
  462. package/{esm2015/sort/sort-errors.js → esm2020/sort/sort-errors.mjs} +0 -0
  463. package/esm2020/sort/sort-header-intl.mjs +43 -0
  464. package/esm2020/sort/sort-header.mjs +275 -0
  465. package/esm2020/sort/sort-module.mjs +29 -0
  466. package/esm2020/sort/sort.mjs +154 -0
  467. package/{esm2015/sort/testing/index.js → esm2020/sort/testing/index.mjs} +0 -0
  468. package/{esm2015/sort/testing/public-api.js → esm2020/sort/testing/public-api.mjs} +0 -0
  469. package/{esm2015/sort/testing/sort-harness-filters.js → esm2020/sort/testing/sort-harness-filters.mjs} +0 -0
  470. package/esm2020/sort/testing/sort-harness.mjs +36 -0
  471. package/esm2020/sort/testing/sort-header-harness.mjs +56 -0
  472. package/{esm2015/stepper/index.js → esm2020/stepper/index.mjs} +0 -0
  473. package/{esm2015/stepper/public-api.js → esm2020/stepper/public-api.mjs} +0 -0
  474. package/esm2020/stepper/step-content.mjs +26 -0
  475. package/esm2020/stepper/step-header.mjs +110 -0
  476. package/esm2020/stepper/step-label.mjs +21 -0
  477. package/{esm2015/stepper/stepper-animations.js → esm2020/stepper/stepper-animations.mjs} +0 -0
  478. package/esm2020/stepper/stepper-button.mjs +43 -0
  479. package/esm2020/stepper/stepper-icon.mjs +29 -0
  480. package/esm2020/stepper/stepper-intl.mjs +43 -0
  481. package/esm2020/stepper/stepper-module.mjs +97 -0
  482. package/esm2020/stepper/stepper.mjs +213 -0
  483. package/{esm2015/stepper/testing/index.js → esm2020/stepper/testing/index.mjs} +0 -0
  484. package/{esm2015/stepper/testing/public-api.js → esm2020/stepper/testing/public-api.mjs} +0 -0
  485. package/{esm2015/stepper/testing/step-harness-filters.js → esm2020/stepper/testing/step-harness-filters.mjs} +0 -0
  486. package/esm2020/stepper/testing/step-harness.mjs +90 -0
  487. package/esm2020/stepper/testing/stepper-button-harnesses.mjs +50 -0
  488. package/esm2020/stepper/testing/stepper-harness.mjs +50 -0
  489. package/esm2020/table/cell.mjs +139 -0
  490. package/{esm2015/table/index.js → esm2020/table/index.mjs} +0 -0
  491. package/{esm2015/table/public-api.js → esm2020/table/public-api.mjs} +0 -0
  492. package/esm2020/table/row.mjs +139 -0
  493. package/esm2020/table/table-data-source.mjs +310 -0
  494. package/esm2020/table/table-module.mjs +101 -0
  495. package/esm2020/table/table.mjs +71 -0
  496. package/esm2020/table/testing/cell-harness.mjs +72 -0
  497. package/{esm2015/table/testing/index.js → esm2020/table/testing/index.mjs} +0 -0
  498. package/{esm2015/table/testing/public-api.js → esm2020/table/testing/public-api.mjs} +0 -0
  499. package/esm2020/table/testing/row-harness.mjs +84 -0
  500. package/{esm2015/table/testing/table-harness-filters.js → esm2020/table/testing/table-harness-filters.mjs} +0 -0
  501. package/esm2020/table/testing/table-harness.mjs +88 -0
  502. package/esm2020/table/text-column.mjs +58 -0
  503. package/esm2020/tabs/index.mjs +5 -0
  504. package/esm2020/tabs/ink-bar.mjs +93 -0
  505. package/esm2020/tabs/paginated-tab-header.mjs +480 -0
  506. package/esm2020/tabs/public-api.mjs +20 -0
  507. package/esm2020/tabs/tab-body.mjs +214 -0
  508. package/{esm2015/tabs/tab-config.js → esm2020/tabs/tab-config.mjs} +0 -0
  509. package/esm2020/tabs/tab-content.mjs +32 -0
  510. package/esm2020/tabs/tab-group.mjs +382 -0
  511. package/esm2020/tabs/tab-header.mjs +101 -0
  512. package/esm2020/tabs/tab-label-wrapper.mjs +41 -0
  513. package/esm2020/tabs/tab-label.mjs +43 -0
  514. package/{esm2015/tabs/tab-nav-bar/index.js → esm2020/tabs/tab-nav-bar/index.mjs} +0 -0
  515. package/esm2020/tabs/tab-nav-bar/tab-nav-bar.mjs +263 -0
  516. package/esm2020/tabs/tab.mjs +106 -0
  517. package/{esm2015/tabs/tabs-animations.js → esm2020/tabs/tabs-animations.mjs} +0 -0
  518. package/esm2020/tabs/tabs-module.mjs +93 -0
  519. package/{esm2015/tabs/testing/index.js → esm2020/tabs/testing/index.mjs} +0 -0
  520. package/{esm2015/tabs/testing/public-api.js → esm2020/tabs/testing/public-api.mjs} +0 -0
  521. package/esm2020/tabs/testing/tab-group-harness.mjs +58 -0
  522. package/{esm2015/tabs/testing/tab-harness-filters.js → esm2020/tabs/testing/tab-harness-filters.mjs} +0 -0
  523. package/esm2020/tabs/testing/tab-harness.mjs +66 -0
  524. package/esm2020/tabs/testing/tab-link-harness.mjs +42 -0
  525. package/esm2020/tabs/testing/tab-nav-bar-harness.mjs +54 -0
  526. package/{esm2015/toolbar/index.js → esm2020/toolbar/index.mjs} +0 -0
  527. package/{esm2015/toolbar/public-api.js → esm2020/toolbar/public-api.mjs} +0 -0
  528. package/{esm2015/toolbar/testing/index.js → esm2020/toolbar/testing/index.mjs} +0 -0
  529. package/{esm2015/toolbar/testing/public-api.js → esm2020/toolbar/testing/public-api.mjs} +0 -0
  530. package/{esm2015/toolbar/testing/toolbar-harness-filters.js → esm2020/toolbar/testing/toolbar-harness-filters.mjs} +0 -0
  531. package/esm2020/toolbar/testing/toolbar-harness.mjs +40 -0
  532. package/esm2020/toolbar/toolbar-module.mjs +25 -0
  533. package/esm2020/toolbar/toolbar.mjs +88 -0
  534. package/{esm2015/tooltip/index.js → esm2020/tooltip/index.mjs} +0 -0
  535. package/{esm2015/tooltip/public-api.js → esm2020/tooltip/public-api.mjs} +0 -0
  536. package/{esm2015/tooltip/testing/index.js → esm2020/tooltip/testing/index.mjs} +0 -0
  537. package/{esm2015/tooltip/testing/public-api.js → esm2020/tooltip/testing/public-api.mjs} +0 -0
  538. package/{esm2015/tooltip/testing/tooltip-harness-filters.js → esm2020/tooltip/testing/tooltip-harness-filters.mjs} +0 -0
  539. package/esm2020/tooltip/testing/tooltip-harness.mjs +57 -0
  540. package/{esm2015/tooltip/tooltip-animations.js → esm2020/tooltip/tooltip-animations.mjs} +0 -0
  541. package/esm2020/tooltip/tooltip-module.mjs +44 -0
  542. package/esm2020/tooltip/tooltip.mjs +739 -0
  543. package/{esm2015/tree/data-source/flat-data-source.js → esm2020/tree/data-source/flat-data-source.mjs} +0 -0
  544. package/{esm2015/tree/data-source/nested-data-source.js → esm2020/tree/data-source/nested-data-source.mjs} +0 -0
  545. package/{esm2015/tree/index.js → esm2020/tree/index.mjs} +0 -0
  546. package/esm2020/tree/node.mjs +143 -0
  547. package/esm2020/tree/outlet.mjs +41 -0
  548. package/esm2020/tree/padding.mjs +37 -0
  549. package/{esm2015/tree/public-api.js → esm2020/tree/public-api.mjs} +0 -0
  550. package/{esm2015/tree/testing/index.js → esm2020/tree/testing/index.mjs} +0 -0
  551. package/esm2020/tree/testing/node-harness.mjs +69 -0
  552. package/{esm2015/tree/testing/public-api.js → esm2020/tree/testing/public-api.mjs} +0 -0
  553. package/{esm2015/tree/testing/tree-harness-filters.js → esm2020/tree/testing/tree-harness-filters.mjs} +0 -0
  554. package/esm2020/tree/testing/tree-harness.mjs +123 -0
  555. package/esm2020/tree/toggle.mjs +36 -0
  556. package/esm2020/tree/tree-module.mjs +51 -0
  557. package/esm2020/tree/tree.mjs +37 -0
  558. package/expansion/accordion.d.ts +3 -0
  559. package/expansion/expansion-module.d.ts +12 -7
  560. package/expansion/expansion-panel-content.d.ts +3 -0
  561. package/expansion/expansion-panel-header.d.ts +8 -1
  562. package/expansion/expansion-panel.d.ts +5 -0
  563. package/expansion/package.json +5 -5
  564. package/expansion/testing/package.json +5 -5
  565. package/fesm2015/autocomplete/testing.mjs +132 -0
  566. package/fesm2015/autocomplete/testing.mjs.map +1 -0
  567. package/fesm2015/autocomplete.mjs +958 -0
  568. package/fesm2015/autocomplete.mjs.map +1 -0
  569. package/fesm2015/badge/testing.mjs +97 -0
  570. package/fesm2015/badge/testing.mjs.map +1 -0
  571. package/fesm2015/badge.mjs +266 -0
  572. package/fesm2015/badge.mjs.map +1 -0
  573. package/fesm2015/bottom-sheet/testing.mjs +52 -0
  574. package/fesm2015/bottom-sheet/testing.mjs.map +1 -0
  575. package/fesm2015/bottom-sheet.mjs +596 -0
  576. package/fesm2015/bottom-sheet.mjs.map +1 -0
  577. package/fesm2015/button/testing.mjs +76 -0
  578. package/fesm2015/button/testing.mjs.map +1 -0
  579. package/fesm2015/button-toggle/testing.mjs +181 -0
  580. package/fesm2015/button-toggle/testing.mjs.map +1 -0
  581. package/fesm2015/button-toggle.mjs +502 -0
  582. package/fesm2015/button-toggle.mjs.map +1 -0
  583. package/fesm2015/button.mjs +202 -0
  584. package/fesm2015/button.mjs.map +1 -0
  585. package/fesm2015/card/testing.mjs +64 -0
  586. package/fesm2015/card/testing.mjs.map +1 -0
  587. package/fesm2015/card.mjs +322 -0
  588. package/fesm2015/card.mjs.map +1 -0
  589. package/fesm2015/checkbox/testing.mjs +168 -0
  590. package/fesm2015/checkbox/testing.mjs.map +1 -0
  591. package/fesm2015/checkbox.mjs +503 -0
  592. package/fesm2015/checkbox.mjs.map +1 -0
  593. package/fesm2015/chips/testing.mjs +423 -0
  594. package/fesm2015/chips/testing.mjs.map +1 -0
  595. package/fesm2015/chips.mjs +1354 -0
  596. package/fesm2015/chips.mjs.map +1 -0
  597. package/fesm2015/core/testing.mjs +120 -0
  598. package/fesm2015/core/testing.mjs.map +1 -0
  599. package/fesm2015/core.mjs +1719 -0
  600. package/fesm2015/core.mjs.map +1 -0
  601. package/fesm2015/datepicker/testing.mjs +635 -0
  602. package/fesm2015/datepicker/testing.mjs.map +1 -0
  603. package/fesm2015/datepicker.mjs +3948 -0
  604. package/fesm2015/datepicker.mjs.map +1 -0
  605. package/fesm2015/dialog/testing.mjs +119 -0
  606. package/fesm2015/dialog/testing.mjs.map +1 -0
  607. package/fesm2015/dialog.mjs +1155 -0
  608. package/fesm2015/dialog.mjs.map +1 -0
  609. package/fesm2015/divider/testing.mjs +39 -0
  610. package/fesm2015/divider/testing.mjs.map +1 -0
  611. package/fesm2015/divider.mjs +77 -0
  612. package/fesm2015/divider.mjs.map +1 -0
  613. package/fesm2015/expansion/testing.mjs +187 -0
  614. package/fesm2015/expansion/testing.mjs.map +1 -0
  615. package/fesm2015/expansion.mjs +641 -0
  616. package/fesm2015/expansion.mjs.map +1 -0
  617. package/fesm2015/form-field/testing/control.mjs +26 -0
  618. package/fesm2015/form-field/testing/control.mjs.map +1 -0
  619. package/fesm2015/form-field/testing.mjs +231 -0
  620. package/fesm2015/form-field/testing.mjs.map +1 -0
  621. package/fesm2015/form-field.mjs +814 -0
  622. package/fesm2015/form-field.mjs.map +1 -0
  623. package/fesm2015/grid-list/testing.mjs +161 -0
  624. package/fesm2015/grid-list/testing.mjs.map +1 -0
  625. package/fesm2015/grid-list.mjs +700 -0
  626. package/fesm2015/grid-list.mjs.map +1 -0
  627. package/fesm2015/icon/testing.mjs +163 -0
  628. package/fesm2015/icon/testing.mjs.map +1 -0
  629. package/fesm2015/icon.mjs +1016 -0
  630. package/fesm2015/icon.mjs.map +1 -0
  631. package/fesm2015/input/testing.mjs +281 -0
  632. package/fesm2015/input/testing.mjs.map +1 -0
  633. package/fesm2015/input.mjs +515 -0
  634. package/fesm2015/input.mjs.map +1 -0
  635. package/fesm2015/list/testing.mjs +486 -0
  636. package/fesm2015/list/testing.mjs.map +1 -0
  637. package/fesm2015/list.mjs +908 -0
  638. package/fesm2015/list.mjs.map +1 -0
  639. package/fesm2015/material.mjs +16 -0
  640. package/fesm2015/material.mjs.map +1 -0
  641. package/fesm2015/menu/testing.mjs +235 -0
  642. package/fesm2015/menu/testing.mjs.map +1 -0
  643. package/fesm2015/menu.mjs +1363 -0
  644. package/fesm2015/menu.mjs.map +1 -0
  645. package/fesm2015/paginator/testing.mjs +118 -0
  646. package/fesm2015/paginator/testing.mjs.map +1 -0
  647. package/fesm2015/paginator.mjs +387 -0
  648. package/fesm2015/paginator.mjs.map +1 -0
  649. package/fesm2015/progress-bar/testing.mjs +51 -0
  650. package/fesm2015/progress-bar/testing.mjs.map +1 -0
  651. package/fesm2015/progress-bar.mjs +225 -0
  652. package/fesm2015/progress-bar.mjs.map +1 -0
  653. package/fesm2015/progress-spinner/testing.mjs +52 -0
  654. package/fesm2015/progress-spinner/testing.mjs.map +1 -0
  655. package/fesm2015/progress-spinner.mjs +330 -0
  656. package/fesm2015/progress-spinner.mjs.map +1 -0
  657. package/fesm2015/radio/testing.mjs +284 -0
  658. package/fesm2015/radio/testing.mjs.map +1 -0
  659. package/fesm2015/radio.mjs +599 -0
  660. package/fesm2015/radio.mjs.map +1 -0
  661. package/fesm2015/select/testing.mjs +169 -0
  662. package/fesm2015/select/testing.mjs.map +1 -0
  663. package/fesm2015/select.mjs +1346 -0
  664. package/fesm2015/select.mjs.map +1 -0
  665. package/fesm2015/sidenav/testing.mjs +195 -0
  666. package/fesm2015/sidenav/testing.mjs.map +1 -0
  667. package/fesm2015/sidenav.mjs +1013 -0
  668. package/fesm2015/sidenav.mjs.map +1 -0
  669. package/fesm2015/slide-toggle/testing.mjs +151 -0
  670. package/fesm2015/slide-toggle/testing.mjs.map +1 -0
  671. package/fesm2015/slide-toggle.mjs +359 -0
  672. package/fesm2015/slide-toggle.mjs.map +1 -0
  673. package/fesm2015/slider/testing.mjs +153 -0
  674. package/fesm2015/slider/testing.mjs.map +1 -0
  675. package/fesm2015/slider.mjs +830 -0
  676. package/fesm2015/slider.mjs.map +1 -0
  677. package/fesm2015/snack-bar/testing.mjs +153 -0
  678. package/fesm2015/snack-bar/testing.mjs.map +1 -0
  679. package/fesm2015/snack-bar.mjs +698 -0
  680. package/fesm2015/snack-bar.mjs.map +1 -0
  681. package/fesm2015/sort/testing.mjs +110 -0
  682. package/fesm2015/sort/testing.mjs.map +1 -0
  683. package/fesm2015/sort.mjs +605 -0
  684. package/fesm2015/sort.mjs.map +1 -0
  685. package/fesm2015/stepper/testing.mjs +216 -0
  686. package/fesm2015/stepper/testing.mjs.map +1 -0
  687. package/fesm2015/stepper.mjs +579 -0
  688. package/fesm2015/stepper.mjs.map +1 -0
  689. package/fesm2015/table/testing.mjs +259 -0
  690. package/fesm2015/table/testing.mjs.map +1 -0
  691. package/fesm2015/table.mjs +817 -0
  692. package/fesm2015/table.mjs.map +1 -0
  693. package/fesm2015/tabs/testing.mjs +245 -0
  694. package/fesm2015/tabs/testing.mjs.map +1 -0
  695. package/fesm2015/tabs.mjs +1846 -0
  696. package/fesm2015/tabs.mjs.map +1 -0
  697. package/fesm2015/toolbar/testing.mjs +59 -0
  698. package/fesm2015/toolbar/testing.mjs.map +1 -0
  699. package/fesm2015/toolbar.mjs +118 -0
  700. package/fesm2015/toolbar.mjs.map +1 -0
  701. package/fesm2015/tooltip/testing.mjs +80 -0
  702. package/fesm2015/tooltip/testing.mjs.map +1 -0
  703. package/fesm2015/tooltip.mjs +820 -0
  704. package/fesm2015/tooltip.mjs.map +1 -0
  705. package/fesm2015/tree/testing.mjs +215 -0
  706. package/fesm2015/tree/testing.mjs.map +1 -0
  707. package/fesm2015/tree.mjs +520 -0
  708. package/fesm2015/tree.mjs.map +1 -0
  709. package/fesm2020/autocomplete/testing.mjs +128 -0
  710. package/fesm2020/autocomplete/testing.mjs.map +1 -0
  711. package/fesm2020/autocomplete.mjs +958 -0
  712. package/fesm2020/autocomplete.mjs.map +1 -0
  713. package/fesm2020/badge/testing.mjs +99 -0
  714. package/fesm2020/badge/testing.mjs.map +1 -0
  715. package/fesm2020/badge.mjs +271 -0
  716. package/fesm2020/badge.mjs.map +1 -0
  717. package/fesm2020/bottom-sheet/testing.mjs +62 -0
  718. package/fesm2020/bottom-sheet/testing.mjs.map +1 -0
  719. package/fesm2020/bottom-sheet.mjs +592 -0
  720. package/fesm2020/bottom-sheet.mjs.map +1 -0
  721. package/fesm2020/button/testing.mjs +78 -0
  722. package/fesm2020/button/testing.mjs.map +1 -0
  723. package/fesm2020/button-toggle/testing.mjs +176 -0
  724. package/fesm2020/button-toggle/testing.mjs.map +1 -0
  725. package/fesm2020/button-toggle.mjs +505 -0
  726. package/fesm2020/button-toggle.mjs.map +1 -0
  727. package/fesm2020/button.mjs +205 -0
  728. package/fesm2020/button.mjs.map +1 -0
  729. package/fesm2020/card/testing.mjs +70 -0
  730. package/fesm2020/card/testing.mjs.map +1 -0
  731. package/fesm2020/card.mjs +320 -0
  732. package/fesm2020/card.mjs.map +1 -0
  733. package/fesm2020/checkbox/testing.mjs +150 -0
  734. package/fesm2020/checkbox/testing.mjs.map +1 -0
  735. package/fesm2020/checkbox.mjs +507 -0
  736. package/fesm2020/checkbox.mjs.map +1 -0
  737. package/fesm2020/chips/testing.mjs +398 -0
  738. package/fesm2020/chips/testing.mjs.map +1 -0
  739. package/fesm2020/chips.mjs +1346 -0
  740. package/fesm2020/chips.mjs.map +1 -0
  741. package/fesm2020/core/testing.mjs +131 -0
  742. package/fesm2020/core/testing.mjs.map +1 -0
  743. package/fesm2020/core.mjs +1731 -0
  744. package/fesm2020/core.mjs.map +1 -0
  745. package/fesm2020/datepicker/testing.mjs +572 -0
  746. package/fesm2020/datepicker/testing.mjs.map +1 -0
  747. package/fesm2020/datepicker.mjs +3921 -0
  748. package/fesm2020/datepicker.mjs.map +1 -0
  749. package/fesm2020/dialog/testing.mjs +110 -0
  750. package/fesm2020/dialog/testing.mjs.map +1 -0
  751. package/fesm2020/dialog.mjs +1147 -0
  752. package/fesm2020/dialog.mjs.map +1 -0
  753. package/fesm2020/divider/testing.mjs +49 -0
  754. package/fesm2020/divider/testing.mjs.map +1 -0
  755. package/fesm2020/divider.mjs +77 -0
  756. package/fesm2020/divider.mjs.map +1 -0
  757. package/fesm2020/expansion/testing.mjs +176 -0
  758. package/fesm2020/expansion/testing.mjs.map +1 -0
  759. package/fesm2020/expansion.mjs +644 -0
  760. package/fesm2020/expansion.mjs.map +1 -0
  761. package/fesm2020/form-field/testing/control.mjs +26 -0
  762. package/fesm2020/form-field/testing/control.mjs.map +1 -0
  763. package/fesm2020/form-field/testing.mjs +209 -0
  764. package/fesm2020/form-field/testing.mjs.map +1 -0
  765. package/fesm2020/form-field.mjs +817 -0
  766. package/fesm2020/form-field.mjs.map +1 -0
  767. package/fesm2020/grid-list/testing.mjs +162 -0
  768. package/fesm2020/grid-list/testing.mjs.map +1 -0
  769. package/fesm2020/grid-list.mjs +696 -0
  770. package/fesm2020/grid-list.mjs.map +1 -0
  771. package/fesm2020/icon/testing.mjs +169 -0
  772. package/fesm2020/icon/testing.mjs.map +1 -0
  773. package/fesm2020/icon.mjs +1010 -0
  774. package/fesm2020/icon.mjs.map +1 -0
  775. package/fesm2020/input/testing.mjs +265 -0
  776. package/fesm2020/input/testing.mjs.map +1 -0
  777. package/fesm2020/input.mjs +512 -0
  778. package/fesm2020/input.mjs.map +1 -0
  779. package/fesm2020/list/testing.mjs +464 -0
  780. package/fesm2020/list/testing.mjs.map +1 -0
  781. package/fesm2020/list.mjs +901 -0
  782. package/fesm2020/list.mjs.map +1 -0
  783. package/fesm2020/material.mjs +16 -0
  784. package/fesm2020/material.mjs.map +1 -0
  785. package/fesm2020/menu/testing.mjs +210 -0
  786. package/fesm2020/menu/testing.mjs.map +1 -0
  787. package/fesm2020/menu.mjs +1365 -0
  788. package/fesm2020/menu.mjs.map +1 -0
  789. package/fesm2020/paginator/testing.mjs +118 -0
  790. package/fesm2020/paginator/testing.mjs.map +1 -0
  791. package/fesm2020/paginator.mjs +385 -0
  792. package/fesm2020/paginator.mjs.map +1 -0
  793. package/fesm2020/progress-bar/testing.mjs +61 -0
  794. package/fesm2020/progress-bar/testing.mjs.map +1 -0
  795. package/fesm2020/progress-bar.mjs +223 -0
  796. package/fesm2020/progress-bar.mjs.map +1 -0
  797. package/fesm2020/progress-spinner/testing.mjs +62 -0
  798. package/fesm2020/progress-spinner/testing.mjs.map +1 -0
  799. package/fesm2020/progress-spinner.mjs +326 -0
  800. package/fesm2020/progress-spinner.mjs.map +1 -0
  801. package/fesm2020/radio/testing.mjs +258 -0
  802. package/fesm2020/radio/testing.mjs.map +1 -0
  803. package/fesm2020/radio.mjs +604 -0
  804. package/fesm2020/radio.mjs.map +1 -0
  805. package/fesm2020/select/testing.mjs +157 -0
  806. package/fesm2020/select/testing.mjs.map +1 -0
  807. package/fesm2020/select.mjs +1338 -0
  808. package/fesm2020/select.mjs.map +1 -0
  809. package/fesm2020/sidenav/testing.mjs +214 -0
  810. package/fesm2020/sidenav/testing.mjs.map +1 -0
  811. package/fesm2020/sidenav.mjs +1004 -0
  812. package/fesm2020/sidenav.mjs.map +1 -0
  813. package/fesm2020/slide-toggle/testing.mjs +137 -0
  814. package/fesm2020/slide-toggle/testing.mjs.map +1 -0
  815. package/fesm2020/slide-toggle.mjs +364 -0
  816. package/fesm2020/slide-toggle.mjs.map +1 -0
  817. package/fesm2020/slider/testing.mjs +133 -0
  818. package/fesm2020/slider/testing.mjs.map +1 -0
  819. package/fesm2020/slider.mjs +835 -0
  820. package/fesm2020/slider.mjs.map +1 -0
  821. package/fesm2020/snack-bar/testing.mjs +145 -0
  822. package/fesm2020/snack-bar/testing.mjs.map +1 -0
  823. package/fesm2020/snack-bar.mjs +701 -0
  824. package/fesm2020/snack-bar.mjs.map +1 -0
  825. package/fesm2020/sort/testing.mjs +109 -0
  826. package/fesm2020/sort/testing.mjs.map +1 -0
  827. package/fesm2020/sort.mjs +609 -0
  828. package/fesm2020/sort.mjs.map +1 -0
  829. package/fesm2020/stepper/testing.mjs +206 -0
  830. package/fesm2020/stepper/testing.mjs.map +1 -0
  831. package/fesm2020/stepper.mjs +589 -0
  832. package/fesm2020/stepper.mjs.map +1 -0
  833. package/fesm2020/table/testing.mjs +259 -0
  834. package/fesm2020/table/testing.mjs.map +1 -0
  835. package/fesm2020/table.mjs +814 -0
  836. package/fesm2020/table.mjs.map +1 -0
  837. package/fesm2020/tabs/testing.mjs +234 -0
  838. package/fesm2020/tabs/testing.mjs.map +1 -0
  839. package/fesm2020/tabs.mjs +1829 -0
  840. package/fesm2020/tabs.mjs.map +1 -0
  841. package/fesm2020/toolbar/testing.mjs +67 -0
  842. package/fesm2020/toolbar/testing.mjs.map +1 -0
  843. package/fesm2020/toolbar.mjs +123 -0
  844. package/fesm2020/toolbar.mjs.map +1 -0
  845. package/fesm2020/tooltip/testing.mjs +84 -0
  846. package/fesm2020/tooltip/testing.mjs.map +1 -0
  847. package/fesm2020/tooltip.mjs +815 -0
  848. package/fesm2020/tooltip.mjs.map +1 -0
  849. package/fesm2020/tree/testing.mjs +217 -0
  850. package/fesm2020/tree/testing.mjs.map +1 -0
  851. package/fesm2020/tree.mjs +514 -0
  852. package/fesm2020/tree.mjs.map +1 -0
  853. package/form-field/error.d.ts +3 -0
  854. package/form-field/form-field-control.d.ts +3 -0
  855. package/form-field/form-field-module.d.ts +14 -7
  856. package/form-field/form-field.d.ts +4 -1
  857. package/form-field/hint.d.ts +3 -0
  858. package/form-field/label.d.ts +3 -7
  859. package/form-field/package.json +5 -5
  860. package/form-field/placeholder.d.ts +3 -7
  861. package/form-field/prefix.d.ts +3 -0
  862. package/form-field/suffix.d.ts +3 -0
  863. package/form-field/testing/control/package.json +5 -5
  864. package/form-field/testing/package.json +5 -5
  865. package/grid-list/grid-list-module.d.ts +7 -7
  866. package/grid-list/grid-list.d.ts +3 -0
  867. package/grid-list/grid-tile.d.ts +11 -0
  868. package/grid-list/index.d.ts +0 -1
  869. package/grid-list/package.json +5 -5
  870. package/grid-list/testing/package.json +5 -5
  871. package/icon/icon-module.d.ts +6 -7
  872. package/icon/icon-registry.d.ts +3 -7
  873. package/icon/icon.d.ts +4 -1
  874. package/icon/package.json +5 -5
  875. package/icon/testing/fake-icon-registry.d.ts +6 -0
  876. package/icon/testing/package.json +5 -5
  877. package/input/input-module.d.ts +8 -7
  878. package/input/input.d.ts +4 -1
  879. package/input/package.json +5 -5
  880. package/input/public-api.d.ts +0 -1
  881. package/input/testing/package.json +5 -5
  882. package/list/list-module.d.ts +9 -7
  883. package/list/list.d.ts +15 -2
  884. package/list/package.json +5 -5
  885. package/list/selection-list.d.ts +7 -2
  886. package/list/testing/package.json +5 -5
  887. package/menu/index.d.ts +0 -2
  888. package/menu/menu-content.d.ts +11 -11
  889. package/menu/menu-item.d.ts +4 -1
  890. package/menu/menu-module.d.ts +12 -13
  891. package/menu/menu-trigger.d.ts +12 -2
  892. package/menu/menu.d.ts +5 -0
  893. package/menu/package.json +5 -5
  894. package/menu/public-api.d.ts +1 -1
  895. package/menu/testing/package.json +5 -5
  896. package/package.json +612 -8
  897. package/paginator/package.json +5 -5
  898. package/paginator/paginator-intl.d.ts +3 -0
  899. package/paginator/paginator-module.d.ts +10 -7
  900. package/paginator/paginator.d.ts +6 -1
  901. package/paginator/testing/package.json +5 -5
  902. package/prebuilt-themes/deeppurple-amber.css +1 -1
  903. package/prebuilt-themes/indigo-pink.css +1 -1
  904. package/prebuilt-themes/pink-bluegrey.css +1 -1
  905. package/prebuilt-themes/purple-green.css +1 -1
  906. package/progress-bar/package.json +5 -5
  907. package/progress-bar/progress-bar-module.d.ts +7 -7
  908. package/progress-bar/progress-bar.d.ts +4 -1
  909. package/progress-bar/testing/package.json +5 -5
  910. package/progress-spinner/package.json +5 -5
  911. package/progress-spinner/progress-spinner-module.d.ts +7 -0
  912. package/progress-spinner/progress-spinner.d.ts +6 -1
  913. package/progress-spinner/testing/package.json +5 -5
  914. package/radio/package.json +5 -5
  915. package/radio/radio-module.d.ts +6 -7
  916. package/radio/radio.d.ts +10 -1
  917. package/radio/testing/package.json +5 -5
  918. package/schematics/ng-add/fonts/material-fonts.js +8 -17
  919. package/schematics/ng-add/fonts/material-fonts.mjs +8 -17
  920. package/schematics/ng-add/index.js +8 -8
  921. package/schematics/ng-add/index.mjs +8 -8
  922. package/schematics/ng-add/setup-project.js +23 -32
  923. package/schematics/ng-add/setup-project.mjs +23 -32
  924. package/schematics/ng-add/theming/create-custom-theme.js +2 -2
  925. package/schematics/ng-add/theming/create-custom-theme.mjs +2 -2
  926. package/schematics/ng-add/theming/theming.js +35 -46
  927. package/schematics/ng-add/theming/theming.mjs +35 -46
  928. package/schematics/ng-generate/address-form/index.js +13 -22
  929. package/schematics/ng-generate/address-form/index.mjs +13 -22
  930. package/schematics/ng-generate/dashboard/index.js +13 -22
  931. package/schematics/ng-generate/dashboard/index.mjs +13 -22
  932. package/schematics/ng-generate/navigation/index.js +13 -22
  933. package/schematics/ng-generate/navigation/index.mjs +13 -22
  934. package/schematics/ng-generate/table/index.js +10 -19
  935. package/schematics/ng-generate/table/index.mjs +10 -19
  936. package/schematics/ng-generate/tree/index.js +10 -19
  937. package/schematics/ng-generate/tree/index.mjs +10 -19
  938. package/schematics/ng-update/data/constructor-checks.js +5 -1
  939. package/schematics/ng-update/data/constructor-checks.mjs +5 -1
  940. package/schematics/ng-update/index.js +9 -9
  941. package/schematics/ng-update/index.mjs +9 -9
  942. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.js +24 -24
  943. package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.mjs +24 -24
  944. package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.js +5 -5
  945. package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.mjs +5 -5
  946. package/schematics/ng-update/migrations/misc-checks/misc-class-inheritance.js +2 -2
  947. package/schematics/ng-update/migrations/misc-checks/misc-class-inheritance.mjs +2 -2
  948. package/schematics/ng-update/migrations/misc-checks/misc-imports.js +2 -2
  949. package/schematics/ng-update/migrations/misc-checks/misc-imports.mjs +2 -2
  950. package/schematics/ng-update/migrations/misc-checks/misc-template.js +4 -4
  951. package/schematics/ng-update/migrations/misc-checks/misc-template.mjs +4 -4
  952. package/schematics/ng-update/migrations/misc-ripples-v7/ripple-speed-factor-migration.js +7 -7
  953. package/schematics/ng-update/migrations/misc-ripples-v7/ripple-speed-factor-migration.mjs +7 -7
  954. package/schematics/ng-update/migrations/package-imports-v8/secondary-entry-points-migration.js +2 -3
  955. package/schematics/ng-update/migrations/package-imports-v8/secondary-entry-points-migration.mjs +2 -3
  956. package/schematics/ng-update/migrations/theming-api-v12/migration.d.ts +6 -6
  957. package/schematics/ng-update/migrations/theming-api-v12/migration.js +12 -12
  958. package/schematics/ng-update/migrations/theming-api-v12/migration.mjs +12 -12
  959. package/schematics/ng-update/migrations/theming-api-v12/theming-api-migration.js +3 -3
  960. package/schematics/ng-update/migrations/theming-api-v12/theming-api-migration.mjs +3 -3
  961. package/schematics/ng-update/typescript/module-specifiers.js +3 -3
  962. package/schematics/ng-update/typescript/module-specifiers.mjs +3 -3
  963. package/schematics/package.json +3 -0
  964. package/schematics/paths.js +3 -3
  965. package/schematics/paths.mjs +3 -3
  966. package/select/package.json +5 -5
  967. package/select/select-module.d.ts +10 -7
  968. package/select/select.d.ts +8 -1
  969. package/select/testing/package.json +5 -5
  970. package/sidenav/drawer.d.ts +7 -0
  971. package/sidenav/index.d.ts +0 -1
  972. package/sidenav/package.json +5 -5
  973. package/sidenav/sidenav-module.d.ts +10 -0
  974. package/sidenav/sidenav.d.ts +7 -0
  975. package/sidenav/testing/package.json +5 -5
  976. package/slide-toggle/package.json +5 -5
  977. package/slide-toggle/slide-toggle-module.d.ts +11 -7
  978. package/slide-toggle/slide-toggle-required-validator.d.ts +3 -0
  979. package/slide-toggle/slide-toggle.d.ts +4 -1
  980. package/slide-toggle/testing/package.json +5 -5
  981. package/slider/package.json +5 -5
  982. package/slider/slider-module.d.ts +7 -7
  983. package/slider/slider.d.ts +4 -1
  984. package/slider/testing/package.json +5 -5
  985. package/snack-bar/package.json +5 -5
  986. package/snack-bar/simple-snack-bar.d.ts +3 -7
  987. package/snack-bar/snack-bar-container.d.ts +3 -0
  988. package/snack-bar/snack-bar-module.d.ts +11 -7
  989. package/snack-bar/snack-bar.d.ts +3 -0
  990. package/snack-bar/testing/package.json +5 -5
  991. package/snack-bar/testing/snack-bar-harness.d.ts +8 -9
  992. package/sort/package.json +5 -5
  993. package/sort/sort-header-intl.d.ts +3 -0
  994. package/sort/sort-header.d.ts +4 -1
  995. package/sort/sort-module.d.ts +8 -7
  996. package/sort/sort.d.ts +4 -1
  997. package/sort/testing/package.json +5 -5
  998. package/stepper/package.json +5 -5
  999. package/stepper/step-content.d.ts +3 -0
  1000. package/stepper/step-header.d.ts +6 -1
  1001. package/stepper/step-label.d.ts +3 -7
  1002. package/stepper/stepper-button.d.ts +5 -0
  1003. package/stepper/stepper-icon.d.ts +3 -0
  1004. package/stepper/stepper-intl.d.ts +7 -0
  1005. package/stepper/stepper-module.d.ts +16 -7
  1006. package/stepper/stepper.d.ts +11 -0
  1007. package/stepper/testing/package.json +5 -5
  1008. package/table/cell.d.ts +15 -7
  1009. package/table/package.json +5 -5
  1010. package/table/row.d.ts +15 -0
  1011. package/table/table-module.d.ts +10 -7
  1012. package/table/table.d.ts +5 -0
  1013. package/table/testing/package.json +5 -5
  1014. package/table/text-column.d.ts +3 -0
  1015. package/tabs/index.d.ts +0 -4
  1016. package/tabs/ink-bar.d.ts +3 -0
  1017. package/tabs/package.json +5 -5
  1018. package/tabs/paginated-tab-header.d.ts +3 -0
  1019. package/tabs/public-api.d.ts +1 -1
  1020. package/tabs/tab-body.d.ts +7 -0
  1021. package/tabs/tab-content.d.ts +3 -0
  1022. package/tabs/tab-group.d.ts +6 -1
  1023. package/tabs/tab-header.d.ts +5 -0
  1024. package/tabs/tab-label-wrapper.d.ts +4 -1
  1025. package/tabs/tab-label.d.ts +11 -1
  1026. package/tabs/tab-nav-bar/tab-nav-bar.d.ts +10 -1
  1027. package/tabs/tab.d.ts +5 -2
  1028. package/tabs/tabs-module.d.ts +18 -7
  1029. package/tabs/testing/package.json +5 -5
  1030. package/toolbar/package.json +5 -5
  1031. package/toolbar/testing/package.json +5 -5
  1032. package/toolbar/toolbar-module.d.ts +6 -7
  1033. package/toolbar/toolbar.d.ts +6 -1
  1034. package/tooltip/package.json +5 -5
  1035. package/tooltip/testing/package.json +5 -5
  1036. package/tooltip/tooltip-module.d.ts +10 -7
  1037. package/tooltip/tooltip.d.ts +11 -2
  1038. package/tree/node.d.ts +8 -1
  1039. package/tree/outlet.d.ts +3 -0
  1040. package/tree/package.json +5 -5
  1041. package/tree/padding.d.ts +3 -0
  1042. package/tree/testing/package.json +5 -5
  1043. package/tree/toggle.d.ts +3 -7
  1044. package/tree/tree-module.d.ts +11 -7
  1045. package/tree/tree.d.ts +3 -0
  1046. package/autocomplete/index.metadata.json +0 -1
  1047. package/badge/index.metadata.json +0 -1
  1048. package/bottom-sheet/index.metadata.json +0 -1
  1049. package/bundles/material-autocomplete-testing.umd.js +0 -564
  1050. package/bundles/material-autocomplete-testing.umd.js.map +0 -1
  1051. package/bundles/material-autocomplete.umd.js +0 -1266
  1052. package/bundles/material-autocomplete.umd.js.map +0 -1
  1053. package/bundles/material-badge-testing.umd.js +0 -474
  1054. package/bundles/material-badge-testing.umd.js.map +0 -1
  1055. package/bundles/material-badge.umd.js +0 -606
  1056. package/bundles/material-badge.umd.js.map +0 -1
  1057. package/bundles/material-bottom-sheet-testing.umd.js +0 -396
  1058. package/bundles/material-bottom-sheet-testing.umd.js.map +0 -1
  1059. package/bundles/material-bottom-sheet.umd.js +0 -955
  1060. package/bundles/material-bottom-sheet.umd.js.map +0 -1
  1061. package/bundles/material-button-testing.umd.js +0 -444
  1062. package/bundles/material-button-testing.umd.js.map +0 -1
  1063. package/bundles/material-button-toggle-testing.umd.js +0 -628
  1064. package/bundles/material-button-toggle-testing.umd.js.map +0 -1
  1065. package/bundles/material-button-toggle.umd.js +0 -850
  1066. package/bundles/material-button-toggle.umd.js.map +0 -1
  1067. package/bundles/material-button.umd.js +0 -545
  1068. package/bundles/material-button.umd.js.map +0 -1
  1069. package/bundles/material-card-testing.umd.js +0 -408
  1070. package/bundles/material-card-testing.umd.js.map +0 -1
  1071. package/bundles/material-card.umd.js +0 -337
  1072. package/bundles/material-card.umd.js.map +0 -1
  1073. package/bundles/material-checkbox-testing.umd.js +0 -615
  1074. package/bundles/material-checkbox-testing.umd.js.map +0 -1
  1075. package/bundles/material-checkbox.umd.js +0 -829
  1076. package/bundles/material-checkbox.umd.js.map +0 -1
  1077. package/bundles/material-chips-testing.umd.js +0 -1023
  1078. package/bundles/material-chips-testing.umd.js.map +0 -1
  1079. package/bundles/material-chips.umd.js +0 -1753
  1080. package/bundles/material-chips.umd.js.map +0 -1
  1081. package/bundles/material-core-testing.umd.js +0 -518
  1082. package/bundles/material-core-testing.umd.js.map +0 -1
  1083. package/bundles/material-core.umd.js +0 -2186
  1084. package/bundles/material-core.umd.js.map +0 -1
  1085. package/bundles/material-datepicker-testing.umd.js +0 -1366
  1086. package/bundles/material-datepicker-testing.umd.js.map +0 -1
  1087. package/bundles/material-datepicker.umd.js +0 -4344
  1088. package/bundles/material-datepicker.umd.js.map +0 -1
  1089. package/bundles/material-dialog-testing.umd.js +0 -500
  1090. package/bundles/material-dialog-testing.umd.js.map +0 -1
  1091. package/bundles/material-dialog.umd.js +0 -1487
  1092. package/bundles/material-dialog.umd.js.map +0 -1
  1093. package/bundles/material-divider-testing.umd.js +0 -380
  1094. package/bundles/material-divider-testing.umd.js.map +0 -1
  1095. package/bundles/material-divider.umd.js +0 -95
  1096. package/bundles/material-divider.umd.js.map +0 -1
  1097. package/bundles/material-expansion-testing.umd.js +0 -627
  1098. package/bundles/material-expansion-testing.umd.js.map +0 -1
  1099. package/bundles/material-expansion.umd.js +0 -949
  1100. package/bundles/material-expansion.umd.js.map +0 -1
  1101. package/bundles/material-form-field-testing-control.umd.js +0 -350
  1102. package/bundles/material-form-field-testing-control.umd.js.map +0 -1
  1103. package/bundles/material-form-field-testing.umd.js +0 -708
  1104. package/bundles/material-form-field-testing.umd.js.map +0 -1
  1105. package/bundles/material-form-field.umd.js +0 -1131
  1106. package/bundles/material-form-field.umd.js.map +0 -1
  1107. package/bundles/material-grid-list-testing.umd.js +0 -566
  1108. package/bundles/material-grid-list-testing.umd.js.map +0 -1
  1109. package/bundles/material-grid-list.umd.js +0 -1070
  1110. package/bundles/material-grid-list.umd.js.map +0 -1
  1111. package/bundles/material-icon-testing.umd.js +0 -527
  1112. package/bundles/material-icon-testing.umd.js.map +0 -1
  1113. package/bundles/material-icon.umd.js +0 -1391
  1114. package/bundles/material-icon.umd.js.map +0 -1
  1115. package/bundles/material-input-testing.umd.js +0 -806
  1116. package/bundles/material-input-testing.umd.js.map +0 -1
  1117. package/bundles/material-input.umd.js +0 -875
  1118. package/bundles/material-input.umd.js.map +0 -1
  1119. package/bundles/material-list-testing.umd.js +0 -1092
  1120. package/bundles/material-list-testing.umd.js.map +0 -1
  1121. package/bundles/material-list.umd.js +0 -1284
  1122. package/bundles/material-list.umd.js.map +0 -1
  1123. package/bundles/material-menu-testing.umd.js +0 -722
  1124. package/bundles/material-menu-testing.umd.js.map +0 -1
  1125. package/bundles/material-menu.umd.js +0 -1661
  1126. package/bundles/material-menu.umd.js.map +0 -1
  1127. package/bundles/material-paginator-testing.umd.js +0 -504
  1128. package/bundles/material-paginator-testing.umd.js.map +0 -1
  1129. package/bundles/material-paginator.umd.js +0 -746
  1130. package/bundles/material-paginator.umd.js.map +0 -1
  1131. package/bundles/material-progress-bar-testing.umd.js +0 -395
  1132. package/bundles/material-progress-bar-testing.umd.js.map +0 -1
  1133. package/bundles/material-progress-bar.umd.js +0 -546
  1134. package/bundles/material-progress-bar.umd.js.map +0 -1
  1135. package/bundles/material-progress-spinner-testing.umd.js +0 -399
  1136. package/bundles/material-progress-spinner-testing.umd.js.map +0 -1
  1137. package/bundles/material-progress-spinner.umd.js +0 -631
  1138. package/bundles/material-progress-spinner.umd.js.map +0 -1
  1139. package/bundles/material-radio-testing.umd.js +0 -812
  1140. package/bundles/material-radio-testing.umd.js.map +0 -1
  1141. package/bundles/material-radio.umd.js +0 -971
  1142. package/bundles/material-radio.umd.js.map +0 -1
  1143. package/bundles/material-select-testing.umd.js +0 -620
  1144. package/bundles/material-select-testing.umd.js.map +0 -1
  1145. package/bundles/material-select.umd.js +0 -1665
  1146. package/bundles/material-select.umd.js.map +0 -1
  1147. package/bundles/material-sidenav-testing.umd.js +0 -603
  1148. package/bundles/material-sidenav-testing.umd.js.map +0 -1
  1149. package/bundles/material-sidenav.umd.js +0 -1368
  1150. package/bundles/material-sidenav.umd.js.map +0 -1
  1151. package/bundles/material-slide-toggle-testing.umd.js +0 -582
  1152. package/bundles/material-slide-toggle-testing.umd.js.map +0 -1
  1153. package/bundles/material-slide-toggle.umd.js +0 -670
  1154. package/bundles/material-slide-toggle.umd.js.map +0 -1
  1155. package/bundles/material-slider-testing.umd.js +0 -587
  1156. package/bundles/material-slider-testing.umd.js.map +0 -1
  1157. package/bundles/material-slider.umd.js +0 -1186
  1158. package/bundles/material-slider.umd.js.map +0 -1
  1159. package/bundles/material-snack-bar-testing.umd.js +0 -554
  1160. package/bundles/material-snack-bar-testing.umd.js.map +0 -1
  1161. package/bundles/material-snack-bar.umd.js +0 -1076
  1162. package/bundles/material-snack-bar.umd.js.map +0 -1
  1163. package/bundles/material-sort-testing.umd.js +0 -493
  1164. package/bundles/material-sort-testing.umd.js.map +0 -1
  1165. package/bundles/material-sort.umd.js +0 -943
  1166. package/bundles/material-sort.umd.js.map +0 -1
  1167. package/bundles/material-stepper-testing.umd.js +0 -703
  1168. package/bundles/material-stepper-testing.umd.js.map +0 -1
  1169. package/bundles/material-stepper.umd.js +0 -893
  1170. package/bundles/material-stepper.umd.js.map +0 -1
  1171. package/bundles/material-table-testing.umd.js +0 -700
  1172. package/bundles/material-table-testing.umd.js.map +0 -1
  1173. package/bundles/material-table.umd.js +0 -1121
  1174. package/bundles/material-table.umd.js.map +0 -1
  1175. package/bundles/material-tabs-testing.umd.js +0 -744
  1176. package/bundles/material-tabs-testing.umd.js.map +0 -1
  1177. package/bundles/material-tabs.umd.js +0 -2169
  1178. package/bundles/material-tabs.umd.js.map +0 -1
  1179. package/bundles/material-toolbar-testing.umd.js +0 -406
  1180. package/bundles/material-toolbar-testing.umd.js.map +0 -1
  1181. package/bundles/material-toolbar.umd.js +0 -454
  1182. package/bundles/material-toolbar.umd.js.map +0 -1
  1183. package/bundles/material-tooltip-testing.umd.js +0 -460
  1184. package/bundles/material-tooltip-testing.umd.js.map +0 -1
  1185. package/bundles/material-tooltip.umd.js +0 -1170
  1186. package/bundles/material-tooltip.umd.js.map +0 -1
  1187. package/bundles/material-tree-testing.umd.js +0 -636
  1188. package/bundles/material-tree-testing.umd.js.map +0 -1
  1189. package/bundles/material-tree.umd.js +0 -837
  1190. package/bundles/material-tree.umd.js.map +0 -1
  1191. package/bundles/material.umd.js +0 -26
  1192. package/bundles/material.umd.js.map +0 -1
  1193. package/button/index.metadata.json +0 -1
  1194. package/button-toggle/index.metadata.json +0 -1
  1195. package/card/index.metadata.json +0 -1
  1196. package/checkbox/index.metadata.json +0 -1
  1197. package/chips/index.metadata.json +0 -1
  1198. package/core/index.metadata.json +0 -1
  1199. package/datepicker/index.metadata.json +0 -1
  1200. package/dialog/index.metadata.json +0 -1
  1201. package/divider/index.metadata.json +0 -1
  1202. package/esm2015/autocomplete/autocomplete-module.js +0 -38
  1203. package/esm2015/autocomplete/autocomplete-origin.js +0 -35
  1204. package/esm2015/autocomplete/autocomplete-trigger.js +0 -627
  1205. package/esm2015/autocomplete/autocomplete.externs.js +0 -6
  1206. package/esm2015/autocomplete/autocomplete.js +0 -202
  1207. package/esm2015/autocomplete/testing/autocomplete-harness.js +0 -120
  1208. package/esm2015/autocomplete/testing/testing.externs.js +0 -0
  1209. package/esm2015/badge/badge-module.js +0 -24
  1210. package/esm2015/badge/badge.externs.js +0 -6
  1211. package/esm2015/badge/badge.js +0 -230
  1212. package/esm2015/badge/testing/badge-harness.js +0 -85
  1213. package/esm2015/badge/testing/testing.externs.js +0 -0
  1214. package/esm2015/bottom-sheet/bottom-sheet-container.js +0 -253
  1215. package/esm2015/bottom-sheet/bottom-sheet-module.js +0 -27
  1216. package/esm2015/bottom-sheet/bottom-sheet-ref.js +0 -91
  1217. package/esm2015/bottom-sheet/bottom-sheet.externs.js +0 -6
  1218. package/esm2015/bottom-sheet/bottom-sheet.js +0 -167
  1219. package/esm2015/bottom-sheet/testing/bottom-sheet-harness.js +0 -40
  1220. package/esm2015/bottom-sheet/testing/testing.externs.js +0 -0
  1221. package/esm2015/button/button-module.js +0 -30
  1222. package/esm2015/button/button.externs.js +0 -6
  1223. package/esm2015/button/button.js +0 -163
  1224. package/esm2015/button/testing/button-harness.js +0 -64
  1225. package/esm2015/button/testing/testing.externs.js +0 -0
  1226. package/esm2015/button-toggle/button-toggle-module.js +0 -20
  1227. package/esm2015/button-toggle/button-toggle.externs.js +0 -6
  1228. package/esm2015/button-toggle/button-toggle.js +0 -441
  1229. package/esm2015/button-toggle/testing/button-toggle-group-harness.js +0 -54
  1230. package/esm2015/button-toggle/testing/button-toggle-harness.js +0 -125
  1231. package/esm2015/button-toggle/testing/testing.externs.js +0 -0
  1232. package/esm2015/card/card-module.js +0 -40
  1233. package/esm2015/card/card.externs.js +0 -6
  1234. package/esm2015/card/card.js +0 -223
  1235. package/esm2015/card/testing/card-harness.js +0 -52
  1236. package/esm2015/card/testing/testing.externs.js +0 -0
  1237. package/esm2015/checkbox/checkbox-module.js +0 -34
  1238. package/esm2015/checkbox/checkbox-required-validator.js +0 -29
  1239. package/esm2015/checkbox/checkbox.externs.js +0 -6
  1240. package/esm2015/checkbox/checkbox.js +0 -385
  1241. package/esm2015/checkbox/testing/checkbox-harness.js +0 -156
  1242. package/esm2015/checkbox/testing/testing.externs.js +0 -0
  1243. package/esm2015/chips/chip-input.js +0 -180
  1244. package/esm2015/chips/chip-list.js +0 -663
  1245. package/esm2015/chips/chip.js +0 -394
  1246. package/esm2015/chips/chips-module.js +0 -43
  1247. package/esm2015/chips/chips.externs.js +0 -6
  1248. package/esm2015/chips/testing/chip-harness.js +0 -110
  1249. package/esm2015/chips/testing/chip-input-harness.js +0 -101
  1250. package/esm2015/chips/testing/chip-list-harness.js +0 -99
  1251. package/esm2015/chips/testing/chip-listbox-harness.js +0 -49
  1252. package/esm2015/chips/testing/chip-option-harness.js +0 -54
  1253. package/esm2015/chips/testing/chip-remove-harness.js +0 -29
  1254. package/esm2015/chips/testing/testing.externs.js +0 -0
  1255. package/esm2015/core/common-behaviors/color.js +0 -31
  1256. package/esm2015/core/common-behaviors/common-module.js +0 -122
  1257. package/esm2015/core/common-behaviors/disable-ripple.js +0 -20
  1258. package/esm2015/core/common-behaviors/disabled.js +0 -19
  1259. package/esm2015/core/common-behaviors/error-state.js +0 -36
  1260. package/esm2015/core/common-behaviors/index.js +0 -15
  1261. package/esm2015/core/common-behaviors/initialized.js +0 -58
  1262. package/esm2015/core/common-behaviors/tabindex.js +0 -23
  1263. package/esm2015/core/core.externs.js +0 -6
  1264. package/esm2015/core/datetime/index.js +0 -38
  1265. package/esm2015/core/datetime/native-date-adapter.js +0 -213
  1266. package/esm2015/core/error/error-options.js +0 -29
  1267. package/esm2015/core/index.js +0 -6
  1268. package/esm2015/core/line/line.js +0 -57
  1269. package/esm2015/core/option/index.js +0 -27
  1270. package/esm2015/core/option/optgroup.js +0 -84
  1271. package/esm2015/core/option/option.js +0 -274
  1272. package/esm2015/core/ripple/index.js +0 -24
  1273. package/esm2015/core/ripple/ripple-renderer.js +0 -261
  1274. package/esm2015/core/ripple/ripple.js +0 -128
  1275. package/esm2015/core/selection/index.js +0 -21
  1276. package/esm2015/core/selection/pseudo-checkbox/pseudo-checkbox.js +0 -55
  1277. package/esm2015/core/testing/optgroup-harness.js +0 -51
  1278. package/esm2015/core/testing/option-harness.js +0 -67
  1279. package/esm2015/core/testing/testing.externs.js +0 -0
  1280. package/esm2015/core/version.js +0 -11
  1281. package/esm2015/datepicker/calendar-body.js +0 -291
  1282. package/esm2015/datepicker/calendar.js +0 -330
  1283. package/esm2015/datepicker/date-range-input-parts.js +0 -315
  1284. package/esm2015/datepicker/date-range-input.js +0 -316
  1285. package/esm2015/datepicker/date-range-picker.js +0 -40
  1286. package/esm2015/datepicker/date-range-selection-strategy.js +0 -58
  1287. package/esm2015/datepicker/date-selection-model.js +0 -189
  1288. package/esm2015/datepicker/datepicker-actions.js +0 -89
  1289. package/esm2015/datepicker/datepicker-base.js +0 -542
  1290. package/esm2015/datepicker/datepicker-input-base.js +0 -290
  1291. package/esm2015/datepicker/datepicker-input.js +0 -164
  1292. package/esm2015/datepicker/datepicker-intl.js +0 -51
  1293. package/esm2015/datepicker/datepicker-module.js +0 -93
  1294. package/esm2015/datepicker/datepicker-toggle.js +0 -104
  1295. package/esm2015/datepicker/datepicker.externs.js +0 -6
  1296. package/esm2015/datepicker/datepicker.js +0 -30
  1297. package/esm2015/datepicker/index.js +0 -9
  1298. package/esm2015/datepicker/month-view.js +0 -344
  1299. package/esm2015/datepicker/multi-year-view.js +0 -280
  1300. package/esm2015/datepicker/testing/calendar-cell-harness.js +0 -181
  1301. package/esm2015/datepicker/testing/calendar-harness.js +0 -91
  1302. package/esm2015/datepicker/testing/date-range-input-harness.js +0 -116
  1303. package/esm2015/datepicker/testing/datepicker-input-harness-base.js +0 -102
  1304. package/esm2015/datepicker/testing/datepicker-input-harness.js +0 -69
  1305. package/esm2015/datepicker/testing/datepicker-toggle-harness.js +0 -48
  1306. package/esm2015/datepicker/testing/datepicker-trigger-harness-base.js +0 -77
  1307. package/esm2015/datepicker/testing/testing.externs.js +0 -0
  1308. package/esm2015/datepicker/year-view.js +0 -268
  1309. package/esm2015/dialog/dialog-container.js +0 -295
  1310. package/esm2015/dialog/dialog-content-directives.js +0 -159
  1311. package/esm2015/dialog/dialog-module.js +0 -46
  1312. package/esm2015/dialog/dialog-ref.js +0 -196
  1313. package/esm2015/dialog/dialog.externs.js +0 -6
  1314. package/esm2015/dialog/dialog.js +0 -353
  1315. package/esm2015/dialog/testing/dialog-harness.js +0 -103
  1316. package/esm2015/dialog/testing/testing.externs.js +0 -0
  1317. package/esm2015/divider/divider-module.js +0 -20
  1318. package/esm2015/divider/divider.externs.js +0 -6
  1319. package/esm2015/divider/divider.js +0 -43
  1320. package/esm2015/divider/testing/divider-harness.js +0 -27
  1321. package/esm2015/divider/testing/testing.externs.js +0 -0
  1322. package/esm2015/expansion/accordion.js +0 -83
  1323. package/esm2015/expansion/expansion-module.js +0 -42
  1324. package/esm2015/expansion/expansion-panel-content.js +0 -26
  1325. package/esm2015/expansion/expansion-panel-header.js +0 -214
  1326. package/esm2015/expansion/expansion-panel.js +0 -186
  1327. package/esm2015/expansion/expansion.externs.js +0 -6
  1328. package/esm2015/expansion/testing/accordion-harness.js +0 -36
  1329. package/esm2015/expansion/testing/expansion-harness.js +0 -149
  1330. package/esm2015/expansion/testing/testing.externs.js +0 -0
  1331. package/esm2015/form-field/error.js +0 -45
  1332. package/esm2015/form-field/form-field-control.js +0 -15
  1333. package/esm2015/form-field/form-field-module.js +0 -49
  1334. package/esm2015/form-field/form-field.externs.js +0 -6
  1335. package/esm2015/form-field/form-field.js +0 -482
  1336. package/esm2015/form-field/hint.js +0 -45
  1337. package/esm2015/form-field/label.js +0 -17
  1338. package/esm2015/form-field/placeholder.js +0 -22
  1339. package/esm2015/form-field/prefix.js +0 -24
  1340. package/esm2015/form-field/suffix.js +0 -24
  1341. package/esm2015/form-field/testing/control/control.externs.js +0 -0
  1342. package/esm2015/form-field/testing/form-field-harness.js +0 -218
  1343. package/esm2015/form-field/testing/testing.externs.js +0 -0
  1344. package/esm2015/grid-list/grid-list-module.js +0 -37
  1345. package/esm2015/grid-list/grid-list.externs.js +0 -6
  1346. package/esm2015/grid-list/grid-list.js +0 -135
  1347. package/esm2015/grid-list/grid-tile.js +0 -116
  1348. package/esm2015/grid-list/index.js +0 -6
  1349. package/esm2015/grid-list/testing/grid-list-harness.js +0 -79
  1350. package/esm2015/grid-list/testing/grid-tile-harness.js +0 -80
  1351. package/esm2015/grid-list/testing/testing.externs.js +0 -0
  1352. package/esm2015/icon/icon-module.js +0 -20
  1353. package/esm2015/icon/icon-registry.js +0 -581
  1354. package/esm2015/icon/icon.externs.js +0 -6
  1355. package/esm2015/icon/icon.js +0 -362
  1356. package/esm2015/icon/testing/fake-icon-registry.js +0 -85
  1357. package/esm2015/icon/testing/icon-harness.js +0 -63
  1358. package/esm2015/icon/testing/testing.externs.js +0 -6
  1359. package/esm2015/icon/trusted-types.js +0 -44
  1360. package/esm2015/input/autosize.js +0 -44
  1361. package/esm2015/input/input-module.js +0 -35
  1362. package/esm2015/input/input.externs.js +0 -6
  1363. package/esm2015/input/input.js +0 -395
  1364. package/esm2015/input/public-api.js +0 -13
  1365. package/esm2015/input/testing/input-harness.js +0 -138
  1366. package/esm2015/input/testing/native-option-harness.js +0 -51
  1367. package/esm2015/input/testing/native-select-harness.js +0 -100
  1368. package/esm2015/input/testing/testing.externs.js +0 -0
  1369. package/esm2015/list/list-module.js +0 -45
  1370. package/esm2015/list/list.externs.js +0 -6
  1371. package/esm2015/list/list.js +0 -218
  1372. package/esm2015/list/selection-list.js +0 -608
  1373. package/esm2015/list/testing/action-list-harness.js +0 -68
  1374. package/esm2015/list/testing/list-harness-base.js +0 -97
  1375. package/esm2015/list/testing/list-item-harness-base.js +0 -85
  1376. package/esm2015/list/testing/nav-list-harness.js +0 -75
  1377. package/esm2015/list/testing/selection-list-harness.js +0 -152
  1378. package/esm2015/list/testing/testing.externs.js +0 -0
  1379. package/esm2015/material.externs.js +0 -0
  1380. package/esm2015/menu/index.js +0 -7
  1381. package/esm2015/menu/menu-content.js +0 -92
  1382. package/esm2015/menu/menu-item.js +0 -164
  1383. package/esm2015/menu/menu-module.js +0 -49
  1384. package/esm2015/menu/menu-trigger.js +0 -493
  1385. package/esm2015/menu/menu.externs.js +0 -6
  1386. package/esm2015/menu/menu.js +0 -381
  1387. package/esm2015/menu/public-api.js +0 -16
  1388. package/esm2015/menu/testing/menu-harness.js +0 -223
  1389. package/esm2015/menu/testing/testing.externs.js +0 -0
  1390. package/esm2015/paginator/paginator-intl.js +0 -62
  1391. package/esm2015/paginator/paginator-module.js +0 -32
  1392. package/esm2015/paginator/paginator.externs.js +0 -6
  1393. package/esm2015/paginator/paginator.js +0 -263
  1394. package/esm2015/paginator/testing/paginator-harness.js +0 -106
  1395. package/esm2015/paginator/testing/testing.externs.js +0 -0
  1396. package/esm2015/progress-bar/progress-bar-module.js +0 -21
  1397. package/esm2015/progress-bar/progress-bar.externs.js +0 -6
  1398. package/esm2015/progress-bar/progress-bar.js +0 -179
  1399. package/esm2015/progress-bar/testing/progress-bar-harness.js +0 -39
  1400. package/esm2015/progress-bar/testing/testing.externs.js +0 -0
  1401. package/esm2015/progress-spinner/progress-spinner-module.js +0 -28
  1402. package/esm2015/progress-spinner/progress-spinner.externs.js +0 -6
  1403. package/esm2015/progress-spinner/progress-spinner.js +0 -274
  1404. package/esm2015/progress-spinner/testing/progress-spinner-harness.js +0 -40
  1405. package/esm2015/progress-spinner/testing/testing.externs.js +0 -0
  1406. package/esm2015/radio/radio-module.js +0 -20
  1407. package/esm2015/radio/radio.externs.js +0 -6
  1408. package/esm2015/radio/radio.js +0 -546
  1409. package/esm2015/radio/testing/radio-harness.js +0 -272
  1410. package/esm2015/radio/testing/testing.externs.js +0 -0
  1411. package/esm2015/select/select-module.js +0 -37
  1412. package/esm2015/select/select.externs.js +0 -6
  1413. package/esm2015/select/select.js +0 -1138
  1414. package/esm2015/select/testing/select-harness.js +0 -157
  1415. package/esm2015/select/testing/testing.externs.js +0 -0
  1416. package/esm2015/sidenav/drawer.js +0 -766
  1417. package/esm2015/sidenav/index.js +0 -6
  1418. package/esm2015/sidenav/sidenav-module.js +0 -45
  1419. package/esm2015/sidenav/sidenav.externs.js +0 -6
  1420. package/esm2015/sidenav/sidenav.js +0 -118
  1421. package/esm2015/sidenav/testing/drawer-container-harness.js +0 -41
  1422. package/esm2015/sidenav/testing/drawer-harness.js +0 -57
  1423. package/esm2015/sidenav/testing/sidenav-container-harness.js +0 -41
  1424. package/esm2015/sidenav/testing/sidenav-harness.js +0 -32
  1425. package/esm2015/sidenav/testing/testing.externs.js +0 -0
  1426. package/esm2015/slide-toggle/slide-toggle-module.js +0 -40
  1427. package/esm2015/slide-toggle/slide-toggle-required-validator.js +0 -32
  1428. package/esm2015/slide-toggle/slide-toggle.externs.js +0 -6
  1429. package/esm2015/slide-toggle/slide-toggle.js +0 -236
  1430. package/esm2015/slide-toggle/testing/slide-toggle-harness.js +0 -139
  1431. package/esm2015/slide-toggle/testing/testing.externs.js +0 -0
  1432. package/esm2015/slider/slider-module.js +0 -21
  1433. package/esm2015/slider/slider.externs.js +0 -6
  1434. package/esm2015/slider/slider.js +0 -788
  1435. package/esm2015/slider/testing/slider-harness.js +0 -141
  1436. package/esm2015/slider/testing/testing.externs.js +0 -0
  1437. package/esm2015/snack-bar/simple-snack-bar.js +0 -45
  1438. package/esm2015/snack-bar/snack-bar-container.js +0 -224
  1439. package/esm2015/snack-bar/snack-bar-module.js +0 -32
  1440. package/esm2015/snack-bar/snack-bar-ref.js +0 -90
  1441. package/esm2015/snack-bar/snack-bar.externs.js +0 -6
  1442. package/esm2015/snack-bar/snack-bar.js +0 -265
  1443. package/esm2015/snack-bar/testing/snack-bar-harness.js +0 -142
  1444. package/esm2015/snack-bar/testing/testing.externs.js +0 -0
  1445. package/esm2015/sort/sort-header-intl.js +0 -41
  1446. package/esm2015/sort/sort-header.js +0 -268
  1447. package/esm2015/sort/sort-module.js +0 -24
  1448. package/esm2015/sort/sort.externs.js +0 -6
  1449. package/esm2015/sort/sort.js +0 -140
  1450. package/esm2015/sort/testing/sort-harness.js +0 -41
  1451. package/esm2015/sort/testing/sort-header-harness.js +0 -67
  1452. package/esm2015/sort/testing/testing.externs.js +0 -0
  1453. package/esm2015/stepper/step-content.js +0 -25
  1454. package/esm2015/stepper/step-header.js +0 -108
  1455. package/esm2015/stepper/step-label.js +0 -17
  1456. package/esm2015/stepper/stepper-button.js +0 -36
  1457. package/esm2015/stepper/stepper-icon.js +0 -28
  1458. package/esm2015/stepper/stepper-intl.js +0 -37
  1459. package/esm2015/stepper/stepper-module.js +0 -61
  1460. package/esm2015/stepper/stepper.externs.js +0 -6
  1461. package/esm2015/stepper/stepper.js +0 -187
  1462. package/esm2015/stepper/testing/step-harness.js +0 -111
  1463. package/esm2015/stepper/testing/stepper-button-harnesses.js +0 -55
  1464. package/esm2015/stepper/testing/stepper-harness.js +0 -57
  1465. package/esm2015/stepper/testing/testing.externs.js +0 -0
  1466. package/esm2015/table/cell.js +0 -114
  1467. package/esm2015/table/row.js +0 -116
  1468. package/esm2015/table/table-data-source.js +0 -312
  1469. package/esm2015/table/table-module.js +0 -50
  1470. package/esm2015/table/table.externs.js +0 -6
  1471. package/esm2015/table/table.js +0 -63
  1472. package/esm2015/table/testing/cell-harness.js +0 -77
  1473. package/esm2015/table/testing/row-harness.js +0 -91
  1474. package/esm2015/table/testing/table-harness.js +0 -99
  1475. package/esm2015/table/testing/testing.externs.js +0 -0
  1476. package/esm2015/table/text-column.js +0 -44
  1477. package/esm2015/tabs/index.js +0 -9
  1478. package/esm2015/tabs/ink-bar.js +0 -87
  1479. package/esm2015/tabs/paginated-tab-header.js +0 -477
  1480. package/esm2015/tabs/public-api.js +0 -20
  1481. package/esm2015/tabs/tab-body.js +0 -212
  1482. package/esm2015/tabs/tab-content.js +0 -31
  1483. package/esm2015/tabs/tab-group.js +0 -357
  1484. package/esm2015/tabs/tab-header.js +0 -94
  1485. package/esm2015/tabs/tab-label-wrapper.js +0 -47
  1486. package/esm2015/tabs/tab-label.js +0 -25
  1487. package/esm2015/tabs/tab-nav-bar/tab-nav-bar.js +0 -241
  1488. package/esm2015/tabs/tab.js +0 -106
  1489. package/esm2015/tabs/tabs-module.js +0 -60
  1490. package/esm2015/tabs/tabs.externs.js +0 -6
  1491. package/esm2015/tabs/testing/tab-group-harness.js +0 -65
  1492. package/esm2015/tabs/testing/tab-harness.js +0 -85
  1493. package/esm2015/tabs/testing/tab-link-harness.js +0 -51
  1494. package/esm2015/tabs/testing/tab-nav-bar-harness.js +0 -61
  1495. package/esm2015/tabs/testing/testing.externs.js +0 -0
  1496. package/esm2015/toolbar/testing/testing.externs.js +0 -0
  1497. package/esm2015/toolbar/testing/toolbar-harness.js +0 -47
  1498. package/esm2015/toolbar/toolbar-module.js +0 -20
  1499. package/esm2015/toolbar/toolbar.externs.js +0 -6
  1500. package/esm2015/toolbar/toolbar.js +0 -91
  1501. package/esm2015/tooltip/testing/testing.externs.js +0 -0
  1502. package/esm2015/tooltip/testing/tooltip-harness.js +0 -68
  1503. package/esm2015/tooltip/tooltip-module.js +0 -31
  1504. package/esm2015/tooltip/tooltip.externs.js +0 -6
  1505. package/esm2015/tooltip/tooltip.js +0 -737
  1506. package/esm2015/tree/node.js +0 -131
  1507. package/esm2015/tree/outlet.js +0 -33
  1508. package/esm2015/tree/padding.js +0 -31
  1509. package/esm2015/tree/testing/node-harness.js +0 -84
  1510. package/esm2015/tree/testing/testing.externs.js +0 -0
  1511. package/esm2015/tree/testing/tree-harness.js +0 -129
  1512. package/esm2015/tree/toggle.js +0 -32
  1513. package/esm2015/tree/tree-module.js +0 -34
  1514. package/esm2015/tree/tree.externs.js +0 -6
  1515. package/esm2015/tree/tree.js +0 -43
  1516. package/expansion/index.metadata.json +0 -1
  1517. package/fesm2015/autocomplete/testing.js +0 -147
  1518. package/fesm2015/autocomplete/testing.js.map +0 -1
  1519. package/fesm2015/autocomplete.js +0 -901
  1520. package/fesm2015/autocomplete.js.map +0 -1
  1521. package/fesm2015/badge/testing.js +0 -112
  1522. package/fesm2015/badge/testing.js.map +0 -1
  1523. package/fesm2015/badge.js +0 -265
  1524. package/fesm2015/badge.js.map +0 -1
  1525. package/fesm2015/bottom-sheet/testing.js +0 -67
  1526. package/fesm2015/bottom-sheet/testing.js.map +0 -1
  1527. package/fesm2015/bottom-sheet.js +0 -603
  1528. package/fesm2015/bottom-sheet.js.map +0 -1
  1529. package/fesm2015/button/testing.js +0 -91
  1530. package/fesm2015/button/testing.js.map +0 -1
  1531. package/fesm2015/button-toggle/testing.js +0 -211
  1532. package/fesm2015/button-toggle/testing.js.map +0 -1
  1533. package/fesm2015/button-toggle.js +0 -473
  1534. package/fesm2015/button-toggle.js.map +0 -1
  1535. package/fesm2015/button.js +0 -205
  1536. package/fesm2015/button.js.map +0 -1
  1537. package/fesm2015/card/testing.js +0 -79
  1538. package/fesm2015/card/testing.js.map +0 -1
  1539. package/fesm2015/card.js +0 -276
  1540. package/fesm2015/card.js.map +0 -1
  1541. package/fesm2015/checkbox/testing.js +0 -183
  1542. package/fesm2015/checkbox/testing.js.map +0 -1
  1543. package/fesm2015/checkbox.js +0 -476
  1544. package/fesm2015/checkbox.js.map +0 -1
  1545. package/fesm2015/chips/testing.js +0 -465
  1546. package/fesm2015/chips/testing.js.map +0 -1
  1547. package/fesm2015/chips.js +0 -1286
  1548. package/fesm2015/chips.js.map +0 -1
  1549. package/fesm2015/core/testing.js +0 -150
  1550. package/fesm2015/core/testing.js.map +0 -1
  1551. package/fesm2015/core.js +0 -1692
  1552. package/fesm2015/core.js.map +0 -1
  1553. package/fesm2015/datepicker/testing.js +0 -692
  1554. package/fesm2015/datepicker/testing.js.map +0 -1
  1555. package/fesm2015/datepicker.js +0 -3745
  1556. package/fesm2015/datepicker.js.map +0 -1
  1557. package/fesm2015/dialog/testing.js +0 -130
  1558. package/fesm2015/dialog/testing.js.map +0 -1
  1559. package/fesm2015/dialog.js +0 -1127
  1560. package/fesm2015/dialog.js.map +0 -1
  1561. package/fesm2015/divider/testing.js +0 -54
  1562. package/fesm2015/divider/testing.js.map +0 -1
  1563. package/fesm2015/divider.js +0 -76
  1564. package/fesm2015/divider.js.map +0 -1
  1565. package/fesm2015/expansion/testing.js +0 -209
  1566. package/fesm2015/expansion/testing.js.map +0 -1
  1567. package/fesm2015/expansion.js +0 -600
  1568. package/fesm2015/expansion.js.map +0 -1
  1569. package/fesm2015/form-field/testing/control.js +0 -26
  1570. package/fesm2015/form-field/testing/control.js.map +0 -1
  1571. package/fesm2015/form-field/testing.js +0 -246
  1572. package/fesm2015/form-field/testing.js.map +0 -1
  1573. package/fesm2015/form-field.js +0 -757
  1574. package/fesm2015/form-field.js.map +0 -1
  1575. package/fesm2015/grid-list/testing.js +0 -183
  1576. package/fesm2015/grid-list/testing.js.map +0 -1
  1577. package/fesm2015/grid-list.js +0 -680
  1578. package/fesm2015/grid-list.js.map +0 -1
  1579. package/fesm2015/icon/testing.js +0 -171
  1580. package/fesm2015/icon/testing.js.map +0 -1
  1581. package/fesm2015/icon.js +0 -1012
  1582. package/fesm2015/icon.js.map +0 -1
  1583. package/fesm2015/input/testing.js +0 -318
  1584. package/fesm2015/input/testing.js.map +0 -1
  1585. package/fesm2015/input.js +0 -506
  1586. package/fesm2015/input.js.map +0 -1
  1587. package/fesm2015/list/testing.js +0 -529
  1588. package/fesm2015/list/testing.js.map +0 -1
  1589. package/fesm2015/list.js +0 -876
  1590. package/fesm2015/list.js.map +0 -1
  1591. package/fesm2015/material.js +0 -16
  1592. package/fesm2015/material.js.map +0 -1
  1593. package/fesm2015/menu/testing.js +0 -250
  1594. package/fesm2015/menu/testing.js.map +0 -1
  1595. package/fesm2015/menu.js +0 -1292
  1596. package/fesm2015/menu.js.map +0 -1
  1597. package/fesm2015/paginator/testing.js +0 -133
  1598. package/fesm2015/paginator/testing.js.map +0 -1
  1599. package/fesm2015/paginator.js +0 -366
  1600. package/fesm2015/paginator.js.map +0 -1
  1601. package/fesm2015/progress-bar/testing.js +0 -66
  1602. package/fesm2015/progress-bar/testing.js.map +0 -1
  1603. package/fesm2015/progress-bar.js +0 -211
  1604. package/fesm2015/progress-bar.js.map +0 -1
  1605. package/fesm2015/progress-spinner/testing.js +0 -67
  1606. package/fesm2015/progress-spinner/testing.js.map +0 -1
  1607. package/fesm2015/progress-spinner.js +0 -313
  1608. package/fesm2015/progress-spinner.js.map +0 -1
  1609. package/fesm2015/radio/testing.js +0 -299
  1610. package/fesm2015/radio/testing.js.map +0 -1
  1611. package/fesm2015/radio.js +0 -578
  1612. package/fesm2015/radio.js.map +0 -1
  1613. package/fesm2015/select/testing.js +0 -184
  1614. package/fesm2015/select/testing.js.map +0 -1
  1615. package/fesm2015/select.js +0 -1269
  1616. package/fesm2015/select.js.map +0 -1
  1617. package/fesm2015/sidenav/testing.js +0 -231
  1618. package/fesm2015/sidenav/testing.js.map +0 -1
  1619. package/fesm2015/sidenav.js +0 -965
  1620. package/fesm2015/sidenav.js.map +0 -1
  1621. package/fesm2015/slide-toggle/testing.js +0 -166
  1622. package/fesm2015/slide-toggle/testing.js.map +0 -1
  1623. package/fesm2015/slide-toggle.js +0 -329
  1624. package/fesm2015/slide-toggle.js.map +0 -1
  1625. package/fesm2015/slider/testing.js +0 -160
  1626. package/fesm2015/slider/testing.js.map +0 -1
  1627. package/fesm2015/slider.js +0 -820
  1628. package/fesm2015/slider.js.map +0 -1
  1629. package/fesm2015/snack-bar/testing.js +0 -169
  1630. package/fesm2015/snack-bar/testing.js.map +0 -1
  1631. package/fesm2015/snack-bar.js +0 -713
  1632. package/fesm2015/snack-bar.js.map +0 -1
  1633. package/fesm2015/sort/testing.js +0 -124
  1634. package/fesm2015/sort/testing.js.map +0 -1
  1635. package/fesm2015/sort.js +0 -587
  1636. package/fesm2015/sort.js.map +0 -1
  1637. package/fesm2015/stepper/testing.js +0 -237
  1638. package/fesm2015/stepper/testing.js.map +0 -1
  1639. package/fesm2015/stepper.js +0 -519
  1640. package/fesm2015/stepper.js.map +0 -1
  1641. package/fesm2015/table/testing.js +0 -280
  1642. package/fesm2015/table/testing.js.map +0 -1
  1643. package/fesm2015/table.js +0 -701
  1644. package/fesm2015/table.js.map +0 -1
  1645. package/fesm2015/tabs/testing.js +0 -273
  1646. package/fesm2015/tabs/testing.js.map +0 -1
  1647. package/fesm2015/tabs.js +0 -1746
  1648. package/fesm2015/tabs.js.map +0 -1
  1649. package/fesm2015/toolbar/testing.js +0 -74
  1650. package/fesm2015/toolbar/testing.js.map +0 -1
  1651. package/fesm2015/toolbar.js +0 -123
  1652. package/fesm2015/toolbar.js.map +0 -1
  1653. package/fesm2015/tooltip/testing.js +0 -95
  1654. package/fesm2015/tooltip/testing.js.map +0 -1
  1655. package/fesm2015/tooltip.js +0 -802
  1656. package/fesm2015/tooltip.js.map +0 -1
  1657. package/fesm2015/tree/testing.js +0 -237
  1658. package/fesm2015/tree/testing.js.map +0 -1
  1659. package/fesm2015/tree.js +0 -479
  1660. package/fesm2015/tree.js.map +0 -1
  1661. package/form-field/index.metadata.json +0 -1
  1662. package/grid-list/index.metadata.json +0 -1
  1663. package/icon/index.metadata.json +0 -1
  1664. package/icon/testing/index.metadata.json +0 -1
  1665. package/input/autosize.d.ts +0 -23
  1666. package/input/index.metadata.json +0 -1
  1667. package/list/index.metadata.json +0 -1
  1668. package/menu/index.metadata.json +0 -1
  1669. package/paginator/index.metadata.json +0 -1
  1670. package/progress-bar/index.metadata.json +0 -1
  1671. package/progress-spinner/index.metadata.json +0 -1
  1672. package/radio/index.metadata.json +0 -1
  1673. package/select/index.metadata.json +0 -1
  1674. package/sidenav/index.metadata.json +0 -1
  1675. package/slide-toggle/index.metadata.json +0 -1
  1676. package/slider/index.metadata.json +0 -1
  1677. package/snack-bar/index.metadata.json +0 -1
  1678. package/sort/index.metadata.json +0 -1
  1679. package/stepper/index.metadata.json +0 -1
  1680. package/table/index.metadata.json +0 -1
  1681. package/tabs/index.metadata.json +0 -1
  1682. package/toolbar/index.metadata.json +0 -1
  1683. package/tooltip/index.metadata.json +0 -1
  1684. package/tree/index.metadata.json +0 -1
@@ -1,1138 +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 { ActiveDescendantKeyManager, LiveAnnouncer } from '@angular/cdk/a11y';
9
- import { Directionality } from '@angular/cdk/bidi';
10
- import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';
11
- import { SelectionModel } from '@angular/cdk/collections';
12
- import { A, DOWN_ARROW, ENTER, hasModifierKey, LEFT_ARROW, RIGHT_ARROW, SPACE, UP_ARROW, } from '@angular/cdk/keycodes';
13
- import { CdkConnectedOverlay, Overlay, } from '@angular/cdk/overlay';
14
- import { ViewportRuler } from '@angular/cdk/scrolling';
15
- import { Attribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, Directive, ElementRef, EventEmitter, Inject, InjectionToken, Input, NgZone, Optional, Output, QueryList, Self, ViewChild, ViewEncapsulation, } from '@angular/core';
16
- import { FormGroupDirective, NgControl, NgForm } from '@angular/forms';
17
- import { _countGroupLabelsBeforeOption, _getOptionScrollPosition, ErrorStateMatcher, MAT_OPTGROUP, MAT_OPTION_PARENT_COMPONENT, MatOption, mixinDisabled, mixinDisableRipple, mixinErrorState, mixinTabIndex, } from '@angular/material/core';
18
- import { MAT_FORM_FIELD, MatFormField, MatFormFieldControl } from '@angular/material/form-field';
19
- import { defer, merge, Observable, Subject } from 'rxjs';
20
- import { distinctUntilChanged, filter, map, startWith, switchMap, take, takeUntil, } from 'rxjs/operators';
21
- import { matSelectAnimations } from './select-animations';
22
- import { getMatSelectDynamicMultipleError, getMatSelectNonArrayValueError, getMatSelectNonFunctionValueError, } from './select-errors';
23
- let nextUniqueId = 0;
24
- /**
25
- * The following style constants are necessary to save here in order
26
- * to properly calculate the alignment of the selected option over
27
- * the trigger element.
28
- */
29
- /** The max height of the select's overlay panel. */
30
- export const SELECT_PANEL_MAX_HEIGHT = 256;
31
- /** The panel's padding on the x-axis. */
32
- export const SELECT_PANEL_PADDING_X = 16;
33
- /** The panel's x axis padding if it is indented (e.g. there is an option group). */
34
- export const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;
35
- /** The height of the select items in `em` units. */
36
- export const SELECT_ITEM_HEIGHT_EM = 3;
37
- // TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.
38
- /**
39
- * Distance between the panel edge and the option text in
40
- * multi-selection mode.
41
- *
42
- * Calculated as:
43
- * (SELECT_PANEL_PADDING_X * 1.5) + 16 = 40
44
- * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.
45
- * The checkbox width is 16px.
46
- */
47
- export const SELECT_MULTIPLE_PANEL_PADDING_X = SELECT_PANEL_PADDING_X * 1.5 + 16;
48
- /**
49
- * The select panel will only "fit" inside the viewport if it is positioned at
50
- * this value or more away from the viewport boundary.
51
- */
52
- export const SELECT_PANEL_VIEWPORT_PADDING = 8;
53
- /** Injection token that determines the scroll handling while a select is open. */
54
- export const MAT_SELECT_SCROLL_STRATEGY = new InjectionToken('mat-select-scroll-strategy');
55
- /** @docs-private */
56
- export function MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay) {
57
- return () => overlay.scrollStrategies.reposition();
58
- }
59
- /** Injection token that can be used to provide the default options the select module. */
60
- export const MAT_SELECT_CONFIG = new InjectionToken('MAT_SELECT_CONFIG');
61
- /** @docs-private */
62
- export const MAT_SELECT_SCROLL_STRATEGY_PROVIDER = {
63
- provide: MAT_SELECT_SCROLL_STRATEGY,
64
- deps: [Overlay],
65
- useFactory: MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY,
66
- };
67
- /** Change event object that is emitted when the select value has changed. */
68
- export class MatSelectChange {
69
- constructor(
70
- /** Reference to the select that emitted the change event. */
71
- source,
72
- /** Current value of the select that emitted the event. */
73
- value) {
74
- this.source = source;
75
- this.value = value;
76
- }
77
- }
78
- // Boilerplate for applying mixins to MatSelect.
79
- /** @docs-private */
80
- const _MatSelectMixinBase = mixinDisableRipple(mixinTabIndex(mixinDisabled(mixinErrorState(class {
81
- constructor(_elementRef, _defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl) {
82
- this._elementRef = _elementRef;
83
- this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
84
- this._parentForm = _parentForm;
85
- this._parentFormGroup = _parentFormGroup;
86
- this.ngControl = ngControl;
87
- }
88
- }))));
89
- /**
90
- * Injection token that can be used to reference instances of `MatSelectTrigger`. It serves as
91
- * alternative token to the actual `MatSelectTrigger` class which could cause unnecessary
92
- * retention of the class and its directive metadata.
93
- */
94
- export const MAT_SELECT_TRIGGER = new InjectionToken('MatSelectTrigger');
95
- /**
96
- * Allows the user to customize the trigger that is displayed when the select has a value.
97
- */
98
- export class MatSelectTrigger {
99
- }
100
- MatSelectTrigger.decorators = [
101
- { type: Directive, args: [{
102
- selector: 'mat-select-trigger',
103
- providers: [{ provide: MAT_SELECT_TRIGGER, useExisting: MatSelectTrigger }],
104
- },] }
105
- ];
106
- /** Base class with all of the `MatSelect` functionality. */
107
- export class _MatSelectBase extends _MatSelectMixinBase {
108
- constructor(_viewportRuler, _changeDetectorRef, _ngZone, _defaultErrorStateMatcher, elementRef, _dir, _parentForm, _parentFormGroup, _parentFormField, ngControl, tabIndex, scrollStrategyFactory, _liveAnnouncer, _defaultOptions) {
109
- var _a, _b, _c;
110
- super(elementRef, _defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl);
111
- this._viewportRuler = _viewportRuler;
112
- this._changeDetectorRef = _changeDetectorRef;
113
- this._ngZone = _ngZone;
114
- this._dir = _dir;
115
- this._parentFormField = _parentFormField;
116
- this._liveAnnouncer = _liveAnnouncer;
117
- this._defaultOptions = _defaultOptions;
118
- /** Whether or not the overlay panel is open. */
119
- this._panelOpen = false;
120
- /** Comparison function to specify which option is displayed. Defaults to object equality. */
121
- this._compareWith = (o1, o2) => o1 === o2;
122
- /** Unique id for this input. */
123
- this._uid = `mat-select-${nextUniqueId++}`;
124
- /** Current `ariar-labelledby` value for the select trigger. */
125
- this._triggerAriaLabelledBy = null;
126
- /** Emits whenever the component is destroyed. */
127
- this._destroy = new Subject();
128
- /** `View -> model callback called when value changes` */
129
- this._onChange = () => { };
130
- /** `View -> model callback called when select has been touched` */
131
- this._onTouched = () => { };
132
- /** ID for the DOM node containing the select's value. */
133
- this._valueId = `mat-select-value-${nextUniqueId++}`;
134
- /** Emits when the panel element is finished transforming in. */
135
- this._panelDoneAnimatingStream = new Subject();
136
- this._overlayPanelClass = ((_a = this._defaultOptions) === null || _a === void 0 ? void 0 : _a.overlayPanelClass) || '';
137
- this._focused = false;
138
- /** A name for this control that can be used by `mat-form-field`. */
139
- this.controlType = 'mat-select';
140
- this._required = false;
141
- this._multiple = false;
142
- this._disableOptionCentering = (_c = (_b = this._defaultOptions) === null || _b === void 0 ? void 0 : _b.disableOptionCentering) !== null && _c !== void 0 ? _c : false;
143
- /** Aria label of the select. */
144
- this.ariaLabel = '';
145
- /** Combined stream of all of the child options' change events. */
146
- this.optionSelectionChanges = defer(() => {
147
- const options = this.options;
148
- if (options) {
149
- return options.changes.pipe(startWith(options), switchMap(() => merge(...options.map(option => option.onSelectionChange))));
150
- }
151
- return this._ngZone.onStable
152
- .pipe(take(1), switchMap(() => this.optionSelectionChanges));
153
- });
154
- /** Event emitted when the select panel has been toggled. */
155
- this.openedChange = new EventEmitter();
156
- /** Event emitted when the select has been opened. */
157
- this._openedStream = this.openedChange.pipe(filter(o => o), map(() => { }));
158
- /** Event emitted when the select has been closed. */
159
- this._closedStream = this.openedChange.pipe(filter(o => !o), map(() => { }));
160
- /** Event emitted when the selected value has been changed by the user. */
161
- this.selectionChange = new EventEmitter();
162
- /**
163
- * Event that emits whenever the raw value of the select changes. This is here primarily
164
- * to facilitate the two-way binding for the `value` input.
165
- * @docs-private
166
- */
167
- this.valueChange = new EventEmitter();
168
- if (this.ngControl) {
169
- // Note: we provide the value accessor through here, instead of
170
- // the `providers` to avoid running into a circular import.
171
- this.ngControl.valueAccessor = this;
172
- }
173
- // Note that we only want to set this when the defaults pass it in, otherwise it should
174
- // stay as `undefined` so that it falls back to the default in the key manager.
175
- if ((_defaultOptions === null || _defaultOptions === void 0 ? void 0 : _defaultOptions.typeaheadDebounceInterval) != null) {
176
- this._typeaheadDebounceInterval = _defaultOptions.typeaheadDebounceInterval;
177
- }
178
- this._scrollStrategyFactory = scrollStrategyFactory;
179
- this._scrollStrategy = this._scrollStrategyFactory();
180
- this.tabIndex = parseInt(tabIndex) || 0;
181
- // Force setter to be called in case id was not specified.
182
- this.id = this.id;
183
- }
184
- /** Whether the select is focused. */
185
- get focused() {
186
- return this._focused || this._panelOpen;
187
- }
188
- /** Placeholder to be shown if no value has been selected. */
189
- get placeholder() { return this._placeholder; }
190
- set placeholder(value) {
191
- this._placeholder = value;
192
- this.stateChanges.next();
193
- }
194
- /** Whether the component is required. */
195
- get required() { return this._required; }
196
- set required(value) {
197
- this._required = coerceBooleanProperty(value);
198
- this.stateChanges.next();
199
- }
200
- /** Whether the user should be allowed to select multiple options. */
201
- get multiple() { return this._multiple; }
202
- set multiple(value) {
203
- if (this._selectionModel && (typeof ngDevMode === 'undefined' || ngDevMode)) {
204
- throw getMatSelectDynamicMultipleError();
205
- }
206
- this._multiple = coerceBooleanProperty(value);
207
- }
208
- /** Whether to center the active option over the trigger. */
209
- get disableOptionCentering() { return this._disableOptionCentering; }
210
- set disableOptionCentering(value) {
211
- this._disableOptionCentering = coerceBooleanProperty(value);
212
- }
213
- /**
214
- * Function to compare the option values with the selected values. The first argument
215
- * is a value from an option. The second is a value from the selection. A boolean
216
- * should be returned.
217
- */
218
- get compareWith() { return this._compareWith; }
219
- set compareWith(fn) {
220
- if (typeof fn !== 'function' && (typeof ngDevMode === 'undefined' || ngDevMode)) {
221
- throw getMatSelectNonFunctionValueError();
222
- }
223
- this._compareWith = fn;
224
- if (this._selectionModel) {
225
- // A different comparator means the selection could change.
226
- this._initializeSelection();
227
- }
228
- }
229
- /** Value of the select control. */
230
- get value() { return this._value; }
231
- set value(newValue) {
232
- // Always re-assign an array, because it might have been mutated.
233
- if (newValue !== this._value || (this._multiple && Array.isArray(newValue))) {
234
- if (this.options) {
235
- this._setSelectionByValue(newValue);
236
- }
237
- this._value = newValue;
238
- }
239
- }
240
- /** Time to wait in milliseconds after the last keystroke before moving focus to an item. */
241
- get typeaheadDebounceInterval() { return this._typeaheadDebounceInterval; }
242
- set typeaheadDebounceInterval(value) {
243
- this._typeaheadDebounceInterval = coerceNumberProperty(value);
244
- }
245
- /** Unique id of the element. */
246
- get id() { return this._id; }
247
- set id(value) {
248
- this._id = value || this._uid;
249
- this.stateChanges.next();
250
- }
251
- ngOnInit() {
252
- this._selectionModel = new SelectionModel(this.multiple);
253
- this.stateChanges.next();
254
- // We need `distinctUntilChanged` here, because some browsers will
255
- // fire the animation end event twice for the same animation. See:
256
- // https://github.com/angular/angular/issues/24084
257
- this._panelDoneAnimatingStream
258
- .pipe(distinctUntilChanged(), takeUntil(this._destroy))
259
- .subscribe(() => this._panelDoneAnimating(this.panelOpen));
260
- }
261
- ngAfterContentInit() {
262
- this._initKeyManager();
263
- this._selectionModel.changed.pipe(takeUntil(this._destroy)).subscribe(event => {
264
- event.added.forEach(option => option.select());
265
- event.removed.forEach(option => option.deselect());
266
- });
267
- this.options.changes.pipe(startWith(null), takeUntil(this._destroy)).subscribe(() => {
268
- this._resetOptions();
269
- this._initializeSelection();
270
- });
271
- }
272
- ngDoCheck() {
273
- const newAriaLabelledby = this._getTriggerAriaLabelledby();
274
- // We have to manage setting the `aria-labelledby` ourselves, because part of its value
275
- // is computed as a result of a content query which can cause this binding to trigger a
276
- // "changed after checked" error.
277
- if (newAriaLabelledby !== this._triggerAriaLabelledBy) {
278
- const element = this._elementRef.nativeElement;
279
- this._triggerAriaLabelledBy = newAriaLabelledby;
280
- if (newAriaLabelledby) {
281
- element.setAttribute('aria-labelledby', newAriaLabelledby);
282
- }
283
- else {
284
- element.removeAttribute('aria-labelledby');
285
- }
286
- }
287
- if (this.ngControl) {
288
- this.updateErrorState();
289
- }
290
- }
291
- ngOnChanges(changes) {
292
- // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let
293
- // the parent form field know to run change detection when the disabled state changes.
294
- if (changes['disabled']) {
295
- this.stateChanges.next();
296
- }
297
- if (changes['typeaheadDebounceInterval'] && this._keyManager) {
298
- this._keyManager.withTypeAhead(this._typeaheadDebounceInterval);
299
- }
300
- }
301
- ngOnDestroy() {
302
- this._destroy.next();
303
- this._destroy.complete();
304
- this.stateChanges.complete();
305
- }
306
- /** Toggles the overlay panel open or closed. */
307
- toggle() {
308
- this.panelOpen ? this.close() : this.open();
309
- }
310
- /** Opens the overlay panel. */
311
- open() {
312
- if (this._canOpen()) {
313
- this._panelOpen = true;
314
- this._keyManager.withHorizontalOrientation(null);
315
- this._highlightCorrectOption();
316
- this._changeDetectorRef.markForCheck();
317
- }
318
- }
319
- /** Closes the overlay panel and focuses the host element. */
320
- close() {
321
- if (this._panelOpen) {
322
- this._panelOpen = false;
323
- this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');
324
- this._changeDetectorRef.markForCheck();
325
- this._onTouched();
326
- }
327
- }
328
- /**
329
- * Sets the select's value. Part of the ControlValueAccessor interface
330
- * required to integrate with Angular's core forms API.
331
- *
332
- * @param value New value to be written to the model.
333
- */
334
- writeValue(value) {
335
- this.value = value;
336
- }
337
- /**
338
- * Saves a callback function to be invoked when the select's value
339
- * changes from user input. Part of the ControlValueAccessor interface
340
- * required to integrate with Angular's core forms API.
341
- *
342
- * @param fn Callback to be triggered when the value changes.
343
- */
344
- registerOnChange(fn) {
345
- this._onChange = fn;
346
- }
347
- /**
348
- * Saves a callback function to be invoked when the select is blurred
349
- * by the user. Part of the ControlValueAccessor interface required
350
- * to integrate with Angular's core forms API.
351
- *
352
- * @param fn Callback to be triggered when the component has been touched.
353
- */
354
- registerOnTouched(fn) {
355
- this._onTouched = fn;
356
- }
357
- /**
358
- * Disables the select. Part of the ControlValueAccessor interface required
359
- * to integrate with Angular's core forms API.
360
- *
361
- * @param isDisabled Sets whether the component is disabled.
362
- */
363
- setDisabledState(isDisabled) {
364
- this.disabled = isDisabled;
365
- this._changeDetectorRef.markForCheck();
366
- this.stateChanges.next();
367
- }
368
- /** Whether or not the overlay panel is open. */
369
- get panelOpen() {
370
- return this._panelOpen;
371
- }
372
- /** The currently selected option. */
373
- get selected() {
374
- return this.multiple ? this._selectionModel.selected : this._selectionModel.selected[0];
375
- }
376
- /** The value displayed in the trigger. */
377
- get triggerValue() {
378
- if (this.empty) {
379
- return '';
380
- }
381
- if (this._multiple) {
382
- const selectedOptions = this._selectionModel.selected.map(option => option.viewValue);
383
- if (this._isRtl()) {
384
- selectedOptions.reverse();
385
- }
386
- // TODO(crisbeto): delimiter should be configurable for proper localization.
387
- return selectedOptions.join(', ');
388
- }
389
- return this._selectionModel.selected[0].viewValue;
390
- }
391
- /** Whether the element is in RTL mode. */
392
- _isRtl() {
393
- return this._dir ? this._dir.value === 'rtl' : false;
394
- }
395
- /** Handles all keydown events on the select. */
396
- _handleKeydown(event) {
397
- if (!this.disabled) {
398
- this.panelOpen ? this._handleOpenKeydown(event) : this._handleClosedKeydown(event);
399
- }
400
- }
401
- /** Handles keyboard events while the select is closed. */
402
- _handleClosedKeydown(event) {
403
- const keyCode = event.keyCode;
404
- const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW ||
405
- keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW;
406
- const isOpenKey = keyCode === ENTER || keyCode === SPACE;
407
- const manager = this._keyManager;
408
- // Open the select on ALT + arrow key to match the native <select>
409
- if (!manager.isTyping() && (isOpenKey && !hasModifierKey(event)) ||
410
- ((this.multiple || event.altKey) && isArrowKey)) {
411
- event.preventDefault(); // prevents the page from scrolling down when pressing space
412
- this.open();
413
- }
414
- else if (!this.multiple) {
415
- const previouslySelectedOption = this.selected;
416
- manager.onKeydown(event);
417
- const selectedOption = this.selected;
418
- // Since the value has changed, we need to announce it ourselves.
419
- if (selectedOption && previouslySelectedOption !== selectedOption) {
420
- // We set a duration on the live announcement, because we want the live element to be
421
- // cleared after a while so that users can't navigate to it using the arrow keys.
422
- this._liveAnnouncer.announce(selectedOption.viewValue, 10000);
423
- }
424
- }
425
- }
426
- /** Handles keyboard events when the selected is open. */
427
- _handleOpenKeydown(event) {
428
- const manager = this._keyManager;
429
- const keyCode = event.keyCode;
430
- const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
431
- const isTyping = manager.isTyping();
432
- if (isArrowKey && event.altKey) {
433
- // Close the select on ALT + arrow key to match the native <select>
434
- event.preventDefault();
435
- this.close();
436
- // Don't do anything in this case if the user is typing,
437
- // because the typing sequence can include the space key.
438
- }
439
- else if (!isTyping && (keyCode === ENTER || keyCode === SPACE) && manager.activeItem &&
440
- !hasModifierKey(event)) {
441
- event.preventDefault();
442
- manager.activeItem._selectViaInteraction();
443
- }
444
- else if (!isTyping && this._multiple && keyCode === A && event.ctrlKey) {
445
- event.preventDefault();
446
- const hasDeselectedOptions = this.options.some(opt => !opt.disabled && !opt.selected);
447
- this.options.forEach(option => {
448
- if (!option.disabled) {
449
- hasDeselectedOptions ? option.select() : option.deselect();
450
- }
451
- });
452
- }
453
- else {
454
- const previouslyFocusedIndex = manager.activeItemIndex;
455
- manager.onKeydown(event);
456
- if (this._multiple && isArrowKey && event.shiftKey && manager.activeItem &&
457
- manager.activeItemIndex !== previouslyFocusedIndex) {
458
- manager.activeItem._selectViaInteraction();
459
- }
460
- }
461
- }
462
- _onFocus() {
463
- if (!this.disabled) {
464
- this._focused = true;
465
- this.stateChanges.next();
466
- }
467
- }
468
- /**
469
- * Calls the touched callback only if the panel is closed. Otherwise, the trigger will
470
- * "blur" to the panel when it opens, causing a false positive.
471
- */
472
- _onBlur() {
473
- this._focused = false;
474
- if (!this.disabled && !this.panelOpen) {
475
- this._onTouched();
476
- this._changeDetectorRef.markForCheck();
477
- this.stateChanges.next();
478
- }
479
- }
480
- /**
481
- * Callback that is invoked when the overlay panel has been attached.
482
- */
483
- _onAttached() {
484
- this._overlayDir.positionChange.pipe(take(1)).subscribe(() => {
485
- this._changeDetectorRef.detectChanges();
486
- this._positioningSettled();
487
- });
488
- }
489
- /** Returns the theme to be used on the panel. */
490
- _getPanelTheme() {
491
- return this._parentFormField ? `mat-${this._parentFormField.color}` : '';
492
- }
493
- /** Whether the select has a value. */
494
- get empty() {
495
- return !this._selectionModel || this._selectionModel.isEmpty();
496
- }
497
- _initializeSelection() {
498
- // Defer setting the value in order to avoid the "Expression
499
- // has changed after it was checked" errors from Angular.
500
- Promise.resolve().then(() => {
501
- this._setSelectionByValue(this.ngControl ? this.ngControl.value : this._value);
502
- this.stateChanges.next();
503
- });
504
- }
505
- /**
506
- * Sets the selected option based on a value. If no option can be
507
- * found with the designated value, the select trigger is cleared.
508
- */
509
- _setSelectionByValue(value) {
510
- this._selectionModel.selected.forEach(option => option.setInactiveStyles());
511
- this._selectionModel.clear();
512
- if (this.multiple && value) {
513
- if (!Array.isArray(value) && (typeof ngDevMode === 'undefined' || ngDevMode)) {
514
- throw getMatSelectNonArrayValueError();
515
- }
516
- value.forEach((currentValue) => this._selectValue(currentValue));
517
- this._sortValues();
518
- }
519
- else {
520
- const correspondingOption = this._selectValue(value);
521
- // Shift focus to the active item. Note that we shouldn't do this in multiple
522
- // mode, because we don't know what option the user interacted with last.
523
- if (correspondingOption) {
524
- this._keyManager.updateActiveItem(correspondingOption);
525
- }
526
- else if (!this.panelOpen) {
527
- // Otherwise reset the highlighted option. Note that we only want to do this while
528
- // closed, because doing it while open can shift the user's focus unnecessarily.
529
- this._keyManager.updateActiveItem(-1);
530
- }
531
- }
532
- this._changeDetectorRef.markForCheck();
533
- }
534
- /**
535
- * Finds and selects and option based on its value.
536
- * @returns Option that has the corresponding value.
537
- */
538
- _selectValue(value) {
539
- const correspondingOption = this.options.find((option) => {
540
- // Skip options that are already in the model. This allows us to handle cases
541
- // where the same primitive value is selected multiple times.
542
- if (this._selectionModel.isSelected(option)) {
543
- return false;
544
- }
545
- try {
546
- // Treat null as a special reset value.
547
- return option.value != null && this._compareWith(option.value, value);
548
- }
549
- catch (error) {
550
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
551
- // Notify developers of errors in their comparator.
552
- console.warn(error);
553
- }
554
- return false;
555
- }
556
- });
557
- if (correspondingOption) {
558
- this._selectionModel.select(correspondingOption);
559
- }
560
- return correspondingOption;
561
- }
562
- /** Sets up a key manager to listen to keyboard events on the overlay panel. */
563
- _initKeyManager() {
564
- this._keyManager = new ActiveDescendantKeyManager(this.options)
565
- .withTypeAhead(this._typeaheadDebounceInterval)
566
- .withVerticalOrientation()
567
- .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')
568
- .withHomeAndEnd()
569
- .withAllowedModifierKeys(['shiftKey']);
570
- this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {
571
- if (this.panelOpen) {
572
- // Select the active item when tabbing away. This is consistent with how the native
573
- // select behaves. Note that we only want to do this in single selection mode.
574
- if (!this.multiple && this._keyManager.activeItem) {
575
- this._keyManager.activeItem._selectViaInteraction();
576
- }
577
- // Restore focus to the trigger before closing. Ensures that the focus
578
- // position won't be lost if the user got focus into the overlay.
579
- this.focus();
580
- this.close();
581
- }
582
- });
583
- this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {
584
- if (this._panelOpen && this.panel) {
585
- this._scrollOptionIntoView(this._keyManager.activeItemIndex || 0);
586
- }
587
- else if (!this._panelOpen && !this.multiple && this._keyManager.activeItem) {
588
- this._keyManager.activeItem._selectViaInteraction();
589
- }
590
- });
591
- }
592
- /** Drops current option subscriptions and IDs and resets from scratch. */
593
- _resetOptions() {
594
- const changedOrDestroyed = merge(this.options.changes, this._destroy);
595
- this.optionSelectionChanges.pipe(takeUntil(changedOrDestroyed)).subscribe(event => {
596
- this._onSelect(event.source, event.isUserInput);
597
- if (event.isUserInput && !this.multiple && this._panelOpen) {
598
- this.close();
599
- this.focus();
600
- }
601
- });
602
- // Listen to changes in the internal state of the options and react accordingly.
603
- // Handles cases like the labels of the selected options changing.
604
- merge(...this.options.map(option => option._stateChanges))
605
- .pipe(takeUntil(changedOrDestroyed))
606
- .subscribe(() => {
607
- this._changeDetectorRef.markForCheck();
608
- this.stateChanges.next();
609
- });
610
- }
611
- /** Invoked when an option is clicked. */
612
- _onSelect(option, isUserInput) {
613
- const wasSelected = this._selectionModel.isSelected(option);
614
- if (option.value == null && !this._multiple) {
615
- option.deselect();
616
- this._selectionModel.clear();
617
- if (this.value != null) {
618
- this._propagateChanges(option.value);
619
- }
620
- }
621
- else {
622
- if (wasSelected !== option.selected) {
623
- option.selected ? this._selectionModel.select(option) :
624
- this._selectionModel.deselect(option);
625
- }
626
- if (isUserInput) {
627
- this._keyManager.setActiveItem(option);
628
- }
629
- if (this.multiple) {
630
- this._sortValues();
631
- if (isUserInput) {
632
- // In case the user selected the option with their mouse, we
633
- // want to restore focus back to the trigger, in order to
634
- // prevent the select keyboard controls from clashing with
635
- // the ones from `mat-option`.
636
- this.focus();
637
- }
638
- }
639
- }
640
- if (wasSelected !== this._selectionModel.isSelected(option)) {
641
- this._propagateChanges();
642
- }
643
- this.stateChanges.next();
644
- }
645
- /** Sorts the selected values in the selected based on their order in the panel. */
646
- _sortValues() {
647
- if (this.multiple) {
648
- const options = this.options.toArray();
649
- this._selectionModel.sort((a, b) => {
650
- return this.sortComparator ? this.sortComparator(a, b, options) :
651
- options.indexOf(a) - options.indexOf(b);
652
- });
653
- this.stateChanges.next();
654
- }
655
- }
656
- /** Emits change event to set the model value. */
657
- _propagateChanges(fallbackValue) {
658
- let valueToEmit = null;
659
- if (this.multiple) {
660
- valueToEmit = this.selected.map(option => option.value);
661
- }
662
- else {
663
- valueToEmit = this.selected ? this.selected.value : fallbackValue;
664
- }
665
- this._value = valueToEmit;
666
- this.valueChange.emit(valueToEmit);
667
- this._onChange(valueToEmit);
668
- this.selectionChange.emit(this._getChangeEvent(valueToEmit));
669
- this._changeDetectorRef.markForCheck();
670
- }
671
- /**
672
- * Highlights the selected item. If no option is selected, it will highlight
673
- * the first item instead.
674
- */
675
- _highlightCorrectOption() {
676
- if (this._keyManager) {
677
- if (this.empty) {
678
- this._keyManager.setFirstItemActive();
679
- }
680
- else {
681
- this._keyManager.setActiveItem(this._selectionModel.selected[0]);
682
- }
683
- }
684
- }
685
- /** Whether the panel is allowed to open. */
686
- _canOpen() {
687
- var _a;
688
- return !this._panelOpen && !this.disabled && ((_a = this.options) === null || _a === void 0 ? void 0 : _a.length) > 0;
689
- }
690
- /** Focuses the select element. */
691
- focus(options) {
692
- this._elementRef.nativeElement.focus(options);
693
- }
694
- /** Gets the aria-labelledby for the select panel. */
695
- _getPanelAriaLabelledby() {
696
- var _a;
697
- if (this.ariaLabel) {
698
- return null;
699
- }
700
- const labelId = (_a = this._parentFormField) === null || _a === void 0 ? void 0 : _a.getLabelId();
701
- const labelExpression = (labelId ? labelId + ' ' : '');
702
- return this.ariaLabelledby ? labelExpression + this.ariaLabelledby : labelId;
703
- }
704
- /** Determines the `aria-activedescendant` to be set on the host. */
705
- _getAriaActiveDescendant() {
706
- if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {
707
- return this._keyManager.activeItem.id;
708
- }
709
- return null;
710
- }
711
- /** Gets the aria-labelledby of the select component trigger. */
712
- _getTriggerAriaLabelledby() {
713
- var _a;
714
- if (this.ariaLabel) {
715
- return null;
716
- }
717
- const labelId = (_a = this._parentFormField) === null || _a === void 0 ? void 0 : _a.getLabelId();
718
- let value = (labelId ? labelId + ' ' : '') + this._valueId;
719
- if (this.ariaLabelledby) {
720
- value += ' ' + this.ariaLabelledby;
721
- }
722
- return value;
723
- }
724
- /** Called when the overlay panel is done animating. */
725
- _panelDoneAnimating(isOpen) {
726
- this.openedChange.emit(isOpen);
727
- }
728
- /**
729
- * Implemented as part of MatFormFieldControl.
730
- * @docs-private
731
- */
732
- setDescribedByIds(ids) {
733
- this._ariaDescribedby = ids.join(' ');
734
- }
735
- /**
736
- * Implemented as part of MatFormFieldControl.
737
- * @docs-private
738
- */
739
- onContainerClick() {
740
- this.focus();
741
- this.open();
742
- }
743
- /**
744
- * Implemented as part of MatFormFieldControl.
745
- * @docs-private
746
- */
747
- get shouldLabelFloat() {
748
- return this._panelOpen || !this.empty || (this._focused && !!this._placeholder);
749
- }
750
- }
751
- _MatSelectBase.decorators = [
752
- { type: Directive }
753
- ];
754
- _MatSelectBase.ctorParameters = () => [
755
- { type: ViewportRuler },
756
- { type: ChangeDetectorRef },
757
- { type: NgZone },
758
- { type: ErrorStateMatcher },
759
- { type: ElementRef },
760
- { type: Directionality, decorators: [{ type: Optional }] },
761
- { type: NgForm, decorators: [{ type: Optional }] },
762
- { type: FormGroupDirective, decorators: [{ type: Optional }] },
763
- { type: MatFormField, decorators: [{ type: Optional }, { type: Inject, args: [MAT_FORM_FIELD,] }] },
764
- { type: NgControl, decorators: [{ type: Self }, { type: Optional }] },
765
- { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] },
766
- { type: undefined, decorators: [{ type: Inject, args: [MAT_SELECT_SCROLL_STRATEGY,] }] },
767
- { type: LiveAnnouncer },
768
- { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_SELECT_CONFIG,] }] }
769
- ];
770
- _MatSelectBase.propDecorators = {
771
- trigger: [{ type: ViewChild, args: ['trigger',] }],
772
- panel: [{ type: ViewChild, args: ['panel',] }],
773
- _overlayDir: [{ type: ViewChild, args: [CdkConnectedOverlay,] }],
774
- panelClass: [{ type: Input }],
775
- placeholder: [{ type: Input }],
776
- required: [{ type: Input }],
777
- multiple: [{ type: Input }],
778
- disableOptionCentering: [{ type: Input }],
779
- compareWith: [{ type: Input }],
780
- value: [{ type: Input }],
781
- ariaLabel: [{ type: Input, args: ['aria-label',] }],
782
- ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],
783
- errorStateMatcher: [{ type: Input }],
784
- typeaheadDebounceInterval: [{ type: Input }],
785
- sortComparator: [{ type: Input }],
786
- id: [{ type: Input }],
787
- openedChange: [{ type: Output }],
788
- _openedStream: [{ type: Output, args: ['opened',] }],
789
- _closedStream: [{ type: Output, args: ['closed',] }],
790
- selectionChange: [{ type: Output }],
791
- valueChange: [{ type: Output }]
792
- };
793
- export class MatSelect extends _MatSelectBase {
794
- constructor() {
795
- super(...arguments);
796
- /** The scroll position of the overlay panel, calculated to center the selected option. */
797
- this._scrollTop = 0;
798
- /** The cached font-size of the trigger element. */
799
- this._triggerFontSize = 0;
800
- /** The value of the select panel's transform-origin property. */
801
- this._transformOrigin = 'top';
802
- /**
803
- * The y-offset of the overlay panel in relation to the trigger's top start corner.
804
- * This must be adjusted to align the selected option text over the trigger text.
805
- * when the panel opens. Will change based on the y-position of the selected option.
806
- */
807
- this._offsetY = 0;
808
- this._positions = [
809
- {
810
- originX: 'start',
811
- originY: 'top',
812
- overlayX: 'start',
813
- overlayY: 'top',
814
- },
815
- {
816
- originX: 'start',
817
- originY: 'bottom',
818
- overlayX: 'start',
819
- overlayY: 'bottom',
820
- },
821
- ];
822
- }
823
- /**
824
- * Calculates the scroll position of the select's overlay panel.
825
- *
826
- * Attempts to center the selected option in the panel. If the option is
827
- * too high or too low in the panel to be scrolled to the center, it clamps the
828
- * scroll position to the min or max scroll positions respectively.
829
- */
830
- _calculateOverlayScroll(selectedIndex, scrollBuffer, maxScroll) {
831
- const itemHeight = this._getItemHeight();
832
- const optionOffsetFromScrollTop = itemHeight * selectedIndex;
833
- const halfOptionHeight = itemHeight / 2;
834
- // Starts at the optionOffsetFromScrollTop, which scrolls the option to the top of the
835
- // scroll container, then subtracts the scroll buffer to scroll the option down to
836
- // the center of the overlay panel. Half the option height must be re-added to the
837
- // scrollTop so the option is centered based on its middle, not its top edge.
838
- const optimalScrollPosition = optionOffsetFromScrollTop - scrollBuffer + halfOptionHeight;
839
- return Math.min(Math.max(0, optimalScrollPosition), maxScroll);
840
- }
841
- ngOnInit() {
842
- super.ngOnInit();
843
- this._viewportRuler.change().pipe(takeUntil(this._destroy)).subscribe(() => {
844
- if (this.panelOpen) {
845
- this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();
846
- this._changeDetectorRef.markForCheck();
847
- }
848
- });
849
- }
850
- open() {
851
- if (super._canOpen()) {
852
- super.open();
853
- this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();
854
- // Note: The computed font-size will be a string pixel value (e.g. "16px").
855
- // `parseInt` ignores the trailing 'px' and converts this to a number.
856
- this._triggerFontSize =
857
- parseInt(getComputedStyle(this.trigger.nativeElement).fontSize || '0');
858
- this._calculateOverlayPosition();
859
- // Set the font size on the panel element once it exists.
860
- this._ngZone.onStable.pipe(take(1)).subscribe(() => {
861
- if (this._triggerFontSize && this._overlayDir.overlayRef &&
862
- this._overlayDir.overlayRef.overlayElement) {
863
- this._overlayDir.overlayRef.overlayElement.style.fontSize = `${this._triggerFontSize}px`;
864
- }
865
- });
866
- }
867
- }
868
- /** Scrolls the active option into view. */
869
- _scrollOptionIntoView(index) {
870
- const labelCount = _countGroupLabelsBeforeOption(index, this.options, this.optionGroups);
871
- const itemHeight = this._getItemHeight();
872
- if (index === 0 && labelCount === 1) {
873
- // If we've got one group label before the option and we're at the top option,
874
- // scroll the list to the top. This is better UX than scrolling the list to the
875
- // top of the option, because it allows the user to read the top group's label.
876
- this.panel.nativeElement.scrollTop = 0;
877
- }
878
- else {
879
- this.panel.nativeElement.scrollTop = _getOptionScrollPosition((index + labelCount) * itemHeight, itemHeight, this.panel.nativeElement.scrollTop, SELECT_PANEL_MAX_HEIGHT);
880
- }
881
- }
882
- _positioningSettled() {
883
- this._calculateOverlayOffsetX();
884
- this.panel.nativeElement.scrollTop = this._scrollTop;
885
- }
886
- _panelDoneAnimating(isOpen) {
887
- if (this.panelOpen) {
888
- this._scrollTop = 0;
889
- }
890
- else {
891
- this._overlayDir.offsetX = 0;
892
- this._changeDetectorRef.markForCheck();
893
- }
894
- super._panelDoneAnimating(isOpen);
895
- }
896
- _getChangeEvent(value) {
897
- return new MatSelectChange(this, value);
898
- }
899
- /**
900
- * Sets the x-offset of the overlay panel in relation to the trigger's top start corner.
901
- * This must be adjusted to align the selected option text over the trigger text when
902
- * the panel opens. Will change based on LTR or RTL text direction. Note that the offset
903
- * can't be calculated until the panel has been attached, because we need to know the
904
- * content width in order to constrain the panel within the viewport.
905
- */
906
- _calculateOverlayOffsetX() {
907
- const overlayRect = this._overlayDir.overlayRef.overlayElement.getBoundingClientRect();
908
- const viewportSize = this._viewportRuler.getViewportSize();
909
- const isRtl = this._isRtl();
910
- const paddingWidth = this.multiple ? SELECT_MULTIPLE_PANEL_PADDING_X + SELECT_PANEL_PADDING_X :
911
- SELECT_PANEL_PADDING_X * 2;
912
- let offsetX;
913
- // Adjust the offset, depending on the option padding.
914
- if (this.multiple) {
915
- offsetX = SELECT_MULTIPLE_PANEL_PADDING_X;
916
- }
917
- else if (this.disableOptionCentering) {
918
- offsetX = SELECT_PANEL_PADDING_X;
919
- }
920
- else {
921
- let selected = this._selectionModel.selected[0] || this.options.first;
922
- offsetX = selected && selected.group ? SELECT_PANEL_INDENT_PADDING_X : SELECT_PANEL_PADDING_X;
923
- }
924
- // Invert the offset in LTR.
925
- if (!isRtl) {
926
- offsetX *= -1;
927
- }
928
- // Determine how much the select overflows on each side.
929
- const leftOverflow = 0 - (overlayRect.left + offsetX - (isRtl ? paddingWidth : 0));
930
- const rightOverflow = overlayRect.right + offsetX - viewportSize.width
931
- + (isRtl ? 0 : paddingWidth);
932
- // If the element overflows on either side, reduce the offset to allow it to fit.
933
- if (leftOverflow > 0) {
934
- offsetX += leftOverflow + SELECT_PANEL_VIEWPORT_PADDING;
935
- }
936
- else if (rightOverflow > 0) {
937
- offsetX -= rightOverflow + SELECT_PANEL_VIEWPORT_PADDING;
938
- }
939
- // Set the offset directly in order to avoid having to go through change detection and
940
- // potentially triggering "changed after it was checked" errors. Round the value to avoid
941
- // blurry content in some browsers.
942
- this._overlayDir.offsetX = Math.round(offsetX);
943
- this._overlayDir.overlayRef.updatePosition();
944
- }
945
- /**
946
- * Calculates the y-offset of the select's overlay panel in relation to the
947
- * top start corner of the trigger. It has to be adjusted in order for the
948
- * selected option to be aligned over the trigger when the panel opens.
949
- */
950
- _calculateOverlayOffsetY(selectedIndex, scrollBuffer, maxScroll) {
951
- const itemHeight = this._getItemHeight();
952
- const optionHeightAdjustment = (itemHeight - this._triggerRect.height) / 2;
953
- const maxOptionsDisplayed = Math.floor(SELECT_PANEL_MAX_HEIGHT / itemHeight);
954
- let optionOffsetFromPanelTop;
955
- // Disable offset if requested by user by returning 0 as value to offset
956
- if (this.disableOptionCentering) {
957
- return 0;
958
- }
959
- if (this._scrollTop === 0) {
960
- optionOffsetFromPanelTop = selectedIndex * itemHeight;
961
- }
962
- else if (this._scrollTop === maxScroll) {
963
- const firstDisplayedIndex = this._getItemCount() - maxOptionsDisplayed;
964
- const selectedDisplayIndex = selectedIndex - firstDisplayedIndex;
965
- // The first item is partially out of the viewport. Therefore we need to calculate what
966
- // portion of it is shown in the viewport and account for it in our offset.
967
- let partialItemHeight = itemHeight - (this._getItemCount() * itemHeight - SELECT_PANEL_MAX_HEIGHT) % itemHeight;
968
- // Because the panel height is longer than the height of the options alone,
969
- // there is always extra padding at the top or bottom of the panel. When
970
- // scrolled to the very bottom, this padding is at the top of the panel and
971
- // must be added to the offset.
972
- optionOffsetFromPanelTop = selectedDisplayIndex * itemHeight + partialItemHeight;
973
- }
974
- else {
975
- // If the option was scrolled to the middle of the panel using a scroll buffer,
976
- // its offset will be the scroll buffer minus the half height that was added to
977
- // center it.
978
- optionOffsetFromPanelTop = scrollBuffer - itemHeight / 2;
979
- }
980
- // The final offset is the option's offset from the top, adjusted for the height difference,
981
- // multiplied by -1 to ensure that the overlay moves in the correct direction up the page.
982
- // The value is rounded to prevent some browsers from blurring the content.
983
- return Math.round(optionOffsetFromPanelTop * -1 - optionHeightAdjustment);
984
- }
985
- /**
986
- * Checks that the attempted overlay position will fit within the viewport.
987
- * If it will not fit, tries to adjust the scroll position and the associated
988
- * y-offset so the panel can open fully on-screen. If it still won't fit,
989
- * sets the offset back to 0 to allow the fallback position to take over.
990
- */
991
- _checkOverlayWithinViewport(maxScroll) {
992
- const itemHeight = this._getItemHeight();
993
- const viewportSize = this._viewportRuler.getViewportSize();
994
- const topSpaceAvailable = this._triggerRect.top - SELECT_PANEL_VIEWPORT_PADDING;
995
- const bottomSpaceAvailable = viewportSize.height - this._triggerRect.bottom - SELECT_PANEL_VIEWPORT_PADDING;
996
- const panelHeightTop = Math.abs(this._offsetY);
997
- const totalPanelHeight = Math.min(this._getItemCount() * itemHeight, SELECT_PANEL_MAX_HEIGHT);
998
- const panelHeightBottom = totalPanelHeight - panelHeightTop - this._triggerRect.height;
999
- if (panelHeightBottom > bottomSpaceAvailable) {
1000
- this._adjustPanelUp(panelHeightBottom, bottomSpaceAvailable);
1001
- }
1002
- else if (panelHeightTop > topSpaceAvailable) {
1003
- this._adjustPanelDown(panelHeightTop, topSpaceAvailable, maxScroll);
1004
- }
1005
- else {
1006
- this._transformOrigin = this._getOriginBasedOnOption();
1007
- }
1008
- }
1009
- /** Adjusts the overlay panel up to fit in the viewport. */
1010
- _adjustPanelUp(panelHeightBottom, bottomSpaceAvailable) {
1011
- // Browsers ignore fractional scroll offsets, so we need to round.
1012
- const distanceBelowViewport = Math.round(panelHeightBottom - bottomSpaceAvailable);
1013
- // Scrolls the panel up by the distance it was extending past the boundary, then
1014
- // adjusts the offset by that amount to move the panel up into the viewport.
1015
- this._scrollTop -= distanceBelowViewport;
1016
- this._offsetY -= distanceBelowViewport;
1017
- this._transformOrigin = this._getOriginBasedOnOption();
1018
- // If the panel is scrolled to the very top, it won't be able to fit the panel
1019
- // by scrolling, so set the offset to 0 to allow the fallback position to take
1020
- // effect.
1021
- if (this._scrollTop <= 0) {
1022
- this._scrollTop = 0;
1023
- this._offsetY = 0;
1024
- this._transformOrigin = `50% bottom 0px`;
1025
- }
1026
- }
1027
- /** Adjusts the overlay panel down to fit in the viewport. */
1028
- _adjustPanelDown(panelHeightTop, topSpaceAvailable, maxScroll) {
1029
- // Browsers ignore fractional scroll offsets, so we need to round.
1030
- const distanceAboveViewport = Math.round(panelHeightTop - topSpaceAvailable);
1031
- // Scrolls the panel down by the distance it was extending past the boundary, then
1032
- // adjusts the offset by that amount to move the panel down into the viewport.
1033
- this._scrollTop += distanceAboveViewport;
1034
- this._offsetY += distanceAboveViewport;
1035
- this._transformOrigin = this._getOriginBasedOnOption();
1036
- // If the panel is scrolled to the very bottom, it won't be able to fit the
1037
- // panel by scrolling, so set the offset to 0 to allow the fallback position
1038
- // to take effect.
1039
- if (this._scrollTop >= maxScroll) {
1040
- this._scrollTop = maxScroll;
1041
- this._offsetY = 0;
1042
- this._transformOrigin = `50% top 0px`;
1043
- return;
1044
- }
1045
- }
1046
- /** Calculates the scroll position and x- and y-offsets of the overlay panel. */
1047
- _calculateOverlayPosition() {
1048
- const itemHeight = this._getItemHeight();
1049
- const items = this._getItemCount();
1050
- const panelHeight = Math.min(items * itemHeight, SELECT_PANEL_MAX_HEIGHT);
1051
- const scrollContainerHeight = items * itemHeight;
1052
- // The farthest the panel can be scrolled before it hits the bottom
1053
- const maxScroll = scrollContainerHeight - panelHeight;
1054
- // If no value is selected we open the popup to the first item.
1055
- let selectedOptionOffset;
1056
- if (this.empty) {
1057
- selectedOptionOffset = 0;
1058
- }
1059
- else {
1060
- selectedOptionOffset =
1061
- Math.max(this.options.toArray().indexOf(this._selectionModel.selected[0]), 0);
1062
- }
1063
- selectedOptionOffset += _countGroupLabelsBeforeOption(selectedOptionOffset, this.options, this.optionGroups);
1064
- // We must maintain a scroll buffer so the selected option will be scrolled to the
1065
- // center of the overlay panel rather than the top.
1066
- const scrollBuffer = panelHeight / 2;
1067
- this._scrollTop = this._calculateOverlayScroll(selectedOptionOffset, scrollBuffer, maxScroll);
1068
- this._offsetY = this._calculateOverlayOffsetY(selectedOptionOffset, scrollBuffer, maxScroll);
1069
- this._checkOverlayWithinViewport(maxScroll);
1070
- }
1071
- /** Sets the transform origin point based on the selected option. */
1072
- _getOriginBasedOnOption() {
1073
- const itemHeight = this._getItemHeight();
1074
- const optionHeightAdjustment = (itemHeight - this._triggerRect.height) / 2;
1075
- const originY = Math.abs(this._offsetY) - optionHeightAdjustment + itemHeight / 2;
1076
- return `50% ${originY}px 0px`;
1077
- }
1078
- /** Calculates the height of the select's options. */
1079
- _getItemHeight() {
1080
- return this._triggerFontSize * SELECT_ITEM_HEIGHT_EM;
1081
- }
1082
- /** Calculates the amount of items in the select. This includes options and group labels. */
1083
- _getItemCount() {
1084
- return this.options.length + this.optionGroups.length;
1085
- }
1086
- }
1087
- MatSelect.decorators = [
1088
- { type: Component, args: [{
1089
- selector: 'mat-select',
1090
- exportAs: 'matSelect',
1091
- template: "<!--\n Note that the select trigger element specifies `aria-owns` pointing to the listbox overlay.\n While aria-owns is not required for the ARIA 1.2 `role=\"combobox\"` interaction pattern,\n it fixes an issue with VoiceOver when the select appears inside of an `aria-model=\"true\"`\n element (e.g. a dialog). Without this `aria-owns`, the `aria-modal` on a dialog prevents\n VoiceOver from \"seeing\" the select's listbox overlay for aria-activedescendant.\n Using `aria-owns` re-parents the select overlay so that it works again.\n See https://github.com/angular/components/issues/20694\n-->\n<div cdk-overlay-origin\n [attr.aria-owns]=\"panelOpen ? id + '-panel' : null\"\n class=\"mat-select-trigger\"\n (click)=\"toggle()\"\n #origin=\"cdkOverlayOrigin\"\n #trigger>\n <div class=\"mat-select-value\" [ngSwitch]=\"empty\" [attr.id]=\"_valueId\">\n <span class=\"mat-select-placeholder mat-select-min-line\" *ngSwitchCase=\"true\">{{placeholder}}</span>\n <span class=\"mat-select-value-text\" *ngSwitchCase=\"false\" [ngSwitch]=\"!!customTrigger\">\n <span class=\"mat-select-min-line\" *ngSwitchDefault>{{triggerValue}}</span>\n <ng-content select=\"mat-select-trigger\" *ngSwitchCase=\"true\"></ng-content>\n </span>\n </div>\n\n <div class=\"mat-select-arrow-wrapper\"><div class=\"mat-select-arrow\"></div></div>\n</div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayLockPosition\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPanelClass]=\"_overlayPanelClass\"\n [cdkConnectedOverlayScrollStrategy]=\"_scrollStrategy\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayPositions]=\"_positions\"\n [cdkConnectedOverlayMinWidth]=\"_triggerRect?.width!\"\n [cdkConnectedOverlayOffsetY]=\"_offsetY\"\n (backdropClick)=\"close()\"\n (attach)=\"_onAttached()\"\n (detach)=\"close()\">\n <div class=\"mat-select-panel-wrap\" [@transformPanelWrap]>\n <div\n #panel\n role=\"listbox\"\n tabindex=\"-1\"\n class=\"mat-select-panel {{ _getPanelTheme() }}\"\n [attr.id]=\"id + '-panel'\"\n [attr.aria-multiselectable]=\"multiple\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"_getPanelAriaLabelledby()\"\n [ngClass]=\"panelClass\"\n [@transformPanel]=\"multiple ? 'showing-multiple' : 'showing'\"\n (@transformPanel.done)=\"_panelDoneAnimatingStream.next($event.toState)\"\n [style.transformOrigin]=\"_transformOrigin\"\n [style.font-size.px]=\"_triggerFontSize\"\n (keydown)=\"_handleKeydown($event)\">\n <ng-content></ng-content>\n </div>\n </div>\n</ng-template>\n",
1092
- inputs: ['disabled', 'disableRipple', 'tabIndex'],
1093
- encapsulation: ViewEncapsulation.None,
1094
- changeDetection: ChangeDetectionStrategy.OnPush,
1095
- host: {
1096
- 'role': 'combobox',
1097
- 'aria-autocomplete': 'none',
1098
- // TODO(crisbeto): the value for aria-haspopup should be `listbox`, but currently it's difficult
1099
- // to sync into Google, because of an outdated automated a11y check which flags it as an invalid
1100
- // value. At some point we should try to switch it back to being `listbox`.
1101
- 'aria-haspopup': 'true',
1102
- 'class': 'mat-select',
1103
- '[attr.id]': 'id',
1104
- '[attr.tabindex]': 'tabIndex',
1105
- '[attr.aria-controls]': 'panelOpen ? id + "-panel" : null',
1106
- '[attr.aria-expanded]': 'panelOpen',
1107
- '[attr.aria-label]': 'ariaLabel || null',
1108
- '[attr.aria-required]': 'required.toString()',
1109
- '[attr.aria-disabled]': 'disabled.toString()',
1110
- '[attr.aria-invalid]': 'errorState',
1111
- '[attr.aria-describedby]': '_ariaDescribedby || null',
1112
- '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',
1113
- '[class.mat-select-disabled]': 'disabled',
1114
- '[class.mat-select-invalid]': 'errorState',
1115
- '[class.mat-select-required]': 'required',
1116
- '[class.mat-select-empty]': 'empty',
1117
- '[class.mat-select-multiple]': 'multiple',
1118
- '(keydown)': '_handleKeydown($event)',
1119
- '(focus)': '_onFocus()',
1120
- '(blur)': '_onBlur()',
1121
- },
1122
- animations: [
1123
- matSelectAnimations.transformPanelWrap,
1124
- matSelectAnimations.transformPanel
1125
- ],
1126
- providers: [
1127
- { provide: MatFormFieldControl, useExisting: MatSelect },
1128
- { provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatSelect }
1129
- ],
1130
- styles: [".mat-select{display:inline-block;width:100%;outline:none}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-form-field-appearance-fill .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:translateY(-25%)}.mat-form-field-appearance-standard.mat-form-field-has-label .mat-select:not(.mat-select-empty) .mat-select-arrow-wrapper{transform:translateY(-50%)}.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable.mat-form-field-appearance-standard .mat-select.mat-select-empty .mat-select-arrow-wrapper{transition:none}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel-wrap{flex-basis:100%}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%;border-radius:4px;outline:0}.cdk-high-contrast-active .mat-select-panel{outline:solid 1px}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1)}._mat-animation-noopable .mat-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;-webkit-text-fill-color:transparent;transition:none;display:block}.mat-select-min-line:empty::before{content:\" \";white-space:pre;width:1px;display:inline-block;opacity:0}\n"]
1131
- },] }
1132
- ];
1133
- MatSelect.propDecorators = {
1134
- options: [{ type: ContentChildren, args: [MatOption, { descendants: true },] }],
1135
- optionGroups: [{ type: ContentChildren, args: [MAT_OPTGROUP, { descendants: true },] }],
1136
- customTrigger: [{ type: ContentChild, args: [MAT_SELECT_TRIGGER,] }]
1137
- };
1138
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsL3NlbGVjdC9zZWxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLDBCQUEwQixFQUFFLGFBQWEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBRUwscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUVyQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsQ0FBQyxFQUNELFVBQVUsRUFDVixLQUFLLEVBQ0wsY0FBYyxFQUNkLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsR0FDVCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxtQkFBbUIsRUFFbkIsT0FBTyxHQUVSLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFFTCxTQUFTLEVBQ1QsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixTQUFTLEVBRVQsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFDTCxNQUFNLEVBSU4sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsSUFBSSxFQUVKLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF1QixrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0YsT0FBTyxFQUNMLDZCQUE2QixFQUM3Qix3QkFBd0IsRUFJeEIsaUJB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QkFDbkMseUJBQXlCLEVBQUUsMEJBQTBCO29CQUNyRCw4QkFBOEIsRUFBRSw0QkFBNEI7b0JBQzVELDZCQUE2QixFQUFFLFVBQVU7b0JBQ3pDLDRCQUE0QixFQUFFLFlBQVk7b0JBQzFDLDZCQUE2QixFQUFFLFVBQVU7b0JBQ3pDLDBCQUEwQixFQUFFLE9BQU87b0JBQ25DLDZCQUE2QixFQUFFLFVBQVU7b0JBQ3pDLFdBQVcsRUFBRSx3QkFBd0I7b0JBQ3JDLFNBQVMsRUFBRSxZQUFZO29CQUN2QixRQUFRLEVBQUUsV0FBVztpQkFDdEI7Z0JBQ0QsVUFBVSxFQUFFO29CQUNWLG1CQUFtQixDQUFDLGtCQUFrQjtvQkFDdEMsbUJBQW1CLENBQUMsY0FBYztpQkFDbkM7Z0JBQ0QsU0FBUyxFQUFFO29CQUNULEVBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUM7b0JBQ3RELEVBQUMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUM7aUJBQy9EOzthQUNGOzs7c0JBcUJFLGVBQWUsU0FBQyxTQUFTLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDOzJCQUU5QyxlQUFlLFNBQUMsWUFBWSxFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQzs0QkFFakQsWUFBWSxTQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0FjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyLCBMaXZlQW5ub3VuY2VyfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQge0RpcmVjdGlvbmFsaXR5fSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQge1xuICBCb29sZWFuSW5wdXQsXG4gIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSxcbiAgY29lcmNlTnVtYmVyUHJvcGVydHksXG4gIE51bWJlcklucHV0XG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1NlbGVjdGlvbk1vZGVsfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtcbiAgQSxcbiAgRE9XTl9BUlJPVyxcbiAgRU5URVIsXG4gIGhhc01vZGlmaWVyS2V5LFxuICBMRUZUX0FSUk9XLFxuICBSSUdIVF9BUlJPVyxcbiAgU1BBQ0UsXG4gIFVQX0FSUk9XLFxufSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtcbiAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgQ29ubmVjdGVkUG9zaXRpb24sXG4gIE92ZXJsYXksXG4gIFNjcm9sbFN0cmF0ZWd5LFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge1ZpZXdwb3J0UnVsZXJ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNlbGYsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOZ0NvbnRyb2wsIE5nRm9ybX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgX2NvdW50R3JvdXBMYWJlbHNCZWZvcmVPcHRpb24sXG4gIF9nZXRPcHRpb25TY3JvbGxQb3NpdGlvbixcbiAgQ2FuRGlzYWJsZSxcbiAgQ2FuRGlzYWJsZVJpcHBsZSxcbiAgQ2FuVXBkYXRlRXJyb3JTdGF0ZSxcbiAgRXJyb3JTdGF0ZU1hdGNoZXIsXG4gIEhhc1RhYkluZGV4LFxuICBNQVRfT1BUR1JPVVAsXG4gIE1BVF9PUFRJT05fUEFSRU5UX0NPTVBPTkVOVCxcbiAgTWF0T3B0Z3JvdXAsXG4gIE1hdE9wdGlvbixcbiAgTWF0T3B0aW9uU2VsZWN0aW9uQ2hhbmdlLFxuICBtaXhpbkRpc2FibGVkLFxuICBtaXhpbkRpc2FibGVSaXBwbGUsXG4gIG1peGluRXJyb3JTdGF0ZSxcbiAgbWl4aW5UYWJJbmRleCxcbiAgX01hdE9wdGlvbkJhc2UsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtNQVRfRk9STV9GSUVMRCwgTWF0Rm9ybUZpZWxkLCBNYXRGb3JtRmllbGRDb250cm9sfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7ZGVmZXIsIG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHttYXRTZWxlY3RBbmltYXRpb25zfSBmcm9tICcuL3NlbGVjdC1hbmltYXRpb25zJztcbmltcG9ydCB7XG4gIGdldE1hdFNlbGVjdER5bmFtaWNNdWx0aXBsZUVycm9yLFxuICBnZXRNYXRTZWxlY3ROb25BcnJheVZhbHVlRXJyb3IsXG4gIGdldE1hdFNlbGVjdE5vbkZ1bmN0aW9uVmFsdWVFcnJvcixcbn0gZnJvbSAnLi9zZWxlY3QtZXJyb3JzJztcblxuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIHN0eWxlIGNvbnN0YW50cyBhcmUgbmVjZXNzYXJ5IHRvIHNhdmUgaGVyZSBpbiBvcmRlclxuICogdG8gcHJvcGVybHkgY2FsY3VsYXRlIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHNlbGVjdGVkIG9wdGlvbiBvdmVyXG4gKiB0aGUgdHJpZ2dlciBlbGVtZW50LlxuICovXG5cbi8qKiBUaGUgbWF4IGhlaWdodCBvZiB0aGUgc2VsZWN0J3Mgb3ZlcmxheSBwYW5lbC4gKi9cbmV4cG9ydCBjb25zdCBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVCA9IDI1NjtcblxuLyoqIFRoZSBwYW5lbCdzIHBhZGRpbmcgb24gdGhlIHgtYXhpcy4gKi9cbmV4cG9ydCBjb25zdCBTRUxFQ1RfUEFORUxfUEFERElOR19YID0gMTY7XG5cbi8qKiBUaGUgcGFuZWwncyB4IGF4aXMgcGFkZGluZyBpZiBpdCBpcyBpbmRlbnRlZCAoZS5nLiB0aGVyZSBpcyBhbiBvcHRpb24gZ3JvdXApLiAqL1xuZXhwb3J0IGNvbnN0IFNFTEVDVF9QQU5FTF9JTkRFTlRfUEFERElOR19YID0gU0VMRUNUX1BBTkVMX1BBRERJTkdfWCAqIDI7XG5cbi8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBzZWxlY3QgaXRlbXMgaW4gYGVtYCB1bml0cy4gKi9cbmV4cG9ydCBjb25zdCBTRUxFQ1RfSVRFTV9IRUlHSFRfRU0gPSAzO1xuXG4vLyBUT0RPKGpvc2VwaHBlcnJvdHQpOiBSZXZlcnQgdG8gYSBjb25zdGFudCBhZnRlciAyMDE4IHNwZWMgdXBkYXRlcyBhcmUgZnVsbHkgbWVyZ2VkLlxuLyoqXG4gKiBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBwYW5lbCBlZGdlIGFuZCB0aGUgb3B0aW9uIHRleHQgaW5cbiAqIG11bHRpLXNlbGVjdGlvbiBtb2RlLlxuICpcbiAqIENhbGN1bGF0ZWQgYXM6XG4gKiAoU0VMRUNUX1BBTkVMX1BBRERJTkdfWCAqIDEuNSkgKyAxNiA9IDQwXG4gKiBUaGUgcGFkZGluZyBpcyBtdWx0aXBsaWVkIGJ5IDEuNSBiZWNhdXNlIHRoZSBjaGVja2JveCdzIG1hcmdpbiBpcyBoYWxmIHRoZSBwYWRkaW5nLlxuICogVGhlIGNoZWNrYm94IHdpZHRoIGlzIDE2cHguXG4gKi9cbmV4cG9ydCBjb25zdCBTRUxFQ1RfTVVMVElQTEVfUEFORUxfUEFERElOR19YID0gU0VMRUNUX1BBTkVMX1BBRERJTkdfWCAqIDEuNSArIDE2O1xuXG4vKipcbiAqIFRoZSBzZWxlY3QgcGFuZWwgd2lsbCBvbmx5IFwiZml0XCIgaW5zaWRlIHRoZSB2aWV3cG9ydCBpZiBpdCBpcyBwb3NpdGlvbmVkIGF0XG4gKiB0aGlzIHZhbHVlIG9yIG1vcmUgYXdheSBmcm9tIHRoZSB2aWV3cG9ydCBib3VuZGFyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFTEVDVF9QQU5FTF9WSUVXUE9SVF9QQURESU5HID0gODtcblxuLyoqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRldGVybWluZXMgdGhlIHNjcm9sbCBoYW5kbGluZyB3aGlsZSBhIHNlbGVjdCBpcyBvcGVuLiAqL1xuZXhwb3J0IGNvbnN0IE1BVF9TRUxFQ1RfU0NST0xMX1NUUkFURUdZID1cbiAgICBuZXcgSW5qZWN0aW9uVG9rZW48KCkgPT4gU2Nyb2xsU3RyYXRlZ3k+KCdtYXQtc2VsZWN0LXNjcm9sbC1zdHJhdGVneScpO1xuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1BVF9TRUxFQ1RfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSX0ZBQ1RPUlkob3ZlcmxheTogT3ZlcmxheSk6XG4gICAgKCkgPT4gU2Nyb2xsU3RyYXRlZ3kge1xuICByZXR1cm4gKCkgPT4gb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKTtcbn1cblxuLyoqIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciB0aGUgc2VsZWN0IG1vZHVsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWF0U2VsZWN0Q29uZmlnIHtcbiAgLyoqIFdoZXRoZXIgb3B0aW9uIGNlbnRlcmluZyBzaG91bGQgYmUgZGlzYWJsZWQuICovXG4gIGRpc2FibGVPcHRpb25DZW50ZXJpbmc/OiBib29sZWFuO1xuXG4gIC8qKiBUaW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGtleXN0cm9rZSBiZWZvcmUgbW92aW5nIGZvY3VzIHRvIGFuIGl0ZW0uICovXG4gIHR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqIENsYXNzIG9yIGxpc3Qgb2YgY2xhc3NlcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBtZW51J3Mgb3ZlcmxheSBwYW5lbC4gKi9cbiAgb3ZlcmxheVBhbmVsQ2xhc3M/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuLyoqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyB0aGUgc2VsZWN0IG1vZHVsZS4gKi9cbmV4cG9ydCBjb25zdCBNQVRfU0VMRUNUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNYXRTZWxlY3RDb25maWc+KCdNQVRfU0VMRUNUX0NPTkZJRycpO1xuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGNvbnN0IE1BVF9TRUxFQ1RfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSID0ge1xuICBwcm92aWRlOiBNQVRfU0VMRUNUX1NDUk9MTF9TVFJBVEVHWSxcbiAgZGVwczogW092ZXJsYXldLFxuICB1c2VGYWN0b3J5OiBNQVRfU0VMRUNUX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUl9GQUNUT1JZLFxufTtcblxuLyoqIENoYW5nZSBldmVudCBvYmplY3QgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdCB2YWx1ZSBoYXMgY2hhbmdlZC4gKi9cbmV4cG9ydCBjbGFzcyBNYXRTZWxlY3RDaGFuZ2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogUmVmZXJlbmNlIHRvIHRoZSBzZWxlY3QgdGhhdCBlbWl0dGVkIHRoZSBjaGFuZ2UgZXZlbnQuICovXG4gICAgcHVibGljIHNvdXJjZTogTWF0U2VsZWN0LFxuICAgIC8qKiBDdXJyZW50IHZhbHVlIG9mIHRoZSBzZWxlY3QgdGhhdCBlbWl0dGVkIHRoZSBldmVudC4gKi9cbiAgICBwdWJsaWMgdmFsdWU6IGFueSkgeyB9XG59XG5cbi8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0U2VsZWN0LlxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmNvbnN0IF9NYXRTZWxlY3RNaXhpbkJhc2UgPVxuICBtaXhpbkRpc2FibGVSaXBwbGUobWl4aW5UYWJJbmRleChtaXhpbkRpc2FibGVkKG1peGluRXJyb3JTdGF0ZShjbGFzcyB7XG4gICAgY29uc3RydWN0b3IocHVibGljIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICAgICAgICAgICAgICBwdWJsaWMgX3BhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCkge31cbiAgfSkpKSk7XG5cblxuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBpbnN0YW5jZXMgb2YgYE1hdFNlbGVjdFRyaWdnZXJgLiBJdCBzZXJ2ZXMgYXNcbiAqIGFsdGVybmF0aXZlIHRva2VuIHRvIHRoZSBhY3R1YWwgYE1hdFNlbGVjdFRyaWdnZXJgIGNsYXNzIHdoaWNoIGNvdWxkIGNhdXNlIHVubmVjZXNzYXJ5XG4gKiByZXRlbnRpb24gb2YgdGhlIGNsYXNzIGFuZCBpdHMgZGlyZWN0aXZlIG1ldGFkYXRhLlxuICovXG5leHBvcnQgY29uc3QgTUFUX1NFTEVDVF9UUklHR0VSID0gbmV3IEluamVjdGlvblRva2VuPE1hdFNlbGVjdFRyaWdnZXI+KCdNYXRTZWxlY3RUcmlnZ2VyJyk7XG5cbi8qKlxuICogQWxsb3dzIHRoZSB1c2VyIHRvIGN1c3RvbWl6ZSB0aGUgdHJpZ2dlciB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIHRoZSBzZWxlY3QgaGFzIGEgdmFsdWUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ21hdC1zZWxlY3QtdHJpZ2dlcicsXG4gIHByb3ZpZGVyczogW3twcm92aWRlOiBNQVRfU0VMRUNUX1RSSUdHRVIsIHVzZUV4aXN0aW5nOiBNYXRTZWxlY3RUcmlnZ2VyfV0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdFNlbGVjdFRyaWdnZXIge31cblxuLyoqIEJhc2UgY2xhc3Mgd2l0aCBhbGwgb2YgdGhlIGBNYXRTZWxlY3RgIGZ1bmN0aW9uYWxpdHkuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBfTWF0U2VsZWN0QmFzZTxDPiBleHRlbmRzIF9NYXRTZWxlY3RNaXhpbkJhc2UgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LFxuICAgIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIERvQ2hlY2ssIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBDYW5EaXNhYmxlLCBIYXNUYWJJbmRleCxcbiAgICBNYXRGb3JtRmllbGRDb250cm9sPGFueT4sIENhblVwZGF0ZUVycm9yU3RhdGUsIENhbkRpc2FibGVSaXBwbGUge1xuXG4gIC8qKiBBbGwgb2YgdGhlIGRlZmluZWQgc2VsZWN0IG9wdGlvbnMuICovXG4gIGFic3RyYWN0IG9wdGlvbnM6IFF1ZXJ5TGlzdDxfTWF0T3B0aW9uQmFzZT47XG5cbiAgLy8gVE9ETyhjcmlzYmV0byk6IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIHRoZSBub24tTURDIHNlbGVjdCwgYnV0IGl0J3MgdGVjaG5pY2FsbHkgYVxuICAvLyBwdWJsaWMgQVBJIHNvIHdlIGhhdmUgdG8ga2VlcCBpdC4gSXQgc2hvdWxkIGJlIGRlcHJlY2F0ZWQgYW5kIHJlbW92ZWQgZXZlbnR1YWxseS5cbiAgLyoqIEFsbCBvZiB0aGUgZGVmaW5lZCBncm91cHMgb2Ygb3B0aW9ucy4gKi9cbiAgYWJzdHJhY3Qgb3B0aW9uR3JvdXBzOiBRdWVyeUxpc3Q8TWF0T3B0Z3JvdXA+O1xuXG4gIC8qKiBVc2VyLXN1cHBsaWVkIG92ZXJyaWRlIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnQuICovXG4gIGFic3RyYWN0IGN1c3RvbVRyaWdnZXI6IHt9O1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvc2l0aW9uIGNvbmZpZyBlbnN1cmVzIHRoYXQgdGhlIHRvcCBcInN0YXJ0XCIgY29ybmVyIG9mIHRoZSBvdmVybGF5XG4gICAqIGlzIGFsaWduZWQgd2l0aCB3aXRoIHRoZSB0b3AgXCJzdGFydFwiIG9mIHRoZSBvcmlnaW4gYnkgZGVmYXVsdCAob3ZlcmxhcHBpbmdcbiAgICogdGhlIHRyaWdnZXIgY29tcGxldGVseSkuIElmIHRoZSBwYW5lbCBjYW5ub3QgZml0IGJlbG93IHRoZSB0cmlnZ2VyLCBpdFxuICAgKiB3aWxsIGZhbGwgYmFjayB0byBhIHBvc2l0aW9uIGFib3ZlIHRoZSB0cmlnZ2VyLlxuICAgKi9cbiAgYWJzdHJhY3QgX3Bvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXTtcblxuICAvKiogU2Nyb2xscyBhIHBhcnRpY3VsYXIgb3B0aW9uIGludG8gdGhlIHZpZXcuICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBfc2Nyb2xsT3B0aW9uSW50b1ZpZXcoaW5kZXg6IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCB3aGVuIHRoZSBwYW5lbCBoYXMgYmVlbiBvcGVuZWQgYW5kIHRoZSBvdmVybGF5IGhhcyBzZXR0bGVkIG9uIGl0cyBmaW5hbCBwb3NpdGlvbi4gKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9wb3NpdGlvbmluZ1NldHRsZWQoKTogdm9pZDtcblxuICAvKiogQ3JlYXRlcyBhIGNoYW5nZSBldmVudCBvYmplY3QgdGhhdCBzaG91bGQgYmUgZW1pdHRlZCBieSB0aGUgc2VsZWN0LiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX2dldENoYW5nZUV2ZW50KHZhbHVlOiBhbnkpOiBDO1xuXG4gIC8qKiBGYWN0b3J5IGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGEgc2Nyb2xsIHN0cmF0ZWd5IGZvciB0aGlzIHNlbGVjdC4gKi9cbiAgcHJpdmF0ZSBfc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5OiAoKSA9PiBTY3JvbGxTdHJhdGVneTtcblxuICAvKiogV2hldGhlciBvciBub3QgdGhlIG92ZXJsYXkgcGFuZWwgaXMgb3Blbi4gKi9cbiAgcHJpdmF0ZSBfcGFuZWxPcGVuID0gZmFsc2U7XG5cbiAgLyoqIENvbXBhcmlzb24gZnVuY3Rpb24gdG8gc3BlY2lmeSB3aGljaCBvcHRpb24gaXMgZGlzcGxheWVkLiBEZWZhdWx0cyB0byBvYmplY3QgZXF1YWxpdHkuICovXG4gIHByaXZhdGUgX2NvbXBhcmVXaXRoID0gKG8xOiBhbnksIG8yOiBhbnkpID0+IG8xID09PSBvMjtcblxuICAvKiogVW5pcXVlIGlkIGZvciB0aGlzIGlucHV0LiAqL1xuICBwcml2YXRlIF91aWQgPSBgbWF0LXNlbGVjdC0ke25leHRVbmlxdWVJZCsrfWA7XG5cbiAgLyoqIEN1cnJlbnQgYGFyaWFyLWxhYmVsbGVkYnlgIHZhbHVlIGZvciB0aGUgc2VsZWN0IHRyaWdnZXIuICovXG4gIHByaXZhdGUgX3RyaWdnZXJBcmlhTGFiZWxsZWRCeTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEVtaXRzIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Rlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBUaGUgYXJpYS1kZXNjcmliZWRieSBhdHRyaWJ1dGUgb24gdGhlIHNlbGVjdCBmb3IgaW1wcm92ZWQgYTExeS4gKi9cbiAgX2FyaWFEZXNjcmliZWRieTogc3RyaW5nO1xuXG4gIC8qKiBEZWFscyB3aXRoIHRoZSBzZWxlY3Rpb24gbG9naWMuICovXG4gIF9zZWxlY3Rpb25Nb2RlbDogU2VsZWN0aW9uTW9kZWw8TWF0T3B0aW9uPjtcblxuICAvKiogTWFuYWdlcyBrZXlib2FyZCBldmVudHMgZm9yIG9wdGlvbnMgaW4gdGhlIHBhbmVsLiAqL1xuICBfa2V5TWFuYWdlcjogQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXI8TWF0T3B0aW9uPjtcblxuICAvKiogYFZpZXcgLT4gbW9kZWwgY2FsbGJhY2sgY2FsbGVkIHdoZW4gdmFsdWUgY2hhbmdlc2AgKi9cbiAgX29uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIC8qKiBgVmlldyAtPiBtb2RlbCBjYWxsYmFjayBjYWxsZWQgd2hlbiBzZWxlY3QgaGFzIGJlZW4gdG91Y2hlZGAgKi9cbiAgX29uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIC8qKiBJRCBmb3IgdGhlIERPTSBub2RlIGNvbnRhaW5pbmcgdGhlIHNlbGVjdCdzIHZhbHVlLiAqL1xuICBfdmFsdWVJZCA9IGBtYXQtc2VsZWN0LXZhbHVlLSR7bmV4dFVuaXF1ZUlkKyt9YDtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgcGFuZWwgZWxlbWVudCBpcyBmaW5pc2hlZCB0cmFuc2Zvcm1pbmcgaW4uICovXG4gIHJlYWRvbmx5IF9wYW5lbERvbmVBbmltYXRpbmdTdHJlYW0gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgLyoqIFN0cmF0ZWd5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGhhbmRsZSBzY3JvbGxpbmcgd2hpbGUgdGhlIHNlbGVjdCBwYW5lbCBpcyBvcGVuLiAqL1xuICBfc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5O1xuXG4gIF9vdmVybGF5UGFuZWxDbGFzczogc3RyaW5nIHwgc3RyaW5nW10gPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ub3ZlcmxheVBhbmVsQ2xhc3MgfHwgJyc7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHNlbGVjdCBpcyBmb2N1c2VkLiAqL1xuICBnZXQgZm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZCB8fCB0aGlzLl9wYW5lbE9wZW47XG4gIH1cbiAgcHJpdmF0ZSBfZm9jdXNlZCA9IGZhbHNlO1xuXG4gIC8qKiBBIG5hbWUgZm9yIHRoaXMgY29udHJvbCB0aGF0IGNhbiBiZSB1c2VkIGJ5IGBtYXQtZm9ybS1maWVsZGAuICovXG4gIGNvbnRyb2xUeXBlID0gJ21hdC1zZWxlY3QnO1xuXG4gIC8qKiBUcmlnZ2VyIHRoYXQgb3BlbnMgdGhlIHNlbGVjdC4gKi9cbiAgQFZpZXdDaGlsZCgndHJpZ2dlcicpIHRyaWdnZXI6IEVsZW1lbnRSZWY7XG5cbiAgLyoqIFBhbmVsIGNvbnRhaW5pbmcgdGhlIHNlbGVjdCBvcHRpb25zLiAqL1xuICBAVmlld0NoaWxkKCdwYW5lbCcpIHBhbmVsOiBFbGVtZW50UmVmO1xuXG4gIC8qKiBPdmVybGF5IHBhbmUgY29udGFpbmluZyB0aGUgb3B0aW9ucy4gKi9cbiAgQFZpZXdDaGlsZChDZGtDb25uZWN0ZWRPdmVybGF5KVxuICBwcm90ZWN0ZWQgX292ZXJsYXlEaXI6IENka0Nvbm5lY3RlZE92ZXJsYXk7XG5cbiAgLyoqIENsYXNzZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBzZWxlY3QgcGFuZWwuIFN1cHBvcnRzIHRoZSBzYW1lIHN5bnRheCBhcyBgbmdDbGFzc2AuICovXG4gIEBJbnB1dCgpIHBhbmVsQ2xhc3M6IHN0cmluZ3xzdHJpbmdbXXxTZXQ8c3RyaW5nPnx7W2tleTogc3RyaW5nXTogYW55fTtcblxuICAvKiogUGxhY2Vob2xkZXIgdG8gYmUgc2hvd24gaWYgbm8gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuICovXG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7IH1cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgcmVxdWlyZWQuICovXG4gIEBJbnB1dCgpXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3JlcXVpcmVkOyB9XG4gIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogV2hldGhlciB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZCB0byBzZWxlY3QgbXVsdGlwbGUgb3B0aW9ucy4gKi9cbiAgQElucHV0KClcbiAgZ2V0IG11bHRpcGxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fbXVsdGlwbGU7IH1cbiAgc2V0IG11bHRpcGxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsICYmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpKSB7XG4gICAgICB0aHJvdyBnZXRNYXRTZWxlY3REeW5hbWljTXVsdGlwbGVFcnJvcigpO1xuICAgIH1cblxuICAgIHRoaXMuX211bHRpcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9tdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBXaGV0aGVyIHRvIGNlbnRlciB0aGUgYWN0aXZlIG9wdGlvbiBvdmVyIHRoZSB0cmlnZ2VyLiAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZU9wdGlvbkNlbnRlcmluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVPcHRpb25DZW50ZXJpbmc7IH1cbiAgc2V0IGRpc2FibGVPcHRpb25DZW50ZXJpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlT3B0aW9uQ2VudGVyaW5nID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9kaXNhYmxlT3B0aW9uQ2VudGVyaW5nID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmRpc2FibGVPcHRpb25DZW50ZXJpbmcgPz8gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGNvbXBhcmUgdGhlIG9wdGlvbiB2YWx1ZXMgd2l0aCB0aGUgc2VsZWN0ZWQgdmFsdWVzLiBUaGUgZmlyc3QgYXJndW1lbnRcbiAgICogaXMgYSB2YWx1ZSBmcm9tIGFuIG9wdGlvbi4gVGhlIHNlY29uZCBpcyBhIHZhbHVlIGZyb20gdGhlIHNlbGVjdGlvbi4gQSBib29sZWFuXG4gICAqIHNob3VsZCBiZSByZXR1cm5lZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjb21wYXJlV2l0aCgpIHsgcmV0dXJuIHRoaXMuX2NvbXBhcmVXaXRoOyB9XG4gIHNldCBjb21wYXJlV2l0aChmbjogKG8xOiBhbnksIG8yOiBhbnkpID0+IGJvb2xlYW4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpKSB7XG4gICAgICB0aHJvdyBnZXRNYXRTZWxlY3ROb25GdW5jdGlvblZhbHVlRXJyb3IoKTtcbiAgICB9XG4gICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjtcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9uTW9kZWwpIHtcbiAgICAgIC8vIEEgZGlmZmVyZW50IGNvbXBhcmF0b3IgbWVhbnMgdGhlIHNlbGVjdGlvbiBjb3VsZCBjaGFuZ2UuXG4gICAgICB0aGlzLl9pbml0aWFsaXplU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFZhbHVlIG9mIHRoZSBzZWxlY3QgY29udHJvbC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfVxuICBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIC8vIEFsd2F5cyByZS1hc3NpZ24gYW4gYXJyYXksIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBiZWVuIG11dGF0ZWQuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLl92YWx1ZSB8fCAodGhpcy5fbXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUobmV3VmFsdWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF92YWx1ZTogYW55O1xuXG4gIC8qKiBBcmlhIGxhYmVsIG9mIHRoZSBzZWxlY3QuICovXG4gIEBJbnB1dCgnYXJpYS1sYWJlbCcpIGFyaWFMYWJlbDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIElucHV0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlLiAqL1xuICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmc7XG5cbiAgLyoqIE9iamVjdCB1c2VkIHRvIGNvbnRyb2wgd2hlbiBlcnJvciBtZXNzYWdlcyBhcmUgc2hvd24uICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlIGVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcjtcblxuICAvKiogVGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYmVmb3JlIG1vdmluZyBmb2N1cyB0byBhbiBpdGVtLiAqL1xuICBASW5wdXQoKVxuICBnZXQgdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDsgfVxuICBzZXQgdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF90eXBlYWhlYWREZWJvdW5jZUludGVydmFsOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gc29ydCB0aGUgdmFsdWVzIGluIGEgc2VsZWN0IGluIG11bHRpcGxlIG1vZGUuXG4gICAqIEZvbGxvd3MgdGhlIHNhbWUgbG9naWMgYXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YC5cbiAgICovXG4gIEBJbnB1dCgpIHNvcnRDb21wYXJhdG9yOiAoYTogTWF0T3B0aW9uLCBiOiBNYXRPcHRpb24sIG9wdGlvbnM6IE1hdE9wdGlvbltdKSA9PiBudW1iZXI7XG5cbiAgLyoqIFVuaXF1ZSBpZCBvZiB0aGUgZWxlbWVudC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGlkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9pZDsgfVxuICBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2lkID0gdmFsdWUgfHwgdGhpcy5fdWlkO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBwcml2YXRlIF9pZDogc3RyaW5nO1xuXG4gIC8qKiBDb21iaW5lZCBzdHJlYW0gb2YgYWxsIG9mIHRoZSBjaGlsZCBvcHRpb25zJyBjaGFuZ2UgZXZlbnRzLiAqL1xuICByZWFkb25seSBvcHRpb25TZWxlY3Rpb25DaGFuZ2VzOiBPYnNlcnZhYmxlPE1hdE9wdGlvblNlbGVjdGlvbkNoYW5nZT4gPSBkZWZlcigoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5jaGFuZ2VzLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChvcHRpb25zKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IG1lcmdlKC4uLm9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24ub25TZWxlY3Rpb25DaGFuZ2UpKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX25nWm9uZS5vblN0YWJsZVxuICAgICAgLnBpcGUodGFrZSgxKSwgc3dpdGNoTWFwKCgpID0+IHRoaXMub3B0aW9uU2VsZWN0aW9uQ2hhbmdlcykpO1xuICB9KSBhcyBPYnNlcnZhYmxlPE1hdE9wdGlvblNlbGVjdGlvbkNoYW5nZT47XG5cbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0IHBhbmVsIGhhcyBiZWVuIHRvZ2dsZWQuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBvcGVuZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3QgaGFzIGJlZW4gb3BlbmVkLiAqL1xuICBAT3V0cHV0KCdvcGVuZWQnKSByZWFkb25seSBfb3BlbmVkU3RyZWFtOiBPYnNlcnZhYmxlPHZvaWQ+ID1cbiAgICAgIHRoaXMub3BlbmVkQ2hhbmdlLnBpcGUoZmlsdGVyKG8gPT4gbyksIG1hcCgoKSA9PiB7fSkpO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdCBoYXMgYmVlbiBjbG9zZWQuICovXG4gIEBPdXRwdXQoJ2Nsb3NlZCcpIHJlYWRvbmx5IF9jbG9zZWRTdHJlYW06IE9ic2VydmFibGU8dm9pZD4gPVxuICAgICAgdGhpcy5vcGVuZWRDaGFuZ2UucGlwZShmaWx0ZXIobyA9PiAhbyksIG1hcCgoKSA9PiB7fSkpO1xuXG4gICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3RlZCB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoZSB1c2VyLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Qz4gPSBuZXcgRXZlbnRFbWl0dGVyPEM+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IHRoYXQgZW1pdHMgd2hlbmV2ZXIgdGhlIHJhdyB2YWx1ZSBvZiB0aGUgc2VsZWN0IGNoYW5nZXMuIFRoaXMgaXMgaGVyZSBwcmltYXJpbHlcbiAgICogdG8gZmFjaWxpdGF0ZSB0aGUgdHdvLXdheSBiaW5kaW5nIGZvciB0aGUgYHZhbHVlYCBpbnB1dC5cbiAgICogQGRvY3MtcHJpdmF0ZVxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcbiAgICBwcm90ZWN0ZWQgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgX25nWm9uZTogTmdab25lLFxuICAgIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfZGlyOiBEaXJlY3Rpb25hbGl0eSxcbiAgICBAT3B0aW9uYWwoKSBfcGFyZW50Rm9ybTogTmdGb3JtLFxuICAgIEBPcHRpb25hbCgpIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEKSBwcm90ZWN0ZWQgX3BhcmVudEZvcm1GaWVsZDogTWF0Rm9ybUZpZWxkLFxuICAgIEBTZWxmKCkgQE9wdGlvbmFsKCkgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgQEF0dHJpYnV0ZSgndGFiaW5kZXgnKSB0YWJJbmRleDogc3RyaW5nLFxuICAgIEBJbmplY3QoTUFUX1NFTEVDVF9TQ1JPTExfU1RSQVRFR1kpIHNjcm9sbFN0cmF0ZWd5RmFjdG9yeTogYW55LFxuICAgIHByaXZhdGUgX2xpdmVBbm5vdW5jZXI6IExpdmVBbm5vdW5jZXIsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfU0VMRUNUX0NPTkZJRykgcHJpdmF0ZSBfZGVmYXVsdE9wdGlvbnM/OiBNYXRTZWxlY3RDb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50UmVmLCBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyLCBfcGFyZW50Rm9ybSxcbiAgICAgICAgICBfcGFyZW50Rm9ybUdyb3VwLCBuZ0NvbnRyb2wpO1xuXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAvLyBOb3RlOiB3ZSBwcm92aWRlIHRoZSB2YWx1ZSBhY2Nlc3NvciB0aHJvdWdoIGhlcmUsIGluc3RlYWQgb2ZcbiAgICAgIC8vIHRoZSBgcHJvdmlkZXJzYCB0byBhdm9pZCBydW5uaW5nIGludG8gYSBjaXJjdWxhciBpbXBvcnQuXG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG5cbiAgICAvLyBOb3RlIHRoYXQgd2Ugb25seSB3YW50IHRvIHNldCB0aGlzIHdoZW4gdGhlIGRlZmF1bHRzIHBhc3MgaXQgaW4sIG90aGVyd2lzZSBpdCBzaG91bGRcbiAgICAvLyBzdGF5IGFzIGB1bmRlZmluZWRgIHNvIHRoYXQgaXQgZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCBpbiB0aGUga2V5IG1hbmFnZXIuXG4gICAgaWYgKF9kZWZhdWx0T3B0aW9ucz8udHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl90eXBlYWhlYWREZWJvdW5jZUludGVydmFsID0gX2RlZmF1bHRPcHRpb25zLnR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWw7XG4gICAgfVxuXG4gICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5ID0gc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5O1xuICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gdGhpcy5fc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5KCk7XG4gICAgdGhpcy50YWJJbmRleCA9IHBhcnNlSW50KHRhYkluZGV4KSB8fCAwO1xuXG4gICAgLy8gRm9yY2Ugc2V0dGVyIHRvIGJlIGNhbGxlZCBpbiBjYXNlIGlkIHdhcyBub3Qgc3BlY2lmaWVkLlxuICAgIHRoaXMuaWQgPSB0aGlzLmlkO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8TWF0T3B0aW9uPih0aGlzLm11bHRpcGxlKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG5cbiAgICAvLyBXZSBuZWVkIGBkaXN0aW5jdFVudGlsQ2hhbmdlZGAgaGVyZSwgYmVjYXVzZSBzb21lIGJyb3dzZXJzIHdpbGxcbiAgICAvLyBmaXJlIHRoZSBhbmltYXRpb24gZW5kIGV2ZW50IHR3aWNlIGZvciB0aGUgc2FtZSBhbmltYXRpb24uIFNlZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yNDA4NFxuICAgIHRoaXMuX3BhbmVsRG9uZUFuaW1hdGluZ1N0cmVhbVxuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9wYW5lbERvbmVBbmltYXRpbmcodGhpcy5wYW5lbE9wZW4pKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLl9pbml0S2V5TWFuYWdlcigpO1xuXG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2hhbmdlZC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LmFkZGVkLmZvckVhY2gob3B0aW9uID0+IG9wdGlvbi5zZWxlY3QoKSk7XG4gICAgICBldmVudC5yZW1vdmVkLmZvckVhY2gob3B0aW9uID0+IG9wdGlvbi5kZXNlbGVjdCgpKTtcbiAgICB9KTtcblxuICAgIHRoaXMub3B0aW9ucy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9yZXNldE9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVTZWxlY3Rpb24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBjb25zdCBuZXdBcmlhTGFiZWxsZWRieSA9IHRoaXMuX2dldFRyaWdnZXJBcmlhTGFiZWxsZWRieSgpO1xuXG4gICAgLy8gV2UgaGF2ZSB0byBtYW5hZ2Ugc2V0dGluZyB0aGUgYGFyaWEtbGFiZWxsZWRieWAgb3Vyc2VsdmVzLCBiZWNhdXNlIHBhcnQgb2YgaXRzIHZhbHVlXG4gICAgLy8gaXMgY29tcHV0ZWQgYXMgYSByZXN1bHQgb2YgYSBjb250ZW50IHF1ZXJ5IHdoaWNoIGNhbiBjYXVzZSB0aGlzIGJpbmRpbmcgdG8gdHJpZ2dlciBhXG4gICAgLy8gXCJjaGFuZ2VkIGFmdGVyIGNoZWNrZWRcIiBlcnJvci5cbiAgICBpZiAobmV3QXJpYUxhYmVsbGVkYnkgIT09IHRoaXMuX3RyaWdnZXJBcmlhTGFiZWxsZWRCeSkge1xuICAgICAgY29uc3QgZWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB0aGlzLl90cmlnZ2VyQXJpYUxhYmVsbGVkQnkgPSBuZXdBcmlhTGFiZWxsZWRieTtcbiAgICAgIGlmIChuZXdBcmlhTGFiZWxsZWRieSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgbmV3QXJpYUxhYmVsbGVkYnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgdGhpcy51cGRhdGVFcnJvclN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vIFVwZGF0aW5nIHRoZSBkaXNhYmxlZCBzdGF0ZSBpcyBoYW5kbGVkIGJ5IGBtaXhpbkRpc2FibGVkYCwgYnV0IHdlIG5lZWQgdG8gYWRkaXRpb25hbGx5IGxldFxuICAgIC8vIHRoZSBwYXJlbnQgZm9ybSBmaWVsZCBrbm93IHRvIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIHdoZW4gdGhlIGRpc2FibGVkIHN0YXRlIGNoYW5nZXMuXG4gICAgaWYgKGNoYW5nZXNbJ2Rpc2FibGVkJ10pIHtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlc1sndHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCddICYmIHRoaXMuX2tleU1hbmFnZXIpIHtcbiAgICAgIHRoaXMuX2tleU1hbmFnZXIud2l0aFR5cGVBaGVhZCh0aGlzLl90eXBlYWhlYWREZWJvdW5jZUludGVydmFsKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9kZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKiBUb2dnbGVzIHRoZSBvdmVybGF5IHBhbmVsIG9wZW4gb3IgY2xvc2VkLiAqL1xuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5wYW5lbE9wZW4gPyB0aGlzLmNsb3NlKCkgOiB0aGlzLm9wZW4oKTtcbiAgfVxuXG4gIC8qKiBPcGVucyB0aGUgb3ZlcmxheSBwYW5lbC4gKi9cbiAgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2FuT3BlbigpKSB7XG4gICAgICB0aGlzLl9wYW5lbE9wZW4gPSB0cnVlO1xuICAgICAgdGhpcy5fa2V5TWFuYWdlci53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKG51bGwpO1xuICAgICAgdGhpcy5faGlnaGxpZ2h0Q29ycmVjdE9wdGlvbigpO1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsb3NlcyB0aGUgb3ZlcmxheSBwYW5lbCBhbmQgZm9jdXNlcyB0aGUgaG9zdCBlbGVtZW50LiAqL1xuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLl9wYW5lbE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2tleU1hbmFnZXIud2l0aEhvcml6b250YWxPcmllbnRhdGlvbih0aGlzLl9pc1J0bCgpID8gJ3J0bCcgOiAnbHRyJyk7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZWxlY3QncyB2YWx1ZS4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gICAqIHJlcXVpcmVkIHRvIGludGVncmF0ZSB3aXRoIEFuZ3VsYXIncyBjb3JlIGZvcm1zIEFQSS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBtb2RlbC5cbiAgICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0J3MgdmFsdWVcbiAgICogY2hhbmdlcyBmcm9tIHVzZXIgaW5wdXQuIFBhcnQgb2YgdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICAgKiByZXF1aXJlZCB0byBpbnRlZ3JhdGUgd2l0aCBBbmd1bGFyJ3MgY29yZSBmb3JtcyBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy5cbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0IGlzIGJsdXJyZWRcbiAgICogYnkgdGhlIHVzZXIuIFBhcnQgb2YgdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZSByZXF1aXJlZFxuICAgKiB0byBpbnRlZ3JhdGUgd2l0aCBBbmd1bGFyJ3MgY29yZSBmb3JtcyBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHRvdWNoZWQuXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgc2VsZWN0LiBQYXJ0IG9mIHRoZSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2UgcmVxdWlyZWRcbiAgICogdG8gaW50ZWdyYXRlIHdpdGggQW5ndWxhcidzIGNvcmUgZm9ybXMgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCBTZXRzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgb3ZlcmxheSBwYW5lbCBpcyBvcGVuLiAqL1xuICBnZXQgcGFuZWxPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wYW5lbE9wZW47XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uICovXG4gIGdldCBzZWxlY3RlZCgpOiBNYXRPcHRpb24gfCBNYXRPcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZCA6IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdO1xuICB9XG5cbiAgLyoqIFRoZSB2YWx1ZSBkaXNwbGF5ZWQgaW4gdGhlIHRyaWdnZXIuICovXG4gIGdldCB0cmlnZ2VyVmFsdWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lbXB0eSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tdWx0aXBsZSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubWFwKG9wdGlvbiA9PiBvcHRpb24udmlld1ZhbHVlKTtcblxuICAgICAgaWYgKHRoaXMuX2lzUnRsKCkpIHtcbiAgICAgICAgc2VsZWN0ZWRPcHRpb25zLnJldmVyc2UoKTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyhjcmlzYmV0byk6IGRlbGltaXRlciBzaG91bGQgYmUgY29uZmlndXJhYmxlIGZvciBwcm9wZXIgbG9jYWxpemF0aW9uLlxuICAgICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9ucy5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXS52aWV3VmFsdWU7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgZWxlbWVudCBpcyBpbiBSVEwgbW9kZS4gKi9cbiAgX2lzUnRsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXIgPyB0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnIDogZmFsc2U7XG4gIH1cblxuICAvKiogSGFuZGxlcyBhbGwga2V5ZG93biBldmVudHMgb24gdGhlIHNlbGVjdC4gKi9cbiAgX2hhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucGFuZWxPcGVuID8gdGhpcy5faGFuZGxlT3BlbktleWRvd24oZXZlbnQpIDogdGhpcy5faGFuZGxlQ2xvc2VkS2V5ZG93bihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEhhbmRsZXMga2V5Ym9hcmQgZXZlbnRzIHdoaWxlIHRoZSBzZWxlY3QgaXMgY2xvc2VkLiAqL1xuICBwcml2YXRlIF9oYW5kbGVDbG9zZWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgY29uc3QgaXNBcnJvd0tleSA9IGtleUNvZGUgPT09IERPV05fQVJST1cgfHwga2V5Q29kZSA9PT0gVVBfQVJST1cgfHxcbiAgICAgICAgICAgICAgICAgICAgICAga2V5Q29kZSA9PT0gTEVGVF9BUlJPVyB8fCBrZXlDb2RlID09PSBSSUdIVF9BUlJPVztcbiAgICBjb25zdCBpc09wZW5LZXkgPSBrZXlDb2RlID09PSBFTlRFUiB8fCBrZXlDb2RlID09PSBTUEFDRTtcbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5fa2V5TWFuYWdlcjtcblxuICAgIC8vIE9wZW4gdGhlIHNlbGVjdCBvbiBBTFQgKyBhcnJvdyBrZXkgdG8gbWF0Y2ggdGhlIG5hdGl2ZSA8c2VsZWN0PlxuICAgIGlmICghbWFuYWdlci5pc1R5cGluZygpICYmIChpc09wZW5LZXkgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KSkgfHxcbiAgICAgICgodGhpcy5tdWx0aXBsZSB8fCBldmVudC5hbHRLZXkpICYmIGlzQXJyb3dLZXkpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50cyB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZyBkb3duIHdoZW4gcHJlc3Npbmcgc3BhY2VcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzbHlTZWxlY3RlZE9wdGlvbiA9IHRoaXMuc2VsZWN0ZWQ7XG4gICAgICBtYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7XG4gICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMuc2VsZWN0ZWQ7XG5cbiAgICAgIC8vIFNpbmNlIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBhbm5vdW5jZSBpdCBvdXJzZWx2ZXMuXG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgcHJldmlvdXNseVNlbGVjdGVkT3B0aW9uICE9PSBzZWxlY3RlZE9wdGlvbikge1xuICAgICAgICAvLyBXZSBzZXQgYSBkdXJhdGlvbiBvbiB0aGUgbGl2ZSBhbm5vdW5jZW1lbnQsIGJlY2F1c2Ugd2Ugd2FudCB0aGUgbGl2ZSBlbGVtZW50IHRvIGJlXG4gICAgICAgIC8vIGNsZWFyZWQgYWZ0ZXIgYSB3aGlsZSBzbyB0aGF0IHVzZXJzIGNhbid0IG5hdmlnYXRlIHRvIGl0IHVzaW5nIHRoZSBhcnJvdyBrZXlzLlxuICAgICAgICB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKChzZWxlY3RlZE9wdGlvbiBhcyBNYXRPcHRpb24pLnZpZXdWYWx1ZSwgMTAwMDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGtleWJvYXJkIGV2ZW50cyB3aGVuIHRoZSBzZWxlY3RlZCBpcyBvcGVuLiAqL1xuICBwcml2YXRlIF9oYW5kbGVPcGVuS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLl9rZXlNYW5hZ2VyO1xuICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgIGNvbnN0IGlzQXJyb3dLZXkgPSBrZXlDb2RlID09PSBET1dOX0FSUk9XIHx8IGtleUNvZGUgPT09IFVQX0FSUk9XO1xuICAgIGNvbnN0IGlzVHlwaW5nID0gbWFuYWdlci5pc1R5cGluZygpO1xuXG4gICAgaWYgKGlzQXJyb3dLZXkgJiYgZXZlbnQuYWx0S2V5KSB7XG4gICAgICAvLyBDbG9zZSB0aGUgc2VsZWN0IG9uIEFMVCArIGFycm93IGtleSB0byBtYXRjaCB0aGUgbmF0aXZlIDxzZWxlY3Q+XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBjYXNlIGlmIHRoZSB1c2VyIGlzIHR5cGluZyxcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHR5cGluZyBzZXF1ZW5jZSBjYW4gaW5jbHVkZSB0aGUgc3BhY2Uga2V5LlxuICAgIH0gZWxzZSBpZiAoIWlzVHlwaW5nICYmIChrZXlDb2RlID09PSBFTlRFUiB8fCBrZXlDb2RlID09PSBTUEFDRSkgJiYgbWFuYWdlci5hY3RpdmVJdGVtICYmXG4gICAgICAhaGFzTW9kaWZpZXJLZXkoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbWFuYWdlci5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoIWlzVHlwaW5nICYmIHRoaXMuX211bHRpcGxlICYmIGtleUNvZGUgPT09IEEgJiYgZXZlbnQuY3RybEtleSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGhhc0Rlc2VsZWN0ZWRPcHRpb25zID0gdGhpcy5vcHRpb25zLnNvbWUob3B0ID0+ICFvcHQuZGlzYWJsZWQgJiYgIW9wdC5zZWxlY3RlZCk7XG5cbiAgICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICAgICAgaGFzRGVzZWxlY3RlZE9wdGlvbnMgPyBvcHRpb24uc2VsZWN0KCkgOiBvcHRpb24uZGVzZWxlY3QoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkSW5kZXggPSBtYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleDtcblxuICAgICAgbWFuYWdlci5vbktleWRvd24oZXZlbnQpO1xuXG4gICAgICBpZiAodGhpcy5fbXVsdGlwbGUgJiYgaXNBcnJvd0tleSAmJiBldmVudC5zaGlmdEtleSAmJiBtYW5hZ2VyLmFjdGl2ZUl0ZW0gJiZcbiAgICAgICAgICBtYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCAhPT0gcHJldmlvdXNseUZvY3VzZWRJbmRleCkge1xuICAgICAgICBtYW5hZ2VyLmFjdGl2ZUl0ZW0uX3NlbGVjdFZpYUludGVyYWN0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX29uRm9jdXMoKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgdGhlIHRvdWNoZWQgY2FsbGJhY2sgb25seSBpZiB0aGUgcGFuZWwgaXMgY2xvc2VkLiBPdGhlcndpc2UsIHRoZSB0cmlnZ2VyIHdpbGxcbiAgICogXCJibHVyXCIgdG8gdGhlIHBhbmVsIHdoZW4gaXQgb3BlbnMsIGNhdXNpbmcgYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICovXG4gIF9vbkJsdXIoKSB7XG4gICAgdGhpcy5fZm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIG92ZXJsYXkgcGFuZWwgaGFzIGJlZW4gYXR0YWNoZWQuXG4gICAqL1xuICBfb25BdHRhY2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9vdmVybGF5RGlyLnBvc2l0aW9uQ2hhbmdlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uaW5nU2V0dGxlZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHRoZW1lIHRvIGJlIHVzZWQgb24gdGhlIHBhbmVsLiAqL1xuICBfZ2V0UGFuZWxUaGVtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRGb3JtRmllbGQgPyBgbWF0LSR7dGhpcy5fcGFyZW50Rm9ybUZpZWxkLmNvbG9yfWAgOiAnJztcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWxlY3QgaGFzIGEgdmFsdWUuICovXG4gIGdldCBlbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3NlbGVjdGlvbk1vZGVsIHx8IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzRW1wdHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRpYWxpemVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gRGVmZXIgc2V0dGluZyB0aGUgdmFsdWUgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIFwiRXhwcmVzc2lvblxuICAgIC8vIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkXCIgZXJyb3JzIGZyb20gQW5ndWxhci5cbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodGhpcy5uZ0NvbnRyb2wgPyB0aGlzLm5nQ29udHJvbC52YWx1ZSA6IHRoaXMuX3ZhbHVlKTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBvcHRpb24gYmFzZWQgb24gYSB2YWx1ZS4gSWYgbm8gb3B0aW9uIGNhbiBiZVxuICAgKiBmb3VuZCB3aXRoIHRoZSBkZXNpZ25hdGVkIHZhbHVlLCB0aGUgc2VsZWN0IHRyaWdnZXIgaXMgY2xlYXJlZC5cbiAgICovXG4gIHByaXZhdGUgX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWU6IGFueSB8IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQuZm9yRWFjaChvcHRpb24gPT4gb3B0aW9uLnNldEluYWN0aXZlU3R5bGVzKCkpO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB2YWx1ZSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSkge1xuICAgICAgICB0aHJvdyBnZXRNYXRTZWxlY3ROb25BcnJheVZhbHVlRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUuZm9yRWFjaCgoY3VycmVudFZhbHVlOiBhbnkpID0+IHRoaXMuX3NlbGVjdFZhbHVlKGN1cnJlbnRWYWx1ZSkpO1xuICAgICAgdGhpcy5fc29ydFZhbHVlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb3JyZXNwb25kaW5nT3B0aW9uID0gdGhpcy5fc2VsZWN0VmFsdWUodmFsdWUpO1xuXG4gICAgICAvLyBTaGlmdCBmb2N1cyB0byB0aGUgYWN0aXZlIGl0ZW0uIE5vdGUgdGhhdCB3ZSBzaG91bGRuJ3QgZG8gdGhpcyBpbiBtdWx0aXBsZVxuICAgICAgLy8gbW9kZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgb3B0aW9uIHRoZSB1c2VyIGludGVyYWN0ZWQgd2l0aCBsYXN0LlxuICAgICAgaWYgKGNvcnJlc3BvbmRpbmdPcHRpb24pIHtcbiAgICAgICAgdGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKGNvcnJlc3BvbmRpbmdPcHRpb24pO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIHJlc2V0IHRoZSBoaWdobGlnaHRlZCBvcHRpb24uIE5vdGUgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyB3aGlsZVxuICAgICAgICAvLyBjbG9zZWQsIGJlY2F1c2UgZG9pbmcgaXQgd2hpbGUgb3BlbiBjYW4gc2hpZnQgdGhlIHVzZXIncyBmb2N1cyB1bm5lY2Vzc2FyaWx5LlxuICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnVwZGF0ZUFjdGl2ZUl0ZW0oLTEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuZCBzZWxlY3RzIGFuZCBvcHRpb24gYmFzZWQgb24gaXRzIHZhbHVlLlxuICAgKiBAcmV0dXJucyBPcHRpb24gdGhhdCBoYXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9zZWxlY3RWYWx1ZSh2YWx1ZTogYW55KTogTWF0T3B0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb3JyZXNwb25kaW5nT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoKG9wdGlvbjogTWF0T3B0aW9uKSA9PiB7XG4gICAgICAvLyBTa2lwIG9wdGlvbnMgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgbW9kZWwuIFRoaXMgYWxsb3dzIHVzIHRvIGhhbmRsZSBjYXNlc1xuICAgICAgLy8gd2hlcmUgdGhlIHNhbWUgcHJpbWl0aXZlIHZhbHVlIGlzIHNlbGVjdGVkIG11bHRpcGxlIHRpbWVzLlxuICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQob3B0aW9uKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRyZWF0IG51bGwgYXMgYSBzcGVjaWFsIHJlc2V0IHZhbHVlLlxuICAgICAgICByZXR1cm4gb3B0aW9uLnZhbHVlICE9IG51bGwgJiYgdGhpcy5fY29tcGFyZVdpdGgob3B0aW9uLnZhbHVlLCAgdmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgICAgICAgIC8vIE5vdGlmeSBkZXZlbG9wZXJzIG9mIGVycm9ycyBpbiB0aGVpciBjb21wYXJhdG9yLlxuICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGNvcnJlc3BvbmRpbmdPcHRpb24pIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChjb3JyZXNwb25kaW5nT3B0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29ycmVzcG9uZGluZ09wdGlvbjtcbiAgfVxuXG4gIC8qKiBTZXRzIHVwIGEga2V5IG1hbmFnZXIgdG8gbGlzdGVuIHRvIGtleWJvYXJkIGV2ZW50cyBvbiB0aGUgb3ZlcmxheSBwYW5lbC4gKi9cbiAgcHJpdmF0ZSBfaW5pdEtleU1hbmFnZXIoKSB7XG4gICAgdGhpcy5fa2V5TWFuYWdlciA9IG5ldyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlcjxNYXRPcHRpb24+KHRoaXMub3B0aW9ucylcbiAgICAgIC53aXRoVHlwZUFoZWFkKHRoaXMuX3R5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwpXG4gICAgICAud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oKVxuICAgICAgLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5faXNSdGwoKSA/ICdydGwnIDogJ2x0cicpXG4gICAgICAud2l0aEhvbWVBbmRFbmQoKVxuICAgICAgLndpdGhBbGxvd2VkTW9kaWZpZXJLZXlzKFsnc2hpZnRLZXknXSk7XG5cbiAgICB0aGlzLl9rZXlNYW5hZ2VyLnRhYk91dC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgICAvLyBTZWxlY3QgdGhlIGFjdGl2ZSBpdGVtIHdoZW4gdGFiYmluZyBhd2F5LiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlIG5hdGl2ZVxuICAgICAgICAvLyBzZWxlY3QgYmVoYXZlcy4gTm90ZSB0aGF0IHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGluIHNpbmdsZSBzZWxlY3Rpb24gbW9kZS5cbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlICYmIHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xuICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc3RvcmUgZm9jdXMgdG8gdGhlIHRyaWdnZXIgYmVmb3JlIGNsb3NpbmcuIEVuc3VyZXMgdGhhdCB0aGUgZm9jdXNcbiAgICAgICAgLy8gcG9zaXRpb24gd29uJ3QgYmUgbG9zdCBpZiB0aGUgdXNlciBnb3QgZm9jdXMgaW50byB0aGUgb3ZlcmxheS5cbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9rZXlNYW5hZ2VyLmNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9wYW5lbE9wZW4gJiYgdGhpcy5wYW5lbCkge1xuICAgICAgICB0aGlzLl9zY3JvbGxPcHRpb25JbnRvVmlldyh0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCB8fCAwKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3BhbmVsT3BlbiAmJiAhdGhpcy5tdWx0aXBsZSAmJiB0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIERyb3BzIGN1cnJlbnQgb3B0aW9uIHN1YnNjcmlwdGlvbnMgYW5kIElEcyBhbmQgcmVzZXRzIGZyb20gc2NyYXRjaC4gKi9cbiAgcHJpdmF0ZSBfcmVzZXRPcHRpb25zKCk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5nZWRPckRlc3Ryb3llZCA9IG1lcmdlKHRoaXMub3B0aW9ucy5jaGFuZ2VzLCB0aGlzLl9kZXN0cm95KTtcblxuICAgIHRoaXMub3B0aW9uU2VsZWN0aW9uQ2hhbmdlcy5waXBlKHRha2VVbnRpbChjaGFuZ2VkT3JEZXN0cm95ZWQpKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgdGhpcy5fb25TZWxlY3QoZXZlbnQuc291cmNlLCBldmVudC5pc1VzZXJJbnB1dCk7XG5cbiAgICAgIGlmIChldmVudC5pc1VzZXJJbnB1dCAmJiAhdGhpcy5tdWx0aXBsZSAmJiB0aGlzLl9wYW5lbE9wZW4pIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gdG8gY2hhbmdlcyBpbiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG9wdGlvbnMgYW5kIHJlYWN0IGFjY29yZGluZ2x5LlxuICAgIC8vIEhhbmRsZXMgY2FzZXMgbGlrZSB0aGUgbGFiZWxzIG9mIHRoZSBzZWxlY3RlZCBvcHRpb25zIGNoYW5naW5nLlxuICAgIG1lcmdlKC4uLnRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi5fc3RhdGVDaGFuZ2VzKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbChjaGFuZ2VkT3JEZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBJbnZva2VkIHdoZW4gYW4gb3B0aW9uIGlzIGNsaWNrZWQuICovXG4gIHByaXZhdGUgX29uU2VsZWN0KG9wdGlvbjogTWF0T3B0aW9uLCBpc1VzZXJJbnB1dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pO1xuXG4gICAgaWYgKG9wdGlvbi52YWx1ZSA9PSBudWxsICYmICF0aGlzLl9tdWx0aXBsZSkge1xuICAgICAgb3B0aW9uLmRlc2VsZWN0KCk7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuXG4gICAgICBpZiAodGhpcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXMob3B0aW9uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHdhc1NlbGVjdGVkICE9PSBvcHRpb24uc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KG9wdGlvbikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChvcHRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVc2VySW5wdXQpIHtcbiAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG9wdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIHRoaXMuX3NvcnRWYWx1ZXMoKTtcblxuICAgICAgICBpZiAoaXNVc2VySW5wdXQpIHtcbiAgICAgICAgICAvLyBJbiBjYXNlIHRoZSB1c2VyIHNlbGVjdGVkIHRoZSBvcHRpb24gd2l0aCB0aGVpciBtb3VzZSwgd2VcbiAgICAgICAgICAvLyB3YW50IHRvIHJlc3RvcmUgZm9jdXMgYmFjayB0byB0aGUgdHJpZ2dlciwgaW4gb3JkZXIgdG9cbiAgICAgICAgICAvLyBwcmV2ZW50IHRoZSBzZWxlY3Qga2V5Ym9hcmQgY29udHJvbHMgZnJvbSBjbGFzaGluZyB3aXRoXG4gICAgICAgICAgLy8gdGhlIG9uZXMgZnJvbSBgbWF0LW9wdGlvbmAuXG4gICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdhc1NlbGVjdGVkICE9PSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICAvKiogU29ydHMgdGhlIHNlbGVjdGVkIHZhbHVlcyBpbiB0aGUgc2VsZWN0ZWQgYmFzZWQgb24gdGhlaXIgb3JkZXIgaW4gdGhlIHBhbmVsLiAqL1xuICBwcml2YXRlIF9zb3J0VmFsdWVzKCkge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLnRvQXJyYXkoKTtcblxuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0Q29tcGFyYXRvciA/IHRoaXMuc29ydENvbXBhcmF0b3IoYSwgYiwgb3B0aW9ucykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kZXhPZihhKSAtIG9wdGlvbnMuaW5kZXhPZihiKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbWl0cyBjaGFuZ2UgZXZlbnQgdG8gc2V0IHRoZSBtb2RlbCB2YWx1ZS4gKi9cbiAgcHJpdmF0ZSBfcHJvcGFnYXRlQ2hhbmdlcyhmYWxsYmFja1ZhbHVlPzogYW55KTogdm9pZCB7XG4gICAgbGV0IHZhbHVlVG9FbWl0OiBhbnkgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHZhbHVlVG9FbWl0ID0gKHRoaXMuc2VsZWN0ZWQgYXMgTWF0T3B0aW9uW10pLm1hcChvcHRpb24gPT4gb3B0aW9uLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWVUb0VtaXQgPSB0aGlzLnNlbGVjdGVkID8gKHRoaXMuc2VsZWN0ZWQgYXMgTWF0T3B0aW9uKS52YWx1ZSA6IGZhbGxiYWNrVmFsdWU7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZVRvRW1pdDtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWVUb0VtaXQpO1xuICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlVG9FbWl0KTtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuX2dldENoYW5nZUV2ZW50KHZhbHVlVG9FbWl0KSk7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogSGlnaGxpZ2h0cyB0aGUgc2VsZWN0ZWQgaXRlbS4gSWYgbm8gb3B0aW9uIGlzIHNlbGVjdGVkLCBpdCB3aWxsIGhpZ2hsaWdodFxuICAgKiB0aGUgZmlyc3QgaXRlbSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGlnaGxpZ2h0Q29ycmVjdE9wdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fa2V5TWFuYWdlcikge1xuICAgICAgaWYgKHRoaXMuZW1wdHkpIHtcbiAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHBhbmVsIGlzIGFsbG93ZWQgdG8gb3Blbi4gKi9cbiAgcHJvdGVjdGVkIF9jYW5PcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fcGFuZWxPcGVuICYmICF0aGlzLmRpc2FibGVkICYmIHRoaXMub3B0aW9ucz8ubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBGb2N1c2VzIHRoZSBzZWxlY3QgZWxlbWVudC4gKi9cbiAgZm9jdXMob3B0aW9ucz86IEZvY3VzT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBhcmlhLWxhYmVsbGVkYnkgZm9yIHRoZSBzZWxlY3QgcGFuZWwuICovXG4gIF9nZXRQYW5lbEFyaWFMYWJlbGxlZGJ5KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmFyaWFMYWJlbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxJZCA9IHRoaXMuX3BhcmVudEZvcm1GaWVsZD8uZ2V0TGFiZWxJZCgpO1xuICAgIGNvbnN0IGxhYmVsRXhwcmVzc2lvbiA9IChsYWJlbElkID8gbGFiZWxJZCArICcgJyA6ICcnKTtcbiAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxsZWRieSA/IGxhYmVsRXhwcmVzc2lvbiArIHRoaXMuYXJpYUxhYmVsbGVkYnkgOiBsYWJlbElkO1xuICB9XG5cbiAgLyoqIERldGVybWluZXMgdGhlIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgIHRvIGJlIHNldCBvbiB0aGUgaG9zdC4gKi9cbiAgX2dldEFyaWFBY3RpdmVEZXNjZW5kYW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnBhbmVsT3BlbiAmJiB0aGlzLl9rZXlNYW5hZ2VyICYmIHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbS5pZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBhcmlhLWxhYmVsbGVkYnkgb2YgdGhlIHNlbGVjdCBjb21wb25lbnQgdHJpZ2dlci4gKi9cbiAgcHJpdmF0ZSBfZ2V0VHJpZ2dlckFyaWFMYWJlbGxlZGJ5KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmFyaWFMYWJlbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxJZCA9IHRoaXMuX3BhcmVudEZvcm1GaWVsZD8uZ2V0TGFiZWxJZCgpO1xuICAgIGxldCB2YWx1ZSA9IChsYWJlbElkID8gbGFiZWxJZCArICcgJyA6ICcnKSArIHRoaXMuX3ZhbHVlSWQ7XG5cbiAgICBpZiAodGhpcy5hcmlhTGFiZWxsZWRieSkge1xuICAgICAgdmFsdWUgKz0gJyAnICsgdGhpcy5hcmlhTGFiZWxsZWRieTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKiogQ2FsbGVkIHdoZW4gdGhlIG92ZXJsYXkgcGFuZWwgaXMgZG9uZSBhbmltYXRpbmcuICovXG4gIHByb3RlY3RlZCBfcGFuZWxEb25lQW5pbWF0aW5nKGlzT3BlbjogYm9vbGVhbikge1xuICAgIHRoaXMub3BlbmVkQ2hhbmdlLmVtaXQoaXNPcGVuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuXG4gICAqIEBkb2NzLXByaXZhdGVcbiAgICovXG4gIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9hcmlhRGVzY3JpYmVkYnkgPSBpZHMuam9pbignICcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC5cbiAgICogQGRvY3MtcHJpdmF0ZVxuICAgKi9cbiAgb25Db250YWluZXJDbGljaygpIHtcbiAgICB0aGlzLmZvY3VzKCk7XG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLlxuICAgKiBAZG9jcy1wcml2YXRlXG4gICAqL1xuICBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcGFuZWxPcGVuIHx8ICF0aGlzLmVtcHR5IHx8ICh0aGlzLl9mb2N1c2VkICYmICEhdGhpcy5fcGxhY2Vob2xkZXIpO1xuICB9XG5cbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3JlcXVpcmVkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9tdWx0aXBsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZU9wdGlvbkNlbnRlcmluZzogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDogTnVtYmVySW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kaXNhYmxlZDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZVJpcHBsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfdGFiSW5kZXg6IE51bWJlcklucHV0O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtc2VsZWN0JyxcbiAgZXhwb3J0QXM6ICdtYXRTZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJ3NlbGVjdC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3NlbGVjdC5jc3MnXSxcbiAgaW5wdXRzOiBbJ2Rpc2FibGVkJywgJ2Rpc2FibGVSaXBwbGUnLCAndGFiSW5kZXgnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHtcbiAgICAncm9sZSc6ICdjb21ib2JveCcsXG4gICAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogJ25vbmUnLFxuICAgIC8vIFRPRE8oY3Jpc2JldG8pOiB0aGUgdmFsdWUgZm9yIGFyaWEtaGFzcG9wdXAgc2hvdWxkIGJlIGBsaXN0Ym94YCwgYnV0IGN1cnJlbnRseSBpdCdzIGRpZmZpY3VsdFxuICAgIC8vIHRvIHN5bmMgaW50byBHb29nbGUsIGJlY2F1c2Ugb2YgYW4gb3V0ZGF0ZWQgYXV0b21hdGVkIGExMXkgY2hlY2sgd2hpY2ggZmxhZ3MgaXQgYXMgYW4gaW52YWxpZFxuICAgIC8vIHZhbHVlLiBBdCBzb21lIHBvaW50IHdlIHNob3VsZCB0cnkgdG8gc3dpdGNoIGl0IGJhY2sgdG8gYmVpbmcgYGxpc3Rib3hgLlxuICAgICdhcmlhLWhhc3BvcHVwJzogJ3RydWUnLFxuICAgICdjbGFzcyc6ICdtYXQtc2VsZWN0JyxcbiAgICAnW2F0dHIuaWRdJzogJ2lkJyxcbiAgICAnW2F0dHIudGFiaW5kZXhdJzogJ3RhYkluZGV4JyxcbiAgICAnW2F0dHIuYXJpYS1jb250cm9sc10nOiAncGFuZWxPcGVuID8gaWQgKyBcIi1wYW5lbFwiIDogbnVsbCcsXG4gICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ3BhbmVsT3BlbicsXG4gICAgJ1thdHRyLmFyaWEtbGFiZWxdJzogJ2FyaWFMYWJlbCB8fCBudWxsJyxcbiAgICAnW2F0dHIuYXJpYS1yZXF1aXJlZF0nOiAncmVxdWlyZWQudG9TdHJpbmcoKScsXG4gICAgJ1thdHRyLmFyaWEtZGlzYWJsZWRdJzogJ2Rpc2FibGVkLnRvU3RyaW5nKCknLFxuICAgICdbYXR0ci5hcmlhLWludmFsaWRdJzogJ2Vycm9yU3RhdGUnLFxuICAgICdbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XSc6ICdfYXJpYURlc2NyaWJlZGJ5IHx8IG51bGwnLFxuICAgICdbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdJzogJ19nZXRBcmlhQWN0aXZlRGVzY2VuZGFudCgpJyxcbiAgICAnW2NsYXNzLm1hdC1zZWxlY3QtZGlzYWJsZWRdJzogJ2Rpc2FibGVkJyxcbiAgICAnW2NsYXNzLm1hdC1zZWxlY3QtaW52YWxpZF0nOiAnZXJyb3JTdGF0ZScsXG4gICAgJ1tjbGFzcy5tYXQtc2VsZWN0LXJlcXVpcmVkXSc6ICdyZXF1aXJlZCcsXG4gICAgJ1tjbGFzcy5tYXQtc2VsZWN0LWVtcHR5XSc6ICdlbXB0eScsXG4gICAgJ1tjbGFzcy5tYXQtc2VsZWN0LW11bHRpcGxlXSc6ICdtdWx0aXBsZScsXG4gICAgJyhrZXlkb3duKSc6ICdfaGFuZGxlS2V5ZG93bigkZXZlbnQpJyxcbiAgICAnKGZvY3VzKSc6ICdfb25Gb2N1cygpJyxcbiAgICAnKGJsdXIpJzogJ19vbkJsdXIoKScsXG4gIH0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICBtYXRTZWxlY3RBbmltYXRpb25zLnRyYW5zZm9ybVBhbmVsV3JhcCxcbiAgICBtYXRTZWxlY3RBbmltYXRpb25zLnRyYW5zZm9ybVBhbmVsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogTWF0U2VsZWN0fSxcbiAgICB7cHJvdmlkZTogTUFUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5ULCB1c2VFeGlzdGluZzogTWF0U2VsZWN0fVxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBNYXRTZWxlY3QgZXh0ZW5kcyBfTWF0U2VsZWN0QmFzZTxNYXRTZWxlY3RDaGFuZ2U+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqIFRoZSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG92ZXJsYXkgcGFuZWwsIGNhbGN1bGF0ZWQgdG8gY2VudGVyIHRoZSBzZWxlY3RlZCBvcHRpb24uICovXG4gIHByaXZhdGUgX3Njcm9sbFRvcCA9IDA7XG5cbiAgLyoqIFRoZSBsYXN0IG1lYXN1cmVkIHZhbHVlIGZvciB0aGUgdHJpZ2dlcidzIGNsaWVudCBib3VuZGluZyByZWN0LiAqL1xuICBfdHJpZ2dlclJlY3Q6IENsaWVudFJlY3Q7XG5cbiAgLyoqIFRoZSBjYWNoZWQgZm9udC1zaXplIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnQuICovXG4gIF90cmlnZ2VyRm9udFNpemUgPSAwO1xuXG4gIC8qKiBUaGUgdmFsdWUgb2YgdGhlIHNlbGVjdCBwYW5lbCdzIHRyYW5zZm9ybS1vcmlnaW4gcHJvcGVydHkuICovXG4gIF90cmFuc2Zvcm1PcmlnaW46IHN0cmluZyA9ICd0b3AnO1xuXG4gIC8qKlxuICAgKiBUaGUgeS1vZmZzZXQgb2YgdGhlIG92ZXJsYXkgcGFuZWwgaW4gcmVsYXRpb24gdG8gdGhlIHRyaWdnZXIncyB0b3Agc3RhcnQgY29ybmVyLlxuICAgKiBUaGlzIG11c3QgYmUgYWRqdXN0ZWQgdG8gYWxpZ24gdGhlIHNlbGVjdGVkIG9wdGlvbiB0ZXh0IG92ZXIgdGhlIHRyaWdnZXIgdGV4dC5cbiAgICogd2hlbiB0aGUgcGFuZWwgb3BlbnMuIFdpbGwgY2hhbmdlIGJhc2VkIG9uIHRoZSB5LXBvc2l0aW9uIG9mIHRoZSBzZWxlY3RlZCBvcHRpb24uXG4gICAqL1xuICBfb2Zmc2V0WSA9IDA7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihNYXRPcHRpb24sIHtkZXNjZW5kYW50czogdHJ1ZX0pIG9wdGlvbnM6IFF1ZXJ5TGlzdDxNYXRPcHRpb24+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTUFUX09QVEdST1VQLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBvcHRpb25Hcm91cHM6IFF1ZXJ5TGlzdDxNYXRPcHRncm91cD47XG5cbiAgQENvbnRlbnRDaGlsZChNQVRfU0VMRUNUX1RSSUdHRVIpIGN1c3RvbVRyaWdnZXI6IE1hdFNlbGVjdFRyaWdnZXI7XG5cbiAgX3Bvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgIH0sXG4gIF07XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0J3Mgb3ZlcmxheSBwYW5lbC5cbiAgICpcbiAgICogQXR0ZW1wdHMgdG8gY2VudGVyIHRoZSBzZWxlY3RlZCBvcHRpb24gaW4gdGhlIHBhbmVsLiBJZiB0aGUgb3B0aW9uIGlzXG4gICAqIHRvbyBoaWdoIG9yIHRvbyBsb3cgaW4gdGhlIHBhbmVsIHRvIGJlIHNjcm9sbGVkIHRvIHRoZSBjZW50ZXIsIGl0IGNsYW1wcyB0aGVcbiAgICogc2Nyb2xsIHBvc2l0aW9uIHRvIHRoZSBtaW4gb3IgbWF4IHNjcm9sbCBwb3NpdGlvbnMgcmVzcGVjdGl2ZWx5LlxuICAgKi9cbiAgX2NhbGN1bGF0ZU92ZXJsYXlTY3JvbGwoc2VsZWN0ZWRJbmRleDogbnVtYmVyLCBzY3JvbGxCdWZmZXI6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2Nyb2xsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGl0ZW1IZWlnaHQgPSB0aGlzLl9nZXRJdGVtSGVpZ2h0KCk7XG4gICAgY29uc3Qgb3B0aW9uT2Zmc2V0RnJvbVNjcm9sbFRvcCA9IGl0ZW1IZWlnaHQgKiBzZWxlY3RlZEluZGV4O1xuICAgIGNvbnN0IGhhbGZPcHRpb25IZWlnaHQgPSBpdGVtSGVpZ2h0IC8gMjtcblxuICAgIC8vIFN0YXJ0cyBhdCB0aGUgb3B0aW9uT2Zmc2V0RnJvbVNjcm9sbFRvcCwgd2hpY2ggc2Nyb2xscyB0aGUgb3B0aW9uIHRvIHRoZSB0b3Agb2YgdGhlXG4gICAgLy8gc2Nyb2xsIGNvbnRhaW5lciwgdGhlbiBzdWJ0cmFjdHMgdGhlIHNjcm9sbCBidWZmZXIgdG8gc2Nyb2xsIHRoZSBvcHRpb24gZG93biB0b1xuICAgIC8vIHRoZSBjZW50ZXIgb2YgdGhlIG92ZXJsYXkgcGFuZWwuIEhhbGYgdGhlIG9wdGlvbiBoZWlnaHQgbXVzdCBiZSByZS1hZGRlZCB0byB0aGVcbiAgICAvLyBzY3JvbGxUb3Agc28gdGhlIG9wdGlvbiBpcyBjZW50ZXJlZCBiYXNlZCBvbiBpdHMgbWlkZGxlLCBub3QgaXRzIHRvcCBlZGdlLlxuICAgIGNvbnN0IG9wdGltYWxTY3JvbGxQb3NpdGlvbiA9IG9wdGlvbk9mZnNldEZyb21TY3JvbGxUb3AgLSBzY3JvbGxCdWZmZXIgKyBoYWxmT3B0aW9uSGVpZ2h0O1xuICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCgwLCBvcHRpbWFsU2Nyb2xsUG9zaXRpb24pLCBtYXhTY3JvbGwpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLl92aWV3cG9ydFJ1bGVyLmNoYW5nZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJSZWN0ID0gdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAoc3VwZXIuX2Nhbk9wZW4oKSkge1xuICAgICAgc3VwZXIub3BlbigpO1xuICAgICAgdGhpcy5fdHJpZ2dlclJlY3QgPSB0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21wdXRlZCBmb250LXNpemUgd2lsbCBiZSBhIHN0cmluZyBwaXhlbCB2YWx1ZSAoZS5nLiBcIjE2cHhcIikuXG4gICAgICAvLyBgcGFyc2VJbnRgIGlnbm9yZXMgdGhlIHRyYWlsaW5nICdweCcgYW5kIGNvbnZlcnRzIHRoaXMgdG8gYSBudW1iZXIuXG4gICAgICB0aGlzLl90cmlnZ2VyRm9udFNpemUgPVxuICAgICAgICAgIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQpLmZvbnRTaXplIHx8ICcwJyk7XG4gICAgICB0aGlzLl9jYWxjdWxhdGVPdmVybGF5UG9zaXRpb24oKTtcblxuICAgICAgLy8gU2V0IHRoZSBmb250IHNpemUgb24gdGhlIHBhbmVsIGVsZW1lbnQgb25jZSBpdCBleGlzdHMuXG4gICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdHJpZ2dlckZvbnRTaXplICYmIHRoaXMuX292ZXJsYXlEaXIub3ZlcmxheVJlZiAmJlxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheURpci5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy5fb3ZlcmxheURpci5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LnN0eWxlLmZvbnRTaXplID0gYCR7dGhpcy5fdHJpZ2dlckZvbnRTaXplfXB4YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNjcm9sbHMgdGhlIGFjdGl2ZSBvcHRpb24gaW50byB2aWV3LiAqL1xuICBwcm90ZWN0ZWQgX3Njcm9sbE9wdGlvbkludG9WaWV3KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBsYWJlbENvdW50ID0gX2NvdW50R3JvdXBMYWJlbHNCZWZvcmVPcHRpb24oaW5kZXgsIHRoaXMub3B0aW9ucywgdGhpcy5vcHRpb25Hcm91cHMpO1xuICAgIGNvbnN0IGl0ZW1IZWlnaHQgPSB0aGlzLl9nZXRJdGVtSGVpZ2h0KCk7XG5cbiAgICBpZiAoaW5kZXggPT09IDAgJiYgbGFiZWxDb3VudCA9PT0gMSkge1xuICAgICAgLy8gSWYgd2UndmUgZ290IG9uZSBncm91cCBsYWJlbCBiZWZvcmUgdGhlIG9wdGlvbiBhbmQgd2UncmUgYXQgdGhlIHRvcCBvcHRpb24sXG4gICAgICAvLyBzY3JvbGwgdGhlIGxpc3QgdG8gdGhlIHRvcC4gVGhpcyBpcyBiZXR0ZXIgVVggdGhhbiBzY3JvbGxpbmcgdGhlIGxpc3QgdG8gdGhlXG4gICAgICAvLyB0b3Agb2YgdGhlIG9wdGlvbiwgYmVjYXVzZSBpdCBhbGxvd3MgdGhlIHVzZXIgdG8gcmVhZCB0aGUgdG9wIGdyb3VwJ3MgbGFiZWwuXG4gICAgICB0aGlzLnBhbmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYW5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IF9nZXRPcHRpb25TY3JvbGxQb3NpdGlvbihcbiAgICAgICAgKGluZGV4ICsgbGFiZWxDb3VudCkgKiBpdGVtSGVpZ2h0LFxuICAgICAgICBpdGVtSGVpZ2h0LFxuICAgICAgICB0aGlzLnBhbmVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wLFxuICAgICAgICBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3Bvc2l0aW9uaW5nU2V0dGxlZCgpIHtcbiAgICB0aGlzLl9jYWxjdWxhdGVPdmVybGF5T2Zmc2V0WCgpO1xuICAgIHRoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLl9zY3JvbGxUb3A7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX3BhbmVsRG9uZUFuaW1hdGluZyhpc09wZW46IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuX3Njcm9sbFRvcCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX292ZXJsYXlEaXIub2Zmc2V0WCA9IDA7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBzdXBlci5fcGFuZWxEb25lQW5pbWF0aW5nKGlzT3Blbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2dldENoYW5nZUV2ZW50KHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IE1hdFNlbGVjdENoYW5nZSh0aGlzLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgeC1vZmZzZXQgb2YgdGhlIG92ZXJsYXkgcGFuZWwgaW4gcmVsYXRpb24gdG8gdGhlIHRyaWdnZXIncyB0b3Agc3RhcnQgY29ybmVyLlxuICAgKiBUaGlzIG11c3QgYmUgYWRqdXN0ZWQgdG8gYWxpZ24gdGhlIHNlbGVjdGVkIG9wdGlvbiB0ZXh0IG92ZXIgdGhlIHRyaWdnZXIgdGV4dCB3aGVuXG4gICAqIHRoZSBwYW5lbCBvcGVucy4gV2lsbCBjaGFuZ2UgYmFzZWQgb24gTFRSIG9yIFJUTCB0ZXh0IGRpcmVjdGlvbi4gTm90ZSB0aGF0IHRoZSBvZmZzZXRcbiAgICogY2FuJ3QgYmUgY2FsY3VsYXRlZCB1bnRpbCB0aGUgcGFuZWwgaGFzIGJlZW4gYXR0YWNoZWQsIGJlY2F1c2Ugd2UgbmVlZCB0byBrbm93IHRoZVxuICAgKiBjb250ZW50IHdpZHRoIGluIG9yZGVyIHRvIGNvbnN0cmFpbiB0aGUgcGFuZWwgd2l0aGluIHRoZSB2aWV3cG9ydC5cbiAgICovXG4gIHByaXZhdGUgX2NhbGN1bGF0ZU92ZXJsYXlPZmZzZXRYKCk6IHZvaWQge1xuICAgIGNvbnN0IG92ZXJsYXlSZWN0ID0gdGhpcy5fb3ZlcmxheURpci5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTaXplKCk7XG4gICAgY29uc3QgaXNSdGwgPSB0aGlzLl9pc1J0bCgpO1xuICAgIGNvbnN0IHBhZGRpbmdXaWR0aCA9IHRoaXMubXVsdGlwbGUgPyBTRUxFQ1RfTVVMVElQTEVfUEFORUxfUEFERElOR19YICsgU0VMRUNUX1BBTkVMX1BBRERJTkdfWCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVF9QQU5FTF9QQURESU5HX1ggKiAyO1xuICAgIGxldCBvZmZzZXRYOiBudW1iZXI7XG5cbiAgICAvLyBBZGp1c3QgdGhlIG9mZnNldCwgZGVwZW5kaW5nIG9uIHRoZSBvcHRpb24gcGFkZGluZy5cbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgb2Zmc2V0WCA9IFNFTEVDVF9NVUxUSVBMRV9QQU5FTF9QQURESU5HX1g7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRpc2FibGVPcHRpb25DZW50ZXJpbmcpIHtcbiAgICAgIG9mZnNldFggPSBTRUxFQ1RfUEFORUxfUEFERElOR19YO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSB8fCB0aGlzLm9wdGlvbnMuZmlyc3Q7XG4gICAgICBvZmZzZXRYID0gc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ3JvdXAgPyBTRUxFQ1RfUEFORUxfSU5ERU5UX1BBRERJTkdfWCA6IFNFTEVDVF9QQU5FTF9QQURESU5HX1g7XG4gICAgfVxuXG4gICAgLy8gSW52ZXJ0IHRoZSBvZmZzZXQgaW4gTFRSLlxuICAgIGlmICghaXNSdGwpIHtcbiAgICAgIG9mZnNldFggKj0gLTE7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGhvdyBtdWNoIHRoZSBzZWxlY3Qgb3ZlcmZsb3dzIG9uIGVhY2ggc2lkZS5cbiAgICBjb25zdCBsZWZ0T3ZlcmZsb3cgPSAwIC0gKG92ZXJsYXlSZWN0LmxlZnQgKyBvZmZzZXRYIC0gKGlzUnRsID8gcGFkZGluZ1dpZHRoIDogMCkpO1xuICAgIGNvbnN0IHJpZ2h0T3ZlcmZsb3cgPSBvdmVybGF5UmVjdC5yaWdodCArIG9mZnNldFggLSB2aWV3cG9ydFNpemUud2lkdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoaXNSdGwgPyAwIDogcGFkZGluZ1dpZHRoKTtcblxuICAgIC8vIElmIHRoZSBlbGVtZW50IG92ZXJmbG93cyBvbiBlaXRoZXIgc2lkZSwgcmVkdWNlIHRoZSBvZmZzZXQgdG8gYWxsb3cgaXQgdG8gZml0LlxuICAgIGlmIChsZWZ0T3ZlcmZsb3cgPiAwKSB7XG4gICAgICBvZmZzZXRYICs9IGxlZnRPdmVyZmxvdyArIFNFTEVDVF9QQU5FTF9WSUVXUE9SVF9QQURESU5HO1xuICAgIH0gZWxzZSBpZiAocmlnaHRPdmVyZmxvdyA+IDApIHtcbiAgICAgIG9mZnNldFggLT0gcmlnaHRPdmVyZmxvdyArIFNFTEVDVF9QQU5FTF9WSUVXUE9SVF9QQURESU5HO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgb2Zmc2V0IGRpcmVjdGx5IGluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0byBnbyB0aHJvdWdoIGNoYW5nZSBkZXRlY3Rpb24gYW5kXG4gICAgLy8gcG90ZW50aWFsbHkgdHJpZ2dlcmluZyBcImNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWRcIiBlcnJvcnMuIFJvdW5kIHRoZSB2YWx1ZSB0byBhdm9pZFxuICAgIC8vIGJsdXJyeSBjb250ZW50IGluIHNvbWUgYnJvd3NlcnMuXG4gICAgdGhpcy5fb3ZlcmxheURpci5vZmZzZXRYID0gTWF0aC5yb3VuZChvZmZzZXRYKTtcbiAgICB0aGlzLl9vdmVybGF5RGlyLm92ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB5LW9mZnNldCBvZiB0aGUgc2VsZWN0J3Mgb3ZlcmxheSBwYW5lbCBpbiByZWxhdGlvbiB0byB0aGVcbiAgICogdG9wIHN0YXJ0IGNvcm5lciBvZiB0aGUgdHJpZ2dlci4gSXQgaGFzIHRvIGJlIGFkanVzdGVkIGluIG9yZGVyIGZvciB0aGVcbiAgICogc2VsZWN0ZWQgb3B0aW9uIHRvIGJlIGFsaWduZWQgb3ZlciB0aGUgdHJpZ2dlciB3aGVuIHRoZSBwYW5lbCBvcGVucy5cbiAgICovXG4gIHByaXZhdGUgX2NhbGN1bGF0ZU92ZXJsYXlPZmZzZXRZKHNlbGVjdGVkSW5kZXg6IG51bWJlciwgc2Nyb2xsQnVmZmVyOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2Nyb2xsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGl0ZW1IZWlnaHQgPSB0aGlzLl9nZXRJdGVtSGVpZ2h0KCk7XG4gICAgY29uc3Qgb3B0aW9uSGVpZ2h0QWRqdXN0bWVudCA9IChpdGVtSGVpZ2h0IC0gdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0KSAvIDI7XG4gICAgY29uc3QgbWF4T3B0aW9uc0Rpc3BsYXllZCA9IE1hdGguZmxvb3IoU0VMRUNUX1BBTkVMX01BWF9IRUlHSFQgLyBpdGVtSGVpZ2h0KTtcbiAgICBsZXQgb3B0aW9uT2Zmc2V0RnJvbVBhbmVsVG9wOiBudW1iZXI7XG5cbiAgICAvLyBEaXNhYmxlIG9mZnNldCBpZiByZXF1ZXN0ZWQgYnkgdXNlciBieSByZXR1cm5pbmcgMCBhcyB2YWx1ZSB0byBvZmZzZXRcbiAgICBpZiAodGhpcy5kaXNhYmxlT3B0aW9uQ2VudGVyaW5nKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Nyb2xsVG9wID09PSAwKSB7XG4gICAgICBvcHRpb25PZmZzZXRGcm9tUGFuZWxUb3AgPSBzZWxlY3RlZEluZGV4ICogaXRlbUhlaWdodDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3Njcm9sbFRvcCA9PT0gbWF4U2Nyb2xsKSB7XG4gICAgICBjb25zdCBmaXJzdERpc3BsYXllZEluZGV4ID0gdGhpcy5fZ2V0SXRlbUNvdW50KCkgLSBtYXhPcHRpb25zRGlzcGxheWVkO1xuICAgICAgY29uc3Qgc2VsZWN0ZWREaXNwbGF5SW5kZXggPSBzZWxlY3RlZEluZGV4IC0gZmlyc3REaXNwbGF5ZWRJbmRleDtcblxuICAgICAgLy8gVGhlIGZpcnN0IGl0ZW0gaXMgcGFydGlhbGx5IG91dCBvZiB0aGUgdmlld3BvcnQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB3aGF0XG4gICAgICAvLyBwb3J0aW9uIG9mIGl0IGlzIHNob3duIGluIHRoZSB2aWV3cG9ydCBhbmQgYWNjb3VudCBmb3IgaXQgaW4gb3VyIG9mZnNldC5cbiAgICAgIGxldCBwYXJ0aWFsSXRlbUhlaWdodCA9XG4gICAgICAgICAgaXRlbUhlaWdodCAtICh0aGlzLl9nZXRJdGVtQ291bnQoKSAqIGl0ZW1IZWlnaHQgLSBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVCkgJSBpdGVtSGVpZ2h0O1xuXG4gICAgICAvLyBCZWNhdXNlIHRoZSBwYW5lbCBoZWlnaHQgaXMgbG9uZ2VyIHRoYW4gdGhlIGhlaWdodCBvZiB0aGUgb3B0aW9ucyBhbG9uZSxcbiAgICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBleHRyYSBwYWRkaW5nIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBwYW5lbC4gV2hlblxuICAgICAgLy8gc2Nyb2xsZWQgdG8gdGhlIHZlcnkgYm90dG9tLCB0aGlzIHBhZGRpbmcgaXMgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZWwgYW5kXG4gICAgICAvLyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBvZmZzZXQuXG4gICAgICBvcHRpb25PZmZzZXRGcm9tUGFuZWxUb3AgPSBzZWxlY3RlZERpc3BsYXlJbmRleCAqIGl0ZW1IZWlnaHQgKyBwYXJ0aWFsSXRlbUhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIG9wdGlvbiB3YXMgc2Nyb2xsZWQgdG8gdGhlIG1pZGRsZSBvZiB0aGUgcGFuZWwgdXNpbmcgYSBzY3JvbGwgYnVmZmVyLFxuICAgICAgLy8gaXRzIG9mZnNldCB3aWxsIGJlIHRoZSBzY3JvbGwgYnVmZmVyIG1pbnVzIHRoZSBoYWxmIGhlaWdodCB0aGF0IHdhcyBhZGRlZCB0b1xuICAgICAgLy8gY2VudGVyIGl0LlxuICAgICAgb3B0aW9uT2Zmc2V0RnJvbVBhbmVsVG9wID0gc2Nyb2xsQnVmZmVyIC0gaXRlbUhlaWdodCAvIDI7XG4gICAgfVxuXG4gICAgLy8gVGhlIGZpbmFsIG9mZnNldCBpcyB0aGUgb3B0aW9uJ3Mgb2Zmc2V0IGZyb20gdGhlIHRvcCwgYWRqdXN0ZWQgZm9yIHRoZSBoZWlnaHQgZGlmZmVyZW5jZSxcbiAgICAvLyBtdWx0aXBsaWVkIGJ5IC0xIHRvIGVuc3VyZSB0aGF0IHRoZSBvdmVybGF5IG1vdmVzIGluIHRoZSBjb3JyZWN0IGRpcmVjdGlvbiB1cCB0aGUgcGFnZS5cbiAgICAvLyBUaGUgdmFsdWUgaXMgcm91bmRlZCB0byBwcmV2ZW50IHNvbWUgYnJvd3NlcnMgZnJvbSBibHVycmluZyB0aGUgY29udGVudC5cbiAgICByZXR1cm4gTWF0aC5yb3VuZChvcHRpb25PZmZzZXRGcm9tUGFuZWxUb3AgKiAtMSAtIG9wdGlvbkhlaWdodEFkanVzdG1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGF0IHRoZSBhdHRlbXB0ZWQgb3ZlcmxheSBwb3NpdGlvbiB3aWxsIGZpdCB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuICAgKiBJZiBpdCB3aWxsIG5vdCBmaXQsIHRyaWVzIHRvIGFkanVzdCB0aGUgc2Nyb2xsIHBvc2l0aW9uIGFuZCB0aGUgYXNzb2NpYXRlZFxuICAgKiB5LW9mZnNldCBzbyB0aGUgcGFuZWwgY2FuIG9wZW4gZnVsbHkgb24tc2NyZWVuLiBJZiBpdCBzdGlsbCB3b24ndCBmaXQsXG4gICAqIHNldHMgdGhlIG9mZnNldCBiYWNrIHRvIDAgdG8gYWxsb3cgdGhlIGZhbGxiYWNrIHBvc2l0aW9uIHRvIHRha2Ugb3Zlci5cbiAgICovXG4gIHByaXZhdGUgX2NoZWNrT3ZlcmxheVdpdGhpblZpZXdwb3J0KG1heFNjcm9sbDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbUhlaWdodCA9IHRoaXMuX2dldEl0ZW1IZWlnaHQoKTtcbiAgICBjb25zdCB2aWV3cG9ydFNpemUgPSB0aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2l6ZSgpO1xuXG4gICAgY29uc3QgdG9wU3BhY2VBdmFpbGFibGUgPSB0aGlzLl90cmlnZ2VyUmVjdC50b3AgLSBTRUxFQ1RfUEFORUxfVklFV1BPUlRfUEFERElORztcbiAgICBjb25zdCBib3R0b21TcGFjZUF2YWlsYWJsZSA9XG4gICAgICAgIHZpZXdwb3J0U2l6ZS5oZWlnaHQgLSB0aGlzLl90cmlnZ2VyUmVjdC5ib3R0b20gLSBTRUxFQ1RfUEFORUxfVklFV1BPUlRfUEFERElORztcblxuICAgIGNvbnN0IHBhbmVsSGVpZ2h0VG9wID0gTWF0aC5hYnModGhpcy5fb2Zmc2V0WSk7XG4gICAgY29uc3QgdG90YWxQYW5lbEhlaWdodCA9XG4gICAgICAgIE1hdGgubWluKHRoaXMuX2dldEl0ZW1Db3VudCgpICogaXRlbUhlaWdodCwgU0VMRUNUX1BBTkVMX01BWF9IRUlHSFQpO1xuICAgIGNvbnN0IHBhbmVsSGVpZ2h0Qm90dG9tID0gdG90YWxQYW5lbEhlaWdodCAtIHBhbmVsSGVpZ2h0VG9wIC0gdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0O1xuXG4gICAgaWYgKHBhbmVsSGVpZ2h0Qm90dG9tID4gYm90dG9tU3BhY2VBdmFpbGFibGUpIHtcbiAgICAgIHRoaXMuX2FkanVzdFBhbmVsVXAocGFuZWxIZWlnaHRCb3R0b20sIGJvdHRvbVNwYWNlQXZhaWxhYmxlKTtcbiAgICB9IGVsc2UgaWYgKHBhbmVsSGVpZ2h0VG9wID4gdG9wU3BhY2VBdmFpbGFibGUpIHtcbiAgICAgdGhpcy5fYWRqdXN0UGFuZWxEb3duKHBhbmVsSGVpZ2h0VG9wLCB0b3BTcGFjZUF2YWlsYWJsZSwgbWF4U2Nyb2xsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtT3JpZ2luID0gdGhpcy5fZ2V0T3JpZ2luQmFzZWRPbk9wdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBZGp1c3RzIHRoZSBvdmVybGF5IHBhbmVsIHVwIHRvIGZpdCBpbiB0aGUgdmlld3BvcnQuICovXG4gIHByaXZhdGUgX2FkanVzdFBhbmVsVXAocGFuZWxIZWlnaHRCb3R0b206IG51bWJlciwgYm90dG9tU3BhY2VBdmFpbGFibGU6IG51bWJlcikge1xuICAgIC8vIEJyb3dzZXJzIGlnbm9yZSBmcmFjdGlvbmFsIHNjcm9sbCBvZmZzZXRzLCBzbyB3ZSBuZWVkIHRvIHJvdW5kLlxuICAgIGNvbnN0IGRpc3RhbmNlQmVsb3dWaWV3cG9ydCA9IE1hdGgucm91bmQocGFuZWxIZWlnaHRCb3R0b20gLSBib3R0b21TcGFjZUF2YWlsYWJsZSk7XG5cbiAgICAvLyBTY3JvbGxzIHRoZSBwYW5lbCB1cCBieSB0aGUgZGlzdGFuY2UgaXQgd2FzIGV4dGVuZGluZyBwYXN0IHRoZSBib3VuZGFyeSwgdGhlblxuICAgIC8vIGFkanVzdHMgdGhlIG9mZnNldCBieSB0aGF0IGFtb3VudCB0byBtb3ZlIHRoZSBwYW5lbCB1cCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICB0aGlzLl9zY3JvbGxUb3AgLT0gZGlzdGFuY2VCZWxvd1ZpZXdwb3J0O1xuICAgIHRoaXMuX29mZnNldFkgLT0gZGlzdGFuY2VCZWxvd1ZpZXdwb3J0O1xuICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9IHRoaXMuX2dldE9yaWdpbkJhc2VkT25PcHRpb24oKTtcblxuICAgIC8vIElmIHRoZSBwYW5lbCBpcyBzY3JvbGxlZCB0byB0aGUgdmVyeSB0b3AsIGl0IHdvbid0IGJlIGFibGUgdG8gZml0IHRoZSBwYW5lbFxuICAgIC8vIGJ5IHNjcm9sbGluZywgc28gc2V0IHRoZSBvZmZzZXQgdG8gMCB0byBhbGxvdyB0aGUgZmFsbGJhY2sgcG9zaXRpb24gdG8gdGFrZVxuICAgIC8vIGVmZmVjdC5cbiAgICBpZiAodGhpcy5fc2Nyb2xsVG9wIDw9IDApIHtcbiAgICAgIHRoaXMuX3Njcm9sbFRvcCA9IDA7XG4gICAgICB0aGlzLl9vZmZzZXRZID0gMDtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9IGA1MCUgYm90dG9tIDBweGA7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFkanVzdHMgdGhlIG92ZXJsYXkgcGFuZWwgZG93biB0byBmaXQgaW4gdGhlIHZpZXdwb3J0LiAqL1xuICBwcml2YXRlIF9hZGp1c3RQYW5lbERvd24ocGFuZWxIZWlnaHRUb3A6IG51bWJlciwgdG9wU3BhY2VBdmFpbGFibGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNjcm9sbDogbnVtYmVyKSB7XG4gICAgLy8gQnJvd3NlcnMgaWdub3JlIGZyYWN0aW9uYWwgc2Nyb2xsIG9mZnNldHMsIHNvIHdlIG5lZWQgdG8gcm91bmQuXG4gICAgY29uc3QgZGlzdGFuY2VBYm92ZVZpZXdwb3J0ID0gTWF0aC5yb3VuZChwYW5lbEhlaWdodFRvcCAtIHRvcFNwYWNlQXZhaWxhYmxlKTtcblxuICAgIC8vIFNjcm9sbHMgdGhlIHBhbmVsIGRvd24gYnkgdGhlIGRpc3RhbmNlIGl0IHdhcyBleHRlbmRpbmcgcGFzdCB0aGUgYm91bmRhcnksIHRoZW5cbiAgICAvLyBhZGp1c3RzIHRoZSBvZmZzZXQgYnkgdGhhdCBhbW91bnQgdG8gbW92ZSB0aGUgcGFuZWwgZG93biBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICB0aGlzLl9zY3JvbGxUb3AgKz0gZGlzdGFuY2VBYm92ZVZpZXdwb3J0O1xuICAgIHRoaXMuX29mZnNldFkgKz0gZGlzdGFuY2VBYm92ZVZpZXdwb3J0O1xuICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9IHRoaXMuX2dldE9yaWdpbkJhc2VkT25PcHRpb24oKTtcblxuICAgIC8vIElmIHRoZSBwYW5lbCBpcyBzY3JvbGxlZCB0byB0aGUgdmVyeSBib3R0b20sIGl0IHdvbid0IGJlIGFibGUgdG8gZml0IHRoZVxuICAgIC8vIHBhbmVsIGJ5IHNjcm9sbGluZywgc28gc2V0IHRoZSBvZmZzZXQgdG8gMCB0byBhbGxvdyB0aGUgZmFsbGJhY2sgcG9zaXRpb25cbiAgICAvLyB0byB0YWtlIGVmZmVjdC5cbiAgICBpZiAodGhpcy5fc2Nyb2xsVG9wID49IG1heFNjcm9sbCkge1xuICAgICAgdGhpcy5fc2Nyb2xsVG9wID0gbWF4U2Nyb2xsO1xuICAgICAgdGhpcy5fb2Zmc2V0WSA9IDA7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1PcmlnaW4gPSBgNTAlIHRvcCAwcHhgO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxjdWxhdGVzIHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIHgtIGFuZCB5LW9mZnNldHMgb2YgdGhlIG92ZXJsYXkgcGFuZWwuICovXG4gIHByaXZhdGUgX2NhbGN1bGF0ZU92ZXJsYXlQb3NpdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtSGVpZ2h0ID0gdGhpcy5fZ2V0SXRlbUhlaWdodCgpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ2V0SXRlbUNvdW50KCk7XG4gICAgY29uc3QgcGFuZWxIZWlnaHQgPSBNYXRoLm1pbihpdGVtcyAqIGl0ZW1IZWlnaHQsIFNFTEVDVF9QQU5FTF9NQVhfSEVJR0hUKTtcbiAgICBjb25zdCBzY3JvbGxDb250YWluZXJIZWlnaHQgPSBpdGVtcyAqIGl0ZW1IZWlnaHQ7XG5cbiAgICAvLyBUaGUgZmFydGhlc3QgdGhlIHBhbmVsIGNhbiBiZSBzY3JvbGxlZCBiZWZvcmUgaXQgaGl0cyB0aGUgYm90dG9tXG4gICAgY29uc3QgbWF4U2Nyb2xsID0gc2Nyb2xsQ29udGFpbmVySGVpZ2h0IC0gcGFuZWxIZWlnaHQ7XG5cbiAgICAvLyBJZiBubyB2YWx1ZSBpcyBzZWxlY3RlZCB3ZSBvcGVuIHRoZSBwb3B1cCB0byB0aGUgZmlyc3QgaXRlbS5cbiAgICBsZXQgc2VsZWN0ZWRPcHRpb25PZmZzZXQ6IG51bWJlcjtcblxuICAgIGlmICh0aGlzLmVtcHR5KSB7XG4gICAgICBzZWxlY3RlZE9wdGlvbk9mZnNldCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkT3B0aW9uT2Zmc2V0ID1cbiAgICAgICAgICBNYXRoLm1heCh0aGlzLm9wdGlvbnMudG9BcnJheSgpLmluZGV4T2YodGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRbMF0pLCAwKTtcbiAgICB9XG5cbiAgICBzZWxlY3RlZE9wdGlvbk9mZnNldCArPSBfY291bnRHcm91cExhYmVsc0JlZm9yZU9wdGlvbihzZWxlY3RlZE9wdGlvbk9mZnNldCwgdGhpcy5vcHRpb25zLFxuICAgICAgICB0aGlzLm9wdGlvbkdyb3Vwcyk7XG5cbiAgICAvLyBXZSBtdXN0IG1haW50YWluIGEgc2Nyb2xsIGJ1ZmZlciBzbyB0aGUgc2VsZWN0ZWQgb3B0aW9uIHdpbGwgYmUgc2Nyb2xsZWQgdG8gdGhlXG4gICAgLy8gY2VudGVyIG9mIHRoZSBvdmVybGF5IHBhbmVsIHJhdGhlciB0aGFuIHRoZSB0b3AuXG4gICAgY29uc3Qgc2Nyb2xsQnVmZmVyID0gcGFuZWxIZWlnaHQgLyAyO1xuICAgIHRoaXMuX3Njcm9sbFRvcCA9IHRoaXMuX2NhbGN1bGF0ZU92ZXJsYXlTY3JvbGwoc2VsZWN0ZWRPcHRpb25PZmZzZXQsIHNjcm9sbEJ1ZmZlciwgbWF4U2Nyb2xsKTtcbiAgICB0aGlzLl9vZmZzZXRZID0gdGhpcy5fY2FsY3VsYXRlT3ZlcmxheU9mZnNldFkoc2VsZWN0ZWRPcHRpb25PZmZzZXQsIHNjcm9sbEJ1ZmZlciwgbWF4U2Nyb2xsKTtcblxuICAgIHRoaXMuX2NoZWNrT3ZlcmxheVdpdGhpblZpZXdwb3J0KG1heFNjcm9sbCk7XG4gIH1cblxuICAvKiogU2V0cyB0aGUgdHJhbnNmb3JtIG9yaWdpbiBwb2ludCBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgb3B0aW9uLiAqL1xuICBwcml2YXRlIF9nZXRPcmlnaW5CYXNlZE9uT3B0aW9uKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaXRlbUhlaWdodCA9IHRoaXMuX2dldEl0ZW1IZWlnaHQoKTtcbiAgICBjb25zdCBvcHRpb25IZWlnaHRBZGp1c3RtZW50ID0gKGl0ZW1IZWlnaHQgLSB0aGlzLl90cmlnZ2VyUmVjdC5oZWlnaHQpIC8gMjtcbiAgICBjb25zdCBvcmlnaW5ZID0gTWF0aC5hYnModGhpcy5fb2Zmc2V0WSkgLSBvcHRpb25IZWlnaHRBZGp1c3RtZW50ICsgaXRlbUhlaWdodCAvIDI7XG4gICAgcmV0dXJuIGA1MCUgJHtvcmlnaW5ZfXB4IDBweGA7XG4gIH1cblxuICAvKiogQ2FsY3VsYXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSBzZWxlY3QncyBvcHRpb25zLiAqL1xuICBwcml2YXRlIF9nZXRJdGVtSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJGb250U2l6ZSAqIFNFTEVDVF9JVEVNX0hFSUdIVF9FTTtcbiAgfVxuXG4gIC8qKiBDYWxjdWxhdGVzIHRoZSBhbW91bnQgb2YgaXRlbXMgaW4gdGhlIHNlbGVjdC4gVGhpcyBpbmNsdWRlcyBvcHRpb25zIGFuZCBncm91cCBsYWJlbHMuICovXG4gIHByaXZhdGUgX2dldEl0ZW1Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubGVuZ3RoICsgdGhpcy5vcHRpb25Hcm91cHMubGVuZ3RoO1xuICB9XG5cbn1cbiJdfQ==