desy-angular 12.0.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/esm2022/lib/desy-angular.module.mjs +10 -9
  2. package/esm2022/lib/desy-buttons/components/button/button.component.mjs +5 -4
  3. package/esm2022/lib/desy-buttons/components/button-loader/button-loader.component.mjs +8 -5
  4. package/esm2022/lib/desy-buttons/components/dropdown/dropdown.component.mjs +11 -6
  5. package/esm2022/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.mjs +3 -3
  6. package/esm2022/lib/desy-buttons/components/listbox/listbox.component.mjs +6 -5
  7. package/esm2022/lib/desy-buttons/components/pill/pill.component.mjs +5 -4
  8. package/esm2022/lib/desy-buttons/components/toggle/toggle.component.mjs +4 -3
  9. package/esm2022/lib/desy-buttons/desy-buttons.module.mjs +15 -15
  10. package/esm2022/lib/desy-buttons/interfaces/listbox-item-data.mjs +1 -1
  11. package/esm2022/lib/desy-commons/interfaces/title-data.mjs +1 -1
  12. package/esm2022/lib/desy-forms/components/checkboxes/checkbox-item/checkbox-item.component.mjs +6 -5
  13. package/esm2022/lib/desy-forms/components/checkboxes/checkboxes.component.mjs +11 -10
  14. package/esm2022/lib/desy-forms/components/date-input/date-input.component.mjs +10 -9
  15. package/esm2022/lib/desy-forms/components/datepicker/datepicker.component.mjs +190 -0
  16. package/esm2022/lib/desy-forms/components/datepicker/datepicker.pipe.mjs +34 -0
  17. package/esm2022/lib/desy-forms/components/error-message/error-message.component.mjs +4 -3
  18. package/esm2022/lib/desy-forms/components/fieldset/fieldset.component.mjs +5 -4
  19. package/esm2022/lib/desy-forms/components/file-upload/file-upload.component.mjs +8 -7
  20. package/esm2022/lib/desy-forms/components/hint/hint.component.mjs +4 -3
  21. package/esm2022/lib/desy-forms/components/input/input.component.mjs +8 -7
  22. package/esm2022/lib/desy-forms/components/input-group/input-group.component.mjs +11 -10
  23. package/esm2022/lib/desy-forms/components/label/label.component.mjs +4 -3
  24. package/esm2022/lib/desy-forms/components/radios/radio-item/radio-item.component.mjs +6 -5
  25. package/esm2022/lib/desy-forms/components/radios/radios.component.mjs +11 -10
  26. package/esm2022/lib/desy-forms/components/search-bar/search-bar.component.mjs +7 -6
  27. package/esm2022/lib/desy-forms/components/select/select.component.mjs +8 -7
  28. package/esm2022/lib/desy-forms/components/textarea/textarea.component.mjs +8 -7
  29. package/esm2022/lib/desy-forms/components/tree/tree-checkbox/tree-checkbox.component.mjs +4 -3
  30. package/esm2022/lib/desy-forms/components/tree/tree-item/tree-item.component.mjs +13 -12
  31. package/esm2022/lib/desy-forms/components/tree/tree-sub/tree-sub.component.mjs +5 -4
  32. package/esm2022/lib/desy-forms/components/tree/tree.component.mjs +12 -9
  33. package/esm2022/lib/desy-forms/desy-forms.module.mjs +40 -24
  34. package/esm2022/lib/desy-forms/interfaces/error-message-data.mjs +1 -1
  35. package/esm2022/lib/desy-forms/interfaces/fieldset-data.mjs +1 -1
  36. package/esm2022/lib/desy-forms/interfaces/hint-data.mjs +1 -1
  37. package/esm2022/lib/desy-forms/interfaces/item-checkbox-data.mjs +1 -1
  38. package/esm2022/lib/desy-forms/interfaces/item-date-input-data.mjs +1 -1
  39. package/esm2022/lib/desy-forms/interfaces/item-input-group-data.mjs +1 -1
  40. package/esm2022/lib/desy-forms/interfaces/item-radio-data.mjs +1 -1
  41. package/esm2022/lib/desy-forms/interfaces/label-data.mjs +1 -1
  42. package/esm2022/lib/desy-forms/interfaces/select-item-data.mjs +1 -1
  43. package/esm2022/lib/desy-modals/components/dialog/dialog.component.mjs +4 -3
  44. package/esm2022/lib/desy-modals/components/modal/modal.component.mjs +15 -14
  45. package/esm2022/lib/desy-modals/interfaces/dialog-options.mjs +1 -1
  46. package/esm2022/lib/desy-modals/interfaces/modal-options.mjs +1 -1
  47. package/esm2022/lib/desy-modals/services/dialog.service.mjs +2 -2
  48. package/esm2022/lib/desy-nav/components/breadcrumbs/breadcrumbs.component.mjs +4 -3
  49. package/esm2022/lib/desy-nav/components/error-summary/error-summary.component.mjs +5 -4
  50. package/esm2022/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.mjs +4 -2
  51. package/esm2022/lib/desy-nav/components/footer/footer.component.mjs +6 -5
  52. package/esm2022/lib/desy-nav/components/header/header-mobileText/header-mobile-text.component.mjs +246 -2
  53. package/esm2022/lib/desy-nav/components/header/header-navigation/header-navigation.component.mjs +4 -3
  54. package/esm2022/lib/desy-nav/components/header/header.component.mjs +15 -14
  55. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-dropdown/header-advanced-dropdown.component.mjs +1 -1
  56. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-sub/header-advanced-sub.component.mjs +3 -3
  57. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced-super/header-advanced-super.component.mjs +3 -3
  58. package/esm2022/lib/desy-nav/components/header-advanced/header-advanced.component.mjs +6 -5
  59. package/esm2022/lib/desy-nav/components/header-mini/header-mini.component.mjs +5 -4
  60. package/esm2022/lib/desy-nav/components/links-list/links-list-icon-right/links-list-icon-right.component.mjs +16 -0
  61. package/esm2022/lib/desy-nav/components/links-list/links-list-item/links-list-item.component.mjs +7 -3
  62. package/esm2022/lib/desy-nav/components/links-list/links-list.component.mjs +8 -5
  63. package/esm2022/lib/desy-nav/components/menu-horizontal/menu-horizontal.component.mjs +6 -5
  64. package/esm2022/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.mjs +3 -3
  65. package/esm2022/lib/desy-nav/components/menu-navigation/menu-navigation.component.mjs +280 -31
  66. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.mjs +3 -3
  67. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub-item/menu-vertical-item-sub-item.component.mjs +3 -3
  68. package/esm2022/lib/desy-nav/components/menu-vertical/menu-vertical.component.mjs +6 -5
  69. package/esm2022/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.mjs +3 -3
  70. package/esm2022/lib/desy-nav/components/menubar/menubar.component.mjs +281 -32
  71. package/esm2022/lib/desy-nav/components/nav/nav-item/nav-item.component.mjs +3 -3
  72. package/esm2022/lib/desy-nav/components/nav/nav.component.mjs +6 -5
  73. package/esm2022/lib/desy-nav/components/notification/notification.component.mjs +7 -6
  74. package/esm2022/lib/desy-nav/components/skip-link/skip-link.component.mjs +8 -3
  75. package/esm2022/lib/desy-nav/desy-nav.module.mjs +6 -5
  76. package/esm2022/lib/desy-nav/interfaces/breadcrumbs.data.mjs +1 -1
  77. package/esm2022/lib/desy-nav/interfaces/error-summary-data.mjs +1 -1
  78. package/esm2022/lib/desy-nav/interfaces/footer-data.mjs +1 -1
  79. package/esm2022/lib/desy-nav/interfaces/footer-logo.mjs +2 -1
  80. package/esm2022/lib/desy-nav/interfaces/header-dropdown-data.mjs +1 -1
  81. package/esm2022/lib/desy-nav/interfaces/header-mobile-text-data.mjs +1 -1
  82. package/esm2022/lib/desy-nav/interfaces/header-navigation-item-data.mjs +1 -1
  83. package/esm2022/lib/desy-nav/interfaces/header-subnav-data.mjs +1 -1
  84. package/esm2022/lib/desy-nav/interfaces/menu-horizontal-item-data.mjs +1 -1
  85. package/esm2022/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.mjs +1 -1
  86. package/esm2022/lib/desy-nav/interfaces/menu-navigation-item-sub-item.mjs +1 -1
  87. package/esm2022/lib/desy-nav/interfaces/menu-navigation.mjs +1 -1
  88. package/esm2022/lib/desy-nav/interfaces/menu-vertical-items-data.mjs +1 -1
  89. package/esm2022/lib/desy-nav/interfaces/menu-vertical-sub-data.mjs +1 -1
  90. package/esm2022/lib/desy-nav/interfaces/menu-vertical-sub-items-data.mjs +1 -1
  91. package/esm2022/lib/desy-nav/interfaces/menubar-item-sub.mjs +1 -1
  92. package/esm2022/lib/desy-nav/interfaces/menubar-item.mjs +1 -1
  93. package/esm2022/lib/desy-nav/interfaces/nav-item.data.mjs +1 -1
  94. package/esm2022/lib/desy-nav/interfaces/notification-items-data.mjs +1 -1
  95. package/esm2022/lib/desy-nav/interfaces/notification-options.mjs +1 -1
  96. package/esm2022/lib/desy-pagination/components/pagination/pagination.component.mjs +22 -22
  97. package/esm2022/lib/desy-pagination/components/pagination-item-perpage/pagination-item-perpage.component.mjs +2 -2
  98. package/esm2022/lib/desy-pagination/desy-pagination.module.mjs +16 -8
  99. package/esm2022/lib/desy-tables/components/table/table.component.mjs +26 -5
  100. package/esm2022/lib/desy-tables/components/table-advanced/table-advanced.component.mjs +16 -16
  101. package/esm2022/lib/desy-tables/directives/focus-clicked-cell.directive.mjs +12 -7
  102. package/esm2022/lib/desy-tables/interfaces/cell-data.mjs +1 -1
  103. package/esm2022/lib/desy-tables/interfaces/wrapper-data.mjs +1 -1
  104. package/esm2022/lib/desy-views/components/accordion/accordion.component.mjs +279 -30
  105. package/esm2022/lib/desy-views/components/accordion-history/accordion-history.component.mjs +5 -4
  106. package/esm2022/lib/desy-views/components/alert/alert.component.mjs +4 -3
  107. package/esm2022/lib/desy-views/components/card/card.component.mjs +4 -3
  108. package/esm2022/lib/desy-views/components/collapsible/collapsible.component.mjs +13 -4
  109. package/esm2022/lib/desy-views/components/description-list/description-list.component.mjs +4 -3
  110. package/esm2022/lib/desy-views/components/details/details.component.mjs +4 -3
  111. package/esm2022/lib/desy-views/components/item/item.component.mjs +11 -10
  112. package/esm2022/lib/desy-views/components/media-object/media-object.component.mjs +280 -32
  113. package/esm2022/lib/desy-views/components/status/status.component.mjs +283 -32
  114. package/esm2022/lib/desy-views/components/status-item/status-item.component.mjs +286 -37
  115. package/esm2022/lib/desy-views/components/tabs/tabs.component.mjs +284 -35
  116. package/esm2022/lib/desy-views/components/tooltip/tooltip.component.mjs +281 -33
  117. package/esm2022/lib/desy-views/desy-views.module.mjs +27 -32
  118. package/esm2022/lib/desy-views/interfaces/accordion-item.data.mjs +1 -1
  119. package/esm2022/lib/desy-views/interfaces/alert-options.mjs +1 -1
  120. package/esm2022/lib/desy-views/interfaces/description-item.data.mjs +1 -1
  121. package/esm2022/lib/desy-views/interfaces/status-data.mjs +1 -1
  122. package/esm2022/lib/desy-views/interfaces/tabs-items-data.mjs +1 -1
  123. package/esm2022/lib/desy-views/interfaces/tabs-panel-data.mjs +1 -1
  124. package/esm2022/lib/desy-views/interfaces/term-definition.data.mjs +1 -1
  125. package/esm2022/lib/shared/components/accessibility/accessibility-attributes.mjs +78 -0
  126. package/esm2022/lib/shared/components/accessibility/accessibility.component.mjs +124 -2
  127. package/esm2022/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.mjs +126 -2
  128. package/esm2022/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.mjs +126 -2
  129. package/esm2022/lib/shared/components/index.mjs +4 -3
  130. package/esm2022/lib/shared/components/spinner/spinner.component.mjs +329 -0
  131. package/esm2022/lib/shared/directives/accessibility-directive.mjs +52 -0
  132. package/esm2022/lib/shared/directives/custom-inner-content.directive.mjs +21 -4
  133. package/esm2022/lib/shared/interfaces/accessibility-data.mjs +2 -0
  134. package/esm2022/lib/shared/pipes/make-html-list.pipe.mjs +2 -2
  135. package/esm2022/lib/shared/shared.module.mjs +12 -7
  136. package/esm2022/lib/shared/sharedExternal.module.mjs +24 -0
  137. package/esm2022/lib/shared/utils/search-utils.mjs +5 -1
  138. package/esm2022/public-api.mjs +5 -2
  139. package/fesm2022/desy-angular.mjs +4273 -965
  140. package/fesm2022/desy-angular.mjs.map +1 -1
  141. package/lib/desy-angular.module.d.ts +2 -1
  142. package/lib/desy-buttons/components/button-loader/button-loader.component.d.ts +2 -0
  143. package/lib/desy-buttons/components/listbox/listbox-item/listbox-item.component.d.ts +3 -3
  144. package/lib/desy-buttons/desy-buttons.module.d.ts +3 -3
  145. package/lib/desy-buttons/interfaces/listbox-item-data.d.ts +2 -2
  146. package/lib/desy-commons/interfaces/title-data.d.ts +2 -2
  147. package/lib/desy-forms/components/datepicker/datepicker.component.d.ts +31 -0
  148. package/lib/desy-forms/components/datepicker/datepicker.pipe.d.ts +7 -0
  149. package/lib/desy-forms/components/tree/tree-item/tree-item.component.d.ts +5 -5
  150. package/lib/desy-forms/components/tree/tree.component.d.ts +5 -4
  151. package/lib/desy-forms/desy-forms.module.d.ts +10 -6
  152. package/lib/desy-forms/interfaces/error-message-data.d.ts +2 -2
  153. package/lib/desy-forms/interfaces/fieldset-data.d.ts +2 -2
  154. package/lib/desy-forms/interfaces/hint-data.d.ts +2 -2
  155. package/lib/desy-forms/interfaces/item-checkbox-data.d.ts +3 -3
  156. package/lib/desy-forms/interfaces/item-date-input-data.d.ts +3 -3
  157. package/lib/desy-forms/interfaces/item-input-group-data.d.ts +3 -3
  158. package/lib/desy-forms/interfaces/item-radio-data.d.ts +3 -3
  159. package/lib/desy-forms/interfaces/label-data.d.ts +2 -2
  160. package/lib/desy-forms/interfaces/select-item-data.d.ts +2 -2
  161. package/lib/desy-modals/components/modal/modal.component.d.ts +8 -8
  162. package/lib/desy-modals/interfaces/dialog-options.d.ts +2 -2
  163. package/lib/desy-modals/interfaces/modal-options.d.ts +4 -4
  164. package/lib/desy-modals/services/dialog.service.d.ts +1 -1
  165. package/lib/desy-nav/components/footer/footer-navigation/footer-navigation.component.d.ts +2 -1
  166. package/lib/desy-nav/components/header/header-mobileText/header-mobile-text.component.d.ts +61 -0
  167. package/lib/desy-nav/components/header-advanced/header-advanced-sub/header-advanced-sub.component.d.ts +1 -1
  168. package/lib/desy-nav/components/header-advanced/header-advanced-super/header-advanced-super.component.d.ts +1 -1
  169. package/lib/desy-nav/components/header-mini/header-mini.component.d.ts +1 -1
  170. package/lib/desy-nav/components/links-list/links-list-icon-right/links-list-icon-right.component.d.ts +8 -0
  171. package/lib/desy-nav/components/links-list/links-list-item/links-list-item.component.d.ts +4 -2
  172. package/lib/desy-nav/components/links-list/links-list.component.d.ts +2 -1
  173. package/lib/desy-nav/components/menu-navigation/components/menu-navigation-item/menu-navigation-item.component.d.ts +2 -2
  174. package/lib/desy-nav/components/menu-navigation/menu-navigation.component.d.ts +75 -13
  175. package/lib/desy-nav/components/menu-vertical/menu-vertical-item/menu-vertical-item.component.d.ts +3 -3
  176. package/lib/desy-nav/components/menu-vertical/menu-vertical-item-sub-item/menu-vertical-item-sub-item.component.d.ts +3 -3
  177. package/lib/desy-nav/components/menubar/components/menubar-item/menubar-item.component.d.ts +3 -3
  178. package/lib/desy-nav/components/menubar/menubar.component.d.ts +75 -13
  179. package/lib/desy-nav/components/nav/nav-item/nav-item.component.d.ts +2 -2
  180. package/lib/desy-nav/components/notification/notification.component.d.ts +2 -2
  181. package/lib/desy-nav/desy-nav.module.d.ts +29 -28
  182. package/lib/desy-nav/interfaces/breadcrumbs.data.d.ts +2 -2
  183. package/lib/desy-nav/interfaces/error-summary-data.d.ts +2 -2
  184. package/lib/desy-nav/interfaces/footer-data.d.ts +3 -3
  185. package/lib/desy-nav/interfaces/footer-logo.d.ts +1 -0
  186. package/lib/desy-nav/interfaces/header-dropdown-data.d.ts +2 -2
  187. package/lib/desy-nav/interfaces/header-mobile-text-data.d.ts +2 -2
  188. package/lib/desy-nav/interfaces/header-navigation-item-data.d.ts +2 -2
  189. package/lib/desy-nav/interfaces/header-subnav-data.d.ts +2 -2
  190. package/lib/desy-nav/interfaces/menu-horizontal-item-data.d.ts +2 -2
  191. package/lib/desy-nav/interfaces/menu-navigation-item-sub-item-sub-item.d.ts +2 -2
  192. package/lib/desy-nav/interfaces/menu-navigation-item-sub-item.d.ts +2 -2
  193. package/lib/desy-nav/interfaces/menu-navigation.d.ts +2 -2
  194. package/lib/desy-nav/interfaces/menu-vertical-items-data.d.ts +2 -2
  195. package/lib/desy-nav/interfaces/menu-vertical-sub-data.d.ts +2 -2
  196. package/lib/desy-nav/interfaces/menu-vertical-sub-items-data.d.ts +2 -2
  197. package/lib/desy-nav/interfaces/menubar-item-sub.d.ts +2 -2
  198. package/lib/desy-nav/interfaces/menubar-item.d.ts +3 -3
  199. package/lib/desy-nav/interfaces/nav-item.data.d.ts +2 -2
  200. package/lib/desy-nav/interfaces/notification-items-data.d.ts +2 -2
  201. package/lib/desy-nav/interfaces/notification-options.d.ts +4 -4
  202. package/lib/desy-pagination/components/pagination/pagination.component.d.ts +4 -4
  203. package/lib/desy-pagination/components/pagination-item-perpage/pagination-item-perpage.component.d.ts +3 -3
  204. package/lib/desy-pagination/desy-pagination.module.d.ts +3 -1
  205. package/lib/desy-tables/components/table/table.component.d.ts +3 -0
  206. package/lib/desy-tables/components/table-advanced/table-advanced.component.d.ts +1 -1
  207. package/lib/desy-tables/directives/focus-clicked-cell.directive.d.ts +1 -0
  208. package/lib/desy-tables/interfaces/cell-data.d.ts +2 -2
  209. package/lib/desy-tables/interfaces/wrapper-data.d.ts +2 -2
  210. package/lib/desy-views/components/accordion/accordion.component.d.ts +75 -13
  211. package/lib/desy-views/components/collapsible/collapsible.component.d.ts +5 -1
  212. package/lib/desy-views/components/item/item.component.d.ts +7 -7
  213. package/lib/desy-views/components/media-object/media-object.component.d.ts +75 -13
  214. package/lib/desy-views/components/status/status.component.d.ts +75 -13
  215. package/lib/desy-views/components/status-item/status-item.component.d.ts +77 -15
  216. package/lib/desy-views/components/tabs/tabs.component.d.ts +77 -15
  217. package/lib/desy-views/components/tooltip/tooltip.component.d.ts +75 -13
  218. package/lib/desy-views/desy-views.module.d.ts +30 -31
  219. package/lib/desy-views/interfaces/accordion-item.data.d.ts +2 -2
  220. package/lib/desy-views/interfaces/alert-options.d.ts +2 -2
  221. package/lib/desy-views/interfaces/description-item.data.d.ts +2 -2
  222. package/lib/desy-views/interfaces/status-data.d.ts +2 -2
  223. package/lib/desy-views/interfaces/tabs-items-data.d.ts +2 -2
  224. package/lib/desy-views/interfaces/tabs-panel-data.d.ts +2 -2
  225. package/lib/desy-views/interfaces/term-definition.data.d.ts +2 -2
  226. package/lib/shared/components/accessibility/accessibility-attributes.d.ts +1 -0
  227. package/lib/shared/components/accessibility/accessibility.component.d.ts +78 -17
  228. package/lib/shared/components/accessibility-and-content-required/accessibility-and-content-required.component.d.ts +79 -16
  229. package/lib/shared/components/accessibility-and-text-or-html-required/accessibility-and-text-or-html-required.component.d.ts +79 -16
  230. package/lib/shared/components/index.d.ts +3 -2
  231. package/lib/shared/components/spinner/spinner.component.d.ts +86 -0
  232. package/lib/shared/directives/accessibility-directive.d.ts +16 -0
  233. package/lib/shared/directives/custom-inner-content.directive.d.ts +3 -2
  234. package/lib/shared/interfaces/accessibility-data.d.ts +77 -0
  235. package/lib/shared/shared.module.d.ts +4 -3
  236. package/lib/shared/sharedExternal.module.d.ts +8 -0
  237. package/package.json +2 -2
  238. package/public-api.d.ts +4 -1
  239. package/esm2022/lib/desy-forms/interfaces/accesibility-data.mjs +0 -2
  240. package/esm2022/lib/desy-pagination/interfaces/index.mjs +0 -2
  241. package/esm2022/lib/desy-views/components/spinner/spinner.component.mjs +0 -81
  242. package/esm2022/lib/shared/interfaces/accesibility-data.mjs +0 -2
  243. package/lib/desy-forms/interfaces/accesibility-data.d.ts +0 -15
  244. package/lib/desy-pagination/interfaces/index.d.ts +0 -1
  245. package/lib/desy-views/components/spinner/spinner.component.d.ts +0 -24
  246. package/lib/shared/interfaces/accesibility-data.d.ts +0 -16
@@ -13,12 +13,13 @@ import * as i0 from "@angular/core";
13
13
  import * as i1 from "@angular/common";
14
14
  import * as i2 from "@angular/forms";
15
15
  import * as i3 from "../../../shared/directives/custom-inner-content.directive";
16
- import * as i4 from "../../../desy-forms/components/select/select.component";
17
- import * as i5 from "../../../desy-forms/components/search-bar/search-bar.component";
18
- import * as i6 from "../../directives/focus-clicked-cell.directive";
19
- import * as i7 from "../../directives/cell.directive";
20
- import * as i8 from "../../directives/row.directive";
21
- import * as i9 from "../../../shared/pipes/make-html-list.pipe";
16
+ import * as i4 from "../../../shared/directives/accessibility-directive";
17
+ import * as i5 from "../../../desy-forms/components/select/select.component";
18
+ import * as i6 from "../../../desy-forms/components/search-bar/search-bar.component";
19
+ import * as i7 from "../../directives/focus-clicked-cell.directive";
20
+ import * as i8 from "../../directives/cell.directive";
21
+ import * as i9 from "../../directives/row.directive";
22
+ import * as i10 from "../../../shared/pipes/make-html-list.pipe";
22
23
  export class TableAdvancedComponent extends AccessibilityComponent {
23
24
  set rows(rows) {
24
25
  this._rows = rows;
@@ -190,7 +191,7 @@ export class TableAdvancedComponent extends AccessibilityComponent {
190
191
  });
191
192
  return filteredRows;
192
193
  }
193
- handleSortByColumn(index) {
194
+ handleSortByColumn(index, event) {
194
195
  const head = this.getHeaderCells();
195
196
  if (head) {
196
197
  head.forEach((cell, cellIndex) => {
@@ -200,6 +201,7 @@ export class TableAdvancedComponent extends AccessibilityComponent {
200
201
  });
201
202
  }
202
203
  this.recalculateVisibleElements();
204
+ event?.preventDefault();
203
205
  }
204
206
  sortRows(recalculateParams, rows) {
205
207
  let sortedRows = rows;
@@ -212,13 +214,13 @@ export class TableAdvancedComponent extends AccessibilityComponent {
212
214
  }
213
215
  compareCellContent(a, b, isAsc) {
214
216
  let result;
215
- const aComparable = this.cleanCurrency(a.getContent());
216
- const bComparable = this.cleanCurrency(b.getContent());
217
+ const aComparable = this.cleanCurrency(a.getContent()).trim();
218
+ const bComparable = this.cleanCurrency(b.getContent()).trim();
217
219
  const numberRegex = /^-?\d+(\.|,)?\d*$/;
218
220
  const dateRegex = /^(\d{2})(\/|-)(\d{2})(\/|-)(\d{4})( (\d{2}):(\d{2})(:(\d{2}))?)?$/;
219
221
  if (aComparable && bComparable) {
220
222
  if (numberRegex.test(aComparable) && numberRegex.test(bComparable)) {
221
- result = aComparable.localeCompare(bComparable, undefined, { numeric: true });
223
+ result = (parseFloat(aComparable) - parseFloat(bComparable));
222
224
  }
223
225
  else if (dateRegex.test(aComparable) && dateRegex.test(bComparable)) {
224
226
  result = this.parseDateTime(aComparable) - this.parseDateTime(bComparable);
@@ -245,9 +247,7 @@ export class TableAdvancedComponent extends AccessibilityComponent {
245
247
  }
246
248
  }
247
249
  cleanCurrency(txt) {
248
- if (/[\d.,]+[\€]/g.test(txt)) {
249
- txt = txt.replace(/€/g, '');
250
- }
250
+ txt = txt.replace(/€/g, '');
251
251
  return txt;
252
252
  }
253
253
  selectFilter(item, itemValue) {
@@ -262,7 +262,7 @@ export class TableAdvancedComponent extends AccessibilityComponent {
262
262
  }
263
263
  }
264
264
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableAdvancedComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
265
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableAdvancedComponent, selector: "desy-table-advanced", inputs: { rows: "rows", head: "head", foot: "foot", caption: "caption", captionClasses: "captionClasses", firstCellIsHeader: "firstCellIsHeader", hasCheckboxes: "hasCheckboxes", idPrefix: "idPrefix", classes: "classes", checkboxClasses: "checkboxClasses", id: "id", wrapper: "wrapper" }, outputs: { rowsChange: "rowsChange", rowsChecked: "rowsChecked", recalculateTable: "recalculateTable" }, queries: [{ propertyName: "captionComponent", predicate: TableCaptionComponent }, { propertyName: "headerComponent", predicate: TableAdvancedHeaderComponent }, { propertyName: "footerComponent", predicate: TableAdvancedFooterComponent }, { propertyName: "rowComponentList", predicate: TableAdvancedRowComponent }], viewQueries: [{ propertyName: "rowData", predicate: RowDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #tableContent>\n <table role=\"grid\"\n [class]=\"['c-table-advanced border-t-2 border-b-2 border-neutral-base', classes] | makeHtmlList\"\n [attr.id]=\"id ? id : null\"\n [attr.role]=\"role ? role : null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : null\"\n [attr.aria-describedby]=\"ariaDescribedBy ? ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"ariaLabelledBy ? ariaLabelledBy : null\"\n [attr.aria-hidden]=\"ariaHidden ? ariaHidden : null\"\n [attr.aria-disabled]=\"ariaDisabled ? ariaDisabled : null\"\n [attr.aria-controls]=\"ariaControls ? ariaControls : null\"\n [attr.aria-current]=\"ariaCurrent ? ariaCurrent : null\"\n [attr.aria-live]=\"ariaLive ? ariaLive : null\"\n [attr.aria-expanded]=\"ariaExpanded ? ariaExpanded : null\"\n [attr.aria-errormessage]=\"ariaErrorMessage ? ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"ariaHasPopup ? ariaHasPopup : null\"\n [attr.tabindex]=\"tabindex ? tabindex : null\">\n <caption *ngIf=\"caption || captionComponent\" [class]=\"getCaptionClass()\">\n <ng-container *desyCustomInnerContent=\"{ component: captionComponent, text: caption ? caption : null }\"></ng-container>\n </caption>\n <thead *ngIf=\"getHeaderCells()\">\n <tr class=\"border-t border-neutral-base divide-x divide-neutral-base\">\n <th *ngIf=\"hasCheckboxes\" scope=\"col\" [class]=\"['align-top px-base py-xs', 'w-16', checkboxClasses] | makeHtmlList\">\n <span class=\"sr-only\">Seleccionar fila</span>\n </th>\n <th scope=\"col\" *ngFor=\"let item of getHeaderCells(); index as iHeader\" [id]=\"getIdHeader(iHeader)\"\n [attr.aria-sort]=\"item.orderBy ? getStringOrderBy(item.orderBy) : null\"\n [class]=\"['align-top px-base py-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\"\n [attr.colspan]=\"item.colspan ? item.colspan : null\"\n [attr.rowspan]=\"item.rowspan ? item.rowspan : null\"\n [attr.role]=\"item.role ? item.role : null\"\n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : null\"\n [attr.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\n [attr.aria-disabled]=\"item.ariaDisabled ? item.ariaDisabled : null\"\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\n [attr.aria-expanded]=\"item.ariaExpanded ? item.ariaExpanded : null\"\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"item.ariaHasPopup ? item.ariaHasPopup : null\"\n [attr.tabindex]=\"item.tabindex ? item.tabindex : null\">\n\n <span *ngIf=\"item.orderBy\" class=\"inline-block relative\" (click)=\"handleSortByColumn(iHeader)\" desyFocusClickedCell\n [attr.tabindex]=\"item.orderBy ? -1 : null\"\n [attr.role]=\"item.orderBy ? 'button' : null\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n <span class=\"c-table-advanced__order\" *ngIf=\"item.orderBy\">\n <span class=\"sr-only\">Pulsa para ordenar por esta columna</span>\n <span class=\"c-table-advanced__ascending\" *ngIf=\"item.orderBy === orderByType.asc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M112.07 37.93l-35-35a10 10 0 00-14.14 0l-35 35a10 10 0 0014.14 14.14l13.66-13.66A2.5 2.5 0 0160 40.18V130a10 10 0 0020 0V40.18a2.5 2.5 0 014.27-1.77l13.66 13.66a10 10 0 0014.14-14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__descending\" *ngIf=\"item.orderBy === orderByType.desc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M27.93 102.07l35 35a10 10 0 0014.14 0l35-35a10 10 0 00-14.14-14.14l-13.66 13.66A2.5 2.5 0 0180 99.82V10a10 10 0 00-20 0v89.82a2.5 2.5 0 01-4.27 1.77L42.07 87.93a10 10 0 00-14.14 14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__none\" *ngIf=\"item.orderBy === orderByType.none\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" class=\"text-neutral-base\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M94.7 97.2l-17.2 17.19V25.61L94.7 42.8a7.5 7.5 0 0010.6-10.6l-30-30a7.49 7.49 0 00-10.6 0l-30 30a7.5 7.5 0 0010.6 10.6l17.2-17.19v88.78L45.3 97.2a7.5 7.5 0 10-10.6 10.6l30 30a7.48 7.48 0 0010.6 0l30-30a7.5 7.5 0 00-10.6-10.6z\" fill=\"currentColor\"/></svg>\n </span>\n </span>\n </span>\n\n <span *ngIf=\"!item.orderBy\" class=\"inline-block relative\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n </span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr class=\"divide-x divide-neutral-base\" *ngIf=\"hasFilters()\">\n <td *ngIf=\"hasCheckboxes\" [ngClass]=\"checkboxClasses\"></td>\n <td tabindex=\"-1\" *ngFor=\"let item of getHeaderCells(); index as iHead\" desyFocusClickedCell\n [class]=\"['align-top px-base pb-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\">\n <ng-container *ngIf=\"item.hasSelect && getSelectForItem(item) !== null\">\n <ng-container *ngTemplateOutlet=\"tableSelect; context: {selectable: getSelectForItem(item)}\"></ng-container>\n <ng-template #tableSelect let-selectable=\"selectable\">\n <desy-select [id]=\"getIdHeaderSelect(iHead)\"\n [labelData]=\"{ text: 'Filtrar por esta columna', classes: 'sr-only' }\"\n [classes]=\"selectable.classes ? selectable.classes : 'c-select--sm w-full'\"\n [formGroupClasses]=\"selectable.formGroupClasses ? selectable.formGroupClasses : '-mt-sm mb-0'\"\n [name]=\"selectable.name\"\n [items]=\"getItemSelectOptions(selectable)\"\n [disabled]=\"selectable.disabled\"\n [describedBy]=\"getIdHeaderSelect(iHead)\"\n\n [(ngModel)]=\"item.valueSelect\" (ngModelChange)=\"handleInputSearch(item)\"\n\n [role]=\"selectable.role\"\n [ariaLabel]=\"selectable.ariaLabel\"\n [ariaDescribedBy]=\"selectable.ariaDescribedBy\"\n [ariaLabelledBy]=\"selectable.ariaLabelledBy\"\n [ariaHidden]=\"selectable.ariaHidden\"\n [ariaDisabled]=\"selectable.ariaDisabled\"\n [ariaControls]=\"selectable.ariaControls\"\n [ariaCurrent]=\"selectable.ariaCurrent\"\n [ariaLive]=\"selectable.ariaLive\"\n [ariaExpanded]=\"selectable.ariaExpanded\"\n [ariaErrorMessage]=\"selectable.ariaErrorMessage\"\n [ariaHasPopup]=\"selectable.ariaHasPopup\"\n [tabindex]=\"selectable.tabindex\">\n </desy-select>\n </ng-template>\n </ng-container>\n\n <div *ngIf=\"item.hasSelect && item.hasFilter\" class=\"pb-sm\"></div>\n\n <desy-search-bar *ngIf=\"item.hasFilter\"\n [(ngModel)]=\"item.valueFilter\" [ngModelOptions]=\"{standalone: true}\"\n (clickEvent)=\"handleInputSearch(item)\"\n (ngModelChange)=\"handleInputSearch(item)\"\n labelText=\"Buscar en esta columna\"\n [id]=\"getIdHeaderFilter(iHead)\"\n placeholder=\"Buscar\"\n [classes]=\"['c-input--sm', item.filterClasses] | makeHtmlList\"\n buttonClasses=\"m-xs p-0.5 text-xs\"\n [describedBy]=\"getIdHeader(iHead)\"> </desy-search-bar>\n </td>\n </tr>\n\n\n <tr *ngFor=\"let row of getVisibleRows(); index as iRow\" class=\"border-t border-b border-neutral-base hover:bg-neutral-lighter\"\n [desyRow]=\"row\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\" >\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"row.checked\" (ngModelChange)=\"handleCheckboxChange(row)\"\n [id]=\"getIdRowCheckbox(iRow)\"\n [name]=\"getIdRowCheckbox(iRow)\"\n [attr.aria-label]=\"'Fila ' + iRow\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iRow)\">Selecciona fila {{ iRow }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of row.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [attr.role]=\"cell.role ? cell.role : null\"\n [attr.aria-label]=\"cell.ariaLabel ? cell.ariaLabel : null\"\n [attr.aria-describedby]=\"cell.ariaDescribedBy ? cell.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"cell.ariaLabelledBy ? cell.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"cell.ariaHidden ? cell.ariaHidden : null\"\n [attr.aria-disabled]=\"cell.ariaDisabled ? cell.ariaDisabled : null\"\n [attr.aria-controls]=\"cell.ariaControls ? cell.ariaControls : null\"\n [attr.aria-current]=\"cell.ariaCurrent ? cell.ariaCurrent : null\"\n [attr.aria-live]=\"cell.ariaLive ? cell.ariaLive : null\"\n [attr.aria-expanded]=\"cell.ariaExpanded ? cell.ariaExpanded : null\"\n [attr.aria-errormessage]=\"cell.ariaErrorMessage ? cell.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"cell.ariaHasPopup ? cell.ariaHasPopup : null\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : null\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [attr.role]=\"cell.role ? cell.role : null\"\n [attr.aria-label]=\"cell.ariaLabel ? cell.ariaLabel : null\"\n [attr.aria-describedby]=\"cell.ariaDescribedBy ? cell.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"cell.ariaLabelledBy ? cell.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"cell.ariaHidden ? cell.ariaHidden : null\"\n [attr.aria-disabled]=\"cell.ariaDisabled ? cell.ariaDisabled : null\"\n [attr.aria-controls]=\"cell.ariaControls ? cell.ariaControls : null\"\n [attr.aria-current]=\"cell.ariaCurrent ? cell.ariaCurrent : null\"\n [attr.aria-live]=\"cell.ariaLive ? cell.ariaLive : null\"\n [attr.aria-expanded]=\"cell.ariaExpanded ? cell.ariaExpanded : null\"\n [attr.aria-errormessage]=\"cell.ariaErrorMessage ? cell.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"cell.ariaHasPopup ? cell.ariaHasPopup : null\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tbody>\n \n <tfoot *ngIf=\"getFooterCells()\">\n <tr *ngFor=\"let foot of getFooterCells(); index as iFooter\" class=\"border-t-2 border-b border-neutral-base hover:bg-neutral-lighter\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"foot.checked\" (ngModelChange)=\"handleCheckboxChange(foot)\"\n [id]=\"getIdRowCheckbox(iFooter)\"\n [name]=\"getIdRowCheckbox(iFooter)\"\n [attr.aria-label]=\"'Fila ' + iFooter\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iFooter)\">Selecciona fila {{ iFooter }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of foot.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [attr.role]=\"cell.role ? cell.role : null\"\n [attr.aria-label]=\"cell.ariaLabel ? cell.ariaLabel : null\"\n [attr.aria-describedby]=\"cell.ariaDescribedBy ? cell.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"cell.ariaLabelledBy ? cell.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"cell.ariaHidden ? cell.ariaHidden : null\"\n [attr.aria-disabled]=\"cell.ariaDisabled ? cell.ariaDisabled : null\"\n [attr.aria-controls]=\"cell.ariaControls ? cell.ariaControls : null\"\n [attr.aria-current]=\"cell.ariaCurrent ? cell.ariaCurrent : null\"\n [attr.aria-live]=\"cell.ariaLive ? cell.ariaLive : null\"\n [attr.aria-expanded]=\"cell.ariaExpanded ? cell.ariaExpanded : null\"\n [attr.aria-errormessage]=\"cell.ariaErrorMessage ? cell.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"cell.ariaHasPopup ? cell.ariaHasPopup : null\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : null\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [attr.role]=\"cell.role ? cell.role : null\"\n [attr.aria-label]=\"cell.ariaLabel ? cell.ariaLabel : null\"\n [attr.aria-describedby]=\"cell.ariaDescribedBy ? cell.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"cell.ariaLabelledBy ? cell.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"cell.ariaHidden ? cell.ariaHidden : null\"\n [attr.aria-disabled]=\"cell.ariaDisabled ? cell.ariaDisabled : null\"\n [attr.aria-controls]=\"cell.ariaControls ? cell.ariaControls : null\"\n [attr.aria-current]=\"cell.ariaCurrent ? cell.ariaCurrent : null\"\n [attr.aria-live]=\"cell.ariaLive ? cell.ariaLive : null\"\n [attr.aria-expanded]=\"cell.ariaExpanded ? cell.ariaExpanded : null\"\n [attr.aria-errormessage]=\"cell.ariaErrorMessage ? cell.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"cell.ariaHasPopup ? cell.ariaHasPopup : null\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tfoot>\n </table>\n</ng-template>\n\n<div *ngIf=\"wrapper; else tableContent\" [class]=\"wrapper.classes\">\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.CustomInnerContentDirective, selector: "[desyCustomInnerContent]", inputs: ["desyCustomInnerContent"] }, { kind: "component", type: i4.SelectComponent, selector: "desy-select", inputs: ["name", "items", "describedBy", "formGroupClasses", "classes"] }, { kind: "component", type: i5.SearchBarComponent, selector: "desy-search-bar", inputs: ["describedBy", "classes", "buttonClasses", "placeholder"], outputs: ["clickEvent"] }, { kind: "directive", type: i6.FocusClickedCellDirective, selector: "[desyFocusClickedCell]" }, { kind: "directive", type: i7.CellDirective, selector: "[desyCell]", inputs: ["row", "rowIndex", "columnIndex"] }, { kind: "directive", type: i8.RowDirective, selector: "[desyRow]", inputs: ["desyRow"] }, { kind: "pipe", type: i9.MakeHtmlListPipe, name: "makeHtmlList" }] }); }
265
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableAdvancedComponent, selector: "desy-table-advanced", inputs: { rows: "rows", head: "head", foot: "foot", caption: "caption", captionClasses: "captionClasses", firstCellIsHeader: "firstCellIsHeader", hasCheckboxes: "hasCheckboxes", idPrefix: "idPrefix", classes: "classes", checkboxClasses: "checkboxClasses", id: "id", wrapper: "wrapper" }, outputs: { rowsChange: "rowsChange", rowsChecked: "rowsChecked", recalculateTable: "recalculateTable" }, queries: [{ propertyName: "captionComponent", predicate: TableCaptionComponent }, { propertyName: "headerComponent", predicate: TableAdvancedHeaderComponent }, { propertyName: "footerComponent", predicate: TableAdvancedFooterComponent }, { propertyName: "rowComponentList", predicate: TableAdvancedRowComponent }], viewQueries: [{ propertyName: "rowData", predicate: RowDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #tableContent>\n <table role=\"grid\"\n [class]=\"['c-table-advanced border-t-2 border-b-2 border-neutral-base', classes] | makeHtmlList\"\n [attr.id]=\"id ? id : null\"\n [desyAppAccessibility]=\"this\">\n <caption *ngIf=\"caption || captionComponent\" [class]=\"getCaptionClass()\">\n <ng-container *desyCustomInnerContent=\"{ component: captionComponent, text: caption ? caption : null }\"></ng-container>\n </caption>\n <thead *ngIf=\"getHeaderCells()\">\n <tr class=\"border-t border-neutral-base divide-x divide-neutral-base\">\n <th *ngIf=\"hasCheckboxes\" scope=\"col\" [class]=\"['align-top px-base py-xs', 'w-16', checkboxClasses] | makeHtmlList\">\n <span class=\"sr-only\">Seleccionar fila</span>\n </th>\n <th scope=\"col\" *ngFor=\"let item of getHeaderCells(); index as iHeader\" [id]=\"getIdHeader(iHeader)\"\n [attr.aria-sort]=\"item.orderBy ? getStringOrderBy(item.orderBy) : null\"\n [class]=\"['align-top px-base py-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\"\n [attr.colspan]=\"item.colspan ? item.colspan : null\"\n [attr.rowspan]=\"item.rowspan ? item.rowspan : null\"\n [desyAppAccessibility]=\"item\">\n\n <span *ngIf=\"item.orderBy\" class=\"inline-block relative\" (click)=\"handleSortByColumn(iHeader,$event)\" (keydown.enter)=\"handleSortByColumn(iHeader,$event)\" (keydown.space)=\"handleSortByColumn(iHeader,$event)\" desyFocusClickedCell\n [attr.tabindex]=\"item.orderBy ? -1 : null\"\n [attr.role]=\"item.orderBy ? 'button' : null\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n <span class=\"c-table-advanced__order\" *ngIf=\"item.orderBy\">\n <span class=\"sr-only\">Pulsa para ordenar por esta columna</span>\n <span class=\"c-table-advanced__ascending\" *ngIf=\"item.orderBy === orderByType.asc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M112.07 37.93l-35-35a10 10 0 00-14.14 0l-35 35a10 10 0 0014.14 14.14l13.66-13.66A2.5 2.5 0 0160 40.18V130a10 10 0 0020 0V40.18a2.5 2.5 0 014.27-1.77l13.66 13.66a10 10 0 0014.14-14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__descending\" *ngIf=\"item.orderBy === orderByType.desc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M27.93 102.07l35 35a10 10 0 0014.14 0l35-35a10 10 0 00-14.14-14.14l-13.66 13.66A2.5 2.5 0 0180 99.82V10a10 10 0 00-20 0v89.82a2.5 2.5 0 01-4.27 1.77L42.07 87.93a10 10 0 00-14.14 14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__none\" *ngIf=\"item.orderBy === orderByType.none\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" class=\"text-neutral-dark\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M94.7 97.2l-17.2 17.19V25.61L94.7 42.8a7.5 7.5 0 0010.6-10.6l-30-30a7.49 7.49 0 00-10.6 0l-30 30a7.5 7.5 0 0010.6 10.6l17.2-17.19v88.78L45.3 97.2a7.5 7.5 0 10-10.6 10.6l30 30a7.48 7.48 0 0010.6 0l30-30a7.5 7.5 0 00-10.6-10.6z\" fill=\"currentColor\"/></svg>\n </span>\n </span>\n </span>\n\n <span *ngIf=\"!item.orderBy\" class=\"inline-block relative\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n </span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr class=\"divide-x divide-neutral-base\" *ngIf=\"hasFilters()\">\n <td *ngIf=\"hasCheckboxes\" [ngClass]=\"checkboxClasses\"></td>\n <td tabindex=\"-1\" *ngFor=\"let item of getHeaderCells(); index as iHead\" desyFocusClickedCell\n [class]=\"['align-top px-base pb-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\">\n <ng-container *ngIf=\"item.hasSelect && getSelectForItem(item) !== null\">\n <ng-container *ngTemplateOutlet=\"tableSelect; context: {selectable: getSelectForItem(item)}\"></ng-container>\n <ng-template #tableSelect let-selectable=\"selectable\">\n <desy-select [id]=\"getIdHeaderSelect(iHead)\"\n [labelData]=\"{ text: 'Filtrar por esta columna', classes: 'sr-only' }\"\n [classes]=\"selectable.classes ? selectable.classes : 'c-select--sm w-full'\"\n [formGroupClasses]=\"selectable.formGroupClasses ? selectable.formGroupClasses : '-mt-sm mb-0'\"\n [name]=\"selectable.name\"\n [items]=\"getItemSelectOptions(selectable)\"\n [disabled]=\"selectable.disabled\"\n [describedBy]=\"getIdHeaderSelect(iHead)\"\n\n [(ngModel)]=\"item.valueSelect\" (ngModelChange)=\"handleInputSearch(item)\"\n\n [role]=\"selectable.role\"\n [ariaLabel]=\"selectable.ariaLabel\"\n [ariaDescribedBy]=\"selectable.ariaDescribedBy\"\n [ariaLabelledBy]=\"selectable.ariaLabelledBy\"\n [ariaHidden]=\"selectable.ariaHidden\"\n [ariaDisabled]=\"selectable.ariaDisabled\"\n [ariaControls]=\"selectable.ariaControls\"\n [ariaCurrent]=\"selectable.ariaCurrent\"\n [ariaLive]=\"selectable.ariaLive\"\n [ariaExpanded]=\"selectable.ariaExpanded\"\n [ariaErrorMessage]=\"selectable.ariaErrorMessage\"\n [ariaHasPopup]=\"selectable.ariaHasPopup\"\n [tabindex]=\"selectable.tabindex\">\n </desy-select>\n </ng-template>\n </ng-container>\n\n <div *ngIf=\"item.hasSelect && item.hasFilter\" class=\"pb-sm\"></div>\n\n <desy-search-bar *ngIf=\"item.hasFilter\"\n [(ngModel)]=\"item.valueFilter\" [ngModelOptions]=\"{standalone: true}\"\n (clickEvent)=\"handleInputSearch(item)\"\n (ngModelChange)=\"handleInputSearch(item)\"\n labelText=\"Buscar en esta columna\"\n [id]=\"getIdHeaderFilter(iHead)\"\n placeholder=\"Buscar\"\n [classes]=\"['c-input--sm', item.filterClasses] | makeHtmlList\"\n buttonClasses=\"m-xs p-0.5 text-xs\"\n [describedBy]=\"getIdHeader(iHead)\"> </desy-search-bar>\n </td>\n </tr>\n\n\n <tr *ngFor=\"let row of getVisibleRows(); index as iRow\" class=\"border-t border-b border-neutral-base hover:bg-neutral-lighter\"\n [desyRow]=\"row\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\" >\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"row.checked\" (ngModelChange)=\"handleCheckboxChange(row)\"\n [id]=\"getIdRowCheckbox(iRow)\"\n [name]=\"getIdRowCheckbox(iRow)\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iRow)\">Selecciona fila {{ iRow }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of row.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tbody>\n \n <tfoot *ngIf=\"getFooterCells()\">\n <tr *ngFor=\"let foot of getFooterCells(); index as iFooter\" class=\"border-t-2 border-b border-neutral-base hover:bg-neutral-lighter\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"foot.checked\" (ngModelChange)=\"handleCheckboxChange(foot)\"\n [id]=\"getIdRowCheckbox(iFooter)\"\n [name]=\"getIdRowCheckbox(iFooter)\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iFooter)\">Selecciona fila {{ iFooter }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of foot.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tfoot>\n </table>\n</ng-template>\n\n<div *ngIf=\"wrapper; else tableContent\" [class]=\"wrapper.classes\">\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.CustomInnerContentDirective, selector: "[desyCustomInnerContent]", inputs: ["desyCustomInnerContent"] }, { kind: "directive", type: i4.AccessibilityDirective, selector: "[desyAppAccessibility]", inputs: ["desyAppAccessibility"] }, { kind: "component", type: i5.SelectComponent, selector: "desy-select", inputs: ["name", "items", "describedBy", "formGroupClasses", "classes"] }, { kind: "component", type: i6.SearchBarComponent, selector: "desy-search-bar", inputs: ["describedBy", "classes", "buttonClasses", "placeholder"], outputs: ["clickEvent"] }, { kind: "directive", type: i7.FocusClickedCellDirective, selector: "[desyFocusClickedCell]" }, { kind: "directive", type: i8.CellDirective, selector: "[desyCell]", inputs: ["row", "rowIndex", "columnIndex"] }, { kind: "directive", type: i9.RowDirective, selector: "[desyRow]", inputs: ["desyRow"] }, { kind: "pipe", type: i10.MakeHtmlListPipe, name: "makeHtmlList" }] }); }
266
266
  }
267
267
  __decorate([
268
268
  DesyContentChild(),
@@ -274,7 +274,7 @@ __decorate([
274
274
  ], TableAdvancedComponent.prototype, "headerComponent", void 0);
275
275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableAdvancedComponent, decorators: [{
276
276
  type: Component,
277
- args: [{ selector: 'desy-table-advanced', template: "<ng-template #tableContent>\n <table role=\"grid\"\n [class]=\"['c-table-advanced border-t-2 border-b-2 border-neutral-base', classes] | makeHtmlList\"\n [attr.id]=\"id ? id : null\"\n [attr.role]=\"role ? role : null\"\n [attr.aria-label]=\"ariaLabel ? ariaLabel : null\"\n [attr.aria-describedby]=\"ariaDescribedBy ? ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"ariaLabelledBy ? ariaLabelledBy : null\"\n [attr.aria-hidden]=\"ariaHidden ? ariaHidden : null\"\n [attr.aria-disabled]=\"ariaDisabled ? ariaDisabled : null\"\n [attr.aria-controls]=\"ariaControls ? ariaControls : null\"\n [attr.aria-current]=\"ariaCurrent ? ariaCurrent : null\"\n [attr.aria-live]=\"ariaLive ? ariaLive : null\"\n [attr.aria-expanded]=\"ariaExpanded ? ariaExpanded : null\"\n [attr.aria-errormessage]=\"ariaErrorMessage ? ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"ariaHasPopup ? ariaHasPopup : null\"\n [attr.tabindex]=\"tabindex ? tabindex : null\">\n <caption *ngIf=\"caption || captionComponent\" [class]=\"getCaptionClass()\">\n <ng-container *desyCustomInnerContent=\"{ component: captionComponent, text: caption ? caption : null }\"></ng-container>\n </caption>\n <thead *ngIf=\"getHeaderCells()\">\n <tr class=\"border-t border-neutral-base divide-x divide-neutral-base\">\n <th *ngIf=\"hasCheckboxes\" scope=\"col\" [class]=\"['align-top px-base py-xs', 'w-16', checkboxClasses] | makeHtmlList\">\n <span class=\"sr-only\">Seleccionar fila</span>\n </th>\n <th scope=\"col\" *ngFor=\"let item of getHeaderCells(); index as iHeader\" [id]=\"getIdHeader(iHeader)\"\n [attr.aria-sort]=\"item.orderBy ? getStringOrderBy(item.orderBy) : null\"\n [class]=\"['align-top px-base py-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\"\n [attr.colspan]=\"item.colspan ? item.colspan : null\"\n [attr.rowspan]=\"item.rowspan ? item.rowspan : null\"\n [attr.role]=\"item.role ? item.role : null\"\n [attr.aria-label]=\"item.ariaLabel ? item.ariaLabel : null\"\n [attr.aria-describedby]=\"item.ariaDescribedBy ? item.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"item.ariaLabelledBy ? item.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"item.ariaHidden ? item.ariaHidden : null\"\n [attr.aria-disabled]=\"item.ariaDisabled ? item.ariaDisabled : null\"\n [attr.aria-controls]=\"item.ariaControls ? item.ariaControls : null\"\n [attr.aria-current]=\"item.ariaCurrent ? item.ariaCurrent : null\"\n [attr.aria-live]=\"item.ariaLive ? item.ariaLive : null\"\n [attr.aria-expanded]=\"item.ariaExpanded ? item.ariaExpanded : null\"\n [attr.aria-errormessage]=\"item.ariaErrorMessage ? item.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"item.ariaHasPopup ? item.ariaHasPopup : null\"\n [attr.tabindex]=\"item.tabindex ? item.tabindex : null\">\n\n <span *ngIf=\"item.orderBy\" class=\"inline-block relative\" (click)=\"handleSortByColumn(iHeader)\" desyFocusClickedCell\n [attr.tabindex]=\"item.orderBy ? -1 : null\"\n [attr.role]=\"item.orderBy ? 'button' : null\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n <span class=\"c-table-advanced__order\" *ngIf=\"item.orderBy\">\n <span class=\"sr-only\">Pulsa para ordenar por esta columna</span>\n <span class=\"c-table-advanced__ascending\" *ngIf=\"item.orderBy === orderByType.asc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M112.07 37.93l-35-35a10 10 0 00-14.14 0l-35 35a10 10 0 0014.14 14.14l13.66-13.66A2.5 2.5 0 0160 40.18V130a10 10 0 0020 0V40.18a2.5 2.5 0 014.27-1.77l13.66 13.66a10 10 0 0014.14-14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__descending\" *ngIf=\"item.orderBy === orderByType.desc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M27.93 102.07l35 35a10 10 0 0014.14 0l35-35a10 10 0 00-14.14-14.14l-13.66 13.66A2.5 2.5 0 0180 99.82V10a10 10 0 00-20 0v89.82a2.5 2.5 0 01-4.27 1.77L42.07 87.93a10 10 0 00-14.14 14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__none\" *ngIf=\"item.orderBy === orderByType.none\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" class=\"text-neutral-base\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M94.7 97.2l-17.2 17.19V25.61L94.7 42.8a7.5 7.5 0 0010.6-10.6l-30-30a7.49 7.49 0 00-10.6 0l-30 30a7.5 7.5 0 0010.6 10.6l17.2-17.19v88.78L45.3 97.2a7.5 7.5 0 10-10.6 10.6l30 30a7.48 7.48 0 0010.6 0l30-30a7.5 7.5 0 00-10.6-10.6z\" fill=\"currentColor\"/></svg>\n </span>\n </span>\n </span>\n\n <span *ngIf=\"!item.orderBy\" class=\"inline-block relative\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n </span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr class=\"divide-x divide-neutral-base\" *ngIf=\"hasFilters()\">\n <td *ngIf=\"hasCheckboxes\" [ngClass]=\"checkboxClasses\"></td>\n <td tabindex=\"-1\" *ngFor=\"let item of getHeaderCells(); index as iHead\" desyFocusClickedCell\n [class]=\"['align-top px-base pb-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\">\n <ng-container *ngIf=\"item.hasSelect && getSelectForItem(item) !== null\">\n <ng-container *ngTemplateOutlet=\"tableSelect; context: {selectable: getSelectForItem(item)}\"></ng-container>\n <ng-template #tableSelect let-selectable=\"selectable\">\n <desy-select [id]=\"getIdHeaderSelect(iHead)\"\n [labelData]=\"{ text: 'Filtrar por esta columna', classes: 'sr-only' }\"\n [classes]=\"selectable.classes ? selectable.classes : 'c-select--sm w-full'\"\n [formGroupClasses]=\"selectable.formGroupClasses ? selectable.formGroupClasses : '-mt-sm mb-0'\"\n [name]=\"selectable.name\"\n [items]=\"getItemSelectOptions(selectable)\"\n [disabled]=\"selectable.disabled\"\n [describedBy]=\"getIdHeaderSelect(iHead)\"\n\n [(ngModel)]=\"item.valueSelect\" (ngModelChange)=\"handleInputSearch(item)\"\n\n [role]=\"selectable.role\"\n [ariaLabel]=\"selectable.ariaLabel\"\n [ariaDescribedBy]=\"selectable.ariaDescribedBy\"\n [ariaLabelledBy]=\"selectable.ariaLabelledBy\"\n [ariaHidden]=\"selectable.ariaHidden\"\n [ariaDisabled]=\"selectable.ariaDisabled\"\n [ariaControls]=\"selectable.ariaControls\"\n [ariaCurrent]=\"selectable.ariaCurrent\"\n [ariaLive]=\"selectable.ariaLive\"\n [ariaExpanded]=\"selectable.ariaExpanded\"\n [ariaErrorMessage]=\"selectable.ariaErrorMessage\"\n [ariaHasPopup]=\"selectable.ariaHasPopup\"\n [tabindex]=\"selectable.tabindex\">\n </desy-select>\n </ng-template>\n </ng-container>\n\n <div *ngIf=\"item.hasSelect && item.hasFilter\" class=\"pb-sm\"></div>\n\n <desy-search-bar *ngIf=\"item.hasFilter\"\n [(ngModel)]=\"item.valueFilter\" [ngModelOptions]=\"{standalone: true}\"\n (clickEvent)=\"handleInputSearch(item)\"\n (ngModelChange)=\"handleInputSearch(item)\"\n labelText=\"Buscar en esta columna\"\n [id]=\"getIdHeaderFilter(iHead)\"\n placeholder=\"Buscar\"\n [classes]=\"['c-input--sm', item.filterClasses] | makeHtmlList\"\n buttonClasses=\"m-xs p-0.5 text-xs\"\n [describedBy]=\"getIdHeader(iHead)\"> </desy-search-bar>\n </td>\n </tr>\n\n\n <tr *ngFor=\"let row of getVisibleRows(); index as iRow\" class=\"border-t border-b border-neutral-base hover:bg-neutral-lighter\"\n [desyRow]=\"row\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\" >\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"row.checked\" (ngModelChange)=\"handleCheckboxChange(row)\"\n [id]=\"getIdRowCheckbox(iRow)\"\n [name]=\"getIdRowCheckbox(iRow)\"\n [attr.aria-label]=\"'Fila ' + iRow\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iRow)\">Selecciona fila {{ iRow }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of row.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [attr.role]=\"cell.role ? cell.role : null\"\n [attr.aria-label]=\"cell.ariaLabel ? cell.ariaLabel : null\"\n [attr.aria-describedby]=\"cell.ariaDescribedBy ? cell.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"cell.ariaLabelledBy ? cell.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"cell.ariaHidden ? cell.ariaHidden : null\"\n [attr.aria-disabled]=\"cell.ariaDisabled ? cell.ariaDisabled : null\"\n [attr.aria-controls]=\"cell.ariaControls ? cell.ariaControls : null\"\n [attr.aria-current]=\"cell.ariaCurrent ? cell.ariaCurrent : null\"\n [attr.aria-live]=\"cell.ariaLive ? cell.ariaLive : null\"\n [attr.aria-expanded]=\"cell.ariaExpanded ? cell.ariaExpanded : null\"\n [attr.aria-errormessage]=\"cell.ariaErrorMessage ? cell.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"cell.ariaHasPopup ? cell.ariaHasPopup : null\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : null\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [attr.role]=\"cell.role ? cell.role : null\"\n [attr.aria-label]=\"cell.ariaLabel ? cell.ariaLabel : null\"\n [attr.aria-describedby]=\"cell.ariaDescribedBy ? cell.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"cell.ariaLabelledBy ? cell.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"cell.ariaHidden ? cell.ariaHidden : null\"\n [attr.aria-disabled]=\"cell.ariaDisabled ? cell.ariaDisabled : null\"\n [attr.aria-controls]=\"cell.ariaControls ? cell.ariaControls : null\"\n [attr.aria-current]=\"cell.ariaCurrent ? cell.ariaCurrent : null\"\n [attr.aria-live]=\"cell.ariaLive ? cell.ariaLive : null\"\n [attr.aria-expanded]=\"cell.ariaExpanded ? cell.ariaExpanded : null\"\n [attr.aria-errormessage]=\"cell.ariaErrorMessage ? cell.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"cell.ariaHasPopup ? cell.ariaHasPopup : null\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tbody>\n \n <tfoot *ngIf=\"getFooterCells()\">\n <tr *ngFor=\"let foot of getFooterCells(); index as iFooter\" class=\"border-t-2 border-b border-neutral-base hover:bg-neutral-lighter\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"foot.checked\" (ngModelChange)=\"handleCheckboxChange(foot)\"\n [id]=\"getIdRowCheckbox(iFooter)\"\n [name]=\"getIdRowCheckbox(iFooter)\"\n [attr.aria-label]=\"'Fila ' + iFooter\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iFooter)\">Selecciona fila {{ iFooter }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of foot.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [attr.role]=\"cell.role ? cell.role : null\"\n [attr.aria-label]=\"cell.ariaLabel ? cell.ariaLabel : null\"\n [attr.aria-describedby]=\"cell.ariaDescribedBy ? cell.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"cell.ariaLabelledBy ? cell.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"cell.ariaHidden ? cell.ariaHidden : null\"\n [attr.aria-disabled]=\"cell.ariaDisabled ? cell.ariaDisabled : null\"\n [attr.aria-controls]=\"cell.ariaControls ? cell.ariaControls : null\"\n [attr.aria-current]=\"cell.ariaCurrent ? cell.ariaCurrent : null\"\n [attr.aria-live]=\"cell.ariaLive ? cell.ariaLive : null\"\n [attr.aria-expanded]=\"cell.ariaExpanded ? cell.ariaExpanded : null\"\n [attr.aria-errormessage]=\"cell.ariaErrorMessage ? cell.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"cell.ariaHasPopup ? cell.ariaHasPopup : null\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : null\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [attr.role]=\"cell.role ? cell.role : null\"\n [attr.aria-label]=\"cell.ariaLabel ? cell.ariaLabel : null\"\n [attr.aria-describedby]=\"cell.ariaDescribedBy ? cell.ariaDescribedBy : null\"\n [attr.aria-labelledby]=\"cell.ariaLabelledBy ? cell.ariaLabelledBy : null\"\n [attr.aria-hidden]=\"cell.ariaHidden ? cell.ariaHidden : null\"\n [attr.aria-disabled]=\"cell.ariaDisabled ? cell.ariaDisabled : null\"\n [attr.aria-controls]=\"cell.ariaControls ? cell.ariaControls : null\"\n [attr.aria-current]=\"cell.ariaCurrent ? cell.ariaCurrent : null\"\n [attr.aria-live]=\"cell.ariaLive ? cell.ariaLive : null\"\n [attr.aria-expanded]=\"cell.ariaExpanded ? cell.ariaExpanded : null\"\n [attr.aria-errormessage]=\"cell.ariaErrorMessage ? cell.ariaErrorMessage : null\"\n [attr.aria-haspopup]=\"cell.ariaHasPopup ? cell.ariaHasPopup : null\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tfoot>\n </table>\n</ng-template>\n\n<div *ngIf=\"wrapper; else tableContent\" [class]=\"wrapper.classes\">\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\n</div>\n" }]
277
+ args: [{ selector: 'desy-table-advanced', template: "<ng-template #tableContent>\n <table role=\"grid\"\n [class]=\"['c-table-advanced border-t-2 border-b-2 border-neutral-base', classes] | makeHtmlList\"\n [attr.id]=\"id ? id : null\"\n [desyAppAccessibility]=\"this\">\n <caption *ngIf=\"caption || captionComponent\" [class]=\"getCaptionClass()\">\n <ng-container *desyCustomInnerContent=\"{ component: captionComponent, text: caption ? caption : null }\"></ng-container>\n </caption>\n <thead *ngIf=\"getHeaderCells()\">\n <tr class=\"border-t border-neutral-base divide-x divide-neutral-base\">\n <th *ngIf=\"hasCheckboxes\" scope=\"col\" [class]=\"['align-top px-base py-xs', 'w-16', checkboxClasses] | makeHtmlList\">\n <span class=\"sr-only\">Seleccionar fila</span>\n </th>\n <th scope=\"col\" *ngFor=\"let item of getHeaderCells(); index as iHeader\" [id]=\"getIdHeader(iHeader)\"\n [attr.aria-sort]=\"item.orderBy ? getStringOrderBy(item.orderBy) : null\"\n [class]=\"['align-top px-base py-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\"\n [attr.colspan]=\"item.colspan ? item.colspan : null\"\n [attr.rowspan]=\"item.rowspan ? item.rowspan : null\"\n [desyAppAccessibility]=\"item\">\n\n <span *ngIf=\"item.orderBy\" class=\"inline-block relative\" (click)=\"handleSortByColumn(iHeader,$event)\" (keydown.enter)=\"handleSortByColumn(iHeader,$event)\" (keydown.space)=\"handleSortByColumn(iHeader,$event)\" desyFocusClickedCell\n [attr.tabindex]=\"item.orderBy ? -1 : null\"\n [attr.role]=\"item.orderBy ? 'button' : null\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n <span class=\"c-table-advanced__order\" *ngIf=\"item.orderBy\">\n <span class=\"sr-only\">Pulsa para ordenar por esta columna</span>\n <span class=\"c-table-advanced__ascending\" *ngIf=\"item.orderBy === orderByType.asc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M112.07 37.93l-35-35a10 10 0 00-14.14 0l-35 35a10 10 0 0014.14 14.14l13.66-13.66A2.5 2.5 0 0160 40.18V130a10 10 0 0020 0V40.18a2.5 2.5 0 014.27-1.77l13.66 13.66a10 10 0 0014.14-14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__descending\" *ngIf=\"item.orderBy === orderByType.desc\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M27.93 102.07l35 35a10 10 0 0014.14 0l35-35a10 10 0 00-14.14-14.14l-13.66 13.66A2.5 2.5 0 0180 99.82V10a10 10 0 00-20 0v89.82a2.5 2.5 0 01-4.27 1.77L42.07 87.93a10 10 0 00-14.14 14.14z\" fill=\"currentColor\"/></svg>\n </span>\n <span class=\"c-table-advanced__none\" *ngIf=\"item.orderBy === orderByType.none\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 140 140\" class=\"text-neutral-dark\" aria-hidden=\"true\" width=\"1em\" height=\"1em\"><path d=\"M94.7 97.2l-17.2 17.19V25.61L94.7 42.8a7.5 7.5 0 0010.6-10.6l-30-30a7.49 7.49 0 00-10.6 0l-30 30a7.5 7.5 0 0010.6 10.6l17.2-17.19v88.78L45.3 97.2a7.5 7.5 0 10-10.6 10.6l30 30a7.48 7.48 0 0010.6 0l30-30a7.5 7.5 0 00-10.6-10.6z\" fill=\"currentColor\"/></svg>\n </span>\n </span>\n </span>\n\n <span *ngIf=\"!item.orderBy\" class=\"inline-block relative\">\n <ng-container *ngIf=\"item.text\">{{item.text}}</ng-container>\n <ng-container *ngIf=\"item.contentComponent\">\n <ng-container *desyCustomInnerContent=\"{ component: item.contentComponent }\"></ng-container>\n </ng-container>\n </span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr class=\"divide-x divide-neutral-base\" *ngIf=\"hasFilters()\">\n <td *ngIf=\"hasCheckboxes\" [ngClass]=\"checkboxClasses\"></td>\n <td tabindex=\"-1\" *ngFor=\"let item of getHeaderCells(); index as iHead\" desyFocusClickedCell\n [class]=\"['align-top px-base pb-sm border-neutral-base border-b-0 text-left text-sm font-normal text-neutral-dark', item.classes] | makeHtmlList\">\n <ng-container *ngIf=\"item.hasSelect && getSelectForItem(item) !== null\">\n <ng-container *ngTemplateOutlet=\"tableSelect; context: {selectable: getSelectForItem(item)}\"></ng-container>\n <ng-template #tableSelect let-selectable=\"selectable\">\n <desy-select [id]=\"getIdHeaderSelect(iHead)\"\n [labelData]=\"{ text: 'Filtrar por esta columna', classes: 'sr-only' }\"\n [classes]=\"selectable.classes ? selectable.classes : 'c-select--sm w-full'\"\n [formGroupClasses]=\"selectable.formGroupClasses ? selectable.formGroupClasses : '-mt-sm mb-0'\"\n [name]=\"selectable.name\"\n [items]=\"getItemSelectOptions(selectable)\"\n [disabled]=\"selectable.disabled\"\n [describedBy]=\"getIdHeaderSelect(iHead)\"\n\n [(ngModel)]=\"item.valueSelect\" (ngModelChange)=\"handleInputSearch(item)\"\n\n [role]=\"selectable.role\"\n [ariaLabel]=\"selectable.ariaLabel\"\n [ariaDescribedBy]=\"selectable.ariaDescribedBy\"\n [ariaLabelledBy]=\"selectable.ariaLabelledBy\"\n [ariaHidden]=\"selectable.ariaHidden\"\n [ariaDisabled]=\"selectable.ariaDisabled\"\n [ariaControls]=\"selectable.ariaControls\"\n [ariaCurrent]=\"selectable.ariaCurrent\"\n [ariaLive]=\"selectable.ariaLive\"\n [ariaExpanded]=\"selectable.ariaExpanded\"\n [ariaErrorMessage]=\"selectable.ariaErrorMessage\"\n [ariaHasPopup]=\"selectable.ariaHasPopup\"\n [tabindex]=\"selectable.tabindex\">\n </desy-select>\n </ng-template>\n </ng-container>\n\n <div *ngIf=\"item.hasSelect && item.hasFilter\" class=\"pb-sm\"></div>\n\n <desy-search-bar *ngIf=\"item.hasFilter\"\n [(ngModel)]=\"item.valueFilter\" [ngModelOptions]=\"{standalone: true}\"\n (clickEvent)=\"handleInputSearch(item)\"\n (ngModelChange)=\"handleInputSearch(item)\"\n labelText=\"Buscar en esta columna\"\n [id]=\"getIdHeaderFilter(iHead)\"\n placeholder=\"Buscar\"\n [classes]=\"['c-input--sm', item.filterClasses] | makeHtmlList\"\n buttonClasses=\"m-xs p-0.5 text-xs\"\n [describedBy]=\"getIdHeader(iHead)\"> </desy-search-bar>\n </td>\n </tr>\n\n\n <tr *ngFor=\"let row of getVisibleRows(); index as iRow\" class=\"border-t border-b border-neutral-base hover:bg-neutral-lighter\"\n [desyRow]=\"row\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\" >\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"row.checked\" (ngModelChange)=\"handleCheckboxChange(row)\"\n [id]=\"getIdRowCheckbox(iRow)\"\n [name]=\"getIdRowCheckbox(iRow)\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iRow)\">Selecciona fila {{ iRow }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of row.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iRow\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tbody>\n \n <tfoot *ngIf=\"getFooterCells()\">\n <tr *ngFor=\"let foot of getFooterCells(); index as iFooter\" class=\"border-t-2 border-b border-neutral-base hover:bg-neutral-lighter\">\n <td *ngIf=\"hasCheckboxes\" desyFocusClickedCell [class]=\"['px-base py-sm', checkboxClasses] | makeHtmlList\"\n tabindex=\"-1\">\n <div class=\"c-checkboxes c-checkboxes--sm\">\n <div>\n <div class=\"relative flex items-start\">\n <div class=\"flex items-center mx-sm\">\n <input type=\"checkbox\" class=\"w-6 h-6 transition duration-150 ease-in-out border-black focus:border-black focus:shadow-outline-focus-input focus:ring-4 focus:ring-offset-0 focus:ring-warning-base disabled:bg-neutral-light disabled:border-neutral-base text-primary-base\"\n [(ngModel)]=\"foot.checked\" (ngModelChange)=\"handleCheckboxChange(foot)\"\n [id]=\"getIdRowCheckbox(iFooter)\"\n [name]=\"getIdRowCheckbox(iFooter)\">\n </div>\n <div class=\"pt-0.5 leading-5\">\n <label class=\"sr-only block text-sm -mt-1\" [for]=\"getIdRowCheckbox(iFooter)\">Selecciona fila {{ iFooter }}</label>\n </div>\n </div>\n </div>\n </div>\n </td>\n <ng-container *ngFor=\"let cell of foot.cellsList; first as isFirstCell; index as columnIndex\">\n <th *ngIf=\"firstCellIsHeader && isFirstCell; else elseTd\" scope=\"row\"\n [class]=\"['px-base py-xs border-neutral-base border-b-0 border-r text-left font-normal text-sm text-neutral-dark', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </th>\n <ng-template #elseTd>\n <td tabindex=\"-1\" desyFocusClickedCell\n [class]=\"['px-base py-sm', cell.classes] | makeHtmlList\"\n desyCell [row]=\"row\" [rowIndex]=\"iFooter\" [columnIndex]=\"columnIndex\"\n [attr.colspan]=\"cell.colspan ? cell.colspan : null\"\n [attr.rowspan]=\"cell.rowspan ? cell.rowspan : null\"\n [attr.id]=\"cell.id ? cell.id : null\"\n [desyAppAccessibility]=\"cell\"\n [attr.tabindex]=\"cell.tabindex ? cell.tabindex : -1\">\n <ng-container *desyCustomInnerContent=\"{ component: cell, html: cell.html, text: cell.text }\"></ng-container>\n </td>\n </ng-template>\n </ng-container>\n </tr>\n </tfoot>\n </table>\n</ng-template>\n\n<div *ngIf=\"wrapper; else tableContent\" [class]=\"wrapper.classes\">\n <ng-container *ngTemplateOutlet=\"tableContent\"></ng-container>\n</div>\n" }]
278
278
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { rows: [{
279
279
  type: Input
280
280
  }], head: [{
@@ -321,4 +321,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
321
321
  }], recalculateTable: [{
322
322
  type: Output
323
323
  }] } });
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYWR2YW5jZWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzeS1hbmd1bGFyL3NyYy9saWIvZGVzeS10YWJsZXMvY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC90YWJsZS1hZHZhbmNlZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXN5LWFuZ3VsYXIvc3JjL2xpYi9kZXN5LXRhYmxlcy9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkL3RhYmxlLWFkdmFuY2VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQXFCLE9BQU8sRUFBd0IsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVwRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUU1RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUM1RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7Ozs7Ozs7QUFPdEYsTUFBTSxPQUFPLHNCQUF1QixT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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMvaW50ZXJuYWwvU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IFNlbGVjdEl0ZW1EYXRhIH0gZnJvbSAnLi4vLi4vLi4vZGVzeS1mb3Jtcy9pbnRlcmZhY2VzL3NlbGVjdC1pdGVtLWRhdGEnO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9jb21wb25lbnRzJztcbmltcG9ydCB7IERlc3lDb250ZW50Q2hpbGQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZGVjb3JhdG9ycy9kZXN5LWNvbnRlbnQtY2hpbGQuZGVjb3JhdG9yJztcbmltcG9ydCB7IFNlYXJjaFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL3NlYXJjaC11dGlscyc7XG5pbXBvcnQgeyBDZWxsRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jZWxsLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBSb3dEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3Jvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSGVhZENlbGxNb2RlbERhdGEsIE9yZGVyQnksIFJvd0RhdGEsIFdyYXBwZXJEYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZWNhbGN1bGF0ZS10YWJsZS1wYXJhbXMnO1xuaW1wb3J0IHsgVGFibGVDYXB0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFibGUvY29tcG9uZW50cy90YWJsZS1jYXB0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi8uLi8uLi8uLi9kZXN5LWNvbW1vbnMvY29tcG9uZW50cy9jb250ZW50L2NvbnRlbnQuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWR2YW5jZWRGb290ZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWR2YW5jZWQtZm9vdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUFkdmFuY2VkSGVhZGVyQ2VsbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC1oZWFkZXItY2VsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBZHZhbmNlZEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWR2YW5jZWQtcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUFkdmFuY2VkU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkLXNlbGVjdC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkZXN5LXRhYmxlLWFkdmFuY2VkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLWFkdmFuY2VkLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUFkdmFuY2VkQ29tcG9uZW50IGV4dGVuZHMgQWNjZXNzaWJpbGl0eUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgX3Jvd3M6IFJvd0RhdGFbXTsgLy8gb3JpZ2luYWwgZGF0YVxuICBASW5wdXQoKVxuICBzZXQgcm93cyhyb3dzOiBSb3dEYXRhW10pIHtcbiAgICB0aGlzLl9yb3dzID0gcm93cztcbiAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKClcbiAgfVxuICBnZXQgcm93cygpOiBSb3dEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLl9yb3dzXG4gIH1cbiAgQElucHV0KCkgaGVhZDogSGVhZENlbGxNb2RlbERhdGFbXTtcbiAgQElucHV0KCkgZm9vdDogUm93RGF0YVtdO1xuXG4gIEBJbnB1dCgpIGNhcHRpb246IHN0cmluZztcbiAgQElucHV0KCkgY2FwdGlvbkNsYXNzZXM6IHN0cmluZztcbiAgQElucHV0KCkgZmlyc3RDZWxsSXNIZWFkZXI6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGhhc0NoZWNrYm94ZXM6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlkUHJlZml4OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNsYXNzZXM6IHN0cmluZztcbiAgQElucHV0KCkgY2hlY2tib3hDbGFzc2VzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHdyYXBwZXI6IFdyYXBwZXJEYXRhO1xuXG5cbiAgQERlc3lDb250ZW50Q2hpbGQoKVxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQ2FwdGlvbkNvbXBvbmVudCkgY2FwdGlvbkNvbXBvbmVudDogVGFibGVDYXB0aW9uQ29tcG9uZW50O1xuXG4gIEBEZXN5Q29udGVudENoaWxkKClcbiAgQENvbnRlbnRDaGlsZHJlbihUYWJsZUFkdmFuY2VkSGVhZGVyQ29tcG9uZW50KSBoZWFkZXJDb21wb25lbnQ6IFRhYmxlQWR2YW5jZWRIZWFkZXJDb21wb25lbnQ7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihUYWJsZUFkdmFuY2VkRm9vdGVyQ29tcG9uZW50KSBmb290ZXJDb21wb25lbnQ6IFF1ZXJ5TGlzdDxUYWJsZUFkdmFuY2VkRm9vdGVyQ29tcG9uZW50PjtcblxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQpIHJvd0NvbXBvbmVudExpc3Q6IFF1ZXJ5TGlzdDxUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50PjtcbiAgQFZpZXdDaGlsZHJlbihSb3dEaXJlY3RpdmUpIHJvd0RhdGE6IFF1ZXJ5TGlzdDxSb3dEaXJlY3RpdmU+O1xuXG4gIEBPdXRwdXQoKSByb3dzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcm93c0NoZWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZWNhbGN1bGF0ZVRhYmxlID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zPigpO1xuXG4gIHZpc2libGVSb3dzOiBSb3dEYXRhW10gfCBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50W107XG4gIG9yZGVyQnlUeXBlID0gT3JkZXJCeTtcbiAgaXNSZXNldDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHJpdmF0ZSByb3dzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucm93c1N1YnNjcmlwdGlvbiA9IHRoaXMucm93Q29tcG9uZW50TGlzdC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCkpXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5yb3dzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvd3NTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbW50c0ZvY3VzID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1t0YWJpbmRleF0nKTtcbiAgICBpZiAoZWxlbW50c0ZvY3VzKSB7XG4gICAgICBlbGVtbnRzRm9jdXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgfVxuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlRWxlbWVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNjYSBsYXMgZmlsYXMgdmlzaWJsZXMgdHJhcyByZWFsaXphcnNlIHVuYSBiw7pzcXVlZGEgbyB1bmEgb3JkZW5hY2nDs25cbiAgICovXG4gIHJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY2FsY3VsYXRlUGFyYW1zID0gdGhpcy5idWlsZFJlY2FsY3VsYXRlUGFyYW1zKCk7XG5cbiAgICAvLyBTaSBzZSBjYXB0dXJhIGVsIGV2ZW50byByZWNhbGN1bGF0ZVRhYmxlIHNlIGRlamEgYWwgdXN1YXJpbyBsYSByZXNwb25zYWJpbGlkYWQgZGUgZmlsdHJhciB5IG9yZGVuYXIgbG9zIGVsZW1lbnRvcy5cbiAgICBpZiAodGhpcy5yZWNhbGN1bGF0ZVRhYmxlLm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlY2FsY3VsYXRlVGFibGUuZW1pdChyZWNhbGN1bGF0ZVBhcmFtcyk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIFNlIGRlYmVuIG1vc3RyYXIgdG9kYXMgbGFzIGZpbGFzIHRlbXBvcmFsbWVudGUgcGFyYSBwb2RlciBhcGxpY2FyIGVsIGZpbHRybyB5IGxhIG9yZGVuYWNpw7NuIHNvYnJlIGVsIGNvbnRlbmlkbyBpbnNlcnRhZG9cbiAgICAgIHRoaXMudmlzaWJsZVJvd3MgPSB0aGlzLmdldFJvd3MoKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAvLyBTZSBhcGxpY2EgZWwgZmlsdHJvIHkgbGEgb3JkZW5hY2nDs25cbiAgICAgIGxldCByb3dEYXRhID0gdGhpcy5maWx0ZXJSb3dzKHJlY2FsY3VsYXRlUGFyYW1zLCB0aGlzLnJvd0RhdGEudG9BcnJheSgpKTtcbiAgICAgIHJvd0RhdGEgPSB0aGlzLnNvcnRSb3dzKHJlY2FsY3VsYXRlUGFyYW1zLCByb3dEYXRhKTtcbiAgICAgIHRoaXMudmlzaWJsZVJvd3MgPSByb3dEYXRhLm1hcChyID0+IHIuZGVzeVJvdykgYXMgUm93RGF0YVtdIHwgVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudFtdO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydXllIGxvcyBwYXLDoW1ldHJvcyBuZWNlc2FyaW9zIHBhcmEgcmVjYWxjdWxhciBsYSB0YWJsYSwgaW5kaWNhbmRvIGxvcyBmaWx0cm9zIHkgbGEgb3JkZW5hY2nDs25cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSZWNhbGN1bGF0ZVBhcmFtcygpOiBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgIHNvcnQ6IG51bGxcbiAgICB9O1xuXG4gICAgY29uc3QgaGVhZCA9IHRoaXMuZ2V0SGVhZGVyQ2VsbHMoKSBhcyAoSGVhZENlbGxNb2RlbERhdGEgfCBUYWJsZUFkdmFuY2VkSGVhZGVyQ2VsbENvbXBvbmVudClbXTtcbiAgICBpZiAoaGVhZCkge1xuICAgICAgaGVhZC5mb3JFYWNoKChoZWFkZXJDZWxsLCBoZWFkZXJDZWxsSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGhlYWRlckNlbGwuaGFzRmlsdGVyICYmIGhlYWRlckNlbGwuYWN0aXZlRmlsdGVyKSB7XG4gICAgICAgICAgcGFyYW1zLmZpbHRlcnMucHVzaCh7IGNvbHVtbkluZGV4OiBoZWFkZXJDZWxsSW5kZXgsIGZpbHRlclRleHQ6IGhlYWRlckNlbGwudmFsdWVGaWx0ZXIsIGlkZW50aWZpZXI6IGhlYWRlckNlbGwuaWRlbnRpZmllciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoZWFkZXJDZWxsLmhhc1NlbGVjdCAmJiBoZWFkZXJDZWxsLmFjdGl2ZVNlbGVjdCkge1xuICAgICAgICAgIHBhcmFtcy5maWx0ZXJzLnB1c2goeyBjb2x1bW5JbmRleDogaGVhZGVyQ2VsbEluZGV4LCBmaWx0ZXJUZXh0OiBoZWFkZXJDZWxsLnZhbHVlU2VsZWN0LCBpZGVudGlmaWVyOiBoZWFkZXJDZWxsLmlkZW50aWZpZXIgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcmRlckJ5Q29sdW1uSW5kZXggPSBoZWFkLmZpbmRJbmRleChjZWxsID0+IGNlbGwub3JkZXJCeSAmJiBjZWxsLm9yZGVyQnkgIT09IE9yZGVyQnkubm9uZSk7XG4gICAgICBwYXJhbXMuc29ydCA9IChvcmRlckJ5Q29sdW1uSW5kZXggPj0gMCkgPyB7IGNvbHVtbkluZGV4OiBvcmRlckJ5Q29sdW1uSW5kZXgsIG9yZGVyOiBoZWFkW29yZGVyQnlDb2x1bW5JbmRleF0ub3JkZXJCeSB9IDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBmdW5jaW9uZXMgZGUgcmVjb2dlciBpZHMsIHkgY2FyYWN0ZXJpc3RpY2FzXG4gICAqL1xuXG4gIGhhc0ZpbHRlcnMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGVhZCA9IHRoaXMuZ2V0SGVhZGVyQ2VsbHMoKTtcbiAgICByZXR1cm4gaGVhZCA/IGhlYWQuZmluZEluZGV4KGNlbGwgPT4gKGNlbGwuaGFzRmlsdGVyKSB8fCAoY2VsbC5oYXNTZWxlY3QpKSA+PSAwIDogZmFsc2U7XG4gIH1cblxuICBnZXRIZWFkZXJDZWxscygpOiBIZWFkQ2VsbE1vZGVsRGF0YVtdIHwgVGFibGVBZHZhbmNlZEhlYWRlckNlbGxDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhZGVyQ29tcG9uZW50ICYmIHRoaXMuaGVhZGVyQ29tcG9uZW50LmNlbGxzLmxlbmd0aCA+IDAgPyB0aGlzLmhlYWRlckNvbXBvbmVudC5jZWxscy50b0FycmF5KCkgOiB0aGlzLmhlYWQ7XG4gIH1cblxuICBnZXRGb290ZXJDZWxscygpOiBSb3dEYXRhW10gfCBUYWJsZUFkdmFuY2VkRm9vdGVyQ29tcG9uZW50W10ge1xuICAgIHJldHVybiB0aGlzLmZvb3RlckNvbXBvbmVudCAmJiB0aGlzLmZvb3RlckNvbXBvbmVudC5sZW5ndGggPiAwID8gdGhpcy5mb290ZXJDb21wb25lbnQudG9BcnJheSgpIDogdGhpcy5mb290O1xuICB9XG5cbiAgZ2V0Um93cygpIHtcbiAgICBsZXQgcm93cyA9IFtdO1xuICAgIGlmICh0aGlzLnJvd0NvbXBvbmVudExpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJvd3MgPSB0aGlzLnJvd0NvbXBvbmVudExpc3QudG9BcnJheSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb3dzKSB7XG4gICAgICByb3dzID0gdGhpcy5yb3dzO1xuICAgIH1cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaSBzZSBzb2JyZWVzY3JpYmUgIGVsIGNvbXBvcnRhbWllbnRvIHBvciBkZWZlY3RvIGRlIGZpbHRyYWRvIHkgb3JkZW5hY2nDs24sIHNlIHV0aWxpemFyw6FuIGxhcyBpbmRpY2FkYXMgZGVzZGUgZnVlcmEgZGVsXG4gICAqIGNvbXBvbmVudGUgKHlhIHNlYSBwb3IgcGFyw6FtZXRybyBvIHBvciBjb250ZW5pZG8pLlxuICAgKiBTaSBubyBzZSBzb2JyZWVzY3JpYmUsIGRldnVlbHZlIGxhcyBmaWxhcyBjYWxjdWxhZGFzLlxuICAgKi9cbiAgZ2V0VmlzaWJsZVJvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjYWxjdWxhdGVUYWJsZS5vYnNlcnZlcnMubGVuZ3RoID4gMCA/IHRoaXMuZ2V0Um93cygpIDogdGhpcy52aXNpYmxlUm93cztcbiAgfVxuXG4gIGdldElkUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWRQcmVmaXggPyB0aGlzLmlkUHJlZml4IDogJ2lkLXRhYmxlLXJvdyc7XG4gIH1cblxuICBnZXRJZEhlYWRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJZFByZWZpeCgpICsgJy1oZWFkZXItJyArIGluZGV4O1xuICB9XG5cbiAgZ2V0SWRSb3dDaGVja2JveChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJZFByZWZpeCgpICsgJy1jaGVja2JveC0nICsgaW5kZXg7XG4gIH1cblxuICBnZXRJZEhlYWRlckZpbHRlcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJZFByZWZpeCgpICsgJy1oZWFkZXItZmlsdGVyLScgKyBpbmRleDtcbiAgfVxuXG4gIGdldElkSGVhZGVyU2VsZWN0KGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldElkUHJlZml4KCkgKyAnLWhlYWRlci1zZWxlY3QtJyArIGluZGV4O1xuICB9XG5cbiAgZ2V0Q2FwdGlvbkNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2FwdGlvbkNvbXBvbmVudCA/IHRoaXMuY2FwdGlvbkNvbXBvbmVudC5jbGFzc2VzIDogdGhpcy5jYXB0aW9uQ2xhc3NlcztcbiAgfVxuXG4gIGdldFN0cmluZ09yZGVyQnkob3JkZXJCeTogT3JkZXJCeSk6IHN0cmluZyB7XG4gICAgaWYgKG9yZGVyQnkgPT09IE9yZGVyQnkuYXNjKSB7XG4gICAgICByZXR1cm4gJ2FzY2VuZGluZyc7XG4gICAgfSBlbHNlIGlmIChvcmRlckJ5ID09PSBPcmRlckJ5LmRlc2MpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfSBlbHNlIGlmIChvcmRlckJ5ID09PSBPcmRlckJ5Lm5vbmUpIHtcbiAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VsZWN0Rm9ySXRlbShpdGVtOiBhbnkpOiBUYWJsZUFkdmFuY2VkU2VsZWN0Q29tcG9uZW50IHtcbiAgICByZXR1cm4gaXRlbS5zZWxlY3RDb21wb25lbnQgPyBpdGVtLnNlbGVjdENvbXBvbmVudCA6IG51bGw7XG4gIH1cblxuICBnZXRJdGVtU2VsZWN0T3B0aW9ucyhpdGVtOiBUYWJsZUFkdmFuY2VkU2VsZWN0Q29tcG9uZW50KTogU2VsZWN0SXRlbURhdGFbXSB7XG4gICAgcmV0dXJuIGl0ZW0uc2VsZWN0SXRlbUNvbXBvbmVudExpc3QgJiYgaXRlbS5zZWxlY3RJdGVtQ29tcG9uZW50TGlzdC5sZW5ndGggPiAwID9cbiAgICAgIGl0ZW0uc2VsZWN0SXRlbUNvbXBvbmVudExpc3QudG9BcnJheSgpIDogaXRlbS5pdGVtcztcbiAgfVxuXG4gIGdldENvbnRlbnRDb21wb25lbnQoaXRlbTogVGFibGVBZHZhbmNlZEhlYWRlckNlbGxDb21wb25lbnQpOiBDb250ZW50Q29tcG9uZW50IHtcbiAgICByZXR1cm4gaXRlbS5jb250ZW50Q29tcG9uZW50ID8gaXRlbS5jb250ZW50Q29tcG9uZW50IDogbnVsbDtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIGNoZWNrc1xuICAgKi9cbiAgaGFuZGxlQ2hlY2tib3hDaGFuZ2Uocm93OiBSb3dEYXRhIHwgVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudCk6IHZvaWQge1xuICAgIGlmIChyb3cgaW5zdGFuY2VvZiBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50KSB7XG4gICAgICByb3cuY2hlY2tlZENoYW5nZS5lbWl0KHJvdy5jaGVja2VkKTtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnlDaGVja2VkQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVybWl0ZSBkZXNtYXJjYXIgdG9kYXMgbGFzIGZpbGFzXG4gICAqL1xuICBwcml2YXRlIHVuY2hlY2tBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRSb3dzKCkuZm9yRWFjaChyID0+IHtcbiAgICAgIGNvbnN0IG11c3RFbWl0ID0gci5jaGVja2VkICYmIHIgaW5zdGFuY2VvZiBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50O1xuICAgICAgci5jaGVja2VkID0gZmFsc2U7XG4gICAgICBpZiAobXVzdEVtaXQpIHtcbiAgICAgICAgKHIgYXMgVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudCkuY2hlY2tlZENoYW5nZS5lbWl0KHIuY2hlY2tlZCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlDaGVja2VkQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpY2EgY2FtYmlvcyBlbiBsYXMgZmlsYXNcbiAgICovXG4gIHByaXZhdGUgbm90aWZ5Q2hlY2tlZENoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yb3dDb21wb25lbnRMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yb3dzQ2hhbmdlLmVtaXQodGhpcy5yb3dzKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dDaGVja3M6IGFueSA9IHt9O1xuICAgIHRoaXMuZ2V0Um93cygpLmZvckVhY2gociA9PiByb3dDaGVja3Nbci5pZF0gPSAhIXIuY2hlY2tlZCk7IC8vIFNlIGFwbGljYW4gdGFtYmnDqW4gYSBsYXMgbm8gdmlzaWJsZXNcbiAgICB0aGlzLnJvd3NDaGVja2VkLmVtaXQocm93Q2hlY2tzKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIGJ1c3F1ZWRhXG4gICAqL1xuICBoYW5kbGVJbnB1dFNlYXJjaChpdGVtOiBIZWFkQ2VsbE1vZGVsRGF0YSk6IHZvaWQge1xuICAgIGlmIChpdGVtLmhhc0ZpbHRlcikgeyAvLyBzaSB0aWVuZSBidXNjYWRvclxuICAgICAgaXRlbS5hY3RpdmVGaWx0ZXIgPSAhIWl0ZW0udmFsdWVGaWx0ZXI7XG4gICAgICB0aGlzLnVuY2hlY2tBbGwoKTtcbiAgICB9XG4gICAgaWYgKGl0ZW0uaGFzU2VsZWN0KSB7IC8vU2kgdGllbmUgc2VsZWNjaW9uYWJsZVxuICAgICAgaXRlbS5hY3RpdmVTZWxlY3QgPSAhIWl0ZW0udmFsdWVTZWxlY3Q7XG4gICAgICB0aGlzLnVuY2hlY2tBbGwoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogU2UgZmlsdHJhbiBsYXMgZmlsYXMgc2Vnw7puIGxvIGVzcGVjaWZpY2FkbyBlbiBsYSBiYXJyYSBkZSBiw7pzcXVlZGEgZGUgY2FkYSBjb2x1bW5hLlxuICAgKiBTaSBubyBoYXkgYsO6c3F1ZWRhIHNzZSBkZXZ1ZWx2ZW4gdG9kYXMgbGFzIGZpbGFzLlxuICAgKiBAcGFyYW0gcmVjYWxjdWxhdGVQYXJhbXMgcGFyYW1ldHJvcyBwYXJhIHJlY2FsY3VsYXIgbG9zIGVsZW1lbnRvcyB2aXNpYmxlc1xuICAgKiBAcGFyYW0gcm93cyBsaXN0YSBjb24gdG9kYXMgbGFzIGZpbGFzXG4gICAqIEByZXR1cm4gbGlzdGEgZGUgZmlsYXMgZmlsdHJhZGFcbiAgICovXG4gIHByaXZhdGUgZmlsdGVyUm93cyhyZWNhbGN1bGF0ZVBhcmFtczogUmVjYWxjdWxhdGVUYWJsZVBhcmFtcywgcm93czogUm93RGlyZWN0aXZlW10pOiBSb3dEaXJlY3RpdmVbXSB7XG4gICAgbGV0IGZpbHRlcmVkUm93cyA9IHJvd3M7XG4gICAgcmVjYWxjdWxhdGVQYXJhbXMuZmlsdGVycy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICBmaWx0ZXJlZFJvd3MgPSBmaWx0ZXJlZFJvd3MuZmlsdGVyKHJvdyA9PlxuICAgICAgICBTZWFyY2hVdGlscy5jb250YWluc0FueVdvcmRGcm9tKHJvdy5nZXRDZWxsKGZpbHRlci5jb2x1bW5JbmRleCkuZ2V0Q29udGVudCgpLCBmaWx0ZXIuZmlsdGVyVGV4dCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJlZFJvd3M7XG4gIH1cblxuICAvKipcbiAgICogb3JkZW5hY2lvblxuICAgKi9cblxuICAvKipcbiAgICogUGVybWl0ZSBpbmRpY2FyIHF1ZSBzZSBkZWJlIG9yZGVuYXIgbGEgdGFibGFcbiAgICogQHBhcmFtIGluZGV4IGluZGljZSBkZSBsYSBjb2x1bW5hXG4gICAqL1xuICBoYW5kbGVTb3J0QnlDb2x1bW4oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmdldEhlYWRlckNlbGxzKCk7XG4gICAgaWYgKGhlYWQpIHtcbiAgICAgIGhlYWQuZm9yRWFjaCgoY2VsbCwgY2VsbEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjZWxsLm9yZGVyQnkpIHtcbiAgICAgICAgICBjZWxsLm9yZGVyQnkgPSBjZWxsSW5kZXggPT09IGluZGV4ID8gdGhpcy5nZXROZXh0RGlyZWN0aW9uKGNlbGwpIDogT3JkZXJCeS5ub25lO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBPcmRlbmEgbGFzIGZpbGFzIGluZGljYWRhcyBzZWfDum4gbGEgY29sdW1uYSBlc3BlY2lmaWNhZGEgZW4gbGEgY2FiZWNlcmFcbiAgICogQHBhcmFtIHJlY2FsY3VsYXRlUGFyYW1zIHBhcmFtZXRyb3MgcGFyYSByZWNhbGN1bGFyIGxvcyBlbGVtZW50b3MgdmlzaWJsZXNcbiAgICogQHBhcmFtIHJvd3MgZmlsYXMgZGUgbGEgdGFibGEgYSBvcmRlbmFyXG4gICAqIEByZXR1cm4gbWlzbWFzIGZpbGFzIHBlcm8gb3JkZW5hZGFzIHBvciBsYSBjb2x1bW5hIGluZGljYWRhXG4gICAqL1xuICBwcml2YXRlIHNvcnRSb3dzKHJlY2FsY3VsYXRlUGFyYW1zOiBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zLCByb3dzOiBSb3dEaXJlY3RpdmVbXSk6IFJvd0RpcmVjdGl2ZVtdIHtcbiAgICBsZXQgc29ydGVkUm93cyA9IHJvd3M7XG4gICAgaWYgKHJlY2FsY3VsYXRlUGFyYW1zLnNvcnQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gcmVjYWxjdWxhdGVQYXJhbXMuc29ydC5jb2x1bW5JbmRleDtcbiAgICAgIGNvbnN0IGlzQXNjID0gcmVjYWxjdWxhdGVQYXJhbXMuc29ydC5vcmRlciA9PT0gT3JkZXJCeS5hc2M7XG4gICAgICBzb3J0ZWRSb3dzID0gcm93cy5zb3J0KChhLCBiKSA9PlxuICAgICAgICB0aGlzLmNvbXBhcmVDZWxsQ29udGVudChhLmdldENlbGwoY29sdW1uSW5kZXgpLCBiLmdldENlbGwoY29sdW1uSW5kZXgpLCBpc0FzYykpO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0ZWRSb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmEgZWwgY29udGVuaWRvIGRlIGRvcyBjZWxkYXMuIEVzdGUgc2UgaW52aWVydGUgc2kgZWwgb3JkZW4gZXNwZWNpZmljYWRvIGVzIGRlc2NlbmRlbnRlLlxuICAgKi9cbiAgY29tcGFyZUNlbGxDb250ZW50KGE6IENlbGxEaXJlY3RpdmUsIGI6IENlbGxEaXJlY3RpdmUsIGlzQXNjOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IGFDb21wYXJhYmxlID0gdGhpcy5jbGVhbkN1cnJlbmN5KGEuZ2V0Q29udGVudCgpKTtcbiAgICBjb25zdCBiQ29tcGFyYWJsZSA9IHRoaXMuY2xlYW5DdXJyZW5jeShiLmdldENvbnRlbnQoKSk7XG4gICAgY29uc3QgbnVtYmVyUmVnZXggPSAvXi0/XFxkKyhcXC58LCk/XFxkKiQvO1xuICAgIGNvbnN0IGRhdGVSZWdleCA9IC9eKFxcZHsyfSkoXFwvfC0pKFxcZHsyfSkoXFwvfC0pKFxcZHs0fSkoIChcXGR7Mn0pOihcXGR7Mn0pKDooXFxkezJ9KSk/KT8kLztcbiAgICBpZiAoYUNvbXBhcmFibGUgJiYgYkNvbXBhcmFibGUpIHtcbiAgICAgIGlmIChudW1iZXJSZWdleC50ZXN0KGFDb21wYXJhYmxlKSAmJiBudW1iZXJSZWdleC50ZXN0KGJDb21wYXJhYmxlKSkgeyAvLyBOdW1lcm9zXG4gICAgICAgIHJlc3VsdCA9IGFDb21wYXJhYmxlLmxvY2FsZUNvbXBhcmUoYkNvbXBhcmFibGUsIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZGF0ZVJlZ2V4LnRlc3QoYUNvbXBhcmFibGUpICYmIGRhdGVSZWdleC50ZXN0KGJDb21wYXJhYmxlKSkgeyAvLyBGZWNoYXNcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZURhdGVUaW1lKGFDb21wYXJhYmxlKSAtIHRoaXMucGFyc2VEYXRlVGltZShiQ29tcGFyYWJsZSk7XG4gICAgICB9IGVsc2UgeyAvLyBUZXh0b1xuICAgICAgICByZXN1bHQgPSBhQ29tcGFyYWJsZS5sb2NhbGVDb21wYXJlKGJDb21wYXJhYmxlLCAnZXMnLCB7IHNlbnNpdGl2aXR5OiAnYmFzZScsIGlnbm9yZVB1bmN0dWF0aW9uOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0ICogKGlzQXNjID8gMSA6IC0xKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VEYXRlVGltZShpbnB1dDogc3RyaW5nKSB7IC8vIDMxLzEyLzIwMjMgMTI6MTI6MTIgb3IgMzEtMTItMjAyMyAxMjoxMjoxMiBmZWNoYXMgcXVlIGFjZXB0YSwgaGg6bW06c3MgZXMgb3BjaW9uYWxcbiAgICBsZXQgW2RhdGVQYXJ0LCB0aW1lUGFydF0gPSBpbnB1dC5zcGxpdCgnICcpO1xuICAgIGxldCBbZGF5LCBtb250aCwgeWVhcl0gPSBkYXRlUGFydC5zcGxpdCgvXFwvfC0vKS5tYXAoTnVtYmVyKTtcbiAgICBsZXQgW2hvdXJzID0gMCwgbWludXRlcyA9IDAsIHNlY29uZHMgPSAwXSA9ICh0aW1lUGFydCA/IHRpbWVQYXJ0LnNwbGl0KCc6JykgOiBbXSkubWFwKE51bWJlcik7XG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpO1xuICAgIHJldHVybiBkYXRlLmdldFRpbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZSBjYWxjdWxhIGxhIG9yZGVuYWNpw7NuIG51ZXZhXG4gICAqL1xuICBwcml2YXRlIGdldE5leHREaXJlY3Rpb24oaXRlbTogSGVhZENlbGxNb2RlbERhdGEpOiBPcmRlckJ5IHtcbiAgICBpZiAoaXRlbS5vcmRlckJ5ID09PSBPcmRlckJ5Lm5vbmUgfHwgaXRlbS5vcmRlckJ5ID09PSBPcmRlckJ5LmRlc2MpIHtcbiAgICAgIHJldHVybiBPcmRlckJ5LmFzYztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE9yZGVyQnkuZGVzYztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2kgZXMgdW5hIGNhbnRpZGFkIGRlIGRpbmVybyBzZSBxdWl0YSDigqwgcGFyYSBwb2RlciBjb21wYXJhciBsb3MgbnVtZXJvc1xuICAgKi9cbiAgcHJpdmF0ZSBjbGVhbkN1cnJlbmN5KHR4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoL1tcXGQuLF0rW1xc4oKsXS9nLnRlc3QodHh0KSkge1xuICAgICAgdHh0ID0gdHh0LnJlcGxhY2UoL+KCrC9nLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiB0eHQ7XG4gIH1cblxuICBzZWxlY3RGaWx0ZXIoaXRlbTogVGFibGVBZHZhbmNlZFNlbGVjdENvbXBvbmVudCwgaXRlbVZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpdGVtLnZhbHVlQ2hhbmdlLmVtaXQoaXRlbVZhbHVlKTtcblxuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmdldEhlYWRlckNlbGxzKCk7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93cygpO1xuICAgIGlmIChoZWFkICYmIHJvd3MpIHtcbiAgICAgIGhlYWQuZm9yRWFjaCgoY2VsbDogVGFibGVBZHZhbmNlZEhlYWRlckNlbGxDb21wb25lbnQsIGNlbGxJbmRleCkgPT4ge1xuICAgICAgfSk7XG4gICAgICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICN0YWJsZUNvbnRlbnQ+XG4gIDx0YWJsZSByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgW2NsYXNzXT1cIlsnYy10YWJsZS1hZHZhbmNlZCBib3JkZXItdC0yIGJvcmRlci1iLTIgYm9yZGVyLW5ldXRyYWwtYmFzZScsIGNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICBbYXR0ci5pZF09XCJpZCA/IGlkIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIucm9sZV09XCJyb2xlID8gcm9sZSA6IG51bGxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsID8gYXJpYUxhYmVsIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJhcmlhRGVzY3JpYmVkQnkgPyBhcmlhRGVzY3JpYmVkQnkgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnkgPyBhcmlhTGFiZWxsZWRCeSA6IG51bGxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cImFyaWFIaWRkZW4gPyBhcmlhSGlkZGVuIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJhcmlhRGlzYWJsZWQgPyBhcmlhRGlzYWJsZWQgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImFyaWFDb250cm9scyA/IGFyaWFDb250cm9scyA6IG51bGxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJhcmlhQ3VycmVudCA/IGFyaWFDdXJyZW50IDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1saXZlXT1cImFyaWFMaXZlID8gYXJpYUxpdmUgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImFyaWFFeHBhbmRlZCA/IGFyaWFFeHBhbmRlZCA6IG51bGxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZXJyb3JtZXNzYWdlXT1cImFyaWFFcnJvck1lc3NhZ2UgPyBhcmlhRXJyb3JNZXNzYWdlIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJhcmlhSGFzUG9wdXAgPyBhcmlhSGFzUG9wdXAgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleCA/IHRhYmluZGV4IDogbnVsbFwiPlxuICAgICAgPGNhcHRpb24gKm5nSWY9XCJjYXB0aW9uIHx8IGNhcHRpb25Db21wb25lbnRcIiBbY2xhc3NdPVwiZ2V0Q2FwdGlvbkNsYXNzKClcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBjYXB0aW9uQ29tcG9uZW50LCB0ZXh0OiBjYXB0aW9uID8gY2FwdGlvbiA6IG51bGwgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9jYXB0aW9uPlxuICAgICAgPHRoZWFkICpuZ0lmPVwiZ2V0SGVhZGVyQ2VsbHMoKVwiPlxuICAgICAgICAgIDx0ciBjbGFzcz1cImJvcmRlci10IGJvcmRlci1uZXV0cmFsLWJhc2UgZGl2aWRlLXggZGl2aWRlLW5ldXRyYWwtYmFzZVwiPlxuICAgICAgICAgICAgICA8dGggKm5nSWY9XCJoYXNDaGVja2JveGVzXCIgc2NvcGU9XCJjb2xcIiBbY2xhc3NdPVwiWydhbGlnbi10b3AgcHgtYmFzZSBweS14cycsICd3LTE2JywgY2hlY2tib3hDbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+U2VsZWNjaW9uYXIgZmlsYTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0SGVhZGVyQ2VsbHMoKTsgaW5kZXggYXMgaUhlYWRlclwiIFtpZF09XCJnZXRJZEhlYWRlcihpSGVhZGVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cIml0ZW0ub3JkZXJCeSA/IGdldFN0cmluZ09yZGVyQnkoaXRlbS5vcmRlckJ5KSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJbJ2FsaWduLXRvcCBweC1iYXNlIHB5LXNtIGJvcmRlci1uZXV0cmFsLWJhc2UgYm9yZGVyLWItMCB0ZXh0LWxlZnQgdGV4dC1zbSBmb250LW5vcm1hbCB0ZXh0LW5ldXRyYWwtZGFyaycsIGl0ZW0uY2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiaXRlbS5jb2xzcGFuID8gaXRlbS5jb2xzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvd3NwYW5dPVwiaXRlbS5yb3dzcGFuID8gaXRlbS5yb3dzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiaXRlbS5yb2xlID8gaXRlbS5yb2xlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtLmFyaWFMYWJlbCA/IGl0ZW0uYXJpYUxhYmVsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpdGVtLmFyaWFEZXNjcmliZWRCeSA/IGl0ZW0uYXJpYURlc2NyaWJlZEJ5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIml0ZW0uYXJpYUxhYmVsbGVkQnkgPyBpdGVtLmFyaWFMYWJlbGxlZEJ5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaXRlbS5hcmlhSGlkZGVuID8gaXRlbS5hcmlhSGlkZGVuIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpdGVtLmFyaWFEaXNhYmxlZCA/IGl0ZW0uYXJpYURpc2FibGVkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpdGVtLmFyaWFDb250cm9scyA/IGl0ZW0uYXJpYUNvbnRyb2xzIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cIml0ZW0uYXJpYUN1cnJlbnQgPyBpdGVtLmFyaWFDdXJyZW50IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1saXZlXT1cIml0ZW0uYXJpYUxpdmUgPyBpdGVtLmFyaWFMaXZlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpdGVtLmFyaWFFeHBhbmRlZCA/IGl0ZW0uYXJpYUV4cGFuZGVkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1lcnJvcm1lc3NhZ2VdPVwiaXRlbS5hcmlhRXJyb3JNZXNzYWdlID8gaXRlbS5hcmlhRXJyb3JNZXNzYWdlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJpdGVtLmFyaWFIYXNQb3B1cCA/IGl0ZW0uYXJpYUhhc1BvcHVwIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaXRlbS50YWJpbmRleCA/IGl0ZW0udGFiaW5kZXggOiBudWxsXCI+XG5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5vcmRlckJ5XCIgY2xhc3M9XCJpbmxpbmUtYmxvY2sgcmVsYXRpdmVcIiAoY2xpY2spPVwiaGFuZGxlU29ydEJ5Q29sdW1uKGlIZWFkZXIpXCIgZGVzeUZvY3VzQ2xpY2tlZENlbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIml0ZW0ub3JkZXJCeSA/IC0xIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIml0ZW0ub3JkZXJCeSA/ICdidXR0b24nIDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS50ZXh0XCI+e3tpdGVtLnRleHR9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5jb250ZW50Q29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBpdGVtLmNvbnRlbnRDb21wb25lbnQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjLXRhYmxlLWFkdmFuY2VkX19vcmRlclwiICpuZ0lmPVwiaXRlbS5vcmRlckJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5QdWxzYSBwYXJhIG9yZGVuYXIgcG9yIGVzdGEgY29sdW1uYTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYy10YWJsZS1hZHZhbmNlZF9fYXNjZW5kaW5nXCIgKm5nSWY9XCJpdGVtLm9yZGVyQnkgPT09IG9yZGVyQnlUeXBlLmFzY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDE0MCAxNDBcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB3aWR0aD1cIjFlbVwiIGhlaWdodD1cIjFlbVwiPjxwYXRoIGQ9XCJNMTEyLjA3IDM3LjkzbC0zNS0zNWExMCAxMCAwIDAwLTE0LjE0IDBsLTM1IDM1YTEwIDEwIDAgMDAxNC4xNCAxNC4xNGwxMy42Ni0xMy42NkEyLjUgMi41IDAgMDE2MCA0MC4xOFYxMzBhMTAgMTAgMCAwMDIwIDBWNDAuMThhMi41IDIuNSAwIDAxNC4yNy0xLjc3bDEzLjY2IDEzLjY2YTEwIDEwIDAgMDAxNC4xNC0xNC4xNHpcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjLXRhYmxlLWFkdmFuY2VkX19kZXNjZW5kaW5nXCIgKm5nSWY9XCJpdGVtLm9yZGVyQnkgPT09IG9yZGVyQnlUeXBlLmRlc2NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNDAgMTQwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgd2lkdGg9XCIxZW1cIiBoZWlnaHQ9XCIxZW1cIj48cGF0aCBkPVwiTTI3LjkzIDEwMi4wN2wzNSAzNWExMCAxMCAwIDAwMTQuMTQgMGwzNS0zNWExMCAxMCAwIDAwLTE0LjE0LTE0LjE0bC0xMy42NiAxMy42NkEyLjUgMi41IDAgMDE4MCA5OS44MlYxMGExMCAxMCAwIDAwLTIwIDB2ODkuODJhMi41IDIuNSAwIDAxLTQuMjcgMS43N0w0Mi4wNyA4Ny45M2ExMCAxMCAwIDAwLTE0LjE0IDE0LjE0elwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImMtdGFibGUtYWR2YW5jZWRfX25vbmVcIiAgKm5nSWY9XCJpdGVtLm9yZGVyQnkgPT09IG9yZGVyQnlUeXBlLm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNDAgMTQwXCIgY2xhc3M9XCJ0ZXh0LW5ldXRyYWwtYmFzZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHdpZHRoPVwiMWVtXCIgaGVpZ2h0PVwiMWVtXCI+PHBhdGggZD1cIk05NC43IDk3LjJsLTE3LjIgMTcuMTlWMjUuNjFMOTQuNyA0Mi44YTcuNSA3LjUgMCAwMDEwLjYtMTAuNmwtMzAtMzBhNy40OSA3LjQ5IDAgMDAtMTAuNiAwbC0zMCAzMGE3LjUgNy41IDAgMDAxMC42IDEwLjZsMTcuMi0xNy4xOXY4OC43OEw0NS4zIDk3LjJhNy41IDcuNSAwIDEwLTEwLjYgMTAuNmwzMCAzMGE3LjQ4IDcuNDggMCAwMDEwLjYgMGwzMC0zMGE3LjUgNy41IDAgMDAtMTAuNi0xMC42elwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbS5vcmRlckJ5XCIgY2xhc3M9XCJpbmxpbmUtYmxvY2sgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGV4dFwiPnt7aXRlbS50ZXh0fX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uY29udGVudENvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogaXRlbS5jb250ZW50Q29tcG9uZW50IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG5cbiAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJkaXZpZGUteCBkaXZpZGUtbmV1dHJhbC1iYXNlXCIgKm5nSWY9XCJoYXNGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaGFzQ2hlY2tib3hlc1wiIFtuZ0NsYXNzXT1cImNoZWNrYm94Q2xhc3Nlc1wiPjwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCB0YWJpbmRleD1cIi0xXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0SGVhZGVyQ2VsbHMoKTsgaW5kZXggYXMgaUhlYWRcIiBkZXN5Rm9jdXNDbGlja2VkQ2VsbFxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlsnYWxpZ24tdG9wIHB4LWJhc2UgcGItc20gYm9yZGVyLW5ldXRyYWwtYmFzZSBib3JkZXItYi0wIHRleHQtbGVmdCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRleHQtbmV1dHJhbC1kYXJrJywgaXRlbS5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uaGFzU2VsZWN0ICYmIGdldFNlbGVjdEZvckl0ZW0oaXRlbSkgIT09IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlU2VsZWN0OyBjb250ZXh0OiB7c2VsZWN0YWJsZTogZ2V0U2VsZWN0Rm9ySXRlbShpdGVtKX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0YWJsZVNlbGVjdCBsZXQtc2VsZWN0YWJsZT1cInNlbGVjdGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGVzeS1zZWxlY3QgW2lkXT1cImdldElkSGVhZGVyU2VsZWN0KGlIZWFkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxEYXRhXT1cInsgdGV4dDogJ0ZpbHRyYXIgcG9yIGVzdGEgY29sdW1uYScsIGNsYXNzZXM6ICdzci1vbmx5JyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc2VzXT1cInNlbGVjdGFibGUuY2xhc3NlcyA/IHNlbGVjdGFibGUuY2xhc3NlcyA6ICdjLXNlbGVjdC0tc20gdy1mdWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwQ2xhc3Nlc109XCJzZWxlY3RhYmxlLmZvcm1Hcm91cENsYXNzZXMgPyBzZWxlY3RhYmxlLmZvcm1Hcm91cENsYXNzZXMgOiAnLW10LXNtIG1iLTAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInNlbGVjdGFibGUubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNdPVwiZ2V0SXRlbVNlbGVjdE9wdGlvbnMoc2VsZWN0YWJsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlbGVjdGFibGUuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rlc2NyaWJlZEJ5XT1cImdldElkSGVhZGVyU2VsZWN0KGlIZWFkKVwiXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZVNlbGVjdFwiIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUlucHV0U2VhcmNoKGl0ZW0pXCJcblxuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGVdPVwic2VsZWN0YWJsZS5yb2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwic2VsZWN0YWJsZS5hcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFEZXNjcmliZWRCeV09XCJzZWxlY3RhYmxlLmFyaWFEZXNjcmliZWRCeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsbGVkQnldPVwic2VsZWN0YWJsZS5hcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUhpZGRlbl09XCJzZWxlY3RhYmxlLmFyaWFIaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFEaXNhYmxlZF09XCJzZWxlY3RhYmxlLmFyaWFEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUNvbnRyb2xzXT1cInNlbGVjdGFibGUuYXJpYUNvbnRyb2xzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhQ3VycmVudF09XCJzZWxlY3RhYmxlLmFyaWFDdXJyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhTGl2ZV09XCJzZWxlY3RhYmxlLmFyaWFMaXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhRXhwYW5kZWRdPVwic2VsZWN0YWJsZS5hcmlhRXhwYW5kZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFFcnJvck1lc3NhZ2VdPVwic2VsZWN0YWJsZS5hcmlhRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhSGFzUG9wdXBdPVwic2VsZWN0YWJsZS5hcmlhSGFzUG9wdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInNlbGVjdGFibGUudGFiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rlc3ktc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLmhhc1NlbGVjdCAmJiBpdGVtLmhhc0ZpbHRlclwiIGNsYXNzPVwicGItc21cIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRlc3ktc2VhcmNoLWJhciAqbmdJZj1cIml0ZW0uaGFzRmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLnZhbHVlRmlsdGVyXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUlucHV0U2VhcmNoKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiaGFuZGxlSW5wdXRTZWFyY2goaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFRleHQ9XCJCdXNjYXIgZW4gZXN0YSBjb2x1bW5hXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImdldElkSGVhZGVyRmlsdGVyKGlIZWFkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQnVzY2FyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzZXNdPVwiWydjLWlucHV0LS1zbScsIGl0ZW0uZmlsdGVyQ2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25DbGFzc2VzPVwibS14cyBwLTAuNSB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rlc2NyaWJlZEJ5XT1cImdldElkSGVhZGVyKGlIZWFkKVwiPiA8L2Rlc3ktc2VhcmNoLWJhcj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuXG5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBnZXRWaXNpYmxlUm93cygpOyBpbmRleCBhcyBpUm93XCIgY2xhc3M9XCJib3JkZXItdCBib3JkZXItYiBib3JkZXItbmV1dHJhbC1iYXNlIGhvdmVyOmJnLW5ldXRyYWwtbGlnaHRlclwiXG4gICAgICAgICAgICAgIFtkZXN5Um93XT1cInJvd1wiPlxuICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJoYXNDaGVja2JveGVzXCIgZGVzeUZvY3VzQ2xpY2tlZENlbGwgW2NsYXNzXT1cIlsncHgtYmFzZSBweS1zbScsIGNoZWNrYm94Q2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIlxuICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYy1jaGVja2JveGVzIGMtY2hlY2tib3hlcy0tc21cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG14LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJ3LTYgaC02IHRyYW5zaXRpb24gZHVyYXRpb24tMTUwIGVhc2UtaW4tb3V0IGJvcmRlci1ibGFjayBmb2N1czpib3JkZXItYmxhY2sgZm9jdXM6c2hhZG93LW91dGxpbmUtZm9jdXMtaW5wdXQgZm9jdXM6cmluZy00IGZvY3VzOnJpbmctb2Zmc2V0LTAgZm9jdXM6cmluZy13YXJuaW5nLWJhc2UgZGlzYWJsZWQ6YmctbmV1dHJhbC1saWdodCBkaXNhYmxlZDpib3JkZXItbmV1dHJhbC1iYXNlIHRleHQtcHJpbWFyeS1iYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5jaGVja2VkXCIgKG5nTW9kZWxDaGFuZ2UpPVwiaGFuZGxlQ2hlY2tib3hDaGFuZ2Uocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImdldElkUm93Q2hlY2tib3goaVJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImdldElkUm93Q2hlY2tib3goaVJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0ZpbGEgJyArIGlSb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMC41IGxlYWRpbmctNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3Itb25seSBibG9jayB0ZXh0LXNtIC1tdC0xXCIgW2Zvcl09XCJnZXRJZFJvd0NoZWNrYm94KGlSb3cpXCI+U2VsZWNjaW9uYSBmaWxhIHt7IGlSb3cgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvdy5jZWxsc0xpc3Q7IGZpcnN0IGFzIGlzRmlyc3RDZWxsOyBpbmRleCBhcyBjb2x1bW5JbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiZmlyc3RDZWxsSXNIZWFkZXIgJiYgaXNGaXJzdENlbGw7IGVsc2UgZWxzZVRkXCIgc2NvcGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJbJ3B4LWJhc2UgcHkteHMgYm9yZGVyLW5ldXRyYWwtYmFzZSBib3JkZXItYi0wIGJvcmRlci1yIHRleHQtbGVmdCBmb250LW5vcm1hbCB0ZXh0LXNtIHRleHQtbmV1dHJhbC1kYXJrJywgY2VsbC5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgZGVzeUNlbGwgW3Jvd109XCJyb3dcIiBbcm93SW5kZXhdPVwiaVJvd1wiIFtjb2x1bW5JbmRleF09XCJjb2x1bW5JbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjZWxsLmNvbHNwYW4gPyBjZWxsLmNvbHNwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJjZWxsLnJvd3NwYW4gPyBjZWxsLnJvd3NwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY2VsbC5pZCA/IGNlbGwuaWQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cImNlbGwucm9sZSA/IGNlbGwucm9sZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY2VsbC5hcmlhTGFiZWwgPyBjZWxsLmFyaWFMYWJlbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiY2VsbC5hcmlhRGVzY3JpYmVkQnkgPyBjZWxsLmFyaWFEZXNjcmliZWRCeSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJjZWxsLmFyaWFMYWJlbGxlZEJ5ID8gY2VsbC5hcmlhTGFiZWxsZWRCeSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cImNlbGwuYXJpYUhpZGRlbiA/IGNlbGwuYXJpYUhpZGRlbiA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiY2VsbC5hcmlhRGlzYWJsZWQgPyBjZWxsLmFyaWFEaXNhYmxlZCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY2VsbC5hcmlhQ29udHJvbHMgPyBjZWxsLmFyaWFDb250cm9scyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJjZWxsLmFyaWFDdXJyZW50ID8gY2VsbC5hcmlhQ3VycmVudCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGl2ZV09XCJjZWxsLmFyaWFMaXZlID8gY2VsbC5hcmlhTGl2ZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiY2VsbC5hcmlhRXhwYW5kZWQgPyBjZWxsLmFyaWFFeHBhbmRlZCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXJyb3JtZXNzYWdlXT1cImNlbGwuYXJpYUVycm9yTWVzc2FnZSA/IGNlbGwuYXJpYUVycm9yTWVzc2FnZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiY2VsbC5hcmlhSGFzUG9wdXAgPyBjZWxsLmFyaWFIYXNQb3B1cCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNlbGwudGFiaW5kZXggPyBjZWxsLnRhYmluZGV4IDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGNlbGwsIGh0bWw6IGNlbGwuaHRtbCwgdGV4dDogY2VsbC50ZXh0IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Vsc2VUZD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgdGFiaW5kZXg9XCItMVwiIGRlc3lGb2N1c0NsaWNrZWRDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJbJ3B4LWJhc2UgcHktc20nLCBjZWxsLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzeUNlbGwgW3Jvd109XCJyb3dcIiBbcm93SW5kZXhdPVwiaVJvd1wiIFtjb2x1bW5JbmRleF09XCJjb2x1bW5JbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY2VsbC5jb2xzcGFuID8gY2VsbC5jb2xzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cImNlbGwucm93c3BhbiA/IGNlbGwucm93c3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY2VsbC5pZCA/IGNlbGwuaWQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJjZWxsLnJvbGUgPyBjZWxsLnJvbGUgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjZWxsLmFyaWFMYWJlbCA/IGNlbGwuYXJpYUxhYmVsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiY2VsbC5hcmlhRGVzY3JpYmVkQnkgPyBjZWxsLmFyaWFEZXNjcmliZWRCeSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiY2VsbC5hcmlhTGFiZWxsZWRCeSA/IGNlbGwuYXJpYUxhYmVsbGVkQnkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiY2VsbC5hcmlhSGlkZGVuID8gY2VsbC5hcmlhSGlkZGVuIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiY2VsbC5hcmlhRGlzYWJsZWQgPyBjZWxsLmFyaWFEaXNhYmxlZCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImNlbGwuYXJpYUNvbnRyb2xzID8gY2VsbC5hcmlhQ29udHJvbHMgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImNlbGwuYXJpYUN1cnJlbnQgPyBjZWxsLmFyaWFDdXJyZW50IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGl2ZV09XCJjZWxsLmFyaWFMaXZlID8gY2VsbC5hcmlhTGl2ZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImNlbGwuYXJpYUV4cGFuZGVkID8gY2VsbC5hcmlhRXhwYW5kZWQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1lcnJvcm1lc3NhZ2VdPVwiY2VsbC5hcmlhRXJyb3JNZXNzYWdlID8gY2VsbC5hcmlhRXJyb3JNZXNzYWdlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiY2VsbC5hcmlhSGFzUG9wdXAgPyBjZWxsLmFyaWFIYXNQb3B1cCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjZWxsLnRhYmluZGV4ID8gY2VsbC50YWJpbmRleCA6IC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGNlbGwsIGh0bWw6IGNlbGwuaHRtbCwgdGV4dDogY2VsbC50ZXh0IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgICBcbiAgICAgIDx0Zm9vdCAqbmdJZj1cImdldEZvb3RlckNlbGxzKClcIj5cbiAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZm9vdCBvZiBnZXRGb290ZXJDZWxscygpOyBpbmRleCBhcyBpRm9vdGVyXCIgY2xhc3M9XCJib3JkZXItdC0yIGJvcmRlci1iIGJvcmRlci1uZXV0cmFsLWJhc2UgaG92ZXI6YmctbmV1dHJhbC1saWdodGVyXCI+XG4gICAgICAgICAgIDx0ZCAqbmdJZj1cImhhc0NoZWNrYm94ZXNcIiBkZXN5Rm9jdXNDbGlja2VkQ2VsbCBbY2xhc3NdPVwiWydweC1iYXNlIHB5LXNtJywgY2hlY2tib3hDbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImMtY2hlY2tib3hlcyBjLWNoZWNrYm94ZXMtLXNtXCI+XG4gICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBpdGVtcy1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBteC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwidy02IGgtNiB0cmFuc2l0aW9uIGR1cmF0aW9uLTE1MCBlYXNlLWluLW91dCBib3JkZXItYmxhY2sgZm9jdXM6Ym9yZGVyLWJsYWNrIGZvY3VzOnNoYWRvdy1vdXRsaW5lLWZvY3VzLWlucHV0IGZvY3VzOnJpbmctNCBmb2N1czpyaW5nLW9mZnNldC0wIGZvY3VzOnJpbmctd2FybmluZy1iYXNlIGRpc2FibGVkOmJnLW5ldXRyYWwtbGlnaHQgZGlzYWJsZWQ6Ym9yZGVyLW5ldXRyYWwtYmFzZSB0ZXh0LXByaW1hcnktYmFzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb290LmNoZWNrZWRcIiAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVDaGVja2JveENoYW5nZShmb290KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImdldElkUm93Q2hlY2tib3goaUZvb3RlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImdldElkUm93Q2hlY2tib3goaUZvb3RlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0ZpbGEgJyArIGlGb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMC41IGxlYWRpbmctNVwiPlxuICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3Itb25seSBibG9jayB0ZXh0LXNtIC1tdC0xXCIgW2Zvcl09XCJnZXRJZFJvd0NoZWNrYm94KGlGb290ZXIpXCI+U2VsZWNjaW9uYSBmaWxhIHt7IGlGb290ZXIgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjZWxsIG9mIGZvb3QuY2VsbHNMaXN0OyBmaXJzdCBhcyBpc0ZpcnN0Q2VsbDsgaW5kZXggYXMgY29sdW1uSW5kZXhcIj5cbiAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImZpcnN0Q2VsbElzSGVhZGVyICYmIGlzRmlyc3RDZWxsOyBlbHNlIGVsc2VUZFwiIHNjb3BlPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiWydweC1iYXNlIHB5LXhzIGJvcmRlci1uZXV0cmFsLWJhc2UgYm9yZGVyLWItMCBib3JkZXItciB0ZXh0LWxlZnQgZm9udC1ub3JtYWwgdGV4dC1zbSB0ZXh0LW5ldXRyYWwtZGFyaycsIGNlbGwuY2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIlxuICAgICAgICAgICAgICAgICAgIGRlc3lDZWxsIFtyb3ddPVwicm93XCIgW3Jvd0luZGV4XT1cImlGb290ZXJcIiBbY29sdW1uSW5kZXhdPVwiY29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY2VsbC5jb2xzcGFuID8gY2VsbC5jb2xzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgIFthdHRyLnJvd3NwYW5dPVwiY2VsbC5yb3dzcGFuID8gY2VsbC5yb3dzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNlbGwuaWQgPyBjZWxsLmlkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJjZWxsLnJvbGUgPyBjZWxsLnJvbGUgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNlbGwuYXJpYUxhYmVsID8gY2VsbC5hcmlhTGFiZWwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImNlbGwuYXJpYURlc2NyaWJlZEJ5ID8gY2VsbC5hcmlhRGVzY3JpYmVkQnkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiY2VsbC5hcmlhTGFiZWxsZWRCeSA/IGNlbGwuYXJpYUxhYmVsbGVkQnkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCJjZWxsLmFyaWFIaWRkZW4gPyBjZWxsLmFyaWFIaWRkZW4gOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImNlbGwuYXJpYURpc2FibGVkID8gY2VsbC5hcmlhRGlzYWJsZWQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImNlbGwuYXJpYUNvbnRyb2xzID8gY2VsbC5hcmlhQ29udHJvbHMgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiY2VsbC5hcmlhQ3VycmVudCA/IGNlbGwuYXJpYUN1cnJlbnQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxpdmVdPVwiY2VsbC5hcmlhTGl2ZSA/IGNlbGwuYXJpYUxpdmUgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImNlbGwuYXJpYUV4cGFuZGVkID8gY2VsbC5hcmlhRXhwYW5kZWQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWVycm9ybWVzc2FnZV09XCJjZWxsLmFyaWFFcnJvck1lc3NhZ2UgPyBjZWxsLmFyaWFFcnJvck1lc3NhZ2UgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cImNlbGwuYXJpYUhhc1BvcHVwID8gY2VsbC5hcmlhSGFzUG9wdXAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjZWxsLnRhYmluZGV4ID8gY2VsbC50YWJpbmRleCA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBjZWxsLCBodG1sOiBjZWxsLmh0bWwsIHRleHQ6IGNlbGwudGV4dCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlVGQ+XG4gICAgICAgICAgICAgICAgICAgPHRkIHRhYmluZGV4PVwiLTFcIiBkZXN5Rm9jdXNDbGlja2VkQ2VsbFxuICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiWydweC1iYXNlIHB5LXNtJywgY2VsbC5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGRlc3lDZWxsIFtyb3ddPVwicm93XCIgW3Jvd0luZGV4XT1cImlGb290ZXJcIiBbY29sdW1uSW5kZXhdPVwiY29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNlbGwuY29sc3BhbiA/IGNlbGwuY29sc3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJjZWxsLnJvd3NwYW4gPyBjZWxsLnJvd3NwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNlbGwuaWQgPyBjZWxsLmlkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiY2VsbC5yb2xlID8gY2VsbC5yb2xlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY2VsbC5hcmlhTGFiZWwgPyBjZWxsLmFyaWFMYWJlbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImNlbGwuYXJpYURlc2NyaWJlZEJ5ID8gY2VsbC5hcmlhRGVzY3JpYmVkQnkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImNlbGwuYXJpYUxhYmVsbGVkQnkgPyBjZWxsLmFyaWFMYWJlbGxlZEJ5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cImNlbGwuYXJpYUhpZGRlbiA/IGNlbGwuYXJpYUhpZGRlbiA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImNlbGwuYXJpYURpc2FibGVkID8gY2VsbC5hcmlhRGlzYWJsZWQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJjZWxsLmFyaWFDb250cm9scyA/IGNlbGwuYXJpYUNvbnRyb2xzIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJjZWxsLmFyaWFDdXJyZW50ID8gY2VsbC5hcmlhQ3VycmVudCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxpdmVdPVwiY2VsbC5hcmlhTGl2ZSA/IGNlbGwuYXJpYUxpdmUgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJjZWxsLmFyaWFFeHBhbmRlZCA/IGNlbGwuYXJpYUV4cGFuZGVkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXJyb3JtZXNzYWdlXT1cImNlbGwuYXJpYUVycm9yTWVzc2FnZSA/IGNlbGwuYXJpYUVycm9yTWVzc2FnZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cImNlbGwuYXJpYUhhc1BvcHVwID8gY2VsbC5hcmlhSGFzUG9wdXAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiY2VsbC50YWJpbmRleCA/IGNlbGwudGFiaW5kZXggOiAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBjZWxsLCBodG1sOiBjZWxsLmh0bWwsIHRleHQ6IGNlbGwudGV4dCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgIDwvdHI+XG4gICAgPC90Zm9vdD5cbiAgPC90YWJsZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgKm5nSWY9XCJ3cmFwcGVyOyBlbHNlIHRhYmxlQ29udGVudFwiIFtjbGFzc109XCJ3cmFwcGVyLmNsYXNzZXNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYWR2YW5jZWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzeS1hbmd1bGFyL3NyYy9saWIvZGVzeS10YWJsZXMvY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC90YWJsZS1hZHZhbmNlZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXN5LWFuZ3VsYXIvc3JjL2xpYi9kZXN5LXRhYmxlcy9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkL3RhYmxlLWFkdmFuY2VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQXFCLE9BQU8sRUFBd0IsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUVwRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUU1RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUM1RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3RGLE1BQU0sT0FBTyxzQkFBdUIs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TSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9TdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgU2VsZWN0SXRlbURhdGEgfSBmcm9tICcuLi8uLi8uLi9kZXN5LWZvcm1zL2ludGVyZmFjZXMvc2VsZWN0LWl0ZW0tZGF0YSc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgRGVzeUNvbnRlbnRDaGlsZCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9kZWNvcmF0b3JzL2Rlc3ktY29udGVudC1jaGlsZC5kZWNvcmF0b3InO1xuaW1wb3J0IHsgU2VhcmNoVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvc2VhcmNoLXV0aWxzJztcbmltcG9ydCB7IENlbGxEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NlbGwuZGlyZWN0aXZlJztcbmltcG9ydCB7IFJvd0RpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcm93LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIZWFkQ2VsbE1vZGVsRGF0YSwgT3JkZXJCeSwgUm93RGF0YSwgV3JhcHBlckRhdGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJlY2FsY3VsYXRlVGFibGVQYXJhbXMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlY2FsY3VsYXRlLXRhYmxlLXBhcmFtcyc7XG5pbXBvcnQgeyBUYWJsZUNhcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi90YWJsZS9jb21wb25lbnRzL3RhYmxlLWNhcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLy4uLy4uLy4uL2Rlc3ktY29tbW9ucy9jb21wb25lbnRzL2NvbnRlbnQvY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBZHZhbmNlZEZvb3RlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC1mb290ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWR2YW5jZWRIZWFkZXJDZWxsQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkLWhlYWRlci1jZWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUFkdmFuY2VkSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWFkdmFuY2VkLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hZHZhbmNlZC1yb3cuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWR2YW5jZWRTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtYWR2YW5jZWQtc2VsZWN0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Rlc3ktdGFibGUtYWR2YW5jZWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtYWR2YW5jZWQuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQWR2YW5jZWRDb21wb25lbnQgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblxuICBfcm93czogUm93RGF0YVtdOyAvLyBvcmlnaW5hbCBkYXRhXG4gIEBJbnB1dCgpXG4gIHNldCByb3dzKHJvd3M6IFJvd0RhdGFbXSkge1xuICAgIHRoaXMuX3Jvd3MgPSByb3dzO1xuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlRWxlbWVudHMoKVxuICB9XG4gIGdldCByb3dzKCk6IFJvd0RhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3NcbiAgfVxuICBASW5wdXQoKSBoZWFkOiBIZWFkQ2VsbE1vZGVsRGF0YVtdO1xuICBASW5wdXQoKSBmb290OiBSb3dEYXRhW107XG5cbiAgQElucHV0KCkgY2FwdGlvbjogc3RyaW5nO1xuICBASW5wdXQoKSBjYXB0aW9uQ2xhc3Nlczogc3RyaW5nO1xuICBASW5wdXQoKSBmaXJzdENlbGxJc0hlYWRlcjogYm9vbGVhbjtcbiAgQElucHV0KCkgaGFzQ2hlY2tib3hlczogYm9vbGVhbjtcbiAgQElucHV0KCkgaWRQcmVmaXg6IHN0cmluZztcbiAgQElucHV0KCkgY2xhc3Nlczogc3RyaW5nO1xuICBASW5wdXQoKSBjaGVja2JveENsYXNzZXM6IHN0cmluZztcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgQElucHV0KCkgd3JhcHBlcjogV3JhcHBlckRhdGE7XG5cblxuICBARGVzeUNvbnRlbnRDaGlsZCgpXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFibGVDYXB0aW9uQ29tcG9uZW50KSBjYXB0aW9uQ29tcG9uZW50OiBUYWJsZUNhcHRpb25Db21wb25lbnQ7XG5cbiAgQERlc3lDb250ZW50Q2hpbGQoKVxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQWR2YW5jZWRIZWFkZXJDb21wb25lbnQpIGhlYWRlckNvbXBvbmVudDogVGFibGVBZHZhbmNlZEhlYWRlckNvbXBvbmVudDtcblxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQWR2YW5jZWRGb290ZXJDb21wb25lbnQpIGZvb3RlckNvbXBvbmVudDogUXVlcnlMaXN0PFRhYmxlQWR2YW5jZWRGb290ZXJDb21wb25lbnQ+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFibGVBZHZhbmNlZFJvd0NvbXBvbmVudCkgcm93Q29tcG9uZW50TGlzdDogUXVlcnlMaXN0PFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQ+O1xuICBAVmlld0NoaWxkcmVuKFJvd0RpcmVjdGl2ZSkgcm93RGF0YTogUXVlcnlMaXN0PFJvd0RpcmVjdGl2ZT47XG5cbiAgQE91dHB1dCgpIHJvd3NDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByb3dzQ2hlY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJlY2FsY3VsYXRlVGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY2FsY3VsYXRlVGFibGVQYXJhbXM+KCk7XG5cbiAgdmlzaWJsZVJvd3M6IFJvd0RhdGFbXSB8IFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnRbXTtcbiAgb3JkZXJCeVR5cGUgPSBPcmRlckJ5O1xuICBpc1Jlc2V0OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwcml2YXRlIHJvd3NTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yb3dzU3Vic2NyaXB0aW9uID0gdGhpcy5yb3dDb21wb25lbnRMaXN0LmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlRWxlbWVudHMoKSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJvd3NTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm93c1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtbnRzRm9jdXMgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW3RhYmluZGV4XScpO1xuICAgIGlmIChlbGVtbnRzRm9jdXMpIHtcbiAgICAgIGVsZW1udHNGb2N1cy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB9XG4gICAgdGhpcy5yZWNhbGN1bGF0ZVZpc2libGVFbGVtZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2NhIGxhcyBmaWxhcyB2aXNpYmxlcyB0cmFzIHJlYWxpemFyc2UgdW5hIGLDunNxdWVkYSBvIHVuYSBvcmRlbmFjacOzblxuICAgKi9cbiAgcmVjYWxjdWxhdGVWaXNpYmxlRWxlbWVudHMoKTogdm9pZCB7XG4gICAgY29uc3QgcmVjYWxjdWxhdGVQYXJhbXMgPSB0aGlzLmJ1aWxkUmVjYWxjdWxhdGVQYXJhbXMoKTtcblxuICAgIC8vIFNpIHNlIGNhcHR1cmEgZWwgZXZlbnRvIHJlY2FsY3VsYXRlVGFibGUgc2UgZGVqYSBhbCB1c3VhcmlvIGxhIHJlc3BvbnNhYmlsaWRhZCBkZSBmaWx0cmFyIHkgb3JkZW5hciBsb3MgZWxlbWVudG9zLlxuICAgIGlmICh0aGlzLnJlY2FsY3VsYXRlVGFibGUub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVUYWJsZS5lbWl0KHJlY2FsY3VsYXRlUGFyYW1zKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgLy8gU2UgZGViZW4gbW9zdHJhciB0b2RhcyBsYXMgZmlsYXMgdGVtcG9yYWxtZW50ZSBwYXJhIHBvZGVyIGFwbGljYXIgZWwgZmlsdHJvIHkgbGEgb3JkZW5hY2nDs24gc29icmUgZWwgY29udGVuaWRvIGluc2VydGFkb1xuICAgICAgdGhpcy52aXNpYmxlUm93cyA9IHRoaXMuZ2V0Um93cygpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgIC8vIFNlIGFwbGljYSBlbCBmaWx0cm8geSBsYSBvcmRlbmFjacOzblxuICAgICAgbGV0IHJvd0RhdGEgPSB0aGlzLmZpbHRlclJvd3MocmVjYWxjdWxhdGVQYXJhbXMsIHRoaXMucm93RGF0YS50b0FycmF5KCkpO1xuICAgICAgcm93RGF0YSA9IHRoaXMuc29ydFJvd3MocmVjYWxjdWxhdGVQYXJhbXMsIHJvd0RhdGEpO1xuICAgICAgdGhpcy52aXNpYmxlUm93cyA9IHJvd0RhdGEubWFwKHIgPT4gci5kZXN5Um93KSBhcyBSb3dEYXRhW10gfCBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50W107XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1eWUgbG9zIHBhcsOhbWV0cm9zIG5lY2VzYXJpb3MgcGFyYSByZWNhbGN1bGFyIGxhIHRhYmxhLCBpbmRpY2FuZG8gbG9zIGZpbHRyb3MgeSBsYSBvcmRlbmFjacOzblxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJlY2FsY3VsYXRlUGFyYW1zKCk6IFJlY2FsY3VsYXRlVGFibGVQYXJhbXMge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGZpbHRlcnM6IFtdLFxuICAgICAgc29ydDogbnVsbFxuICAgIH07XG5cbiAgICBjb25zdCBoZWFkID0gdGhpcy5nZXRIZWFkZXJDZWxscygpIGFzIChIZWFkQ2VsbE1vZGVsRGF0YSB8IFRhYmxlQWR2YW5jZWRIZWFkZXJDZWxsQ29tcG9uZW50KVtdO1xuICAgIGlmIChoZWFkKSB7XG4gICAgICBoZWFkLmZvckVhY2goKGhlYWRlckNlbGwsIGhlYWRlckNlbGxJbmRleCkgPT4ge1xuICAgICAgICBpZiAoaGVhZGVyQ2VsbC5oYXNGaWx0ZXIgJiYgaGVhZGVyQ2VsbC5hY3RpdmVGaWx0ZXIpIHtcbiAgICAgICAgICBwYXJhbXMuZmlsdGVycy5wdXNoKHsgY29sdW1uSW5kZXg6IGhlYWRlckNlbGxJbmRleCwgZmlsdGVyVGV4dDogaGVhZGVyQ2VsbC52YWx1ZUZpbHRlciwgaWRlbnRpZmllcjogaGVhZGVyQ2VsbC5pZGVudGlmaWVyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhlYWRlckNlbGwuaGFzU2VsZWN0ICYmIGhlYWRlckNlbGwuYWN0aXZlU2VsZWN0KSB7XG4gICAgICAgICAgcGFyYW1zLmZpbHRlcnMucHVzaCh7IGNvbHVtbkluZGV4OiBoZWFkZXJDZWxsSW5kZXgsIGZpbHRlclRleHQ6IGhlYWRlckNlbGwudmFsdWVTZWxlY3QsIGlkZW50aWZpZXI6IGhlYWRlckNlbGwuaWRlbnRpZmllciB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yZGVyQnlDb2x1bW5JbmRleCA9IGhlYWQuZmluZEluZGV4KGNlbGwgPT4gY2VsbC5vcmRlckJ5ICYmIGNlbGwub3JkZXJCeSAhPT0gT3JkZXJCeS5ub25lKTtcbiAgICAgIHBhcmFtcy5zb3J0ID0gKG9yZGVyQnlDb2x1bW5JbmRleCA+PSAwKSA/IHsgY29sdW1uSW5kZXg6IG9yZGVyQnlDb2x1bW5JbmRleCwgb3JkZXI6IGhlYWRbb3JkZXJCeUNvbHVtbkluZGV4XS5vcmRlckJ5IH0gOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bmNpb25lcyBkZSByZWNvZ2VyIGlkcywgeSBjYXJhY3RlcmlzdGljYXNcbiAgICovXG5cbiAgaGFzRmlsdGVycygpOiBib29sZWFuIHtcbiAgICBjb25zdCBoZWFkID0gdGhpcy5nZXRIZWFkZXJDZWxscygpO1xuICAgIHJldHVybiBoZWFkID8gaGVhZC5maW5kSW5kZXgoY2VsbCA9PiAoY2VsbC5oYXNGaWx0ZXIpIHx8IChjZWxsLmhhc1NlbGVjdCkpID49IDAgOiBmYWxzZTtcbiAgfVxuXG4gIGdldEhlYWRlckNlbGxzKCk6IEhlYWRDZWxsTW9kZWxEYXRhW10gfCBUYWJsZUFkdmFuY2VkSGVhZGVyQ2VsbENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJDb21wb25lbnQgJiYgdGhpcy5oZWFkZXJDb21wb25lbnQuY2VsbHMubGVuZ3RoID4gMCA/IHRoaXMuaGVhZGVyQ29tcG9uZW50LmNlbGxzLnRvQXJyYXkoKSA6IHRoaXMuaGVhZDtcbiAgfVxuXG4gIGdldEZvb3RlckNlbGxzKCk6IFJvd0RhdGFbXSB8IFRhYmxlQWR2YW5jZWRGb290ZXJDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9vdGVyQ29tcG9uZW50ICYmIHRoaXMuZm9vdGVyQ29tcG9uZW50Lmxlbmd0aCA+IDAgPyB0aGlzLmZvb3RlckNvbXBvbmVudC50b0FycmF5KCkgOiB0aGlzLmZvb3Q7XG4gIH1cblxuICBnZXRSb3dzKCkge1xuICAgIGxldCByb3dzID0gW107XG4gICAgaWYgKHRoaXMucm93Q29tcG9uZW50TGlzdD8ubGVuZ3RoID4gMCkge1xuICAgICAgcm93cyA9IHRoaXMucm93Q29tcG9uZW50TGlzdC50b0FycmF5KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvd3MpIHtcbiAgICAgIHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpIHNlIHNvYnJlZXNjcmliZSAgZWwgY29tcG9ydGFtaWVudG8gcG9yIGRlZmVjdG8gZGUgZmlsdHJhZG8geSBvcmRlbmFjacOzbiwgc2UgdXRpbGl6YXLDoW4gbGFzIGluZGljYWRhcyBkZXNkZSBmdWVyYSBkZWxcbiAgICogY29tcG9uZW50ZSAoeWEgc2VhIHBvciBwYXLDoW1ldHJvIG8gcG9yIGNvbnRlbmlkbykuXG4gICAqIFNpIG5vIHNlIHNvYnJlZXNjcmliZSwgZGV2dWVsdmUgbGFzIGZpbGFzIGNhbGN1bGFkYXMuXG4gICAqL1xuICBnZXRWaXNpYmxlUm93cygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNhbGN1bGF0ZVRhYmxlLm9ic2VydmVycy5sZW5ndGggPiAwID8gdGhpcy5nZXRSb3dzKCkgOiB0aGlzLnZpc2libGVSb3dzO1xuICB9XG5cbiAgZ2V0SWRQcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZFByZWZpeCA/IHRoaXMuaWRQcmVmaXggOiAnaWQtdGFibGUtcm93JztcbiAgfVxuXG4gIGdldElkSGVhZGVyKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldElkUHJlZml4KCkgKyAnLWhlYWRlci0nICsgaW5kZXg7XG4gIH1cblxuICBnZXRJZFJvd0NoZWNrYm94KGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldElkUHJlZml4KCkgKyAnLWNoZWNrYm94LScgKyBpbmRleDtcbiAgfVxuXG4gIGdldElkSGVhZGVyRmlsdGVyKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldElkUHJlZml4KCkgKyAnLWhlYWRlci1maWx0ZXItJyArIGluZGV4O1xuICB9XG5cbiAgZ2V0SWRIZWFkZXJTZWxlY3QoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SWRQcmVmaXgoKSArICctaGVhZGVyLXNlbGVjdC0nICsgaW5kZXg7XG4gIH1cblxuICBnZXRDYXB0aW9uQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jYXB0aW9uQ29tcG9uZW50ID8gdGhpcy5jYXB0aW9uQ29tcG9uZW50LmNsYXNzZXMgOiB0aGlzLmNhcHRpb25DbGFzc2VzO1xuICB9XG5cbiAgZ2V0U3RyaW5nT3JkZXJCeShvcmRlckJ5OiBPcmRlckJ5KTogc3RyaW5nIHtcbiAgICBpZiAob3JkZXJCeSA9PT0gT3JkZXJCeS5hc2MpIHtcbiAgICAgIHJldHVybiAnYXNjZW5kaW5nJztcbiAgICB9IGVsc2UgaWYgKG9yZGVyQnkgPT09IE9yZGVyQnkuZGVzYykge1xuICAgICAgcmV0dXJuICdkZXNjZW5kaW5nJztcbiAgICB9IGVsc2UgaWYgKG9yZGVyQnkgPT09IE9yZGVyQnkubm9uZSkge1xuICAgICAgcmV0dXJuICdub25lJztcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RGb3JJdGVtKGl0ZW06IGFueSk6IFRhYmxlQWR2YW5jZWRTZWxlY3RDb21wb25lbnQge1xuICAgIHJldHVybiBpdGVtLnNlbGVjdENvbXBvbmVudCA/IGl0ZW0uc2VsZWN0Q29tcG9uZW50IDogbnVsbDtcbiAgfVxuXG4gIGdldEl0ZW1TZWxlY3RPcHRpb25zKGl0ZW06IFRhYmxlQWR2YW5jZWRTZWxlY3RDb21wb25lbnQpOiBTZWxlY3RJdGVtRGF0YVtdIHtcbiAgICByZXR1cm4gaXRlbS5zZWxlY3RJdGVtQ29tcG9uZW50TGlzdCAmJiBpdGVtLnNlbGVjdEl0ZW1Db21wb25lbnRMaXN0Lmxlbmd0aCA+IDAgP1xuICAgICAgaXRlbS5zZWxlY3RJdGVtQ29tcG9uZW50TGlzdC50b0FycmF5KCkgOiBpdGVtLml0ZW1zO1xuICB9XG5cbiAgZ2V0Q29udGVudENvbXBvbmVudChpdGVtOiBUYWJsZUFkdmFuY2VkSGVhZGVyQ2VsbENvbXBvbmVudCk6IENvbnRlbnRDb21wb25lbnQge1xuICAgIHJldHVybiBpdGVtLmNvbnRlbnRDb21wb25lbnQgPyBpdGVtLmNvbnRlbnRDb21wb25lbnQgOiBudWxsO1xuICB9XG5cblxuICAvKipcbiAgICogY2hlY2tzXG4gICAqL1xuICBoYW5kbGVDaGVja2JveENoYW5nZShyb3c6IFJvd0RhdGEgfCBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50KTogdm9pZCB7XG4gICAgaWYgKHJvdyBpbnN0YW5jZW9mIFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQpIHtcbiAgICAgIHJvdy5jaGVja2VkQ2hhbmdlLmVtaXQocm93LmNoZWNrZWQpO1xuICAgIH1cbiAgICB0aGlzLm5vdGlmeUNoZWNrZWRDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJtaXRlIGRlc21hcmNhciB0b2RhcyBsYXMgZmlsYXNcbiAgICovXG4gIHByaXZhdGUgdW5jaGVja0FsbCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldFJvd3MoKS5mb3JFYWNoKHIgPT4ge1xuICAgICAgY29uc3QgbXVzdEVtaXQgPSByLmNoZWNrZWQgJiYgciBpbnN0YW5jZW9mIFRhYmxlQWR2YW5jZWRSb3dDb21wb25lbnQ7XG4gICAgICByLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIGlmIChtdXN0RW1pdCkge1xuICAgICAgICAociBhcyBUYWJsZUFkdmFuY2VkUm93Q29tcG9uZW50KS5jaGVja2VkQ2hhbmdlLmVtaXQoci5jaGVja2VkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUNoZWNrZWRDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZmljYSBjYW1iaW9zIGVuIGxhcyBmaWxhc1xuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlDaGVja2VkQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJvd0NvbXBvbmVudExpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnJvd3NDaGFuZ2UuZW1pdCh0aGlzLnJvd3MpO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd0NoZWNrczogYW55ID0ge307XG4gICAgdGhpcy5nZXRSb3dzKCkuZm9yRWFjaChyID0+IHJvd0NoZWNrc1tyLmlkXSA9ICEhci5jaGVja2VkKTsgLy8gU2UgYXBsaWNhbiB0YW1iacOpbiBhIGxhcyBubyB2aXNpYmxlc1xuICAgIHRoaXMucm93c0NoZWNrZWQuZW1pdChyb3dDaGVja3MpO1xuICB9XG5cblxuICAvKipcbiAgICogYnVzcXVlZGFcbiAgICovXG4gIGhhbmRsZUlucHV0U2VhcmNoKGl0ZW06IEhlYWRDZWxsTW9kZWxEYXRhKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uaGFzRmlsdGVyKSB7IC8vIHNpIHRpZW5lIGJ1c2NhZG9yXG4gICAgICBpdGVtLmFjdGl2ZUZpbHRlciA9ICEhaXRlbS52YWx1ZUZpbHRlcjtcbiAgICAgIHRoaXMudW5jaGVja0FsbCgpO1xuICAgIH1cbiAgICBpZiAoaXRlbS5oYXNTZWxlY3QpIHsgLy9TaSB0aWVuZSBzZWxlY2Npb25hYmxlXG4gICAgICBpdGVtLmFjdGl2ZVNlbGVjdCA9ICEhaXRlbS52YWx1ZVNlbGVjdDtcbiAgICAgIHRoaXMudW5jaGVja0FsbCgpO1xuICAgIH1cblxuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlRWxlbWVudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZSBmaWx0cmFuIGxhcyBmaWxhcyBzZWfDum4gbG8gZXNwZWNpZmljYWRvIGVuIGxhIGJhcnJhIGRlIGLDunNxdWVkYSBkZSBjYWRhIGNvbHVtbmEuXG4gICAqIFNpIG5vIGhheSBiw7pzcXVlZGEgc3NlIGRldnVlbHZlbiB0b2RhcyBsYXMgZmlsYXMuXG4gICAqIEBwYXJhbSByZWNhbGN1bGF0ZVBhcmFtcyBwYXJhbWV0cm9zIHBhcmEgcmVjYWxjdWxhciBsb3MgZWxlbWVudG9zIHZpc2libGVzXG4gICAqIEBwYXJhbSByb3dzIGxpc3RhIGNvbiB0b2RhcyBsYXMgZmlsYXNcbiAgICogQHJldHVybiBsaXN0YSBkZSBmaWxhcyBmaWx0cmFkYVxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJSb3dzKHJlY2FsY3VsYXRlUGFyYW1zOiBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zLCByb3dzOiBSb3dEaXJlY3RpdmVbXSk6IFJvd0RpcmVjdGl2ZVtdIHtcbiAgICBsZXQgZmlsdGVyZWRSb3dzID0gcm93cztcbiAgICByZWNhbGN1bGF0ZVBhcmFtcy5maWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIGZpbHRlcmVkUm93cyA9IGZpbHRlcmVkUm93cy5maWx0ZXIocm93ID0+XG4gICAgICAgIFNlYXJjaFV0aWxzLmNvbnRhaW5zQW55V29yZEZyb20ocm93LmdldENlbGwoZmlsdGVyLmNvbHVtbkluZGV4KS5nZXRDb250ZW50KCksIGZpbHRlci5maWx0ZXJUZXh0KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbHRlcmVkUm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBvcmRlbmFjaW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBQZXJtaXRlIGluZGljYXIgcXVlIHNlIGRlYmUgb3JkZW5hciBsYSB0YWJsYVxuICAgKiBAcGFyYW0gaW5kZXggaW5kaWNlIGRlIGxhIGNvbHVtbmFcbiAgICovXG4gIGhhbmRsZVNvcnRCeUNvbHVtbihpbmRleDogbnVtYmVyLCBldmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmdldEhlYWRlckNlbGxzKCk7XG4gICAgaWYgKGhlYWQpIHtcbiAgICAgIGhlYWQuZm9yRWFjaCgoY2VsbCwgY2VsbEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjZWxsLm9yZGVyQnkpIHtcbiAgICAgICAgICBjZWxsLm9yZGVyQnkgPSBjZWxsSW5kZXggPT09IGluZGV4ID8gdGhpcy5nZXROZXh0RGlyZWN0aW9uKGNlbGwpIDogT3JkZXJCeS5ub25lO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlY2FsY3VsYXRlVmlzaWJsZUVsZW1lbnRzKCk7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBPcmRlbmEgbGFzIGZpbGFzIGluZGljYWRhcyBzZWfDum4gbGEgY29sdW1uYSBlc3BlY2lmaWNhZGEgZW4gbGEgY2FiZWNlcmFcbiAgICogQHBhcmFtIHJlY2FsY3VsYXRlUGFyYW1zIHBhcmFtZXRyb3MgcGFyYSByZWNhbGN1bGFyIGxvcyBlbGVtZW50b3MgdmlzaWJsZXNcbiAgICogQHBhcmFtIHJvd3MgZmlsYXMgZGUgbGEgdGFibGEgYSBvcmRlbmFyXG4gICAqIEByZXR1cm4gbWlzbWFzIGZpbGFzIHBlcm8gb3JkZW5hZGFzIHBvciBsYSBjb2x1bW5hIGluZGljYWRhXG4gICAqL1xuICBwcml2YXRlIHNvcnRSb3dzKHJlY2FsY3VsYXRlUGFyYW1zOiBSZWNhbGN1bGF0ZVRhYmxlUGFyYW1zLCByb3dzOiBSb3dEaXJlY3RpdmVbXSk6IFJvd0RpcmVjdGl2ZVtdIHtcbiAgICBsZXQgc29ydGVkUm93cyA9IHJvd3M7XG4gICAgaWYgKHJlY2FsY3VsYXRlUGFyYW1zLnNvcnQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gcmVjYWxjdWxhdGVQYXJhbXMuc29ydC5jb2x1bW5JbmRleDtcbiAgICAgIGNvbnN0IGlzQXNjID0gcmVjYWxjdWxhdGVQYXJhbXMuc29ydC5vcmRlciA9PT0gT3JkZXJCeS5hc2M7XG4gICAgICBzb3J0ZWRSb3dzID0gcm93cy5zb3J0KChhLCBiKSA9PlxuICAgICAgICB0aGlzLmNvbXBhcmVDZWxsQ29udGVudChhLmdldENlbGwoY29sdW1uSW5kZXgpLCBiLmdldENlbGwoY29sdW1uSW5kZXgpLCBpc0FzYykpO1xuICAgIH1cblxuICAgIHJldHVybiBzb3J0ZWRSb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmEgZWwgY29udGVuaWRvIGRlIGRvcyBjZWxkYXMuIEVzdGUgc2UgaW52aWVydGUgc2kgZWwgb3JkZW4gZXNwZWNpZmljYWRvIGVzIGRlc2NlbmRlbnRlLlxuICAgKi9cbiAgY29tcGFyZUNlbGxDb250ZW50KGE6IENlbGxEaXJlY3RpdmUsIGI6IENlbGxEaXJlY3RpdmUsIGlzQXNjOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IGFDb21wYXJhYmxlID0gdGhpcy5jbGVhbkN1cnJlbmN5KGEuZ2V0Q29udGVudCgpKS50cmltKCk7XG4gICAgY29uc3QgYkNvbXBhcmFibGUgPSB0aGlzLmNsZWFuQ3VycmVuY3koYi5nZXRDb250ZW50KCkpLnRyaW0oKTtcbiAgICBjb25zdCBudW1iZXJSZWdleCA9IC9eLT9cXGQrKFxcLnwsKT9cXGQqJC87XG4gICAgY29uc3QgZGF0ZVJlZ2V4ID0gL14oXFxkezJ9KShcXC98LSkoXFxkezJ9KShcXC98LSkoXFxkezR9KSggKFxcZHsyfSk6KFxcZHsyfSkoOihcXGR7Mn0pKT8pPyQvO1xuICAgIGlmIChhQ29tcGFyYWJsZSAmJiBiQ29tcGFyYWJsZSkge1xuICAgICAgaWYgKG51bWJlclJlZ2V4LnRlc3QoYUNvbXBhcmFibGUpICYmIG51bWJlclJlZ2V4LnRlc3QoYkNvbXBhcmFibGUpKSB7IC8vIE51bWVyb3NcbiAgICAgICAgcmVzdWx0ID0gKHBhcnNlRmxvYXQoYUNvbXBhcmFibGUpIC0gcGFyc2VGbG9hdChiQ29tcGFyYWJsZSkpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChkYXRlUmVnZXgudGVzdChhQ29tcGFyYWJsZSkgJiYgZGF0ZVJlZ2V4LnRlc3QoYkNvbXBhcmFibGUpKSB7IC8vIEZlY2hhc1xuICAgICAgICByZXN1bHQgPSB0aGlzLnBhcnNlRGF0ZVRpbWUoYUNvbXBhcmFibGUpIC0gdGhpcy5wYXJzZURhdGVUaW1lKGJDb21wYXJhYmxlKTtcbiAgICAgIH0gZWxzZSB7IC8vIFRleHRvXG4gICAgICAgIHJlc3VsdCA9IGFDb21wYXJhYmxlLmxvY2FsZUNvbXBhcmUoYkNvbXBhcmFibGUsICdlcycsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJywgaWdub3JlUHVuY3R1YXRpb246IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgKiAoaXNBc2MgPyAxIDogLTEpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZURhdGVUaW1lKGlucHV0OiBzdHJpbmcpIHsgLy8gMzEvMTIvMjAyMyAxMjoxMjoxMiBvciAzMS0xMi0yMDIzIDEyOjEyOjEyIGZlY2hhcyBxdWUgYWNlcHRhLCBoaDptbTpzcyBlcyBvcGNpb25hbFxuICAgIGxldCBbZGF0ZVBhcnQsIHRpbWVQYXJ0XSA9IGlucHV0LnNwbGl0KCcgJyk7XG4gICAgbGV0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IGRhdGVQYXJ0LnNwbGl0KC9cXC98LS8pLm1hcChOdW1iZXIpO1xuICAgIGxldCBbaG91cnMgPSAwLCBtaW51dGVzID0gMCwgc2Vjb25kcyA9IDBdID0gKHRpbWVQYXJ0ID8gdGltZVBhcnQuc3BsaXQoJzonKSA6IFtdKS5tYXAoTnVtYmVyKTtcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcyk7XG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlIGNhbGN1bGEgbGEgb3JkZW5hY2nDs24gbnVldmFcbiAgICovXG4gIHByaXZhdGUgZ2V0TmV4dERpcmVjdGlvbihpdGVtOiBIZWFkQ2VsbE1vZGVsRGF0YSk6IE9yZGVyQnkge1xuICAgIGlmIChpdGVtLm9yZGVyQnkgPT09IE9yZGVyQnkubm9uZSB8fCBpdGVtLm9yZGVyQnkgPT09IE9yZGVyQnkuZGVzYykge1xuICAgICAgcmV0dXJuIE9yZGVyQnkuYXNjO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT3JkZXJCeS5kZXNjO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzaSBlcyB1bmEgY2FudGlkYWQgZGUgZGluZXJvIHNlIHF1aXRhIOKCrCBwYXJhIHBvZGVyIGNvbXBhcmFyIGxvcyBudW1lcm9zXG4gICAqL1xuICBwcml2YXRlIGNsZWFuQ3VycmVuY3kodHh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHR4dCA9IHR4dC5yZXBsYWNlKC/igqwvZywgJycpO1xuICAgIHJldHVybiB0eHQ7XG4gIH1cblxuICBzZWxlY3RGaWx0ZXIoaXRlbTogVGFibGVBZHZhbmNlZFNlbGVjdENvbXBvbmVudCwgaXRlbVZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpdGVtLnZhbHVlQ2hhbmdlLmVtaXQoaXRlbVZhbHVlKTtcblxuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmdldEhlYWRlckNlbGxzKCk7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0Um93cygpO1xuICAgIGlmIChoZWFkICYmIHJvd3MpIHtcbiAgICAgIGhlYWQuZm9yRWFjaCgoY2VsbDogVGFibGVBZHZhbmNlZEhlYWRlckNlbGxDb21wb25lbnQsIGNlbGxJbmRleCkgPT4ge1xuICAgICAgfSk7XG4gICAgICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICN0YWJsZUNvbnRlbnQ+XG4gIDx0YWJsZSByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgW2NsYXNzXT1cIlsnYy10YWJsZS1hZHZhbmNlZCBib3JkZXItdC0yIGJvcmRlci1iLTIgYm9yZGVyLW5ldXRyYWwtYmFzZScsIGNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICBbYXR0ci5pZF09XCJpZCA/IGlkIDogbnVsbFwiXG4gICAgICAgICAgW2Rlc3lBcHBBY2Nlc3NpYmlsaXR5XT1cInRoaXNcIj5cbiAgICAgIDxjYXB0aW9uICpuZ0lmPVwiY2FwdGlvbiB8fCBjYXB0aW9uQ29tcG9uZW50XCIgW2NsYXNzXT1cImdldENhcHRpb25DbGFzcygpXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogY2FwdGlvbkNvbXBvbmVudCwgdGV4dDogY2FwdGlvbiA/IGNhcHRpb24gOiBudWxsIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvY2FwdGlvbj5cbiAgICAgIDx0aGVhZCAqbmdJZj1cImdldEhlYWRlckNlbGxzKClcIj5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJib3JkZXItdCBib3JkZXItbmV1dHJhbC1iYXNlIGRpdmlkZS14IGRpdmlkZS1uZXV0cmFsLWJhc2VcIj5cbiAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiaGFzQ2hlY2tib3hlc1wiIHNjb3BlPVwiY29sXCIgW2NsYXNzXT1cIlsnYWxpZ24tdG9wIHB4LWJhc2UgcHkteHMnLCAndy0xNicsIGNoZWNrYm94Q2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPlNlbGVjY2lvbmFyIGZpbGE8L3NwYW4+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEhlYWRlckNlbGxzKCk7IGluZGV4IGFzIGlIZWFkZXJcIiBbaWRdPVwiZ2V0SWRIZWFkZXIoaUhlYWRlcilcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc29ydF09XCJpdGVtLm9yZGVyQnkgPyBnZXRTdHJpbmdPcmRlckJ5KGl0ZW0ub3JkZXJCeSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiWydhbGlnbi10b3AgcHgtYmFzZSBweS1zbSBib3JkZXItbmV1dHJhbC1iYXNlIGJvcmRlci1iLTAgdGV4dC1sZWZ0IHRleHQtc20gZm9udC1ub3JtYWwgdGV4dC1uZXV0cmFsLWRhcmsnLCBpdGVtLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cIml0ZW0uY29sc3BhbiA/IGl0ZW0uY29sc3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cIml0ZW0ucm93c3BhbiA/IGl0ZW0ucm93c3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGVzeUFwcEFjY2Vzc2liaWxpdHldPVwiaXRlbVwiPlxuXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0ub3JkZXJCeVwiIGNsYXNzPVwiaW5saW5lLWJsb2NrIHJlbGF0aXZlXCIgKGNsaWNrKT1cImhhbmRsZVNvcnRCeUNvbHVtbihpSGVhZGVyLCRldmVudClcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVTb3J0QnlDb2x1bW4oaUhlYWRlciwkZXZlbnQpXCIgKGtleWRvd24uc3BhY2UpPVwiaGFuZGxlU29ydEJ5Q29sdW1uKGlIZWFkZXIsJGV2ZW50KVwiIGRlc3lGb2N1c0NsaWNrZWRDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpdGVtLm9yZGVyQnkgPyAtMSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJpdGVtLm9yZGVyQnkgPyAnYnV0dG9uJyA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGV4dFwiPnt7aXRlbS50ZXh0fX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uY29udGVudENvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogaXRlbS5jb250ZW50Q29tcG9uZW50IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYy10YWJsZS1hZHZhbmNlZF9fb3JkZXJcIiAqbmdJZj1cIml0ZW0ub3JkZXJCeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+UHVsc2EgcGFyYSBvcmRlbmFyIHBvciBlc3RhIGNvbHVtbmE8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImMtdGFibGUtYWR2YW5jZWRfX2FzY2VuZGluZ1wiICpuZ0lmPVwiaXRlbS5vcmRlckJ5ID09PSBvcmRlckJ5VHlwZS5hc2NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNDAgMTQwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgd2lkdGg9XCIxZW1cIiBoZWlnaHQ9XCIxZW1cIj48cGF0aCBkPVwiTTExMi4wNyAzNy45M2wtMzUtMzVhMTAgMTAgMCAwMC0xNC4xNCAwbC0zNSAzNWExMCAxMCAwIDAwMTQuMTQgMTQuMTRsMTMuNjYtMTMuNjZBMi41IDIuNSAwIDAxNjAgNDAuMThWMTMwYTEwIDEwIDAgMDAyMCAwVjQwLjE4YTIuNSAyLjUgMCAwMTQuMjctMS43N2wxMy42NiAxMy42NmExMCAxMCAwIDAwMTQuMTQtMTQuMTR6XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYy10YWJsZS1hZHZhbmNlZF9fZGVzY2VuZGluZ1wiICpuZ0lmPVwiaXRlbS5vcmRlckJ5ID09PSBvcmRlckJ5VHlwZS5kZXNjXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTQwIDE0MFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHdpZHRoPVwiMWVtXCIgaGVpZ2h0PVwiMWVtXCI+PHBhdGggZD1cIk0yNy45MyAxMDIuMDdsMzUgMzVhMTAgMTAgMCAwMDE0LjE0IDBsMzUtMzVhMTAgMTAgMCAwMC0xNC4xNC0xNC4xNGwtMTMuNjYgMTMuNjZBMi41IDIuNSAwIDAxODAgOTkuODJWMTBhMTAgMTAgMCAwMC0yMCAwdjg5LjgyYTIuNSAyLjUgMCAwMS00LjI3IDEuNzdMNDIuMDcgODcuOTNhMTAgMTAgMCAwMC0xNC4xNCAxNC4xNHpcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjLXRhYmxlLWFkdmFuY2VkX19ub25lXCIgICpuZ0lmPVwiaXRlbS5vcmRlckJ5ID09PSBvcmRlckJ5VHlwZS5ub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTQwIDE0MFwiIGNsYXNzPVwidGV4dC1uZXV0cmFsLWRhcmtcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB3aWR0aD1cIjFlbVwiIGhlaWdodD1cIjFlbVwiPjxwYXRoIGQ9XCJNOTQuNyA5Ny4ybC0xNy4yIDE3LjE5VjI1LjYxTDk0LjcgNDIuOGE3LjUgNy41IDAgMDAxMC42LTEwLjZsLTMwLTMwYTcuNDkgNy40OSAwIDAwLTEwLjYgMGwtMzAgMzBhNy41IDcuNSAwIDAwMTAuNiAxMC42bDE3LjItMTcuMTl2ODguNzhMNDUuMyA5Ny4yYTcuNSA3LjUgMCAxMC0xMC42IDEwLjZsMzAgMzBhNy40OCA3LjQ4IDAgMDAxMC42IDBsMzAtMzBhNy41IDcuNSAwIDAwLTEwLjYtMTAuNnpcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWl0ZW0ub3JkZXJCeVwiIGNsYXNzPVwiaW5saW5lLWJsb2NrIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnRleHRcIj57e2l0ZW0udGV4dH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmNvbnRlbnRDb21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpkZXN5Q3VzdG9tSW5uZXJDb250ZW50PVwieyBjb21wb25lbnQ6IGl0ZW0uY29udGVudENvbXBvbmVudCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuXG4gICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyIGNsYXNzPVwiZGl2aWRlLXggZGl2aWRlLW5ldXRyYWwtYmFzZVwiICpuZ0lmPVwiaGFzRmlsdGVycygpXCI+XG4gICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImhhc0NoZWNrYm94ZXNcIiBbbmdDbGFzc109XCJjaGVja2JveENsYXNzZXNcIj48L3RkPlxuICAgICAgICAgICAgICA8dGQgdGFiaW5kZXg9XCItMVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEhlYWRlckNlbGxzKCk7IGluZGV4IGFzIGlIZWFkXCIgZGVzeUZvY3VzQ2xpY2tlZENlbGxcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJbJ2FsaWduLXRvcCBweC1iYXNlIHBiLXNtIGJvcmRlci1uZXV0cmFsLWJhc2UgYm9yZGVyLWItMCB0ZXh0LWxlZnQgdGV4dC1zbSBmb250LW5vcm1hbCB0ZXh0LW5ldXRyYWwtZGFyaycsIGl0ZW0uY2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmhhc1NlbGVjdCAmJiBnZXRTZWxlY3RGb3JJdGVtKGl0ZW0pICE9PSBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVNlbGVjdDsgY29udGV4dDoge3NlbGVjdGFibGU6IGdldFNlbGVjdEZvckl0ZW0oaXRlbSl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGFibGVTZWxlY3QgbGV0LXNlbGVjdGFibGU9XCJzZWxlY3RhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRlc3ktc2VsZWN0IFtpZF09XCJnZXRJZEhlYWRlclNlbGVjdChpSGVhZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsRGF0YV09XCJ7IHRleHQ6ICdGaWx0cmFyIHBvciBlc3RhIGNvbHVtbmEnLCBjbGFzc2VzOiAnc3Itb25seScgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Nlc109XCJzZWxlY3RhYmxlLmNsYXNzZXMgPyBzZWxlY3RhYmxlLmNsYXNzZXMgOiAnYy1zZWxlY3QtLXNtIHctZnVsbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cENsYXNzZXNdPVwic2VsZWN0YWJsZS5mb3JtR3JvdXBDbGFzc2VzID8gc2VsZWN0YWJsZS5mb3JtR3JvdXBDbGFzc2VzIDogJy1tdC1zbSBtYi0wJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJzZWxlY3RhYmxlLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImdldEl0ZW1TZWxlY3RPcHRpb25zKHNlbGVjdGFibGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RhYmxlLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmliZWRCeV09XCJnZXRJZEhlYWRlclNlbGVjdChpSGVhZClcIlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0udmFsdWVTZWxlY3RcIiAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVJbnB1dFNlYXJjaChpdGVtKVwiXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb2xlXT1cInNlbGVjdGFibGUucm9sZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cInNlbGVjdGFibGUuYXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhRGVzY3JpYmVkQnldPVwic2VsZWN0YWJsZS5hcmlhRGVzY3JpYmVkQnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbGxlZEJ5XT1cInNlbGVjdGFibGUuYXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFIaWRkZW5dPVwic2VsZWN0YWJsZS5hcmlhSGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhRGlzYWJsZWRdPVwic2VsZWN0YWJsZS5hcmlhRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFDb250cm9sc109XCJzZWxlY3RhYmxlLmFyaWFDb250cm9sc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUN1cnJlbnRdPVwic2VsZWN0YWJsZS5hcmlhQ3VycmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUxpdmVdPVwic2VsZWN0YWJsZS5hcmlhTGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUV4cGFuZGVkXT1cInNlbGVjdGFibGUuYXJpYUV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhRXJyb3JNZXNzYWdlXT1cInNlbGVjdGFibGUuYXJpYUVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXJpYUhhc1BvcHVwXT1cInNlbGVjdGFibGUuYXJpYUhhc1BvcHVwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJzZWxlY3RhYmxlLnRhYmluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kZXN5LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5oYXNTZWxlY3QgJiYgaXRlbS5oYXNGaWx0ZXJcIiBjbGFzcz1cInBiLXNtXCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkZXN5LXNlYXJjaC1iYXIgKm5nSWY9XCJpdGVtLmhhc0ZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS52YWx1ZUZpbHRlclwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVJbnB1dFNlYXJjaChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUlucHV0U2VhcmNoKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxUZXh0PVwiQnVzY2FyIGVuIGVzdGEgY29sdW1uYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJnZXRJZEhlYWRlckZpbHRlcihpSGVhZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkJ1c2NhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc2VzXT1cIlsnYy1pbnB1dC0tc20nLCBpdGVtLmZpbHRlckNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2xhc3Nlcz1cIm0teHMgcC0wLjUgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmliZWRCeV09XCJnZXRJZEhlYWRlcihpSGVhZClcIj4gPC9kZXN5LXNlYXJjaC1iYXI+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cblxuXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgZ2V0VmlzaWJsZVJvd3MoKTsgaW5kZXggYXMgaVJvd1wiIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWIgYm9yZGVyLW5ldXRyYWwtYmFzZSBob3ZlcjpiZy1uZXV0cmFsLWxpZ2h0ZXJcIlxuICAgICAgICAgICAgICBbZGVzeVJvd109XCJyb3dcIj5cbiAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaGFzQ2hlY2tib3hlc1wiIGRlc3lGb2N1c0NsaWNrZWRDZWxsIFtjbGFzc109XCJbJ3B4LWJhc2UgcHktc20nLCBjaGVja2JveENsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIiA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImMtY2hlY2tib3hlcyBjLWNoZWNrYm94ZXMtLXNtXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBpdGVtcy1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBteC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwidy02IGgtNiB0cmFuc2l0aW9uIGR1cmF0aW9uLTE1MCBlYXNlLWluLW91dCBib3JkZXItYmxhY2sgZm9jdXM6Ym9yZGVyLWJsYWNrIGZvY3VzOnNoYWRvdy1vdXRsaW5lLWZvY3VzLWlucHV0IGZvY3VzOnJpbmctNCBmb2N1czpyaW5nLW9mZnNldC0wIGZvY3VzOnJpbmctd2FybmluZy1iYXNlIGRpc2FibGVkOmJnLW5ldXRyYWwtbGlnaHQgZGlzYWJsZWQ6Ym9yZGVyLW5ldXRyYWwtYmFzZSB0ZXh0LXByaW1hcnktYmFzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuY2hlY2tlZFwiIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUNoZWNrYm94Q2hhbmdlKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJnZXRJZFJvd0NoZWNrYm94KGlSb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJnZXRJZFJvd0NoZWNrYm94KGlSb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTAuNSBsZWFkaW5nLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNyLW9ubHkgYmxvY2sgdGV4dC1zbSAtbXQtMVwiIFtmb3JdPVwiZ2V0SWRSb3dDaGVja2JveChpUm93KVwiPlNlbGVjY2lvbmEgZmlsYSB7eyBpUm93IH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2VsbCBvZiByb3cuY2VsbHNMaXN0OyBmaXJzdCBhcyBpc0ZpcnN0Q2VsbDsgaW5kZXggYXMgY29sdW1uSW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImZpcnN0Q2VsbElzSGVhZGVyICYmIGlzRmlyc3RDZWxsOyBlbHNlIGVsc2VUZFwiIHNjb3BlPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiWydweC1iYXNlIHB5LXhzIGJvcmRlci1uZXV0cmFsLWJhc2UgYm9yZGVyLWItMCBib3JkZXItciB0ZXh0LWxlZnQgZm9udC1ub3JtYWwgdGV4dC1zbSB0ZXh0LW5ldXRyYWwtZGFyaycsIGNlbGwuY2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIGRlc3lDZWxsIFtyb3ddPVwicm93XCIgW3Jvd0luZGV4XT1cImlSb3dcIiBbY29sdW1uSW5kZXhdPVwiY29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY2VsbC5jb2xzcGFuID8gY2VsbC5jb2xzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvd3NwYW5dPVwiY2VsbC5yb3dzcGFuID8gY2VsbC5yb3dzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNlbGwuaWQgPyBjZWxsLmlkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rlc3lBcHBBY2Nlc3NpYmlsaXR5XT1cImNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBjZWxsLCBodG1sOiBjZWxsLmh0bWwsIHRleHQ6IGNlbGwudGV4dCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlVGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIHRhYmluZGV4PVwiLTFcIiBkZXN5Rm9jdXNDbGlja2VkQ2VsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiWydweC1iYXNlIHB5LXNtJywgY2VsbC5jbGFzc2VzXSB8IG1ha2VIdG1sTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3lDZWxsIFtyb3ddPVwicm93XCIgW3Jvd0luZGV4XT1cImlSb3dcIiBbY29sdW1uSW5kZXhdPVwiY29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNlbGwuY29sc3BhbiA/IGNlbGwuY29sc3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJjZWxsLnJvd3NwYW4gPyBjZWxsLnJvd3NwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNlbGwuaWQgPyBjZWxsLmlkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXN5QXBwQWNjZXNzaWJpbGl0eV09XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiY2VsbC50YWJpbmRleCA/IGNlbGwudGFiaW5kZXggOiAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqZGVzeUN1c3RvbUlubmVyQ29udGVudD1cInsgY29tcG9uZW50OiBjZWxsLCBodG1sOiBjZWxsLmh0bWwsIHRleHQ6IGNlbGwudGV4dCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdHI+XG4gICAgICA8L3Rib2R5PlxuICAgICAgXG4gICAgICA8dGZvb3QgKm5nSWY9XCJnZXRGb290ZXJDZWxscygpXCI+XG4gICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGZvb3Qgb2YgZ2V0Rm9vdGVyQ2VsbHMoKTsgaW5kZXggYXMgaUZvb3RlclwiIGNsYXNzPVwiYm9yZGVyLXQtMiBib3JkZXItYiBib3JkZXItbmV1dHJhbC1iYXNlIGhvdmVyOmJnLW5ldXRyYWwtbGlnaHRlclwiPlxuICAgICAgICAgICA8dGQgKm5nSWY9XCJoYXNDaGVja2JveGVzXCIgZGVzeUZvY3VzQ2xpY2tlZENlbGwgW2NsYXNzXT1cIlsncHgtYmFzZSBweS1zbScsIGNoZWNrYm94Q2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIlxuICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjLWNoZWNrYm94ZXMgYy1jaGVja2JveGVzLS1zbVwiPlxuICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaXRlbXMtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbXgtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInctNiBoLTYgdHJhbnNpdGlvbiBkdXJhdGlvbi0xNTAgZWFzZS1pbi1vdXQgYm9yZGVyLWJsYWNrIGZvY3VzOmJvcmRlci1ibGFjayBmb2N1czpzaGFkb3ctb3V0bGluZS1mb2N1cy1pbnB1dCBmb2N1czpyaW5nLTQgZm9jdXM6cmluZy1vZmZzZXQtMCBmb2N1czpyaW5nLXdhcm5pbmctYmFzZSBkaXNhYmxlZDpiZy1uZXV0cmFsLWxpZ2h0IGRpc2FibGVkOmJvcmRlci1uZXV0cmFsLWJhc2UgdGV4dC1wcmltYXJ5LWJhc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9vdC5jaGVja2VkXCIgKG5nTW9kZWxDaGFuZ2UpPVwiaGFuZGxlQ2hlY2tib3hDaGFuZ2UoZm9vdClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJnZXRJZFJvd0NoZWNrYm94KGlGb290ZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJnZXRJZFJvd0NoZWNrYm94KGlGb290ZXIpXCI+XG4gICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTAuNSBsZWFkaW5nLTVcIj5cbiAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNyLW9ubHkgYmxvY2sgdGV4dC1zbSAtbXQtMVwiIFtmb3JdPVwiZ2V0SWRSb3dDaGVja2JveChpRm9vdGVyKVwiPlNlbGVjY2lvbmEgZmlsYSB7eyBpRm9vdGVyIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2VsbCBvZiBmb290LmNlbGxzTGlzdDsgZmlyc3QgYXMgaXNGaXJzdENlbGw7IGluZGV4IGFzIGNvbHVtbkluZGV4XCI+XG4gICAgICAgICAgICAgICA8dGggKm5nSWY9XCJmaXJzdENlbGxJc0hlYWRlciAmJiBpc0ZpcnN0Q2VsbDsgZWxzZSBlbHNlVGRcIiBzY29wZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlsncHgtYmFzZSBweS14cyBib3JkZXItbmV1dHJhbC1iYXNlIGJvcmRlci1iLTAgYm9yZGVyLXIgdGV4dC1sZWZ0IGZvbnQtbm9ybWFsIHRleHQtc20gdGV4dC1uZXV0cmFsLWRhcmsnLCBjZWxsLmNsYXNzZXNdIHwgbWFrZUh0bWxMaXN0XCJcbiAgICAgICAgICAgICAgICAgICBkZXN5Q2VsbCBbcm93XT1cInJvd1wiIFtyb3dJbmRleF09XCJpRm9vdGVyXCIgW2NvbHVtbkluZGV4XT1cImNvbHVtbkluZGV4XCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImNlbGwuY29sc3BhbiA/IGNlbGwuY29sc3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dzcGFuXT1cImNlbGwucm93c3BhbiA/IGNlbGwucm93c3BhbiAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjZWxsLmlkID8gY2VsbC5pZCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgIFtkZXN5QXBwQWNjZXNzaWJpbGl0eV09XCJjZWxsXCI+XG4gICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogY2VsbCwgaHRtbDogY2VsbC5odG1sLCB0ZXh0OiBjZWxsLnRleHQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVRkPlxuICAgICAgICAgICAgICAgICAgIDx0ZCB0YWJpbmRleD1cIi0xXCIgZGVzeUZvY3VzQ2xpY2tlZENlbGxcbiAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlsncHgtYmFzZSBweS1zbScsIGNlbGwuY2xhc3Nlc10gfCBtYWtlSHRtbExpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICBkZXN5Q2VsbCBbcm93XT1cInJvd1wiIFtyb3dJbmRleF09XCJpRm9vdGVyXCIgW2NvbHVtbkluZGV4XT1cImNvbHVtbkluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjZWxsLmNvbHNwYW4gPyBjZWxsLmNvbHNwYW4gIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvd3NwYW5dPVwiY2VsbC5yb3dzcGFuID8gY2VsbC5yb3dzcGFuICA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjZWxsLmlkID8gY2VsbC5pZCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICBbZGVzeUFwcEFjY2Vzc2liaWxpdHldPVwiY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNlbGwudGFiaW5kZXggPyBjZWxsLnRhYmluZGV4IDogLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmRlc3lDdXN0b21Jbm5lckNvbnRlbnQ9XCJ7IGNvbXBvbmVudDogY2VsbCwgaHRtbDogY2VsbC5odG1sLCB0ZXh0OiBjZWxsLnRleHQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICA8L3RyPlxuICAgIDwvdGZvb3Q+XG4gIDwvdGFibGU+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2ICpuZ0lmPVwid3JhcHBlcjsgZWxzZSB0YWJsZUNvbnRlbnRcIiBbY2xhc3NdPVwid3JhcHBlci5jbGFzc2VzXCI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZUNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19