ngx-tethys 18.2.7 → 19.0.0-next.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 (943) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/badge/badge.component.d.ts +21 -3
  3. package/cascader/cascader-search-option.component.d.ts +6 -3
  4. package/core/store/store.d.ts +1 -1
  5. package/date-picker/abstract-picker.component.d.ts +1 -1
  6. package/date-picker/abstract-picker.directive.d.ts +1 -1
  7. package/date-picker/lib/calendar/calendar-header.component.d.ts +1 -1
  8. package/date-picker/lib/calendar/calendar-table.component.d.ts +1 -1
  9. package/date-range/date-range.component.d.ts +12 -2
  10. package/divider/divider.component.d.ts +2 -8
  11. package/dropdown/dropdown-menu.component.d.ts +1 -1
  12. package/empty/empty.component.d.ts +1 -4
  13. package/fesm2022/ngx-tethys-action.mjs +12 -12
  14. package/fesm2022/ngx-tethys-action.mjs.map +1 -1
  15. package/fesm2022/ngx-tethys-affix.mjs +8 -8
  16. package/fesm2022/ngx-tethys-affix.mjs.map +1 -1
  17. package/fesm2022/ngx-tethys-alert.mjs +12 -12
  18. package/fesm2022/ngx-tethys-alert.mjs.map +1 -1
  19. package/fesm2022/ngx-tethys-anchor.mjs +11 -13
  20. package/fesm2022/ngx-tethys-anchor.mjs.map +1 -1
  21. package/fesm2022/ngx-tethys-arrow-switcher.mjs +9 -9
  22. package/fesm2022/ngx-tethys-arrow-switcher.mjs.map +1 -1
  23. package/fesm2022/ngx-tethys-autocomplete.mjs +20 -20
  24. package/fesm2022/ngx-tethys-autocomplete.mjs.map +1 -1
  25. package/fesm2022/ngx-tethys-avatar.mjs +26 -26
  26. package/fesm2022/ngx-tethys-avatar.mjs.map +1 -1
  27. package/fesm2022/ngx-tethys-back-top.mjs +10 -10
  28. package/fesm2022/ngx-tethys-back-top.mjs.map +1 -1
  29. package/fesm2022/ngx-tethys-badge.mjs +9 -9
  30. package/fesm2022/ngx-tethys-badge.mjs.map +1 -1
  31. package/fesm2022/ngx-tethys-breadcrumb.mjs +13 -15
  32. package/fesm2022/ngx-tethys-breadcrumb.mjs.map +1 -1
  33. package/fesm2022/ngx-tethys-button.mjs +16 -16
  34. package/fesm2022/ngx-tethys-button.mjs.map +1 -1
  35. package/fesm2022/ngx-tethys-calendar.mjs +20 -20
  36. package/fesm2022/ngx-tethys-calendar.mjs.map +1 -1
  37. package/fesm2022/ngx-tethys-card.mjs +15 -15
  38. package/fesm2022/ngx-tethys-card.mjs.map +1 -1
  39. package/fesm2022/ngx-tethys-carousel.mjs +15 -15
  40. package/fesm2022/ngx-tethys-carousel.mjs.map +1 -1
  41. package/fesm2022/ngx-tethys-cascader.mjs +23 -24
  42. package/fesm2022/ngx-tethys-cascader.mjs.map +1 -1
  43. package/fesm2022/ngx-tethys-checkbox.mjs +9 -9
  44. package/fesm2022/ngx-tethys-checkbox.mjs.map +1 -1
  45. package/fesm2022/ngx-tethys-collapse.mjs +12 -12
  46. package/fesm2022/ngx-tethys-collapse.mjs.map +1 -1
  47. package/fesm2022/ngx-tethys-color-picker.mjs +38 -38
  48. package/fesm2022/ngx-tethys-color-picker.mjs.map +1 -1
  49. package/fesm2022/ngx-tethys-comment.mjs +15 -15
  50. package/fesm2022/ngx-tethys-comment.mjs.map +1 -1
  51. package/fesm2022/ngx-tethys-copy.mjs +8 -8
  52. package/fesm2022/ngx-tethys-copy.mjs.map +1 -1
  53. package/fesm2022/ngx-tethys-core.mjs +21 -21
  54. package/fesm2022/ngx-tethys-core.mjs.map +1 -1
  55. package/fesm2022/ngx-tethys-date-picker.mjs +141 -141
  56. package/fesm2022/ngx-tethys-date-picker.mjs.map +1 -1
  57. package/fesm2022/ngx-tethys-date-range.mjs +14 -14
  58. package/fesm2022/ngx-tethys-date-range.mjs.map +1 -1
  59. package/fesm2022/ngx-tethys-dialog.mjs +27 -28
  60. package/fesm2022/ngx-tethys-dialog.mjs.map +1 -1
  61. package/fesm2022/ngx-tethys-divider.mjs +8 -9
  62. package/fesm2022/ngx-tethys-divider.mjs.map +1 -1
  63. package/fesm2022/ngx-tethys-dot.mjs +8 -8
  64. package/fesm2022/ngx-tethys-dot.mjs.map +1 -1
  65. package/fesm2022/ngx-tethys-drag-drop.mjs +20 -20
  66. package/fesm2022/ngx-tethys-drag-drop.mjs.map +1 -1
  67. package/fesm2022/ngx-tethys-dropdown.mjs +47 -48
  68. package/fesm2022/ngx-tethys-dropdown.mjs.map +1 -1
  69. package/fesm2022/ngx-tethys-empty.mjs +12 -12
  70. package/fesm2022/ngx-tethys-empty.mjs.map +1 -1
  71. package/fesm2022/ngx-tethys-flexible-text.mjs +8 -8
  72. package/fesm2022/ngx-tethys-flexible-text.mjs.map +1 -1
  73. package/fesm2022/ngx-tethys-form.mjs +44 -44
  74. package/fesm2022/ngx-tethys-form.mjs.map +1 -1
  75. package/fesm2022/ngx-tethys-fullscreen.mjs +14 -14
  76. package/fesm2022/ngx-tethys-fullscreen.mjs.map +1 -1
  77. package/fesm2022/ngx-tethys-grid.mjs +35 -38
  78. package/fesm2022/ngx-tethys-grid.mjs.map +1 -1
  79. package/fesm2022/ngx-tethys-guider.mjs +18 -18
  80. package/fesm2022/ngx-tethys-guider.mjs.map +1 -1
  81. package/fesm2022/ngx-tethys-i18n.mjs +3 -3
  82. package/fesm2022/ngx-tethys-i18n.mjs.map +1 -1
  83. package/fesm2022/ngx-tethys-icon.mjs +11 -11
  84. package/fesm2022/ngx-tethys-icon.mjs.map +1 -1
  85. package/fesm2022/ngx-tethys-image.mjs +19 -19
  86. package/fesm2022/ngx-tethys-image.mjs.map +1 -1
  87. package/fesm2022/ngx-tethys-input-number.mjs +11 -11
  88. package/fesm2022/ngx-tethys-input-number.mjs.map +1 -1
  89. package/fesm2022/ngx-tethys-input.mjs +23 -23
  90. package/fesm2022/ngx-tethys-input.mjs.map +1 -1
  91. package/fesm2022/ngx-tethys-layout.mjs +63 -64
  92. package/fesm2022/ngx-tethys-layout.mjs.map +1 -1
  93. package/fesm2022/ngx-tethys-list.mjs +19 -19
  94. package/fesm2022/ngx-tethys-list.mjs.map +1 -1
  95. package/fesm2022/ngx-tethys-loading.mjs +9 -9
  96. package/fesm2022/ngx-tethys-loading.mjs.map +1 -1
  97. package/fesm2022/ngx-tethys-mention.mjs +12 -12
  98. package/fesm2022/ngx-tethys-mention.mjs.map +1 -1
  99. package/fesm2022/ngx-tethys-menu.mjs +29 -29
  100. package/fesm2022/ngx-tethys-menu.mjs.map +1 -1
  101. package/fesm2022/ngx-tethys-message.mjs +25 -26
  102. package/fesm2022/ngx-tethys-message.mjs.map +1 -1
  103. package/fesm2022/ngx-tethys-nav.mjs +24 -25
  104. package/fesm2022/ngx-tethys-nav.mjs.map +1 -1
  105. package/fesm2022/ngx-tethys-notify.mjs +20 -20
  106. package/fesm2022/ngx-tethys-notify.mjs.map +1 -1
  107. package/fesm2022/ngx-tethys-pagination.mjs +15 -15
  108. package/fesm2022/ngx-tethys-pagination.mjs.map +1 -1
  109. package/fesm2022/ngx-tethys-popover.mjs +23 -23
  110. package/fesm2022/ngx-tethys-popover.mjs.map +1 -1
  111. package/fesm2022/ngx-tethys-progress.mjs +17 -17
  112. package/fesm2022/ngx-tethys-progress.mjs.map +1 -1
  113. package/fesm2022/ngx-tethys-property-operation.mjs +12 -12
  114. package/fesm2022/ngx-tethys-property-operation.mjs.map +1 -1
  115. package/fesm2022/ngx-tethys-property.mjs +12 -12
  116. package/fesm2022/ngx-tethys-property.mjs.map +1 -1
  117. package/fesm2022/ngx-tethys-radio.mjs +15 -15
  118. package/fesm2022/ngx-tethys-radio.mjs.map +1 -1
  119. package/fesm2022/ngx-tethys-rate.mjs +12 -13
  120. package/fesm2022/ngx-tethys-rate.mjs.map +1 -1
  121. package/fesm2022/ngx-tethys-resizable.mjs +17 -19
  122. package/fesm2022/ngx-tethys-resizable.mjs.map +1 -1
  123. package/fesm2022/ngx-tethys-result.mjs +9 -9
  124. package/fesm2022/ngx-tethys-result.mjs.map +1 -1
  125. package/fesm2022/ngx-tethys-segment.mjs +13 -13
  126. package/fesm2022/ngx-tethys-segment.mjs.map +1 -1
  127. package/fesm2022/ngx-tethys-select.mjs +16 -16
  128. package/fesm2022/ngx-tethys-select.mjs.map +1 -1
  129. package/fesm2022/ngx-tethys-shared.mjs +70 -70
  130. package/fesm2022/ngx-tethys-shared.mjs.map +1 -1
  131. package/fesm2022/ngx-tethys-skeleton.mjs +23 -28
  132. package/fesm2022/ngx-tethys-skeleton.mjs.map +1 -1
  133. package/fesm2022/ngx-tethys-slide.mjs +34 -35
  134. package/fesm2022/ngx-tethys-slide.mjs.map +1 -1
  135. package/fesm2022/ngx-tethys-slider.mjs +9 -9
  136. package/fesm2022/ngx-tethys-slider.mjs.map +1 -1
  137. package/fesm2022/ngx-tethys-space.mjs +12 -12
  138. package/fesm2022/ngx-tethys-space.mjs.map +1 -1
  139. package/fesm2022/ngx-tethys-statistic.mjs +9 -9
  140. package/fesm2022/ngx-tethys-statistic.mjs.map +1 -1
  141. package/fesm2022/ngx-tethys-stepper.mjs +22 -22
  142. package/fesm2022/ngx-tethys-stepper.mjs.map +1 -1
  143. package/fesm2022/ngx-tethys-strength.mjs +8 -8
  144. package/fesm2022/ngx-tethys-strength.mjs.map +1 -1
  145. package/fesm2022/ngx-tethys-switch.mjs +9 -9
  146. package/fesm2022/ngx-tethys-switch.mjs.map +1 -1
  147. package/fesm2022/ngx-tethys-table.mjs +23 -23
  148. package/fesm2022/ngx-tethys-table.mjs.map +1 -1
  149. package/fesm2022/ngx-tethys-tabs.mjs +15 -16
  150. package/fesm2022/ngx-tethys-tabs.mjs.map +1 -1
  151. package/fesm2022/ngx-tethys-tag.mjs +11 -11
  152. package/fesm2022/ngx-tethys-tag.mjs.map +1 -1
  153. package/fesm2022/ngx-tethys-testing.mjs.map +1 -1
  154. package/fesm2022/ngx-tethys-time-picker.mjs +24 -24
  155. package/fesm2022/ngx-tethys-time-picker.mjs.map +1 -1
  156. package/fesm2022/ngx-tethys-timeline.mjs +15 -16
  157. package/fesm2022/ngx-tethys-timeline.mjs.map +1 -1
  158. package/fesm2022/ngx-tethys-tooltip.mjs +16 -16
  159. package/fesm2022/ngx-tethys-tooltip.mjs.map +1 -1
  160. package/fesm2022/ngx-tethys-transfer.mjs +13 -13
  161. package/fesm2022/ngx-tethys-transfer.mjs.map +1 -1
  162. package/fesm2022/ngx-tethys-tree-select.mjs +13 -13
  163. package/fesm2022/ngx-tethys-tree-select.mjs.map +1 -1
  164. package/fesm2022/ngx-tethys-tree.mjs +19 -19
  165. package/fesm2022/ngx-tethys-tree.mjs.map +1 -1
  166. package/fesm2022/ngx-tethys-typography.mjs +15 -15
  167. package/fesm2022/ngx-tethys-typography.mjs.map +1 -1
  168. package/fesm2022/ngx-tethys-upload.mjs +17 -17
  169. package/fesm2022/ngx-tethys-upload.mjs.map +1 -1
  170. package/fesm2022/ngx-tethys-util.mjs +2 -18
  171. package/fesm2022/ngx-tethys-util.mjs.map +1 -1
  172. package/fesm2022/ngx-tethys-vote.mjs +9 -9
  173. package/fesm2022/ngx-tethys-vote.mjs.map +1 -1
  174. package/fesm2022/ngx-tethys-watermark.mjs +8 -8
  175. package/fesm2022/ngx-tethys-watermark.mjs.map +1 -1
  176. package/fesm2022/ngx-tethys.mjs +1 -1
  177. package/fesm2022/ngx-tethys.mjs.map +1 -1
  178. package/input/input.component.d.ts +1 -1
  179. package/layout/header.component.d.ts +21 -3
  180. package/menu/group/menu-group.component.d.ts +6 -30
  181. package/message/abstract/abstract-message-container.component.d.ts +1 -1
  182. package/message/abstract/abstract-message.component.d.ts +1 -1
  183. package/nav/nav.component.d.ts +2 -2
  184. package/package.json +4 -172
  185. package/pagination/pagination.component.d.ts +45 -5
  186. package/property/property-item.component.d.ts +4 -2
  187. package/schematics/dependencies.js +3 -3
  188. package/schematics/ng-add/index.js +7 -3
  189. package/schematics/ng-update/core/complete.js +1 -2
  190. package/schematics/ng-update/migration-collection.json +4 -4
  191. package/schematics/ng-update/{update-18 → update-19}/index.js +4 -5
  192. package/schematics/ng-update/{update-18 → update-19}/index.spec.js +4 -4
  193. package/schematics/testing/get-json-content.js +1 -2
  194. package/schematics/testing/test-app.js +1 -2
  195. package/schematics/testing/test-project.js +1 -2
  196. package/schematics/testing/test-workspace.d.ts +0 -2
  197. package/schematics/testing/test-workspace.js +2 -2
  198. package/schematics/utils/create-tree-compiler-host.js +1 -2
  199. package/schematics/utils/create-tree-ts-parse-config-host.js +2 -2
  200. package/schematics/utils/get-angular-json.js +1 -2
  201. package/schematics/utils/get-project.js +1 -2
  202. package/schematics/utils/get-workspace-tsconfig.js +1 -2
  203. package/schematics/utils/package-config.js +2 -3
  204. package/schematics/utils/update-file.service.js +2 -2
  205. package/schematics/version.d.ts +1 -1
  206. package/schematics/version.js +1 -1
  207. package/shared/base-form-check.component.d.ts +1 -1
  208. package/shared/option/list-option/list-option.component.d.ts +1 -4
  209. package/shared/select/styles/select.mixin.scss +2 -1
  210. package/skeleton/skeleton-rectangle.component.d.ts +1 -4
  211. package/skeleton/stylized/bullet-list.component.d.ts +1 -9
  212. package/styles/bootstrap/utilities/_background.scss +2 -1
  213. package/styles/bootstrap/utilities/_text.scss +1 -1
  214. package/table/table.component.d.ts +1 -1
  215. package/upload/file-select-base.d.ts +1 -1
  216. package/esm2022/action/action.component.mjs +0 -174
  217. package/esm2022/action/action.module.mjs +0 -19
  218. package/esm2022/action/actions.component.mjs +0 -57
  219. package/esm2022/action/index.mjs +0 -4
  220. package/esm2022/action/ngx-tethys-action.mjs +0 -5
  221. package/esm2022/affix/affix.component.mjs +0 -243
  222. package/esm2022/affix/affix.module.mjs +0 -18
  223. package/esm2022/affix/index.mjs +0 -3
  224. package/esm2022/affix/ngx-tethys-affix.mjs +0 -5
  225. package/esm2022/affix/respond-events.mjs +0 -11
  226. package/esm2022/alert/alert.component.mjs +0 -98
  227. package/esm2022/alert/alert.directive.mjs +0 -25
  228. package/esm2022/alert/alert.module.mjs +0 -19
  229. package/esm2022/alert/index.mjs +0 -4
  230. package/esm2022/alert/ngx-tethys-alert.mjs +0 -5
  231. package/esm2022/anchor/anchor-link.component.mjs +0 -106
  232. package/esm2022/anchor/anchor.component.mjs +0 -266
  233. package/esm2022/anchor/anchor.module.mjs +0 -20
  234. package/esm2022/anchor/index.mjs +0 -4
  235. package/esm2022/anchor/ngx-tethys-anchor.mjs +0 -5
  236. package/esm2022/arrow-switcher/arrow-switcher.component.mjs +0 -130
  237. package/esm2022/arrow-switcher/index.mjs +0 -3
  238. package/esm2022/arrow-switcher/module.mjs +0 -21
  239. package/esm2022/arrow-switcher/ngx-tethys-arrow-switcher.mjs +0 -5
  240. package/esm2022/autocomplete/autocomplete.component.mjs +0 -182
  241. package/esm2022/autocomplete/autocomplete.trigger.directive.mjs +0 -275
  242. package/esm2022/autocomplete/index.mjs +0 -8
  243. package/esm2022/autocomplete/module.mjs +0 -67
  244. package/esm2022/autocomplete/ngx-tethys-autocomplete.mjs +0 -5
  245. package/esm2022/autocomplete/overlay/autocomplete-animations.mjs +0 -10
  246. package/esm2022/autocomplete/overlay/autocomplete-container.component.mjs +0 -64
  247. package/esm2022/autocomplete/overlay/autocomplete-ref.mjs +0 -18
  248. package/esm2022/autocomplete/overlay/autocomplete.config.mjs +0 -18
  249. package/esm2022/autocomplete/overlay/autocomplete.options.mjs +0 -6
  250. package/esm2022/autocomplete/overlay/autocomplete.service.mjs +0 -127
  251. package/esm2022/avatar/avatar-list/avatar-list.component.mjs +0 -76
  252. package/esm2022/avatar/avatar.component.mjs +0 -179
  253. package/esm2022/avatar/avatar.module.mjs +0 -33
  254. package/esm2022/avatar/avatar.pipe.mjs +0 -91
  255. package/esm2022/avatar/avatar.service.mjs +0 -27
  256. package/esm2022/avatar/index.mjs +0 -6
  257. package/esm2022/avatar/ngx-tethys-avatar.mjs +0 -5
  258. package/esm2022/back-top/back-top.component.mjs +0 -126
  259. package/esm2022/back-top/back-top.module.mjs +0 -18
  260. package/esm2022/back-top/index.mjs +0 -3
  261. package/esm2022/back-top/ngx-tethys-back-top.mjs +0 -5
  262. package/esm2022/badge/badge.component.mjs +0 -238
  263. package/esm2022/badge/badge.module.mjs +0 -18
  264. package/esm2022/badge/index.mjs +0 -3
  265. package/esm2022/badge/ngx-tethys-badge.mjs +0 -5
  266. package/esm2022/breadcrumb/breadcrumb-item.component.mjs +0 -49
  267. package/esm2022/breadcrumb/breadcrumb.component.mjs +0 -115
  268. package/esm2022/breadcrumb/index.mjs +0 -4
  269. package/esm2022/breadcrumb/module.mjs +0 -21
  270. package/esm2022/breadcrumb/ngx-tethys-breadcrumb.mjs +0 -5
  271. package/esm2022/button/button-group.component.mjs +0 -90
  272. package/esm2022/button/button-icon.component.mjs +0 -166
  273. package/esm2022/button/button.component.mjs +0 -216
  274. package/esm2022/button/button.module.mjs +0 -20
  275. package/esm2022/button/index.mjs +0 -5
  276. package/esm2022/button/ngx-tethys-button.mjs +0 -5
  277. package/esm2022/calendar/calendar-cells.mjs +0 -35
  278. package/esm2022/calendar/calendar-header.component.mjs +0 -117
  279. package/esm2022/calendar/calendar.component.mjs +0 -122
  280. package/esm2022/calendar/index.mjs +0 -5
  281. package/esm2022/calendar/module.mjs +0 -63
  282. package/esm2022/calendar/ngx-tethys-calendar.mjs +0 -5
  283. package/esm2022/card/card.component.mjs +0 -48
  284. package/esm2022/card/card.module.mjs +0 -19
  285. package/esm2022/card/content.component.mjs +0 -58
  286. package/esm2022/card/header.component.mjs +0 -42
  287. package/esm2022/card/index.mjs +0 -5
  288. package/esm2022/card/ngx-tethys-card.mjs +0 -5
  289. package/esm2022/carousel/carousel-item.directive.mjs +0 -37
  290. package/esm2022/carousel/carousel.component.mjs +0 -290
  291. package/esm2022/carousel/carousel.service.mjs +0 -74
  292. package/esm2022/carousel/engine/carousel-base.mjs +0 -43
  293. package/esm2022/carousel/engine/carousel-fade.mjs +0 -46
  294. package/esm2022/carousel/engine/carousel-noop.mjs +0 -28
  295. package/esm2022/carousel/engine/carousel-slide.mjs +0 -62
  296. package/esm2022/carousel/engine/index.mjs +0 -5
  297. package/esm2022/carousel/index.mjs +0 -5
  298. package/esm2022/carousel/module.mjs +0 -21
  299. package/esm2022/carousel/ngx-tethys-carousel.mjs +0 -5
  300. package/esm2022/carousel/typings.mjs +0 -2
  301. package/esm2022/cascader/cascader-li.component.mjs +0 -81
  302. package/esm2022/cascader/cascader-search-option.component.mjs +0 -73
  303. package/esm2022/cascader/cascader.component.mjs +0 -768
  304. package/esm2022/cascader/cascader.service.mjs +0 -558
  305. package/esm2022/cascader/index.mjs +0 -5
  306. package/esm2022/cascader/module.mjs +0 -62
  307. package/esm2022/cascader/ngx-tethys-cascader.mjs +0 -5
  308. package/esm2022/cascader/types.mjs +0 -2
  309. package/esm2022/checkbox/checkbox.component.mjs +0 -51
  310. package/esm2022/checkbox/index.mjs +0 -4
  311. package/esm2022/checkbox/module.mjs +0 -18
  312. package/esm2022/checkbox/ngx-tethys-checkbox.mjs +0 -5
  313. package/esm2022/collapse/collapse-item.component.mjs +0 -88
  314. package/esm2022/collapse/collapse.component.mjs +0 -79
  315. package/esm2022/collapse/index.mjs +0 -4
  316. package/esm2022/collapse/module.mjs +0 -22
  317. package/esm2022/collapse/ngx-tethys-collapse.mjs +0 -5
  318. package/esm2022/color-picker/color-picker-custom-panel.component.mjs +0 -38
  319. package/esm2022/color-picker/color-picker-panel.component.mjs +0 -100
  320. package/esm2022/color-picker/color-picker.component.mjs +0 -289
  321. package/esm2022/color-picker/constant.mjs +0 -73
  322. package/esm2022/color-picker/coordinates.directive.mjs +0 -73
  323. package/esm2022/color-picker/helpers/color.class.mjs +0 -281
  324. package/esm2022/color-picker/helpers/colors-table.class.mjs +0 -155
  325. package/esm2022/color-picker/helpers/rgba.class.mjs +0 -34
  326. package/esm2022/color-picker/index.mjs +0 -14
  327. package/esm2022/color-picker/module.mjs +0 -72
  328. package/esm2022/color-picker/ngx-tethys-color-picker.mjs +0 -5
  329. package/esm2022/color-picker/parts/alpha/alpha.component.mjs +0 -64
  330. package/esm2022/color-picker/parts/hue/hue.component.mjs +0 -54
  331. package/esm2022/color-picker/parts/indicator/indicator.component.mjs +0 -26
  332. package/esm2022/color-picker/parts/inputs/inputs.component.mjs +0 -61
  333. package/esm2022/color-picker/parts/saturation/saturation.component.mjs +0 -68
  334. package/esm2022/comment/comment-actions.directive.mjs +0 -19
  335. package/esm2022/comment/comment-content.directive.mjs +0 -19
  336. package/esm2022/comment/comment.component.mjs +0 -30
  337. package/esm2022/comment/comment.module.mjs +0 -41
  338. package/esm2022/comment/index.mjs +0 -5
  339. package/esm2022/comment/ngx-tethys-comment.mjs +0 -5
  340. package/esm2022/copy/copy.directive.mjs +0 -101
  341. package/esm2022/copy/index.mjs +0 -3
  342. package/esm2022/copy/module.mjs +0 -18
  343. package/esm2022/copy/ngx-tethys-copy.mjs +0 -5
  344. package/esm2022/core/animation/animation-consts.mjs +0 -23
  345. package/esm2022/core/animation/collapse.mjs +0 -12
  346. package/esm2022/core/animation/fade.mjs +0 -7
  347. package/esm2022/core/animation/index.mjs +0 -2
  348. package/esm2022/core/animation/public-api.mjs +0 -6
  349. package/esm2022/core/animation/thumb.mjs +0 -12
  350. package/esm2022/core/animation/zoom.mjs +0 -66
  351. package/esm2022/core/behaviors/constructor.mjs +0 -5
  352. package/esm2022/core/behaviors/control-value-accessor.mjs +0 -17
  353. package/esm2022/core/behaviors/decorators.mjs +0 -47
  354. package/esm2022/core/behaviors/disabled.mjs +0 -17
  355. package/esm2022/core/behaviors/focus-control.mjs +0 -31
  356. package/esm2022/core/behaviors/index.mjs +0 -11
  357. package/esm2022/core/behaviors/initialized.mjs +0 -12
  358. package/esm2022/core/behaviors/loading-done.mjs +0 -12
  359. package/esm2022/core/behaviors/mixin.mjs +0 -5
  360. package/esm2022/core/behaviors/tabindex.mjs +0 -21
  361. package/esm2022/core/behaviors/unsubscribe.mjs +0 -23
  362. package/esm2022/core/click-positioner.mjs +0 -36
  363. package/esm2022/core/color/color.mjs +0 -13
  364. package/esm2022/core/color/index.mjs +0 -2
  365. package/esm2022/core/debounce-time.mjs +0 -11
  366. package/esm2022/core/event-dispatchers/index.mjs +0 -2
  367. package/esm2022/core/index.mjs +0 -16
  368. package/esm2022/core/ngx-tethys-core.mjs +0 -5
  369. package/esm2022/core/overlay/abstract-overlay-container.mjs +0 -53
  370. package/esm2022/core/overlay/abstract-overlay-ref.mjs +0 -160
  371. package/esm2022/core/overlay/abstract-overlay.config.mjs +0 -70
  372. package/esm2022/core/overlay/abstract-overlay.service.mjs +0 -158
  373. package/esm2022/core/overlay/index.mjs +0 -10
  374. package/esm2022/core/overlay/interface.mjs +0 -2
  375. package/esm2022/core/overlay/overlay-position-map.mjs +0 -88
  376. package/esm2022/core/overlay/overlay.directive.mjs +0 -175
  377. package/esm2022/core/overlay/portal-directives.mjs +0 -47
  378. package/esm2022/core/overlay/utils.mjs +0 -69
  379. package/esm2022/core/request-animation.mjs +0 -41
  380. package/esm2022/core/scroll-to.service.mjs +0 -33
  381. package/esm2022/core/scroll.mjs +0 -83
  382. package/esm2022/core/spacing/index.mjs +0 -2
  383. package/esm2022/core/spacing/spacing.mjs +0 -17
  384. package/esm2022/core/store/action-state.mjs +0 -11
  385. package/esm2022/core/store/action.mjs +0 -48
  386. package/esm2022/core/store/actions-stream.mjs +0 -2
  387. package/esm2022/core/store/index.mjs +0 -4
  388. package/esm2022/core/store/store.mjs +0 -125
  389. package/esm2022/core/store/types.mjs +0 -6
  390. package/esm2022/core/store/utils.mjs +0 -14
  391. package/esm2022/core/theme/index.mjs +0 -3
  392. package/esm2022/core/theme/store.mjs +0 -42
  393. package/esm2022/core/theme/theme.mjs +0 -9
  394. package/esm2022/core/translate.mjs +0 -22
  395. package/esm2022/core/update-host-class.service.mjs +0 -60
  396. package/esm2022/date-picker/abstract-picker.component.mjs +0 -318
  397. package/esm2022/date-picker/abstract-picker.directive.mjs +0 -218
  398. package/esm2022/date-picker/base-picker.component.mjs +0 -249
  399. package/esm2022/date-picker/date-helper.service.mjs +0 -37
  400. package/esm2022/date-picker/date-picker.component.mjs +0 -41
  401. package/esm2022/date-picker/date-picker.config.mjs +0 -103
  402. package/esm2022/date-picker/date-picker.directive.mjs +0 -39
  403. package/esm2022/date-picker/date-picker.module.mjs +0 -117
  404. package/esm2022/date-picker/date-picker.service.mjs +0 -31
  405. package/esm2022/date-picker/index.mjs +0 -37
  406. package/esm2022/date-picker/inner-types.mjs +0 -2
  407. package/esm2022/date-picker/lib/calendar/calendar-footer.component.mjs +0 -98
  408. package/esm2022/date-picker/lib/calendar/calendar-header.component.mjs +0 -92
  409. package/esm2022/date-picker/lib/calendar/calendar-table.component.mjs +0 -105
  410. package/esm2022/date-picker/lib/date/date-header.component.mjs +0 -35
  411. package/esm2022/date-picker/lib/date/date-table-cell.component.mjs +0 -24
  412. package/esm2022/date-picker/lib/date/date-table.component.mjs +0 -149
  413. package/esm2022/date-picker/lib/date/types.mjs +0 -2
  414. package/esm2022/date-picker/lib/date-carousel/date-carousel.component.mjs +0 -388
  415. package/esm2022/date-picker/lib/decade/decade-header.component.mjs +0 -42
  416. package/esm2022/date-picker/lib/decade/decade-table.component.mjs +0 -81
  417. package/esm2022/date-picker/lib/lib-packer.module.mjs +0 -123
  418. package/esm2022/date-picker/lib/month/month-header.component.mjs +0 -27
  419. package/esm2022/date-picker/lib/month/month-table.component.mjs +0 -97
  420. package/esm2022/date-picker/lib/popups/date-popup.component.mjs +0 -566
  421. package/esm2022/date-picker/lib/popups/inner-popup.component.mjs +0 -196
  422. package/esm2022/date-picker/lib/quarter/quarter-table.component.mjs +0 -98
  423. package/esm2022/date-picker/lib/year/year-header.component.mjs +0 -39
  424. package/esm2022/date-picker/lib/year/year-table.component.mjs +0 -100
  425. package/esm2022/date-picker/month-picker.component.mjs +0 -45
  426. package/esm2022/date-picker/ngx-tethys-date-picker.mjs +0 -5
  427. package/esm2022/date-picker/picker.component.mjs +0 -273
  428. package/esm2022/date-picker/picker.pipes.mjs +0 -112
  429. package/esm2022/date-picker/picker.util.mjs +0 -220
  430. package/esm2022/date-picker/picker.validators.mjs +0 -79
  431. package/esm2022/date-picker/quarter-picker.component.mjs +0 -48
  432. package/esm2022/date-picker/range-picker.component.mjs +0 -39
  433. package/esm2022/date-picker/range-picker.directive.mjs +0 -39
  434. package/esm2022/date-picker/standard-types.mjs +0 -2
  435. package/esm2022/date-picker/week-picker.component.mjs +0 -40
  436. package/esm2022/date-picker/year-picker.component.mjs +0 -48
  437. package/esm2022/date-range/date-range.class.mjs +0 -6
  438. package/esm2022/date-range/date-range.component.mjs +0 -255
  439. package/esm2022/date-range/index.mjs +0 -5
  440. package/esm2022/date-range/module.mjs +0 -50
  441. package/esm2022/date-range/ngx-tethys-date-range.mjs +0 -5
  442. package/esm2022/date-range/optional-dates/optional-dates.component.mjs +0 -50
  443. package/esm2022/dialog/body/dialog-body.component.mjs +0 -49
  444. package/esm2022/dialog/confirm/confirm.component.mjs +0 -77
  445. package/esm2022/dialog/confirm/token.mjs +0 -3
  446. package/esm2022/dialog/confirm.config.mjs +0 -29
  447. package/esm2022/dialog/dialog-animations.mjs +0 -19
  448. package/esm2022/dialog/dialog-container.component.mjs +0 -169
  449. package/esm2022/dialog/dialog-ref.mjs +0 -35
  450. package/esm2022/dialog/dialog.config.mjs +0 -62
  451. package/esm2022/dialog/dialog.module.mjs +0 -91
  452. package/esm2022/dialog/dialog.options.mjs +0 -6
  453. package/esm2022/dialog/dialog.service.mjs +0 -145
  454. package/esm2022/dialog/footer/dialog-footer.component.mjs +0 -51
  455. package/esm2022/dialog/header/dialog-header.component.mjs +0 -87
  456. package/esm2022/dialog/index.mjs +0 -12
  457. package/esm2022/dialog/ngx-tethys-dialog.mjs +0 -5
  458. package/esm2022/divider/divider.component.mjs +0 -117
  459. package/esm2022/divider/divider.module.mjs +0 -20
  460. package/esm2022/divider/index.mjs +0 -3
  461. package/esm2022/divider/ngx-tethys-divider.mjs +0 -5
  462. package/esm2022/dot/dot.component.mjs +0 -111
  463. package/esm2022/dot/dot.module.mjs +0 -17
  464. package/esm2022/dot/index.mjs +0 -3
  465. package/esm2022/dot/ngx-tethys-dot.mjs +0 -5
  466. package/esm2022/drag-drop/drag-content.directive.mjs +0 -32
  467. package/esm2022/drag-drop/drag-drop.class.mjs +0 -7
  468. package/esm2022/drag-drop/drag-drop.service.mjs +0 -23
  469. package/esm2022/drag-drop/drag-handle.directive.mjs +0 -43
  470. package/esm2022/drag-drop/drag-ref.mjs +0 -225
  471. package/esm2022/drag-drop/drag.directive.mjs +0 -71
  472. package/esm2022/drag-drop/drop-container.class.mjs +0 -6
  473. package/esm2022/drag-drop/drop-container.directive.mjs +0 -129
  474. package/esm2022/drag-drop/index.mjs +0 -10
  475. package/esm2022/drag-drop/module.mjs +0 -27
  476. package/esm2022/drag-drop/ngx-tethys-drag-drop.mjs +0 -5
  477. package/esm2022/dropdown/dropdown-active.directive.mjs +0 -66
  478. package/esm2022/dropdown/dropdown-menu-item.directive.mjs +0 -210
  479. package/esm2022/dropdown/dropdown-menu.component.mjs +0 -156
  480. package/esm2022/dropdown/dropdown-submenu.component.mjs +0 -83
  481. package/esm2022/dropdown/dropdown.directive.mjs +0 -189
  482. package/esm2022/dropdown/index.mjs +0 -7
  483. package/esm2022/dropdown/module.mjs +0 -79
  484. package/esm2022/dropdown/ngx-tethys-dropdown.mjs +0 -5
  485. package/esm2022/empty/empty.component.mjs +0 -183
  486. package/esm2022/empty/empty.config.mjs +0 -17
  487. package/esm2022/empty/empty.module.mjs +0 -21
  488. package/esm2022/empty/index.mjs +0 -4
  489. package/esm2022/empty/ngx-tethys-empty.mjs +0 -5
  490. package/esm2022/empty/svgs.mjs +0 -207
  491. package/esm2022/flexible-text/flexible-text.component.mjs +0 -157
  492. package/esm2022/flexible-text/flexible-text.module.mjs +0 -19
  493. package/esm2022/flexible-text/index.mjs +0 -3
  494. package/esm2022/flexible-text/ngx-tethys-flexible-text.mjs +0 -5
  495. package/esm2022/form/form-group-error/form-group-error.component.mjs +0 -53
  496. package/esm2022/form/form-group-label.directive.mjs +0 -49
  497. package/esm2022/form/form-group.component.mjs +0 -145
  498. package/esm2022/form/form-submit.directive.mjs +0 -40
  499. package/esm2022/form/form-validator-loader.mjs +0 -134
  500. package/esm2022/form/form-validator.service.mjs +0 -252
  501. package/esm2022/form/form.class.mjs +0 -8
  502. package/esm2022/form/form.directive.mjs +0 -158
  503. package/esm2022/form/from-group-footer/form-group-footer.component.mjs +0 -53
  504. package/esm2022/form/index.mjs +0 -12
  505. package/esm2022/form/module.mjs +0 -104
  506. package/esm2022/form/ngx-tethys-form.mjs +0 -5
  507. package/esm2022/form/validator/confirm-validator.directive.mjs +0 -33
  508. package/esm2022/form/validator/index.mjs +0 -5
  509. package/esm2022/form/validator/max-validator.directive.mjs +0 -41
  510. package/esm2022/form/validator/min-validator.directive.mjs +0 -41
  511. package/esm2022/form/validator/unique-validator.directive.mjs +0 -52
  512. package/esm2022/fullscreen/fullscreen-launch.directive.mjs +0 -18
  513. package/esm2022/fullscreen/fullscreen-ref.mjs +0 -151
  514. package/esm2022/fullscreen/fullscreen.component.mjs +0 -78
  515. package/esm2022/fullscreen/fullscreen.config.mjs +0 -6
  516. package/esm2022/fullscreen/fullscreen.module.mjs +0 -17
  517. package/esm2022/fullscreen/fullscreen.service.mjs +0 -47
  518. package/esm2022/fullscreen/index.mjs +0 -7
  519. package/esm2022/fullscreen/ngx-tethys-fullscreen.mjs +0 -5
  520. package/esm2022/grid/flex.mjs +0 -179
  521. package/esm2022/grid/grid.token.mjs +0 -5
  522. package/esm2022/grid/index.mjs +0 -7
  523. package/esm2022/grid/module.mjs +0 -56
  524. package/esm2022/grid/ngx-tethys-grid.mjs +0 -5
  525. package/esm2022/grid/thy-col.directive.mjs +0 -66
  526. package/esm2022/grid/thy-grid-item.component.mjs +0 -60
  527. package/esm2022/grid/thy-grid.component.mjs +0 -256
  528. package/esm2022/grid/thy-row.directive.mjs +0 -59
  529. package/esm2022/guider/guider-hint/guider-hint.component.mjs +0 -52
  530. package/esm2022/guider/guider-manager.mjs +0 -39
  531. package/esm2022/guider/guider-ref.mjs +0 -133
  532. package/esm2022/guider/guider-step-ref.mjs +0 -242
  533. package/esm2022/guider/guider.class.mjs +0 -15
  534. package/esm2022/guider/guider.directive.mjs +0 -50
  535. package/esm2022/guider/guider.module.mjs +0 -24
  536. package/esm2022/guider/guider.service.mjs +0 -76
  537. package/esm2022/guider/index.mjs +0 -9
  538. package/esm2022/guider/ngx-tethys-guider.mjs +0 -5
  539. package/esm2022/guider/utils.mjs +0 -10
  540. package/esm2022/i18n/i18n.mjs +0 -9
  541. package/esm2022/i18n/i18n.service.mjs +0 -45
  542. package/esm2022/i18n/i18n.token.mjs +0 -10
  543. package/esm2022/i18n/index.mjs +0 -10
  544. package/esm2022/i18n/locale.mjs +0 -13
  545. package/esm2022/i18n/locales/de-de.mjs +0 -134
  546. package/esm2022/i18n/locales/en-us.mjs +0 -155
  547. package/esm2022/i18n/locales/ja-jp.mjs +0 -134
  548. package/esm2022/i18n/locales/zh-hans.mjs +0 -134
  549. package/esm2022/i18n/locales/zh-hant.mjs +0 -134
  550. package/esm2022/i18n/ngx-tethys-i18n.mjs +0 -5
  551. package/esm2022/icon/config.mjs +0 -8
  552. package/esm2022/icon/icon-registry.mjs +0 -340
  553. package/esm2022/icon/icon.component.mjs +0 -198
  554. package/esm2022/icon/icon.module.mjs +0 -20
  555. package/esm2022/icon/index.mjs +0 -5
  556. package/esm2022/icon/ngx-tethys-icon.mjs +0 -5
  557. package/esm2022/image/image-group.component.mjs +0 -32
  558. package/esm2022/image/image.class.mjs +0 -2
  559. package/esm2022/image/image.config.mjs +0 -21
  560. package/esm2022/image/image.directive.mjs +0 -130
  561. package/esm2022/image/image.service.mjs +0 -58
  562. package/esm2022/image/index.mjs +0 -9
  563. package/esm2022/image/module.mjs +0 -67
  564. package/esm2022/image/ngx-tethys-image.mjs +0 -5
  565. package/esm2022/image/preview/image-preview-ref.mjs +0 -32
  566. package/esm2022/image/preview/image-preview.component.mjs +0 -413
  567. package/esm2022/image/utils.mjs +0 -13
  568. package/esm2022/input/index.mjs +0 -7
  569. package/esm2022/input/input-count.component.mjs +0 -68
  570. package/esm2022/input/input-group.component.mjs +0 -161
  571. package/esm2022/input/input-search.component.mjs +0 -152
  572. package/esm2022/input/input.component.mjs +0 -142
  573. package/esm2022/input/input.directive.mjs +0 -63
  574. package/esm2022/input/module.mjs +0 -51
  575. package/esm2022/input/ngx-tethys-input.mjs +0 -5
  576. package/esm2022/input-number/index.mjs +0 -3
  577. package/esm2022/input-number/input-number.component.mjs +0 -362
  578. package/esm2022/input-number/module.mjs +0 -22
  579. package/esm2022/input-number/ngx-tethys-input-number.mjs +0 -5
  580. package/esm2022/layout/content-main.component.mjs +0 -42
  581. package/esm2022/layout/content-section.component.mjs +0 -42
  582. package/esm2022/layout/content.component.mjs +0 -42
  583. package/esm2022/layout/header.component.mjs +0 -125
  584. package/esm2022/layout/index.mjs +0 -11
  585. package/esm2022/layout/layout.component.mjs +0 -47
  586. package/esm2022/layout/layout.module.mjs +0 -121
  587. package/esm2022/layout/ngx-tethys-layout.mjs +0 -5
  588. package/esm2022/layout/sidebar-content.component.mjs +0 -41
  589. package/esm2022/layout/sidebar-footer.component.mjs +0 -41
  590. package/esm2022/layout/sidebar-header.component.mjs +0 -54
  591. package/esm2022/layout/sidebar.component.mjs +0 -405
  592. package/esm2022/list/index.mjs +0 -7
  593. package/esm2022/list/list-item-meta.component.mjs +0 -38
  594. package/esm2022/list/list-item.component.mjs +0 -25
  595. package/esm2022/list/list.component.mjs +0 -41
  596. package/esm2022/list/list.module.mjs +0 -22
  597. package/esm2022/list/ngx-tethys-list.mjs +0 -5
  598. package/esm2022/list/selection/selection-list.mjs +0 -393
  599. package/esm2022/list/selection/selection.interface.mjs +0 -2
  600. package/esm2022/loading/index.mjs +0 -3
  601. package/esm2022/loading/loading.component.mjs +0 -54
  602. package/esm2022/loading/loading.module.mjs +0 -17
  603. package/esm2022/loading/ngx-tethys-loading.mjs +0 -5
  604. package/esm2022/mention/adapter/adapter.mjs +0 -20
  605. package/esm2022/mention/adapter/editable.adapter.mjs +0 -48
  606. package/esm2022/mention/adapter/index.mjs +0 -16
  607. package/esm2022/mention/adapter/textarea.adapter.mjs +0 -58
  608. package/esm2022/mention/caret-positioner.mjs +0 -194
  609. package/esm2022/mention/index.mjs +0 -5
  610. package/esm2022/mention/interfaces.mjs +0 -2
  611. package/esm2022/mention/mention.directive.mjs +0 -160
  612. package/esm2022/mention/mention.module.mjs +0 -23
  613. package/esm2022/mention/ngx-tethys-mention.mjs +0 -5
  614. package/esm2022/mention/suggestions/suggestions.component.mjs +0 -80
  615. package/esm2022/menu/divider/menu-divider.component.mjs +0 -21
  616. package/esm2022/menu/group/menu-group.component.mjs +0 -187
  617. package/esm2022/menu/index.mjs +0 -9
  618. package/esm2022/menu/item/action/menu-item-action.component.mjs +0 -75
  619. package/esm2022/menu/item/icon/menu-item-icon.component.mjs +0 -33
  620. package/esm2022/menu/item/menu-item.component.mjs +0 -42
  621. package/esm2022/menu/item/name/menu-item-name.component.mjs +0 -32
  622. package/esm2022/menu/menu.component.mjs +0 -39
  623. package/esm2022/menu/menu.module.mjs +0 -49
  624. package/esm2022/menu/ngx-tethys-menu.mjs +0 -5
  625. package/esm2022/message/abstract/abstract-message-container.component.mjs +0 -26
  626. package/esm2022/message/abstract/abstract-message-queue.service.mjs +0 -34
  627. package/esm2022/message/abstract/abstract-message-ref.mjs +0 -22
  628. package/esm2022/message/abstract/abstract-message.component.mjs +0 -76
  629. package/esm2022/message/abstract/abstract-message.service.mjs +0 -29
  630. package/esm2022/message/abstract/index.mjs +0 -6
  631. package/esm2022/message/index.mjs +0 -9
  632. package/esm2022/message/message-container.component.mjs +0 -45
  633. package/esm2022/message/message-queue.service.mjs +0 -25
  634. package/esm2022/message/message-ref.mjs +0 -4
  635. package/esm2022/message/message.component.mjs +0 -61
  636. package/esm2022/message/message.config.mjs +0 -14
  637. package/esm2022/message/message.service.mjs +0 -92
  638. package/esm2022/message/module.mjs +0 -24
  639. package/esm2022/message/ngx-tethys-message.mjs +0 -5
  640. package/esm2022/nav/icon-nav/icon-nav-link.directive.mjs +0 -43
  641. package/esm2022/nav/icon-nav/icon-nav.component.mjs +0 -45
  642. package/esm2022/nav/index.mjs +0 -7
  643. package/esm2022/nav/nav-ink-bar.directive.mjs +0 -79
  644. package/esm2022/nav/nav-item.directive.mjs +0 -98
  645. package/esm2022/nav/nav.component.mjs +0 -410
  646. package/esm2022/nav/nav.module.mjs +0 -54
  647. package/esm2022/nav/nav.pipe.mjs +0 -24
  648. package/esm2022/nav/ngx-tethys-nav.mjs +0 -5
  649. package/esm2022/ngx-tethys.mjs +0 -5
  650. package/esm2022/notify/index.mjs +0 -8
  651. package/esm2022/notify/module.mjs +0 -24
  652. package/esm2022/notify/ngx-tethys-notify.mjs +0 -5
  653. package/esm2022/notify/notify-container.component.mjs +0 -31
  654. package/esm2022/notify/notify-queue.service.mjs +0 -30
  655. package/esm2022/notify/notify-ref.mjs +0 -4
  656. package/esm2022/notify/notify.component.mjs +0 -99
  657. package/esm2022/notify/notify.config.mjs +0 -14
  658. package/esm2022/notify/notify.service.mjs +0 -97
  659. package/esm2022/pagination/index.mjs +0 -6
  660. package/esm2022/pagination/ngx-tethys-pagination.mjs +0 -5
  661. package/esm2022/pagination/pagination.class.mjs +0 -2
  662. package/esm2022/pagination/pagination.component.mjs +0 -366
  663. package/esm2022/pagination/pagination.config.mjs +0 -30
  664. package/esm2022/pagination/pagination.module.mjs +0 -43
  665. package/esm2022/pagination/pagination.pipe.mjs +0 -53
  666. package/esm2022/popover/body/popover-body.component.mjs +0 -25
  667. package/esm2022/popover/header/popover-header.component.mjs +0 -54
  668. package/esm2022/popover/index.mjs +0 -10
  669. package/esm2022/popover/module.mjs +0 -47
  670. package/esm2022/popover/ngx-tethys-popover.mjs +0 -5
  671. package/esm2022/popover/popover-animations.mjs +0 -22
  672. package/esm2022/popover/popover-container.component.mjs +0 -125
  673. package/esm2022/popover/popover-ref.mjs +0 -25
  674. package/esm2022/popover/popover.config.mjs +0 -38
  675. package/esm2022/popover/popover.directive.mjs +0 -157
  676. package/esm2022/popover/popover.options.mjs +0 -6
  677. package/esm2022/popover/popover.service.mjs +0 -201
  678. package/esm2022/progress/index.mjs +0 -6
  679. package/esm2022/progress/interfaces.mjs +0 -2
  680. package/esm2022/progress/ngx-tethys-progress.mjs +0 -5
  681. package/esm2022/progress/progress-circle.component.mjs +0 -136
  682. package/esm2022/progress/progress-strip.component.mjs +0 -54
  683. package/esm2022/progress/progress.component.mjs +0 -142
  684. package/esm2022/progress/progress.module.mjs +0 -20
  685. package/esm2022/property/index.mjs +0 -4
  686. package/esm2022/property/module.mjs +0 -20
  687. package/esm2022/property/ngx-tethys-property.mjs +0 -5
  688. package/esm2022/property/properties.component.mjs +0 -59
  689. package/esm2022/property/property-item.component.mjs +0 -175
  690. package/esm2022/property-operation/group/property-operation-group.component.mjs +0 -20
  691. package/esm2022/property-operation/index.mjs +0 -4
  692. package/esm2022/property-operation/module.mjs +0 -21
  693. package/esm2022/property-operation/ngx-tethys-property-operation.mjs +0 -5
  694. package/esm2022/property-operation/property-operation.component.mjs +0 -183
  695. package/esm2022/public-api.mjs +0 -2
  696. package/esm2022/radio/button/radio-button.component.mjs +0 -56
  697. package/esm2022/radio/group/radio-group.component.mjs +0 -138
  698. package/esm2022/radio/index.mjs +0 -5
  699. package/esm2022/radio/module.mjs +0 -20
  700. package/esm2022/radio/ngx-tethys-radio.mjs +0 -5
  701. package/esm2022/radio/radio.component.mjs +0 -58
  702. package/esm2022/rate/index.mjs +0 -4
  703. package/esm2022/rate/module.mjs +0 -23
  704. package/esm2022/rate/ngx-tethys-rate.mjs +0 -5
  705. package/esm2022/rate/rate-item.component.mjs +0 -76
  706. package/esm2022/rate/rate.component.mjs +0 -244
  707. package/esm2022/resizable/index.mjs +0 -8
  708. package/esm2022/resizable/interface.mjs +0 -2
  709. package/esm2022/resizable/module.mjs +0 -19
  710. package/esm2022/resizable/ngx-tethys-resizable.mjs +0 -5
  711. package/esm2022/resizable/resizable.directive.mjs +0 -363
  712. package/esm2022/resizable/resizable.service.mjs +0 -69
  713. package/esm2022/resizable/resize-handle.component.mjs +0 -104
  714. package/esm2022/resizable/resize-handles.component.mjs +0 -64
  715. package/esm2022/resizable/utils.mjs +0 -14
  716. package/esm2022/result/index.mjs +0 -3
  717. package/esm2022/result/ngx-tethys-result.mjs +0 -5
  718. package/esm2022/result/result.component.mjs +0 -43
  719. package/esm2022/result/result.module.mjs +0 -17
  720. package/esm2022/segment/index.mjs +0 -5
  721. package/esm2022/segment/ngx-tethys-segment.mjs +0 -5
  722. package/esm2022/segment/segment-item.component.mjs +0 -87
  723. package/esm2022/segment/segment.component.mjs +0 -143
  724. package/esm2022/segment/segment.module.mjs +0 -20
  725. package/esm2022/segment/segment.token.mjs +0 -3
  726. package/esm2022/segment/types.mjs +0 -2
  727. package/esm2022/select/custom-select/custom-select.component.mjs +0 -904
  728. package/esm2022/select/index.mjs +0 -5
  729. package/esm2022/select/module.mjs +0 -62
  730. package/esm2022/select/native-select/native-select.component.mjs +0 -98
  731. package/esm2022/select/ngx-tethys-select.mjs +0 -5
  732. package/esm2022/select/select.config.mjs +0 -21
  733. package/esm2022/shared/base-form-check.component.mjs +0 -120
  734. package/esm2022/shared/directives/string-or-template-outlet.directive.mjs +0 -57
  735. package/esm2022/shared/directives/thy-autofocus.directive.mjs +0 -60
  736. package/esm2022/shared/directives/thy-contextmenu.directive.mjs +0 -39
  737. package/esm2022/shared/directives/thy-ctrl-enter.directive.mjs +0 -43
  738. package/esm2022/shared/directives/thy-drag-drop.directive.mjs +0 -51
  739. package/esm2022/shared/directives/thy-enter.directive.mjs +0 -43
  740. package/esm2022/shared/directives/thy-scroll.directive.mjs +0 -84
  741. package/esm2022/shared/directives/thy-show.mjs +0 -59
  742. package/esm2022/shared/directives/thy-stop-propagation.directive.mjs +0 -57
  743. package/esm2022/shared/directives/view-outlet.directive.mjs +0 -85
  744. package/esm2022/shared/index.mjs +0 -16
  745. package/esm2022/shared/ng-transclude.directive.mjs +0 -32
  746. package/esm2022/shared/ngx-tethys-shared.mjs +0 -5
  747. package/esm2022/shared/option/group/option-group.component.mjs +0 -92
  748. package/esm2022/shared/option/index.mjs +0 -9
  749. package/esm2022/shared/option/list-option/list-option.component.mjs +0 -96
  750. package/esm2022/shared/option/module.mjs +0 -29
  751. package/esm2022/shared/option/option-group.component.mjs +0 -25
  752. package/esm2022/shared/option/option.component.mjs +0 -181
  753. package/esm2022/shared/option/option.token.mjs +0 -14
  754. package/esm2022/shared/option/options-container.component.mjs +0 -29
  755. package/esm2022/shared/option/select-option-base.mjs +0 -3
  756. package/esm2022/shared/select/index.mjs +0 -3
  757. package/esm2022/shared/select/module.mjs +0 -27
  758. package/esm2022/shared/select/select-control/select-control.component.mjs +0 -280
  759. package/esm2022/shared/shared.module.mjs +0 -71
  760. package/esm2022/skeleton/index.mjs +0 -9
  761. package/esm2022/skeleton/module.mjs +0 -27
  762. package/esm2022/skeleton/ngx-tethys-skeleton.mjs +0 -5
  763. package/esm2022/skeleton/skeleton-circle.component.mjs +0 -92
  764. package/esm2022/skeleton/skeleton-rectangle.component.mjs +0 -100
  765. package/esm2022/skeleton/skeleton.component.mjs +0 -32
  766. package/esm2022/skeleton/skeleton.config.mjs +0 -8
  767. package/esm2022/skeleton/stylized/bullet-list.component.mjs +0 -124
  768. package/esm2022/skeleton/stylized/list.component.mjs +0 -95
  769. package/esm2022/skeleton/stylized/paragraph.component.mjs +0 -107
  770. package/esm2022/slide/drawer/drawer-container.directive.mjs +0 -21
  771. package/esm2022/slide/index.mjs +0 -13
  772. package/esm2022/slide/ngx-tethys-slide.mjs +0 -5
  773. package/esm2022/slide/slide-animations.mjs +0 -24
  774. package/esm2022/slide/slide-body/slide-body-section.component.mjs +0 -41
  775. package/esm2022/slide/slide-body/slide-body.component.mjs +0 -25
  776. package/esm2022/slide/slide-container.component.mjs +0 -192
  777. package/esm2022/slide/slide-footer/slide-footer.component.mjs +0 -26
  778. package/esm2022/slide/slide-header/slide-header.component.mjs +0 -59
  779. package/esm2022/slide/slide-layout/slide-layout.component.mjs +0 -27
  780. package/esm2022/slide/slide-ref.service.mjs +0 -32
  781. package/esm2022/slide/slide.config.mjs +0 -38
  782. package/esm2022/slide/slide.module.mjs +0 -65
  783. package/esm2022/slide/slide.service.mjs +0 -104
  784. package/esm2022/slider/index.mjs +0 -3
  785. package/esm2022/slider/ngx-tethys-slider.mjs +0 -5
  786. package/esm2022/slider/slider.component.mjs +0 -346
  787. package/esm2022/slider/slider.module.mjs +0 -19
  788. package/esm2022/space/index.mjs +0 -3
  789. package/esm2022/space/ngx-tethys-space.mjs +0 -5
  790. package/esm2022/space/space.component.mjs +0 -88
  791. package/esm2022/space/space.module.mjs +0 -17
  792. package/esm2022/statistic/index.mjs +0 -3
  793. package/esm2022/statistic/ngx-tethys-statistic.mjs +0 -5
  794. package/esm2022/statistic/statistic.component.mjs +0 -184
  795. package/esm2022/statistic/statistic.module.mjs +0 -20
  796. package/esm2022/stepper/index.mjs +0 -6
  797. package/esm2022/stepper/ngx-tethys-stepper.mjs +0 -5
  798. package/esm2022/stepper/step-header.component.mjs +0 -40
  799. package/esm2022/stepper/step.component.mjs +0 -32
  800. package/esm2022/stepper/stepper-button.directive.mjs +0 -56
  801. package/esm2022/stepper/stepper.component.mjs +0 -105
  802. package/esm2022/stepper/stepper.module.mjs +0 -21
  803. package/esm2022/strength/index.mjs +0 -3
  804. package/esm2022/strength/ngx-tethys-strength.mjs +0 -5
  805. package/esm2022/strength/strength.component.mjs +0 -122
  806. package/esm2022/strength/strength.module.mjs +0 -17
  807. package/esm2022/switch/index.mjs +0 -3
  808. package/esm2022/switch/ngx-tethys-switch.mjs +0 -5
  809. package/esm2022/switch/switch.component.mjs +0 -181
  810. package/esm2022/switch/switch.module.mjs +0 -17
  811. package/esm2022/table/enums/column-skeleton-type.mjs +0 -8
  812. package/esm2022/table/enums/index.mjs +0 -2
  813. package/esm2022/table/index.mjs +0 -9
  814. package/esm2022/table/ngx-tethys-table.mjs +0 -5
  815. package/esm2022/table/pipes/drag.pipe.mjs +0 -20
  816. package/esm2022/table/pipes/table.pipe.mjs +0 -20
  817. package/esm2022/table/table-column.component.mjs +0 -200
  818. package/esm2022/table/table-skeleton.component.mjs +0 -165
  819. package/esm2022/table/table.component.mjs +0 -966
  820. package/esm2022/table/table.interface.mjs +0 -7
  821. package/esm2022/table/table.module.mjs +0 -75
  822. package/esm2022/tabs/index.mjs +0 -5
  823. package/esm2022/tabs/ngx-tethys-tabs.mjs +0 -5
  824. package/esm2022/tabs/tab-content.component.mjs +0 -52
  825. package/esm2022/tabs/tab.component.mjs +0 -36
  826. package/esm2022/tabs/tabs.component.mjs +0 -139
  827. package/esm2022/tabs/tabs.module.mjs +0 -21
  828. package/esm2022/tabs/types.mjs +0 -2
  829. package/esm2022/tag/index.mjs +0 -4
  830. package/esm2022/tag/ngx-tethys-tag.mjs +0 -5
  831. package/esm2022/tag/tag.component.mjs +0 -109
  832. package/esm2022/tag/tag.module.mjs +0 -19
  833. package/esm2022/tag/tags.component.mjs +0 -24
  834. package/esm2022/testing/data-transfer.mjs +0 -55
  835. package/esm2022/testing/dispatcher-events.mjs +0 -46
  836. package/esm2022/testing/element-focus.mjs +0 -18
  837. package/esm2022/testing/events.mjs +0 -145
  838. package/esm2022/testing/index.mjs +0 -8
  839. package/esm2022/testing/ngx-tethys-testing.mjs +0 -5
  840. package/esm2022/testing/thy-icon.mjs +0 -50
  841. package/esm2022/testing/type-in-element.mjs +0 -20
  842. package/esm2022/testing/xhr-mock.mjs +0 -100
  843. package/esm2022/time-picker/index.mjs +0 -8
  844. package/esm2022/time-picker/inner/inner-time-picker.class.mjs +0 -2
  845. package/esm2022/time-picker/inner/inner-time-picker.component.mjs +0 -239
  846. package/esm2022/time-picker/inner/inner-time-picker.config.mjs +0 -45
  847. package/esm2022/time-picker/inner/inner-time-picker.store.mjs +0 -134
  848. package/esm2022/time-picker/ngx-tethys-time-picker.mjs +0 -5
  849. package/esm2022/time-picker/time-picker-controls.util.mjs +0 -118
  850. package/esm2022/time-picker/time-picker-panel.component.mjs +0 -265
  851. package/esm2022/time-picker/time-picker.component.mjs +0 -363
  852. package/esm2022/time-picker/time-picker.module.mjs +0 -54
  853. package/esm2022/time-picker/time-picker.utils.mjs +0 -131
  854. package/esm2022/timeline/index.mjs +0 -5
  855. package/esm2022/timeline/ngx-tethys-timeline.mjs +0 -5
  856. package/esm2022/timeline/timeline-item.component.mjs +0 -59
  857. package/esm2022/timeline/timeline.component.mjs +0 -156
  858. package/esm2022/timeline/timeline.module.mjs +0 -21
  859. package/esm2022/timeline/timeline.service.mjs +0 -17
  860. package/esm2022/tooltip/index.mjs +0 -9
  861. package/esm2022/tooltip/interface.mjs +0 -2
  862. package/esm2022/tooltip/ngx-tethys-tooltip.mjs +0 -5
  863. package/esm2022/tooltip/tooltip-animations.mjs +0 -23
  864. package/esm2022/tooltip/tooltip-ref.mjs +0 -147
  865. package/esm2022/tooltip/tooltip.component.mjs +0 -103
  866. package/esm2022/tooltip/tooltip.config.mjs +0 -17
  867. package/esm2022/tooltip/tooltip.directive.mjs +0 -150
  868. package/esm2022/tooltip/tooltip.module.mjs +0 -22
  869. package/esm2022/tooltip/tooltip.service.mjs +0 -28
  870. package/esm2022/transfer/index.mjs +0 -5
  871. package/esm2022/transfer/ngx-tethys-transfer.mjs +0 -5
  872. package/esm2022/transfer/transfer-list.component.mjs +0 -154
  873. package/esm2022/transfer/transfer.component.mjs +0 -180
  874. package/esm2022/transfer/transfer.interface.mjs +0 -6
  875. package/esm2022/transfer/transfer.module.mjs +0 -50
  876. package/esm2022/tree/index.mjs +0 -7
  877. package/esm2022/tree/ngx-tethys-tree.mjs +0 -5
  878. package/esm2022/tree/tree-abstract.mjs +0 -3
  879. package/esm2022/tree/tree-node.class.mjs +0 -93
  880. package/esm2022/tree/tree-node.component.mjs +0 -212
  881. package/esm2022/tree/tree.class.mjs +0 -15
  882. package/esm2022/tree/tree.component.mjs +0 -648
  883. package/esm2022/tree/tree.module.mjs +0 -74
  884. package/esm2022/tree/tree.pipe.mjs +0 -26
  885. package/esm2022/tree/tree.service.mjs +0 -187
  886. package/esm2022/tree-select/index.mjs +0 -4
  887. package/esm2022/tree-select/module.mjs +0 -52
  888. package/esm2022/tree-select/ngx-tethys-tree-select.mjs +0 -5
  889. package/esm2022/tree-select/tree-select.class.mjs +0 -2
  890. package/esm2022/tree-select/tree-select.component.mjs +0 -653
  891. package/esm2022/types/common.mjs +0 -2
  892. package/esm2022/types/dictionary.mjs +0 -2
  893. package/esm2022/types/index.mjs +0 -4
  894. package/esm2022/types/ngx-tethys-types.mjs +0 -5
  895. package/esm2022/types/pagination.mjs +0 -2
  896. package/esm2022/typography/bg-color.directive.mjs +0 -51
  897. package/esm2022/typography/index.mjs +0 -5
  898. package/esm2022/typography/module.mjs +0 -21
  899. package/esm2022/typography/ngx-tethys-typography.mjs +0 -5
  900. package/esm2022/typography/text/text.component.mjs +0 -23
  901. package/esm2022/typography/text-color.directive.mjs +0 -52
  902. package/esm2022/upload/constant.mjs +0 -75
  903. package/esm2022/upload/file-drop.directive.mjs +0 -166
  904. package/esm2022/upload/file-select-base.mjs +0 -75
  905. package/esm2022/upload/file-select.component.mjs +0 -98
  906. package/esm2022/upload/index.mjs +0 -7
  907. package/esm2022/upload/module.mjs +0 -22
  908. package/esm2022/upload/ngx-tethys-upload.mjs +0 -5
  909. package/esm2022/upload/types.mjs +0 -2
  910. package/esm2022/upload/upload.config.mjs +0 -21
  911. package/esm2022/upload/upload.service.mjs +0 -169
  912. package/esm2022/upload/util.mjs +0 -27
  913. package/esm2022/util/date/functions.mjs +0 -84
  914. package/esm2022/util/date/tiny-date.mjs +0 -362
  915. package/esm2022/util/dom.mjs +0 -247
  916. package/esm2022/util/helpers/helpers.mjs +0 -293
  917. package/esm2022/util/helpers/index.mjs +0 -2
  918. package/esm2022/util/immutable.mjs +0 -108
  919. package/esm2022/util/index.mjs +0 -16
  920. package/esm2022/util/keycodes.mjs +0 -2
  921. package/esm2022/util/logger/index.mjs +0 -2
  922. package/esm2022/util/logger/logger.mjs +0 -42
  923. package/esm2022/util/ng.mjs +0 -7
  924. package/esm2022/util/ngx-tethys-util.mjs +0 -5
  925. package/esm2022/util/references.mjs +0 -84
  926. package/esm2022/version.mjs +0 -3
  927. package/esm2022/vote/index.mjs +0 -3
  928. package/esm2022/vote/ngx-tethys-vote.mjs +0 -5
  929. package/esm2022/vote/vote.component.mjs +0 -130
  930. package/esm2022/vote/vote.module.mjs +0 -20
  931. package/esm2022/watermark/config.mjs +0 -20
  932. package/esm2022/watermark/index.mjs +0 -3
  933. package/esm2022/watermark/ngx-tethys-watermark.mjs +0 -5
  934. package/esm2022/watermark/watermark.directive.mjs +0 -178
  935. package/esm2022/watermark/watermark.module.mjs +0 -19
  936. package/schematics/ng-update/update-18/complete.d.ts +0 -3
  937. package/schematics/ng-update/update-18/complete.js +0 -13
  938. /package/schematics/ng-update/{update-18 → update-19}/class-name-migration.d.ts +0 -0
  939. /package/schematics/ng-update/{update-18 → update-19}/class-name-migration.js +0 -0
  940. /package/schematics/ng-update/{update-18 → update-19}/index.d.ts +0 -0
  941. /package/schematics/ng-update/{update-18 → update-19}/index.spec.d.ts +0 -0
  942. /package/schematics/ng-update/{update-18 → update-19}/update-data.d.ts +0 -0
  943. /package/schematics/ng-update/{update-18 → update-19}/update-data.js +0 -0
@@ -1,904 +0,0 @@
1
- import { getFlexiblePositions, injectPanelEmptyIcon, scaleMotion, scaleXMotion, scaleYMotion, ScrollToService, TabIndexDisabledControlValueAccessorMixin, ThyClickDispatcher } from 'ngx-tethys/core';
2
- import { ThyEmpty } from 'ngx-tethys/empty';
3
- import { ThyLoading } from 'ngx-tethys/loading';
4
- import { THY_OPTION_PARENT_COMPONENT, ThyOption, ThyOptionsContainer, ThyScrollDirective, ThySelectControl, ThySelectOptionGroup, ThyStopPropagationDirective } from 'ngx-tethys/shared';
5
- import { A, coerceBooleanProperty, DOWN_ARROW, elementMatchClosest, END, ENTER, hasModifierKey, helpers, HOME, isArray, isFunction, LEFT_ARROW, RIGHT_ARROW, SPACE, UP_ARROW } from 'ngx-tethys/util';
6
- import { defer, merge, Observable, Subject, timer } from 'rxjs';
7
- import { distinctUntilChanged, filter, map, startWith, switchMap, take, takeUntil } from 'rxjs/operators';
8
- import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';
9
- import { coerceElement } from '@angular/cdk/coercion';
10
- import { SelectionModel } from '@angular/cdk/collections';
11
- import { CdkConnectedOverlay, CdkOverlayOrigin, Overlay } from '@angular/cdk/overlay';
12
- import { isPlatformBrowser, NgClass, NgTemplateOutlet } from '@angular/common';
13
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, NgZone, numberAttribute, Output, PLATFORM_ID, QueryList, TemplateRef, ViewChild, ViewChildren, inject } from '@angular/core';
14
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
15
- import { DEFAULT_SELECT_CONFIG, THY_SELECT_CONFIG, THY_SELECT_SCROLL_STRATEGY } from '../select.config';
16
- import { injectLocale } from 'ngx-tethys/i18n';
17
- import * as i0 from "@angular/core";
18
- export const SELECT_PANEL_MAX_HEIGHT = 300;
19
- export const SELECT_OPTION_MAX_HEIGHT = 40;
20
- export const SELECT_OPTION_GROUP_MAX_HEIGHT = 30;
21
- export const SELECT_PANEL_PADDING_TOP = 10;
22
- export const THY_SELECT_PANEL_MIN_WIDTH = 200;
23
- const noop = () => { };
24
- /**
25
- * 下拉选择组件
26
- * @name thy-select,thy-custom-select
27
- * @order 10
28
- */
29
- export class ThySelect extends TabIndexDisabledControlValueAccessorMixin {
30
- /**
31
- * 下拉选择模式
32
- * @type 'multiple' | ''
33
- */
34
- set thyMode(value) {
35
- this.mode = value;
36
- this.instanceSelectionModel();
37
- this.getPositions();
38
- this.setDropDownClass();
39
- }
40
- get thyMode() {
41
- return this.mode;
42
- }
43
- /**
44
- * 操作图标类型
45
- * @type primary | success | danger | warning
46
- * @default primary
47
- */
48
- get thySize() {
49
- return this.size;
50
- }
51
- set thySize(value) {
52
- this.size = value;
53
- }
54
- /**
55
- * 数据为空时显示的提示文字
56
- */
57
- set thyEmptyStateText(value) {
58
- this.emptyStateText = value;
59
- }
60
- /**
61
- * 搜索结果为空时显示的提示文字
62
- */
63
- set thyEmptySearchMessageText(value) {
64
- this.emptySearchMessageText = value;
65
- }
66
- /**
67
- * 是否禁用
68
- * @default false
69
- */
70
- set thyDisabled(value) {
71
- this.disabled = value;
72
- }
73
- get thyDisabled() {
74
- return this.disabled;
75
- }
76
- /**
77
- * option 列表
78
- * @type ThySelectOptionModel[]
79
- */
80
- set thyOptions(value) {
81
- if (value === null) {
82
- value = [];
83
- }
84
- this.innerOptions = value;
85
- this.isReactiveDriven = true;
86
- this.buildReactiveOptions();
87
- }
88
- handleKeydown(event) {
89
- if (!this.disabled) {
90
- if (event.keyCode === ENTER) {
91
- event.stopPropagation();
92
- }
93
- this.panelOpen ? this.handleOpenKeydown(event) : this.handleClosedKeydown(event);
94
- }
95
- }
96
- get optionsChanges$() {
97
- this.options = this.isReactiveDriven ? this.viewOptions : this.contentOptions;
98
- let previousOptions = this.options.toArray();
99
- return this.options.changes.pipe(map(data => {
100
- return this.options.toArray();
101
- }), filter(data => {
102
- const res = previousOptions.length !== data.length || previousOptions.some((op, index) => op !== data[index]);
103
- previousOptions = data;
104
- return res;
105
- }));
106
- }
107
- buildScrollStrategy() {
108
- if (this.scrollStrategyFactory && isFunction(this.scrollStrategyFactory)) {
109
- this.scrollStrategy = this.scrollStrategyFactory();
110
- }
111
- else {
112
- this.scrollStrategy = this.overlay.scrollStrategies.reposition();
113
- }
114
- }
115
- get placement() {
116
- return this.thyPlacement || this.config.placement;
117
- }
118
- constructor() {
119
- super();
120
- this.ngZone = inject(NgZone);
121
- this.elementRef = inject(ElementRef);
122
- this.changeDetectorRef = inject(ChangeDetectorRef);
123
- this.overlay = inject(Overlay);
124
- this.thyClickDispatcher = inject(ThyClickDispatcher);
125
- this.platformId = inject(PLATFORM_ID);
126
- this.locale = injectLocale('select');
127
- this.scrollStrategyFactory = inject(THY_SELECT_SCROLL_STRATEGY, { optional: true });
128
- this.selectConfig = inject(THY_SELECT_CONFIG, { optional: true });
129
- this.emptyIcon = injectPanelEmptyIcon();
130
- this.disabled = false;
131
- this.mode = '';
132
- this.emptyStateText = this.locale().empty;
133
- this.emptySearchMessageText = this.locale().empty;
134
- this.scrollTop = 0;
135
- this.modalValue = null;
136
- this.defaultOffset = 4;
137
- this.dropDownMinWidth = null;
138
- /**
139
- * 手动聚焦中的标识
140
- */
141
- this.manualFocusing = false;
142
- this.destroy$ = new Subject();
143
- this.optionSelectionChanges = defer(() => {
144
- if (this.options) {
145
- return merge(...this.options.map(option => option.selectionChange));
146
- }
147
- return this.ngZone.onStable.asObservable().pipe(take(1), switchMap(() => this.optionSelectionChanges));
148
- });
149
- this.isSelectCustom = true;
150
- this.isSelect = true;
151
- this.panelOpen = false;
152
- /**
153
- * 搜索时回调
154
- */
155
- this.thyOnSearch = new EventEmitter();
156
- /**
157
- * 下拉菜单滚动到底部事件,可以用这个事件实现滚动加载
158
- */
159
- this.thyOnScrollToBottom = new EventEmitter();
160
- /**
161
- * 下拉菜单展开和折叠状态事件
162
- */
163
- this.thyOnExpandStatusChange = new EventEmitter();
164
- /**
165
- * 选择框默认文字
166
- */
167
- this.thyPlaceHolder = this.locale().placeholder;
168
- /**
169
- * 异步加载 loading 状态,false 表示加载中,true 表示加载完成
170
- */
171
- this.thyLoadState = true;
172
- /**
173
- * 是否自动设置选项第一条为高亮状态
174
- */
175
- this.thyAutoActiveFirstItem = true;
176
- /**
177
- * 滚动加载是否可用,只能当这个参数可以,下面的thyOnScrollToBottom事件才会触发
178
- */
179
- this.thyEnableScrollLoad = false;
180
- /**
181
- * 单选( thyMode="" 或者不设置)时,选择框支持清除
182
- */
183
- this.thyAllowClear = false;
184
- /**
185
- * 自定义 Footer 模板容器 class
186
- */
187
- this.thyFooterClass = 'thy-custom-select-footer';
188
- /**
189
- * 是否弹出透明遮罩,如果显示遮罩则会阻止滚动区域滚动
190
- */
191
- this.thyHasBackdrop = false;
192
- /**
193
- * 设置多选时最大显示的标签数量,0 表示不限制
194
- */
195
- this.thyMaxTagCount = 0;
196
- /**
197
- * 是否隐藏选择框边框
198
- * @default false
199
- */
200
- this.thyBorderless = false;
201
- this.isReactiveDriven = false;
202
- this.optionGroups = [];
203
- /**
204
- * 目前只支持多选选中项的展示,默认为空,渲染文字模板,传入tag,渲染展示模板,
205
- * @default ''|tag
206
- */
207
- this.thyPreset = '';
208
- this.isSearching = false;
209
- this.groupBy = (item) => item.groupLabel;
210
- const selectConfig = this.selectConfig;
211
- this.config = { ...DEFAULT_SELECT_CONFIG, ...selectConfig };
212
- this.buildScrollStrategy();
213
- }
214
- writeValue(value) {
215
- this.modalValue = value;
216
- this.setSelectionByModelValue(this.modalValue);
217
- }
218
- ngOnInit() {
219
- this.getPositions();
220
- this.dropDownMinWidth = this.getDropdownMinWidth();
221
- if (!this.selectionModel) {
222
- this.instanceSelectionModel();
223
- }
224
- this.setDropDownClass();
225
- if (isPlatformBrowser(this.platformId)) {
226
- this.thyClickDispatcher
227
- .clicked(0)
228
- .pipe(takeUntil(this.destroy$))
229
- .subscribe(event => {
230
- if (!this.elementRef.nativeElement.contains(event.target) && this.panelOpen) {
231
- this.ngZone.run(() => {
232
- this.close();
233
- this.changeDetectorRef.markForCheck();
234
- });
235
- }
236
- });
237
- }
238
- }
239
- buildOptionGroups(options) {
240
- const optionGroups = [];
241
- const groups = [...new Set(options.filter(item => this.groupBy(item)).map(sub => this.groupBy(sub)))];
242
- const groupMap = new Map();
243
- groups.forEach(group => {
244
- const children = options.filter(item => this.groupBy(item) === group);
245
- const groupOption = {
246
- groupLabel: group,
247
- children: children
248
- };
249
- groupMap.set(group, groupOption);
250
- });
251
- options.forEach(option => {
252
- if (this.groupBy(option)) {
253
- const currentIndex = optionGroups.findIndex(item => item.groupLabel === this.groupBy(option));
254
- if (currentIndex === -1) {
255
- const item = groupMap.get(this.groupBy(option));
256
- optionGroups.push(item);
257
- }
258
- }
259
- else {
260
- optionGroups.push(option);
261
- }
262
- });
263
- return optionGroups;
264
- }
265
- buildReactiveOptions() {
266
- if (this.innerOptions.filter(item => this.groupBy(item)).length > 0) {
267
- this.optionGroups = this.buildOptionGroups(this.innerOptions);
268
- }
269
- else {
270
- this.optionGroups = this.innerOptions;
271
- }
272
- }
273
- getDropdownMinWidth() {
274
- const mode = this.thyDropdownWidthMode || this.config.dropdownWidthMode;
275
- let dropdownMinWidth = null;
276
- if (mode?.minWidth) {
277
- dropdownMinWidth = mode.minWidth;
278
- }
279
- else if (mode === 'min-width') {
280
- dropdownMinWidth = THY_SELECT_PANEL_MIN_WIDTH;
281
- }
282
- else {
283
- dropdownMinWidth = null;
284
- }
285
- return dropdownMinWidth;
286
- }
287
- ngAfterViewInit() {
288
- if (this.isReactiveDriven) {
289
- this.setup();
290
- }
291
- }
292
- ngAfterContentInit() {
293
- if (!this.isReactiveDriven) {
294
- this.setup();
295
- }
296
- }
297
- setup() {
298
- this.optionsChanges$.pipe(startWith(null), takeUntil(this.destroy$)).subscribe(data => {
299
- this.resetOptions();
300
- this.initializeSelection();
301
- this.initKeyManager();
302
- if (this.isSearching) {
303
- this.highlightCorrectOption(false);
304
- this.isSearching = false;
305
- }
306
- this.changeDetectorRef.markForCheck();
307
- this.ngZone.onStable
308
- .asObservable()
309
- .pipe(take(1))
310
- .subscribe(() => {
311
- if (this.cdkConnectedOverlay && this.cdkConnectedOverlay.overlayRef) {
312
- this.cdkConnectedOverlay.overlayRef.updatePosition();
313
- }
314
- });
315
- });
316
- if (this.thyAutoExpand) {
317
- timer(0).subscribe(() => {
318
- this.changeDetectorRef.markForCheck();
319
- this.open();
320
- this.focus();
321
- });
322
- }
323
- }
324
- get isHiddenOptions() {
325
- return this.options.toArray().every(option => option.hidden);
326
- }
327
- onAttached() {
328
- this.cdkConnectedOverlay.positionChange.pipe(take(1)).subscribe(() => {
329
- if (this.panel) {
330
- if (this.keyManager.activeItem) {
331
- ScrollToService.scrollToElement(this.keyManager.activeItem.element.nativeElement, this.panel.nativeElement);
332
- this.changeDetectorRef.detectChanges();
333
- }
334
- else {
335
- if (!this.empty) {
336
- ScrollToService.scrollToElement(this.selectionModel.selected[0].element.nativeElement, this.panel.nativeElement);
337
- this.changeDetectorRef.detectChanges();
338
- }
339
- }
340
- }
341
- });
342
- }
343
- dropDownMouseMove(event) {
344
- if (this.keyManager.activeItem) {
345
- this.keyManager.setActiveItem(-1);
346
- }
347
- }
348
- onOptionsScrolled(elementRef) {
349
- const scroll = elementRef.nativeElement.scrollTop, height = elementRef.nativeElement.clientHeight, scrollHeight = elementRef.nativeElement.scrollHeight;
350
- if (scroll + height + 10 >= scrollHeight) {
351
- if (this.thyOnScrollToBottom.observers.length > 0) {
352
- this.ngZone.run(() => {
353
- this.thyOnScrollToBottom.emit();
354
- });
355
- }
356
- }
357
- }
358
- onSearchFilter(searchText) {
359
- searchText = searchText.trim();
360
- if (this.thyServerSearch) {
361
- this.isSearching = true;
362
- this.thyOnSearch.emit(searchText);
363
- }
364
- else {
365
- const options = this.options.toArray();
366
- options.forEach(option => {
367
- if (option.matchSearchText(searchText)) {
368
- option.showOption();
369
- }
370
- else {
371
- option.hideOption();
372
- }
373
- });
374
- this.highlightCorrectOption(false);
375
- this.updateCdkConnectedOverlayPositions();
376
- }
377
- }
378
- onBlur(event) {
379
- // Tab 聚焦后自动聚焦到 input 输入框,此分支下直接返回,无需触发 onTouchedFn
380
- if (elementMatchClosest(event?.relatedTarget, ['.thy-select-dropdown', 'thy-select'])) {
381
- return;
382
- }
383
- this.onTouchedFn();
384
- }
385
- onFocus(event) {
386
- // thyShowSearch 与 panelOpen 均为 true 时,点击 thySelectControl 需要触发自动聚焦到 input 的逻辑
387
- // manualFocusing 如果是手动聚焦,不触发自动聚焦到 input 的逻辑
388
- if ((this.thyShowSearch && this.panelOpen) ||
389
- (!this.manualFocusing &&
390
- !elementMatchClosest(event?.relatedTarget, ['.thy-select-dropdown', 'thy-custom-select']))) {
391
- const inputElement = this.elementRef.nativeElement.querySelector('input');
392
- inputElement.focus();
393
- }
394
- this.manualFocusing = false;
395
- }
396
- focus(options) {
397
- this.manualFocusing = true;
398
- this.elementRef.nativeElement.focus(options);
399
- this.manualFocusing = false;
400
- }
401
- remove($event) {
402
- $event.$eventOrigin.stopPropagation();
403
- if (this.disabled) {
404
- return;
405
- }
406
- if (!this.options.find(option => option === $event.item)) {
407
- $event.item.deselect();
408
- // fix option unselect can not emit changes;
409
- this.onSelect($event.item, true);
410
- }
411
- else {
412
- $event.item.deselect();
413
- }
414
- }
415
- clearSelectValue(event) {
416
- if (event) {
417
- event.stopPropagation();
418
- }
419
- if (this.disabled) {
420
- return;
421
- }
422
- this.selectionModel.clear();
423
- this.changeDetectorRef.markForCheck();
424
- this.emitModelValueChange();
425
- }
426
- updateCdkConnectedOverlayPositions() {
427
- setTimeout(() => {
428
- if (this.cdkConnectedOverlay && this.cdkConnectedOverlay.overlayRef) {
429
- this.cdkConnectedOverlay.overlayRef.updatePosition();
430
- }
431
- });
432
- }
433
- get selected() {
434
- return this.isMultiple ? this.selectionModel.selected : this.selectionModel.selected[0];
435
- }
436
- get isMultiple() {
437
- return this.mode === 'multiple';
438
- }
439
- get empty() {
440
- return !this.selectionModel || this.selectionModel.isEmpty();
441
- }
442
- getItemCount() {
443
- const group = this.isReactiveDriven ? this.viewGroups : this.contentGroups;
444
- return this.options.length + group.length;
445
- }
446
- toggle(event) {
447
- if (this.panelOpen) {
448
- if (!this.thyShowSearch) {
449
- this.close();
450
- }
451
- }
452
- else {
453
- this.open();
454
- }
455
- }
456
- open() {
457
- if (this.disabled || !this.options || this.panelOpen) {
458
- return;
459
- }
460
- this.triggerRectWidth = this.getOriginRectWidth();
461
- this.subscribeTriggerResize();
462
- this.panelOpen = true;
463
- this.highlightCorrectOption();
464
- this.thyOnExpandStatusChange.emit(this.panelOpen);
465
- this.changeDetectorRef.markForCheck();
466
- }
467
- close() {
468
- if (this.panelOpen) {
469
- this.panelOpen = false;
470
- this.unsubscribeTriggerResize();
471
- this.thyOnExpandStatusChange.emit(this.panelOpen);
472
- this.changeDetectorRef.markForCheck();
473
- this.onTouchedFn();
474
- }
475
- }
476
- emitModelValueChange() {
477
- const selectedValues = this.selectionModel.selected;
478
- const changeValue = selectedValues.map((option) => {
479
- return option.thyValue;
480
- });
481
- if (this.isMultiple) {
482
- this.modalValue = changeValue;
483
- }
484
- else {
485
- if (changeValue.length === 0) {
486
- this.modalValue = null;
487
- }
488
- else {
489
- this.modalValue = changeValue[0];
490
- }
491
- }
492
- this.onChangeFn(this.modalValue);
493
- this.updateCdkConnectedOverlayPositions();
494
- }
495
- highlightCorrectOption(fromOpenPanel = true) {
496
- if (this.keyManager && this.panelOpen) {
497
- if (fromOpenPanel) {
498
- if (this.keyManager.activeItem) {
499
- return;
500
- }
501
- if (this.empty) {
502
- if (!this.thyAutoActiveFirstItem) {
503
- return;
504
- }
505
- this.keyManager.setFirstItemActive();
506
- }
507
- else {
508
- this.keyManager.setActiveItem(this.selectionModel.selected[0]);
509
- }
510
- }
511
- else {
512
- if (!this.thyAutoActiveFirstItem) {
513
- return;
514
- }
515
- // always set first option active
516
- this.keyManager.setFirstItemActive();
517
- }
518
- }
519
- }
520
- initKeyManager() {
521
- if (this.keyManager && this.keyManager.activeItem) {
522
- this.keyManager.activeItem.setInactiveStyles();
523
- }
524
- this.keyManager = new ActiveDescendantKeyManager(this.options)
525
- .withTypeAhead()
526
- .withWrap()
527
- .withVerticalOrientation()
528
- .withAllowedModifierKeys(['shiftKey']);
529
- this.keyManager.tabOut.pipe(takeUntil(this.destroy$)).subscribe(() => {
530
- this.focus();
531
- this.close();
532
- });
533
- this.keyManager.change.pipe(takeUntil(this.destroy$)).subscribe(() => {
534
- if (this.panelOpen && this.panel) {
535
- if (this.keyManager.activeItem) {
536
- ScrollToService.scrollToElement(this.keyManager.activeItem.element.nativeElement, this.panel.nativeElement);
537
- }
538
- }
539
- else if (!this.panelOpen && !this.isMultiple && this.keyManager.activeItem) {
540
- this.keyManager.activeItem.selectViaInteraction();
541
- }
542
- });
543
- }
544
- handleClosedKeydown(event) {
545
- const keyCode = event.keyCode;
546
- const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW || keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW;
547
- const isOpenKey = keyCode === ENTER || keyCode === SPACE;
548
- const manager = this.keyManager;
549
- // Open the select on ALT + arrow key to match the native <select>
550
- if ((isOpenKey && !hasModifierKey(event)) || ((this.isMultiple || event.altKey) && isArrowKey)) {
551
- event.preventDefault(); // prevents the page from scrolling down when pressing space
552
- this.open();
553
- }
554
- else if (!this.isMultiple) {
555
- if (keyCode === HOME || keyCode === END) {
556
- keyCode === HOME ? manager.setFirstItemActive() : manager.setLastItemActive();
557
- event.preventDefault();
558
- }
559
- else {
560
- manager.onKeydown(event);
561
- }
562
- }
563
- }
564
- handleOpenKeydown(event) {
565
- const keyCode = event.keyCode;
566
- const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;
567
- const manager = this.keyManager;
568
- if (keyCode === HOME || keyCode === END) {
569
- event.preventDefault();
570
- keyCode === HOME ? manager.setFirstItemActive() : manager.setLastItemActive();
571
- }
572
- else if (isArrowKey && event.altKey) {
573
- // Close the select on ALT + arrow key to match the native <select>
574
- event.preventDefault();
575
- this.close();
576
- }
577
- else if ((keyCode === ENTER || keyCode === SPACE) && (manager.activeItem || !this.empty) && !hasModifierKey(event)) {
578
- event.preventDefault();
579
- if (!manager.activeItem) {
580
- if (manager.activeItemIndex === -1 && !this.empty) {
581
- manager.setActiveItem(this.selectionModel.selected[0]);
582
- }
583
- }
584
- manager.activeItem.selectViaInteraction();
585
- }
586
- else if (this.isMultiple && keyCode === A && event.ctrlKey) {
587
- event.preventDefault();
588
- const hasDeselectedOptions = this.options.some(opt => !opt.disabled && !opt.selected);
589
- this.options.forEach(option => {
590
- if (!option.disabled) {
591
- hasDeselectedOptions ? option.select() : option.deselect();
592
- }
593
- });
594
- }
595
- else {
596
- if (manager.activeItemIndex === -1 && !this.empty) {
597
- manager.setActiveItem(this.selectionModel.selected[0]);
598
- }
599
- const previouslyFocusedIndex = manager.activeItemIndex;
600
- manager.onKeydown(event);
601
- if (this.isMultiple &&
602
- isArrowKey &&
603
- event.shiftKey &&
604
- manager.activeItem &&
605
- manager.activeItemIndex !== previouslyFocusedIndex) {
606
- manager.activeItem.selectViaInteraction();
607
- }
608
- }
609
- }
610
- getPositions() {
611
- this.dropDownPositions = getFlexiblePositions(this.thyPlacement || this.config.placement, this.defaultOffset);
612
- }
613
- instanceSelectionModel() {
614
- if (this.selectionModel) {
615
- this.selectionModel.clear();
616
- }
617
- this.selectionModel = new SelectionModel(this.isMultiple);
618
- if (this.selectionModelSubscription) {
619
- this.selectionModelSubscription.unsubscribe();
620
- this.selectionModelSubscription = null;
621
- }
622
- this.selectionModelSubscription = this.selectionModel.changed.pipe(takeUntil(this.destroy$)).subscribe(event => {
623
- event.added.forEach(option => option.select());
624
- event.removed.forEach(option => option.deselect());
625
- });
626
- }
627
- resetOptions() {
628
- const changedOrDestroyed$ = merge(this.optionsChanges$, this.destroy$);
629
- this.optionSelectionChanges.pipe(takeUntil(changedOrDestroyed$)).subscribe((event) => {
630
- this.onSelect(event.option, event.isUserInput);
631
- if (event.isUserInput && !this.isMultiple && this.panelOpen) {
632
- this.close();
633
- this.focus();
634
- }
635
- });
636
- }
637
- initializeSelection() {
638
- Promise.resolve().then(() => {
639
- this.setSelectionByModelValue(this.modalValue);
640
- });
641
- }
642
- setDropDownClass() {
643
- let modeClass = '';
644
- if (this.isMultiple) {
645
- modeClass = `thy-select-dropdown-${this.mode}`;
646
- }
647
- else {
648
- modeClass = `thy-select-dropdown-single`;
649
- }
650
- this.dropDownClass = {
651
- [`thy-select-dropdown`]: true,
652
- [modeClass]: true
653
- };
654
- }
655
- setSelectionByModelValue(modalValue) {
656
- if (helpers.isUndefinedOrNull(modalValue)) {
657
- if (this.selectionModel.selected.length > 0) {
658
- this.selectionModel.clear();
659
- this.changeDetectorRef.markForCheck();
660
- }
661
- return;
662
- }
663
- if (this.isMultiple) {
664
- if (isArray(modalValue)) {
665
- const selected = [...this.selectionModel.selected];
666
- this.selectionModel.clear();
667
- modalValue.forEach(itemValue => {
668
- const option = this.options.find(_option => _option.thyValue === itemValue) ||
669
- selected.find(_option => _option.thyValue === itemValue);
670
- if (option) {
671
- this.selectionModel.select(option);
672
- }
673
- });
674
- }
675
- }
676
- else {
677
- const selectedOption = this.options?.find(option => {
678
- return option.thyValue === modalValue;
679
- });
680
- if (selectedOption) {
681
- this.selectionModel.select(selectedOption);
682
- }
683
- }
684
- this.changeDetectorRef.markForCheck();
685
- }
686
- onSelect(option, isUserInput) {
687
- const wasSelected = this.selectionModel.isSelected(option);
688
- if (option.thyValue == null && !this.isMultiple) {
689
- option.deselect();
690
- this.selectionModel.clear();
691
- }
692
- else {
693
- if (wasSelected !== option.selected) {
694
- option.selected ? this.selectionModel.select(option) : this.selectionModel.deselect(option);
695
- }
696
- if (isUserInput) {
697
- this.keyManager.setActiveItem(option);
698
- }
699
- if (this.isMultiple) {
700
- this.sortValues();
701
- if (isUserInput) {
702
- this.focus();
703
- }
704
- }
705
- }
706
- if (wasSelected !== this.selectionModel.isSelected(option)) {
707
- this.emitModelValueChange();
708
- }
709
- if (!this.isMultiple) {
710
- this.onTouchedFn();
711
- }
712
- this.changeDetectorRef.markForCheck();
713
- }
714
- sortValues() {
715
- if (this.isMultiple) {
716
- const options = this.options.toArray();
717
- if (this.thySortComparator) {
718
- this.selectionModel.sort((a, b) => {
719
- return this.thySortComparator(a, b, options);
720
- });
721
- }
722
- }
723
- }
724
- getOriginRectWidth() {
725
- return this.thyOrigin ? coerceElement(this.thyOrigin).offsetWidth : this.trigger.nativeElement.offsetWidth;
726
- }
727
- subscribeTriggerResize() {
728
- this.unsubscribeTriggerResize();
729
- this.ngZone.runOutsideAngular(() => {
730
- this.resizeSubscription = new Observable(observer => {
731
- const resize = new ResizeObserver((entries) => {
732
- observer.next();
733
- });
734
- resize.observe(this.trigger.nativeElement);
735
- })
736
- .pipe(startWith(), map(() => {
737
- return this.getOriginRectWidth();
738
- }), distinctUntilChanged())
739
- .subscribe((width) => {
740
- this.ngZone.run(() => {
741
- this.triggerRectWidth = width;
742
- this.updateCdkConnectedOverlayPositions();
743
- this.changeDetectorRef.markForCheck();
744
- });
745
- });
746
- });
747
- }
748
- unsubscribeTriggerResize() {
749
- if (this.resizeSubscription) {
750
- this.resizeSubscription.unsubscribe();
751
- this.resizeSubscription = null;
752
- }
753
- }
754
- ngOnDestroy() {
755
- this.unsubscribeTriggerResize();
756
- this.destroy$.next();
757
- this.destroy$.complete();
758
- }
759
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ThySelect, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
760
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ThySelect, isStandalone: true, selector: "thy-select,thy-custom-select", inputs: { thyDropdownWidthMode: "thyDropdownWidthMode", thyShowSearch: ["thyShowSearch", "thyShowSearch", coerceBooleanProperty], thyPlaceHolder: "thyPlaceHolder", thyServerSearch: ["thyServerSearch", "thyServerSearch", coerceBooleanProperty], thyLoadState: ["thyLoadState", "thyLoadState", coerceBooleanProperty], thyAutoActiveFirstItem: ["thyAutoActiveFirstItem", "thyAutoActiveFirstItem", coerceBooleanProperty], thyMode: "thyMode", thySize: "thySize", thyEmptyStateText: "thyEmptyStateText", thyEmptySearchMessageText: "thyEmptySearchMessageText", thyEnableScrollLoad: ["thyEnableScrollLoad", "thyEnableScrollLoad", coerceBooleanProperty], thyAllowClear: ["thyAllowClear", "thyAllowClear", coerceBooleanProperty], thyDisabled: ["thyDisabled", "thyDisabled", coerceBooleanProperty], thySortComparator: "thySortComparator", thyFooterTemplate: "thyFooterTemplate", thyPlacement: "thyPlacement", thyOrigin: "thyOrigin", thyFooterClass: "thyFooterClass", thyAutoExpand: ["thyAutoExpand", "thyAutoExpand", coerceBooleanProperty], thyHasBackdrop: ["thyHasBackdrop", "thyHasBackdrop", coerceBooleanProperty], thyMaxTagCount: ["thyMaxTagCount", "thyMaxTagCount", numberAttribute], thyBorderless: ["thyBorderless", "thyBorderless", coerceBooleanProperty], thyOptions: "thyOptions", thyPreset: "thyPreset" }, outputs: { thyOnSearch: "thyOnSearch", thyOnScrollToBottom: "thyOnScrollToBottom", thyOnExpandStatusChange: "thyOnExpandStatusChange" }, host: { listeners: { "focus": "onFocus($event)", "blur": "onBlur($event)", "keydown": "handleKeydown($event)" }, properties: { "attr.tabindex": "tabIndex", "class.thy-select-custom": "this.isSelectCustom", "class.thy-select": "this.isSelect", "class.menu-is-opened": "this.panelOpen" } }, providers: [
761
- {
762
- provide: THY_OPTION_PARENT_COMPONENT,
763
- useExisting: ThySelect
764
- },
765
- {
766
- provide: NG_VALUE_ACCESSOR,
767
- useExisting: forwardRef(() => ThySelect),
768
- multi: true
769
- }
770
- ], queries: [{ propertyName: "selectedValueDisplayRef", first: true, predicate: ["selectedDisplay"], descendants: true }, { propertyName: "contentOptions", predicate: ThyOption, descendants: true }, { propertyName: "contentGroups", predicate: ThySelectOptionGroup }], viewQueries: [{ propertyName: "cdkConnectedOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true, static: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, read: ElementRef, static: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, read: ElementRef }, { propertyName: "viewOptions", predicate: ThyOption, descendants: true }, { propertyName: "viewGroups", predicate: ThySelectOptionGroup, descendants: true }], exportAs: ["thySelect"], usesInheritance: true, ngImport: i0, template: "<div\n cdk-overlay-origin\n thySelectControl\n (click)=\"toggle($event)\"\n #origin=\"cdkOverlayOrigin\"\n #trigger\n [thyPanelOpened]=\"panelOpen\"\n [thySelectedOptions]=\"selected\"\n [thyIsMultiple]=\"isMultiple\"\n [thyShowSearch]=\"thyShowSearch\"\n [thyAllowClear]=\"thyAllowClear\"\n [thySize]=\"thySize\"\n [thyPlaceholder]=\"thyPlaceHolder\"\n [customDisplayTemplate]=\"selectedValueDisplayRef\"\n [thyDisabled]=\"disabled\"\n [thyBorderless]=\"thyBorderless\"\n (thyOnClear)=\"clearSelectValue($event)\"\n (thyOnRemove)=\"remove($event)\"\n (thyOnSearch)=\"onSearchFilter($event)\"\n (thyOnBlur)=\"onBlur($event)\"\n [thyMaxTagCount]=\"thyMaxTagCount\"\n [thyPreset]=\"thyPreset\"></div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayHasBackdrop]=\"thyHasBackdrop\"\n [cdkConnectedOverlayPositions]=\"dropDownPositions\"\n [cdkConnectedOverlayOrigin]=\"thyOrigin || origin\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"triggerRectWidth\"\n [cdkConnectedOverlayMinWidth]=\"dropDownMinWidth\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n cdkConnectedOverlayTransformOriginOn=\".thy-select-dropdown\"\n (attach)=\"onAttached()\"\n (detach)=\"close()\">\n <div\n thyStopPropagation\n [attr.tabindex]=\"-1\"\n [ngClass]=\"dropDownClass\"\n [@scaleYMotion]=\"placement === 'top' || placement === 'bottom' ? 'enter' : 'void'\"\n [@scaleXMotion]=\"placement === 'left' || placement === 'right' ? 'enter' : 'void'\"\n [@scaleMotion]=\"placement !== 'top' && placement !== 'bottom' && placement !== 'left' && placement !== 'right' ? 'enter' : 'void'\"\n (mousemove)=\"dropDownMouseMove($event)\">\n @if (contentOptions?.length > 0 || contentGroups?.length > 0 || innerOptions?.length > 0) {\n <div\n #panel\n class=\"thy-select-dropdown-options thy-select-dropdown-options-{{ size }}\"\n thyScroll\n (thyOnScrolled)=\"onOptionsScrolled($event)\"\n [thyEnable]=\"thyEnableScrollLoad\">\n @if (isReactiveDriven) {\n <ng-template [ngTemplateOutlet]=\"optionsContainer.optionsTemplate\"></ng-template>\n }\n <ng-content></ng-content>\n @if (isHiddenOptions) {\n <thy-loading [thyDone]=\"thyLoadState\" thySize=\"sm\"></thy-loading>\n <div class=\"thy-select-empty-content\">\n @if (thyLoadState) {\n <thy-empty [thyMessage]=\"emptySearchMessageText\" thySize=\"sm\" [thyIconName]=\"emptyIcon()\"></thy-empty>\n }\n </div>\n }\n </div>\n } @else {\n <thy-loading [thyDone]=\"thyLoadState\" thySize=\"sm\"></thy-loading>\n <div class=\"thy-select-empty-content\">\n @if (thyLoadState) {\n <thy-empty [thyMessage]=\"emptyStateText\" thySize=\"sm\" [thyIconName]=\"emptyIcon()\"></thy-empty>\n }\n </div>\n }\n @if (thyFooterTemplate) {\n <div [class]=\"thyFooterClass ? thyFooterClass : 'thy-custom-select-footer'\">\n @if (thyFooterTemplate) {\n <ng-template [ngTemplateOutlet]=\"thyFooterTemplate\"></ng-template>\n }\n </div>\n }\n </div>\n</ng-template>\n\n<thy-options-container #optionsContainer>\n @for (option of optionGroups; track $index) {\n @if (!option.children) {\n <thy-option\n [thyDisabled]=\"option.disabled\"\n [thyLabelText]=\"option.label\"\n [thyValue]=\"option.value\"\n [thyRawValue]=\"option\"></thy-option>\n } @else {\n <thy-option-group [thyGroupLabel]=\"option.groupLabel\">\n @for (sub of option.children; track sub.value) {\n <thy-option [thyDisabled]=\"sub.disabled\" [thyLabelText]=\"sub.label\" [thyValue]=\"sub.value\" [thyRawValue]=\"sub\"></thy-option>\n }\n </thy-option-group>\n }\n }\n</thy-options-container>\n", dependencies: [{ kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ThySelectControl, selector: "thy-select-control,[thySelectControl]", inputs: ["thyPanelOpened", "thyIsMultiple", "thyShowSearch", "thySelectedOptions", "thyDisabled", "customDisplayTemplate", "thyAllowClear", "thyPlaceholder", "thySize", "thyMaxTagCount", "thyBorderless", "thyPreset"], outputs: ["thyOnSearch", "thyOnRemove", "thyOnClear", "thyOnBlur"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: ThyStopPropagationDirective, selector: "[thyStopPropagation]", inputs: ["thyStopPropagation"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: ThyScrollDirective, selector: "[thyScroll]", inputs: ["thyEnable"], outputs: ["thyOnScrolled"] }, { kind: "component", type: ThyLoading, selector: "thy-loading", inputs: ["thyDone", "thyTip", "thyIsMask"] }, { kind: "component", type: ThyEmpty, selector: "thy-empty", inputs: ["thyMessage", "thyTranslationKey", "thyTranslationValues", "thyEntityName", "thyEntityNameTranslateKey", "thyIconName", "thySize", "thyMarginTop", "thyTopAuto", "thyContainer", "thyImageUrl", "thyImageLoading", "thyImageFetchPriority", "thyDescription"] }, { kind: "component", type: ThyOptionsContainer, selector: "thy-options-container" }, { kind: "component", type: ThyOption, selector: "thy-option", inputs: ["thyValue", "thyRawValue", "thyLabelText", "thyShowOptionCustom", "thySearchKey", "thyDisabled"], outputs: ["selectionChange", "visibleChange"] }, { kind: "component", type: ThySelectOptionGroup, selector: "thy-option-group", inputs: ["thyDisabled", "thyGroupLabel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [scaleXMotion, scaleYMotion, scaleMotion], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
771
- }
772
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ThySelect, decorators: [{
773
- type: Component,
774
- args: [{ selector: 'thy-select,thy-custom-select', exportAs: 'thySelect', providers: [
775
- {
776
- provide: THY_OPTION_PARENT_COMPONENT,
777
- useExisting: ThySelect
778
- },
779
- {
780
- provide: NG_VALUE_ACCESSOR,
781
- useExisting: forwardRef(() => ThySelect),
782
- multi: true
783
- }
784
- ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
785
- CdkOverlayOrigin,
786
- ThySelectControl,
787
- CdkConnectedOverlay,
788
- ThyStopPropagationDirective,
789
- NgClass,
790
- ThyScrollDirective,
791
- ThyLoading,
792
- ThyEmpty,
793
- ThyOptionsContainer,
794
- ThyOption,
795
- ThySelectOptionGroup,
796
- NgTemplateOutlet
797
- ], host: {
798
- '[attr.tabindex]': 'tabIndex',
799
- '(focus)': 'onFocus($event)',
800
- '(blur)': 'onBlur($event)'
801
- }, animations: [scaleXMotion, scaleYMotion, scaleMotion], template: "<div\n cdk-overlay-origin\n thySelectControl\n (click)=\"toggle($event)\"\n #origin=\"cdkOverlayOrigin\"\n #trigger\n [thyPanelOpened]=\"panelOpen\"\n [thySelectedOptions]=\"selected\"\n [thyIsMultiple]=\"isMultiple\"\n [thyShowSearch]=\"thyShowSearch\"\n [thyAllowClear]=\"thyAllowClear\"\n [thySize]=\"thySize\"\n [thyPlaceholder]=\"thyPlaceHolder\"\n [customDisplayTemplate]=\"selectedValueDisplayRef\"\n [thyDisabled]=\"disabled\"\n [thyBorderless]=\"thyBorderless\"\n (thyOnClear)=\"clearSelectValue($event)\"\n (thyOnRemove)=\"remove($event)\"\n (thyOnSearch)=\"onSearchFilter($event)\"\n (thyOnBlur)=\"onBlur($event)\"\n [thyMaxTagCount]=\"thyMaxTagCount\"\n [thyPreset]=\"thyPreset\"></div>\n\n<ng-template\n cdk-connected-overlay\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayHasBackdrop]=\"thyHasBackdrop\"\n [cdkConnectedOverlayPositions]=\"dropDownPositions\"\n [cdkConnectedOverlayOrigin]=\"thyOrigin || origin\"\n [cdkConnectedOverlayOpen]=\"panelOpen\"\n [cdkConnectedOverlayWidth]=\"triggerRectWidth\"\n [cdkConnectedOverlayMinWidth]=\"dropDownMinWidth\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n cdkConnectedOverlayTransformOriginOn=\".thy-select-dropdown\"\n (attach)=\"onAttached()\"\n (detach)=\"close()\">\n <div\n thyStopPropagation\n [attr.tabindex]=\"-1\"\n [ngClass]=\"dropDownClass\"\n [@scaleYMotion]=\"placement === 'top' || placement === 'bottom' ? 'enter' : 'void'\"\n [@scaleXMotion]=\"placement === 'left' || placement === 'right' ? 'enter' : 'void'\"\n [@scaleMotion]=\"placement !== 'top' && placement !== 'bottom' && placement !== 'left' && placement !== 'right' ? 'enter' : 'void'\"\n (mousemove)=\"dropDownMouseMove($event)\">\n @if (contentOptions?.length > 0 || contentGroups?.length > 0 || innerOptions?.length > 0) {\n <div\n #panel\n class=\"thy-select-dropdown-options thy-select-dropdown-options-{{ size }}\"\n thyScroll\n (thyOnScrolled)=\"onOptionsScrolled($event)\"\n [thyEnable]=\"thyEnableScrollLoad\">\n @if (isReactiveDriven) {\n <ng-template [ngTemplateOutlet]=\"optionsContainer.optionsTemplate\"></ng-template>\n }\n <ng-content></ng-content>\n @if (isHiddenOptions) {\n <thy-loading [thyDone]=\"thyLoadState\" thySize=\"sm\"></thy-loading>\n <div class=\"thy-select-empty-content\">\n @if (thyLoadState) {\n <thy-empty [thyMessage]=\"emptySearchMessageText\" thySize=\"sm\" [thyIconName]=\"emptyIcon()\"></thy-empty>\n }\n </div>\n }\n </div>\n } @else {\n <thy-loading [thyDone]=\"thyLoadState\" thySize=\"sm\"></thy-loading>\n <div class=\"thy-select-empty-content\">\n @if (thyLoadState) {\n <thy-empty [thyMessage]=\"emptyStateText\" thySize=\"sm\" [thyIconName]=\"emptyIcon()\"></thy-empty>\n }\n </div>\n }\n @if (thyFooterTemplate) {\n <div [class]=\"thyFooterClass ? thyFooterClass : 'thy-custom-select-footer'\">\n @if (thyFooterTemplate) {\n <ng-template [ngTemplateOutlet]=\"thyFooterTemplate\"></ng-template>\n }\n </div>\n }\n </div>\n</ng-template>\n\n<thy-options-container #optionsContainer>\n @for (option of optionGroups; track $index) {\n @if (!option.children) {\n <thy-option\n [thyDisabled]=\"option.disabled\"\n [thyLabelText]=\"option.label\"\n [thyValue]=\"option.value\"\n [thyRawValue]=\"option\"></thy-option>\n } @else {\n <thy-option-group [thyGroupLabel]=\"option.groupLabel\">\n @for (sub of option.children; track sub.value) {\n <thy-option [thyDisabled]=\"sub.disabled\" [thyLabelText]=\"sub.label\" [thyValue]=\"sub.value\" [thyRawValue]=\"sub\"></thy-option>\n }\n </thy-option-group>\n }\n }\n</thy-options-container>\n" }]
802
- }], ctorParameters: () => [], propDecorators: { thyDropdownWidthMode: [{
803
- type: Input
804
- }], cdkConnectedOverlay: [{
805
- type: ViewChild,
806
- args: [CdkConnectedOverlay, { static: true }]
807
- }], isSelectCustom: [{
808
- type: HostBinding,
809
- args: ['class.thy-select-custom']
810
- }], isSelect: [{
811
- type: HostBinding,
812
- args: ['class.thy-select']
813
- }], panelOpen: [{
814
- type: HostBinding,
815
- args: ['class.menu-is-opened']
816
- }], thyOnSearch: [{
817
- type: Output
818
- }], thyOnScrollToBottom: [{
819
- type: Output
820
- }], thyOnExpandStatusChange: [{
821
- type: Output
822
- }], thyShowSearch: [{
823
- type: Input,
824
- args: [{ transform: coerceBooleanProperty }]
825
- }], thyPlaceHolder: [{
826
- type: Input
827
- }], thyServerSearch: [{
828
- type: Input,
829
- args: [{ transform: coerceBooleanProperty }]
830
- }], thyLoadState: [{
831
- type: Input,
832
- args: [{ transform: coerceBooleanProperty }]
833
- }], thyAutoActiveFirstItem: [{
834
- type: Input,
835
- args: [{ transform: coerceBooleanProperty }]
836
- }], thyMode: [{
837
- type: Input
838
- }], thySize: [{
839
- type: Input
840
- }], thyEmptyStateText: [{
841
- type: Input
842
- }], thyEmptySearchMessageText: [{
843
- type: Input
844
- }], thyEnableScrollLoad: [{
845
- type: Input,
846
- args: [{ transform: coerceBooleanProperty }]
847
- }], thyAllowClear: [{
848
- type: Input,
849
- args: [{ transform: coerceBooleanProperty }]
850
- }], thyDisabled: [{
851
- type: Input,
852
- args: [{ transform: coerceBooleanProperty }]
853
- }], thySortComparator: [{
854
- type: Input
855
- }], thyFooterTemplate: [{
856
- type: Input
857
- }], thyPlacement: [{
858
- type: Input
859
- }], thyOrigin: [{
860
- type: Input
861
- }], thyFooterClass: [{
862
- type: Input
863
- }], selectedValueDisplayRef: [{
864
- type: ContentChild,
865
- args: ['selectedDisplay']
866
- }], thyAutoExpand: [{
867
- type: Input,
868
- args: [{ transform: coerceBooleanProperty }]
869
- }], thyHasBackdrop: [{
870
- type: Input,
871
- args: [{ transform: coerceBooleanProperty }]
872
- }], thyMaxTagCount: [{
873
- type: Input,
874
- args: [{ transform: numberAttribute }]
875
- }], thyBorderless: [{
876
- type: Input,
877
- args: [{ transform: coerceBooleanProperty }]
878
- }], thyOptions: [{
879
- type: Input
880
- }], thyPreset: [{
881
- type: Input
882
- }], trigger: [{
883
- type: ViewChild,
884
- args: ['trigger', { read: ElementRef, static: true }]
885
- }], panel: [{
886
- type: ViewChild,
887
- args: ['panel', { read: ElementRef }]
888
- }], contentOptions: [{
889
- type: ContentChildren,
890
- args: [ThyOption, { descendants: true }]
891
- }], viewOptions: [{
892
- type: ViewChildren,
893
- args: [ThyOption]
894
- }], contentGroups: [{
895
- type: ContentChildren,
896
- args: [ThySelectOptionGroup]
897
- }], viewGroups: [{
898
- type: ViewChildren,
899
- args: [ThySelectOptionGroup]
900
- }], handleKeydown: [{
901
- type: HostListener,
902
- args: ['keydown', ['$event']]
903
- }] } });
904
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2VsZWN0L2N1c3RvbS1zZWxlY3QvY3VzdG9tLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvc2VsZWN0L2N1c3RvbS1zZWxlY3QvY3VzdG9tLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsWUFBWSxFQUNaLFlBQVksRUFDWixlQUFlLEVBQ2YseUNBQXlDLEVBQ3pDLGtCQUFrQixFQUVyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUdILDJCQUEyQixFQUMzQixTQUFTLEVBQ1QsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUM5QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDSCxDQUFDLEVBQ0QscUJBQXFCLEVBQ3JCLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsR0FBRyxFQUNILEtBQUssRUFFTCxjQUFjLEVBQ2QsT0FBTyxFQUNQLElBQUksRUFDSixPQUFPLEVBQ1AsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsRUFDWCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUs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TixjQUFjO3NCQURiLEtBQUs7Z0JBTTJCLHVCQUF1QjtzQkFBdkQsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBTWMsYUFBYTtzQkFBekQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRTtnQkFNM0MsY0FBYztzQkFEYixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFO2dCQU1KLGNBQWM7c0JBQXBELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQU1RLGFBQWE7c0JBQXpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUU7Z0JBYXZDLFVBQVU7c0JBRGIsS0FBSztnQkFnQkcsU0FBUztzQkFBakIsS0FBSztnQkFFb0QsT0FBTztzQkFBaEUsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRWQsS0FBSztzQkFBOUMsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUtXLGNBQWM7c0JBQWhFLGVBQWU7dUJBQUMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFFeEIsV0FBVztzQkFBbkMsWUFBWTt1QkFBQyxTQUFTO2dCQUtnQixhQUFhO3NCQUFuRCxlQUFlO3VCQUFDLG9CQUFvQjtnQkFFRCxVQUFVO3NCQUE3QyxZQUFZO3VCQUFDLG9CQUFvQjtnQkFHbEMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgZ2V0RmxleGlibGVQb3NpdGlvbnMsXG4gICAgaW5qZWN0UGFuZWxFbXB0eUljb24sXG4gICAgc2NhbGVNb3Rpb24sXG4gICAgc2NhbGVYTW90aW9uLFxuICAgIHNjYWxlWU1vdGlvbixcbiAgICBTY3JvbGxUb1NlcnZpY2UsXG4gICAgVGFiSW5kZXhEaXNhYmxlZENvbnRyb2xWYWx1ZUFjY2Vzc29yTWl4aW4sXG4gICAgVGh5Q2xpY2tEaXNwYXRjaGVyLFxuICAgIFRoeVBsYWNlbWVudFxufSBmcm9tICduZ3gtdGV0aHlzL2NvcmUnO1xuaW1wb3J0IHsgVGh5RW1wdHkgfSBmcm9tICduZ3gtdGV0aHlzL2VtcHR5JztcbmltcG9ydCB7IFRoeUxvYWRpbmcgfSBmcm9tICduZ3gtdGV0aHlzL2xvYWRpbmcnO1xuaW1wb3J0IHtcbiAgICBJVGh5T3B0aW9uUGFyZW50Q29tcG9uZW50LFxuICAgIFNlbGVjdENvbnRyb2xTaXplLFxuICAgIFRIWV9PUFRJT05fUEFSRU5UX0NPTVBPTkVOVCxcbiAgICBUaHlPcHRpb24sXG4gICAgVGh5T3B0aW9uc0NvbnRhaW5lcixcbiAgICBUaHlPcHRpb25TZWxlY3Rpb25DaGFuZ2VFdmVudCxcbiAgICBUaHlTY3JvbGxEaXJlY3RpdmUsXG4gICAgVGh5U2VsZWN0Q29udHJvbCxcbiAgICBUaHlTZWxlY3RPcHRpb25Hcm91cCxcbiAgICBUaHlTdG9wUHJvcGFnYXRpb25EaXJlY3RpdmVcbn0gZnJvbSAnbmd4LXRldGh5cy9zaGFyZWQnO1xuaW1wb3J0IHtcbiAgICBBLFxuICAgIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSxcbiAgICBET1dOX0FSUk9XLFxuICAgIGVsZW1lbnRNYXRjaENsb3Nlc3QsXG4gICAgRU5ELFxuICAgIEVOVEVSLFxuICAgIEZ1bmN0aW9uUHJvcCxcbiAgICBoYXNNb2RpZmllcktleSxcbiAgICBoZWxwZXJzLFxuICAgIEhPTUUsXG4gICAgaXNBcnJheSxcbiAgICBpc0Z1bmN0aW9uLFxuICAgIExFRlRfQVJST1csXG4gICAgUklHSFRfQVJST1csXG4gICAgU1BBQ0UsXG4gICAgVVBfQVJST1dcbn0gZnJvbSAnbmd4LXRldGh5cy91dGlsJztcbmltcG9ydCB7IGRlZmVyLCBtZXJnZSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IGNvZXJjZUVsZW1lbnQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgQ2RrQ29ubmVjdGVkT3ZlcmxheSwgQ2RrT3ZlcmxheU9yaWdpbiwgQ29ubmVjdGlvblBvc2l0aW9uUGFpciwgT3ZlcmxheSwgU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciwgTmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgbnVtYmVyQXR0cmlidXRlLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIGluamVjdCxcbiAgICBTaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7XG4gICAgREVGQVVMVF9TRUxFQ1RfQ09ORklHLFxuICAgIFRIWV9TRUxFQ1RfQ09ORklHLFxuICAgIFRIWV9TRUxFQ1RfU0NST0xMX1NUUkFURUdZLFxuICAgIFRoeURyb3Bkb3duV2lkdGhNb2RlLFxuICAgIFRoeVNlbGVjdENvbmZpZ1xufSBmcm9tICcuLi9zZWxlY3QuY29uZmlnJztcbmltcG9ydCB7IGluamVjdExvY2FsZSwgVGh5U2VsZWN0TG9jYWxlIH0gZnJvbSAnbmd4LXRldGh5cy9pMThuJztcblxuZXhwb3J0IHR5cGUgU2VsZWN0TW9kZSA9ICdtdWx0aXBsZScgfCAnJztcblxuZXhwb3J0IHR5cGUgVGh5U2VsZWN0VHJpZ2dlclR5cGUgPSAnY2xpY2snIHwgJ2hvdmVyJztcblxuZXhwb3J0IGNvbnN0IFNFTEVDVF9QQU5FTF9NQVhfSEVJR0hUID0gMzAwO1xuXG5leHBvcnQgY29uc3QgU0VMRUNUX09QVElPTl9NQVhfSEVJR0hUID0gNDA7XG5cbmV4cG9ydCBjb25zdCBTRUxFQ1RfT1BUSU9OX0dST1VQX01BWF9IRUlHSFQgPSAzMDtcblxuZXhwb3J0IGNvbnN0IFNFTEVDVF9QQU5FTF9QQURESU5HX1RPUCA9IDEwO1xuXG5leHBvcnQgY29uc3QgVEhZX1NFTEVDVF9QQU5FTF9NSU5fV0lEVEggPSAyMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uVmFsdWUge1xuICAgIHRoeUxhYmVsVGV4dD86IHN0cmluZztcbiAgICB0aHlWYWx1ZT86IHN0cmluZztcbiAgICB0aHlEaXNhYmxlZD86IGJvb2xlYW47XG4gICAgdGh5U2hvd09wdGlvbkN1c3RvbT86IGJvb2xlYW47XG4gICAgdGh5U2VhcmNoS2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRoeVNlbGVjdE9wdGlvbk1vZGVsIHtcbiAgICB2YWx1ZT86IHN0cmluZyB8IG51bWJlcjtcbiAgICBkaXNhYmxlZD86IGJvb2xlYW47XG4gICAgbGFiZWw/OiBzdHJpbmc7XG4gICAgaWNvbj86IHN0cmluZztcbiAgICBncm91cExhYmVsPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVGh5T3B0aW9uR3JvdXBNb2RlbCBleHRlbmRzIFRoeVNlbGVjdE9wdGlvbk1vZGVsIHtcbiAgICBjaGlsZHJlbj86IFRoeVNlbGVjdE9wdGlvbk1vZGVsW107XG59XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuLyoqXG4gKiDkuIvmi4npgInmi6nnu4Tku7ZcbiAqIEBuYW1lIHRoeS1zZWxlY3QsdGh5LWN1c3RvbS1zZWxlY3RcbiAqIEBvcmRlciAxMFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoeS1zZWxlY3QsdGh5LWN1c3RvbS1zZWxlY3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20tc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBleHBvcnRBczogJ3RoeVNlbGVjdCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIWV9PUFRJT05fUEFSRU5UX0NPTVBPTkVOVCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBUaHlTZWxlY3RcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaHlTZWxlY3QpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENka092ZXJsYXlPcmlnaW4sXG4gICAgICAgIFRoeVNlbGVjdENvbnRyb2wsXG4gICAgICAgIENka0Nvbm5lY3RlZE92ZXJsYXksXG4gICAgICAgIFRoeVN0b3BQcm9wYWdhdGlvbkRpcmVjdGl2ZSxcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgVGh5U2Nyb2xsRGlyZWN0aXZlLFxuICAgICAgICBUaHlMb2FkaW5nLFxuICAgICAgICBUaHlFbXB0eSxcbiAgICAgICAgVGh5T3B0aW9uc0NvbnRhaW5lcixcbiAgICAgICAgVGh5T3B0aW9uLFxuICAgICAgICBUaHlTZWxlY3RPcHRpb25Hcm91cCxcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIudGFiaW5kZXhdJzogJ3RhYkluZGV4JyxcbiAgICAgICAgJyhmb2N1cyknOiAnb25Gb2N1cygkZXZlbnQpJyxcbiAgICAgICAgJyhibHVyKSc6ICdvbkJsdXIoJGV2ZW50KSdcbiAgICB9LFxuICAgIGFuaW1hdGlvbnM6IFtzY2FsZVhNb3Rpb24sIHNjYWxlWU1vdGlvbiwgc2NhbGVNb3Rpb25dXG59KVxuZXhwb3J0IGNsYXNzIFRoeVNlbGVjdFxuICAgIGV4dGVuZHMgVGFiSW5kZXhEaXNhYmxlZENvbnRyb2xWYWx1ZUFjY2Vzc29yTWl4aW5cbiAgICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJVGh5T3B0aW9uUGFyZW50Q29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveVxue1xuICAgIHByaXZhdGUgbmdab25lID0gaW5qZWN0KE5nWm9uZSk7XG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHByaXZhdGUgb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcbiAgICBwcml2YXRlIHRoeUNsaWNrRGlzcGF0Y2hlciA9IGluamVjdChUaHlDbGlja0Rpc3BhdGNoZXIpO1xuICAgIHByaXZhdGUgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gICAgcHJpdmF0ZSBsb2NhbGU6IFNpZ25hbDxUaHlTZWxlY3RMb2NhbGU+ID0gaW5qZWN0TG9jYWxlKCdzZWxlY3QnKTtcbiAgICBzY3JvbGxTdHJhdGVneUZhY3RvcnkgPSBpbmplY3Q8RnVuY3Rpb25Qcm9wPFNjcm9sbFN0cmF0ZWd5Pj4oVEhZX1NFTEVDVF9TQ1JPTExfU1RSQVRFR1ksIHsgb3B0aW9uYWw6IHRydWUgfSkhO1xuICAgIHNlbGVjdENvbmZpZyA9IGluamVjdChUSFlfU0VMRUNUX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KSE7XG4gICAgZW1wdHlJY29uOiBTaWduYWw8c3RyaW5nPiA9IGluamVjdFBhbmVsRW1wdHlJY29uKCk7XG5cbiAgICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgc2l6ZTogU2VsZWN0Q29udHJvbFNpemU7XG5cbiAgICBtb2RlOiBTZWxlY3RNb2RlID0gJyc7XG5cbiAgICBlbXB0eVN0YXRlVGV4dCA9IHRoaXMubG9jYWxlKCkuZW1wdHk7XG5cbiAgICBlbXB0eVNlYXJjaE1lc3NhZ2VUZXh0ID0gdGhpcy5sb2NhbGUoKS5lbXB0eTtcblxuICAgIHNjcm9sbFRvcCA9IDA7XG5cbiAgICBtb2RhbFZhbHVlOiBhbnkgPSBudWxsO1xuXG4gICAgZGVmYXVsdE9mZnNldCA9IDQ7XG5cbiAgICBkcm9wRG93bkNsYXNzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfTtcblxuICAgIGRyb3BEb3duTWluV2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICog6K6+572u5LiL5ouJ5qGG55qE5pyA5bCP5a695bqm77yM6buY6K6k5YC8IGBtYXRjaC1zZWxlY3Rg77yM6KGo56S65LiO6L6T5YWl5qGG55qE5a695bqm5LiA6Ie077ybYG1pbi13aWR0aGAg6KGo56S65pyA5bCP5a695bqm5Li6MjAwcHjvvJvmlK/mjIHoh6rlrprkuYnmnIDlsI/lrr3luqbvvIzmr5TlpoLkvKAgYHttaW5XaWR0aDogMTUwfWAg6KGo56S65pyA5bCP5a695bqm5Li6MTUwcHhcbiAgICAgKiBAZGVmYXVsdCBtYXRjaC1zZWxlY3RcbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlEcm9wZG93bldpZHRoTW9kZTogVGh5RHJvcGRvd25XaWR0aE1vZGU7XG5cbiAgICBwdWJsaWMgZHJvcERvd25Qb3NpdGlvbnM6IENvbm5lY3Rpb25Qb3NpdGlvblBhaXJbXTtcblxuICAgIHB1YmxpYyBzZWxlY3Rpb25Nb2RlbDogU2VsZWN0aW9uTW9kZWw8VGh5T3B0aW9uPjtcblxuICAgIHB1YmxpYyB0cmlnZ2VyUmVjdFdpZHRoOiBudW1iZXI7XG5cbiAgICBwdWJsaWMgc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5O1xuXG4gICAgcHJpdmF0ZSByZXNpemVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIHByaXZhdGUgc2VsZWN0aW9uTW9kZWxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIC8qKlxuICAgICAqIOaJi+WKqOiBmueEpuS4reeahOagh+ivhlxuICAgICAqL1xuICAgIHByaXZhdGUgbWFudWFsRm9jdXNpbmcgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgY29uZmlnOiBUaHlTZWxlY3RDb25maWc7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIHJlYWRvbmx5IG9wdGlvblNlbGVjdGlvbkNoYW5nZXM6IE9ic2VydmFibGU8VGh5T3B0aW9uU2VsZWN0aW9uQ2hhbmdlRXZlbnQ+ID0gZGVmZXIoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2UoLi4udGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGlvbkNoYW5nZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5vblN0YWJsZS5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMpXG4gICAgICAgICk7XG4gICAgfSkgYXMgT2JzZXJ2YWJsZTxUaHlPcHRpb25TZWxlY3Rpb25DaGFuZ2VFdmVudD47XG5cbiAgICBAVmlld0NoaWxkKENka0Nvbm5lY3RlZE92ZXJsYXksIHsgc3RhdGljOiB0cnVlIH0pIGNka0Nvbm5lY3RlZE92ZXJsYXk6IENka0Nvbm5lY3RlZE92ZXJsYXk7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRoeS1zZWxlY3QtY3VzdG9tJykgaXNTZWxlY3RDdXN0b20gPSB0cnVlO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy50aHktc2VsZWN0JykgaXNTZWxlY3QgPSB0cnVlO1xuXG4gICAga2V5TWFuYWdlcjogQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXI8VGh5T3B0aW9uPjtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWVudS1pcy1vcGVuZWQnKVxuICAgIHBhbmVsT3BlbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICog5pCc57Si5pe25Zue6LCDXG4gICAgICovXG4gICAgQE91dHB1dCgpIHRoeU9uU2VhcmNoOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICog5LiL5ouJ6I+c5Y2V5rua5Yqo5Yiw5bqV6YOo5LqL5Lu277yM5Y+v5Lul55So6L+Z5Liq5LqL5Lu25a6e546w5rua5Yqo5Yqg6L29XG4gICAgICovXG4gICAgQE91dHB1dCgpIHRoeU9uU2Nyb2xsVG9Cb3R0b206IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIOS4i+aLieiPnOWNleWxleW8gOWSjOaKmOWPoOeKtuaAgeS6i+S7tlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0aHlPbkV4cGFuZFN0YXR1c0NoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICog5LiL5ouJ5YiX6KGo5piv5ZCm5pi+56S65pCc57Si5qGGXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KSB0aHlTaG93U2VhcmNoOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICog6YCJ5oup5qGG6buY6K6k5paH5a2XXG4gICAgICovXG4gICAgQElucHV0KCkgdGh5UGxhY2VIb2xkZXIgPSB0aGlzLmxvY2FsZSgpLnBsYWNlaG9sZGVyO1xuXG4gICAgLyoqXG4gICAgICog5piv5ZCm5L2/55So5pyN5Yqh56uv5pCc57Si77yM5b2T5Li6IHRydWUg5pe277yM5bCG5LiN5YaN5Zyo5YmN56uv6L+b6KGM6L+H5rukXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KSB0aHlTZXJ2ZXJTZWFyY2g6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiDlvILmraXliqDovb0gbG9hZGluZyDnirbmgIHvvIxmYWxzZSDooajnpLrliqDovb3kuK3vvIx0cnVlIOihqOekuuWKoOi9veWujOaIkFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pIHRoeUxvYWRTdGF0ZSA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKboh6rliqjorr7nva7pgInpobnnrKzkuIDmnaHkuLrpq5jkuq7nirbmgIFcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KSB0aHlBdXRvQWN0aXZlRmlyc3RJdGVtID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIOS4i+aLiemAieaLqeaooeW8j1xuICAgICAqIEB0eXBlICdtdWx0aXBsZScgfCAnJ1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHRoeU1vZGUodmFsdWU6IFNlbGVjdE1vZGUpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgICB0aGlzLmdldFBvc2l0aW9ucygpO1xuICAgICAgICB0aGlzLnNldERyb3BEb3duQ2xhc3MoKTtcbiAgICB9XG5cbiAgICBnZXQgdGh5TW9kZSgpOiBTZWxlY3RNb2RlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmk43kvZzlm77moIfnsbvlnotcbiAgICAgKiBAdHlwZSBwcmltYXJ5IHwgc3VjY2VzcyB8IGRhbmdlciB8IHdhcm5pbmdcbiAgICAgKiBAZGVmYXVsdCBwcmltYXJ5XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXQgdGh5U2l6ZSgpOiBTZWxlY3RDb250cm9sU2l6ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgfVxuICAgIHNldCB0aHlTaXplKHZhbHVlOiBTZWxlY3RDb250cm9sU2l6ZSkge1xuICAgICAgICB0aGlzLnNpemUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmlbDmja7kuLrnqbrml7bmmL7npLrnmoTmj5DnpLrmloflrZdcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCB0aHlFbXB0eVN0YXRlVGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZW1wdHlTdGF0ZVRleHQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmkJzntKLnu5PmnpzkuLrnqbrml7bmmL7npLrnmoTmj5DnpLrmloflrZdcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCB0aHlFbXB0eVNlYXJjaE1lc3NhZ2VUZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5lbXB0eVNlYXJjaE1lc3NhZ2VUZXh0ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5rua5Yqo5Yqg6L295piv5ZCm5Y+v55So77yM5Y+q6IO95b2T6L+Z5Liq5Y+C5pWw5Y+v5Lul77yM5LiL6Z2i55qEdGh5T25TY3JvbGxUb0JvdHRvbeS6i+S7tuaJjeS8muinpuWPkVxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pXG4gICAgdGh5RW5hYmxlU2Nyb2xsTG9hZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICog5Y2V6YCJKCB0aHlNb2RlPVwiXCIg5oiW6ICF5LiN6K6+572uKeaXtu+8jOmAieaLqeahhuaUr+aMgea4hemZpFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pIHRoeUFsbG93Q2xlYXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuemgeeUqFxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSlcbiAgICBzZXQgdGh5RGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgdGh5RGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaOkuW6j+avlOi+g+WHveaVsFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeVNvcnRDb21wYXJhdG9yOiAoYTogVGh5T3B0aW9uLCBiOiBUaHlPcHRpb24sIG9wdGlvbnM6IFRoeU9wdGlvbltdKSA9PiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBGb290ZXIg5qih5p2/77yM6buY6K6k5YC85Li656m65LiN5pi+56S6IEZvb3RlclxuICAgICAqIEB0eXBlIFRlbXBsYXRlUmVmXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB0aHlGb290ZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIOW8ueWHuuS9jee9rlxuICAgICAqIEB0eXBlIFRoeVBsYWNlbWVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGh5UGxhY2VtZW50OiBUaHlQbGFjZW1lbnQ7XG5cbiAgICAvKipcbiAgICAgKiDoh6rlrprkuYkgT3ZlcmxheSBPcmlnaW5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHRoeU9yaWdpbjogRWxlbWVudFJlZiB8IEhUTUxFbGVtZW50O1xuXG4gICAgLyoqXG4gICAgICog6Ieq5a6a5LmJIEZvb3RlciDmqKHmnb/lrrnlmaggY2xhc3NcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHRoeUZvb3RlckNsYXNzID0gJ3RoeS1jdXN0b20tc2VsZWN0LWZvb3Rlcic7XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoJ3NlbGVjdGVkRGlzcGxheScpIHNlbGVjdGVkVmFsdWVEaXNwbGF5UmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICog5Yid5aeL5YyW5pe277yM5piv5ZCm5bGV5byA6Z2i5p2/XG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KSB0aHlBdXRvRXhwYW5kOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICog5piv5ZCm5by55Ye66YCP5piO6YGu572p77yM5aaC5p6c5pi+56S66YGu572p5YiZ5Lya6Zi75q2i5rua5Yqo5Yy65Z+f5rua5YqoXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSlcbiAgICB0aHlIYXNCYWNrZHJvcCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICog6K6+572u5aSa6YCJ5pe25pyA5aSn5pi+56S655qE5qCH562+5pWw6YeP77yMMCDooajnpLrkuI3pmZDliLZcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSB0aHlNYXhUYWdDb3VudCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiDmmK/lkKbpmpDol4/pgInmi6nmoYbovrnmoYZcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pIHRoeUJvcmRlcmxlc3MgPSBmYWxzZTtcblxuICAgIGlzUmVhY3RpdmVEcml2ZW4gPSBmYWxzZTtcblxuICAgIGlubmVyT3B0aW9uczogVGh5U2VsZWN0T3B0aW9uTW9kZWxbXTtcblxuICAgIG9wdGlvbkdyb3VwczogVGh5T3B0aW9uR3JvdXBNb2RlbFtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBvcHRpb24g5YiX6KGoXG4gICAgICogQHR5cGUgVGh5U2VsZWN0T3B0aW9uTW9kZWxbXVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHRoeU9wdGlvbnModmFsdWU6IFRoeVNlbGVjdE9wdGlvbk1vZGVsW10pIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5uZXJPcHRpb25zID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaXNSZWFjdGl2ZURyaXZlbiA9IHRydWU7XG4gICAgICAgIHRoaXMuYnVpbGRSZWFjdGl2ZU9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zOiBRdWVyeUxpc3Q8VGh5T3B0aW9uPjtcblxuICAgIC8qKlxuICAgICAqIOebruWJjeWPquaUr+aMgeWkmumAiemAieS4remhueeahOWxleekuu+8jOm7mOiupOS4uuepuu+8jOa4suafk+aWh+Wtl+aooeadv++8jOS8oOWFpXRhZ++8jOa4suafk+WxleekuuaooeadvyxcbiAgICAgKiBAZGVmYXVsdCAnJ++9nHRhZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeVByZXNldDogc3RyaW5nID0gJyc7XG5cbiAgICBAVmlld0NoaWxkKCd0cmlnZ2VyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSkgdHJpZ2dlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdwYW5lbCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwYW5lbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oVGh5T3B0aW9uLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGNvbnRlbnRPcHRpb25zOiBRdWVyeUxpc3Q8VGh5T3B0aW9uPjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oVGh5T3B0aW9uKSB2aWV3T3B0aW9uczogUXVlcnlMaXN0PFRoeU9wdGlvbj47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oVGh5U2VsZWN0T3B0aW9uR3JvdXApIGNvbnRlbnRHcm91cHM6IFF1ZXJ5TGlzdDxUaHlTZWxlY3RPcHRpb25Hcm91cD47XG5cbiAgICBAVmlld0NoaWxkcmVuKFRoeVNlbGVjdE9wdGlvbkdyb3VwKSB2aWV3R3JvdXBzOiBRdWVyeUxpc3Q8VGh5U2VsZWN0T3B0aW9uR3JvdXA+O1xuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBFTlRFUikge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wYW5lbE9wZW4gPyB0aGlzLmhhbmRsZU9wZW5LZXlkb3duKGV2ZW50KSA6IHRoaXMuaGFuZGxlQ2xvc2VkS2V5ZG93bihldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgb3B0aW9uc0NoYW5nZXMkKCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmlzUmVhY3RpdmVEcml2ZW4gPyB0aGlzLnZpZXdPcHRpb25zIDogdGhpcy5jb250ZW50T3B0aW9ucztcbiAgICAgICAgbGV0IHByZXZpb3VzT3B0aW9uczogVGh5T3B0aW9uW10gPSB0aGlzLm9wdGlvbnMudG9BcnJheSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNoYW5nZXMucGlwZShcbiAgICAgICAgICAgIG1hcChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZmlsdGVyKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHByZXZpb3VzT3B0aW9ucy5sZW5ndGggIT09IGRhdGEubGVuZ3RoIHx8IHByZXZpb3VzT3B0aW9ucy5zb21lKChvcCwgaW5kZXgpID0+IG9wICE9PSBkYXRhW2luZGV4XSk7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNPcHRpb25zID0gZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkU2Nyb2xsU3RyYXRlZ3koKSB7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFN0cmF0ZWd5RmFjdG9yeSAmJiBpc0Z1bmN0aW9uKHRoaXMuc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5KSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneSA9IHRoaXMuc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1NlYXJjaGluZyA9IGZhbHNlO1xuXG4gICAgZ3JvdXBCeSA9IChpdGVtOiBUaHlTZWxlY3RPcHRpb25Nb2RlbCkgPT4gaXRlbS5ncm91cExhYmVsO1xuXG4gICAgZ2V0IHBsYWNlbWVudCgpOiBUaHlQbGFjZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50aHlQbGFjZW1lbnQgfHwgdGhpcy5jb25maWcucGxhY2VtZW50O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBjb25zdCBzZWxlY3RDb25maWcgPSB0aGlzLnNlbGVjdENvbmZpZztcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9TRUxFQ1RfQ09ORklHLCAuLi5zZWxlY3RDb25maWcgfTtcbiAgICAgICAgdGhpcy5idWlsZFNjcm9sbFN0cmF0ZWd5KCk7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kYWxWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkJ5TW9kZWxWYWx1ZSh0aGlzLm1vZGFsVmFsdWUpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmdldFBvc2l0aW9ucygpO1xuICAgICAgICB0aGlzLmRyb3BEb3duTWluV2lkdGggPSB0aGlzLmdldERyb3Bkb3duTWluV2lkdGgoKTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbk1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldERyb3BEb3duQ2xhc3MoKTtcblxuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgdGhpcy50aHlDbGlja0Rpc3BhdGNoZXJcbiAgICAgICAgICAgICAgICAuY2xpY2tlZCgwKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpICYmIHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkT3B0aW9uR3JvdXBzKG9wdGlvbnM6IFRoeVNlbGVjdE9wdGlvbk1vZGVsW10pIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uR3JvdXBzOiBUaHlPcHRpb25Hcm91cE1vZGVsW10gPSBbXTtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gWy4uLm5ldyBTZXQob3B0aW9ucy5maWx0ZXIoaXRlbSA9PiB0aGlzLmdyb3VwQnkoaXRlbSkpLm1hcChzdWIgPT4gdGhpcy5ncm91cEJ5KHN1YikpKV07XG4gICAgICAgIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBncm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG9wdGlvbnMuZmlsdGVyKGl0ZW0gPT4gdGhpcy5ncm91cEJ5KGl0ZW0pID09PSBncm91cCk7XG4gICAgICAgICAgICBjb25zdCBncm91cE9wdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBncm91cExhYmVsOiBncm91cCxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBncm91cE1hcC5zZXQoZ3JvdXAsIGdyb3VwT3B0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBCeShvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gb3B0aW9uR3JvdXBzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uZ3JvdXBMYWJlbCA9PT0gdGhpcy5ncm91cEJ5KG9wdGlvbikpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBncm91cE1hcC5nZXQodGhpcy5ncm91cEJ5KG9wdGlvbikpO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25Hcm91cHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9wdGlvbkdyb3Vwcy5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb3B0aW9uR3JvdXBzO1xuICAgIH1cblxuICAgIGJ1aWxkUmVhY3RpdmVPcHRpb25zKCkge1xuICAgICAgICBpZiAodGhpcy5pbm5lck9wdGlvbnMuZmlsdGVyKGl0ZW0gPT4gdGhpcy5ncm91cEJ5KGl0ZW0pKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbkdyb3VwcyA9IHRoaXMuYnVpbGRPcHRpb25Hcm91cHModGhpcy5pbm5lck9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMgPSB0aGlzLmlubmVyT3B0aW9ucztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERyb3Bkb3duTWluV2lkdGgoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLnRoeURyb3Bkb3duV2lkdGhNb2RlIHx8IHRoaXMuY29uZmlnLmRyb3Bkb3duV2lkdGhNb2RlO1xuICAgICAgICBsZXQgZHJvcGRvd25NaW5XaWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgaWYgKChtb2RlIGFzIHsgbWluV2lkdGg6IG51bWJlciB9KT8ubWluV2lkdGgpIHtcbiAgICAgICAgICAgIGRyb3Bkb3duTWluV2lkdGggPSAobW9kZSBhcyB7IG1pbldpZHRoOiBudW1iZXIgfSkubWluV2lkdGg7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ21pbi13aWR0aCcpIHtcbiAgICAgICAgICAgIGRyb3Bkb3duTWluV2lkdGggPSBUSFlfU0VMRUNUX1BBTkVMX01JTl9XSURUSDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRyb3Bkb3duTWluV2lkdGggPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRyb3Bkb3duTWluV2lkdGg7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1JlYWN0aXZlRHJpdmVuKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1JlYWN0aXZlRHJpdmVuKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXR1cCgpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zQ2hhbmdlcyQucGlwZShzdGFydFdpdGgobnVsbCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNldE9wdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5pbml0S2V5TWFuYWdlcigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWFyY2hpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodENvcnJlY3RPcHRpb24oZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNTZWFyY2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXkgJiYgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5Lm92ZXJsYXlSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheS5vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMudGh5QXV0b0V4cGFuZCkge1xuICAgICAgICAgICAgdGltZXIoMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0hpZGRlbk9wdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMudG9BcnJheSgpLmV2ZXJ5KG9wdGlvbiA9PiBvcHRpb24uaGlkZGVuKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25BdHRhY2hlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5LnBvc2l0aW9uQ2hhbmdlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhbmVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMua2V5TWFuYWdlci5hY3RpdmVJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIFNjcm9sbFRvU2VydmljZS5zY3JvbGxUb0VsZW1lbnQodGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLnBhbmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFNjcm9sbFRvU2VydmljZS5zY3JvbGxUb0VsZW1lbnQodGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMucGFuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRyb3BEb3duTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xuICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oLTEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uT3B0aW9uc1Njcm9sbGVkKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCxcbiAgICAgICAgICAgIGhlaWdodCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgICBzY3JvbGxIZWlnaHQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuXG4gICAgICAgIGlmIChzY3JvbGwgKyBoZWlnaHQgKyAxMCA+PSBzY3JvbGxIZWlnaHQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRoeU9uU2Nyb2xsVG9Cb3R0b20ub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRoeU9uU2Nyb2xsVG9Cb3R0b20uZW1pdCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2VhcmNoRmlsdGVyKHNlYXJjaFRleHQ6IHN0cmluZykge1xuICAgICAgICBzZWFyY2hUZXh0ID0gc2VhcmNoVGV4dC50cmltKCk7XG4gICAgICAgIGlmICh0aGlzLnRoeVNlcnZlclNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5pc1NlYXJjaGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRoeU9uU2VhcmNoLmVtaXQoc2VhcmNoVGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLnRvQXJyYXkoKTtcbiAgICAgICAgICAgIG9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb24ubWF0Y2hTZWFyY2hUZXh0KHNlYXJjaFRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbi5zaG93T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmhpZGVPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Q29ycmVjdE9wdGlvbihmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQmx1cihldmVudD86IEZvY3VzRXZlbnQpIHtcbiAgICAgICAgLy8gVGFiIOiBmueEpuWQjuiHquWKqOiBmueEpuWIsCBpbnB1dCDovpPlhaXmoYbvvIzmraTliIbmlK/kuIvnm7TmjqXov5Tlm57vvIzml6DpnIDop6blj5Egb25Ub3VjaGVkRm5cbiAgICAgICAgaWYgKGVsZW1lbnRNYXRjaENsb3Nlc3QoZXZlbnQ/LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQsIFsnLnRoeS1zZWxlY3QtZHJvcGRvd24nLCAndGh5LXNlbGVjdCddKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Ub3VjaGVkRm4oKTtcbiAgICB9XG5cbiAgICBvbkZvY3VzKGV2ZW50PzogRm9jdXNFdmVudCkge1xuICAgICAgICAvLyB0aHlTaG93U2VhcmNoIOS4jiBwYW5lbE9wZW4g5Z2H5Li6IHRydWUg5pe277yM54K55Ye7IHRoeVNlbGVjdENvbnRyb2wg6ZyA6KaB6Kem5Y+R6Ieq5Yqo6IGa54Sm5YiwIGlucHV0IOeahOmAu+i+kVxuICAgICAgICAvLyBtYW51YWxGb2N1c2luZyDlpoLmnpzmmK/miYvliqjogZrnhKbvvIzkuI3op6blj5Hoh6rliqjogZrnhKbliLAgaW5wdXQg55qE6YC76L6RXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLnRoeVNob3dTZWFyY2ggJiYgdGhpcy5wYW5lbE9wZW4pIHx8XG4gICAgICAgICAgICAoIXRoaXMubWFudWFsRm9jdXNpbmcgJiZcbiAgICAgICAgICAgICAgICAhZWxlbWVudE1hdGNoQ2xvc2VzdChldmVudD8ucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCwgWycudGh5LXNlbGVjdC1kcm9wZG93bicsICd0aHktY3VzdG9tLXNlbGVjdCddKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dEVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgICAgICAgICAgaW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYW51YWxGb2N1c2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb2N1cyhvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFudWFsRm9jdXNpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5tYW51YWxGb2N1c2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoJGV2ZW50OiB7IGl0ZW06IFRoeU9wdGlvbjsgJGV2ZW50T3JpZ2luOiBFdmVudCB9KSB7XG4gICAgICAgICRldmVudC4kZXZlbnRPcmlnaW4uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uID09PSAkZXZlbnQuaXRlbSkpIHtcbiAgICAgICAgICAgICRldmVudC5pdGVtLmRlc2VsZWN0KCk7XG4gICAgICAgICAgICAvLyBmaXggb3B0aW9uIHVuc2VsZWN0IGNhbiBub3QgZW1pdCBjaGFuZ2VzO1xuICAgICAgICAgICAgdGhpcy5vblNlbGVjdCgkZXZlbnQuaXRlbSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkZXZlbnQuaXRlbS5kZXNlbGVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyU2VsZWN0VmFsdWUoZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLmVtaXRNb2RlbFZhbHVlQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheSAmJiB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXkub3ZlcmxheVJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheS5vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWQoKTogVGh5T3B0aW9uIHwgVGh5T3B0aW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc011bHRpcGxlID8gdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZCA6IHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRbMF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc011bHRpcGxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnbXVsdGlwbGUnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5zZWxlY3Rpb25Nb2RlbCB8fCB0aGlzLnNlbGVjdGlvbk1vZGVsLmlzRW1wdHkoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5pc1JlYWN0aXZlRHJpdmVuID8gdGhpcy52aWV3R3JvdXBzIDogdGhpcy5jb250ZW50R3JvdXBzO1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxlbmd0aCArIGdyb3VwLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRoeVNob3dTZWFyY2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5vcHRpb25zIHx8IHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmlnZ2VyUmVjdFdpZHRoID0gdGhpcy5nZXRPcmlnaW5SZWN0V2lkdGgoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVUcmlnZ2VyUmVzaXplKCk7XG4gICAgICAgIHRoaXMucGFuZWxPcGVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRDb3JyZWN0T3B0aW9uKCk7XG4gICAgICAgIHRoaXMudGh5T25FeHBhbmRTdGF0dXNDaGFuZ2UuZW1pdCh0aGlzLnBhbmVsT3Blbik7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMucGFuZWxPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlVHJpZ2dlclJlc2l6ZSgpO1xuICAgICAgICAgICAgdGhpcy50aHlPbkV4cGFuZFN0YXR1c0NoYW5nZS5lbWl0KHRoaXMucGFuZWxPcGVuKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGVtaXRNb2RlbFZhbHVlQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9IHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQ7XG4gICAgICAgIGNvbnN0IGNoYW5nZVZhbHVlID0gc2VsZWN0ZWRWYWx1ZXMubWFwKChvcHRpb246IFRoeU9wdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi50aHlWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHRoaXMubW9kYWxWYWx1ZSA9IGNoYW5nZVZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNoYW5nZVZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kYWxWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kYWxWYWx1ZSA9IGNoYW5nZVZhbHVlWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbih0aGlzLm1vZGFsVmFsdWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhpZ2hsaWdodENvcnJlY3RPcHRpb24oZnJvbU9wZW5QYW5lbDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMua2V5TWFuYWdlciAmJiB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgICAgICAgaWYgKGZyb21PcGVuUGFuZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGh5QXV0b0FjdGl2ZUZpcnN0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy50aHlBdXRvQWN0aXZlRmlyc3RJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYWx3YXlzIHNldCBmaXJzdCBvcHRpb24gYWN0aXZlXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0S2V5TWFuYWdlcigpIHtcbiAgICAgICAgaWYgKHRoaXMua2V5TWFuYWdlciAmJiB0aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xuICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0uc2V0SW5hY3RpdmVTdHlsZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleU1hbmFnZXIgPSBuZXcgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXI8VGh5T3B0aW9uPih0aGlzLm9wdGlvbnMpXG4gICAgICAgICAgICAud2l0aFR5cGVBaGVhZCgpXG4gICAgICAgICAgICAud2l0aFdyYXAoKVxuICAgICAgICAgICAgLndpdGhWZXJ0aWNhbE9yaWVudGF0aW9uKClcbiAgICAgICAgICAgIC53aXRoQWxsb3dlZE1vZGlmaWVyS2V5cyhbJ3NoaWZ0S2V5J10pO1xuXG4gICAgICAgIHRoaXMua2V5TWFuYWdlci50YWJPdXQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmtleU1hbmFnZXIuY2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFuZWxPcGVuICYmIHRoaXMucGFuZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgU2Nyb2xsVG9TZXJ2aWNlLnNjcm9sbFRvRWxlbWVudCh0aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMucGFuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5wYW5lbE9wZW4gJiYgIXRoaXMuaXNNdWx0aXBsZSAmJiB0aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xuICAgICAgICAgICAgICAgIHRoaXMua2V5TWFuYWdlci5hY3RpdmVJdGVtLnNlbGVjdFZpYUludGVyYWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xvc2VkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICAgICAgY29uc3QgaXNBcnJvd0tleSA9IGtleUNvZGUgPT09IERPV05fQVJST1cgfHwga2V5Q29kZSA9PT0gVVBfQVJST1cgfHwga2V5Q29kZSA9PT0gTEVGVF9BUlJPVyB8fCBrZXlDb2RlID09PSBSSUdIVF9BUlJPVztcbiAgICAgICAgY29uc3QgaXNPcGVuS2V5ID0ga2V5Q29kZSA9PT0gRU5URVIgfHwga2V5Q29kZSA9PT0gU1BBQ0U7XG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmtleU1hbmFnZXI7XG5cbiAgICAgICAgLy8gT3BlbiB0aGUgc2VsZWN0IG9uIEFMVCArIGFycm93IGtleSB0byBtYXRjaCB0aGUgbmF0aXZlIDxzZWxlY3Q+XG4gICAgICAgIGlmICgoaXNPcGVuS2V5ICYmICFoYXNNb2RpZmllcktleShldmVudCkpIHx8ICgodGhpcy5pc011bHRpcGxlIHx8IGV2ZW50LmFsdEtleSkgJiYgaXNBcnJvd0tleSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIHByZXZlbnRzIHRoZSBwYWdlIGZyb20gc2Nyb2xsaW5nIGRvd24gd2hlbiBwcmVzc2luZyBzcGFjZVxuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgICAgICAgaWYgKGtleUNvZGUgPT09IEhPTUUgfHwga2V5Q29kZSA9PT0gRU5EKSB7XG4gICAgICAgICAgICAgICAga2V5Q29kZSA9PT0gSE9NRSA/IG1hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCkgOiBtYW5hZ2VyLnNldExhc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFuYWdlci5vbktleWRvd24oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVPcGVuS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcbiAgICAgICAgY29uc3QgaXNBcnJvd0tleSA9IGtleUNvZGUgPT09IERPV05fQVJST1cgfHwga2V5Q29kZSA9PT0gVVBfQVJST1c7XG4gICAgICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmtleU1hbmFnZXI7XG5cbiAgICAgICAgaWYgKGtleUNvZGUgPT09IEhPTUUgfHwga2V5Q29kZSA9PT0gRU5EKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAga2V5Q29kZSA9PT0gSE9NRSA/IG1hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCkgOiBtYW5hZ2VyLnNldExhc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJvd0tleSAmJiBldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgIC8vIENsb3NlIHRoZSBzZWxlY3Qgb24gQUxUICsgYXJyb3cga2V5IHRvIG1hdGNoIHRoZSBuYXRpdmUgPHNlbGVjdD5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGtleUNvZGUgPT09IEVOVEVSIHx8IGtleUNvZGUgPT09IFNQQUNFKSAmJiAobWFuYWdlci5hY3RpdmVJdGVtIHx8ICF0aGlzLmVtcHR5KSAmJiAhaGFzTW9kaWZpZXJLZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaWYgKCFtYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAobWFuYWdlci5hY3RpdmVJdGVtSW5kZXggPT09IC0xICYmICF0aGlzLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZXIuc2V0QWN0aXZlSXRlbSh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYW5hZ2VyLmFjdGl2ZUl0ZW0uc2VsZWN0VmlhSW50ZXJhY3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlwbGUgJiYga2V5Q29kZSA9PT0gQSAmJiBldmVudC5jdHJsS2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgaGFzRGVzZWxlY3RlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuc29tZShvcHQgPT4gIW9wdC5kaXNhYmxlZCAmJiAhb3B0LnNlbGVjdGVkKTtcblxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBoYXNEZXNlbGVjdGVkT3B0aW9ucyA/IG9wdGlvbi5zZWxlY3QoKSA6IG9wdGlvbi5kZXNlbGVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1hbmFnZXIuYWN0aXZlSXRlbUluZGV4ID09PSAtMSAmJiAhdGhpcy5lbXB0eSkge1xuICAgICAgICAgICAgICAgIG1hbmFnZXIuc2V0QWN0aXZlSXRlbSh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzbHlGb2N1c2VkSW5kZXggPSBtYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleDtcblxuICAgICAgICAgICAgbWFuYWdlci5vbktleWRvd24oZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5pc011bHRpcGxlICYmXG4gICAgICAgICAgICAgICAgaXNBcnJvd0tleSAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LnNoaWZ0S2V5ICYmXG4gICAgICAgICAgICAgICAgbWFuYWdlci5hY3RpdmVJdGVtICYmXG4gICAgICAgICAgICAgICAgbWFuYWdlci5hY3RpdmVJdGVtSW5kZXggIT09IHByZXZpb3VzbHlGb2N1c2VkSW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG1hbmFnZXIuYWN0aXZlSXRlbS5zZWxlY3RWaWFJbnRlcmFjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQb3NpdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuZHJvcERvd25Qb3NpdGlvbnMgPSBnZXRGbGV4aWJsZVBvc2l0aW9ucyh0aGlzLnRoeVBsYWNlbWVudCB8fCB0aGlzLmNvbmZpZy5wbGFjZW1lbnQsIHRoaXMuZGVmYXVsdE9mZnNldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnN0YW5jZVNlbGVjdGlvbk1vZGVsKCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8VGh5T3B0aW9uPih0aGlzLmlzTXVsdGlwbGUpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbFN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbFN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VsZWN0aW9uTW9kZWwuY2hhbmdlZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGV2ZW50LmFkZGVkLmZvckVhY2gob3B0aW9uID0+IG9wdGlvbi5zZWxlY3QoKSk7XG4gICAgICAgICAgICBldmVudC5yZW1vdmVkLmZvckVhY2gob3B0aW9uID0+IG9wdGlvbi5kZXNlbGVjdCgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldE9wdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRPckRlc3Ryb3llZCQgPSBtZXJnZSh0aGlzLm9wdGlvbnNDaGFuZ2VzJCwgdGhpcy5kZXN0cm95JCk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25TZWxlY3Rpb25DaGFuZ2VzLnBpcGUodGFrZVVudGlsKGNoYW5nZWRPckRlc3Ryb3llZCQpKS5zdWJzY3JpYmUoKGV2ZW50OiBUaHlPcHRpb25TZWxlY3Rpb25DaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblNlbGVjdChldmVudC5vcHRpb24sIGV2ZW50LmlzVXNlcklucHV0KTtcbiAgICAgICAgICAgIGlmIChldmVudC5pc1VzZXJJbnB1dCAmJiAhdGhpcy5pc011bHRpcGxlICYmIHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplU2VsZWN0aW9uKCkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uQnlNb2RlbFZhbHVlKHRoaXMubW9kYWxWYWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RHJvcERvd25DbGFzcygpIHtcbiAgICAgICAgbGV0IG1vZGVDbGFzcyA9ICcnO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICAgICAgICBtb2RlQ2xhc3MgPSBgdGh5LXNlbGVjdC1kcm9wZG93bi0ke3RoaXMubW9kZX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW9kZUNsYXNzID0gYHRoeS1zZWxlY3QtZHJvcGRvd24tc2luZ2xlYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyb3BEb3duQ2xhc3MgPSB7XG4gICAgICAgICAgICBbYHRoeS1zZWxlY3QtZHJvcGRvd25gXTogdHJ1ZSxcbiAgICAgICAgICAgIFttb2RlQ2xhc3NdOiB0cnVlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3Rpb25CeU1vZGVsVmFsdWUobW9kYWxWYWx1ZTogYW55KSB7XG4gICAgICAgIGlmIChoZWxwZXJzLmlzVW5kZWZpbmVkT3JOdWxsKG1vZGFsVmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgICAgICAgaWYgKGlzQXJyYXkobW9kYWxWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IFsuLi50aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgKG1vZGFsVmFsdWUgYXMgQXJyYXk8YW55PikuZm9yRWFjaChpdGVtVmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZpbmQoX29wdGlvbiA9PiBfb3B0aW9uLnRoeVZhbHVlID09PSBpdGVtVmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5maW5kKF9vcHRpb24gPT4gX29wdGlvbi50aHlWYWx1ZSA9PT0gaXRlbVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3Qob3B0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnM/LmZpbmQob3B0aW9uID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uLnRoeVZhbHVlID09PSBtb2RhbFZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdChzZWxlY3RlZE9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU2VsZWN0KG9wdGlvbjogVGh5T3B0aW9uLCBpc1VzZXJJbnB1dDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pO1xuXG4gICAgICAgIGlmIChvcHRpb24udGh5VmFsdWUgPT0gbnVsbCAmJiAhdGhpcy5pc011bHRpcGxlKSB7XG4gICAgICAgICAgICBvcHRpb24uZGVzZWxlY3QoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCAhPT0gb3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID8gdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3Qob3B0aW9uKSA6IHRoaXMuc2VsZWN0aW9uTW9kZWwuZGVzZWxlY3Qob3B0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzVXNlcklucHV0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0ob3B0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ydFZhbHVlcygpO1xuICAgICAgICAgICAgICAgIGlmIChpc1VzZXJJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdhc1NlbGVjdGVkICE9PSB0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQob3B0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0TW9kZWxWYWx1ZUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc011bHRpcGxlKSB7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNvcnRWYWx1ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMudG9BcnJheSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy50aHlTb3J0Q29tcGFyYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aHlTb3J0Q29tcGFyYXRvcihhLCBiLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3JpZ2luUmVjdFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHlPcmlnaW4gPyBjb2VyY2VFbGVtZW50KHRoaXMudGh5T3JpZ2luKS5vZmZzZXRXaWR0aCA6IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVHJpZ2dlclJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZVRyaWdnZXJSZXNpemUoKTtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVTdWJzY3JpcHRpb24gPSBuZXcgT2JzZXJ2YWJsZTxudW1iZXI+KG9ic2VydmVyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNpemUgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXM6IFJlc2l6ZU9ic2VydmVyRW50cnlbXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzaXplLm9ic2VydmUodGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRXaXRoKCksXG4gICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPcmlnaW5SZWN0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgod2lkdGg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVjdFdpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVuc3Vic2NyaWJlVHJpZ2dlclJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVzaXplU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVUcmlnZ2VyUmVzaXplKCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuIiwiPGRpdlxuICBjZGstb3ZlcmxheS1vcmlnaW5cbiAgdGh5U2VsZWN0Q29udHJvbFxuICAoY2xpY2spPVwidG9nZ2xlKCRldmVudClcIlxuICAjb3JpZ2luPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICN0cmlnZ2VyXG4gIFt0aHlQYW5lbE9wZW5lZF09XCJwYW5lbE9wZW5cIlxuICBbdGh5U2VsZWN0ZWRPcHRpb25zXT1cInNlbGVjdGVkXCJcbiAgW3RoeUlzTXVsdGlwbGVdPVwiaXNNdWx0aXBsZVwiXG4gIFt0aHlTaG93U2VhcmNoXT1cInRoeVNob3dTZWFyY2hcIlxuICBbdGh5QWxsb3dDbGVhcl09XCJ0aHlBbGxvd0NsZWFyXCJcbiAgW3RoeVNpemVdPVwidGh5U2l6ZVwiXG4gIFt0aHlQbGFjZWhvbGRlcl09XCJ0aHlQbGFjZUhvbGRlclwiXG4gIFtjdXN0b21EaXNwbGF5VGVtcGxhdGVdPVwic2VsZWN0ZWRWYWx1ZURpc3BsYXlSZWZcIlxuICBbdGh5RGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbdGh5Qm9yZGVybGVzc109XCJ0aHlCb3JkZXJsZXNzXCJcbiAgKHRoeU9uQ2xlYXIpPVwiY2xlYXJTZWxlY3RWYWx1ZSgkZXZlbnQpXCJcbiAgKHRoeU9uUmVtb3ZlKT1cInJlbW92ZSgkZXZlbnQpXCJcbiAgKHRoeU9uU2VhcmNoKT1cIm9uU2VhcmNoRmlsdGVyKCRldmVudClcIlxuICAodGh5T25CbHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcbiAgW3RoeU1heFRhZ0NvdW50XT1cInRoeU1heFRhZ0NvdW50XCJcbiAgW3RoeVByZXNldF09XCJ0aHlQcmVzZXRcIj48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gIGNkay1jb25uZWN0ZWQtb3ZlcmxheVxuICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcF09XCJ0aHlIYXNCYWNrZHJvcFwiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cImRyb3BEb3duUG9zaXRpb25zXCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidGh5T3JpZ2luIHx8IG9yaWdpblwiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJwYW5lbE9wZW5cIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVdpZHRoXT1cInRyaWdnZXJSZWN0V2lkdGhcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU1pbldpZHRoXT1cImRyb3BEb3duTWluV2lkdGhcIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVNjcm9sbFN0cmF0ZWd5XT1cInNjcm9sbFN0cmF0ZWd5XCJcbiAgY2RrQ29ubmVjdGVkT3ZlcmxheVRyYW5zZm9ybU9yaWdpbk9uPVwiLnRoeS1zZWxlY3QtZHJvcGRvd25cIlxuICAoYXR0YWNoKT1cIm9uQXR0YWNoZWQoKVwiXG4gIChkZXRhY2gpPVwiY2xvc2UoKVwiPlxuICA8ZGl2XG4gICAgdGh5U3RvcFByb3BhZ2F0aW9uXG4gICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgIFtuZ0NsYXNzXT1cImRyb3BEb3duQ2xhc3NcIlxuICAgIFtAc2NhbGVZTW90aW9uXT1cInBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgcGxhY2VtZW50ID09PSAnYm90dG9tJyA/ICdlbnRlcicgOiAndm9pZCdcIlxuICAgIFtAc2NhbGVYTW90aW9uXT1cInBsYWNlbWVudCA9PT0gJ2xlZnQnIHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0JyA/ICdlbnRlcicgOiAndm9pZCdcIlxuICAgIFtAc2NhbGVNb3Rpb25dPVwicGxhY2VtZW50ICE9PSAndG9wJyAmJiBwbGFjZW1lbnQgIT09ICdib3R0b20nICYmIHBsYWNlbWVudCAhPT0gJ2xlZnQnICYmIHBsYWNlbWVudCAhPT0gJ3JpZ2h0JyA/ICdlbnRlcicgOiAndm9pZCdcIlxuICAgIChtb3VzZW1vdmUpPVwiZHJvcERvd25Nb3VzZU1vdmUoJGV2ZW50KVwiPlxuICAgIEBpZiAoY29udGVudE9wdGlvbnM/Lmxlbmd0aCA+IDAgfHwgY29udGVudEdyb3Vwcz8ubGVuZ3RoID4gMCB8fCBpbm5lck9wdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIDxkaXZcbiAgICAgICAgI3BhbmVsXG4gICAgICAgIGNsYXNzPVwidGh5LXNlbGVjdC1kcm9wZG93bi1vcHRpb25zIHRoeS1zZWxlY3QtZHJvcGRvd24tb3B0aW9ucy17eyBzaXplIH19XCJcbiAgICAgICAgdGh5U2Nyb2xsXG4gICAgICAgICh0aHlPblNjcm9sbGVkKT1cIm9uT3B0aW9uc1Njcm9sbGVkKCRldmVudClcIlxuICAgICAgICBbdGh5RW5hYmxlXT1cInRoeUVuYWJsZVNjcm9sbExvYWRcIj5cbiAgICAgICAgQGlmIChpc1JlYWN0aXZlRHJpdmVuKSB7XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnNDb250YWluZXIub3B0aW9uc1RlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIEBpZiAoaXNIaWRkZW5PcHRpb25zKSB7XG4gICAgICAgICAgPHRoeS1sb2FkaW5nIFt0aHlEb25lXT1cInRoeUxvYWRTdGF0ZVwiIHRoeVNpemU9XCJzbVwiPjwvdGh5LWxvYWRpbmc+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRoeS1zZWxlY3QtZW1wdHktY29udGVudFwiPlxuICAgICAgICAgICAgQGlmICh0aHlMb2FkU3RhdGUpIHtcbiAgICAgICAgICAgICAgPHRoeS1lbXB0eSBbdGh5TWVzc2FnZV09XCJlbXB0eVNlYXJjaE1lc3NhZ2VUZXh0XCIgdGh5U2l6ZT1cInNtXCIgW3RoeUljb25OYW1lXT1cImVtcHR5SWNvbigpXCI+PC90aHktZW1wdHk+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPHRoeS1sb2FkaW5nIFt0aHlEb25lXT1cInRoeUxvYWRTdGF0ZVwiIHRoeVNpemU9XCJzbVwiPjwvdGh5LWxvYWRpbmc+XG4gICAgICA8ZGl2IGNsYXNzPVwidGh5LXNlbGVjdC1lbXB0eS1jb250ZW50XCI+XG4gICAgICAgIEBpZiAodGh5TG9hZFN0YXRlKSB7XG4gICAgICAgICAgPHRoeS1lbXB0eSBbdGh5TWVzc2FnZV09XCJlbXB0eVN0YXRlVGV4dFwiIHRoeVNpemU9XCJzbVwiIFt0aHlJY29uTmFtZV09XCJlbXB0eUljb24oKVwiPjwvdGh5LWVtcHR5PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmICh0aHlGb290ZXJUZW1wbGF0ZSkge1xuICAgICAgPGRpdiBbY2xhc3NdPVwidGh5Rm9vdGVyQ2xhc3MgPyB0aHlGb290ZXJDbGFzcyA6ICd0aHktY3VzdG9tLXNlbGVjdC1mb290ZXInXCI+XG4gICAgICAgIEBpZiAodGh5Rm9vdGVyVGVtcGxhdGUpIHtcbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGh5Rm9vdGVyVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPHRoeS1vcHRpb25zLWNvbnRhaW5lciAjb3B0aW9uc0NvbnRhaW5lcj5cbiAgQGZvciAob3B0aW9uIG9mIG9wdGlvbkdyb3VwczsgdHJhY2sgJGluZGV4KSB7XG4gICAgQGlmICghb3B0aW9uLmNoaWxkcmVuKSB7XG4gICAgICA8dGh5LW9wdGlvblxuICAgICAgICBbdGh5RGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkXCJcbiAgICAgICAgW3RoeUxhYmVsVGV4dF09XCJvcHRpb24ubGFiZWxcIlxuICAgICAgICBbdGh5VmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcbiAgICAgICAgW3RoeVJhd1ZhbHVlXT1cIm9wdGlvblwiPjwvdGh5LW9wdGlvbj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDx0aHktb3B0aW9uLWdyb3VwIFt0aHlHcm91cExhYmVsXT1cIm9wdGlvbi5ncm91cExhYmVsXCI+XG4gICAgICAgIEBmb3IgKHN1YiBvZiBvcHRpb24uY2hpbGRyZW47IHRyYWNrIHN1Yi52YWx1ZSkge1xuICAgICAgICAgIDx0aHktb3B0aW9uIFt0aHlEaXNhYmxlZF09XCJzdWIuZGlzYWJsZWRcIiBbdGh5TGFiZWxUZXh0XT1cInN1Yi5sYWJlbFwiIFt0aHlWYWx1ZV09XCJzdWIudmFsdWVcIiBbdGh5UmF3VmFsdWVdPVwic3ViXCI+PC90aHktb3B0aW9uPlxuICAgICAgICB9XG4gICAgICA8L3RoeS1vcHRpb24tZ3JvdXA+XG4gICAgfVxuICB9XG48L3RoeS1vcHRpb25zLWNvbnRhaW5lcj5cbiJdfQ==