@ptsecurity/mosaic 13.6.0 → 13.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (906) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +6 -6
  3. package/_theming.scss +7238 -7128
  4. package/_visual.scss +2724 -2694
  5. package/autocomplete/autocomplete-origin.directive.d.ts +12 -12
  6. package/autocomplete/autocomplete-trigger.directive.d.ts +167 -167
  7. package/autocomplete/autocomplete.component.d.ts +73 -73
  8. package/autocomplete/autocomplete.module.d.ts +12 -12
  9. package/autocomplete/index.d.ts +1 -1
  10. package/autocomplete/ptsecurity-mosaic-autocomplete.d.ts +5 -5
  11. package/autocomplete/public-api.d.ts +4 -4
  12. package/button/button.component.d.ts +40 -40
  13. package/button/button.module.d.ts +10 -10
  14. package/button/index.d.ts +1 -1
  15. package/button/ptsecurity-mosaic-button.d.ts +5 -5
  16. package/button/public-api.d.ts +2 -2
  17. package/button-toggle/button-toggle.component.d.ts +141 -141
  18. package/button-toggle/button-toggle.module.d.ts +9 -9
  19. package/button-toggle/index.d.ts +1 -1
  20. package/button-toggle/ptsecurity-mosaic-button-toggle.d.ts +5 -5
  21. package/button-toggle/public-api.d.ts +2 -2
  22. package/card/card.component.d.ts +26 -26
  23. package/card/card.module.d.ts +10 -10
  24. package/card/index.d.ts +1 -1
  25. package/card/ptsecurity-mosaic-card.d.ts +5 -5
  26. package/card/public-api.d.ts +2 -2
  27. package/checkbox/README.md +1 -1
  28. package/checkbox/checkbox-config.d.ts +13 -13
  29. package/checkbox/checkbox-module.d.ts +9 -9
  30. package/checkbox/checkbox-required-validator.d.ts +13 -13
  31. package/checkbox/checkbox.d.ts +140 -140
  32. package/checkbox/index.d.ts +1 -1
  33. package/checkbox/ptsecurity-mosaic-checkbox.d.ts +5 -5
  34. package/checkbox/public-api.d.ts +4 -4
  35. package/core/animation/animation.d.ts +6 -6
  36. package/core/animation/fade-animations.d.ts +2 -2
  37. package/core/animation/index.d.ts +3 -3
  38. package/core/animation/select-animations.d.ts +12 -12
  39. package/core/common-behaviors/color.d.ts +19 -19
  40. package/core/common-behaviors/common-module.d.ts +25 -25
  41. package/core/common-behaviors/constructor.d.ts +9 -9
  42. package/core/common-behaviors/disabled.d.ts +8 -8
  43. package/core/common-behaviors/error-state.d.ts +25 -25
  44. package/core/common-behaviors/index.d.ts +5 -5
  45. package/core/common-behaviors/tabindex.d.ts +8 -8
  46. package/core/error/error-options.d.ts +14 -14
  47. package/core/formatters/date/formatter.d.ts +203 -203
  48. package/core/formatters/date/templates/en-US.d.ts +74 -74
  49. package/core/formatters/date/templates/ru-RU.d.ts +74 -74
  50. package/core/formatters/index.d.ts +9 -9
  51. package/core/formatters/number/formatter.d.ts +27 -27
  52. package/core/forms/forms-module.d.ts +7 -7
  53. package/core/forms/forms.directive.d.ts +22 -22
  54. package/core/forms/index.d.ts +2 -2
  55. package/core/highlight/highlight.pipe.d.ts +7 -7
  56. package/core/highlight/index.d.ts +9 -9
  57. package/core/index.d.ts +1 -1
  58. package/core/label/label-options.d.ts +13 -13
  59. package/core/line/line.d.ts +28 -28
  60. package/core/option/action.d.ts +42 -42
  61. package/core/option/index.d.ts +4 -4
  62. package/core/option/optgroup.d.ts +16 -16
  63. package/core/option/option-module.d.ts +11 -11
  64. package/core/option/option.d.ts +115 -115
  65. package/core/overlay/overlay-position-map.d.ts +34 -34
  66. package/core/pop-up/constants.d.ts +29 -29
  67. package/core/pop-up/index.d.ts +3 -3
  68. package/core/pop-up/pop-up-trigger.d.ts +70 -70
  69. package/core/pop-up/pop-up.d.ts +36 -36
  70. package/core/ptsecurity-mosaic-core.d.ts +5 -5
  71. package/core/public-api.d.ts +17 -17
  72. package/core/select/constants.d.ts +23 -23
  73. package/core/select/errors.d.ts +19 -19
  74. package/core/select/events.d.ts +1 -1
  75. package/core/select/index.d.ts +3 -3
  76. package/core/selection/constants.d.ts +4 -4
  77. package/core/selection/index.d.ts +3 -3
  78. package/core/selection/pseudo-checkbox/pseudo-checkbox.d.ts +30 -30
  79. package/core/selection/pseudo-checkbox/pseudo-checkbox.module.d.ts +8 -8
  80. package/core/services/measure-scrollbar.service.d.ts +11 -11
  81. package/core/utils/index.d.ts +1 -1
  82. package/core/utils/public-api.d.ts +1 -1
  83. package/core/utils/utils.d.ts +2 -2
  84. package/core/validation/index.d.ts +1 -1
  85. package/core/validation/validation.d.ts +18 -18
  86. package/core/version.d.ts +2 -2
  87. package/datepicker/calendar-body.component.d.ts +63 -63
  88. package/datepicker/calendar.component.d.ts +151 -151
  89. package/datepicker/datepicker-animations.d.ts +9 -9
  90. package/datepicker/datepicker-errors.d.ts +2 -2
  91. package/datepicker/datepicker-input.directive.d.ts +178 -178
  92. package/datepicker/datepicker-intl.d.ts +32 -32
  93. package/datepicker/datepicker-module.d.ts +20 -20
  94. package/datepicker/datepicker-toggle.component.d.ts +35 -35
  95. package/datepicker/datepicker.component.d.ts +158 -158
  96. package/datepicker/index.d.ts +1 -1
  97. package/datepicker/month-view.component.d.ts +93 -93
  98. package/datepicker/multi-year-view.component.d.ts +72 -72
  99. package/datepicker/ptsecurity-mosaic-datepicker.d.ts +5 -5
  100. package/datepicker/public-api.d.ts +11 -11
  101. package/datepicker/year-view.component.d.ts +90 -90
  102. package/design-tokens/index.d.ts +1 -1
  103. package/design-tokens/legacy-2017/tokens/components/alert.json5 +83 -83
  104. package/design-tokens/legacy-2017/tokens/components/autocomplete.json5 +11 -11
  105. package/design-tokens/legacy-2017/tokens/components/badge.json5 +174 -174
  106. package/design-tokens/legacy-2017/tokens/components/button-toggle.json5 +10 -10
  107. package/design-tokens/legacy-2017/tokens/components/button.json5 +142 -142
  108. package/design-tokens/legacy-2017/tokens/components/card.json5 +51 -51
  109. package/design-tokens/legacy-2017/tokens/components/checkbox.json5 +97 -97
  110. package/design-tokens/legacy-2017/tokens/components/datepicker.json5 +64 -64
  111. package/design-tokens/legacy-2017/tokens/components/divider.json5 +14 -14
  112. package/design-tokens/legacy-2017/tokens/components/dl.json5 +38 -38
  113. package/design-tokens/legacy-2017/tokens/components/dropdown.json5 +48 -48
  114. package/design-tokens/legacy-2017/tokens/components/form-field.json5 +92 -92
  115. package/design-tokens/legacy-2017/tokens/components/forms.json5 +52 -52
  116. package/design-tokens/legacy-2017/tokens/components/icon.json5 +104 -104
  117. package/design-tokens/legacy-2017/tokens/components/input.json5 +12 -12
  118. package/design-tokens/legacy-2017/tokens/components/link.json5 +50 -50
  119. package/design-tokens/legacy-2017/tokens/components/list.json5 +13 -13
  120. package/design-tokens/legacy-2017/tokens/components/loader-overlay.json5 +23 -0
  121. package/design-tokens/legacy-2017/tokens/components/modal.json5 +81 -81
  122. package/design-tokens/legacy-2017/tokens/components/navbar.json5 +70 -70
  123. package/design-tokens/legacy-2017/tokens/components/optgroup.json5 +10 -10
  124. package/design-tokens/legacy-2017/tokens/components/option.json5 +12 -12
  125. package/design-tokens/legacy-2017/tokens/components/popover.json5 +68 -68
  126. package/design-tokens/legacy-2017/tokens/components/popup.json5 +16 -16
  127. package/design-tokens/legacy-2017/tokens/components/progress-bar.json5 +13 -13
  128. package/design-tokens/legacy-2017/tokens/components/progress-spinner.json5 +7 -7
  129. package/design-tokens/legacy-2017/tokens/components/radio.json5 +45 -44
  130. package/design-tokens/legacy-2017/tokens/components/select.json5 +24 -24
  131. package/design-tokens/legacy-2017/tokens/components/sidepanel.json5 +44 -44
  132. package/design-tokens/legacy-2017/tokens/components/table.json5 +15 -15
  133. package/design-tokens/legacy-2017/tokens/components/tabs.json5 +101 -101
  134. package/design-tokens/legacy-2017/tokens/components/tags.json5 +134 -134
  135. package/design-tokens/legacy-2017/tokens/components/textarea.json5 +12 -12
  136. package/design-tokens/legacy-2017/tokens/components/timepicker.json5 +7 -7
  137. package/design-tokens/legacy-2017/tokens/components/toggle.json5 +79 -79
  138. package/design-tokens/legacy-2017/tokens/components/tooltip.json5 +83 -83
  139. package/design-tokens/legacy-2017/tokens/components/tree.json5 +15 -15
  140. package/design-tokens/legacy-2017/tokens/properties/aliases.json5 +3 -3
  141. package/design-tokens/legacy-2017/tokens/properties/colors.json5 +119 -118
  142. package/design-tokens/legacy-2017/tokens/properties/font.json5 +12 -12
  143. package/design-tokens/legacy-2017/tokens/properties/globals.json5 +49 -49
  144. package/design-tokens/legacy-2017/tokens/properties/padding.json5 +3 -3
  145. package/design-tokens/legacy-2017/tokens/properties/palette.json5 +163 -163
  146. package/design-tokens/legacy-2017/tokens/properties/typography.json5 +175 -175
  147. package/design-tokens/legacy-2017/tokens.d.ts +7873 -7843
  148. package/design-tokens/pt-2022/tokens/components/alert.json5 +83 -83
  149. package/design-tokens/pt-2022/tokens/components/autocomplete.json5 +11 -11
  150. package/design-tokens/pt-2022/tokens/components/badge.json5 +174 -174
  151. package/design-tokens/pt-2022/tokens/components/button-toggle.json5 +10 -10
  152. package/design-tokens/pt-2022/tokens/components/button.json5 +142 -142
  153. package/design-tokens/pt-2022/tokens/components/card.json5 +51 -51
  154. package/design-tokens/pt-2022/tokens/components/checkbox.json5 +97 -97
  155. package/design-tokens/pt-2022/tokens/components/datepicker.json5 +64 -64
  156. package/design-tokens/pt-2022/tokens/components/divider.json5 +14 -14
  157. package/design-tokens/pt-2022/tokens/components/dl.json5 +38 -38
  158. package/design-tokens/pt-2022/tokens/components/dropdown.json5 +48 -48
  159. package/design-tokens/pt-2022/tokens/components/form-field.json5 +92 -92
  160. package/design-tokens/pt-2022/tokens/components/forms.json5 +52 -52
  161. package/design-tokens/pt-2022/tokens/components/icon.json5 +104 -104
  162. package/design-tokens/pt-2022/tokens/components/input.json5 +12 -12
  163. package/design-tokens/pt-2022/tokens/components/link.json5 +50 -50
  164. package/design-tokens/pt-2022/tokens/components/list.json5 +13 -13
  165. package/design-tokens/pt-2022/tokens/components/loader-overlay.json5 +23 -0
  166. package/design-tokens/pt-2022/tokens/components/modal.json5 +81 -81
  167. package/design-tokens/pt-2022/tokens/components/navbar.json5 +70 -70
  168. package/design-tokens/pt-2022/tokens/components/optgroup.json5 +10 -10
  169. package/design-tokens/pt-2022/tokens/components/option.json5 +12 -12
  170. package/design-tokens/pt-2022/tokens/components/popover.json5 +68 -68
  171. package/design-tokens/pt-2022/tokens/components/popup.json5 +16 -16
  172. package/design-tokens/pt-2022/tokens/components/progress-bar.json5 +13 -13
  173. package/design-tokens/pt-2022/tokens/components/progress-spinner.json5 +7 -7
  174. package/design-tokens/pt-2022/tokens/components/radio.json5 +45 -44
  175. package/design-tokens/pt-2022/tokens/components/select.json5 +24 -24
  176. package/design-tokens/pt-2022/tokens/components/sidepanel.json5 +44 -44
  177. package/design-tokens/pt-2022/tokens/components/table.json5 +15 -15
  178. package/design-tokens/pt-2022/tokens/components/tabs.json5 +101 -101
  179. package/design-tokens/pt-2022/tokens/components/tags.json5 +137 -137
  180. package/design-tokens/pt-2022/tokens/components/textarea.json5 +12 -12
  181. package/design-tokens/pt-2022/tokens/components/timepicker.json5 +7 -7
  182. package/design-tokens/pt-2022/tokens/components/toggle.json5 +79 -79
  183. package/design-tokens/pt-2022/tokens/components/tooltip.json5 +83 -83
  184. package/design-tokens/pt-2022/tokens/components/tree.json5 +15 -15
  185. package/design-tokens/pt-2022/tokens/properties/aliases.json5 +3 -3
  186. package/design-tokens/pt-2022/tokens/properties/colors.json5 +122 -120
  187. package/design-tokens/pt-2022/tokens/properties/font.json5 +15 -15
  188. package/design-tokens/pt-2022/tokens/properties/globals.json5 +49 -49
  189. package/design-tokens/pt-2022/tokens/properties/padding.json5 +3 -3
  190. package/design-tokens/pt-2022/tokens/properties/palette.json5 +232 -232
  191. package/design-tokens/pt-2022/tokens/properties/typography.json5 +175 -175
  192. package/design-tokens/pt-2022/tokens.d.ts +9205 -9175
  193. package/design-tokens/ptsecurity-mosaic-design-tokens.d.ts +5 -5
  194. package/design-tokens/public-api.d.ts +3 -3
  195. package/design-tokens/style-dictionary/build.js +76 -63
  196. package/design-tokens/style-dictionary/configs/css.js +13 -13
  197. package/design-tokens/style-dictionary/configs/figma.js +11 -0
  198. package/design-tokens/style-dictionary/configs/index.js +48 -48
  199. package/design-tokens/style-dictionary/configs/js.js +9 -9
  200. package/design-tokens/style-dictionary/configs/scss.js +23 -23
  201. package/design-tokens/style-dictionary/filters/color.js +7 -7
  202. package/design-tokens/style-dictionary/filters/palette.js +7 -7
  203. package/design-tokens/style-dictionary/filters/size.js +7 -7
  204. package/design-tokens/style-dictionary/filters/typography.js +7 -7
  205. package/design-tokens/style-dictionary/formats/figma.js +104 -0
  206. package/design-tokens/style-dictionary/formats/palette.js +25 -25
  207. package/design-tokens/style-dictionary/formats/typography.js +52 -52
  208. package/design-tokens/style-dictionary/transformGroups/css.js +13 -13
  209. package/design-tokens/style-dictionary/transformGroups/figma.js +21 -0
  210. package/design-tokens/style-dictionary/transformGroups/scss.js +12 -12
  211. package/design-tokens/style-dictionary/transformGroups/ts.js +11 -11
  212. package/design-tokens/style-dictionary/transforms/attribute/figma-border.js +18 -0
  213. package/design-tokens/style-dictionary/transforms/attribute/figma-color.js +25 -0
  214. package/design-tokens/style-dictionary/transforms/attribute/figma-default.js +10 -0
  215. package/design-tokens/style-dictionary/transforms/attribute/figma-font.js +31 -0
  216. package/design-tokens/style-dictionary/transforms/attribute/figma-group.js +17 -0
  217. package/design-tokens/style-dictionary/transforms/attribute/figma-opacity.js +10 -0
  218. package/design-tokens/style-dictionary/transforms/attribute/figma-shadow.js +66 -0
  219. package/design-tokens/style-dictionary/transforms/attribute/figma-sizing.js +16 -0
  220. package/design-tokens/style-dictionary/transforms/attribute/figma-spacing.js +15 -0
  221. package/design-tokens/style-dictionary/transforms/attribute/figma-typography.js +24 -0
  222. package/design-tokens/style-dictionary/transforms/attribute/palette.js +9 -9
  223. package/design-tokens/style-dictionary/transforms/attribute/prefix.js +11 -11
  224. package/design-tokens/style-dictionary/transforms/attribute/size.js +8 -8
  225. package/design-tokens/style-dictionary/transforms/attribute/typography.js +9 -9
  226. package/design-tokens/style-dictionary/transforms/value/figma-values.js +7 -0
  227. package/divider/divider.component.d.ts +11 -11
  228. package/divider/divider.module.d.ts +8 -8
  229. package/divider/index.d.ts +1 -1
  230. package/divider/ptsecurity-mosaic-divider.d.ts +5 -5
  231. package/divider/public-api.d.ts +2 -2
  232. package/dl/dl.component.d.ts +26 -26
  233. package/dl/dl.module.d.ts +10 -10
  234. package/dl/index.d.ts +1 -1
  235. package/dl/ptsecurity-mosaic-dl.d.ts +5 -5
  236. package/dl/public-api.d.ts +2 -2
  237. package/dropdown/dropdown-animations.d.ts +11 -11
  238. package/dropdown/dropdown-content.directive.d.ts +32 -32
  239. package/dropdown/dropdown-errors.d.ts +17 -17
  240. package/dropdown/dropdown-item.component.d.ts +50 -50
  241. package/dropdown/dropdown-trigger.directive.d.ts +136 -136
  242. package/dropdown/dropdown.component.d.ts +121 -121
  243. package/dropdown/dropdown.module.d.ts +13 -13
  244. package/dropdown/dropdown.types.d.ts +53 -53
  245. package/dropdown/index.d.ts +1 -1
  246. package/dropdown/ptsecurity-mosaic-dropdown.d.ts +5 -5
  247. package/dropdown/public-api.d.ts +8 -8
  248. package/esm2020/autocomplete/autocomplete-origin.directive.mjs +21 -21
  249. package/esm2020/autocomplete/autocomplete-trigger.directive.mjs +555 -555
  250. package/esm2020/autocomplete/autocomplete.component.mjs +154 -154
  251. package/esm2020/autocomplete/autocomplete.module.mjs +34 -34
  252. package/esm2020/autocomplete/index.mjs +2 -2
  253. package/esm2020/autocomplete/ptsecurity-mosaic-autocomplete.mjs +4 -4
  254. package/esm2020/autocomplete/public-api.mjs +5 -5
  255. package/esm2020/button/button.component.mjs +137 -137
  256. package/esm2020/button/button.module.mjs +38 -38
  257. package/esm2020/button/index.mjs +2 -2
  258. package/esm2020/button/ptsecurity-mosaic-button.mjs +4 -4
  259. package/esm2020/button/public-api.mjs +3 -3
  260. package/esm2020/button-toggle/button-toggle.component.mjs +362 -362
  261. package/esm2020/button-toggle/button-toggle.module.mjs +19 -19
  262. package/esm2020/button-toggle/index.mjs +2 -2
  263. package/esm2020/button-toggle/ptsecurity-mosaic-button-toggle.mjs +4 -4
  264. package/esm2020/button-toggle/public-api.mjs +3 -3
  265. package/esm2020/card/card.component.mjs +80 -80
  266. package/esm2020/card/card.module.mjs +30 -30
  267. package/esm2020/card/index.mjs +2 -2
  268. package/esm2020/card/ptsecurity-mosaic-card.mjs +4 -4
  269. package/esm2020/card/public-api.mjs +3 -3
  270. package/esm2020/checkbox/checkbox-config.mjs +6 -6
  271. package/esm2020/checkbox/checkbox-module.mjs +19 -19
  272. package/esm2020/checkbox/checkbox-required-validator.mjs +27 -27
  273. package/esm2020/checkbox/checkbox.mjs +316 -316
  274. package/esm2020/checkbox/index.mjs +2 -2
  275. package/esm2020/checkbox/ptsecurity-mosaic-checkbox.mjs +4 -4
  276. package/esm2020/checkbox/public-api.mjs +5 -5
  277. package/esm2020/core/animation/animation.mjs +8 -8
  278. package/esm2020/core/animation/fade-animations.mjs +9 -9
  279. package/esm2020/core/animation/index.mjs +4 -4
  280. package/esm2020/core/animation/select-animations.mjs +45 -45
  281. package/esm2020/core/common-behaviors/color.mjs +30 -30
  282. package/esm2020/core/common-behaviors/common-module.mjs +83 -83
  283. package/esm2020/core/common-behaviors/constructor.mjs +2 -2
  284. package/esm2020/core/common-behaviors/disabled.mjs +17 -17
  285. package/esm2020/core/common-behaviors/error-state.mjs +31 -31
  286. package/esm2020/core/common-behaviors/index.mjs +6 -6
  287. package/esm2020/core/common-behaviors/tabindex.mjs +18 -18
  288. package/esm2020/core/error/error-options.mjs +26 -26
  289. package/esm2020/core/formatters/date/formatter.mjs +359 -359
  290. package/esm2020/core/formatters/date/templates/en-US.mjs +281 -281
  291. package/esm2020/core/formatters/date/templates/ru-RU.mjs +281 -281
  292. package/esm2020/core/formatters/index.mjs +20 -20
  293. package/esm2020/core/formatters/number/formatter.mjs +105 -105
  294. package/esm2020/core/forms/forms-module.mjs +24 -24
  295. package/esm2020/core/forms/forms.directive.mjs +66 -66
  296. package/esm2020/core/forms/index.mjs +3 -3
  297. package/esm2020/core/highlight/highlight.pipe.mjs +17 -17
  298. package/esm2020/core/highlight/index.mjs +19 -19
  299. package/esm2020/core/index.mjs +2 -2
  300. package/esm2020/core/label/label-options.mjs +4 -4
  301. package/esm2020/core/line/line.mjs +70 -70
  302. package/esm2020/core/option/action.mjs +121 -121
  303. package/esm2020/core/option/index.mjs +5 -5
  304. package/esm2020/core/option/optgroup.mjs +31 -31
  305. package/esm2020/core/option/option-module.mjs +21 -21
  306. package/esm2020/core/option/option.mjs +257 -257
  307. package/esm2020/core/overlay/overlay-position-map.mjs +244 -244
  308. package/esm2020/core/pop-up/constants.mjs +34 -34
  309. package/esm2020/core/pop-up/index.mjs +4 -4
  310. package/esm2020/core/pop-up/pop-up-trigger.mjs +239 -239
  311. package/esm2020/core/pop-up/pop-up.mjs +94 -94
  312. package/esm2020/core/ptsecurity-mosaic-core.mjs +4 -4
  313. package/esm2020/core/public-api.mjs +18 -18
  314. package/esm2020/core/select/constants.mjs +27 -27
  315. package/esm2020/core/select/errors.mjs +26 -26
  316. package/esm2020/core/select/events.mjs +2 -2
  317. package/esm2020/core/select/index.mjs +4 -4
  318. package/esm2020/core/selection/constants.mjs +6 -6
  319. package/esm2020/core/selection/index.mjs +4 -4
  320. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +49 -49
  321. package/esm2020/core/selection/pseudo-checkbox/pseudo-checkbox.module.mjs +18 -18
  322. package/esm2020/core/services/measure-scrollbar.service.mjs +48 -48
  323. package/esm2020/core/utils/index.mjs +2 -2
  324. package/esm2020/core/utils/public-api.mjs +2 -2
  325. package/esm2020/core/utils/utils.mjs +5 -5
  326. package/esm2020/core/validation/index.mjs +2 -2
  327. package/esm2020/core/validation/validation.mjs +118 -118
  328. package/esm2020/core/version.mjs +3 -3
  329. package/esm2020/datepicker/calendar-body.component.mjs +106 -106
  330. package/esm2020/datepicker/calendar.component.mjs +362 -362
  331. package/esm2020/datepicker/datepicker-animations.mjs +32 -32
  332. package/esm2020/datepicker/datepicker-errors.mjs +6 -6
  333. package/esm2020/datepicker/datepicker-input.directive.mjs +938 -936
  334. package/esm2020/datepicker/datepicker-intl.mjs +40 -40
  335. package/esm2020/datepicker/datepicker-module.mjs +107 -107
  336. package/esm2020/datepicker/datepicker-toggle.component.mjs +86 -86
  337. package/esm2020/datepicker/datepicker.component.mjs +404 -408
  338. package/esm2020/datepicker/index.mjs +2 -2
  339. package/esm2020/datepicker/month-view.component.mjs +257 -257
  340. package/esm2020/datepicker/multi-year-view.component.mjs +218 -218
  341. package/esm2020/datepicker/ptsecurity-mosaic-datepicker.mjs +4 -4
  342. package/esm2020/datepicker/public-api.mjs +12 -12
  343. package/esm2020/datepicker/year-view.component.mjs +253 -253
  344. package/esm2020/design-tokens/index.mjs +2 -2
  345. package/esm2020/design-tokens/legacy-2017/tokens.mjs +1167 -1137
  346. package/esm2020/design-tokens/pt-2022/tokens.mjs +1237 -1207
  347. package/esm2020/design-tokens/ptsecurity-mosaic-design-tokens.mjs +4 -4
  348. package/esm2020/design-tokens/public-api.mjs +4 -4
  349. package/esm2020/divider/divider.component.mjs +39 -39
  350. package/esm2020/divider/divider.module.mjs +18 -18
  351. package/esm2020/divider/index.mjs +2 -2
  352. package/esm2020/divider/ptsecurity-mosaic-divider.mjs +4 -4
  353. package/esm2020/divider/public-api.mjs +3 -3
  354. package/esm2020/dl/dl.component.mjs +78 -78
  355. package/esm2020/dl/dl.module.mjs +42 -42
  356. package/esm2020/dl/index.mjs +2 -2
  357. package/esm2020/dl/ptsecurity-mosaic-dl.mjs +4 -4
  358. package/esm2020/dl/public-api.mjs +3 -3
  359. package/esm2020/dropdown/dropdown-animations.mjs +41 -41
  360. package/esm2020/dropdown/dropdown-content.directive.mjs +64 -64
  361. package/esm2020/dropdown/dropdown-errors.mjs +29 -29
  362. package/esm2020/dropdown/dropdown-item.component.mjs +139 -139
  363. package/esm2020/dropdown/dropdown-trigger.directive.mjs +489 -489
  364. package/esm2020/dropdown/dropdown.component.mjs +292 -292
  365. package/esm2020/dropdown/dropdown.module.mjs +50 -50
  366. package/esm2020/dropdown/dropdown.types.mjs +24 -24
  367. package/esm2020/dropdown/index.mjs +2 -2
  368. package/esm2020/dropdown/ptsecurity-mosaic-dropdown.mjs +4 -4
  369. package/esm2020/dropdown/public-api.mjs +9 -9
  370. package/esm2020/form-field/cleaner.mjs +23 -23
  371. package/esm2020/form-field/form-field-control.mjs +5 -5
  372. package/esm2020/form-field/form-field-errors.mjs +7 -7
  373. package/esm2020/form-field/form-field.mjs +225 -225
  374. package/esm2020/form-field/form-field.module.mjs +57 -57
  375. package/esm2020/form-field/hint.mjs +34 -23
  376. package/esm2020/form-field/index.mjs +2 -2
  377. package/esm2020/form-field/password-hint.mjs +139 -139
  378. package/esm2020/form-field/prefix.mjs +13 -13
  379. package/esm2020/form-field/ptsecurity-mosaic-form-field.mjs +4 -4
  380. package/esm2020/form-field/public-api.mjs +11 -11
  381. package/esm2020/form-field/stepper.mjs +55 -55
  382. package/esm2020/form-field/suffix.mjs +13 -13
  383. package/esm2020/icon/icon.component.mjs +44 -44
  384. package/esm2020/icon/icon.module.mjs +38 -38
  385. package/esm2020/icon/index.mjs +2 -2
  386. package/esm2020/icon/ptsecurity-mosaic-icon.mjs +4 -4
  387. package/esm2020/icon/public-api.mjs +3 -3
  388. package/esm2020/index.mjs +2 -2
  389. package/esm2020/input/index.mjs +2 -2
  390. package/esm2020/input/input-errors.mjs +4 -4
  391. package/esm2020/input/input-number-validators.mjs +92 -92
  392. package/esm2020/input/input-number.mjs +163 -163
  393. package/esm2020/input/input-password.mjs +372 -372
  394. package/esm2020/input/input-value-accessor.mjs +3 -3
  395. package/esm2020/input/input.mjs +334 -334
  396. package/esm2020/input/input.module.mjs +65 -65
  397. package/esm2020/input/ptsecurity-mosaic-input.mjs +4 -4
  398. package/esm2020/input/public-api.mjs +7 -7
  399. package/esm2020/link/index.mjs +2 -2
  400. package/esm2020/link/link.component.mjs +107 -107
  401. package/esm2020/link/link.module.mjs +26 -26
  402. package/esm2020/link/ptsecurity-mosaic-link.mjs +4 -4
  403. package/esm2020/link/public-api.mjs +3 -3
  404. package/esm2020/list/index.mjs +2 -2
  405. package/esm2020/list/list-selection.component.mjs +689 -686
  406. package/esm2020/list/list.component.mjs +44 -44
  407. package/esm2020/list/list.module.mjs +55 -55
  408. package/esm2020/list/ptsecurity-mosaic-list.mjs +4 -4
  409. package/esm2020/list/public-api.mjs +4 -4
  410. package/esm2020/loader-overlay/index.mjs +2 -0
  411. package/esm2020/loader-overlay/loader-overlay.component.mjs +99 -0
  412. package/esm2020/loader-overlay/loader-overlay.module.mjs +50 -0
  413. package/esm2020/loader-overlay/ptsecurity-mosaic-loader-overlay.mjs +5 -0
  414. package/esm2020/loader-overlay/public-api.mjs +3 -0
  415. package/esm2020/modal/css-unit.pipe.mjs +17 -17
  416. package/esm2020/modal/index.mjs +2 -2
  417. package/esm2020/modal/modal-control.service.mjs +85 -85
  418. package/esm2020/modal/modal-ref.class.mjs +8 -8
  419. package/esm2020/modal/modal-util.mjs +17 -17
  420. package/esm2020/modal/modal.component.mjs +509 -501
  421. package/esm2020/modal/modal.directive.mjs +52 -52
  422. package/esm2020/modal/modal.module.mjs +72 -72
  423. package/esm2020/modal/modal.service.mjs +124 -124
  424. package/esm2020/modal/modal.type.mjs +7 -7
  425. package/esm2020/modal/ptsecurity-mosaic-modal.mjs +4 -4
  426. package/esm2020/modal/public-api.mjs +7 -7
  427. package/esm2020/navbar/index.mjs +2 -2
  428. package/esm2020/navbar/navbar-item.component.mjs +582 -582
  429. package/esm2020/navbar/navbar.component.mjs +239 -237
  430. package/esm2020/navbar/navbar.module.mjs +92 -92
  431. package/esm2020/navbar/ptsecurity-mosaic-navbar.mjs +4 -4
  432. package/esm2020/navbar/public-api.mjs +5 -5
  433. package/esm2020/navbar/vertical-navbar.animation.mjs +10 -10
  434. package/esm2020/navbar/vertical-navbar.component.mjs +114 -114
  435. package/esm2020/popover/index.mjs +2 -2
  436. package/esm2020/popover/popover-animations.mjs +16 -16
  437. package/esm2020/popover/popover-confirm.component.mjs +108 -108
  438. package/esm2020/popover/popover.component.mjs +253 -253
  439. package/esm2020/popover/popover.module.mjs +24 -24
  440. package/esm2020/popover/ptsecurity-mosaic-popover.mjs +4 -4
  441. package/esm2020/popover/public-api.mjs +5 -5
  442. package/esm2020/progress-bar/index.mjs +2 -2
  443. package/esm2020/progress-bar/progress-bar.component.mjs +42 -42
  444. package/esm2020/progress-bar/progress-bar.module.mjs +30 -30
  445. package/esm2020/progress-bar/ptsecurity-mosaic-progress-bar.mjs +4 -4
  446. package/esm2020/progress-bar/public-api.mjs +3 -3
  447. package/esm2020/progress-spinner/index.mjs +2 -2
  448. package/esm2020/progress-spinner/progress-spinner.component.mjs +46 -46
  449. package/esm2020/progress-spinner/progress-spinner.module.mjs +30 -30
  450. package/esm2020/progress-spinner/ptsecurity-mosaic-progress-spinner.mjs +4 -4
  451. package/esm2020/progress-spinner/public-api.mjs +3 -3
  452. package/esm2020/ptsecurity-mosaic.mjs +4 -4
  453. package/esm2020/public-api.mjs +2 -2
  454. package/esm2020/radio/index.mjs +2 -2
  455. package/esm2020/radio/ptsecurity-mosaic-radio.mjs +4 -4
  456. package/esm2020/radio/public-api.mjs +3 -3
  457. package/esm2020/radio/radio.component.mjs +458 -458
  458. package/esm2020/radio/radio.module.mjs +20 -20
  459. package/esm2020/select/index.mjs +2 -2
  460. package/esm2020/select/ptsecurity-mosaic-select.mjs +4 -4
  461. package/esm2020/select/public-api.mjs +4 -4
  462. package/esm2020/select/select-option.directive.mjs +65 -65
  463. package/esm2020/select/select.component.mjs +1117 -1107
  464. package/esm2020/select/select.module.mjs +73 -73
  465. package/esm2020/sidebar/index.mjs +2 -2
  466. package/esm2020/sidebar/ptsecurity-mosaic-sidebar.mjs +4 -4
  467. package/esm2020/sidebar/public-api.mjs +3 -3
  468. package/esm2020/sidebar/sidebar-animations.mjs +23 -23
  469. package/esm2020/sidebar/sidebar.component.mjs +146 -146
  470. package/esm2020/sidebar/sidebar.module.mjs +30 -30
  471. package/esm2020/sidepanel/index.mjs +2 -2
  472. package/esm2020/sidepanel/ptsecurity-mosaic-sidepanel.mjs +4 -4
  473. package/esm2020/sidepanel/public-api.mjs +7 -7
  474. package/esm2020/sidepanel/sidepanel-animations.mjs +26 -26
  475. package/esm2020/sidepanel/sidepanel-config.mjs +26 -26
  476. package/esm2020/sidepanel/sidepanel-container.component.mjs +106 -106
  477. package/esm2020/sidepanel/sidepanel-directives.mjs +159 -159
  478. package/esm2020/sidepanel/sidepanel-ref.mjs +53 -53
  479. package/esm2020/sidepanel/sidepanel.module.mjs +74 -74
  480. package/esm2020/sidepanel/sidepanel.service.mjs +167 -167
  481. package/esm2020/splitter/index.mjs +2 -2
  482. package/esm2020/splitter/ptsecurity-mosaic-splitter.mjs +4 -4
  483. package/esm2020/splitter/public-api.mjs +3 -3
  484. package/esm2020/splitter/splitter.component.mjs +482 -482
  485. package/esm2020/splitter/splitter.module.mjs +40 -40
  486. package/esm2020/table/index.mjs +2 -2
  487. package/esm2020/table/ptsecurity-mosaic-table.mjs +4 -4
  488. package/esm2020/table/public-api.mjs +3 -3
  489. package/esm2020/table/table.component.mjs +16 -16
  490. package/esm2020/table/table.module.mjs +30 -30
  491. package/esm2020/tabs/index.mjs +2 -2
  492. package/esm2020/tabs/paginated-tab-header.mjs +479 -479
  493. package/esm2020/tabs/ptsecurity-mosaic-tabs.mjs +4 -4
  494. package/esm2020/tabs/public-api.mjs +11 -11
  495. package/esm2020/tabs/tab-body.component.mjs +178 -178
  496. package/esm2020/tabs/tab-content.directive.mjs +15 -15
  497. package/esm2020/tabs/tab-group.component.mjs +350 -350
  498. package/esm2020/tabs/tab-header.component.mjs +67 -67
  499. package/esm2020/tabs/tab-label-wrapper.directive.mjs +78 -78
  500. package/esm2020/tabs/tab-label.directive.mjs +17 -17
  501. package/esm2020/tabs/tab-nav-bar/index.mjs +2 -2
  502. package/esm2020/tabs/tab-nav-bar/tab-nav-bar.mjs +110 -110
  503. package/esm2020/tabs/tab.component.mjs +133 -133
  504. package/esm2020/tabs/tabs-animations.mjs +24 -24
  505. package/esm2020/tabs/tabs.module.mjs +104 -104
  506. package/esm2020/tags/index.mjs +2 -2
  507. package/esm2020/tags/ptsecurity-mosaic-tags.mjs +4 -4
  508. package/esm2020/tags/public-api.mjs +6 -6
  509. package/esm2020/tags/tag-default-options.mjs +4 -4
  510. package/esm2020/tags/tag-input.mjs +229 -229
  511. package/esm2020/tags/tag-list.component.mjs +722 -722
  512. package/esm2020/tags/tag-text-control.mjs +2 -2
  513. package/esm2020/tags/tag.component.mjs +375 -375
  514. package/esm2020/tags/tag.module.mjs +56 -56
  515. package/esm2020/textarea/index.mjs +2 -2
  516. package/esm2020/textarea/ptsecurity-mosaic-textarea.mjs +4 -4
  517. package/esm2020/textarea/public-api.mjs +3 -3
  518. package/esm2020/textarea/textarea.component.mjs +269 -269
  519. package/esm2020/textarea/textarea.module.mjs +21 -21
  520. package/esm2020/timepicker/index.mjs +2 -2
  521. package/esm2020/timepicker/ptsecurity-mosaic-timepicker.mjs +4 -4
  522. package/esm2020/timepicker/public-api.mjs +4 -4
  523. package/esm2020/timepicker/timepicker.constants.mjs +25 -25
  524. package/esm2020/timepicker/timepicker.directive.mjs +665 -676
  525. package/esm2020/timepicker/timepicker.module.mjs +34 -34
  526. package/esm2020/toggle/index.mjs +2 -2
  527. package/esm2020/toggle/ptsecurity-mosaic-toggle.mjs +4 -4
  528. package/esm2020/toggle/public-api.mjs +3 -3
  529. package/esm2020/toggle/toggle.component.mjs +158 -158
  530. package/esm2020/toggle/toggle.module.mjs +20 -20
  531. package/esm2020/tooltip/index.mjs +2 -2
  532. package/esm2020/tooltip/ptsecurity-mosaic-tooltip.mjs +4 -4
  533. package/esm2020/tooltip/public-api.mjs +3 -3
  534. package/esm2020/tooltip/tooltip.animations.mjs +19 -19
  535. package/esm2020/tooltip/tooltip.component.mjs +295 -295
  536. package/esm2020/tooltip/tooltip.module.mjs +43 -43
  537. package/esm2020/tree/control/base-tree-control.mjs +60 -60
  538. package/esm2020/tree/control/flat-tree-control.mjs +126 -126
  539. package/esm2020/tree/control/nested-tree-control.mjs +41 -41
  540. package/esm2020/tree/control/tree-control.mjs +2 -2
  541. package/esm2020/tree/data-source/flat-data-source.mjs +162 -162
  542. package/esm2020/tree/data-source/nested-data-source.mjs +30 -30
  543. package/esm2020/tree/index.mjs +2 -2
  544. package/esm2020/tree/node.mjs +31 -31
  545. package/esm2020/tree/outlet.mjs +15 -15
  546. package/esm2020/tree/padding.directive.mjs +113 -110
  547. package/esm2020/tree/ptsecurity-mosaic-tree.mjs +4 -4
  548. package/esm2020/tree/public-api.mjs +16 -16
  549. package/esm2020/tree/toggle.mjs +80 -80
  550. package/esm2020/tree/tree-base.mjs +243 -243
  551. package/esm2020/tree/tree-errors.mjs +36 -36
  552. package/esm2020/tree/tree-option.component.mjs +248 -236
  553. package/esm2020/tree/tree-selection.component.mjs +541 -540
  554. package/esm2020/tree/tree.mjs +15 -15
  555. package/esm2020/tree/tree.module.mjs +57 -57
  556. package/esm2020/tree-select/index.mjs +2 -2
  557. package/esm2020/tree-select/ptsecurity-mosaic-tree-select.mjs +4 -4
  558. package/esm2020/tree-select/public-api.mjs +3 -3
  559. package/esm2020/tree-select/tree-select.component.mjs +939 -929
  560. package/esm2020/tree-select/tree-select.module.mjs +47 -47
  561. package/fesm2015/ptsecurity-mosaic-autocomplete.mjs +726 -726
  562. package/fesm2015/ptsecurity-mosaic-autocomplete.mjs.map +1 -1
  563. package/fesm2015/ptsecurity-mosaic-button-toggle.mjs +367 -367
  564. package/fesm2015/ptsecurity-mosaic-button-toggle.mjs.map +1 -1
  565. package/fesm2015/ptsecurity-mosaic-button.mjs +160 -160
  566. package/fesm2015/ptsecurity-mosaic-button.mjs.map +1 -1
  567. package/fesm2015/ptsecurity-mosaic-card.mjs +96 -96
  568. package/fesm2015/ptsecurity-mosaic-card.mjs.map +1 -1
  569. package/fesm2015/ptsecurity-mosaic-checkbox.mjs +348 -348
  570. package/fesm2015/ptsecurity-mosaic-checkbox.mjs.map +1 -1
  571. package/fesm2015/ptsecurity-mosaic-core.mjs +2652 -2652
  572. package/fesm2015/ptsecurity-mosaic-core.mjs.map +1 -1
  573. package/fesm2015/ptsecurity-mosaic-datepicker.mjs +2682 -2684
  574. package/fesm2015/ptsecurity-mosaic-datepicker.mjs.map +1 -1
  575. package/fesm2015/ptsecurity-mosaic-design-tokens.mjs +2433 -2343
  576. package/fesm2015/ptsecurity-mosaic-design-tokens.mjs.map +1 -1
  577. package/fesm2015/ptsecurity-mosaic-divider.mjs +48 -48
  578. package/fesm2015/ptsecurity-mosaic-divider.mjs.map +1 -1
  579. package/fesm2015/ptsecurity-mosaic-dl.mjs +108 -108
  580. package/fesm2015/ptsecurity-mosaic-dl.mjs.map +1 -1
  581. package/fesm2015/ptsecurity-mosaic-dropdown.mjs +1069 -1069
  582. package/fesm2015/ptsecurity-mosaic-dropdown.mjs.map +1 -1
  583. package/fesm2015/ptsecurity-mosaic-form-field.mjs +522 -512
  584. package/fesm2015/ptsecurity-mosaic-form-field.mjs.map +1 -1
  585. package/fesm2015/ptsecurity-mosaic-icon.mjs +73 -73
  586. package/fesm2015/ptsecurity-mosaic-icon.mjs.map +1 -1
  587. package/fesm2015/ptsecurity-mosaic-input.mjs +979 -979
  588. package/fesm2015/ptsecurity-mosaic-input.mjs.map +1 -1
  589. package/fesm2015/ptsecurity-mosaic-link.mjs +121 -121
  590. package/fesm2015/ptsecurity-mosaic-link.mjs.map +1 -1
  591. package/fesm2015/ptsecurity-mosaic-list.mjs +765 -762
  592. package/fesm2015/ptsecurity-mosaic-list.mjs.map +1 -1
  593. package/fesm2015/ptsecurity-mosaic-loader-overlay.mjs +155 -0
  594. package/fesm2015/ptsecurity-mosaic-loader-overlay.mjs.map +1 -0
  595. package/fesm2015/ptsecurity-mosaic-modal.mjs +833 -824
  596. package/fesm2015/ptsecurity-mosaic-modal.mjs.map +1 -1
  597. package/fesm2015/ptsecurity-mosaic-navbar.mjs +996 -994
  598. package/fesm2015/ptsecurity-mosaic-navbar.mjs.map +1 -1
  599. package/fesm2015/ptsecurity-mosaic-popover.mjs +364 -364
  600. package/fesm2015/ptsecurity-mosaic-popover.mjs.map +1 -1
  601. package/fesm2015/ptsecurity-mosaic-progress-bar.mjs +61 -61
  602. package/fesm2015/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
  603. package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs +65 -65
  604. package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
  605. package/fesm2015/ptsecurity-mosaic-radio.mjs +464 -464
  606. package/fesm2015/ptsecurity-mosaic-radio.mjs.map +1 -1
  607. package/fesm2015/ptsecurity-mosaic-select.mjs +1213 -1203
  608. package/fesm2015/ptsecurity-mosaic-select.mjs.map +1 -1
  609. package/fesm2015/ptsecurity-mosaic-sidebar.mjs +185 -185
  610. package/fesm2015/ptsecurity-mosaic-sidebar.mjs.map +1 -1
  611. package/fesm2015/ptsecurity-mosaic-sidepanel.mjs +555 -555
  612. package/fesm2015/ptsecurity-mosaic-sidepanel.mjs.map +1 -1
  613. package/fesm2015/ptsecurity-mosaic-splitter.mjs +511 -511
  614. package/fesm2015/ptsecurity-mosaic-splitter.mjs.map +1 -1
  615. package/fesm2015/ptsecurity-mosaic-table.mjs +36 -36
  616. package/fesm2015/ptsecurity-mosaic-table.mjs.map +1 -1
  617. package/fesm2015/ptsecurity-mosaic-tabs.mjs +1460 -1460
  618. package/fesm2015/ptsecurity-mosaic-tabs.mjs.map +1 -1
  619. package/fesm2015/ptsecurity-mosaic-tags.mjs +1342 -1342
  620. package/fesm2015/ptsecurity-mosaic-tags.mjs.map +1 -1
  621. package/fesm2015/ptsecurity-mosaic-textarea.mjs +274 -274
  622. package/fesm2015/ptsecurity-mosaic-textarea.mjs.map +1 -1
  623. package/fesm2015/ptsecurity-mosaic-timepicker.mjs +703 -714
  624. package/fesm2015/ptsecurity-mosaic-timepicker.mjs.map +1 -1
  625. package/fesm2015/ptsecurity-mosaic-toggle.mjs +163 -163
  626. package/fesm2015/ptsecurity-mosaic-toggle.mjs.map +1 -1
  627. package/fesm2015/ptsecurity-mosaic-tooltip.mjs +344 -344
  628. package/fesm2015/ptsecurity-mosaic-tooltip.mjs.map +1 -1
  629. package/fesm2015/ptsecurity-mosaic-tree-select.mjs +954 -944
  630. package/fesm2015/ptsecurity-mosaic-tree-select.mjs.map +1 -1
  631. package/fesm2015/ptsecurity-mosaic-tree.mjs +1696 -1682
  632. package/fesm2015/ptsecurity-mosaic-tree.mjs.map +1 -1
  633. package/fesm2015/ptsecurity-mosaic.mjs +2 -2
  634. package/fesm2020/ptsecurity-mosaic-autocomplete.mjs +722 -722
  635. package/fesm2020/ptsecurity-mosaic-autocomplete.mjs.map +1 -1
  636. package/fesm2020/ptsecurity-mosaic-button-toggle.mjs +365 -365
  637. package/fesm2020/ptsecurity-mosaic-button-toggle.mjs.map +1 -1
  638. package/fesm2020/ptsecurity-mosaic-button.mjs +160 -160
  639. package/fesm2020/ptsecurity-mosaic-button.mjs.map +1 -1
  640. package/fesm2020/ptsecurity-mosaic-card.mjs +96 -96
  641. package/fesm2020/ptsecurity-mosaic-card.mjs.map +1 -1
  642. package/fesm2020/ptsecurity-mosaic-checkbox.mjs +346 -346
  643. package/fesm2020/ptsecurity-mosaic-checkbox.mjs.map +1 -1
  644. package/fesm2020/ptsecurity-mosaic-core.mjs +2681 -2681
  645. package/fesm2020/ptsecurity-mosaic-core.mjs.map +1 -1
  646. package/fesm2020/ptsecurity-mosaic-datepicker.mjs +2667 -2669
  647. package/fesm2020/ptsecurity-mosaic-datepicker.mjs.map +1 -1
  648. package/fesm2020/ptsecurity-mosaic-design-tokens.mjs +2433 -2343
  649. package/fesm2020/ptsecurity-mosaic-design-tokens.mjs.map +1 -1
  650. package/fesm2020/ptsecurity-mosaic-divider.mjs +48 -48
  651. package/fesm2020/ptsecurity-mosaic-divider.mjs.map +1 -1
  652. package/fesm2020/ptsecurity-mosaic-dl.mjs +108 -108
  653. package/fesm2020/ptsecurity-mosaic-dl.mjs.map +1 -1
  654. package/fesm2020/ptsecurity-mosaic-dropdown.mjs +1056 -1056
  655. package/fesm2020/ptsecurity-mosaic-dropdown.mjs.map +1 -1
  656. package/fesm2020/ptsecurity-mosaic-form-field.mjs +507 -497
  657. package/fesm2020/ptsecurity-mosaic-form-field.mjs.map +1 -1
  658. package/fesm2020/ptsecurity-mosaic-icon.mjs +71 -71
  659. package/fesm2020/ptsecurity-mosaic-icon.mjs.map +1 -1
  660. package/fesm2020/ptsecurity-mosaic-input.mjs +968 -968
  661. package/fesm2020/ptsecurity-mosaic-input.mjs.map +1 -1
  662. package/fesm2020/ptsecurity-mosaic-link.mjs +120 -120
  663. package/fesm2020/ptsecurity-mosaic-link.mjs.map +1 -1
  664. package/fesm2020/ptsecurity-mosaic-list.mjs +758 -755
  665. package/fesm2020/ptsecurity-mosaic-list.mjs.map +1 -1
  666. package/fesm2020/ptsecurity-mosaic-loader-overlay.mjs +153 -0
  667. package/fesm2020/ptsecurity-mosaic-loader-overlay.mjs.map +1 -0
  668. package/fesm2020/ptsecurity-mosaic-modal.mjs +828 -820
  669. package/fesm2020/ptsecurity-mosaic-modal.mjs.map +1 -1
  670. package/fesm2020/ptsecurity-mosaic-navbar.mjs +980 -978
  671. package/fesm2020/ptsecurity-mosaic-navbar.mjs.map +1 -1
  672. package/fesm2020/ptsecurity-mosaic-popover.mjs +360 -360
  673. package/fesm2020/ptsecurity-mosaic-popover.mjs.map +1 -1
  674. package/fesm2020/ptsecurity-mosaic-progress-bar.mjs +61 -61
  675. package/fesm2020/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
  676. package/fesm2020/ptsecurity-mosaic-progress-spinner.mjs +65 -65
  677. package/fesm2020/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
  678. package/fesm2020/ptsecurity-mosaic-radio.mjs +462 -462
  679. package/fesm2020/ptsecurity-mosaic-radio.mjs.map +1 -1
  680. package/fesm2020/ptsecurity-mosaic-select.mjs +1208 -1198
  681. package/fesm2020/ptsecurity-mosaic-select.mjs.map +1 -1
  682. package/fesm2020/ptsecurity-mosaic-sidebar.mjs +185 -185
  683. package/fesm2020/ptsecurity-mosaic-sidebar.mjs.map +1 -1
  684. package/fesm2020/ptsecurity-mosaic-sidepanel.mjs +552 -552
  685. package/fesm2020/ptsecurity-mosaic-sidepanel.mjs.map +1 -1
  686. package/fesm2020/ptsecurity-mosaic-splitter.mjs +511 -511
  687. package/fesm2020/ptsecurity-mosaic-splitter.mjs.map +1 -1
  688. package/fesm2020/ptsecurity-mosaic-table.mjs +36 -36
  689. package/fesm2020/ptsecurity-mosaic-table.mjs.map +1 -1
  690. package/fesm2020/ptsecurity-mosaic-tabs.mjs +1445 -1445
  691. package/fesm2020/ptsecurity-mosaic-tabs.mjs.map +1 -1
  692. package/fesm2020/ptsecurity-mosaic-tags.mjs +1335 -1335
  693. package/fesm2020/ptsecurity-mosaic-tags.mjs.map +1 -1
  694. package/fesm2020/ptsecurity-mosaic-textarea.mjs +272 -272
  695. package/fesm2020/ptsecurity-mosaic-textarea.mjs.map +1 -1
  696. package/fesm2020/ptsecurity-mosaic-timepicker.mjs +700 -711
  697. package/fesm2020/ptsecurity-mosaic-timepicker.mjs.map +1 -1
  698. package/fesm2020/ptsecurity-mosaic-toggle.mjs +163 -163
  699. package/fesm2020/ptsecurity-mosaic-toggle.mjs.map +1 -1
  700. package/fesm2020/ptsecurity-mosaic-tooltip.mjs +336 -336
  701. package/fesm2020/ptsecurity-mosaic-tooltip.mjs.map +1 -1
  702. package/fesm2020/ptsecurity-mosaic-tree-select.mjs +951 -941
  703. package/fesm2020/ptsecurity-mosaic-tree-select.mjs.map +1 -1
  704. package/fesm2020/ptsecurity-mosaic-tree.mjs +1683 -1669
  705. package/fesm2020/ptsecurity-mosaic-tree.mjs.map +1 -1
  706. package/fesm2020/ptsecurity-mosaic.mjs +2 -2
  707. package/form-field/cleaner.d.ts +7 -7
  708. package/form-field/form-field-control.d.ts +37 -37
  709. package/form-field/form-field-errors.d.ts +2 -2
  710. package/form-field/form-field.d.ts +69 -69
  711. package/form-field/form-field.module.d.ts +15 -15
  712. package/form-field/hint.d.ts +14 -6
  713. package/form-field/index.d.ts +1 -1
  714. package/form-field/password-hint.d.ts +40 -40
  715. package/form-field/prefix.d.ts +5 -5
  716. package/form-field/ptsecurity-mosaic-form-field.d.ts +5 -5
  717. package/form-field/public-api.d.ts +10 -10
  718. package/form-field/stepper.d.ts +11 -11
  719. package/form-field/suffix.d.ts +5 -5
  720. package/icon/icon.component.d.ts +18 -18
  721. package/icon/icon.module.d.ts +10 -10
  722. package/icon/index.d.ts +1 -1
  723. package/icon/ptsecurity-mosaic-icon.d.ts +5 -5
  724. package/icon/public-api.d.ts +2 -2
  725. package/index.d.ts +1 -1
  726. package/input/index.d.ts +1 -1
  727. package/input/input-errors.d.ts +1 -1
  728. package/input/input-number-validators.d.ts +39 -39
  729. package/input/input-number.d.ts +33 -33
  730. package/input/input-password.d.ts +123 -123
  731. package/input/input-value-accessor.d.ts +4 -4
  732. package/input/input.d.ts +116 -116
  733. package/input/input.module.d.ts +14 -14
  734. package/input/ptsecurity-mosaic-input.d.ts +5 -5
  735. package/input/public-api.d.ts +6 -6
  736. package/link/index.d.ts +1 -1
  737. package/link/link.component.d.ts +38 -38
  738. package/link/link.module.d.ts +9 -9
  739. package/link/ptsecurity-mosaic-link.d.ts +5 -5
  740. package/link/public-api.d.ts +2 -2
  741. package/list/index.d.ts +1 -1
  742. package/list/list-selection.component.d.ts +168 -168
  743. package/list/list.component.d.ts +18 -18
  744. package/list/list.module.d.ts +11 -11
  745. package/list/ptsecurity-mosaic-list.d.ts +5 -5
  746. package/list/public-api.d.ts +3 -3
  747. package/{toggle → loader-overlay}/README.md +0 -0
  748. package/loader-overlay/index.d.ts +1 -0
  749. package/loader-overlay/loader-overlay.component.d.ts +33 -0
  750. package/loader-overlay/loader-overlay.module.d.ts +11 -0
  751. package/loader-overlay/package.json +10 -0
  752. package/loader-overlay/ptsecurity-mosaic-loader-overlay.d.ts +5 -0
  753. package/loader-overlay/public-api.d.ts +2 -0
  754. package/modal/README.md +33 -33
  755. package/modal/css-unit.pipe.d.ts +7 -7
  756. package/modal/index.d.ts +1 -1
  757. package/modal/modal-control.service.d.ts +20 -20
  758. package/modal/modal-ref.class.d.ts +36 -36
  759. package/modal/modal-util.d.ts +12 -12
  760. package/modal/modal.component.d.ts +128 -126
  761. package/modal/modal.directive.d.ts +17 -17
  762. package/modal/modal.module.d.ts +14 -14
  763. package/modal/modal.service.d.ts +33 -33
  764. package/modal/modal.type.d.ts +60 -59
  765. package/modal/ptsecurity-mosaic-modal.d.ts +5 -5
  766. package/modal/public-api.d.ts +6 -6
  767. package/navbar/README.md +41 -41
  768. package/navbar/index.d.ts +1 -1
  769. package/navbar/navbar-item.component.d.ts +161 -161
  770. package/navbar/navbar.component.d.ts +58 -58
  771. package/navbar/navbar.module.d.ts +14 -14
  772. package/navbar/ptsecurity-mosaic-navbar.d.ts +5 -5
  773. package/navbar/public-api.d.ts +4 -4
  774. package/navbar/vertical-navbar.animation.d.ts +2 -2
  775. package/navbar/vertical-navbar.component.d.ts +23 -23
  776. package/package.json +12 -4
  777. package/popover/README.md +32 -32
  778. package/popover/index.d.ts +1 -1
  779. package/popover/popover-animations.d.ts +4 -4
  780. package/popover/popover-confirm.component.d.ts +33 -33
  781. package/popover/popover.component.d.ts +74 -74
  782. package/popover/popover.module.d.ts +12 -12
  783. package/popover/ptsecurity-mosaic-popover.d.ts +5 -5
  784. package/popover/public-api.d.ts +4 -4
  785. package/prebuilt-themes/dark-theme.css +1 -1
  786. package/prebuilt-themes/default-theme.css +1 -1
  787. package/progress-bar/index.d.ts +1 -1
  788. package/progress-bar/progress-bar.component.d.ts +18 -18
  789. package/progress-bar/progress-bar.module.d.ts +9 -9
  790. package/progress-bar/ptsecurity-mosaic-progress-bar.d.ts +5 -5
  791. package/progress-bar/public-api.d.ts +2 -2
  792. package/progress-spinner/index.d.ts +1 -1
  793. package/progress-spinner/progress-spinner.component.d.ts +19 -19
  794. package/progress-spinner/progress-spinner.module.d.ts +9 -9
  795. package/progress-spinner/ptsecurity-mosaic-progress-spinner.d.ts +5 -5
  796. package/progress-spinner/public-api.d.ts +2 -2
  797. package/ptsecurity-mosaic.d.ts +5 -5
  798. package/public-api.d.ts +1 -1
  799. package/radio/index.d.ts +1 -1
  800. package/radio/ptsecurity-mosaic-radio.d.ts +5 -5
  801. package/radio/public-api.d.ts +2 -2
  802. package/radio/radio.component.d.ts +207 -207
  803. package/radio/radio.module.d.ts +10 -10
  804. package/schematics/README.md +35 -35
  805. package/select/index.d.ts +1 -1
  806. package/select/ptsecurity-mosaic-select.d.ts +5 -5
  807. package/select/public-api.d.ts +3 -3
  808. package/select/select-option.directive.d.ts +20 -20
  809. package/select/select.component.d.ts +310 -307
  810. package/select/select.module.d.ts +15 -15
  811. package/sidebar/index.d.ts +1 -1
  812. package/sidebar/ptsecurity-mosaic-sidebar.d.ts +5 -5
  813. package/sidebar/public-api.d.ts +2 -2
  814. package/sidebar/sidebar-animations.d.ts +8 -8
  815. package/sidebar/sidebar.component.d.ts +53 -53
  816. package/sidebar/sidebar.module.d.ts +8 -8
  817. package/sidepanel/index.d.ts +1 -1
  818. package/sidepanel/ptsecurity-mosaic-sidepanel.d.ts +5 -5
  819. package/sidepanel/public-api.d.ts +6 -6
  820. package/sidepanel/sidepanel-animations.d.ts +14 -14
  821. package/sidepanel/sidepanel-config.d.ts +25 -25
  822. package/sidepanel/sidepanel-container.component.d.ts +45 -45
  823. package/sidepanel/sidepanel-directives.d.ts +50 -50
  824. package/sidepanel/sidepanel-ref.d.ts +24 -24
  825. package/sidepanel/sidepanel.module.d.ts +15 -15
  826. package/sidepanel/sidepanel.service.d.ts +57 -57
  827. package/splitter/index.d.ts +1 -1
  828. package/splitter/ptsecurity-mosaic-splitter.d.ts +5 -5
  829. package/splitter/public-api.d.ts +2 -2
  830. package/splitter/splitter.component.d.ts +130 -130
  831. package/splitter/splitter.module.d.ts +9 -9
  832. package/table/index.d.ts +1 -1
  833. package/table/ptsecurity-mosaic-table.d.ts +5 -5
  834. package/table/public-api.d.ts +2 -2
  835. package/table/table.component.d.ts +5 -5
  836. package/table/table.module.d.ts +10 -10
  837. package/tabs/index.d.ts +1 -1
  838. package/tabs/paginated-tab-header.d.ts +179 -179
  839. package/tabs/ptsecurity-mosaic-tabs.d.ts +5 -5
  840. package/tabs/public-api.d.ts +10 -10
  841. package/tabs/tab-body.component.d.ts +95 -95
  842. package/tabs/tab-content.directive.d.ts +9 -9
  843. package/tabs/tab-group.component.d.ts +133 -133
  844. package/tabs/tab-header.component.d.ts +35 -35
  845. package/tabs/tab-label-wrapper.directive.d.ts +30 -30
  846. package/tabs/tab-label.directive.d.ts +9 -9
  847. package/tabs/tab-nav-bar/index.d.ts +1 -1
  848. package/tabs/tab-nav-bar/tab-nav-bar.d.ts +38 -38
  849. package/tabs/tab.component.d.ts +66 -66
  850. package/tabs/tabs-animations.d.ts +4 -4
  851. package/tabs/tabs.module.d.ts +20 -20
  852. package/tags/index.d.ts +1 -1
  853. package/tags/ptsecurity-mosaic-tags.d.ts +5 -5
  854. package/tags/public-api.d.ts +5 -5
  855. package/tags/tag-default-options.d.ts +8 -8
  856. package/tags/tag-input.d.ts +77 -77
  857. package/tags/tag-list.component.d.ts +240 -240
  858. package/tags/tag-text-control.d.ts +10 -10
  859. package/tags/tag.component.d.ts +135 -135
  860. package/tags/tag.module.d.ts +11 -11
  861. package/textarea/index.d.ts +1 -1
  862. package/textarea/ptsecurity-mosaic-textarea.d.ts +5 -5
  863. package/textarea/public-api.d.ts +2 -2
  864. package/textarea/textarea.component.d.ts +111 -111
  865. package/textarea/textarea.module.d.ts +11 -11
  866. package/timepicker/index.d.ts +1 -1
  867. package/timepicker/ptsecurity-mosaic-timepicker.d.ts +5 -5
  868. package/timepicker/public-api.d.ts +3 -3
  869. package/timepicker/timepicker.constants.d.ts +20 -20
  870. package/timepicker/timepicker.directive.d.ts +146 -147
  871. package/timepicker/timepicker.module.d.ts +11 -11
  872. package/toggle/index.d.ts +1 -1
  873. package/toggle/ptsecurity-mosaic-toggle.d.ts +5 -5
  874. package/toggle/public-api.d.ts +2 -2
  875. package/toggle/toggle.component.d.ts +54 -54
  876. package/toggle/toggle.module.d.ts +10 -10
  877. package/tooltip/index.d.ts +1 -1
  878. package/tooltip/ptsecurity-mosaic-tooltip.d.ts +5 -5
  879. package/tooltip/public-api.d.ts +2 -2
  880. package/tooltip/tooltip.animations.d.ts +8 -8
  881. package/tooltip/tooltip.component.d.ts +91 -91
  882. package/tooltip/tooltip.module.d.ts +9 -9
  883. package/tree/control/base-tree-control.d.ts +40 -40
  884. package/tree/control/flat-tree-control.d.ts +52 -52
  885. package/tree/control/nested-tree-control.d.ts +19 -19
  886. package/tree/control/tree-control.d.ts +44 -44
  887. package/tree/data-source/flat-data-source.d.ts +80 -80
  888. package/tree/data-source/nested-data-source.d.ts +15 -15
  889. package/tree/index.d.ts +1 -1
  890. package/tree/node.d.ts +34 -34
  891. package/tree/outlet.d.ts +9 -9
  892. package/tree/padding.directive.d.ts +47 -45
  893. package/tree/ptsecurity-mosaic-tree.d.ts +5 -5
  894. package/tree/public-api.d.ts +15 -15
  895. package/tree/toggle.d.ts +28 -28
  896. package/tree/tree-base.d.ts +97 -97
  897. package/tree/tree-errors.d.ts +25 -25
  898. package/tree/tree-option.component.d.ts +72 -68
  899. package/tree/tree-selection.component.d.ts +132 -132
  900. package/tree/tree.d.ts +6 -6
  901. package/tree/tree.module.d.ts +16 -16
  902. package/tree-select/index.d.ts +1 -1
  903. package/tree-select/ptsecurity-mosaic-tree-select.d.ts +5 -5
  904. package/tree-select/public-api.d.ts +2 -2
  905. package/tree-select/tree-select.component.d.ts +277 -274
  906. package/tree-select/tree-select.module.d.ts +14 -14
@@ -1,501 +1,509 @@
1
- import { Overlay, OverlayRef } from '@angular/cdk/overlay';
2
- import { DOCUMENT } from '@angular/common';
3
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ComponentFactoryResolver, ElementRef, EventEmitter, Inject, Injector, Input, Output, QueryList, Renderer2, TemplateRef, Type, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation } from '@angular/core';
4
- import { ESCAPE, ENTER } from '@ptsecurity/cdk/keycodes';
5
- import { ThemePalette } from '@ptsecurity/mosaic/core';
6
- import { McModalControlService } from './modal-control.service';
7
- import { McModalRef } from './modal-ref.class';
8
- import { modalUtilObject as ModalUtil } from './modal-util';
9
- import { ModalSize } from './modal.type';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/cdk/overlay";
12
- import * as i2 from "./modal-control.service";
13
- import * as i3 from "@ptsecurity/mosaic/button";
14
- import * as i4 from "@ptsecurity/mosaic/icon";
15
- import * as i5 from "@angular/common";
16
- import * as i6 from "@angular/cdk/a11y";
17
- import * as i7 from "./modal.directive";
18
- import * as i8 from "./css-unit.pipe";
19
- // Duration when perform animations (ms)
20
- export const MODAL_ANIMATE_DURATION = 200;
21
- export class McModalComponent extends McModalRef {
22
- constructor(overlay, renderer, cfr, elementRef, viewContainer, modalControl, changeDetector, document) {
23
- super();
24
- this.overlay = overlay;
25
- this.renderer = renderer;
26
- this.cfr = cfr;
27
- this.elementRef = elementRef;
28
- this.viewContainer = viewContainer;
29
- this.modalControl = modalControl;
30
- this.changeDetector = changeDetector;
31
- this.document = document;
32
- this.themePalette = ThemePalette;
33
- this.mcModalType = 'default';
34
- this._mcVisible = false;
35
- this.mcVisibleChange = new EventEmitter();
36
- this.mcZIndex = 1000;
37
- this.mcSize = ModalSize.Normal;
38
- this.mcCloseByESC = true;
39
- this._mcClosable = true;
40
- this._mcMask = true;
41
- this._mcMaskClosable = false;
42
- // Trigger when modal open(visible) after animations
43
- this.mcAfterOpen = new EventEmitter();
44
- // Trigger when modal leave-animation over
45
- this.mcAfterClose = new EventEmitter();
46
- this.mcOkType = 'primary';
47
- this._mcOkLoading = false;
48
- this.mcOnOk = new EventEmitter();
49
- this._mcCancelLoading = false;
50
- this.mcOnCancel = new EventEmitter();
51
- this.isTopOverflow = false;
52
- this.isBottomOverflow = false;
53
- // The origin point that animation based on
54
- this.transformOrigin = '0px 0px 0px';
55
- this.mcGetContainer = () => this.overlay.create();
56
- }
57
- get mcVisible() { return this._mcVisible; }
58
- set mcVisible(value) { this._mcVisible = value; }
59
- get mcClosable() { return this._mcClosable; }
60
- set mcClosable(value) { this._mcClosable = value; }
61
- get mcMask() { return this._mcMask; }
62
- set mcMask(value) { this._mcMask = value; }
63
- get mcMaskClosable() { return this._mcMaskClosable; }
64
- set mcMaskClosable(value) { this._mcMaskClosable = value; }
65
- get mcOkLoading() { return this._mcOkLoading; }
66
- set mcOkLoading(value) { this._mcOkLoading = value; }
67
- get mcCancelLoading() { return this._mcCancelLoading; }
68
- set mcCancelLoading(value) { this._mcCancelLoading = value; }
69
- // Observable alias for mcAfterOpen
70
- get afterOpen() {
71
- return this.mcAfterOpen.asObservable();
72
- }
73
- // Observable alias for mcAfterClose
74
- get afterClose() {
75
- return this.mcAfterClose.asObservable();
76
- }
77
- get okText() {
78
- return this.mcOkText;
79
- }
80
- get cancelText() {
81
- return this.mcCancelText;
82
- }
83
- // Indicate whether this dialog should hidden
84
- get hidden() {
85
- return !this.mcVisible && !this.animationState;
86
- }
87
- ngOnInit() {
88
- // Create component along without View
89
- if (this.isComponent(this.mcContent)) {
90
- this.createDynamicComponent(this.mcContent);
91
- }
92
- // Setup default button options
93
- if (this.isModalButtons(this.mcFooter)) {
94
- this.mcFooter = this.formatModalButtons(this.mcFooter);
95
- }
96
- if (this.isComponent(this.mcComponent)) {
97
- this.createDynamicComponent(this.mcComponent);
98
- }
99
- // Place the modal dom to elsewhere
100
- this.container = typeof this.mcGetContainer === 'function' ? this.mcGetContainer() : this.mcGetContainer;
101
- if (this.container instanceof HTMLElement) {
102
- this.container.appendChild(this.elementRef.nativeElement);
103
- }
104
- else if (this.container instanceof OverlayRef) {
105
- // NOTE: only attach the dom to overlay, the view container is not changed actually
106
- this.container.overlayElement.appendChild(this.elementRef.nativeElement);
107
- }
108
- // Register modal when afterOpen/afterClose is stable
109
- this.modalControl.registerModal(this);
110
- }
111
- // [NOTE] NOT available when using by service!
112
- // Because ngOnChanges never be called when using by service,
113
- // here we can't support "mcContent"(Component) etc. as inputs that initialized dynamically.
114
- // BUT: User also can change "mcContent" dynamically to trigger UI changes
115
- // (provided you don't use Component that needs initializations)
116
- ngOnChanges(changes) {
117
- if (changes.mcVisible) {
118
- // Do not trigger animation while initializing
119
- this.handleVisibleStateChange(this.mcVisible, !changes.mcVisible.firstChange);
120
- }
121
- }
122
- ngAfterViewInit() {
123
- // If using Component, it is the time to attach View while bodyContainer is ready
124
- if (this.contentComponentRef) {
125
- this.bodyContainer.insert(this.contentComponentRef.hostView);
126
- }
127
- this.getElement().getElementsByTagName('button')[0]?.focus();
128
- for (const autoFocusedButton of this.autoFocusedButtons.toArray()) {
129
- if (autoFocusedButton.nativeElement.autofocus) {
130
- autoFocusedButton.nativeElement.focus();
131
- break;
132
- }
133
- }
134
- this.checkOverflow();
135
- }
136
- ngOnDestroy() {
137
- if (this.container instanceof OverlayRef) {
138
- this.container.dispose();
139
- }
140
- }
141
- checkOverflow() {
142
- const nativeElement = this.modalBody?.nativeElement;
143
- if (!nativeElement) {
144
- return;
145
- }
146
- const scrollTop = nativeElement.scrollTop;
147
- const offsetHeight = nativeElement.offsetHeight;
148
- const scrollHeight = nativeElement.scrollHeight;
149
- this.isTopOverflow = scrollTop > 0;
150
- this.isBottomOverflow = scrollTop + offsetHeight < scrollHeight;
151
- }
152
- open() {
153
- this.changeVisibleFromInside(true);
154
- }
155
- close(result) {
156
- this.changeVisibleFromInside(false, result);
157
- }
158
- // Destroy equals Close
159
- destroy(result) {
160
- this.close(result);
161
- }
162
- markForCheck() {
163
- this.changeDetector.markForCheck();
164
- }
165
- triggerOk() {
166
- this.onClickOkCancel('ok');
167
- }
168
- triggerCancel() {
169
- this.onClickOkCancel('cancel');
170
- }
171
- getInstance() {
172
- return this;
173
- }
174
- getContentComponentRef() {
175
- return this.contentComponentRef;
176
- }
177
- getContentComponent() {
178
- return this.contentComponentRef && this.contentComponentRef.instance;
179
- }
180
- getElement() {
181
- return this.elementRef && this.elementRef.nativeElement;
182
- }
183
- getMcFooter() {
184
- return this.getElement().getElementsByClassName('mc-modal-footer').item(0);
185
- }
186
- onClickMask($event) {
187
- if (this.mcMask &&
188
- this.mcMaskClosable &&
189
- $event.target.classList.contains('mc-modal-wrap') &&
190
- this.mcVisible) {
191
- this.onClickOkCancel('cancel');
192
- }
193
- }
194
- // tslint:disable-next-line: no-reserved-keywords
195
- isModalType(type) {
196
- return this.mcModalType === type;
197
- }
198
- onKeyDown(event) {
199
- // tslint:disable-next-line:deprecation .key isn't supported in Edge
200
- if (event.keyCode === ESCAPE && this.container && (this.container instanceof OverlayRef)) {
201
- this.close();
202
- event.preventDefault();
203
- }
204
- // tslint:disable-next-line:deprecation .key isn't supported in Edge
205
- if (event.ctrlKey && event.keyCode === ENTER) {
206
- if (this.mcModalType === 'confirm') {
207
- this.triggerOk();
208
- }
209
- this.getElement().querySelector('[mc-modal-main-action]')?.click();
210
- event.preventDefault();
211
- }
212
- }
213
- // AoT
214
- onClickCloseBtn() {
215
- if (this.mcVisible) {
216
- this.onClickOkCancel('cancel');
217
- }
218
- }
219
- // AoT
220
- // tslint:disable-next-line: no-reserved-keywords
221
- onClickOkCancel(type) {
222
- const trigger = { ok: this.mcOnOk, cancel: this.mcOnCancel }[type];
223
- const loadingKey = { ok: 'mcOkLoading', cancel: 'mcCancelLoading' }[type];
224
- if (trigger instanceof EventEmitter) {
225
- trigger.emit(this.getContentComponent());
226
- }
227
- else if (typeof trigger === 'function') {
228
- const result = trigger(this.getContentComponent());
229
- // Users can return "false" to prevent closing by default
230
- const caseClose = (doClose) => (doClose !== false) && this.close(doClose);
231
- if (isPromise(result)) {
232
- this[loadingKey] = true;
233
- const handleThen = (doClose) => {
234
- this[loadingKey] = false;
235
- caseClose(doClose);
236
- };
237
- result.then(handleThen).catch(handleThen);
238
- }
239
- else {
240
- caseClose(result);
241
- }
242
- }
243
- }
244
- // AoT
245
- isNonEmptyString(value) {
246
- return typeof value === 'string' && value !== '';
247
- }
248
- // AoT
249
- isTemplateRef(value) {
250
- return value instanceof TemplateRef;
251
- }
252
- // AoT
253
- isComponent(value) {
254
- return value instanceof Type;
255
- }
256
- // AoT
257
- isModalButtons(value) {
258
- return Array.isArray(value) && value.length > 0;
259
- }
260
- // Lookup a button's property, if the prop is a function, call & then return the result, otherwise, return itself.
261
- // AoT
262
- getButtonCallableProp(options, prop) {
263
- const value = options[prop];
264
- const args = [];
265
- if (this.contentComponentRef) {
266
- args.push(this.contentComponentRef.instance);
267
- }
268
- return typeof value === 'function' ? value.apply(options, args) : value;
269
- }
270
- // On mcFooter's modal button click
271
- // AoT
272
- onButtonClick(button) {
273
- // Call onClick directly
274
- // tslint:disable-next-line:no-inferred-empty-object-type rule seems to be broken
275
- const result = this.getButtonCallableProp(button, 'onClick');
276
- if (isPromise(result)) {
277
- button.loading = true;
278
- result.then(() => button.loading = false).catch(() => button.loading = false);
279
- }
280
- }
281
- // Do rest things when visible state changed
282
- handleVisibleStateChange(visible, animation = true, closeResult) {
283
- // Hide scrollbar at the first time when shown up
284
- if (visible) {
285
- this.changeBodyOverflow(1);
286
- }
287
- return Promise
288
- .resolve(animation && this.animateTo(visible))
289
- // Emit open/close event after animations over
290
- .then(() => {
291
- if (visible) {
292
- this.mcAfterOpen.emit();
293
- }
294
- else {
295
- this.mcAfterClose.emit(closeResult);
296
- // Show/hide scrollbar when animation is over
297
- this.changeBodyOverflow();
298
- }
299
- });
300
- }
301
- // Change mcVisible from inside
302
- changeVisibleFromInside(visible, closeResult) {
303
- if (this.mcVisible !== visible) {
304
- // Change mcVisible value immediately
305
- this.mcVisible = visible;
306
- this.mcVisibleChange.emit(visible);
307
- return this.handleVisibleStateChange(visible, true, closeResult);
308
- }
309
- return Promise.resolve();
310
- }
311
- changeAnimationState(state) {
312
- this.animationState = state;
313
- if (state) {
314
- this.maskAnimationClassMap = {
315
- [`fade-${state}`]: true,
316
- [`fade-${state}-active`]: true
317
- };
318
- this.modalAnimationClassMap = {
319
- [`zoom-${state}`]: true,
320
- [`zoom-${state}-active`]: true
321
- };
322
- }
323
- else {
324
- // @ts-ignore
325
- this.maskAnimationClassMap = this.modalAnimationClassMap = null;
326
- }
327
- if (this.contentComponentRef) {
328
- this.contentComponentRef.changeDetectorRef.markForCheck();
329
- }
330
- else {
331
- this.changeDetector.markForCheck();
332
- }
333
- }
334
- animateTo(isVisible) {
335
- // Figure out the lastest click position when shows up
336
- if (isVisible) {
337
- // [NOTE] Using timeout due to the document.click event is fired later than visible change,
338
- // so if not postponed to next event-loop, we can't get the lastest click position
339
- window.setTimeout(() => this.updateTransformOrigin());
340
- }
341
- this.changeAnimationState(isVisible ? 'enter' : 'leave');
342
- // Return when animation is over
343
- return new Promise((resolve) => {
344
- return window.setTimeout(() => {
345
- this.changeAnimationState(null);
346
- resolve(null);
347
- }, MODAL_ANIMATE_DURATION);
348
- });
349
- }
350
- formatModalButtons(buttons) {
351
- return buttons.map((button) => {
352
- return {
353
- ...{
354
- type: 'default',
355
- size: 'default',
356
- autoLoading: true,
357
- show: true,
358
- loading: false,
359
- disabled: false
360
- },
361
- ...button
362
- };
363
- });
364
- }
365
- /**
366
- * Create a component dynamically but not attach to any View
367
- * (this action will be executed when bodyContainer is ready)
368
- * @param component Component class
369
- */
370
- createDynamicComponent(component) {
371
- const factory = this.cfr.resolveComponentFactory(component);
372
- const childInjector = Injector.create({
373
- providers: [{ provide: McModalRef, useValue: this }],
374
- parent: this.viewContainer.injector
375
- });
376
- this.contentComponentRef = factory.create(childInjector);
377
- if (this.mcComponentParams) {
378
- Object.assign(this.contentComponentRef.instance, this.mcComponentParams);
379
- }
380
- // Do the first change detection immediately
381
- // (or we do detection at ngAfterViewInit, multi-changes error will be thrown)
382
- this.contentComponentRef.changeDetectorRef.detectChanges();
383
- }
384
- // Update transform-origin to the last click position on document
385
- updateTransformOrigin() {
386
- const modalElement = this.modalContainer.nativeElement;
387
- const lastPosition = ModalUtil.getLastClickPosition();
388
- if (lastPosition) {
389
- this.transformOrigin = `${lastPosition.x - modalElement.offsetLeft}px ${lastPosition.y - modalElement.offsetTop}px 0px`;
390
- }
391
- }
392
- /**
393
- * Take care of the body's overflow to decide the existense of scrollbar
394
- * @param plusNum The number that the openModals.length will increase soon
395
- */
396
- changeBodyOverflow(plusNum = 0) {
397
- const openModals = this.modalControl.openModals;
398
- if (openModals.length + plusNum > 0) {
399
- this.renderer.setStyle(this.document.body, 'overflow', 'hidden');
400
- }
401
- else {
402
- this.renderer.removeStyle(this.document.body, 'overflow');
403
- }
404
- }
405
- }
406
- /** @nocollapse */ /** @nocollapse */ McModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McModalComponent, deps: [{ token: i1.Overlay }, { token: i0.Renderer2 }, { token: i0.ComponentFactoryResolver }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i2.McModalControlService }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
407
- /** @nocollapse */ /** @nocollapse */ McModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.7", type: McModalComponent, selector: "mc-modal", inputs: { mcModalType: "mcModalType", mcComponent: "mcComponent", mcContent: "mcContent", mcComponentParams: "mcComponentParams", mcFooter: "mcFooter", mcVisible: "mcVisible", mcZIndex: "mcZIndex", mcWidth: "mcWidth", mcSize: "mcSize", mcWrapClassName: "mcWrapClassName", mcClassName: "mcClassName", mcStyle: "mcStyle", mcTitle: "mcTitle", mcCloseByESC: "mcCloseByESC", mcClosable: "mcClosable", mcMask: "mcMask", mcMaskClosable: "mcMaskClosable", mcMaskStyle: "mcMaskStyle", mcBodyStyle: "mcBodyStyle", mcOkText: "mcOkText", mcOkType: "mcOkType", mcOkLoading: "mcOkLoading", mcOnOk: "mcOnOk", mcCancelText: "mcCancelText", mcCancelLoading: "mcCancelLoading", mcOnCancel: "mcOnCancel", mcGetContainer: "mcGetContainer" }, outputs: { mcVisibleChange: "mcVisibleChange", mcAfterOpen: "mcAfterOpen", mcAfterClose: "mcAfterClose", mcOnOk: "mcOnOk", mcOnCancel: "mcOnCancel" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, viewQueries: [{ propertyName: "modalContainer", first: true, predicate: ["modalContainer"], descendants: true, static: true }, { propertyName: "bodyContainer", first: true, predicate: ["bodyContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "modalBody", first: true, predicate: ["modalBody"], descendants: true }, { propertyName: "autoFocusedButtons", predicate: ["autoFocusedButton"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<!-- Compatible: the <ng-content> can appear only once -->\r\n<ng-template #tplOriginContent>\r\n <ng-content></ng-content>\r\n</ng-template>\r\n\r\n<div>\r\n <div *ngIf=\"mcMask\"\r\n class=\"mc-modal-mask\"\r\n [ngClass]=\"maskAnimationClassMap\"\r\n [class.mc-modal-mask-hidden]=\"hidden\"\r\n [ngStyle]=\"mcMaskStyle\"\r\n [style.zIndex]=\"mcZIndex\"\r\n ></div>\r\n <div (mousedown)=\"onClickMask($event)\"\r\n class=\"mc-modal-wrap {{ mcWrapClassName }}\"\r\n [style.zIndex]=\"mcZIndex\"\r\n [style.display]=\"hidden ? 'none' : ''\"\r\n tabindex=\"-1\">\r\n\r\n <div #modalContainer\r\n class=\"mc-modal {{ mcClassName }} mc-modal_{{ mcSize }}\"\r\n [ngClass]=\"modalAnimationClassMap\"\r\n [ngStyle]=\"mcStyle\"\r\n [style.width]=\"mcWidth | toCssUnit\"\r\n [style.transform-origin]=\"transformOrigin\">\r\n\r\n <div class=\"mc-modal-content\" cdkTrapFocus>\r\n <button *ngIf=\"mcClosable\"\r\n mc-button\r\n (click)=\"onClickCloseBtn()\"\r\n class=\"mc-modal-close mc-button_transparent\">\r\n <i mc-icon=\"mc-close-L_16\" class=\"mc-icon mc-icon_light\" [color]=\"themePalette.Second\"></i>\r\n </button>\r\n <ng-container [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isModalType('default')\"\r\n [ngTemplateOutlet]=\"tplContentDefault\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isModalType('confirm')\"\r\n [ngTemplateOutlet]=\"tplContentConfirm\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isModalType('custom')\"\r\n [ngTemplateOutlet]=\"tplContentCustom\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #tplContentCustom>\r\n <ng-container #bodyContainer></ng-container>\r\n</ng-template>\r\n\r\n\r\n<!-- [Predefined] Default Modal Content -->\r\n<ng-template #tplContentDefault>\r\n <div *ngIf=\"mcTitle\" class=\"mc-modal-header\" [class.mc-modal-body_top-overflow]=\"isTopOverflow\">\r\n <div class=\"mc-modal-title\">\r\n <ng-container [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isTemplateRef(mcTitle)\" [ngTemplateOutlet]=\"$any(mcTitle)\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcTitle)\">\r\n <div [innerHTML]=\"mcTitle\"></div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"mc-modal-body\" #modalBody [ngStyle]=\"mcBodyStyle\" (scroll)=\"checkOverflow()\">\r\n <ng-container #bodyContainer>\r\n <ng-container *ngIf=\"!isComponent(mcContent)\" [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isTemplateRef(mcContent)\" [ngTemplateOutlet]=\"$any(mcContent)\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcContent)\">\r\n <div [innerHTML]=\"mcContent\"></div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"tplOriginContent\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"mcFooter || mcOkText || mcCancelText\" class=\"mc-modal-footer\" [class.mc-modal-body_bottom-overflow]=\"isBottomOverflow\">\r\n <ng-container [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isTemplateRef(mcFooter)\" [ngTemplateOutlet]=\"$any(mcFooter)\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcFooter)\">\r\n <div [innerHTML]=\"mcFooter\"></div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"isModalButtons(mcFooter)\">\r\n <ng-container *ngFor=\"let button of $any(mcFooter)\">\r\n <button\r\n mc-button\r\n #autoFocusedButton\r\n [attr.autofocus]=\"button.autoFocus\"\r\n [attr.mc-modal-main-action]=\"button.mcModalMainAction\"\r\n *ngIf=\"getButtonCallableProp(button, 'show')\"\r\n [disabled]=\"getButtonCallableProp(button, 'disabled')\"\r\n [class.mc-progress]=\"getButtonCallableProp(button, 'loading')\"\r\n (click)=\"onButtonClick(button)\"\r\n [color]=\"button.type\">\r\n {{ button.label }}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <button\r\n #autoFocusedButton\r\n [attr.autofocus]=\"true\"\r\n *ngIf=\"mcOkText\"\r\n mc-button\r\n [color]=\"themePalette.Primary\"\r\n (click)=\"onClickOkCancel('ok')\">\r\n\r\n {{ okText }}\r\n </button>\r\n <button *ngIf=\"mcCancelText\" mc-button (click)=\"onClickOkCancel('cancel')\">\r\n {{ cancelText }}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<!-- /[Predefined] Default Modal Content -->\r\n\r\n<!-- [Predefined] Confirm Modal Content -->\r\n<ng-template #tplContentConfirm>\r\n <div class=\"mc-modal-body\" [ngStyle]=\"mcBodyStyle\">\r\n <div class=\"mc-confirm-body-wrapper\">\r\n <div class=\"mc-confirm-body\">\r\n <div class=\"mc-confirm-content\">\r\n <ng-container #bodyContainer>\r\n <ng-container *ngIf=\"!isComponent(mcContent)\" [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isTemplateRef(mcContent)\"\r\n [ngTemplateOutlet]=\"$any(mcContent)\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcContent)\">\r\n <div [innerHTML]=\"mcContent\"></div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"tplOriginContent\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div> <!-- /.mc-confirm-body-wrapper -->\r\n </div>\r\n <div class=\"mc-confirm-btns\" *ngIf=\"mcOkText || mcCancelText\">\r\n <button\r\n mc-button\r\n #autoFocusedButton\r\n [color]=\"mcOkType\"\r\n [attr.autofocus]=\"true\"\r\n *ngIf=\"mcOkText\"\r\n (click)=\"onClickOkCancel('ok')\">\r\n\r\n {{ okText }}\r\n </button>\r\n\r\n <button mc-button [color]=\"themePalette.Second\" *ngIf=\"mcCancelText\" (click)=\"onClickOkCancel('cancel')\">\r\n {{ cancelText }}\r\n </button>\r\n </div>\r\n</ng-template>\r\n<!-- /[Predefined] Confirm Modal Content -->\r\n", styles: [".mc-confirm .mc-modal-header,.mc-confirm .mc-modal-close{display:none}.mc-confirm .mc-modal-body{padding:var(--mc-modal-confirm-size-padding, 24px)}.mc-confirm-body-wrapper{zoom:1}.mc-confirm-body-wrapper:before,.mc-confirm-body-wrapper:after{content:\"\";display:table}.mc-confirm-body-wrapper:after{clear:both}.mc-confirm-body .mc-confirm-title{display:block;overflow:auto}.mc-confirm .mc-confirm-btns{border-radius:var(--mc-modal-footer-size-border-radius, 0 0 4px 4px);text-align:right}.mc-confirm .mc-confirm-btns button+button{margin:16px}.mc-modal{box-sizing:border-box;position:relative;top:var(--mc-modal-size-top, 48px);width:auto;margin:0 auto;list-style:none}.mc-modal.zoom-enter,.mc-modal.zoom-appear{animation-duration:.3s;transform:none;opacity:0}.mc-modal.mc-modal_small{width:var(--mc-modal-size-small, 400px)}.mc-modal.mc-modal_normal{width:var(--mc-modal-size-normal, 640px)}.mc-modal.mc-modal_large{width:var(--mc-modal-size-large, 960px)}.mc-modal .mc-modal-close{position:absolute;z-index:10;top:0;right:0;width:var(--mc-modal-size-close-width, 56px);height:var(--mc-modal-size-close-width, 56px)}.mc-modal-wrap{position:fixed;z-index:1000;top:0;right:0;bottom:0;left:0;overflow:auto;-webkit-overflow-scrolling:touch;outline:0}.mc-modal-title{margin:0}.mc-modal-content{position:relative;border-radius:var(--mc-modal-size-border-radius, 4px);background-clip:padding-box;background-color:#fff}.mc-modal-header{display:flex;align-items:center;height:var(--mc-modal-header-size-height, 56px);border-radius:var(--mc-modal-header-size-border-radius, 4px 4px 0 0);padding:var(--mc-modal-header-size-padding, 0 16px)}.mc-modal-body{display:block;overflow-y:auto;max-height:var(--mc-modal-body-size-max-height, calc(100vh - 260px));padding:var(--mc-modal-body-size-padding, 16px 24px 24px);word-wrap:break-word}.mc-modal-footer{display:flex;align-items:center;justify-content:right;height:var(--mc-modal-footer-size-height, 64px);border-radius:var(--mc-modal-footer-size-border-radius, 0 0 4px 4px);padding:var(--mc-modal-footer-size-padding, 0 16px)}.mc-modal-footer button+button{margin-left:16px;margin-bottom:0}.mc-modal-mask{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0;height:100%}.mc-modal-mask.mc-modal-mask-hidden{display:none}.mc-modal-open{overflow:hidden}\n"], components: [{ type: i3.McButton, selector: "[mc-button]", inputs: ["color", "tabIndex", "disabled"] }, { type: i4.McIcon, selector: "[mc-icon]", inputs: ["color"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { type: i3.McButtonCssStyler, selector: "[mc-button]" }, { type: i4.McIconCSSStyler, selector: "[mc-icon]" }, { type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.McModalMainAction, selector: "[mc-modal-main-action]" }], pipes: { "toCssUnit": i8.CssUnitPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
408
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.7", ngImport: i0, type: McModalComponent, decorators: [{
409
- type: Component,
410
- args: [{ selector: 'mc-modal', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
411
- '(keydown)': 'onKeyDown($event)'
412
- }, template: "<!-- Compatible: the <ng-content> can appear only once -->\r\n<ng-template #tplOriginContent>\r\n <ng-content></ng-content>\r\n</ng-template>\r\n\r\n<div>\r\n <div *ngIf=\"mcMask\"\r\n class=\"mc-modal-mask\"\r\n [ngClass]=\"maskAnimationClassMap\"\r\n [class.mc-modal-mask-hidden]=\"hidden\"\r\n [ngStyle]=\"mcMaskStyle\"\r\n [style.zIndex]=\"mcZIndex\"\r\n ></div>\r\n <div (mousedown)=\"onClickMask($event)\"\r\n class=\"mc-modal-wrap {{ mcWrapClassName }}\"\r\n [style.zIndex]=\"mcZIndex\"\r\n [style.display]=\"hidden ? 'none' : ''\"\r\n tabindex=\"-1\">\r\n\r\n <div #modalContainer\r\n class=\"mc-modal {{ mcClassName }} mc-modal_{{ mcSize }}\"\r\n [ngClass]=\"modalAnimationClassMap\"\r\n [ngStyle]=\"mcStyle\"\r\n [style.width]=\"mcWidth | toCssUnit\"\r\n [style.transform-origin]=\"transformOrigin\">\r\n\r\n <div class=\"mc-modal-content\" cdkTrapFocus>\r\n <button *ngIf=\"mcClosable\"\r\n mc-button\r\n (click)=\"onClickCloseBtn()\"\r\n class=\"mc-modal-close mc-button_transparent\">\r\n <i mc-icon=\"mc-close-L_16\" class=\"mc-icon mc-icon_light\" [color]=\"themePalette.Second\"></i>\r\n </button>\r\n <ng-container [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isModalType('default')\"\r\n [ngTemplateOutlet]=\"tplContentDefault\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isModalType('confirm')\"\r\n [ngTemplateOutlet]=\"tplContentConfirm\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isModalType('custom')\"\r\n [ngTemplateOutlet]=\"tplContentCustom\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #tplContentCustom>\r\n <ng-container #bodyContainer></ng-container>\r\n</ng-template>\r\n\r\n\r\n<!-- [Predefined] Default Modal Content -->\r\n<ng-template #tplContentDefault>\r\n <div *ngIf=\"mcTitle\" class=\"mc-modal-header\" [class.mc-modal-body_top-overflow]=\"isTopOverflow\">\r\n <div class=\"mc-modal-title\">\r\n <ng-container [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isTemplateRef(mcTitle)\" [ngTemplateOutlet]=\"$any(mcTitle)\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcTitle)\">\r\n <div [innerHTML]=\"mcTitle\"></div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"mc-modal-body\" #modalBody [ngStyle]=\"mcBodyStyle\" (scroll)=\"checkOverflow()\">\r\n <ng-container #bodyContainer>\r\n <ng-container *ngIf=\"!isComponent(mcContent)\" [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isTemplateRef(mcContent)\" [ngTemplateOutlet]=\"$any(mcContent)\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcContent)\">\r\n <div [innerHTML]=\"mcContent\"></div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"tplOriginContent\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"mcFooter || mcOkText || mcCancelText\" class=\"mc-modal-footer\" [class.mc-modal-body_bottom-overflow]=\"isBottomOverflow\">\r\n <ng-container [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isTemplateRef(mcFooter)\" [ngTemplateOutlet]=\"$any(mcFooter)\"></ng-container>\r\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcFooter)\">\r\n <div [innerHTML]=\"mcFooter\"></div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"isModalButtons(mcFooter)\">\r\n <ng-container *ngFor=\"let button of $any(mcFooter)\">\r\n <button\r\n mc-button\r\n #autoFocusedButton\r\n [attr.autofocus]=\"button.autoFocus\"\r\n [attr.mc-modal-main-action]=\"button.mcModalMainAction\"\r\n *ngIf=\"getButtonCallableProp(button, 'show')\"\r\n [disabled]=\"getButtonCallableProp(button, 'disabled')\"\r\n [class.mc-progress]=\"getButtonCallableProp(button, 'loading')\"\r\n (click)=\"onButtonClick(button)\"\r\n [color]=\"button.type\">\r\n {{ button.label }}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <button\r\n #autoFocusedButton\r\n [attr.autofocus]=\"true\"\r\n *ngIf=\"mcOkText\"\r\n mc-button\r\n [color]=\"themePalette.Primary\"\r\n (click)=\"onClickOkCancel('ok')\">\r\n\r\n {{ okText }}\r\n </button>\r\n <button *ngIf=\"mcCancelText\" mc-button (click)=\"onClickOkCancel('cancel')\">\r\n {{ cancelText }}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<!-- /[Predefined] Default Modal Content -->\r\n\r\n<!-- [Predefined] Confirm Modal Content -->\r\n<ng-template #tplContentConfirm>\r\n <div class=\"mc-modal-body\" [ngStyle]=\"mcBodyStyle\">\r\n <div class=\"mc-confirm-body-wrapper\">\r\n <div class=\"mc-confirm-body\">\r\n <div class=\"mc-confirm-content\">\r\n <ng-container #bodyContainer>\r\n <ng-container *ngIf=\"!isComponent(mcContent)\" [ngSwitch]=\"true\">\r\n <ng-container *ngSwitchCase=\"isTemplateRef(mcContent)\"\r\n [ngTemplateOutlet]=\"$any(mcContent)\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcContent)\">\r\n <div [innerHTML]=\"mcContent\"></div>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"tplOriginContent\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div> <!-- /.mc-confirm-body-wrapper -->\r\n </div>\r\n <div class=\"mc-confirm-btns\" *ngIf=\"mcOkText || mcCancelText\">\r\n <button\r\n mc-button\r\n #autoFocusedButton\r\n [color]=\"mcOkType\"\r\n [attr.autofocus]=\"true\"\r\n *ngIf=\"mcOkText\"\r\n (click)=\"onClickOkCancel('ok')\">\r\n\r\n {{ okText }}\r\n </button>\r\n\r\n <button mc-button [color]=\"themePalette.Second\" *ngIf=\"mcCancelText\" (click)=\"onClickOkCancel('cancel')\">\r\n {{ cancelText }}\r\n </button>\r\n </div>\r\n</ng-template>\r\n<!-- /[Predefined] Confirm Modal Content -->\r\n", styles: [".mc-confirm .mc-modal-header,.mc-confirm .mc-modal-close{display:none}.mc-confirm .mc-modal-body{padding:var(--mc-modal-confirm-size-padding, 24px)}.mc-confirm-body-wrapper{zoom:1}.mc-confirm-body-wrapper:before,.mc-confirm-body-wrapper:after{content:\"\";display:table}.mc-confirm-body-wrapper:after{clear:both}.mc-confirm-body .mc-confirm-title{display:block;overflow:auto}.mc-confirm .mc-confirm-btns{border-radius:var(--mc-modal-footer-size-border-radius, 0 0 4px 4px);text-align:right}.mc-confirm .mc-confirm-btns button+button{margin:16px}.mc-modal{box-sizing:border-box;position:relative;top:var(--mc-modal-size-top, 48px);width:auto;margin:0 auto;list-style:none}.mc-modal.zoom-enter,.mc-modal.zoom-appear{animation-duration:.3s;transform:none;opacity:0}.mc-modal.mc-modal_small{width:var(--mc-modal-size-small, 400px)}.mc-modal.mc-modal_normal{width:var(--mc-modal-size-normal, 640px)}.mc-modal.mc-modal_large{width:var(--mc-modal-size-large, 960px)}.mc-modal .mc-modal-close{position:absolute;z-index:10;top:0;right:0;width:var(--mc-modal-size-close-width, 56px);height:var(--mc-modal-size-close-width, 56px)}.mc-modal-wrap{position:fixed;z-index:1000;top:0;right:0;bottom:0;left:0;overflow:auto;-webkit-overflow-scrolling:touch;outline:0}.mc-modal-title{margin:0}.mc-modal-content{position:relative;border-radius:var(--mc-modal-size-border-radius, 4px);background-clip:padding-box;background-color:#fff}.mc-modal-header{display:flex;align-items:center;height:var(--mc-modal-header-size-height, 56px);border-radius:var(--mc-modal-header-size-border-radius, 4px 4px 0 0);padding:var(--mc-modal-header-size-padding, 0 16px)}.mc-modal-body{display:block;overflow-y:auto;max-height:var(--mc-modal-body-size-max-height, calc(100vh - 260px));padding:var(--mc-modal-body-size-padding, 16px 24px 24px);word-wrap:break-word}.mc-modal-footer{display:flex;align-items:center;justify-content:right;height:var(--mc-modal-footer-size-height, 64px);border-radius:var(--mc-modal-footer-size-border-radius, 0 0 4px 4px);padding:var(--mc-modal-footer-size-padding, 0 16px)}.mc-modal-footer button+button{margin-left:16px;margin-bottom:0}.mc-modal-mask{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0;height:100%}.mc-modal-mask.mc-modal-mask-hidden{display:none}.mc-modal-open{overflow:hidden}\n"] }]
413
- }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Renderer2 }, { type: i0.ComponentFactoryResolver }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i2.McModalControlService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
414
- type: Inject,
415
- args: [DOCUMENT]
416
- }] }]; }, propDecorators: { mcModalType: [{
417
- type: Input
418
- }], mcComponent: [{
419
- type: Input
420
- }], mcContent: [{
421
- type: Input
422
- }], mcComponentParams: [{
423
- type: Input
424
- }], mcFooter: [{
425
- type: Input
426
- }], mcVisible: [{
427
- type: Input
428
- }], mcVisibleChange: [{
429
- type: Output
430
- }], mcZIndex: [{
431
- type: Input
432
- }], mcWidth: [{
433
- type: Input
434
- }], mcSize: [{
435
- type: Input
436
- }], mcWrapClassName: [{
437
- type: Input
438
- }], mcClassName: [{
439
- type: Input
440
- }], mcStyle: [{
441
- type: Input
442
- }], mcTitle: [{
443
- type: Input
444
- }], mcCloseByESC: [{
445
- type: Input
446
- }], mcClosable: [{
447
- type: Input
448
- }], mcMask: [{
449
- type: Input
450
- }], mcMaskClosable: [{
451
- type: Input
452
- }], mcMaskStyle: [{
453
- type: Input
454
- }], mcBodyStyle: [{
455
- type: Input
456
- }], mcAfterOpen: [{
457
- type: Output
458
- }], mcAfterClose: [{
459
- type: Output
460
- }], mcOkText: [{
461
- type: Input
462
- }], mcOkType: [{
463
- type: Input
464
- }], mcOkLoading: [{
465
- type: Input
466
- }], mcOnOk: [{
467
- type: Input
468
- }, {
469
- type: Output
470
- }], mcCancelText: [{
471
- type: Input
472
- }], mcCancelLoading: [{
473
- type: Input
474
- }], mcOnCancel: [{
475
- type: Input
476
- }, {
477
- type: Output
478
- }], modalContainer: [{
479
- type: ViewChild,
480
- args: ['modalContainer', { static: true }]
481
- }], bodyContainer: [{
482
- type: ViewChild,
483
- args: ['bodyContainer', { read: ViewContainerRef, static: false }]
484
- }], autoFocusedButtons: [{
485
- type: ViewChildren,
486
- args: ['autoFocusedButton', { read: ElementRef }]
487
- }], modalBody: [{
488
- type: ViewChild,
489
- args: ['modalBody']
490
- }], mcGetContainer: [{
491
- type: Input
492
- }] } });
493
- ////////////
494
- function isPromise(obj) {
495
- // tslint:disable-next-line: no-unbound-method
496
- return !!obj &&
497
- (typeof obj === 'object' || typeof obj === 'function') &&
498
- typeof obj.then === 'function' &&
499
- typeof obj.catch === 'function';
500
- }
501
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbW9zYWljL21vZGFsL21vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21vc2FpYy9tb2RhbC9tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1Qsd0JBQXdCLEVBRXhCLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBRVQsV0FBVyxFQUNYLElBQUksRUFDSixTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLElBQUksU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sRUFBc0MsU0FBUyxFQUE4QixNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7OztBQUd6Ryx3Q0FBd0M7QUFDeEMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBZTFDLE1BQU0sT0FBTyxnQkFBbUMsU0FBUSxVQUFn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c0JBRFQsS0FBSztnQkFNRixjQUFjO3NCQURqQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0UsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdGLFdBQVc7c0JBRGQsS0FBSztnQkFLYSxNQUFNO3NCQUF4QixLQUFLOztzQkFBSSxNQUFNO2dCQUNQLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0YsZUFBZTtzQkFEbEIsS0FBSztnQkFLYSxVQUFVO3NCQUE1QixLQUFLOztzQkFBSSxNQUFNO2dCQUUrQixjQUFjO3NCQUE1RCxTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDMEIsYUFBYTtzQkFBbkYsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFWixrQkFBa0I7c0JBQTFFLFlBQVk7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUUvQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBb0RiLGNBQWM7c0JBQXRCLEtBQUs7O0FBZ1lWLFlBQVk7QUFFWixTQUFTLFNBQVMsQ0FBQyxHQUFjO0lBQzdCLDhDQUE4QztJQUM5QyxPQUFPLENBQUMsQ0FBQyxHQUFHO1FBQ1IsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLEtBQUssVUFBVSxDQUFDO1FBQ3RELE9BQVEsR0FBbUIsQ0FBQyxJQUFJLEtBQUssVUFBVTtRQUMvQyxPQUFRLEdBQW1CLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBDb21wb25lbnRSZWYsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBUZW1wbGF0ZVJlZixcclxuICAgIFR5cGUsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBWaWV3Q2hpbGRyZW4sXHJcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRVNDQVBFLCBFTlRFUiB9IGZyb20gJ0BwdHNlY3VyaXR5L2Nkay9rZXljb2Rlcyc7XHJcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0BwdHNlY3VyaXR5L21vc2FpYy9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgTWNNb2RhbENvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi9tb2RhbC1jb250cm9sLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNY01vZGFsUmVmIH0gZnJvbSAnLi9tb2RhbC1yZWYuY2xhc3MnO1xyXG5pbXBvcnQgeyBtb2RhbFV0aWxPYmplY3QgYXMgTW9kYWxVdGlsIH0gZnJvbSAnLi9tb2RhbC11dGlsJztcclxuaW1wb3J0IHsgSU1vZGFsQnV0dG9uT3B0aW9ucywgSU1vZGFsT3B0aW9ucywgTW9kYWxTaXplLCBNb2RhbFR5cGUsIE9uQ2xpY2tDYWxsYmFjayB9IGZyb20gJy4vbW9kYWwudHlwZSc7XHJcblxyXG5cclxuLy8gRHVyYXRpb24gd2hlbiBwZXJmb3JtIGFuaW1hdGlvbnMgKG1zKVxyXG5leHBvcnQgY29uc3QgTU9EQUxfQU5JTUFURV9EVVJBVElPTiA9IDIwMDtcclxuXHJcbnR5cGUgQW5pbWF0aW9uU3RhdGUgPSAnZW50ZXInIHwgJ2xlYXZlJyB8IG51bGw7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ21jLW1vZGFsJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9tb2RhbC5zY3NzJ10sXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBob3N0OiB7XHJcbiAgICAgICAgJyhrZXlkb3duKSc6ICdvbktleURvd24oJGV2ZW50KSdcclxuICAgIH1cclxufSlcclxuZXhwb3J0IGNsYXNzIE1jTW9kYWxDb21wb25lbnQ8VCA9IGFueSwgUiA9IGFueT4gZXh0ZW5kcyBNY01vZGFsUmVmPFQsIFI+XHJcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIElNb2RhbE9wdGlvbnMge1xyXG5cclxuICAgIHRoZW1lUGFsZXR0ZSA9IFRoZW1lUGFsZXR0ZTtcclxuXHJcbiAgICBASW5wdXQoKSBtY01vZGFsVHlwZTogTW9kYWxUeXBlID0gJ2RlZmF1bHQnO1xyXG5cclxuICAgIC8vIFRoZSBpbnN0YW5jZSBvZiBjb21wb25lbnQgb3BlbmVkIGludG8gdGhlIGRpYWxvZy5cclxuICAgIEBJbnB1dCgpIG1jQ29tcG9uZW50OiBUeXBlPFQ+O1xyXG4gICAgLy8gSWYgbm90IHNwZWNpZmllZCwgd2lsbCB1c2UgPG5nLWNvbnRlbnQ+XHJcbiAgICBASW5wdXQoKSBtY0NvbnRlbnQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHt9PiB8IFR5cGU8VD47XHJcbiAgICAvLyBhdmFpbGFibGUgd2hlbiBtY0NvbnRlbnQgaXMgYSBjb21wb25lbnRcclxuICAgIEBJbnB1dCgpIG1jQ29tcG9uZW50UGFyYW1zOiBUO1xyXG4gICAgLy8gRGVmYXVsdCBNb2RhbCBPTkxZXHJcbiAgICBASW5wdXQoKSBtY0Zvb3Rlcjogc3RyaW5nIHwgVGVtcGxhdGVSZWY8e30+IHwgSU1vZGFsQnV0dG9uT3B0aW9uczxUPltdO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgbWNWaXNpYmxlKCkgeyByZXR1cm4gdGhpcy5fbWNWaXNpYmxlOyB9XHJcbiAgICBzZXQgbWNWaXNpYmxlKHZhbHVlKSB7IHRoaXMuX21jVmlzaWJsZSA9IHZhbHVlOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbWNWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgQE91dHB1dCgpIG1jVmlzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICBASW5wdXQoKSBtY1pJbmRleDogbnVtYmVyID0gMTAwMDtcclxuICAgIEBJbnB1dCgpIG1jV2lkdGg6IG51bWJlciB8IHN0cmluZztcclxuICAgIEBJbnB1dCgpIG1jU2l6ZTogTW9kYWxTaXplID0gTW9kYWxTaXplLk5vcm1hbDtcclxuICAgIEBJbnB1dCgpIG1jV3JhcENsYXNzTmFtZTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgbWNDbGFzc05hbWU6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIG1jU3R5bGU6IG9iamVjdDtcclxuICAgIEBJbnB1dCgpIG1jVGl0bGU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHt9PjtcclxuICAgIEBJbnB1dCgpIG1jQ2xvc2VCeUVTQzogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBtY0Nsb3NhYmxlKCkgeyByZXR1cm4gdGhpcy5fbWNDbG9zYWJsZTsgfVxyXG4gICAgc2V0IG1jQ2xvc2FibGUodmFsdWUpIHsgdGhpcy5fbWNDbG9zYWJsZSA9IHZhbHVlOyB9XHJcbiAgICBwcml2YXRlIF9tY0Nsb3NhYmxlID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IG1jTWFzaygpIHsgcmV0dXJuIHRoaXMuX21jTWFzazsgfVxyXG4gICAgc2V0IG1jTWFzayh2YWx1ZSkgeyB0aGlzLl9tY01hc2sgPSB2YWx1ZTsgfVxyXG4gICAgcHJpdmF0ZSBfbWNNYXNrID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IG1jTWFza0Nsb3NhYmxlKCkgeyByZXR1cm4gdGhpcy5fbWNNYXNrQ2xvc2FibGU7IH1cclxuICAgIHNldCBtY01hc2tDbG9zYWJsZSh2YWx1ZSkgeyB0aGlzLl9tY01hc2tDbG9zYWJsZSA9IHZhbHVlOyB9XHJcbiAgICBwcml2YXRlIF9tY01hc2tDbG9zYWJsZSA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpIG1jTWFza1N0eWxlOiBvYmplY3Q7XHJcbiAgICBASW5wdXQoKSBtY0JvZHlTdHlsZTogb2JqZWN0O1xyXG5cclxuICAgIC8vIFRyaWdnZXIgd2hlbiBtb2RhbCBvcGVuKHZpc2libGUpIGFmdGVyIGFuaW1hdGlvbnNcclxuICAgIEBPdXRwdXQoKSBtY0FmdGVyT3BlbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAgIC8vIFRyaWdnZXIgd2hlbiBtb2RhbCBsZWF2ZS1hbmltYXRpb24gb3ZlclxyXG4gICAgQE91dHB1dCgpIG1jQWZ0ZXJDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8Uj4oKTtcclxuXHJcbiAgICAvLyAtLS0gUHJlZGVmaW5lZCBPSyAmIENhbmNlbCBidXR0b25zXHJcbiAgICBASW5wdXQoKSBtY09rVGV4dDogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgbWNPa1R5cGUgPSAncHJpbWFyeSc7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBtY09rTG9hZGluZygpIHsgcmV0dXJuIHRoaXMuX21jT2tMb2FkaW5nOyB9XHJcbiAgICBzZXQgbWNPa0xvYWRpbmcodmFsdWUpIHsgdGhpcy5fbWNPa0xvYWRpbmcgPSB2YWx1ZTsgfVxyXG4gICAgcHJpdmF0ZSBfbWNPa0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKSBAT3V0cHV0KCkgbWNPbk9rOiBFdmVudEVtaXR0ZXI8VD4gfCBPbkNsaWNrQ2FsbGJhY2s8VD4gPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XHJcbiAgICBASW5wdXQoKSBtY0NhbmNlbFRleHQ6IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IG1jQ2FuY2VsTG9hZGluZygpIHsgcmV0dXJuIHRoaXMuX21jQ2FuY2VsTG9hZGluZzsgfVxyXG4gICAgc2V0IG1jQ2FuY2VsTG9hZGluZyh2YWx1ZSkgeyB0aGlzLl9tY0NhbmNlbExvYWRpbmcgPSB2YWx1ZTsgfVxyXG4gICAgcHJpdmF0ZSBfbWNDYW5jZWxMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KCkgQE91dHB1dCgpIG1jT25DYW5jZWw6IEV2ZW50RW1pdHRlcjxUPiB8IE9uQ2xpY2tDYWxsYmFjazxUPiA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdtb2RhbENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIG1vZGFsQ29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnYm9keUNvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiBmYWxzZSB9KSBib2R5Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xyXG4gICAgLy8gT25seSBhaW0gdG8gZm9jdXMgdGhlIG9rIGJ1dHRvbiB0aGF0IG5lZWRzIHRvIGJlIGF1dG8gZm9jdXNlZFxyXG4gICAgQFZpZXdDaGlsZHJlbignYXV0b0ZvY3VzZWRCdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgYXV0b0ZvY3VzZWRCdXR0b25zOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnbW9kYWxCb2R5JykgbW9kYWxCb2R5OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIGlzVG9wT3ZlcmZsb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlzQm90dG9tT3ZlcmZsb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBtYXNrQW5pbWF0aW9uQ2xhc3NNYXA6IG9iamVjdDtcclxuICAgIG1vZGFsQW5pbWF0aW9uQ2xhc3NNYXA6IG9iamVjdDtcclxuICAgIC8vIFRoZSBvcmlnaW4gcG9pbnQgdGhhdCBhbmltYXRpb24gYmFzZWQgb25cclxuICAgIHRyYW5zZm9ybU9yaWdpbiA9ICcwcHggMHB4IDBweCc7XHJcblxyXG4gICAgLy8gT2JzZXJ2YWJsZSBhbGlhcyBmb3IgbWNBZnRlck9wZW5cclxuICAgIGdldCBhZnRlck9wZW4oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWNBZnRlck9wZW4uYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT2JzZXJ2YWJsZSBhbGlhcyBmb3IgbWNBZnRlckNsb3NlXHJcbiAgICBnZXQgYWZ0ZXJDbG9zZSgpOiBPYnNlcnZhYmxlPFI+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tY0FmdGVyQ2xvc2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9rVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1jT2tUZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYW5jZWxUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWNDYW5jZWxUZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyBkaWFsb2cgc2hvdWxkIGhpZGRlblxyXG4gICAgZ2V0IGhpZGRlbigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMubWNWaXNpYmxlICYmICF0aGlzLmFuaW1hdGlvblN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSB0aGUgcmVmZXJlbmNlIHdoZW4gdXNpbmcgbWNDb250ZW50IGFzIENvbXBvbmVudFxyXG4gICAgcHJpdmF0ZSBjb250ZW50Q29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8VD47XHJcbiAgICAvLyBDdXJyZW50IGFuaW1hdGlvbiBzdGF0ZVxyXG4gICAgcHJpdmF0ZSBhbmltYXRpb25TdGF0ZTogQW5pbWF0aW9uU3RhdGU7XHJcbiAgICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBPdmVybGF5UmVmO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgIHByaXZhdGUgbW9kYWxDb250cm9sOiBNY01vZGFsQ29udHJvbFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55XHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIG1jR2V0Q29udGFpbmVyOiBIVE1MRWxlbWVudCB8IE92ZXJsYXlSZWYgfCAoKCkgPT4gSFRNTEVsZW1lbnQgfCBPdmVybGF5UmVmKSA9ICgpID0+IHRoaXMub3ZlcmxheS5jcmVhdGUoKTtcclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICAvLyBDcmVhdGUgY29tcG9uZW50IGFsb25nIHdpdGhvdXQgVmlld1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50KHRoaXMubWNDb250ZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUR5bmFtaWNDb21wb25lbnQodGhpcy5tY0NvbnRlbnQgYXMgVHlwZTxUPik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXR1cCBkZWZhdWx0IGJ1dHRvbiBvcHRpb25zXHJcbiAgICAgICAgaWYgKHRoaXMuaXNNb2RhbEJ1dHRvbnModGhpcy5tY0Zvb3RlcikpIHtcclxuICAgICAgICAgICAgdGhpcy5tY0Zvb3RlciA9IHRoaXMuZm9ybWF0TW9kYWxCdXR0b25zKHRoaXMubWNGb290ZXIgYXMgSU1vZGFsQnV0dG9uT3B0aW9uczxUPltdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50KHRoaXMubWNDb21wb25lbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRHluYW1pY0NvbXBvbmVudCh0aGlzLm1jQ29tcG9uZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBsYWNlIHRoZSBtb2RhbCBkb20gdG8gZWxzZXdoZXJlXHJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0eXBlb2YgdGhpcy5tY0dldENvbnRhaW5lciA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMubWNHZXRDb250YWluZXIoKSA6IHRoaXMubWNHZXRDb250YWluZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBPdmVybGF5UmVmKSB7XHJcbiAgICAgICAgICAgIC8vIE5PVEU6IG9ubHkgYXR0YWNoIHRoZSBkb20gdG8gb3ZlcmxheSwgdGhlIHZpZXcgY29udGFpbmVyIGlzIG5vdCBjaGFuZ2VkIGFjdHVhbGx5XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLm92ZXJsYXlFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJlZ2lzdGVyIG1vZGFsIHdoZW4gYWZ0ZXJPcGVuL2FmdGVyQ2xvc2UgaXMgc3RhYmxlXHJcbiAgICAgICAgdGhpcy5tb2RhbENvbnRyb2wucmVnaXN0ZXJNb2RhbCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBbTk9URV0gTk9UIGF2YWlsYWJsZSB3aGVuIHVzaW5nIGJ5IHNlcnZpY2UhXHJcbiAgICAvLyBCZWNhdXNlIG5nT25DaGFuZ2VzIG5ldmVyIGJlIGNhbGxlZCB3aGVuIHVzaW5nIGJ5IHNlcnZpY2UsXHJcbiAgICAvLyBoZXJlIHdlIGNhbid0IHN1cHBvcnQgXCJtY0NvbnRlbnRcIihDb21wb25lbnQpIGV0Yy4gYXMgaW5wdXRzIHRoYXQgaW5pdGlhbGl6ZWQgZHluYW1pY2FsbHkuXHJcbiAgICAvLyBCVVQ6IFVzZXIgYWxzbyBjYW4gY2hhbmdlIFwibWNDb250ZW50XCIgZHluYW1pY2FsbHkgdG8gdHJpZ2dlciBVSSBjaGFuZ2VzXHJcbiAgICAvLyAocHJvdmlkZWQgeW91IGRvbid0IHVzZSBcYkNvbXBvbmVudCB0aGF0IG5lZWRzIGluaXRpYWxpemF0aW9ucylcclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoY2hhbmdlcy5tY1Zpc2libGUpIHtcclxuICAgICAgICAgICAgLy8gRG8gbm90IHRyaWdnZXIgYW5pbWF0aW9uIHdoaWxlIGluaXRpYWxpemluZ1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVZpc2libGVTdGF0ZUNoYW5nZSh0aGlzLm1jVmlzaWJsZSwgIWNoYW5nZXMubWNWaXNpYmxlLmZpcnN0Q2hhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIC8vIElmIHVzaW5nIENvbXBvbmVudCwgaXQgaXMgdGhlIHRpbWUgdG8gYXR0YWNoIFZpZXcgd2hpbGUgYm9keUNvbnRhaW5lciBpcyByZWFkeVxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRDb21wb25lbnRSZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5ib2R5Q29udGFpbmVyLmluc2VydCh0aGlzLmNvbnRlbnRDb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylbMF0/LmZvY3VzKCk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgYXV0b0ZvY3VzZWRCdXR0b24gb2YgdGhpcy5hdXRvRm9jdXNlZEJ1dHRvbnMudG9BcnJheSgpKSB7XHJcbiAgICAgICAgICAgIGlmIChhdXRvRm9jdXNlZEJ1dHRvbi5uYXRpdmVFbGVtZW50LmF1dG9mb2N1cykge1xyXG4gICAgICAgICAgICAgICAgKGF1dG9Gb2N1c2VkQnV0dG9uLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tPdmVyZmxvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIE92ZXJsYXlSZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjaGVja092ZXJmbG93KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLm1vZGFsQm9keT8ubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKCFuYXRpdmVFbGVtZW50KSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxUb3A6IG51bWJlciA9IG5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldEhlaWdodDogbnVtYmVyID0gbmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsSGVpZ2h0OiBudW1iZXIgPSBuYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcclxuXHJcbiAgICAgICAgdGhpcy5pc1RvcE92ZXJmbG93ID0gc2Nyb2xsVG9wID4gMDtcclxuXHJcbiAgICAgICAgdGhpcy5pc0JvdHRvbU92ZXJmbG93ID0gKHNjcm9sbFRvcCBhcyBudW1iZXIgKyBvZmZzZXRIZWlnaHQgYXMgbnVtYmVyKSA8IHNjcm9sbEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuKCkge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlVmlzaWJsZUZyb21JbnNpZGUodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UocmVzdWx0PzogUikge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlVmlzaWJsZUZyb21JbnNpZGUoZmFsc2UsIHJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVzdHJveSBlcXVhbHMgQ2xvc2VcclxuICAgIGRlc3Ryb3kocmVzdWx0PzogUikge1xyXG4gICAgICAgIHRoaXMuY2xvc2UocmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICBtYXJrRm9yQ2hlY2soKSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICB0cmlnZ2VyT2soKSB7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrT2tDYW5jZWwoJ29rJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJpZ2dlckNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLm9uQ2xpY2tPa0NhbmNlbCgnY2FuY2VsJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5zdGFuY2UoKTogTWNNb2RhbENvbXBvbmVudCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGVudENvbXBvbmVudFJlZigpOiBDb21wb25lbnRSZWY8VD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRDb21wb25lbnRSZWY7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGVudENvbXBvbmVudCgpOiBUIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50Q29tcG9uZW50UmVmICYmIHRoaXMuY29udGVudENvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmICYmIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1jRm9vdGVyKCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbWMtbW9kYWwtZm9vdGVyJykuaXRlbSgwKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrTWFzaygkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMubWNNYXNrICYmXHJcbiAgICAgICAgICAgIHRoaXMubWNNYXNrQ2xvc2FibGUgJiZcclxuICAgICAgICAgICAgKCRldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnbWMtbW9kYWwtd3JhcCcpICYmXHJcbiAgICAgICAgICAgIHRoaXMubWNWaXNpYmxlXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25DbGlja09rQ2FuY2VsKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1yZXNlcnZlZC1rZXl3b3Jkc1xyXG4gICAgaXNNb2RhbFR5cGUodHlwZTogTW9kYWxUeXBlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWNNb2RhbFR5cGUgPT09IHR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblxyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkZXByZWNhdGlvbiAua2V5IGlzbid0IHN1cHBvcnRlZCBpbiBFZGdlXHJcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSAmJiB0aGlzLmNvbnRhaW5lciAmJiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBPdmVybGF5UmVmKSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGVwcmVjYXRpb24gLmtleSBpc24ndCBzdXBwb3J0ZWQgaW4gRWRnZVxyXG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IEVOVEVSKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1jTW9kYWxUeXBlID09PSAnY29uZmlybScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlck9rKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICh0aGlzLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbbWMtbW9kYWwtbWFpbi1hY3Rpb25dJykgYXMgSFRNTEVsZW1lbnQpPy5jbGljaygpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQW9UXHJcbiAgICBvbkNsaWNrQ2xvc2VCdG4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25DbGlja09rQ2FuY2VsKCdjYW5jZWwnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQW9UXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXJlc2VydmVkLWtleXdvcmRzXHJcbiAgICBvbkNsaWNrT2tDYW5jZWwodHlwZTogJ29rJyB8ICdjYW5jZWwnKSB7XHJcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9IHsgb2s6IHRoaXMubWNPbk9rLCBjYW5jZWw6IHRoaXMubWNPbkNhbmNlbCB9W3R5cGVdO1xyXG4gICAgICAgIGNvbnN0IGxvYWRpbmdLZXkgPSB7IG9rOiAnbWNPa0xvYWRpbmcnLCBjYW5jZWw6ICdtY0NhbmNlbExvYWRpbmcnIH1bdHlwZV07XHJcblxyXG4gICAgICAgIGlmICh0cmlnZ2VyIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XHJcbiAgICAgICAgICAgIHRyaWdnZXIuZW1pdCh0aGlzLmdldENvbnRlbnRDb21wb25lbnQoKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdHJpZ2dlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdHJpZ2dlcih0aGlzLmdldENvbnRlbnRDb21wb25lbnQoKSk7XHJcbiAgICAgICAgICAgIC8vIFVzZXJzIGNhbiByZXR1cm4gXCJmYWxzZVwiIHRvIHByZXZlbnQgY2xvc2luZyBieSBkZWZhdWx0XHJcbiAgICAgICAgICAgIGNvbnN0IGNhc2VDbG9zZSA9IChkb0Nsb3NlOiBib29sZWFuIHwgdm9pZCB8IHt9KSA9PiAoZG9DbG9zZSAhPT0gZmFsc2UpICYmIHRoaXMuY2xvc2UoZG9DbG9zZSBhcyBSKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpc1tsb2FkaW5nS2V5XSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVUaGVuID0gKGRvQ2xvc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzW2xvYWRpbmdLZXldID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZUNsb3NlKGRvQ2xvc2UpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIChyZXN1bHQgYXMgUHJvbWlzZTx2b2lkPikudGhlbihoYW5kbGVUaGVuKS5jYXRjaChoYW5kbGVUaGVuKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNhc2VDbG9zZShyZXN1bHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEFvVFxyXG4gICAgaXNOb25FbXB0eVN0cmluZyh2YWx1ZToge30pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQW9UXHJcbiAgICBpc1RlbXBsYXRlUmVmKHZhbHVlOiB7fSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFvVFxyXG4gICAgaXNDb21wb25lbnQodmFsdWU6IHt9KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBb1RcclxuICAgIGlzTW9kYWxCdXR0b25zKHZhbHVlOiB7fSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExvb2t1cCBhIGJ1dHRvbidzIHByb3BlcnR5LCBpZiB0aGUgcHJvcCBpcyBhIGZ1bmN0aW9uLCBjYWxsICYgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCwgb3RoZXJ3aXNlLCByZXR1cm4gaXRzZWxmLlxyXG4gICAgLy8gQW9UXHJcbiAgICBnZXRCdXR0b25DYWxsYWJsZVByb3Aob3B0aW9uczogSU1vZGFsQnV0dG9uT3B0aW9uczxUPiwgcHJvcDogc3RyaW5nKToge30ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1twcm9wXTtcclxuICAgICAgICBjb25zdCBhcmdzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRDb21wb25lbnRSZWYpIHtcclxuICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMuY29udGVudENvbXBvbmVudFJlZi5pbnN0YW5jZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUuYXBwbHkob3B0aW9ucywgYXJncykgOiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPbiBtY0Zvb3RlcidzIG1vZGFsIGJ1dHRvbiBjbGlja1xyXG4gICAgLy8gQW9UXHJcbiAgICBvbkJ1dHRvbkNsaWNrKGJ1dHRvbjogSU1vZGFsQnV0dG9uT3B0aW9uczxUPikge1xyXG4gICAgICAgIC8vIENhbGwgb25DbGljayBkaXJlY3RseVxyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbmZlcnJlZC1lbXB0eS1vYmplY3QtdHlwZSAgcnVsZSBzZWVtcyB0byBiZSBicm9rZW5cclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldEJ1dHRvbkNhbGxhYmxlUHJvcChidXR0b24sICdvbkNsaWNrJyk7XHJcbiAgICAgICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgKHJlc3VsdCBhcyBQcm9taXNlPHt9PikudGhlbigoKSA9PiBidXR0b24ubG9hZGluZyA9IGZhbHNlKS5jYXRjaCgoKSA9PiBidXR0b24ubG9hZGluZyA9IGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRG8gcmVzdCB0aGluZ3Mgd2hlbiB2aXNpYmxlIHN0YXRlIGNoYW5nZWRcclxuICAgIHByaXZhdGUgaGFuZGxlVmlzaWJsZVN0YXRlQ2hhbmdlKHZpc2libGU6IGJvb2xlYW4sIGFuaW1hdGlvbjogYm9vbGVhbiA9IHRydWUsIGNsb3NlUmVzdWx0PzogUik6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgLy8gSGlkZSBzY3JvbGxiYXIgYXQgdGhlIGZpcnN0IHRpbWUgd2hlbiBzaG93biB1cFxyXG4gICAgICAgIGlmICh2aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlQm9keU92ZXJmbG93KDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2VcclxuICAgICAgICAgICAgLnJlc29sdmUoYW5pbWF0aW9uICYmIHRoaXMuYW5pbWF0ZVRvKHZpc2libGUpKVxyXG4gICAgICAgICAgICAvLyBFbWl0IG9wZW4vY2xvc2UgZXZlbnQgYWZ0ZXIgYW5pbWF0aW9ucyBvdmVyXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tY0FmdGVyT3Blbi5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWNBZnRlckNsb3NlLmVtaXQoY2xvc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3cvaGlkZSBzY3JvbGxiYXIgd2hlbiBhbmltYXRpb24gaXMgb3ZlclxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQm9keU92ZXJmbG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoYW5nZSBtY1Zpc2libGUgZnJvbSBpbnNpZGVcclxuICAgIHByaXZhdGUgY2hhbmdlVmlzaWJsZUZyb21JbnNpZGUodmlzaWJsZTogYm9vbGVhbiwgY2xvc2VSZXN1bHQ/OiBSKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKHRoaXMubWNWaXNpYmxlICE9PSB2aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIC8vIENoYW5nZSBtY1Zpc2libGUgdmFsdWUgaW1tZWRpYXRlbHlcclxuICAgICAgICAgICAgdGhpcy5tY1Zpc2libGUgPSB2aXNpYmxlO1xyXG4gICAgICAgICAgICB0aGlzLm1jVmlzaWJsZUNoYW5nZS5lbWl0KHZpc2libGUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlVmlzaWJsZVN0YXRlQ2hhbmdlKHZpc2libGUsIHRydWUsIGNsb3NlUmVzdWx0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoYW5nZUFuaW1hdGlvblN0YXRlKHN0YXRlOiBBbmltYXRpb25TdGF0ZSkge1xyXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uU3RhdGUgPSBzdGF0ZTtcclxuICAgICAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXNrQW5pbWF0aW9uQ2xhc3NNYXAgPSB7XHJcbiAgICAgICAgICAgICAgICBbYGZhZGUtJHtzdGF0ZX1gXTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIFtgZmFkZS0ke3N0YXRlfS1hY3RpdmVgXTogdHJ1ZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5tb2RhbEFuaW1hdGlvbkNsYXNzTWFwID0ge1xyXG4gICAgICAgICAgICAgICAgW2B6b29tLSR7c3RhdGV9YF06IHRydWUsXHJcbiAgICAgICAgICAgICAgICBbYHpvb20tJHtzdGF0ZX0tYWN0aXZlYF06IHRydWVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHRoaXMubWFza0FuaW1hdGlvbkNsYXNzTWFwID0gdGhpcy5tb2RhbEFuaW1hdGlvbkNsYXNzTWFwID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRDb21wb25lbnRSZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50Q29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYW5pbWF0ZVRvKGlzVmlzaWJsZTogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgbGFzdGVzdCBjbGljayBwb3NpdGlvbiB3aGVuIHNob3dzIHVwXHJcbiAgICAgICAgaWYgKGlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAvLyBbTk9URV0gVXNpbmcgdGltZW91dCBkdWUgdG8gdGhlIGRvY3VtZW50LmNsaWNrIGV2ZW50IGlzIGZpcmVkIGxhdGVyIHRoYW4gdmlzaWJsZSBjaGFuZ2UsXHJcbiAgICAgICAgICAgIC8vIHNvIGlmIG5vdCBwb3N0cG9uZWQgdG8gbmV4dCBldmVudC1sb29wLCB3ZSBjYW4ndCBnZXQgdGhlIGxhc3Rlc3QgY2xpY2sgcG9zaXRpb25cclxuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVUcmFuc2Zvcm1PcmlnaW4oKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZUFuaW1hdGlvblN0YXRlKGlzVmlzaWJsZSA/ICdlbnRlcicgOiAnbGVhdmUnKTtcclxuXHJcbiAgICAgICAgLy8gUmV0dXJuIHdoZW4gYW5pbWF0aW9uIGlzIG92ZXJcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQW5pbWF0aW9uU3RhdGUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBNT0RBTF9BTklNQVRFX0RVUkFUSU9OXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb3JtYXRNb2RhbEJ1dHRvbnMoYnV0dG9uczogSU1vZGFsQnV0dG9uT3B0aW9uczxUPltdKTogSU1vZGFsQnV0dG9uT3B0aW9uczxUPltdIHtcclxuICAgICAgICByZXR1cm4gYnV0dG9ucy5tYXAoKGJ1dHRvbikgPT4ge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLntcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGF1dG9Mb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLi4uYnV0dG9uXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBjb21wb25lbnQgZHluYW1pY2FsbHkgYnV0IG5vdCBhdHRhY2ggdG8gYW55IFZpZXdcclxuICAgICAqICh0aGlzIGFjdGlvbiB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYm9keUNvbnRhaW5lciBpcyByZWFkeSlcclxuICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRHluYW1pY0NvbXBvbmVudChjb21wb25lbnQ6IFR5cGU8VD4pIHtcclxuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5jZnIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcclxuICAgICAgICBjb25zdCBjaGlsZEluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcclxuICAgICAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IE1jTW9kYWxSZWYsIHVzZVZhbHVlOiB0aGlzfV0sXHJcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy52aWV3Q29udGFpbmVyLmluamVjdG9yXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29udGVudENvbXBvbmVudFJlZiA9IGZhY3RvcnkuY3JlYXRlKGNoaWxkSW5qZWN0b3IpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tY0NvbXBvbmVudFBhcmFtcykge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuY29udGVudENvbXBvbmVudFJlZi5pbnN0YW5jZSwgdGhpcy5tY0NvbXBvbmVudFBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEbyB0aGUgZmlyc3QgY2hhbmdlIGRldGVjdGlvbiBpbW1lZGlhdGVseVxyXG4gICAgICAgIC8vIChvciB3ZSBkbyBkZXRlY3Rpb24gYXQgbmdBZnRlclZpZXdJbml0LCBtdWx0aS1jaGFuZ2VzIGVycm9yIHdpbGwgYmUgdGhyb3duKVxyXG4gICAgICAgIHRoaXMuY29udGVudENvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIHRyYW5zZm9ybS1vcmlnaW4gdG8gdGhlIGxhc3QgY2xpY2sgcG9zaXRpb24gb24gZG9jdW1lbnRcclxuICAgIHByaXZhdGUgdXBkYXRlVHJhbnNmb3JtT3JpZ2luKCkge1xyXG4gICAgICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IHRoaXMubW9kYWxDb250YWluZXIubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjb25zdCBsYXN0UG9zaXRpb24gPSBNb2RhbFV0aWwuZ2V0TGFzdENsaWNrUG9zaXRpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKGxhc3RQb3NpdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybU9yaWdpbiA9IGAke2xhc3RQb3NpdGlvbi54IC0gbW9kYWxFbGVtZW50Lm9mZnNldExlZnR9cHggJHtsYXN0UG9zaXRpb24ueSAtIG1vZGFsRWxlbWVudC5vZmZzZXRUb3B9cHggMHB4YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlIGNhcmUgb2YgdGhlIGJvZHkncyBvdmVyZmxvdyB0byBkZWNpZGUgdGhlIGV4aXN0ZW5zZSBvZiBzY3JvbGxiYXJcclxuICAgICAqIEBwYXJhbSBwbHVzTnVtIFRoZSBudW1iZXIgdGhhdCB0aGUgb3Blbk1vZGFscy5sZW5ndGggd2lsbCBpbmNyZWFzZSBzb29uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2hhbmdlQm9keU92ZXJmbG93KHBsdXNOdW06IG51bWJlciA9IDApIHtcclxuICAgICAgICBjb25zdCBvcGVuTW9kYWxzID0gdGhpcy5tb2RhbENvbnRyb2wub3Blbk1vZGFscztcclxuXHJcbiAgICAgICAgaWYgKG9wZW5Nb2RhbHMubGVuZ3RoICsgcGx1c051bSA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmRvY3VtZW50LmJvZHksICdvdmVyZmxvdycsICdoaWRkZW4nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoaXMuZG9jdW1lbnQuYm9keSwgJ292ZXJmbG93Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vLy8vLy8vLy8vLy9cclxuXHJcbmZ1bmN0aW9uIGlzUHJvbWlzZShvYmo6IHt9IHwgdm9pZCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bmJvdW5kLW1ldGhvZFxyXG4gICAgcmV0dXJuICEhb2JqICYmXHJcbiAgICAgICAgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnIHx8IHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpICYmXHJcbiAgICAgICAgdHlwZW9mIChvYmogYXMgUHJvbWlzZTx7fT4pLnRoZW4gPT09ICdmdW5jdGlvbicgJiZcclxuICAgICAgICB0eXBlb2YgKG9iaiBhcyBQcm9taXNlPHt9PikuY2F0Y2ggPT09ICdmdW5jdGlvbic7XHJcbn1cclxuIiwiPCEtLSBDb21wYXRpYmxlOiB0aGUgPG5nLWNvbnRlbnQ+IGNhbiBhcHBlYXIgb25seSBvbmNlIC0tPlxyXG48bmctdGVtcGxhdGUgI3RwbE9yaWdpbkNvbnRlbnQ+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cIm1jTWFza1wiXHJcbiAgICAgICAgIGNsYXNzPVwibWMtbW9kYWwtbWFza1wiXHJcbiAgICAgICAgIFtuZ0NsYXNzXT1cIm1hc2tBbmltYXRpb25DbGFzc01hcFwiXHJcbiAgICAgICAgIFtjbGFzcy5tYy1tb2RhbC1tYXNrLWhpZGRlbl09XCJoaWRkZW5cIlxyXG4gICAgICAgICBbbmdTdHlsZV09XCJtY01hc2tTdHlsZVwiXHJcbiAgICAgICAgIFtzdHlsZS56SW5kZXhdPVwibWNaSW5kZXhcIlxyXG4gICAgPjwvZGl2PlxyXG4gICAgPGRpdiAobW91c2Vkb3duKT1cIm9uQ2xpY2tNYXNrKCRldmVudClcIlxyXG4gICAgICAgICBjbGFzcz1cIm1jLW1vZGFsLXdyYXAge3sgbWNXcmFwQ2xhc3NOYW1lIH19XCJcclxuICAgICAgICAgW3N0eWxlLnpJbmRleF09XCJtY1pJbmRleFwiXHJcbiAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cImhpZGRlbiA/ICdub25lJyA6ICcnXCJcclxuICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG5cclxuICAgICAgICA8ZGl2ICNtb2RhbENvbnRhaW5lclxyXG4gICAgICAgICAgICAgY2xhc3M9XCJtYy1tb2RhbCB7eyBtY0NsYXNzTmFtZSB9fSBtYy1tb2RhbF97eyBtY1NpemUgfX1cIlxyXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwibW9kYWxBbmltYXRpb25DbGFzc01hcFwiXHJcbiAgICAgICAgICAgICBbbmdTdHlsZV09XCJtY1N0eWxlXCJcclxuICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJtY1dpZHRoIHwgdG9Dc3NVbml0XCJcclxuICAgICAgICAgICAgIFtzdHlsZS50cmFuc2Zvcm0tb3JpZ2luXT1cInRyYW5zZm9ybU9yaWdpblwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1jLW1vZGFsLWNvbnRlbnRcIiBjZGtUcmFwRm9jdXM+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwibWNDbG9zYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1jLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0Nsb3NlQnRuKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1jLW1vZGFsLWNsb3NlIG1jLWJ1dHRvbl90cmFuc3BhcmVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIG1jLWljb249XCJtYy1jbG9zZS1MXzE2XCIgY2xhc3M9XCJtYy1pY29uIG1jLWljb25fbGlnaHRcIiBbY29sb3JdPVwidGhlbWVQYWxldHRlLlNlY29uZFwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImlzTW9kYWxUeXBlKCdkZWZhdWx0JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidHBsQ29udGVudERlZmF1bHRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc01vZGFsVHlwZSgnY29uZmlybScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRwbENvbnRlbnRDb25maXJtXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNNb2RhbFR5cGUoJ2N1c3RvbScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRwbENvbnRlbnRDdXN0b21cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdHBsQ29udGVudEN1c3RvbT5cclxuICAgIDxuZy1jb250YWluZXIgI2JvZHlDb250YWluZXI+PC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPCEtLSBbUHJlZGVmaW5lZF0gRGVmYXVsdCBNb2RhbCBDb250ZW50IC0tPlxyXG48bmctdGVtcGxhdGUgI3RwbENvbnRlbnREZWZhdWx0PlxyXG4gICAgPGRpdiAqbmdJZj1cIm1jVGl0bGVcIiBjbGFzcz1cIm1jLW1vZGFsLWhlYWRlclwiIFtjbGFzcy5tYy1tb2RhbC1ib2R5X3RvcC1vdmVyZmxvd109XCJpc1RvcE92ZXJmbG93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1jLW1vZGFsLXRpdGxlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImlzVGVtcGxhdGVSZWYobWNUaXRsZSlcIiBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KG1jVGl0bGUpXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc05vbkVtcHR5U3RyaW5nKG1jVGl0bGUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cIm1jVGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1jLW1vZGFsLWJvZHlcIiAjbW9kYWxCb2R5IFtuZ1N0eWxlXT1cIm1jQm9keVN0eWxlXCIgKHNjcm9sbCk9XCJjaGVja092ZXJmbG93KClcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICNib2R5Q29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQ29tcG9uZW50KG1jQ29udGVudClcIiBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNUZW1wbGF0ZVJlZihtY0NvbnRlbnQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShtY0NvbnRlbnQpXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc05vbkVtcHR5U3RyaW5nKG1jQ29udGVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwibWNDb250ZW50XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdCBbbmdUZW1wbGF0ZU91dGxldF09XCJ0cGxPcmlnaW5Db250ZW50XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwibWNGb290ZXIgfHwgbWNPa1RleHQgfHwgbWNDYW5jZWxUZXh0XCIgY2xhc3M9XCJtYy1tb2RhbC1mb290ZXJcIiBbY2xhc3MubWMtbW9kYWwtYm9keV9ib3R0b20tb3ZlcmZsb3ddPVwiaXNCb3R0b21PdmVyZmxvd1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInRydWVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNUZW1wbGF0ZVJlZihtY0Zvb3RlcilcIiBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KG1jRm9vdGVyKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc05vbkVtcHR5U3RyaW5nKG1jRm9vdGVyKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cIm1jRm9vdGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc01vZGFsQnV0dG9ucyhtY0Zvb3RlcilcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiAkYW55KG1jRm9vdGVyKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgbWMtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNhdXRvRm9jdXNlZEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hdXRvZm9jdXNdPVwiYnV0dG9uLmF1dG9Gb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1jLW1vZGFsLW1haW4tYWN0aW9uXT1cImJ1dHRvbi5tY01vZGFsTWFpbkFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0QnV0dG9uQ2FsbGFibGVQcm9wKGJ1dHRvbiwgJ3Nob3cnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRCdXR0b25DYWxsYWJsZVByb3AoYnV0dG9uLCAnZGlzYWJsZWQnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tYy1wcm9ncmVzc109XCJnZXRCdXR0b25DYWxsYWJsZVByb3AoYnV0dG9uLCAnbG9hZGluZycpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJidXR0b24udHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBidXR0b24ubGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICNhdXRvRm9jdXNlZEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmF1dG9mb2N1c109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1jT2tUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICBtYy1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwidGhlbWVQYWxldHRlLlByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrT2tDYW5jZWwoJ29rJylcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAge3sgb2tUZXh0IH19XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJtY0NhbmNlbFRleHRcIiBtYy1idXR0b24gKGNsaWNrKT1cIm9uQ2xpY2tPa0NhbmNlbCgnY2FuY2VsJylcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBjYW5jZWxUZXh0IH19XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSAvW1ByZWRlZmluZWRdIERlZmF1bHQgTW9kYWwgQ29udGVudCAtLT5cclxuXHJcbjwhLS0gW1ByZWRlZmluZWRdIENvbmZpcm0gTW9kYWwgQ29udGVudCAtLT5cclxuPG5nLXRlbXBsYXRlICN0cGxDb250ZW50Q29uZmlybT5cclxuICAgIDxkaXYgY2xhc3M9XCJtYy1tb2RhbC1ib2R5XCIgW25nU3R5bGVdPVwibWNCb2R5U3R5bGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWMtY29uZmlybS1ib2R5LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1jLWNvbmZpcm0tYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1jLWNvbmZpcm0tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgI2JvZHlDb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDb21wb25lbnQobWNDb250ZW50KVwiIFtuZ1N3aXRjaF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc1RlbXBsYXRlUmVmKG1jQ29udGVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KG1jQ29udGVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNOb25FbXB0eVN0cmluZyhtY0NvbnRlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cIm1jQ29udGVudFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQgW25nVGVtcGxhdGVPdXRsZXRdPVwidHBsT3JpZ2luQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4gPCEtLSAvLm1jLWNvbmZpcm0tYm9keS13cmFwcGVyIC0tPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWMtY29uZmlybS1idG5zXCIgKm5nSWY9XCJtY09rVGV4dCB8fCBtY0NhbmNlbFRleHRcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1jLWJ1dHRvblxyXG4gICAgICAgICAgICAjYXV0b0ZvY3VzZWRCdXR0b25cclxuICAgICAgICAgICAgW2NvbG9yXT1cIm1jT2tUeXBlXCJcclxuICAgICAgICAgICAgW2F0dHIuYXV0b2ZvY3VzXT1cInRydWVcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIm1jT2tUZXh0XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tPa0NhbmNlbCgnb2snKVwiPlxyXG5cclxuICAgICAgICAgICAge3sgb2tUZXh0IH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gbWMtYnV0dG9uIFtjb2xvcl09XCJ0aGVtZVBhbGV0dGUuU2Vjb25kXCIgKm5nSWY9XCJtY0NhbmNlbFRleHRcIiAoY2xpY2spPVwib25DbGlja09rQ2FuY2VsKCdjYW5jZWwnKVwiPlxyXG4gICAgICAgICAgICB7eyBjYW5jZWxUZXh0IH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPCEtLSAvW1ByZWRlZmluZWRdIENvbmZpcm0gTW9kYWwgQ29udGVudCAtLT5cclxuIl19
1
+ import { Overlay, OverlayRef } from '@angular/cdk/overlay';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ComponentFactoryResolver, ElementRef, EventEmitter, Inject, Injector, Input, Output, QueryList, Renderer2, TemplateRef, Type, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation } from '@angular/core';
4
+ import { ESCAPE, ENTER } from '@ptsecurity/cdk/keycodes';
5
+ import { ThemePalette } from '@ptsecurity/mosaic/core';
6
+ import { McModalControlService } from './modal-control.service';
7
+ import { McModalRef } from './modal-ref.class';
8
+ import { modalUtilObject as ModalUtil } from './modal-util';
9
+ import { ModalSize } from './modal.type';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/cdk/overlay";
12
+ import * as i2 from "./modal-control.service";
13
+ import * as i3 from "@ptsecurity/mosaic/button";
14
+ import * as i4 from "@ptsecurity/mosaic/icon";
15
+ import * as i5 from "@angular/common";
16
+ import * as i6 from "@angular/cdk/a11y";
17
+ import * as i7 from "./modal.directive";
18
+ import * as i8 from "./css-unit.pipe";
19
+ // Duration when perform animations (ms)
20
+ export const MODAL_ANIMATE_DURATION = 200;
21
+ export class McModalComponent extends McModalRef {
22
+ constructor(overlay, renderer, cfr, elementRef, viewContainer, modalControl, changeDetector, document) {
23
+ super();
24
+ this.overlay = overlay;
25
+ this.renderer = renderer;
26
+ this.cfr = cfr;
27
+ this.elementRef = elementRef;
28
+ this.viewContainer = viewContainer;
29
+ this.modalControl = modalControl;
30
+ this.changeDetector = changeDetector;
31
+ this.document = document;
32
+ this.themePalette = ThemePalette;
33
+ this.mcModalType = 'default';
34
+ this._mcVisible = false;
35
+ this.mcVisibleChange = new EventEmitter();
36
+ this.mcZIndex = 1000;
37
+ this.mcSize = ModalSize.Normal;
38
+ this.mcCloseByESC = true;
39
+ this._mcClosable = true;
40
+ this._mcMask = true;
41
+ this._mcMaskClosable = false;
42
+ // Trigger when modal open(visible) after animations
43
+ this.mcAfterOpen = new EventEmitter();
44
+ // Trigger when modal leave-animation over
45
+ this.mcAfterClose = new EventEmitter();
46
+ this.mcOkType = 'primary';
47
+ this.mcRestoreFocus = true;
48
+ this._mcOkLoading = false;
49
+ this.mcOnOk = new EventEmitter();
50
+ this._mcCancelLoading = false;
51
+ this.mcOnCancel = new EventEmitter();
52
+ this.isTopOverflow = false;
53
+ this.isBottomOverflow = false;
54
+ // The origin point that animation based on
55
+ this.transformOrigin = '0px 0px 0px';
56
+ this.mcGetContainer = () => this.overlay.create();
57
+ }
58
+ get mcVisible() { return this._mcVisible; }
59
+ set mcVisible(value) { this._mcVisible = value; }
60
+ get mcClosable() { return this._mcClosable; }
61
+ set mcClosable(value) { this._mcClosable = value; }
62
+ get mcMask() { return this._mcMask; }
63
+ set mcMask(value) { this._mcMask = value; }
64
+ get mcMaskClosable() { return this._mcMaskClosable; }
65
+ set mcMaskClosable(value) { this._mcMaskClosable = value; }
66
+ get mcOkLoading() { return this._mcOkLoading; }
67
+ set mcOkLoading(value) { this._mcOkLoading = value; }
68
+ get mcCancelLoading() { return this._mcCancelLoading; }
69
+ set mcCancelLoading(value) { this._mcCancelLoading = value; }
70
+ // Observable alias for mcAfterOpen
71
+ get afterOpen() {
72
+ return this.mcAfterOpen.asObservable();
73
+ }
74
+ // Observable alias for mcAfterClose
75
+ get afterClose() {
76
+ return this.mcAfterClose.asObservable();
77
+ }
78
+ get okText() {
79
+ return this.mcOkText;
80
+ }
81
+ get cancelText() {
82
+ return this.mcCancelText;
83
+ }
84
+ // Indicate whether this dialog should hidden
85
+ get hidden() {
86
+ return !this.mcVisible && !this.animationState;
87
+ }
88
+ ngOnInit() {
89
+ // Create component along without View
90
+ if (this.isComponent(this.mcContent)) {
91
+ this.createDynamicComponent(this.mcContent);
92
+ }
93
+ // Setup default button options
94
+ if (this.isModalButtons(this.mcFooter)) {
95
+ this.mcFooter = this.formatModalButtons(this.mcFooter);
96
+ }
97
+ if (this.isComponent(this.mcComponent)) {
98
+ this.createDynamicComponent(this.mcComponent);
99
+ }
100
+ // Place the modal dom to elsewhere
101
+ this.container = typeof this.mcGetContainer === 'function' ? this.mcGetContainer() : this.mcGetContainer;
102
+ if (this.container instanceof HTMLElement) {
103
+ this.container.appendChild(this.elementRef.nativeElement);
104
+ }
105
+ else if (this.container instanceof OverlayRef) {
106
+ // NOTE: only attach the dom to overlay, the view container is not changed actually
107
+ this.container.overlayElement.appendChild(this.elementRef.nativeElement);
108
+ }
109
+ // Register modal when afterOpen/afterClose is stable
110
+ this.modalControl.registerModal(this);
111
+ }
112
+ // [NOTE] NOT available when using by service!
113
+ // Because ngOnChanges never be called when using by service,
114
+ // here we can't support "mcContent"(Component) etc. as inputs that initialized dynamically.
115
+ // BUT: User also can change "mcContent" dynamically to trigger UI changes
116
+ // (provided you don't use Component that needs initializations)
117
+ ngOnChanges(changes) {
118
+ if (changes.mcVisible) {
119
+ // Do not trigger animation while initializing
120
+ this.handleVisibleStateChange(this.mcVisible, !changes.mcVisible.firstChange);
121
+ }
122
+ }
123
+ ngAfterViewInit() {
124
+ // If using Component, it is the time to attach View while bodyContainer is ready
125
+ if (this.contentComponentRef) {
126
+ this.bodyContainer.insert(this.contentComponentRef.hostView);
127
+ }
128
+ this.getElement().getElementsByTagName('button')[0]?.focus();
129
+ for (const autoFocusedButton of this.autoFocusedButtons.toArray()) {
130
+ if (autoFocusedButton.nativeElement.autofocus) {
131
+ autoFocusedButton.nativeElement.focus();
132
+ break;
133
+ }
134
+ }
135
+ this.checkOverflow();
136
+ }
137
+ ngOnDestroy() {
138
+ if (this.container instanceof OverlayRef) {
139
+ this.container.dispose();
140
+ }
141
+ }
142
+ checkOverflow() {
143
+ const nativeElement = this.modalBody?.nativeElement;
144
+ if (!nativeElement) {
145
+ return;
146
+ }
147
+ const scrollTop = nativeElement.scrollTop;
148
+ const offsetHeight = nativeElement.offsetHeight;
149
+ const scrollHeight = nativeElement.scrollHeight;
150
+ this.isTopOverflow = scrollTop > 0;
151
+ this.isBottomOverflow = scrollTop + offsetHeight < scrollHeight;
152
+ }
153
+ open() {
154
+ this.focusedElementBeforeOpen = this.document.activeElement;
155
+ this.changeVisibleFromInside(true);
156
+ }
157
+ close(result) {
158
+ if (this.mcRestoreFocus) {
159
+ this.focusedElementBeforeOpen?.focus();
160
+ }
161
+ this.changeVisibleFromInside(false, result);
162
+ this.focusedElementBeforeOpen = null;
163
+ }
164
+ // Destroy equals Close
165
+ destroy(result) {
166
+ this.close(result);
167
+ }
168
+ markForCheck() {
169
+ this.changeDetector.markForCheck();
170
+ }
171
+ triggerOk() {
172
+ this.onClickOkCancel('ok');
173
+ }
174
+ triggerCancel() {
175
+ this.onClickOkCancel('cancel');
176
+ }
177
+ getInstance() {
178
+ return this;
179
+ }
180
+ getContentComponentRef() {
181
+ return this.contentComponentRef;
182
+ }
183
+ getContentComponent() {
184
+ return this.contentComponentRef && this.contentComponentRef.instance;
185
+ }
186
+ getElement() {
187
+ return this.elementRef && this.elementRef.nativeElement;
188
+ }
189
+ getMcFooter() {
190
+ return this.getElement().getElementsByClassName('mc-modal-footer').item(0);
191
+ }
192
+ onClickMask($event) {
193
+ if (this.mcMask &&
194
+ this.mcMaskClosable &&
195
+ $event.target.classList.contains('mc-modal-wrap') &&
196
+ this.mcVisible) {
197
+ this.onClickOkCancel('cancel');
198
+ }
199
+ }
200
+ // tslint:disable-next-line: no-reserved-keywords
201
+ isModalType(type) {
202
+ return this.mcModalType === type;
203
+ }
204
+ onKeyDown(event) {
205
+ // tslint:disable-next-line:deprecation .key isn't supported in Edge
206
+ if (event.keyCode === ESCAPE && this.container && (this.container instanceof OverlayRef)) {
207
+ this.close();
208
+ event.preventDefault();
209
+ }
210
+ // tslint:disable-next-line:deprecation .key isn't supported in Edge
211
+ if (event.ctrlKey && event.keyCode === ENTER) {
212
+ if (this.mcModalType === 'confirm') {
213
+ this.triggerOk();
214
+ }
215
+ this.getElement().querySelector('[mc-modal-main-action]')?.click();
216
+ event.preventDefault();
217
+ }
218
+ }
219
+ // AoT
220
+ onClickCloseBtn() {
221
+ if (this.mcVisible) {
222
+ this.onClickOkCancel('cancel');
223
+ }
224
+ }
225
+ // AoT
226
+ // tslint:disable-next-line: no-reserved-keywords
227
+ onClickOkCancel(type) {
228
+ const trigger = { ok: this.mcOnOk, cancel: this.mcOnCancel }[type];
229
+ const loadingKey = { ok: 'mcOkLoading', cancel: 'mcCancelLoading' }[type];
230
+ if (trigger instanceof EventEmitter) {
231
+ trigger.emit(this.getContentComponent());
232
+ }
233
+ else if (typeof trigger === 'function') {
234
+ const result = trigger(this.getContentComponent());
235
+ // Users can return "false" to prevent closing by default
236
+ const caseClose = (doClose) => (doClose !== false) && this.close(doClose);
237
+ if (isPromise(result)) {
238
+ this[loadingKey] = true;
239
+ const handleThen = (doClose) => {
240
+ this[loadingKey] = false;
241
+ caseClose(doClose);
242
+ };
243
+ result.then(handleThen).catch(handleThen);
244
+ }
245
+ else {
246
+ caseClose(result);
247
+ }
248
+ }
249
+ }
250
+ // AoT
251
+ isNonEmptyString(value) {
252
+ return typeof value === 'string' && value !== '';
253
+ }
254
+ // AoT
255
+ isTemplateRef(value) {
256
+ return value instanceof TemplateRef;
257
+ }
258
+ // AoT
259
+ isComponent(value) {
260
+ return value instanceof Type;
261
+ }
262
+ // AoT
263
+ isModalButtons(value) {
264
+ return Array.isArray(value) && value.length > 0;
265
+ }
266
+ // Lookup a button's property, if the prop is a function, call & then return the result, otherwise, return itself.
267
+ // AoT
268
+ getButtonCallableProp(options, prop) {
269
+ const value = options[prop];
270
+ const args = [];
271
+ if (this.contentComponentRef) {
272
+ args.push(this.contentComponentRef.instance);
273
+ }
274
+ return typeof value === 'function' ? value.apply(options, args) : value;
275
+ }
276
+ // On mcFooter's modal button click
277
+ // AoT
278
+ onButtonClick(button) {
279
+ // Call onClick directly
280
+ // tslint:disable-next-line:no-inferred-empty-object-type rule seems to be broken
281
+ const result = this.getButtonCallableProp(button, 'onClick');
282
+ if (isPromise(result)) {
283
+ button.loading = true;
284
+ result.then(() => button.loading = false).catch(() => button.loading = false);
285
+ }
286
+ }
287
+ // Do rest things when visible state changed
288
+ handleVisibleStateChange(visible, animation = true, closeResult) {
289
+ // Hide scrollbar at the first time when shown up
290
+ if (visible) {
291
+ this.changeBodyOverflow(1);
292
+ }
293
+ return Promise
294
+ .resolve(animation && this.animateTo(visible))
295
+ // Emit open/close event after animations over
296
+ .then(() => {
297
+ if (visible) {
298
+ this.mcAfterOpen.emit();
299
+ }
300
+ else {
301
+ this.mcAfterClose.emit(closeResult);
302
+ // Show/hide scrollbar when animation is over
303
+ this.changeBodyOverflow();
304
+ }
305
+ });
306
+ }
307
+ // Change mcVisible from inside
308
+ changeVisibleFromInside(visible, closeResult) {
309
+ if (this.mcVisible !== visible) {
310
+ // Change mcVisible value immediately
311
+ this.mcVisible = visible;
312
+ this.mcVisibleChange.emit(visible);
313
+ return this.handleVisibleStateChange(visible, true, closeResult);
314
+ }
315
+ return Promise.resolve();
316
+ }
317
+ changeAnimationState(state) {
318
+ this.animationState = state;
319
+ if (state) {
320
+ this.maskAnimationClassMap = {
321
+ [`fade-${state}`]: true,
322
+ [`fade-${state}-active`]: true
323
+ };
324
+ this.modalAnimationClassMap = {
325
+ [`zoom-${state}`]: true,
326
+ [`zoom-${state}-active`]: true
327
+ };
328
+ }
329
+ else {
330
+ // @ts-ignore
331
+ this.maskAnimationClassMap = this.modalAnimationClassMap = null;
332
+ }
333
+ if (this.contentComponentRef) {
334
+ this.contentComponentRef.changeDetectorRef.markForCheck();
335
+ }
336
+ else {
337
+ this.changeDetector.markForCheck();
338
+ }
339
+ }
340
+ animateTo(isVisible) {
341
+ // Figure out the lastest click position when shows up
342
+ if (isVisible) {
343
+ // [NOTE] Using timeout due to the document.click event is fired later than visible change,
344
+ // so if not postponed to next event-loop, we can't get the lastest click position
345
+ window.setTimeout(() => this.updateTransformOrigin());
346
+ }
347
+ this.changeAnimationState(isVisible ? 'enter' : 'leave');
348
+ // Return when animation is over
349
+ return new Promise((resolve) => {
350
+ return window.setTimeout(() => {
351
+ this.changeAnimationState(null);
352
+ resolve(null);
353
+ }, MODAL_ANIMATE_DURATION);
354
+ });
355
+ }
356
+ formatModalButtons(buttons) {
357
+ return buttons.map((button) => {
358
+ return {
359
+ ...{
360
+ type: 'default',
361
+ size: 'default',
362
+ autoLoading: true,
363
+ show: true,
364
+ loading: false,
365
+ disabled: false
366
+ },
367
+ ...button
368
+ };
369
+ });
370
+ }
371
+ /**
372
+ * Create a component dynamically but not attach to any View
373
+ * (this action will be executed when bodyContainer is ready)
374
+ * @param component Component class
375
+ */
376
+ createDynamicComponent(component) {
377
+ const factory = this.cfr.resolveComponentFactory(component);
378
+ const childInjector = Injector.create({
379
+ providers: [{ provide: McModalRef, useValue: this }],
380
+ parent: this.viewContainer.injector
381
+ });
382
+ this.contentComponentRef = factory.create(childInjector);
383
+ if (this.mcComponentParams) {
384
+ Object.assign(this.contentComponentRef.instance, this.mcComponentParams);
385
+ }
386
+ // Do the first change detection immediately
387
+ // (or we do detection at ngAfterViewInit, multi-changes error will be thrown)
388
+ this.contentComponentRef.changeDetectorRef.detectChanges();
389
+ }
390
+ // Update transform-origin to the last click position on document
391
+ updateTransformOrigin() {
392
+ const modalElement = this.modalContainer.nativeElement;
393
+ const lastPosition = ModalUtil.getLastClickPosition();
394
+ if (lastPosition) {
395
+ this.transformOrigin = `${lastPosition.x - modalElement.offsetLeft}px ${lastPosition.y - modalElement.offsetTop}px 0px`;
396
+ }
397
+ }
398
+ /**
399
+ * Take care of the body's overflow to decide the existense of scrollbar
400
+ * @param plusNum The number that the openModals.length will increase soon
401
+ */
402
+ changeBodyOverflow(plusNum = 0) {
403
+ const openModals = this.modalControl.openModals;
404
+ if (openModals.length + plusNum > 0) {
405
+ this.renderer.setStyle(this.document.body, 'overflow', 'hidden');
406
+ }
407
+ else {
408
+ this.renderer.removeStyle(this.document.body, 'overflow');
409
+ }
410
+ }
411
+ }
412
+ /** @nocollapse */ /** @nocollapse */ McModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McModalComponent, deps: [{ token: i1.Overlay }, { token: i0.Renderer2 }, { token: i0.ComponentFactoryResolver }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i2.McModalControlService }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
413
+ /** @nocollapse */ /** @nocollapse */ McModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: McModalComponent, selector: "mc-modal", inputs: { mcModalType: "mcModalType", mcComponent: "mcComponent", mcContent: "mcContent", mcComponentParams: "mcComponentParams", mcFooter: "mcFooter", mcVisible: "mcVisible", mcZIndex: "mcZIndex", mcWidth: "mcWidth", mcSize: "mcSize", mcWrapClassName: "mcWrapClassName", mcClassName: "mcClassName", mcStyle: "mcStyle", mcTitle: "mcTitle", mcCloseByESC: "mcCloseByESC", mcClosable: "mcClosable", mcMask: "mcMask", mcMaskClosable: "mcMaskClosable", mcMaskStyle: "mcMaskStyle", mcBodyStyle: "mcBodyStyle", mcOkText: "mcOkText", mcOkType: "mcOkType", mcRestoreFocus: "mcRestoreFocus", mcOkLoading: "mcOkLoading", mcOnOk: "mcOnOk", mcCancelText: "mcCancelText", mcCancelLoading: "mcCancelLoading", mcOnCancel: "mcOnCancel", mcGetContainer: "mcGetContainer" }, outputs: { mcVisibleChange: "mcVisibleChange", mcAfterOpen: "mcAfterOpen", mcAfterClose: "mcAfterClose", mcOnOk: "mcOnOk", mcOnCancel: "mcOnCancel" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, viewQueries: [{ propertyName: "modalContainer", first: true, predicate: ["modalContainer"], descendants: true, static: true }, { propertyName: "bodyContainer", first: true, predicate: ["bodyContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "modalBody", first: true, predicate: ["modalBody"], descendants: true }, { propertyName: "autoFocusedButtons", predicate: ["autoFocusedButton"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<!-- Compatible: the <ng-content> can appear only once -->\n<ng-template #tplOriginContent>\n <ng-content></ng-content>\n</ng-template>\n\n<div>\n <div *ngIf=\"mcMask\"\n class=\"mc-modal-mask\"\n [ngClass]=\"maskAnimationClassMap\"\n [class.mc-modal-mask-hidden]=\"hidden\"\n [ngStyle]=\"mcMaskStyle\"\n [style.zIndex]=\"mcZIndex\"\n ></div>\n <div (mousedown)=\"onClickMask($event)\"\n class=\"mc-modal-wrap {{ mcWrapClassName }}\"\n [style.zIndex]=\"mcZIndex\"\n [style.display]=\"hidden ? 'none' : ''\"\n tabindex=\"-1\">\n\n <div #modalContainer\n class=\"mc-modal {{ mcClassName }} mc-modal_{{ mcSize }}\"\n [ngClass]=\"modalAnimationClassMap\"\n [ngStyle]=\"mcStyle\"\n [style.width]=\"mcWidth | toCssUnit\"\n [style.transform-origin]=\"transformOrigin\">\n\n <div class=\"mc-modal-content\" cdkTrapFocus>\n <button *ngIf=\"mcClosable\"\n mc-button\n (click)=\"onClickCloseBtn()\"\n class=\"mc-modal-close mc-button_transparent\">\n <i mc-icon=\"mc-close-L_16\" class=\"mc-icon mc-icon_light\" [color]=\"themePalette.Second\"></i>\n </button>\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isModalType('default')\"\n [ngTemplateOutlet]=\"tplContentDefault\"></ng-container>\n <ng-container *ngSwitchCase=\"isModalType('confirm')\"\n [ngTemplateOutlet]=\"tplContentConfirm\"></ng-container>\n <ng-container *ngSwitchCase=\"isModalType('custom')\"\n [ngTemplateOutlet]=\"tplContentCustom\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #tplContentCustom>\n <ng-container #bodyContainer></ng-container>\n</ng-template>\n\n\n<!-- [Predefined] Default Modal Content -->\n<ng-template #tplContentDefault>\n <div *ngIf=\"mcTitle\" class=\"mc-modal-header\" [class.mc-modal-body_top-overflow]=\"isTopOverflow\">\n <div class=\"mc-modal-title\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isTemplateRef(mcTitle)\" [ngTemplateOutlet]=\"$any(mcTitle)\"></ng-container>\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcTitle)\">\n <div [innerHTML]=\"mcTitle\"></div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"mc-modal-body\" #modalBody [ngStyle]=\"mcBodyStyle\" (scroll)=\"checkOverflow()\">\n <ng-container #bodyContainer>\n <ng-container *ngIf=\"!isComponent(mcContent)\" [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isTemplateRef(mcContent)\" [ngTemplateOutlet]=\"$any(mcContent)\"></ng-container>\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcContent)\">\n <div [innerHTML]=\"mcContent\"></div>\n </ng-container>\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"tplOriginContent\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n <div *ngIf=\"mcFooter || mcOkText || mcCancelText\" class=\"mc-modal-footer\" [class.mc-modal-body_bottom-overflow]=\"isBottomOverflow\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isTemplateRef(mcFooter)\" [ngTemplateOutlet]=\"$any(mcFooter)\"></ng-container>\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcFooter)\">\n <div [innerHTML]=\"mcFooter\"></div>\n </ng-container>\n <ng-container *ngSwitchCase=\"isModalButtons(mcFooter)\">\n <ng-container *ngFor=\"let button of $any(mcFooter)\">\n <button\n mc-button\n #autoFocusedButton\n [attr.autofocus]=\"button.autoFocus\"\n [attr.mc-modal-main-action]=\"button.mcModalMainAction\"\n *ngIf=\"getButtonCallableProp(button, 'show')\"\n [disabled]=\"getButtonCallableProp(button, 'disabled')\"\n [class.mc-progress]=\"getButtonCallableProp(button, 'loading')\"\n (click)=\"onButtonClick(button)\"\n [color]=\"button.type\">\n {{ button.label }}\n </button>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <button\n #autoFocusedButton\n [attr.autofocus]=\"true\"\n *ngIf=\"mcOkText\"\n mc-button\n [color]=\"themePalette.Primary\"\n (click)=\"onClickOkCancel('ok')\">\n\n {{ okText }}\n </button>\n <button *ngIf=\"mcCancelText\" mc-button (click)=\"onClickOkCancel('cancel')\">\n {{ cancelText }}\n </button>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n<!-- /[Predefined] Default Modal Content -->\n\n<!-- [Predefined] Confirm Modal Content -->\n<ng-template #tplContentConfirm>\n <div class=\"mc-modal-body\" [ngStyle]=\"mcBodyStyle\">\n <div class=\"mc-confirm-body-wrapper\">\n <div class=\"mc-confirm-body\">\n <div class=\"mc-confirm-content\">\n <ng-container #bodyContainer>\n <ng-container *ngIf=\"!isComponent(mcContent)\" [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isTemplateRef(mcContent)\"\n [ngTemplateOutlet]=\"$any(mcContent)\">\n </ng-container>\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcContent)\">\n <div [innerHTML]=\"mcContent\"></div>\n </ng-container>\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"tplOriginContent\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div> <!-- /.mc-confirm-body-wrapper -->\n </div>\n <div class=\"mc-confirm-btns\" *ngIf=\"mcOkText || mcCancelText\">\n <button\n mc-button\n #autoFocusedButton\n [color]=\"mcOkType\"\n [attr.autofocus]=\"true\"\n *ngIf=\"mcOkText\"\n (click)=\"onClickOkCancel('ok')\">\n\n {{ okText }}\n </button>\n\n <button mc-button [color]=\"themePalette.Second\" *ngIf=\"mcCancelText\" (click)=\"onClickOkCancel('cancel')\">\n {{ cancelText }}\n </button>\n </div>\n</ng-template>\n<!-- /[Predefined] Confirm Modal Content -->\n", styles: [".mc-confirm .mc-modal-header,.mc-confirm .mc-modal-close{display:none}.mc-confirm .mc-modal-body{padding:var(--mc-modal-confirm-size-padding, 24px)}.mc-confirm-body-wrapper{zoom:1}.mc-confirm-body-wrapper:before,.mc-confirm-body-wrapper:after{content:\"\";display:table}.mc-confirm-body-wrapper:after{clear:both}.mc-confirm-body .mc-confirm-title{display:block;overflow:auto}.mc-confirm .mc-confirm-btns{border-radius:var(--mc-modal-footer-size-border-radius, 0 0 4px 4px);text-align:right}.mc-confirm .mc-confirm-btns button{margin:16px}.mc-modal{box-sizing:border-box;position:relative;top:var(--mc-modal-size-top, 48px);width:auto;margin:0 auto;list-style:none}.mc-modal.zoom-enter,.mc-modal.zoom-appear{animation-duration:.3s;transform:none;opacity:0}.mc-modal.mc-modal_small{width:var(--mc-modal-size-small, 400px)}.mc-modal.mc-modal_normal{width:var(--mc-modal-size-normal, 640px)}.mc-modal.mc-modal_large{width:var(--mc-modal-size-large, 960px)}.mc-modal .mc-modal-close{position:absolute;z-index:10;top:0;right:0;width:var(--mc-modal-size-close-width, 56px);height:var(--mc-modal-size-close-width, 56px)}.mc-modal-wrap{position:fixed;z-index:1000;top:0;right:0;bottom:0;left:0;overflow:auto;-webkit-overflow-scrolling:touch;outline:0}.mc-modal-title{margin:0}.mc-modal-content{position:relative;border-radius:var(--mc-modal-size-border-radius, 4px);background-clip:padding-box;background-color:#fff}.mc-modal-header{display:flex;align-items:center;height:var(--mc-modal-header-size-height, 56px);border-radius:var(--mc-modal-header-size-border-radius, 4px 4px 0 0);padding:var(--mc-modal-header-size-padding, 0 16px)}.mc-modal-body{display:block;overflow-y:auto;max-height:var(--mc-modal-body-size-max-height, calc(100vh - 260px));padding:var(--mc-modal-body-size-padding, 16px 24px 24px);word-wrap:break-word}.mc-modal-footer{display:flex;align-items:center;justify-content:right;height:var(--mc-modal-footer-size-height, 64px);border-radius:var(--mc-modal-footer-size-border-radius, 0 0 4px 4px);padding:var(--mc-modal-footer-size-padding, 0 16px)}.mc-modal-footer button+button{margin-left:16px;margin-bottom:0}.mc-modal-mask{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0;height:100%}.mc-modal-mask.mc-modal-mask-hidden{display:none}.mc-modal-open{overflow:hidden}\n"], components: [{ type: i3.McButton, selector: "[mc-button]", inputs: ["color", "tabIndex", "disabled"] }, { type: i4.McIcon, selector: "[mc-icon]", inputs: ["color"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { type: i3.McButtonCssStyler, selector: "[mc-button]" }, { type: i4.McIconCSSStyler, selector: "[mc-icon]" }, { type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.McModalMainAction, selector: "[mc-modal-main-action]" }], pipes: { "toCssUnit": i8.CssUnitPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
414
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: McModalComponent, decorators: [{
415
+ type: Component,
416
+ args: [{ selector: 'mc-modal', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
417
+ '(keydown)': 'onKeyDown($event)'
418
+ }, template: "<!-- Compatible: the <ng-content> can appear only once -->\n<ng-template #tplOriginContent>\n <ng-content></ng-content>\n</ng-template>\n\n<div>\n <div *ngIf=\"mcMask\"\n class=\"mc-modal-mask\"\n [ngClass]=\"maskAnimationClassMap\"\n [class.mc-modal-mask-hidden]=\"hidden\"\n [ngStyle]=\"mcMaskStyle\"\n [style.zIndex]=\"mcZIndex\"\n ></div>\n <div (mousedown)=\"onClickMask($event)\"\n class=\"mc-modal-wrap {{ mcWrapClassName }}\"\n [style.zIndex]=\"mcZIndex\"\n [style.display]=\"hidden ? 'none' : ''\"\n tabindex=\"-1\">\n\n <div #modalContainer\n class=\"mc-modal {{ mcClassName }} mc-modal_{{ mcSize }}\"\n [ngClass]=\"modalAnimationClassMap\"\n [ngStyle]=\"mcStyle\"\n [style.width]=\"mcWidth | toCssUnit\"\n [style.transform-origin]=\"transformOrigin\">\n\n <div class=\"mc-modal-content\" cdkTrapFocus>\n <button *ngIf=\"mcClosable\"\n mc-button\n (click)=\"onClickCloseBtn()\"\n class=\"mc-modal-close mc-button_transparent\">\n <i mc-icon=\"mc-close-L_16\" class=\"mc-icon mc-icon_light\" [color]=\"themePalette.Second\"></i>\n </button>\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isModalType('default')\"\n [ngTemplateOutlet]=\"tplContentDefault\"></ng-container>\n <ng-container *ngSwitchCase=\"isModalType('confirm')\"\n [ngTemplateOutlet]=\"tplContentConfirm\"></ng-container>\n <ng-container *ngSwitchCase=\"isModalType('custom')\"\n [ngTemplateOutlet]=\"tplContentCustom\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n\n<ng-template #tplContentCustom>\n <ng-container #bodyContainer></ng-container>\n</ng-template>\n\n\n<!-- [Predefined] Default Modal Content -->\n<ng-template #tplContentDefault>\n <div *ngIf=\"mcTitle\" class=\"mc-modal-header\" [class.mc-modal-body_top-overflow]=\"isTopOverflow\">\n <div class=\"mc-modal-title\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isTemplateRef(mcTitle)\" [ngTemplateOutlet]=\"$any(mcTitle)\"></ng-container>\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcTitle)\">\n <div [innerHTML]=\"mcTitle\"></div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"mc-modal-body\" #modalBody [ngStyle]=\"mcBodyStyle\" (scroll)=\"checkOverflow()\">\n <ng-container #bodyContainer>\n <ng-container *ngIf=\"!isComponent(mcContent)\" [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isTemplateRef(mcContent)\" [ngTemplateOutlet]=\"$any(mcContent)\"></ng-container>\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcContent)\">\n <div [innerHTML]=\"mcContent\"></div>\n </ng-container>\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"tplOriginContent\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n <div *ngIf=\"mcFooter || mcOkText || mcCancelText\" class=\"mc-modal-footer\" [class.mc-modal-body_bottom-overflow]=\"isBottomOverflow\">\n <ng-container [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isTemplateRef(mcFooter)\" [ngTemplateOutlet]=\"$any(mcFooter)\"></ng-container>\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcFooter)\">\n <div [innerHTML]=\"mcFooter\"></div>\n </ng-container>\n <ng-container *ngSwitchCase=\"isModalButtons(mcFooter)\">\n <ng-container *ngFor=\"let button of $any(mcFooter)\">\n <button\n mc-button\n #autoFocusedButton\n [attr.autofocus]=\"button.autoFocus\"\n [attr.mc-modal-main-action]=\"button.mcModalMainAction\"\n *ngIf=\"getButtonCallableProp(button, 'show')\"\n [disabled]=\"getButtonCallableProp(button, 'disabled')\"\n [class.mc-progress]=\"getButtonCallableProp(button, 'loading')\"\n (click)=\"onButtonClick(button)\"\n [color]=\"button.type\">\n {{ button.label }}\n </button>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <button\n #autoFocusedButton\n [attr.autofocus]=\"true\"\n *ngIf=\"mcOkText\"\n mc-button\n [color]=\"themePalette.Primary\"\n (click)=\"onClickOkCancel('ok')\">\n\n {{ okText }}\n </button>\n <button *ngIf=\"mcCancelText\" mc-button (click)=\"onClickOkCancel('cancel')\">\n {{ cancelText }}\n </button>\n </ng-container>\n </ng-container>\n </div>\n</ng-template>\n<!-- /[Predefined] Default Modal Content -->\n\n<!-- [Predefined] Confirm Modal Content -->\n<ng-template #tplContentConfirm>\n <div class=\"mc-modal-body\" [ngStyle]=\"mcBodyStyle\">\n <div class=\"mc-confirm-body-wrapper\">\n <div class=\"mc-confirm-body\">\n <div class=\"mc-confirm-content\">\n <ng-container #bodyContainer>\n <ng-container *ngIf=\"!isComponent(mcContent)\" [ngSwitch]=\"true\">\n <ng-container *ngSwitchCase=\"isTemplateRef(mcContent)\"\n [ngTemplateOutlet]=\"$any(mcContent)\">\n </ng-container>\n <ng-container *ngSwitchCase=\"isNonEmptyString(mcContent)\">\n <div [innerHTML]=\"mcContent\"></div>\n </ng-container>\n <ng-container *ngSwitchDefault [ngTemplateOutlet]=\"tplOriginContent\"></ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div> <!-- /.mc-confirm-body-wrapper -->\n </div>\n <div class=\"mc-confirm-btns\" *ngIf=\"mcOkText || mcCancelText\">\n <button\n mc-button\n #autoFocusedButton\n [color]=\"mcOkType\"\n [attr.autofocus]=\"true\"\n *ngIf=\"mcOkText\"\n (click)=\"onClickOkCancel('ok')\">\n\n {{ okText }}\n </button>\n\n <button mc-button [color]=\"themePalette.Second\" *ngIf=\"mcCancelText\" (click)=\"onClickOkCancel('cancel')\">\n {{ cancelText }}\n </button>\n </div>\n</ng-template>\n<!-- /[Predefined] Confirm Modal Content -->\n", styles: [".mc-confirm .mc-modal-header,.mc-confirm .mc-modal-close{display:none}.mc-confirm .mc-modal-body{padding:var(--mc-modal-confirm-size-padding, 24px)}.mc-confirm-body-wrapper{zoom:1}.mc-confirm-body-wrapper:before,.mc-confirm-body-wrapper:after{content:\"\";display:table}.mc-confirm-body-wrapper:after{clear:both}.mc-confirm-body .mc-confirm-title{display:block;overflow:auto}.mc-confirm .mc-confirm-btns{border-radius:var(--mc-modal-footer-size-border-radius, 0 0 4px 4px);text-align:right}.mc-confirm .mc-confirm-btns button{margin:16px}.mc-modal{box-sizing:border-box;position:relative;top:var(--mc-modal-size-top, 48px);width:auto;margin:0 auto;list-style:none}.mc-modal.zoom-enter,.mc-modal.zoom-appear{animation-duration:.3s;transform:none;opacity:0}.mc-modal.mc-modal_small{width:var(--mc-modal-size-small, 400px)}.mc-modal.mc-modal_normal{width:var(--mc-modal-size-normal, 640px)}.mc-modal.mc-modal_large{width:var(--mc-modal-size-large, 960px)}.mc-modal .mc-modal-close{position:absolute;z-index:10;top:0;right:0;width:var(--mc-modal-size-close-width, 56px);height:var(--mc-modal-size-close-width, 56px)}.mc-modal-wrap{position:fixed;z-index:1000;top:0;right:0;bottom:0;left:0;overflow:auto;-webkit-overflow-scrolling:touch;outline:0}.mc-modal-title{margin:0}.mc-modal-content{position:relative;border-radius:var(--mc-modal-size-border-radius, 4px);background-clip:padding-box;background-color:#fff}.mc-modal-header{display:flex;align-items:center;height:var(--mc-modal-header-size-height, 56px);border-radius:var(--mc-modal-header-size-border-radius, 4px 4px 0 0);padding:var(--mc-modal-header-size-padding, 0 16px)}.mc-modal-body{display:block;overflow-y:auto;max-height:var(--mc-modal-body-size-max-height, calc(100vh - 260px));padding:var(--mc-modal-body-size-padding, 16px 24px 24px);word-wrap:break-word}.mc-modal-footer{display:flex;align-items:center;justify-content:right;height:var(--mc-modal-footer-size-height, 64px);border-radius:var(--mc-modal-footer-size-border-radius, 0 0 4px 4px);padding:var(--mc-modal-footer-size-padding, 0 16px)}.mc-modal-footer button+button{margin-left:16px;margin-bottom:0}.mc-modal-mask{position:fixed;z-index:1000;top:0;right:0;left:0;bottom:0;height:100%}.mc-modal-mask.mc-modal-mask-hidden{display:none}.mc-modal-open{overflow:hidden}\n"] }]
419
+ }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Renderer2 }, { type: i0.ComponentFactoryResolver }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i2.McModalControlService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
420
+ type: Inject,
421
+ args: [DOCUMENT]
422
+ }] }]; }, propDecorators: { mcModalType: [{
423
+ type: Input
424
+ }], mcComponent: [{
425
+ type: Input
426
+ }], mcContent: [{
427
+ type: Input
428
+ }], mcComponentParams: [{
429
+ type: Input
430
+ }], mcFooter: [{
431
+ type: Input
432
+ }], mcVisible: [{
433
+ type: Input
434
+ }], mcVisibleChange: [{
435
+ type: Output
436
+ }], mcZIndex: [{
437
+ type: Input
438
+ }], mcWidth: [{
439
+ type: Input
440
+ }], mcSize: [{
441
+ type: Input
442
+ }], mcWrapClassName: [{
443
+ type: Input
444
+ }], mcClassName: [{
445
+ type: Input
446
+ }], mcStyle: [{
447
+ type: Input
448
+ }], mcTitle: [{
449
+ type: Input
450
+ }], mcCloseByESC: [{
451
+ type: Input
452
+ }], mcClosable: [{
453
+ type: Input
454
+ }], mcMask: [{
455
+ type: Input
456
+ }], mcMaskClosable: [{
457
+ type: Input
458
+ }], mcMaskStyle: [{
459
+ type: Input
460
+ }], mcBodyStyle: [{
461
+ type: Input
462
+ }], mcAfterOpen: [{
463
+ type: Output
464
+ }], mcAfterClose: [{
465
+ type: Output
466
+ }], mcOkText: [{
467
+ type: Input
468
+ }], mcOkType: [{
469
+ type: Input
470
+ }], mcRestoreFocus: [{
471
+ type: Input
472
+ }], mcOkLoading: [{
473
+ type: Input
474
+ }], mcOnOk: [{
475
+ type: Input
476
+ }, {
477
+ type: Output
478
+ }], mcCancelText: [{
479
+ type: Input
480
+ }], mcCancelLoading: [{
481
+ type: Input
482
+ }], mcOnCancel: [{
483
+ type: Input
484
+ }, {
485
+ type: Output
486
+ }], modalContainer: [{
487
+ type: ViewChild,
488
+ args: ['modalContainer', { static: true }]
489
+ }], bodyContainer: [{
490
+ type: ViewChild,
491
+ args: ['bodyContainer', { read: ViewContainerRef, static: false }]
492
+ }], autoFocusedButtons: [{
493
+ type: ViewChildren,
494
+ args: ['autoFocusedButton', { read: ElementRef }]
495
+ }], modalBody: [{
496
+ type: ViewChild,
497
+ args: ['modalBody']
498
+ }], mcGetContainer: [{
499
+ type: Input
500
+ }] } });
501
+ ////////////
502
+ function isPromise(obj) {
503
+ // tslint:disable-next-line: no-unbound-method
504
+ return !!obj &&
505
+ (typeof obj === 'object' || typeof obj === 'function') &&
506
+ typeof obj.then === 'function' &&
507
+ typeof obj.catch === 'function';
508
+ }
509
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbW9zYWljL21vZGFsL21vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21vc2FpYy9tb2RhbC9tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1Qsd0JBQXdCLEVBRXhCLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBRVQsV0FBVyxFQUNYLElBQUksRUFDSixTQUFTLEVBQ1QsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLElBQUksU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sRUFBc0MsU0FBUyxFQUE4QixNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7OztBQUd6Ryx3Q0FBd0M7QUFDeEMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBZTFDLE1BQU0sT0FBTyxnQkFBbUMsU0FBUSxVQUFn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QUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sR0FBRyxLQUFLLFVBQVUsQ0FBQztRQUN0RCxPQUFRLEdBQW1CLENBQUMsSUFBSSxLQUFLLFVBQVU7UUFDL0MsT0FBUSxHQUFtQixDQUFDLEtBQUssS0FBSyxVQUFVLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBDb21wb25lbnRSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVHlwZSxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFU0NBUEUsIEVOVEVSIH0gZnJvbSAnQHB0c2VjdXJpdHkvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0BwdHNlY3VyaXR5L21vc2FpYy9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTWNNb2RhbENvbnRyb2xTZXJ2aWNlIH0gZnJvbSAnLi9tb2RhbC1jb250cm9sLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWNNb2RhbFJlZiB9IGZyb20gJy4vbW9kYWwtcmVmLmNsYXNzJztcbmltcG9ydCB7IG1vZGFsVXRpbE9iamVjdCBhcyBNb2RhbFV0aWwgfSBmcm9tICcuL21vZGFsLXV0aWwnO1xuaW1wb3J0IHsgSU1vZGFsQnV0dG9uT3B0aW9ucywgSU1vZGFsT3B0aW9ucywgTW9kYWxTaXplLCBNb2RhbFR5cGUsIE9uQ2xpY2tDYWxsYmFjayB9IGZyb20gJy4vbW9kYWwudHlwZSc7XG5cblxuLy8gRHVyYXRpb24gd2hlbiBwZXJmb3JtIGFuaW1hdGlvbnMgKG1zKVxuZXhwb3J0IGNvbnN0IE1PREFMX0FOSU1BVEVfRFVSQVRJT04gPSAyMDA7XG5cbnR5cGUgQW5pbWF0aW9uU3RhdGUgPSAnZW50ZXInIHwgJ2xlYXZlJyB8IG51bGw7XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdtYy1tb2RhbCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tb2RhbC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgICcoa2V5ZG93biknOiAnb25LZXlEb3duKCRldmVudCknXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBNY01vZGFsQ29tcG9uZW50PFQgPSBhbnksIFIgPSBhbnk+IGV4dGVuZHMgTWNNb2RhbFJlZjxULCBSPlxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgSU1vZGFsT3B0aW9ucyB7XG5cbiAgICB0aGVtZVBhbGV0dGUgPSBUaGVtZVBhbGV0dGU7XG5cbiAgICBASW5wdXQoKSBtY01vZGFsVHlwZTogTW9kYWxUeXBlID0gJ2RlZmF1bHQnO1xuXG4gICAgLy8gVGhlIGluc3RhbmNlIG9mIGNvbXBvbmVudCBvcGVuZWQgaW50byB0aGUgZGlhbG9nLlxuICAgIEBJbnB1dCgpIG1jQ29tcG9uZW50OiBUeXBlPFQ+O1xuICAgIC8vIElmIG5vdCBzcGVjaWZpZWQsIHdpbGwgdXNlIDxuZy1jb250ZW50PlxuICAgIEBJbnB1dCgpIG1jQ29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8e30+IHwgVHlwZTxUPjtcbiAgICAvLyBhdmFpbGFibGUgd2hlbiBtY0NvbnRlbnQgaXMgYSBjb21wb25lbnRcbiAgICBASW5wdXQoKSBtY0NvbXBvbmVudFBhcmFtczogVDtcbiAgICAvLyBEZWZhdWx0IE1vZGFsIE9OTFlcbiAgICBASW5wdXQoKSBtY0Zvb3Rlcjogc3RyaW5nIHwgVGVtcGxhdGVSZWY8e30+IHwgSU1vZGFsQnV0dG9uT3B0aW9uczxUPltdO1xuXG4gICAgQElucHV0KClcbiAgICBnZXQgbWNWaXNpYmxlKCkgeyByZXR1cm4gdGhpcy5fbWNWaXNpYmxlOyB9XG4gICAgc2V0IG1jVmlzaWJsZSh2YWx1ZSkgeyB0aGlzLl9tY1Zpc2libGUgPSB2YWx1ZTsgfVxuXG4gICAgcHJpdmF0ZSBfbWNWaXNpYmxlID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KCkgbWNWaXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQElucHV0KCkgbWNaSW5kZXg6IG51bWJlciA9IDEwMDA7XG4gICAgQElucHV0KCkgbWNXaWR0aDogbnVtYmVyIHwgc3RyaW5nO1xuICAgIEBJbnB1dCgpIG1jU2l6ZTogTW9kYWxTaXplID0gTW9kYWxTaXplLk5vcm1hbDtcbiAgICBASW5wdXQoKSBtY1dyYXBDbGFzc05hbWU6IHN0cmluZztcbiAgICBASW5wdXQoKSBtY0NsYXNzTmFtZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG1jU3R5bGU6IG9iamVjdDtcbiAgICBASW5wdXQoKSBtY1RpdGxlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx7fT47XG4gICAgQElucHV0KCkgbWNDbG9zZUJ5RVNDOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1jQ2xvc2FibGUoKSB7IHJldHVybiB0aGlzLl9tY0Nsb3NhYmxlOyB9XG4gICAgc2V0IG1jQ2xvc2FibGUodmFsdWUpIHsgdGhpcy5fbWNDbG9zYWJsZSA9IHZhbHVlOyB9XG4gICAgcHJpdmF0ZSBfbWNDbG9zYWJsZSA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBtY01hc2soKSB7IHJldHVybiB0aGlzLl9tY01hc2s7IH1cbiAgICBzZXQgbWNNYXNrKHZhbHVlKSB7IHRoaXMuX21jTWFzayA9IHZhbHVlOyB9XG4gICAgcHJpdmF0ZSBfbWNNYXNrID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1jTWFza0Nsb3NhYmxlKCkgeyByZXR1cm4gdGhpcy5fbWNNYXNrQ2xvc2FibGU7IH1cbiAgICBzZXQgbWNNYXNrQ2xvc2FibGUodmFsdWUpIHsgdGhpcy5fbWNNYXNrQ2xvc2FibGUgPSB2YWx1ZTsgfVxuICAgIHByaXZhdGUgX21jTWFza0Nsb3NhYmxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBtY01hc2tTdHlsZTogb2JqZWN0O1xuICAgIEBJbnB1dCgpIG1jQm9keVN0eWxlOiBvYmplY3Q7XG5cbiAgICAvLyBUcmlnZ2VyIHdoZW4gbW9kYWwgb3Blbih2aXNpYmxlKSBhZnRlciBhbmltYXRpb25zXG4gICAgQE91dHB1dCgpIG1jQWZ0ZXJPcGVuID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIC8vIFRyaWdnZXIgd2hlbiBtb2RhbCBsZWF2ZS1hbmltYXRpb24gb3ZlclxuICAgIEBPdXRwdXQoKSBtY0FmdGVyQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPFI+KCk7XG5cbiAgICAvLyAtLS0gUHJlZGVmaW5lZCBPSyAmIENhbmNlbCBidXR0b25zXG4gICAgQElucHV0KCkgbWNPa1RleHQ6IHN0cmluZztcbiAgICBASW5wdXQoKSBtY09rVHlwZSA9ICdwcmltYXJ5JztcblxuICAgIEBJbnB1dCgpIG1jUmVzdG9yZUZvY3VzID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IG1jT2tMb2FkaW5nKCkgeyByZXR1cm4gdGhpcy5fbWNPa0xvYWRpbmc7IH1cbiAgICBzZXQgbWNPa0xvYWRpbmcodmFsdWUpIHsgdGhpcy5fbWNPa0xvYWRpbmcgPSB2YWx1ZTsgfVxuICAgIHByaXZhdGUgX21jT2tMb2FkaW5nID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBAT3V0cHV0KCkgbWNPbk9rOiBFdmVudEVtaXR0ZXI8VD4gfCBPbkNsaWNrQ2FsbGJhY2s8VD4gPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gICAgQElucHV0KCkgbWNDYW5jZWxUZXh0OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIGdldCBtY0NhbmNlbExvYWRpbmcoKSB7IHJldHVybiB0aGlzLl9tY0NhbmNlbExvYWRpbmc7IH1cbiAgICBzZXQgbWNDYW5jZWxMb2FkaW5nKHZhbHVlKSB7IHRoaXMuX21jQ2FuY2VsTG9hZGluZyA9IHZhbHVlOyB9XG4gICAgcHJpdmF0ZSBfbWNDYW5jZWxMb2FkaW5nID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBAT3V0cHV0KCkgbWNPbkNhbmNlbDogRXZlbnRFbWl0dGVyPFQ+IHwgT25DbGlja0NhbGxiYWNrPFQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gICAgQFZpZXdDaGlsZCgnbW9kYWxDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBtb2RhbENvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdib2R5Q29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlIH0pIGJvZHlDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gICAgLy8gT25seSBhaW0gdG8gZm9jdXMgdGhlIG9rIGJ1dHRvbiB0aGF0IG5lZWRzIHRvIGJlIGF1dG8gZm9jdXNlZFxuICAgIEBWaWV3Q2hpbGRyZW4oJ2F1dG9Gb2N1c2VkQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGF1dG9Gb2N1c2VkQnV0dG9uczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gICAgQFZpZXdDaGlsZCgnbW9kYWxCb2R5JykgbW9kYWxCb2R5OiBFbGVtZW50UmVmO1xuXG4gICAgaXNUb3BPdmVyZmxvdzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlzQm90dG9tT3ZlcmZsb3c6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIG1hc2tBbmltYXRpb25DbGFzc01hcDogb2JqZWN0O1xuICAgIG1vZGFsQW5pbWF0aW9uQ2xhc3NNYXA6IG9iamVjdDtcbiAgICAvLyBUaGUgb3JpZ2luIHBvaW50IHRoYXQgYW5pbWF0aW9uIGJhc2VkIG9uXG4gICAgdHJhbnNmb3JtT3JpZ2luID0gJzBweCAwcHggMHB4JztcblxuICAgIC8vIE9ic2VydmFibGUgYWxpYXMgZm9yIG1jQWZ0ZXJPcGVuXG4gICAgZ2V0IGFmdGVyT3BlbigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWNBZnRlck9wZW4uYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gT2JzZXJ2YWJsZSBhbGlhcyBmb3IgbWNBZnRlckNsb3NlXG4gICAgZ2V0IGFmdGVyQ2xvc2UoKTogT2JzZXJ2YWJsZTxSPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1jQWZ0ZXJDbG9zZS5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBnZXQgb2tUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1jT2tUZXh0O1xuICAgIH1cblxuICAgIGdldCBjYW5jZWxUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1jQ2FuY2VsVGV4dDtcbiAgICB9XG5cbiAgICAvLyBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgZGlhbG9nIHNob3VsZCBoaWRkZW5cbiAgICBnZXQgaGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMubWNWaXNpYmxlICYmICF0aGlzLmFuaW1hdGlvblN0YXRlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuOiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICAvLyBIYW5kbGUgdGhlIHJlZmVyZW5jZSB3aGVuIHVzaW5nIG1jQ29udGVudCBhcyBDb21wb25lbnRcbiAgICBwcml2YXRlIGNvbnRlbnRDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUPjtcbiAgICAvLyBDdXJyZW50IGFuaW1hdGlvbiBzdGF0ZVxuICAgIHByaXZhdGUgYW5pbWF0aW9uU3RhdGU6IEFuaW1hdGlvblN0YXRlO1xuICAgIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IE92ZXJsYXlSZWY7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIHByaXZhdGUgY2ZyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIG1vZGFsQ29udHJvbDogTWNNb2RhbENvbnRyb2xTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogYW55XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgbWNHZXRDb250YWluZXI6IEhUTUxFbGVtZW50IHwgT3ZlcmxheVJlZiB8ICgoKSA9PiBIVE1MRWxlbWVudCB8IE92ZXJsYXlSZWYpID0gKCkgPT4gdGhpcy5vdmVybGF5LmNyZWF0ZSgpO1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBjb21wb25lbnQgYWxvbmcgd2l0aG91dCBWaWV3XG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50KHRoaXMubWNDb250ZW50KSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVEeW5hbWljQ29tcG9uZW50KHRoaXMubWNDb250ZW50IGFzIFR5cGU8VD4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0dXAgZGVmYXVsdCBidXR0b24gb3B0aW9uc1xuICAgICAgICBpZiAodGhpcy5pc01vZGFsQnV0dG9ucyh0aGlzLm1jRm9vdGVyKSkge1xuICAgICAgICAgICAgdGhpcy5tY0Zvb3RlciA9IHRoaXMuZm9ybWF0TW9kYWxCdXR0b25zKHRoaXMubWNGb290ZXIgYXMgSU1vZGFsQnV0dG9uT3B0aW9uczxUPltdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50KHRoaXMubWNDb21wb25lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUR5bmFtaWNDb21wb25lbnQodGhpcy5tY0NvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQbGFjZSB0aGUgbW9kYWwgZG9tIHRvIGVsc2V3aGVyZVxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHR5cGVvZiB0aGlzLm1jR2V0Q29udGFpbmVyID09PSAnZnVuY3Rpb24nID8gdGhpcy5tY0dldENvbnRhaW5lcigpIDogdGhpcy5tY0dldENvbnRhaW5lcjtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIE92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IG9ubHkgYXR0YWNoIHRoZSBkb20gdG8gb3ZlcmxheSwgdGhlIHZpZXcgY29udGFpbmVyIGlzIG5vdCBjaGFuZ2VkIGFjdHVhbGx5XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5vdmVybGF5RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWdpc3RlciBtb2RhbCB3aGVuIGFmdGVyT3Blbi9hZnRlckNsb3NlIGlzIHN0YWJsZVxuICAgICAgICB0aGlzLm1vZGFsQ29udHJvbC5yZWdpc3Rlck1vZGFsKHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFtOT1RFXSBOT1QgYXZhaWxhYmxlIHdoZW4gdXNpbmcgYnkgc2VydmljZSFcbiAgICAvLyBCZWNhdXNlIG5nT25DaGFuZ2VzIG5ldmVyIGJlIGNhbGxlZCB3aGVuIHVzaW5nIGJ5IHNlcnZpY2UsXG4gICAgLy8gaGVyZSB3ZSBjYW4ndCBzdXBwb3J0IFwibWNDb250ZW50XCIoQ29tcG9uZW50KSBldGMuIGFzIGlucHV0cyB0aGF0IGluaXRpYWxpemVkIGR5bmFtaWNhbGx5LlxuICAgIC8vIEJVVDogVXNlciBhbHNvIGNhbiBjaGFuZ2UgXCJtY0NvbnRlbnRcIiBkeW5hbWljYWxseSB0byB0cmlnZ2VyIFVJIGNoYW5nZXNcbiAgICAvLyAocHJvdmlkZWQgeW91IGRvbid0IHVzZSBcYkNvbXBvbmVudCB0aGF0IG5lZWRzIGluaXRpYWxpemF0aW9ucylcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLm1jVmlzaWJsZSkge1xuICAgICAgICAgICAgLy8gRG8gbm90IHRyaWdnZXIgYW5pbWF0aW9uIHdoaWxlIGluaXRpYWxpemluZ1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVWaXNpYmxlU3RhdGVDaGFuZ2UodGhpcy5tY1Zpc2libGUsICFjaGFuZ2VzLm1jVmlzaWJsZS5maXJzdENoYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIC8vIElmIHVzaW5nIENvbXBvbmVudCwgaXQgaXMgdGhlIHRpbWUgdG8gYXR0YWNoIFZpZXcgd2hpbGUgYm9keUNvbnRhaW5lciBpcyByZWFkeVxuICAgICAgICBpZiAodGhpcy5jb250ZW50Q29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICB0aGlzLmJvZHlDb250YWluZXIuaW5zZXJ0KHRoaXMuY29udGVudENvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpWzBdPy5mb2N1cygpO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXV0b0ZvY3VzZWRCdXR0b24gb2YgdGhpcy5hdXRvRm9jdXNlZEJ1dHRvbnMudG9BcnJheSgpKSB7XG4gICAgICAgICAgICBpZiAoYXV0b0ZvY3VzZWRCdXR0b24ubmF0aXZlRWxlbWVudC5hdXRvZm9jdXMpIHtcbiAgICAgICAgICAgICAgICAoYXV0b0ZvY3VzZWRCdXR0b24ubmF0aXZlRWxlbWVudCBhcyBIVE1MQnV0dG9uRWxlbWVudCkuZm9jdXMoKTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja092ZXJmbG93KCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciBpbnN0YW5jZW9mIE92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrT3ZlcmZsb3coKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLm1vZGFsQm9keT8ubmF0aXZlRWxlbWVudDtcblxuICAgICAgICBpZiAoIW5hdGl2ZUVsZW1lbnQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wOiBudW1iZXIgPSBuYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgY29uc3Qgb2Zmc2V0SGVpZ2h0OiBudW1iZXIgPSBuYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsSGVpZ2h0OiBudW1iZXIgPSBuYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcblxuICAgICAgICB0aGlzLmlzVG9wT3ZlcmZsb3cgPSBzY3JvbGxUb3AgPiAwO1xuXG4gICAgICAgIHRoaXMuaXNCb3R0b21PdmVyZmxvdyA9IChzY3JvbGxUb3AgYXMgbnVtYmVyICsgb2Zmc2V0SGVpZ2h0IGFzIG51bWJlcikgPCBzY3JvbGxIZWlnaHQ7XG4gICAgfVxuXG4gICAgb3BlbigpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW4gPSB0aGlzLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VWaXNpYmxlRnJvbUluc2lkZSh0cnVlKTtcbiAgICB9XG5cbiAgICBjbG9zZShyZXN1bHQ/OiBSKSB7XG4gICAgICAgIGlmICh0aGlzLm1jUmVzdG9yZUZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRFbGVtZW50QmVmb3JlT3Blbj8uZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlVmlzaWJsZUZyb21JbnNpZGUoZmFsc2UsIHJlc3VsdCk7XG5cbiAgICAgICAgdGhpcy5mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW4gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgZXF1YWxzIENsb3NlXG4gICAgZGVzdHJveShyZXN1bHQ/OiBSKSB7XG4gICAgICAgIHRoaXMuY2xvc2UocmVzdWx0KTtcbiAgICB9XG5cbiAgICBtYXJrRm9yQ2hlY2soKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgdHJpZ2dlck9rKCkge1xuICAgICAgICB0aGlzLm9uQ2xpY2tPa0NhbmNlbCgnb2snKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLm9uQ2xpY2tPa0NhbmNlbCgnY2FuY2VsJyk7XG4gICAgfVxuXG4gICAgZ2V0SW5zdGFuY2UoKTogTWNNb2RhbENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGdldENvbnRlbnRDb21wb25lbnRSZWYoKTogQ29tcG9uZW50UmVmPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudENvbXBvbmVudFJlZjtcbiAgICB9XG5cbiAgICBnZXRDb250ZW50Q29tcG9uZW50KCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50Q29tcG9uZW50UmVmICYmIHRoaXMuY29udGVudENvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZiAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXRNY0Zvb3RlcigpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtYy1tb2RhbC1mb290ZXInKS5pdGVtKDApIGFzIEhUTUxFbGVtZW50O1xuICAgIH1cblxuICAgIG9uQ2xpY2tNYXNrKCRldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLm1jTWFzayAmJlxuICAgICAgICAgICAgdGhpcy5tY01hc2tDbG9zYWJsZSAmJlxuICAgICAgICAgICAgKCRldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnbWMtbW9kYWwtd3JhcCcpICYmXG4gICAgICAgICAgICB0aGlzLm1jVmlzaWJsZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMub25DbGlja09rQ2FuY2VsKCdjYW5jZWwnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tcmVzZXJ2ZWQta2V5d29yZHNcbiAgICBpc01vZGFsVHlwZSh0eXBlOiBNb2RhbFR5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWNNb2RhbFR5cGUgPT09IHR5cGU7XG4gICAgfVxuXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG5cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRlcHJlY2F0aW9uIC5rZXkgaXNuJ3Qgc3VwcG9ydGVkIGluIEVkZ2VcbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSAmJiB0aGlzLmNvbnRhaW5lciAmJiAodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBPdmVybGF5UmVmKSkge1xuXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkZXByZWNhdGlvbiAua2V5IGlzbid0IHN1cHBvcnRlZCBpbiBFZGdlXG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IEVOVEVSKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tY01vZGFsVHlwZSA9PT0gJ2NvbmZpcm0nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyT2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKHRoaXMuZ2V0RWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1ttYy1tb2RhbC1tYWluLWFjdGlvbl0nKSBhcyBIVE1MRWxlbWVudCk/LmNsaWNrKCk7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBb1RcbiAgICBvbkNsaWNrQ2xvc2VCdG4oKSB7XG4gICAgICAgIGlmICh0aGlzLm1jVmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5vbkNsaWNrT2tDYW5jZWwoJ2NhbmNlbCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQW9UXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1yZXNlcnZlZC1rZXl3b3Jkc1xuICAgIG9uQ2xpY2tPa0NhbmNlbCh0eXBlOiAnb2snIHwgJ2NhbmNlbCcpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlciA9IHsgb2s6IHRoaXMubWNPbk9rLCBjYW5jZWw6IHRoaXMubWNPbkNhbmNlbCB9W3R5cGVdO1xuICAgICAgICBjb25zdCBsb2FkaW5nS2V5ID0geyBvazogJ21jT2tMb2FkaW5nJywgY2FuY2VsOiAnbWNDYW5jZWxMb2FkaW5nJyB9W3R5cGVdO1xuXG4gICAgICAgIGlmICh0cmlnZ2VyIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyLmVtaXQodGhpcy5nZXRDb250ZW50Q29tcG9uZW50KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0cmlnZ2VyID09PSAnZnVuY3Rpb24nKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRyaWdnZXIodGhpcy5nZXRDb250ZW50Q29tcG9uZW50KCkpO1xuICAgICAgICAgICAgLy8gVXNlcnMgY2FuIHJldHVybiBcImZhbHNlXCIgdG8gcHJldmVudCBjbG9zaW5nIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGNvbnN0IGNhc2VDbG9zZSA9IChkb0Nsb3NlOiBib29sZWFuIHwgdm9pZCB8IHt9KSA9PiAoZG9DbG9zZSAhPT0gZmFsc2UpICYmIHRoaXMuY2xvc2UoZG9DbG9zZSBhcyBSKTtcblxuICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tsb2FkaW5nS2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlVGhlbiA9IChkb0Nsb3NlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbbG9hZGluZ0tleV0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZUNsb3NlKGRvQ2xvc2UpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgKHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+KS50aGVuKGhhbmRsZVRoZW4pLmNhdGNoKGhhbmRsZVRoZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYXNlQ2xvc2UocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFvVFxuICAgIGlzTm9uRW1wdHlTdHJpbmcodmFsdWU6IHt9KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnJztcbiAgICB9XG5cbiAgICAvLyBBb1RcbiAgICBpc1RlbXBsYXRlUmVmKHZhbHVlOiB7fSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgICB9XG5cbiAgICAvLyBBb1RcbiAgICBpc0NvbXBvbmVudCh2YWx1ZToge30pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVHlwZTtcbiAgICB9XG5cbiAgICAvLyBBb1RcbiAgICBpc01vZGFsQnV0dG9ucyh2YWx1ZToge30pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLy8gTG9va3VwIGEgYnV0dG9uJ3MgcHJvcGVydHksIGlmIHRoZSBwcm9wIGlzIGEgZnVuY3Rpb24sIGNhbGwgJiB0aGVuIHJldHVybiB0aGUgcmVzdWx0LCBvdGhlcndpc2UsIHJldHVybiBpdHNlbGYuXG4gICAgLy8gQW9UXG4gICAgZ2V0QnV0dG9uQ2FsbGFibGVQcm9wKG9wdGlvbnM6IElNb2RhbEJ1dHRvbk9wdGlvbnM8VD4sIHByb3A6IHN0cmluZyk6IHt9IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW3Byb3BdO1xuICAgICAgICBjb25zdCBhcmdzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50Q29tcG9uZW50UmVmKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2godGhpcy5jb250ZW50Q29tcG9uZW50UmVmLmluc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS5hcHBseShvcHRpb25zLCBhcmdzKSA6IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIE9uIG1jRm9vdGVyJ3MgbW9kYWwgYnV0dG9uIGNsaWNrXG4gICAgLy8gQW9UXG4gICAgb25CdXR0b25DbGljayhidXR0b246IElNb2RhbEJ1dHRvbk9wdGlvbnM8VD4pIHtcbiAgICAgICAgLy8gQ2FsbCBvbkNsaWNrIGRpcmVjdGx5XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbmZlcnJlZC1lbXB0eS1vYmplY3QtdHlwZSAgcnVsZSBzZWVtcyB0byBiZSBicm9rZW5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRCdXR0b25DYWxsYWJsZVByb3AoYnV0dG9uLCAnb25DbGljaycpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGJ1dHRvbi5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIChyZXN1bHQgYXMgUHJvbWlzZTx7fT4pLnRoZW4oKCkgPT4gYnV0dG9uLmxvYWRpbmcgPSBmYWxzZSkuY2F0Y2goKCkgPT4gYnV0dG9uLmxvYWRpbmcgPSBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEbyByZXN0IHRoaW5ncyB3aGVuIHZpc2libGUgc3RhdGUgY2hhbmdlZFxuICAgIHByaXZhdGUgaGFuZGxlVmlzaWJsZVN0YXRlQ2hhbmdlKHZpc2libGU6IGJvb2xlYW4sIGFuaW1hdGlvbjogYm9vbGVhbiA9IHRydWUsIGNsb3NlUmVzdWx0PzogUik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIC8vIEhpZGUgc2Nyb2xsYmFyIGF0IHRoZSBmaXJzdCB0aW1lIHdoZW4gc2hvd24gdXBcbiAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlQm9keU92ZXJmbG93KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VcbiAgICAgICAgICAgIC5yZXNvbHZlKGFuaW1hdGlvbiAmJiB0aGlzLmFuaW1hdGVUbyh2aXNpYmxlKSlcbiAgICAgICAgICAgIC8vIEVtaXQgb3Blbi9jbG9zZSBldmVudCBhZnRlciBhbmltYXRpb25zIG92ZXJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1jQWZ0ZXJPcGVuLmVtaXQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1jQWZ0ZXJDbG9zZS5lbWl0KGNsb3NlUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdy9oaWRlIHNjcm9sbGJhciB3aGVuIGFuaW1hdGlvbiBpcyBvdmVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQm9keU92ZXJmbG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIG1jVmlzaWJsZSBmcm9tIGluc2lkZVxuICAgIHByaXZhdGUgY2hhbmdlVmlzaWJsZUZyb21JbnNpZGUodmlzaWJsZTogYm9vbGVhbiwgY2xvc2VSZXN1bHQ/OiBSKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm1jVmlzaWJsZSAhPT0gdmlzaWJsZSkge1xuICAgICAgICAgICAgLy8gQ2hhbmdlIG1jVmlzaWJsZSB2YWx1ZSBpbW1lZGlhdGVseVxuICAgICAgICAgICAgdGhpcy5tY1Zpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICAgICAgdGhpcy5tY1Zpc2libGVDaGFuZ2UuZW1pdCh2aXNpYmxlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlVmlzaWJsZVN0YXRlQ2hhbmdlKHZpc2libGUsIHRydWUsIGNsb3NlUmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZUFuaW1hdGlvblN0YXRlKHN0YXRlOiBBbmltYXRpb25TdGF0ZSkge1xuICAgICAgICB0aGlzLmFuaW1hdGlvblN0YXRlID0gc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrQW5pbWF0aW9uQ2xhc3NNYXAgPSB7XG4gICAgICAgICAgICAgICAgW2BmYWRlLSR7c3RhdGV9YF06IHRydWUsXG4gICAgICAgICAgICAgICAgW2BmYWRlLSR7c3RhdGV9LWFjdGl2ZWBdOiB0cnVlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLm1vZGFsQW5pbWF0aW9uQ2xhc3NNYXAgPSB7XG4gICAgICAgICAgICAgICAgW2B6b29tLSR7c3RhdGV9YF06IHRydWUsXG4gICAgICAgICAgICAgICAgW2B6b29tLSR7c3RhdGV9LWFjdGl2ZWBdOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5tYXNrQW5pbWF0aW9uQ2xhc3NNYXAgPSB0aGlzLm1vZGFsQW5pbWF0aW9uQ2xhc3NNYXAgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudENvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50Q29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYW5pbWF0ZVRvKGlzVmlzaWJsZTogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIGxhc3Rlc3QgY2xpY2sgcG9zaXRpb24gd2hlbiBzaG93cyB1cFxuICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAvLyBbTk9URV0gVXNpbmcgdGltZW91dCBkdWUgdG8gdGhlIGRvY3VtZW50LmNsaWNrIGV2ZW50IGlzIGZpcmVkIGxhdGVyIHRoYW4gdmlzaWJsZSBjaGFuZ2UsXG4gICAgICAgICAgICAvLyBzbyBpZiBub3QgcG9zdHBvbmVkIHRvIG5leHQgZXZlbnQtbG9vcCwgd2UgY2FuJ3QgZ2V0IHRoZSBsYXN0ZXN0IGNsaWNrIHBvc2l0aW9uXG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVRyYW5zZm9ybU9yaWdpbigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlQW5pbWF0aW9uU3RhdGUoaXNWaXNpYmxlID8gJ2VudGVyJyA6ICdsZWF2ZScpO1xuXG4gICAgICAgIC8vIFJldHVybiB3aGVuIGFuaW1hdGlvbiBpcyBvdmVyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VBbmltYXRpb25TdGF0ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE1PREFMX0FOSU1BVEVfRFVSQVRJT05cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0TW9kYWxCdXR0b25zKGJ1dHRvbnM6IElNb2RhbEJ1dHRvbk9wdGlvbnM8VD5bXSk6IElNb2RhbEJ1dHRvbk9wdGlvbnM8VD5bXSB7XG4gICAgICAgIHJldHVybiBidXR0b25zLm1hcCgoYnV0dG9uKSA9PiB7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0xvYWRpbmc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNob3c6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLmJ1dHRvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY29tcG9uZW50IGR5bmFtaWNhbGx5IGJ1dCBub3QgYXR0YWNoIHRvIGFueSBWaWV3XG4gICAgICogKHRoaXMgYWN0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBib2R5Q29udGFpbmVyIGlzIHJlYWR5KVxuICAgICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IGNsYXNzXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVEeW5hbWljQ29tcG9uZW50KGNvbXBvbmVudDogVHlwZTxUPikge1xuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5jZnIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgY2hpbGRJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogTWNNb2RhbFJlZiwgdXNlVmFsdWU6IHRoaXN9XSxcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy52aWV3Q29udGFpbmVyLmluamVjdG9yXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29udGVudENvbXBvbmVudFJlZiA9IGZhY3RvcnkuY3JlYXRlKGNoaWxkSW5qZWN0b3IpO1xuXG4gICAgICAgIGlmICh0aGlzLm1jQ29tcG9uZW50UGFyYW1zKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuY29udGVudENvbXBvbmVudFJlZi5pbnN0YW5jZSwgdGhpcy5tY0NvbXBvbmVudFBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEbyB0aGUgZmlyc3QgY2hhbmdlIGRldGVjdGlvbiBpbW1lZGlhdGVseVxuICAgICAgICAvLyAob3Igd2UgZG8gZGV0ZWN0aW9uIGF0IG5nQWZ0ZXJWaWV3SW5pdCwgbXVsdGktY2hhbmdlcyBlcnJvciB3aWxsIGJlIHRocm93bilcbiAgICAgICAgdGhpcy5jb250ZW50Q29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdHJhbnNmb3JtLW9yaWdpbiB0byB0aGUgbGFzdCBjbGljayBwb3NpdGlvbiBvbiBkb2N1bWVudFxuICAgIHByaXZhdGUgdXBkYXRlVHJhbnNmb3JtT3JpZ2luKCkge1xuICAgICAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSB0aGlzLm1vZGFsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxhc3RQb3NpdGlvbiA9IE1vZGFsVXRpbC5nZXRMYXN0Q2xpY2tQb3NpdGlvbigpO1xuXG4gICAgICAgIGlmIChsYXN0UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtT3JpZ2luID0gYCR7bGFzdFBvc2l0aW9uLnggLSBtb2RhbEVsZW1lbnQub2Zmc2V0TGVmdH1weCAke2xhc3RQb3NpdGlvbi55IC0gbW9kYWxFbGVtZW50Lm9mZnNldFRvcH1weCAwcHhgO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZSBjYXJlIG9mIHRoZSBib2R5J3Mgb3ZlcmZsb3cgdG8gZGVjaWRlIHRoZSBleGlzdGVuc2Ugb2Ygc2Nyb2xsYmFyXG4gICAgICogQHBhcmFtIHBsdXNOdW0gVGhlIG51bWJlciB0aGF0IHRoZSBvcGVuTW9kYWxzLmxlbmd0aCB3aWxsIGluY3JlYXNlIHNvb25cbiAgICAgKi9cbiAgICBwcml2YXRlIGNoYW5nZUJvZHlPdmVyZmxvdyhwbHVzTnVtOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGNvbnN0IG9wZW5Nb2RhbHMgPSB0aGlzLm1vZGFsQ29udHJvbC5vcGVuTW9kYWxzO1xuXG4gICAgICAgIGlmIChvcGVuTW9kYWxzLmxlbmd0aCArIHBsdXNOdW0gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZG9jdW1lbnQuYm9keSwgJ292ZXJmbG93JywgJ2hpZGRlbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmRvY3VtZW50LmJvZHksICdvdmVyZmxvdycpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLy8vLy8vLy8vLy9cblxuZnVuY3Rpb24gaXNQcm9taXNlKG9iajoge30gfCB2b2lkKTogYm9vbGVhbiB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bmJvdW5kLW1ldGhvZFxuICAgIHJldHVybiAhIW9iaiAmJlxuICAgICAgICAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAgICAgdHlwZW9mIChvYmogYXMgUHJvbWlzZTx7fT4pLnRoZW4gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIChvYmogYXMgUHJvbWlzZTx7fT4pLmNhdGNoID09PSAnZnVuY3Rpb24nO1xufVxuIiwiPCEtLSBDb21wYXRpYmxlOiB0aGUgPG5nLWNvbnRlbnQ+IGNhbiBhcHBlYXIgb25seSBvbmNlIC0tPlxuPG5nLXRlbXBsYXRlICN0cGxPcmlnaW5Db250ZW50PlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXY+XG4gICAgPGRpdiAqbmdJZj1cIm1jTWFza1wiXG4gICAgICAgICBjbGFzcz1cIm1jLW1vZGFsLW1hc2tcIlxuICAgICAgICAgW25nQ2xhc3NdPVwibWFza0FuaW1hdGlvbkNsYXNzTWFwXCJcbiAgICAgICAgIFtjbGFzcy5tYy1tb2RhbC1tYXNrLWhpZGRlbl09XCJoaWRkZW5cIlxuICAgICAgICAgW25nU3R5bGVdPVwibWNNYXNrU3R5bGVcIlxuICAgICAgICAgW3N0eWxlLnpJbmRleF09XCJtY1pJbmRleFwiXG4gICAgPjwvZGl2PlxuICAgIDxkaXYgKG1vdXNlZG93bik9XCJvbkNsaWNrTWFzaygkZXZlbnQpXCJcbiAgICAgICAgIGNsYXNzPVwibWMtbW9kYWwtd3JhcCB7eyBtY1dyYXBDbGFzc05hbWUgfX1cIlxuICAgICAgICAgW3N0eWxlLnpJbmRleF09XCJtY1pJbmRleFwiXG4gICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJoaWRkZW4gPyAnbm9uZScgOiAnJ1wiXG4gICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG5cbiAgICAgICAgPGRpdiAjbW9kYWxDb250YWluZXJcbiAgICAgICAgICAgICBjbGFzcz1cIm1jLW1vZGFsIHt7IG1jQ2xhc3NOYW1lIH19IG1jLW1vZGFsX3t7IG1jU2l6ZSB9fVwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwibW9kYWxBbmltYXRpb25DbGFzc01hcFwiXG4gICAgICAgICAgICAgW25nU3R5bGVdPVwibWNTdHlsZVwiXG4gICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIm1jV2lkdGggfCB0b0Nzc1VuaXRcIlxuICAgICAgICAgICAgIFtzdHlsZS50cmFuc2Zvcm0tb3JpZ2luXT1cInRyYW5zZm9ybU9yaWdpblwiPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWMtbW9kYWwtY29udGVudFwiIGNka1RyYXBGb2N1cz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwibWNDbG9zYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrQ2xvc2VCdG4oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1jLW1vZGFsLWNsb3NlIG1jLWJ1dHRvbl90cmFuc3BhcmVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBtYy1pY29uPVwibWMtY2xvc2UtTF8xNlwiIGNsYXNzPVwibWMtaWNvbiBtYy1pY29uX2xpZ2h0XCIgW2NvbG9yXT1cInRoZW1lUGFsZXR0ZS5TZWNvbmRcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc01vZGFsVHlwZSgnZGVmYXVsdCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0cGxDb250ZW50RGVmYXVsdFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc01vZGFsVHlwZSgnY29uZmlybScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0cGxDb250ZW50Q29uZmlybVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc01vZGFsVHlwZSgnY3VzdG9tJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRwbENvbnRlbnRDdXN0b21cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RwbENvbnRlbnRDdXN0b20+XG4gICAgPG5nLWNvbnRhaW5lciAjYm9keUNvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cblxuPCEtLSBbUHJlZGVmaW5lZF0gRGVmYXVsdCBNb2RhbCBDb250ZW50IC0tPlxuPG5nLXRlbXBsYXRlICN0cGxDb250ZW50RGVmYXVsdD5cbiAgICA8ZGl2ICpuZ0lmPVwibWNUaXRsZVwiIGNsYXNzPVwibWMtbW9kYWwtaGVhZGVyXCIgW2NsYXNzLm1jLW1vZGFsLWJvZHlfdG9wLW92ZXJmbG93XT1cImlzVG9wT3ZlcmZsb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1jLW1vZGFsLXRpdGxlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNUZW1wbGF0ZVJlZihtY1RpdGxlKVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkobWNUaXRsZSlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJpc05vbkVtcHR5U3RyaW5nKG1jVGl0bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJtY1RpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1jLW1vZGFsLWJvZHlcIiAjbW9kYWxCb2R5IFtuZ1N0eWxlXT1cIm1jQm9keVN0eWxlXCIgKHNjcm9sbCk9XCJjaGVja092ZXJmbG93KClcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAjYm9keUNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDb21wb25lbnQobWNDb250ZW50KVwiIFtuZ1N3aXRjaF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNUZW1wbGF0ZVJlZihtY0NvbnRlbnQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShtY0NvbnRlbnQpXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNOb25FbXB0eVN0cmluZyhtY0NvbnRlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJtY0NvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQgW25nVGVtcGxhdGVPdXRsZXRdPVwidHBsT3JpZ2luQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJtY0Zvb3RlciB8fCBtY09rVGV4dCB8fCBtY0NhbmNlbFRleHRcIiBjbGFzcz1cIm1jLW1vZGFsLWZvb3RlclwiIFtjbGFzcy5tYy1tb2RhbC1ib2R5X2JvdHRvbS1vdmVyZmxvd109XCJpc0JvdHRvbU92ZXJmbG93XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInRydWVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImlzVGVtcGxhdGVSZWYobWNGb290ZXIpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShtY0Zvb3RlcilcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImlzTm9uRW1wdHlTdHJpbmcobWNGb290ZXIpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cIm1jRm9vdGVyXCI+PC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImlzTW9kYWxCdXR0b25zKG1jRm9vdGVyKVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiAkYW55KG1jRm9vdGVyKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICNhdXRvRm9jdXNlZEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXV0b2ZvY3VzXT1cImJ1dHRvbi5hdXRvRm9jdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWMtbW9kYWwtbWFpbi1hY3Rpb25dPVwiYnV0dG9uLm1jTW9kYWxNYWluQWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0QnV0dG9uQ2FsbGFibGVQcm9wKGJ1dHRvbiwgJ3Nob3cnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0QnV0dG9uQ2FsbGFibGVQcm9wKGJ1dHRvbiwgJ2Rpc2FibGVkJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1jLXByb2dyZXNzXT1cImdldEJ1dHRvbkNhbGxhYmxlUHJvcChidXR0b24sICdsb2FkaW5nJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiYnV0dG9uLnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGJ1dHRvbi5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgI2F1dG9Gb2N1c2VkQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmF1dG9mb2N1c109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtY09rVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIG1jLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwidGhlbWVQYWxldHRlLlByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja09rQ2FuY2VsKCdvaycpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAge3sgb2tUZXh0IH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIm1jQ2FuY2VsVGV4dFwiIG1jLWJ1dHRvbiAoY2xpY2spPVwib25DbGlja09rQ2FuY2VsKCdjYW5jZWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjYW5jZWxUZXh0IH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPCEtLSAvW1ByZWRlZmluZWRdIERlZmF1bHQgTW9kYWwgQ29udGVudCAtLT5cblxuPCEtLSBbUHJlZGVmaW5lZF0gQ29uZmlybSBNb2RhbCBDb250ZW50IC0tPlxuPG5nLXRlbXBsYXRlICN0cGxDb250ZW50Q29uZmlybT5cbiAgICA8ZGl2IGNsYXNzPVwibWMtbW9kYWwtYm9keVwiIFtuZ1N0eWxlXT1cIm1jQm9keVN0eWxlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYy1jb25maXJtLWJvZHktd3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1jLWNvbmZpcm0tYm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYy1jb25maXJtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAjYm9keUNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNDb21wb25lbnQobWNDb250ZW50KVwiIFtuZ1N3aXRjaF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiaXNUZW1wbGF0ZVJlZihtY0NvbnRlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkobWNDb250ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImlzTm9uRW1wdHlTdHJpbmcobWNDb250ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwibWNDb250ZW50XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0IFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRwbE9yaWdpbkNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4gPCEtLSAvLm1jLWNvbmZpcm0tYm9keS13cmFwcGVyIC0tPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYy1jb25maXJtLWJ0bnNcIiAqbmdJZj1cIm1jT2tUZXh0IHx8IG1jQ2FuY2VsVGV4dFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYy1idXR0b25cbiAgICAgICAgICAgICNhdXRvRm9jdXNlZEJ1dHRvblxuICAgICAgICAgICAgW2NvbG9yXT1cIm1jT2tUeXBlXCJcbiAgICAgICAgICAgIFthdHRyLmF1dG9mb2N1c109XCJ0cnVlXCJcbiAgICAgICAgICAgICpuZ0lmPVwibWNPa1RleHRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tPa0NhbmNlbCgnb2snKVwiPlxuXG4gICAgICAgICAgICB7eyBva1RleHQgfX1cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvbiBtYy1idXR0b24gW2NvbG9yXT1cInRoZW1lUGFsZXR0ZS5TZWNvbmRcIiAqbmdJZj1cIm1jQ2FuY2VsVGV4dFwiIChjbGljayk9XCJvbkNsaWNrT2tDYW5jZWwoJ2NhbmNlbCcpXCI+XG4gICAgICAgICAgICB7eyBjYW5jZWxUZXh0IH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjwhLS0gL1tQcmVkZWZpbmVkXSBDb25maXJtIE1vZGFsIENvbnRlbnQgLS0+XG4iXX0=