@norwegian/core-components 7.17.2 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/README.md +3 -3
  2. package/assets/documentation/accordion/accordion.md +1 -1
  3. package/assets/documentation/airport-select/airport-select.md +1 -0
  4. package/assets/documentation/alert/alert.md +1 -0
  5. package/assets/documentation/autocomplete/autocomplete.md +1 -1
  6. package/assets/documentation/backdrop/backdrop.md +1 -0
  7. package/assets/documentation/box/box.md +1 -1
  8. package/assets/documentation/button/button.md +1 -10
  9. package/assets/documentation/checkbox/checkbox.md +1 -7
  10. package/assets/documentation/container/container.md +1 -1
  11. package/assets/documentation/continue/continue.md +2 -1
  12. package/assets/documentation/cover/cover.md +1 -1
  13. package/assets/documentation/datepicker/datepicker.md +1 -3
  14. package/assets/documentation/datepicker-combo/datepicker-combo.md +2 -1
  15. package/assets/documentation/divider/divider.md +1 -1
  16. package/assets/documentation/dropdown/dropdown.md +1 -3
  17. package/assets/documentation/filter/filter.md +1 -0
  18. package/assets/documentation/grid/grid.md +1 -1
  19. package/assets/documentation/icon/icon.md +1 -1
  20. package/assets/documentation/icon-list/icon-list.md +1 -1
  21. package/assets/documentation/input/input.md +1 -1
  22. package/assets/documentation/journey/journey.md +2 -1
  23. package/assets/documentation/journey-availability/journey-availability.md +1 -3
  24. package/assets/documentation/journey-availability-list/journey-availability-list.md +1 -9
  25. package/assets/documentation/journey-selection/journey-selection.md +1 -1
  26. package/assets/documentation/journey-stopover/journey-stopover.md +2 -1
  27. package/assets/documentation/list/list.md +1 -1
  28. package/assets/documentation/micro-button/micro-button.md +2 -0
  29. package/assets/documentation/modal/modal.md +1 -0
  30. package/assets/documentation/number-field/number-field.md +1 -1
  31. package/assets/documentation/page-footer/page-footer.md +1 -1
  32. package/assets/documentation/page-header/page-header.md +1 -1
  33. package/assets/documentation/passenger-select/passenger-select.md +1 -1
  34. package/assets/documentation/phone-number/phone-number.md +1 -2
  35. package/assets/documentation/premium-toggle/premium-toggle.md +1 -9
  36. package/assets/documentation/radio/radio.md +1 -7
  37. package/assets/documentation/ribbon-banner/ribbon-banner.md +2 -1
  38. package/assets/documentation/select/select.md +1 -1
  39. package/assets/documentation/simple-list/simple-list.md +1 -1
  40. package/assets/documentation/slide-toggle/slide-toggle.md +1 -1
  41. package/assets/documentation/slider/slider.md +1 -1
  42. package/assets/documentation/sort/sort.md +1 -1
  43. package/assets/documentation/spinner/spinner.md +1 -1
  44. package/assets/documentation/status-box/status-box.md +2 -1
  45. package/assets/documentation/suggestions/suggestions.md +2 -1
  46. package/assets/documentation/tab-group/tab-group.md +1 -1
  47. package/assets/documentation/table/table.md +1 -8
  48. package/assets/documentation/tag/tag.md +1 -0
  49. package/assets/documentation/textarea/textarea.md +1 -1
  50. package/assets/documentation/toggle/toggle.md +1 -5
  51. package/assets/documentation/tooltip/tooltip.md +1 -0
  52. package/assets/documentation/trip-summary/trip-summary.md +1 -2
  53. package/fesm2022/norwegian-core-components.mjs +13636 -13565
  54. package/fesm2022/norwegian-core-components.mjs.map +1 -1
  55. package/index.d.ts +9449 -5
  56. package/package.json +14 -8
  57. package/styles/1__settings/_colors.scss +9 -9
  58. package/styles/1__settings/_mixins.scss +67 -40
  59. package/styles/1__settings/_type.scss +18 -6
  60. package/styles/1__settings/_vars.scss +7 -4
  61. package/styles/2__generic/_fonts.scss +7 -5
  62. package/styles/3__base/_animations.scss +84 -84
  63. package/styles/3__base/_body.scss +10 -8
  64. package/styles/3__base/_fixes.scss +1 -1
  65. package/styles/3__base/_form.scss +5 -3
  66. package/styles/3__base/_heading.scss +21 -12
  67. package/styles/3__base/_hr.scss +4 -0
  68. package/styles/3__base/_input.scss +5 -1
  69. package/styles/3__base/_link.scss +3 -0
  70. package/styles/3__base/_table.scss +8 -4
  71. package/styles/3__base/_type.scss +17 -13
  72. package/styles/_helpers.scss +4 -4
  73. package/styles/_index.scss +13 -13
  74. package/assets/documentation/campaign-header/campaign-header.md +0 -0
  75. package/assets/documentation/chip/chip.md +0 -1
  76. package/assets/documentation/info/info.md +0 -1
  77. package/assets/icons/small/info--light--light.svg +0 -4
  78. package/assets/images/logo--mobile.svg +0 -50
  79. package/assets/images/logo-reward.svg +0 -140
  80. package/assets/images/logo.svg +0 -135
  81. package/esm2022/lib/components/accordion/accordion.component.mjs +0 -163
  82. package/esm2022/lib/components/accordion/accordion.module.mjs +0 -20
  83. package/esm2022/lib/components/accordion/index.mjs +0 -3
  84. package/esm2022/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.mjs +0 -622
  85. package/esm2022/lib/components/airport-select/airport-select.component.mjs +0 -498
  86. package/esm2022/lib/components/airport-select/airport-select.module.mjs +0 -42
  87. package/esm2022/lib/components/airport-select/index.mjs +0 -7
  88. package/esm2022/lib/components/airport-select/models/airport-select-event.model.mjs +0 -2
  89. package/esm2022/lib/components/airport-select/models/airport-select-state.model.mjs +0 -2
  90. package/esm2022/lib/components/airport-select/models/airport.model.mjs +0 -2
  91. package/esm2022/lib/components/airport-select/models/results-labels.model.mjs +0 -3
  92. package/esm2022/lib/components/airport-select/services/airport-select-dropdown.service.mjs +0 -35
  93. package/esm2022/lib/components/airport-select/services/airport-select.service.mjs +0 -38
  94. package/esm2022/lib/components/alert/alert.component.mjs +0 -169
  95. package/esm2022/lib/components/alert/alert.module.mjs +0 -22
  96. package/esm2022/lib/components/alert/index.mjs +0 -4
  97. package/esm2022/lib/components/alert/models/alert.model.mjs +0 -2
  98. package/esm2022/lib/components/autocomplete/autocomplete.component.mjs +0 -318
  99. package/esm2022/lib/components/autocomplete/autocomplete.module.mjs +0 -43
  100. package/esm2022/lib/components/autocomplete/index.mjs +0 -4
  101. package/esm2022/lib/components/autocomplete/models/autocomplete.model.mjs +0 -2
  102. package/esm2022/lib/components/backdrop/backdrop.component.mjs +0 -58
  103. package/esm2022/lib/components/backdrop/backdrop.module.mjs +0 -19
  104. package/esm2022/lib/components/backdrop/index.mjs +0 -3
  105. package/esm2022/lib/components/box/box.component.mjs +0 -66
  106. package/esm2022/lib/components/box/box.module.mjs +0 -19
  107. package/esm2022/lib/components/box/index.mjs +0 -3
  108. package/esm2022/lib/components/button/button.component.mjs +0 -192
  109. package/esm2022/lib/components/button/button.module.mjs +0 -21
  110. package/esm2022/lib/components/button/index.mjs +0 -3
  111. package/esm2022/lib/components/campaign-header/campaign-header.component.mjs +0 -51
  112. package/esm2022/lib/components/campaign-header/campaign-header.module.mjs +0 -20
  113. package/esm2022/lib/components/campaign-header/index.mjs +0 -3
  114. package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -163
  115. package/esm2022/lib/components/checkbox/checkbox.module.mjs +0 -20
  116. package/esm2022/lib/components/checkbox/index.mjs +0 -3
  117. package/esm2022/lib/components/chip/chip.component.mjs +0 -48
  118. package/esm2022/lib/components/chip/chip.module.mjs +0 -19
  119. package/esm2022/lib/components/chip/index.mjs +0 -3
  120. package/esm2022/lib/components/container/container.component.mjs +0 -50
  121. package/esm2022/lib/components/container/container.module.mjs +0 -19
  122. package/esm2022/lib/components/container/index.mjs +0 -3
  123. package/esm2022/lib/components/continue/continue.component.mjs +0 -199
  124. package/esm2022/lib/components/continue/continue.module.mjs +0 -23
  125. package/esm2022/lib/components/continue/index.mjs +0 -3
  126. package/esm2022/lib/components/cover/cover.component.mjs +0 -75
  127. package/esm2022/lib/components/cover/cover.module.mjs +0 -21
  128. package/esm2022/lib/components/cover/index.mjs +0 -3
  129. package/esm2022/lib/components/datepicker/calendar/calendar.component.mjs +0 -606
  130. package/esm2022/lib/components/datepicker/calendar/enums/week-start.enum.mjs +0 -6
  131. package/esm2022/lib/components/datepicker/calendar/models/calendar-date.model.mjs +0 -2
  132. package/esm2022/lib/components/datepicker/calendar/models/calendar.model.mjs +0 -2
  133. package/esm2022/lib/components/datepicker/calendar/models/day.model.mjs +0 -2
  134. package/esm2022/lib/components/datepicker/calendar/models/select-option.model.mjs +0 -2
  135. package/esm2022/lib/components/datepicker/calendar/models/week.model.mjs +0 -2
  136. package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -613
  137. package/esm2022/lib/components/datepicker/datepicker.module.mjs +0 -55
  138. package/esm2022/lib/components/datepicker/index.mjs +0 -9
  139. package/esm2022/lib/components/datepicker/services/calendar.service.mjs +0 -215
  140. package/esm2022/lib/components/datepicker-combo/datepicker-combo.component.mjs +0 -417
  141. package/esm2022/lib/components/datepicker-combo/datepicker-combo.module.mjs +0 -31
  142. package/esm2022/lib/components/datepicker-combo/index.mjs +0 -3
  143. package/esm2022/lib/components/divider/divider.component.mjs +0 -59
  144. package/esm2022/lib/components/divider/divider.module.mjs +0 -28
  145. package/esm2022/lib/components/divider/index.mjs +0 -3
  146. package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -170
  147. package/esm2022/lib/components/dropdown/dropdown.module.mjs +0 -21
  148. package/esm2022/lib/components/dropdown/index.mjs +0 -3
  149. package/esm2022/lib/components/filter/enums/trip-type.enum.mjs +0 -8
  150. package/esm2022/lib/components/filter/filter.component.mjs +0 -1445
  151. package/esm2022/lib/components/filter/filter.module.mjs +0 -81
  152. package/esm2022/lib/components/filter/index.mjs +0 -4
  153. package/esm2022/lib/components/grid/col/col.component.mjs +0 -49
  154. package/esm2022/lib/components/grid/grid.component.mjs +0 -72
  155. package/esm2022/lib/components/grid/grid.module.mjs +0 -20
  156. package/esm2022/lib/components/grid/index.mjs +0 -4
  157. package/esm2022/lib/components/icon/icon.component.mjs +0 -44
  158. package/esm2022/lib/components/icon/icon.module.mjs +0 -19
  159. package/esm2022/lib/components/icon/index.mjs +0 -3
  160. package/esm2022/lib/components/icon-list/icon-list.component.mjs +0 -50
  161. package/esm2022/lib/components/icon-list/icon-list.module.mjs +0 -20
  162. package/esm2022/lib/components/icon-list/index.mjs +0 -4
  163. package/esm2022/lib/components/icon-list/models/icon-list.model.mjs +0 -2
  164. package/esm2022/lib/components/index.mjs +0 -68
  165. package/esm2022/lib/components/info/index.mjs +0 -4
  166. package/esm2022/lib/components/info/info.component.mjs +0 -116
  167. package/esm2022/lib/components/info/info.module.mjs +0 -36
  168. package/esm2022/lib/components/info/models/info.model.mjs +0 -2
  169. package/esm2022/lib/components/input/index.mjs +0 -3
  170. package/esm2022/lib/components/input/input.component.mjs +0 -228
  171. package/esm2022/lib/components/input/input.module.mjs +0 -35
  172. package/esm2022/lib/components/journey/index.mjs +0 -6
  173. package/esm2022/lib/components/journey/journey.component.mjs +0 -137
  174. package/esm2022/lib/components/journey/journey.module.mjs +0 -21
  175. package/esm2022/lib/components/journey/models/journey-flight.model.mjs +0 -2
  176. package/esm2022/lib/components/journey/models/journey.model.mjs +0 -2
  177. package/esm2022/lib/components/journey/models/marketing-carrier.enum.mjs +0 -8
  178. package/esm2022/lib/components/journey-availability/index.mjs +0 -3
  179. package/esm2022/lib/components/journey-availability/journey-availability.component.mjs +0 -128
  180. package/esm2022/lib/components/journey-availability/journey-availability.module.mjs +0 -39
  181. package/esm2022/lib/components/journey-availability-list/enums/availability-sort-option.enum.mjs +0 -7
  182. package/esm2022/lib/components/journey-availability-list/index.mjs +0 -4
  183. package/esm2022/lib/components/journey-availability-list/journey-availability-list.component.mjs +0 -182
  184. package/esm2022/lib/components/journey-availability-list/journey-availability-list.module.mjs +0 -36
  185. package/esm2022/lib/components/journey-selection/index.mjs +0 -7
  186. package/esm2022/lib/components/journey-selection/journey-selection.component.mjs +0 -120
  187. package/esm2022/lib/components/journey-selection/journey-selection.module.mjs +0 -24
  188. package/esm2022/lib/components/journey-selection/models/journey-selection-collapsed.model.mjs +0 -2
  189. package/esm2022/lib/components/journey-selection/models/journey-selection-common.model.mjs +0 -2
  190. package/esm2022/lib/components/journey-selection/models/journey-selection-expanded.model.mjs +0 -2
  191. package/esm2022/lib/components/journey-selection/models/journey-selection.model.mjs +0 -2
  192. package/esm2022/lib/components/journey-stopover/index.mjs +0 -4
  193. package/esm2022/lib/components/journey-stopover/journey-stopover.component.mjs +0 -150
  194. package/esm2022/lib/components/journey-stopover/journey-stopover.module.mjs +0 -21
  195. package/esm2022/lib/components/journey-stopover/models/stopover-time.model.mjs +0 -2
  196. package/esm2022/lib/components/list/index.mjs +0 -4
  197. package/esm2022/lib/components/list/list-item/list-item.component.mjs +0 -52
  198. package/esm2022/lib/components/list/list.component.mjs +0 -78
  199. package/esm2022/lib/components/list/list.module.mjs +0 -20
  200. package/esm2022/lib/components/micro-button/index.mjs +0 -3
  201. package/esm2022/lib/components/micro-button/micro-button.component.mjs +0 -101
  202. package/esm2022/lib/components/micro-button/micro-button.module.mjs +0 -20
  203. package/esm2022/lib/components/modal/index.mjs +0 -3
  204. package/esm2022/lib/components/modal/modal.component.mjs +0 -156
  205. package/esm2022/lib/components/modal/modal.module.mjs +0 -38
  206. package/esm2022/lib/components/number-field/index.mjs +0 -4
  207. package/esm2022/lib/components/number-field/models/number-field.model.mjs +0 -2
  208. package/esm2022/lib/components/number-field/number-field.component.mjs +0 -162
  209. package/esm2022/lib/components/number-field/number-field.module.mjs +0 -39
  210. package/esm2022/lib/components/page-footer/index.mjs +0 -3
  211. package/esm2022/lib/components/page-footer/page-footer.component.mjs +0 -52
  212. package/esm2022/lib/components/page-footer/page-footer.module.mjs +0 -21
  213. package/esm2022/lib/components/page-header/hamburger/hamburger.component.mjs +0 -22
  214. package/esm2022/lib/components/page-header/index.mjs +0 -6
  215. package/esm2022/lib/components/page-header/models/wallet.model.mjs +0 -2
  216. package/esm2022/lib/components/page-header/page-header.component.mjs +0 -171
  217. package/esm2022/lib/components/page-header/page-header.module.mjs +0 -55
  218. package/esm2022/lib/components/page-header/search/search.component.mjs +0 -49
  219. package/esm2022/lib/components/page-header/wallet/wallet.component.mjs +0 -57
  220. package/esm2022/lib/components/passenger-select/enums/passenger-type.enum.mjs +0 -9
  221. package/esm2022/lib/components/passenger-select/index.mjs +0 -5
  222. package/esm2022/lib/components/passenger-select/models/passengers.model.mjs +0 -2
  223. package/esm2022/lib/components/passenger-select/passenger-select.component.mjs +0 -423
  224. package/esm2022/lib/components/passenger-select/passenger-select.module.mjs +0 -28
  225. package/esm2022/lib/components/phone-number/index.mjs +0 -3
  226. package/esm2022/lib/components/phone-number/phone-number.component.mjs +0 -182
  227. package/esm2022/lib/components/phone-number/phone-number.module.mjs +0 -44
  228. package/esm2022/lib/components/premium-toggle/index.mjs +0 -3
  229. package/esm2022/lib/components/premium-toggle/premium-toggle.component.mjs +0 -68
  230. package/esm2022/lib/components/premium-toggle/premium-toggle.module.mjs +0 -20
  231. package/esm2022/lib/components/radio/index.mjs +0 -3
  232. package/esm2022/lib/components/radio/radio.component.mjs +0 -109
  233. package/esm2022/lib/components/radio/radio.module.mjs +0 -20
  234. package/esm2022/lib/components/ribbon-banner/index.mjs +0 -3
  235. package/esm2022/lib/components/ribbon-banner/ribbon-banner.component.mjs +0 -89
  236. package/esm2022/lib/components/ribbon-banner/ribbon-banner.module.mjs +0 -40
  237. package/esm2022/lib/components/select/index.mjs +0 -6
  238. package/esm2022/lib/components/select/models/select-option.model.mjs +0 -2
  239. package/esm2022/lib/components/select/optgroup/optgroup.component.mjs +0 -29
  240. package/esm2022/lib/components/select/option/option.component.mjs +0 -26
  241. package/esm2022/lib/components/select/select.component.mjs +0 -407
  242. package/esm2022/lib/components/select/select.module.mjs +0 -23
  243. package/esm2022/lib/components/select-new/index.mjs +0 -5
  244. package/esm2022/lib/components/select-new/models/select-option.model.mjs +0 -2
  245. package/esm2022/lib/components/select-new/optgroup/optgroup-new.component.mjs +0 -23
  246. package/esm2022/lib/components/select-new/option/option-new.component.mjs +0 -41
  247. package/esm2022/lib/components/select-new/select-new.component.mjs +0 -271
  248. package/esm2022/lib/components/select-new/select-new.module.mjs +0 -26
  249. package/esm2022/lib/components/select-new/services/select-new.service.mjs +0 -40
  250. package/esm2022/lib/components/simple-list/index.mjs +0 -3
  251. package/esm2022/lib/components/simple-list/simple-list.component.mjs +0 -48
  252. package/esm2022/lib/components/simple-list/simple-list.module.mjs +0 -19
  253. package/esm2022/lib/components/slide-toggle/index.mjs +0 -3
  254. package/esm2022/lib/components/slide-toggle/slide-toggle.component.mjs +0 -121
  255. package/esm2022/lib/components/slide-toggle/slide-toggle.module.mjs +0 -20
  256. package/esm2022/lib/components/slider/index.mjs +0 -3
  257. package/esm2022/lib/components/slider/slider.component.mjs +0 -515
  258. package/esm2022/lib/components/slider/slider.module.mjs +0 -20
  259. package/esm2022/lib/components/sort/index.mjs +0 -3
  260. package/esm2022/lib/components/sort/sort.component.mjs +0 -98
  261. package/esm2022/lib/components/sort/sort.module.mjs +0 -36
  262. package/esm2022/lib/components/spinner/index.mjs +0 -3
  263. package/esm2022/lib/components/spinner/spinner.component.mjs +0 -127
  264. package/esm2022/lib/components/spinner/spinner.module.mjs +0 -19
  265. package/esm2022/lib/components/status-box/index.mjs +0 -4
  266. package/esm2022/lib/components/status-box/models/status-box.model.mjs +0 -2
  267. package/esm2022/lib/components/status-box/status-box.component.mjs +0 -109
  268. package/esm2022/lib/components/status-box/status-box.module.mjs +0 -21
  269. package/esm2022/lib/components/suggestions/index.mjs +0 -3
  270. package/esm2022/lib/components/suggestions/suggestions.component.mjs +0 -44
  271. package/esm2022/lib/components/suggestions/suggestions.module.mjs +0 -20
  272. package/esm2022/lib/components/tab-group/index.mjs +0 -4
  273. package/esm2022/lib/components/tab-group/tab/tab.component.mjs +0 -140
  274. package/esm2022/lib/components/tab-group/tab-group.component.mjs +0 -91
  275. package/esm2022/lib/components/tab-group/tab-group.module.mjs +0 -21
  276. package/esm2022/lib/components/table/column/column.component.mjs +0 -16
  277. package/esm2022/lib/components/table/column-group/column-group.component.mjs +0 -30
  278. package/esm2022/lib/components/table/index.mjs +0 -11
  279. package/esm2022/lib/components/table/services/table.service.mjs +0 -24
  280. package/esm2022/lib/components/table/table-body/table-body.component.mjs +0 -23
  281. package/esm2022/lib/components/table/table-foot/table-foot.component.mjs +0 -23
  282. package/esm2022/lib/components/table/table-head/table-head.component.mjs +0 -23
  283. package/esm2022/lib/components/table/table-row/table-data/table-data.component.mjs +0 -15
  284. package/esm2022/lib/components/table/table-row/table-header/table-header.component.mjs +0 -15
  285. package/esm2022/lib/components/table/table-row/table-row.component.mjs +0 -23
  286. package/esm2022/lib/components/table/table.component.mjs +0 -27
  287. package/esm2022/lib/components/table/table.module.mjs +0 -63
  288. package/esm2022/lib/components/tag/index.mjs +0 -3
  289. package/esm2022/lib/components/tag/tag.component.mjs +0 -71
  290. package/esm2022/lib/components/tag/tag.module.mjs +0 -28
  291. package/esm2022/lib/components/textarea/index.mjs +0 -3
  292. package/esm2022/lib/components/textarea/textarea.component.mjs +0 -139
  293. package/esm2022/lib/components/textarea/textarea.module.mjs +0 -21
  294. package/esm2022/lib/components/toggle/index.mjs +0 -3
  295. package/esm2022/lib/components/toggle/models/options.model.mjs +0 -3
  296. package/esm2022/lib/components/toggle/toggle.component.mjs +0 -102
  297. package/esm2022/lib/components/toggle/toggle.module.mjs +0 -35
  298. package/esm2022/lib/components/tooltip/index.mjs +0 -3
  299. package/esm2022/lib/components/tooltip/tooltip.component.mjs +0 -170
  300. package/esm2022/lib/components/tooltip/tooltip.module.mjs +0 -30
  301. package/esm2022/lib/components/trip-summary/index.mjs +0 -3
  302. package/esm2022/lib/components/trip-summary/trip-summary.component.mjs +0 -167
  303. package/esm2022/lib/components/trip-summary/trip-summary.module.mjs +0 -36
  304. package/esm2022/lib/core/base/nas-component.base.mjs +0 -48
  305. package/esm2022/lib/core/decorators/debounce.decorator.mjs +0 -12
  306. package/esm2022/lib/core/directives/index.mjs +0 -3
  307. package/esm2022/lib/core/directives/nas-class/nas-class.directive.mjs +0 -80
  308. package/esm2022/lib/core/directives/nas-class/nas-class.module.mjs +0 -20
  309. package/esm2022/lib/core/extensions/html-element.extension.mjs +0 -31
  310. package/esm2022/lib/core/index.mjs +0 -5
  311. package/esm2022/lib/core/models/abandoned-basket-item.model.mjs +0 -2
  312. package/esm2022/lib/core/models/animate.model.mjs +0 -2
  313. package/esm2022/lib/core/models/class.model.mjs +0 -2
  314. package/esm2022/lib/core/models/index.mjs +0 -7
  315. package/esm2022/lib/core/models/link.model.mjs +0 -2
  316. package/esm2022/lib/core/models/position.model.mjs +0 -2
  317. package/esm2022/lib/core/models/utc-date.model.mjs +0 -40
  318. package/esm2022/lib/core/services/abandoned-basket/abandoned-basket.service.mjs +0 -61
  319. package/esm2022/lib/core/services/animate-helper/animate-helper.service.mjs +0 -49
  320. package/esm2022/lib/core/services/bem-helper/bem-helper.service.mjs +0 -44
  321. package/esm2022/lib/core/services/date/date-compare.enum.mjs +0 -7
  322. package/esm2022/lib/core/services/date/date-helper.service.mjs +0 -199
  323. package/esm2022/lib/core/services/device/device-helper.service.mjs +0 -46
  324. package/esm2022/lib/core/services/geolocation/geolocation-state.enum.mjs +0 -8
  325. package/esm2022/lib/core/services/geolocation/geolocation.service.mjs +0 -66
  326. package/esm2022/lib/core/services/index.mjs +0 -10
  327. package/esm2022/lib/core/services/language/language-helper.service.mjs +0 -114
  328. package/esm2022/lib/core/services/sort/sort.service.mjs +0 -25
  329. package/esm2022/lib/core/services/viewport/viewport.service.mjs +0 -36
  330. package/esm2022/lib/index.mjs +0 -5
  331. package/esm2022/lib/services/get-position.service.mjs +0 -23
  332. package/esm2022/lib/services/index.mjs +0 -2
  333. package/esm2022/lib/shared/index.mjs +0 -2
  334. package/esm2022/lib/shared/models/flight-details.mjs +0 -3
  335. package/esm2022/lib/shared/models/index.mjs +0 -6
  336. package/esm2022/lib/shared/models/journey-availability-sort.model.mjs +0 -2
  337. package/esm2022/lib/shared/models/journey-availability.model.mjs +0 -2
  338. package/esm2022/lib/shared/models/journey-details.model.mjs +0 -2
  339. package/esm2022/lib/shared/models/journey-duration.model.mjs +0 -2
  340. package/esm2022/lib/shared/models/journey-stopover.model.mjs +0 -2
  341. package/esm2022/lib/shared/models/journey-transit-info.model.mjs +0 -2
  342. package/esm2022/lib/shared/models/operating-carrier.model.mjs +0 -2
  343. package/esm2022/lib/shared/models/sort-option.model.mjs +0 -2
  344. package/esm2022/lib/shared/models/sort.model.mjs +0 -2
  345. package/esm2022/lib/shared/models/trip-item-details.model.mjs +0 -2
  346. package/esm2022/lib/shared/models/trip-summary-details.model.mjs +0 -2
  347. package/esm2022/lib/shared/models/trip-summary.model.mjs +0 -2
  348. package/esm2022/norwegian-core-components.mjs +0 -5
  349. package/esm2022/public_api.mjs +0 -2
  350. package/lib/components/accordion/accordion.component.d.ts +0 -241
  351. package/lib/components/accordion/accordion.module.d.ts +0 -10
  352. package/lib/components/accordion/index.d.ts +0 -2
  353. package/lib/components/airport-select/airport-select-dropdown/airport-select-dropdown.component.d.ts +0 -100
  354. package/lib/components/airport-select/airport-select.component.d.ts +0 -330
  355. package/lib/components/airport-select/airport-select.module.d.ts +0 -13
  356. package/lib/components/airport-select/index.d.ts +0 -6
  357. package/lib/components/airport-select/models/airport-select-event.model.d.ts +0 -4
  358. package/lib/components/airport-select/models/airport-select-state.model.d.ts +0 -5
  359. package/lib/components/airport-select/models/airport.model.d.ts +0 -11
  360. package/lib/components/airport-select/models/results-labels.model.d.ts +0 -8
  361. package/lib/components/airport-select/services/airport-select-dropdown.service.d.ts +0 -10
  362. package/lib/components/airport-select/services/airport-select.service.d.ts +0 -8
  363. package/lib/components/alert/alert.component.d.ts +0 -129
  364. package/lib/components/alert/alert.module.d.ts +0 -12
  365. package/lib/components/alert/index.d.ts +0 -3
  366. package/lib/components/alert/models/alert.model.d.ts +0 -10
  367. package/lib/components/autocomplete/autocomplete.component.d.ts +0 -135
  368. package/lib/components/autocomplete/autocomplete.module.d.ts +0 -13
  369. package/lib/components/autocomplete/index.d.ts +0 -3
  370. package/lib/components/autocomplete/models/autocomplete.model.d.ts +0 -5
  371. package/lib/components/backdrop/backdrop.component.d.ts +0 -38
  372. package/lib/components/backdrop/backdrop.module.d.ts +0 -9
  373. package/lib/components/backdrop/index.d.ts +0 -2
  374. package/lib/components/box/box.component.d.ts +0 -78
  375. package/lib/components/box/box.module.d.ts +0 -9
  376. package/lib/components/box/index.d.ts +0 -2
  377. package/lib/components/button/button.component.d.ts +0 -294
  378. package/lib/components/button/button.module.d.ts +0 -11
  379. package/lib/components/button/index.d.ts +0 -2
  380. package/lib/components/campaign-header/campaign-header.component.d.ts +0 -58
  381. package/lib/components/campaign-header/campaign-header.module.d.ts +0 -10
  382. package/lib/components/campaign-header/index.d.ts +0 -2
  383. package/lib/components/checkbox/checkbox.component.d.ts +0 -151
  384. package/lib/components/checkbox/checkbox.module.d.ts +0 -10
  385. package/lib/components/checkbox/index.d.ts +0 -2
  386. package/lib/components/chip/chip.component.d.ts +0 -48
  387. package/lib/components/chip/chip.module.d.ts +0 -9
  388. package/lib/components/chip/index.d.ts +0 -2
  389. package/lib/components/container/container.component.d.ts +0 -52
  390. package/lib/components/container/container.module.d.ts +0 -9
  391. package/lib/components/container/index.d.ts +0 -2
  392. package/lib/components/continue/continue.component.d.ts +0 -171
  393. package/lib/components/continue/continue.module.d.ts +0 -11
  394. package/lib/components/continue/index.d.ts +0 -2
  395. package/lib/components/cover/cover.component.d.ts +0 -125
  396. package/lib/components/cover/cover.module.d.ts +0 -11
  397. package/lib/components/cover/index.d.ts +0 -2
  398. package/lib/components/datepicker/calendar/calendar.component.d.ts +0 -169
  399. package/lib/components/datepicker/calendar/enums/week-start.enum.d.ts +0 -4
  400. package/lib/components/datepicker/calendar/models/calendar-date.model.d.ts +0 -5
  401. package/lib/components/datepicker/calendar/models/calendar.model.d.ts +0 -4
  402. package/lib/components/datepicker/calendar/models/day.model.d.ts +0 -10
  403. package/lib/components/datepicker/calendar/models/select-option.model.d.ts +0 -4
  404. package/lib/components/datepicker/calendar/models/week.model.d.ts +0 -5
  405. package/lib/components/datepicker/datepicker.component.d.ts +0 -289
  406. package/lib/components/datepicker/datepicker.module.d.ts +0 -16
  407. package/lib/components/datepicker/index.d.ts +0 -8
  408. package/lib/components/datepicker/services/calendar.service.d.ts +0 -27
  409. package/lib/components/datepicker-combo/datepicker-combo.component.d.ts +0 -329
  410. package/lib/components/datepicker-combo/datepicker-combo.module.d.ts +0 -10
  411. package/lib/components/datepicker-combo/index.d.ts +0 -2
  412. package/lib/components/divider/divider.component.d.ts +0 -68
  413. package/lib/components/divider/divider.module.d.ts +0 -10
  414. package/lib/components/divider/index.d.ts +0 -2
  415. package/lib/components/dropdown/dropdown.component.d.ts +0 -80
  416. package/lib/components/dropdown/dropdown.module.d.ts +0 -11
  417. package/lib/components/dropdown/index.d.ts +0 -2
  418. package/lib/components/filter/enums/trip-type.enum.d.ts +0 -6
  419. package/lib/components/filter/filter.component.d.ts +0 -942
  420. package/lib/components/filter/filter.module.d.ts +0 -22
  421. package/lib/components/filter/index.d.ts +0 -3
  422. package/lib/components/grid/col/col.component.d.ts +0 -45
  423. package/lib/components/grid/grid.component.d.ts +0 -92
  424. package/lib/components/grid/grid.module.d.ts +0 -10
  425. package/lib/components/grid/index.d.ts +0 -3
  426. package/lib/components/icon/icon.component.d.ts +0 -53
  427. package/lib/components/icon/icon.module.d.ts +0 -9
  428. package/lib/components/icon/index.d.ts +0 -2
  429. package/lib/components/icon-list/icon-list.component.d.ts +0 -49
  430. package/lib/components/icon-list/icon-list.module.d.ts +0 -10
  431. package/lib/components/icon-list/index.d.ts +0 -3
  432. package/lib/components/icon-list/models/icon-list.model.d.ts +0 -8
  433. package/lib/components/index.d.ts +0 -67
  434. package/lib/components/info/index.d.ts +0 -3
  435. package/lib/components/info/info.component.d.ts +0 -108
  436. package/lib/components/info/info.module.d.ts +0 -12
  437. package/lib/components/info/models/info.model.d.ts +0 -9
  438. package/lib/components/input/index.d.ts +0 -2
  439. package/lib/components/input/input.component.d.ts +0 -214
  440. package/lib/components/input/input.module.d.ts +0 -11
  441. package/lib/components/journey/index.d.ts +0 -5
  442. package/lib/components/journey/journey.component.d.ts +0 -102
  443. package/lib/components/journey/journey.module.d.ts +0 -11
  444. package/lib/components/journey/models/journey-flight.model.d.ts +0 -13
  445. package/lib/components/journey/models/journey.model.d.ts +0 -5
  446. package/lib/components/journey/models/marketing-carrier.enum.d.ts +0 -6
  447. package/lib/components/journey-availability/index.d.ts +0 -2
  448. package/lib/components/journey-availability/journey-availability.component.d.ts +0 -93
  449. package/lib/components/journey-availability/journey-availability.module.d.ts +0 -12
  450. package/lib/components/journey-availability-list/enums/availability-sort-option.enum.d.ts +0 -5
  451. package/lib/components/journey-availability-list/index.d.ts +0 -3
  452. package/lib/components/journey-availability-list/journey-availability-list.component.d.ts +0 -114
  453. package/lib/components/journey-availability-list/journey-availability-list.module.d.ts +0 -12
  454. package/lib/components/journey-selection/index.d.ts +0 -6
  455. package/lib/components/journey-selection/journey-selection.component.d.ts +0 -84
  456. package/lib/components/journey-selection/journey-selection.module.d.ts +0 -11
  457. package/lib/components/journey-selection/models/journey-selection-collapsed.model.d.ts +0 -11
  458. package/lib/components/journey-selection/models/journey-selection-common.model.d.ts +0 -7
  459. package/lib/components/journey-selection/models/journey-selection-expanded.model.d.ts +0 -5
  460. package/lib/components/journey-selection/models/journey-selection.model.d.ts +0 -14
  461. package/lib/components/journey-stopover/index.d.ts +0 -3
  462. package/lib/components/journey-stopover/journey-stopover.component.d.ts +0 -131
  463. package/lib/components/journey-stopover/journey-stopover.module.d.ts +0 -11
  464. package/lib/components/journey-stopover/models/stopover-time.model.d.ts +0 -4
  465. package/lib/components/list/index.d.ts +0 -3
  466. package/lib/components/list/list-item/list-item.component.d.ts +0 -35
  467. package/lib/components/list/list.component.d.ts +0 -76
  468. package/lib/components/list/list.module.d.ts +0 -10
  469. package/lib/components/micro-button/index.d.ts +0 -2
  470. package/lib/components/micro-button/micro-button.component.d.ts +0 -139
  471. package/lib/components/micro-button/micro-button.module.d.ts +0 -10
  472. package/lib/components/modal/index.d.ts +0 -2
  473. package/lib/components/modal/modal.component.d.ts +0 -119
  474. package/lib/components/modal/modal.module.d.ts +0 -12
  475. package/lib/components/number-field/index.d.ts +0 -3
  476. package/lib/components/number-field/models/number-field.model.d.ts +0 -5
  477. package/lib/components/number-field/number-field.component.d.ts +0 -124
  478. package/lib/components/number-field/number-field.module.d.ts +0 -12
  479. package/lib/components/page-footer/index.d.ts +0 -2
  480. package/lib/components/page-footer/page-footer.component.d.ts +0 -53
  481. package/lib/components/page-footer/page-footer.module.d.ts +0 -11
  482. package/lib/components/page-header/hamburger/hamburger.component.d.ts +0 -12
  483. package/lib/components/page-header/index.d.ts +0 -5
  484. package/lib/components/page-header/models/wallet.model.d.ts +0 -21
  485. package/lib/components/page-header/page-header.component.d.ts +0 -127
  486. package/lib/components/page-header/page-header.module.d.ts +0 -17
  487. package/lib/components/page-header/search/search.component.d.ts +0 -26
  488. package/lib/components/page-header/wallet/wallet.component.d.ts +0 -23
  489. package/lib/components/passenger-select/enums/passenger-type.enum.d.ts +0 -7
  490. package/lib/components/passenger-select/index.d.ts +0 -4
  491. package/lib/components/passenger-select/models/passengers.model.d.ts +0 -11
  492. package/lib/components/passenger-select/passenger-select.component.d.ts +0 -141
  493. package/lib/components/passenger-select/passenger-select.module.d.ts +0 -10
  494. package/lib/components/phone-number/index.d.ts +0 -2
  495. package/lib/components/phone-number/phone-number.component.d.ts +0 -263
  496. package/lib/components/phone-number/phone-number.module.d.ts +0 -13
  497. package/lib/components/premium-toggle/index.d.ts +0 -2
  498. package/lib/components/premium-toggle/premium-toggle.component.d.ts +0 -50
  499. package/lib/components/premium-toggle/premium-toggle.module.d.ts +0 -10
  500. package/lib/components/radio/index.d.ts +0 -2
  501. package/lib/components/radio/radio.component.d.ts +0 -137
  502. package/lib/components/radio/radio.module.d.ts +0 -10
  503. package/lib/components/ribbon-banner/index.d.ts +0 -2
  504. package/lib/components/ribbon-banner/ribbon-banner.component.d.ts +0 -66
  505. package/lib/components/ribbon-banner/ribbon-banner.module.d.ts +0 -13
  506. package/lib/components/select/index.d.ts +0 -5
  507. package/lib/components/select/models/select-option.model.d.ts +0 -4
  508. package/lib/components/select/optgroup/optgroup.component.d.ts +0 -25
  509. package/lib/components/select/option/option.component.d.ts +0 -24
  510. package/lib/components/select/select.component.d.ts +0 -204
  511. package/lib/components/select/select.module.d.ts +0 -13
  512. package/lib/components/select-new/index.d.ts +0 -4
  513. package/lib/components/select-new/models/select-option.model.d.ts +0 -6
  514. package/lib/components/select-new/optgroup/optgroup-new.component.d.ts +0 -8
  515. package/lib/components/select-new/option/option-new.component.d.ts +0 -16
  516. package/lib/components/select-new/select-new.component.d.ts +0 -173
  517. package/lib/components/select-new/select-new.module.d.ts +0 -14
  518. package/lib/components/select-new/services/select-new.service.d.ts +0 -10
  519. package/lib/components/simple-list/index.d.ts +0 -2
  520. package/lib/components/simple-list/simple-list.component.d.ts +0 -60
  521. package/lib/components/simple-list/simple-list.module.d.ts +0 -9
  522. package/lib/components/slide-toggle/index.d.ts +0 -2
  523. package/lib/components/slide-toggle/slide-toggle.component.d.ts +0 -70
  524. package/lib/components/slide-toggle/slide-toggle.module.d.ts +0 -10
  525. package/lib/components/slider/index.d.ts +0 -2
  526. package/lib/components/slider/slider.component.d.ts +0 -216
  527. package/lib/components/slider/slider.module.d.ts +0 -10
  528. package/lib/components/sort/index.d.ts +0 -2
  529. package/lib/components/sort/sort.component.d.ts +0 -55
  530. package/lib/components/sort/sort.module.d.ts +0 -12
  531. package/lib/components/spinner/index.d.ts +0 -2
  532. package/lib/components/spinner/spinner.component.d.ts +0 -104
  533. package/lib/components/spinner/spinner.module.d.ts +0 -9
  534. package/lib/components/status-box/index.d.ts +0 -3
  535. package/lib/components/status-box/models/status-box.model.d.ts +0 -5
  536. package/lib/components/status-box/status-box.component.d.ts +0 -92
  537. package/lib/components/status-box/status-box.module.d.ts +0 -11
  538. package/lib/components/suggestions/index.d.ts +0 -2
  539. package/lib/components/suggestions/suggestions.component.d.ts +0 -36
  540. package/lib/components/suggestions/suggestions.module.d.ts +0 -10
  541. package/lib/components/tab-group/index.d.ts +0 -3
  542. package/lib/components/tab-group/tab/tab.component.d.ts +0 -97
  543. package/lib/components/tab-group/tab-group.component.d.ts +0 -42
  544. package/lib/components/tab-group/tab-group.module.d.ts +0 -11
  545. package/lib/components/table/column/column.component.d.ts +0 -6
  546. package/lib/components/table/column-group/column-group.component.d.ts +0 -15
  547. package/lib/components/table/index.d.ts +0 -10
  548. package/lib/components/table/services/table.service.d.ts +0 -8
  549. package/lib/components/table/table-body/table-body.component.d.ts +0 -15
  550. package/lib/components/table/table-foot/table-foot.component.d.ts +0 -15
  551. package/lib/components/table/table-head/table-head.component.d.ts +0 -15
  552. package/lib/components/table/table-row/table-data/table-data.component.d.ts +0 -5
  553. package/lib/components/table/table-row/table-header/table-header.component.d.ts +0 -5
  554. package/lib/components/table/table-row/table-row.component.d.ts +0 -15
  555. package/lib/components/table/table.component.d.ts +0 -19
  556. package/lib/components/table/table.module.d.ts +0 -17
  557. package/lib/components/tag/index.d.ts +0 -2
  558. package/lib/components/tag/tag.component.d.ts +0 -71
  559. package/lib/components/tag/tag.module.d.ts +0 -10
  560. package/lib/components/textarea/index.d.ts +0 -2
  561. package/lib/components/textarea/textarea.component.d.ts +0 -156
  562. package/lib/components/textarea/textarea.module.d.ts +0 -11
  563. package/lib/components/toggle/index.d.ts +0 -2
  564. package/lib/components/toggle/models/options.model.d.ts +0 -7
  565. package/lib/components/toggle/toggle.component.d.ts +0 -159
  566. package/lib/components/toggle/toggle.module.d.ts +0 -11
  567. package/lib/components/tooltip/index.d.ts +0 -2
  568. package/lib/components/tooltip/tooltip.component.d.ts +0 -63
  569. package/lib/components/tooltip/tooltip.module.d.ts +0 -10
  570. package/lib/components/trip-summary/index.d.ts +0 -2
  571. package/lib/components/trip-summary/trip-summary.component.d.ts +0 -162
  572. package/lib/components/trip-summary/trip-summary.module.d.ts +0 -12
  573. package/lib/core/base/nas-component.base.d.ts +0 -11
  574. package/lib/core/decorators/debounce.decorator.d.ts +0 -1
  575. package/lib/core/directives/index.d.ts +0 -2
  576. package/lib/core/directives/nas-class/nas-class.directive.d.ts +0 -14
  577. package/lib/core/directives/nas-class/nas-class.module.d.ts +0 -8
  578. package/lib/core/extensions/html-element.extension.d.ts +0 -6
  579. package/lib/core/index.d.ts +0 -4
  580. package/lib/core/models/abandoned-basket-item.model.d.ts +0 -14
  581. package/lib/core/models/animate.model.d.ts +0 -6
  582. package/lib/core/models/class.model.d.ts +0 -7
  583. package/lib/core/models/index.d.ts +0 -6
  584. package/lib/core/models/link.model.d.ts +0 -5
  585. package/lib/core/models/position.model.d.ts +0 -4
  586. package/lib/core/models/utc-date.model.d.ts +0 -13
  587. package/lib/core/services/abandoned-basket/abandoned-basket.service.d.ts +0 -10
  588. package/lib/core/services/animate-helper/animate-helper.service.d.ts +0 -9
  589. package/lib/core/services/bem-helper/bem-helper.service.d.ts +0 -7
  590. package/lib/core/services/date/date-compare.enum.d.ts +0 -5
  591. package/lib/core/services/date/date-helper.service.d.ts +0 -22
  592. package/lib/core/services/device/device-helper.service.d.ts +0 -16
  593. package/lib/core/services/geolocation/geolocation-state.enum.d.ts +0 -6
  594. package/lib/core/services/geolocation/geolocation.service.d.ts +0 -9
  595. package/lib/core/services/index.d.ts +0 -9
  596. package/lib/core/services/language/language-helper.service.d.ts +0 -12
  597. package/lib/core/services/sort/sort.service.d.ts +0 -6
  598. package/lib/core/services/viewport/viewport.service.d.ts +0 -11
  599. package/lib/index.d.ts +0 -4
  600. package/lib/services/get-position.service.d.ts +0 -9
  601. package/lib/services/index.d.ts +0 -1
  602. package/lib/shared/index.d.ts +0 -1
  603. package/lib/shared/models/flight-details.d.ts +0 -22
  604. package/lib/shared/models/index.d.ts +0 -5
  605. package/lib/shared/models/journey-availability-sort.model.d.ts +0 -8
  606. package/lib/shared/models/journey-availability.model.d.ts +0 -25
  607. package/lib/shared/models/journey-details.model.d.ts +0 -8
  608. package/lib/shared/models/journey-duration.model.d.ts +0 -7
  609. package/lib/shared/models/journey-stopover.model.d.ts +0 -15
  610. package/lib/shared/models/journey-transit-info.model.d.ts +0 -5
  611. package/lib/shared/models/operating-carrier.model.d.ts +0 -4
  612. package/lib/shared/models/sort-option.model.d.ts +0 -11
  613. package/lib/shared/models/sort.model.d.ts +0 -10
  614. package/lib/shared/models/trip-item-details.model.d.ts +0 -12
  615. package/lib/shared/models/trip-summary-details.model.d.ts +0 -5
  616. package/lib/shared/models/trip-summary.model.d.ts +0 -4
  617. package/public_api.d.ts +0 -1
  618. /package/assets/icons/{icon-chevron-left--light.svg → medium/chevron-left--light.svg} +0 -0
  619. /package/assets/icons/{icon-chevron-left.svg → medium/chevron-left.svg} +0 -0
  620. /package/assets/icons/{icon-chevron-right--light.svg → medium/chevron-right--light.svg} +0 -0
  621. /package/assets/icons/{icon-chevron-right.svg → medium/chevron-right.svg} +0 -0
  622. /package/assets/images/{cloud-1.svg → cloud.svg} +0 -0
@@ -1,622 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright Norwegian Air Shuttle. All Rights Reserved.
4
- */
5
- import { DOCUMENT } from '@angular/common';
6
- import { Component, EventEmitter, Inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
7
- import { NasComponentBase } from '../../../core/base/nas-component.base';
8
- import { GeolocationState } from '../../../core/services/geolocation/geolocation-state.enum';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "../services/airport-select.service";
11
- import * as i2 from "../services/airport-select-dropdown.service";
12
- import * as i3 from "../../../core/services/geolocation/geolocation.service";
13
- import * as i4 from "@angular/common";
14
- import * as i5 from "@angular/forms";
15
- import * as i6 from "../../../core/directives/nas-class/nas-class.directive";
16
- import * as i7 from "../../icon/icon.component";
17
- import * as i8 from "../../button/button.component";
18
- let nextId = 0;
19
- export class AirportSelectDropdownComponent extends NasComponentBase {
20
- get closestAirports() {
21
- return this.closestAirportsValue;
22
- }
23
- set closestAirports(airports) {
24
- if (!airports || !airports.length) {
25
- return;
26
- }
27
- this.closestAirportsValue = airports;
28
- this.geolocationState = GeolocationState.granted;
29
- }
30
- get airport() {
31
- return this.airportValue;
32
- }
33
- set airport(airport) {
34
- if (!airport) {
35
- return;
36
- }
37
- this.airportValue = airport;
38
- this.selectedModel = airport.name;
39
- this.filteredAirports = this.selectService.filter(this.airports, this.selectedModel);
40
- }
41
- get open() {
42
- return this.openValue;
43
- }
44
- set open(value) {
45
- if (this.openValue === value) {
46
- return;
47
- }
48
- clearTimeout(this.inputSelectionTimeout);
49
- this.openValue = value;
50
- if (value) {
51
- this.inputSelectionTimeout = setTimeout(() => {
52
- this.input.nativeElement.select();
53
- }, 100);
54
- }
55
- }
56
- get airports() {
57
- return this.airportsValue;
58
- }
59
- set airports(airports) {
60
- this.airportsValue = airports;
61
- this.filteredAirports = this.selectService.filter(this.airports, this.selectedModel);
62
- }
63
- get selectedModel() {
64
- return this.selectedModelValue;
65
- }
66
- set selectedModel(model) {
67
- this.selectedModelValue = model;
68
- if (!this.nasFormGroup || !this.nasFormControlName) {
69
- return;
70
- }
71
- const control = this.nasFormGroup.get(this.nasFormControlName);
72
- if (control && control.value !== model) {
73
- control.patchValue(model);
74
- }
75
- }
76
- get resultsId() {
77
- return `nas-airport-select-dropdown-results-${this.componentId}`;
78
- }
79
- get labelId() {
80
- return `nas-airport-select-dropdown-label-${this.componentId}`;
81
- }
82
- get inputId() {
83
- return this.id ? this.id : `nas-airport-select-dropdown-input-${this.componentId}`;
84
- }
85
- get geolocationIcon() {
86
- if (this.focusOnGeolocation && this.geolocationState !== GeolocationState.denied) {
87
- return 'geolocation--light';
88
- }
89
- if (this.geolocationState === GeolocationState.denied) {
90
- return 'geolocation--disabled';
91
- }
92
- return 'geolocation';
93
- }
94
- constructor(document, selectService, airportSelectDropdownService, geolocationService) {
95
- super('nas-airport-select');
96
- this.document = document;
97
- this.selectService = selectService;
98
- this.airportSelectDropdownService = airportSelectDropdownService;
99
- this.geolocationService = geolocationService;
100
- this.focusedAirportIndex = -1;
101
- this.focusedLatestSearchesIndex = -1;
102
- this.focusedClosestAirportIndex = -1;
103
- this.filteredAirports = this.airports;
104
- this.displayAllAirportsLabel = true;
105
- this.geolocationState = null;
106
- this.isValid = true;
107
- this.noAirportsAvailable = false;
108
- this.selected = new EventEmitter();
109
- this.openChange = new EventEmitter();
110
- this.focusOnNext = new EventEmitter();
111
- this.focusOnPrevious = new EventEmitter();
112
- this.positionChange = new EventEmitter();
113
- this.clearedSelection = new EventEmitter();
114
- this.componentId = nextId++;
115
- }
116
- ngOnInit() {
117
- if (!this.ariaLabelClear) {
118
- this.warnMissingAccessibiltyInput('ariaLabelClear');
119
- }
120
- if (!this.ariaLabelBackdrop) {
121
- this.warnMissingAccessibiltyInput('ariaLabelBackdrop');
122
- }
123
- this.selectedModel = this.airport ? this.airport.name : '';
124
- if (this.exists(this.displayClosestAirports)) {
125
- this.geolocationService.getState().subscribe((state) => {
126
- this.geolocationState = state;
127
- if (state === GeolocationState.granted) {
128
- this.updateCurrentPosition();
129
- }
130
- });
131
- }
132
- if (!this.selectedModel) {
133
- this.filteredAirports = this.selectService.filter(this.airports, this.selectedModel);
134
- return;
135
- }
136
- this.displayLatestSearches = false;
137
- this.displayClosestAirports = false;
138
- this.displayAllAirportsLabel = false;
139
- if (!this.filteredAirports) {
140
- return;
141
- }
142
- const airport = this.filteredAirports.find(x => x.name === this.selectedModel);
143
- if (airport) {
144
- this.focusedAirportCode = airport.code;
145
- }
146
- }
147
- getAllAirportsAirportId(airportCode) {
148
- return `nas-airport-select-dropdown-airport-${this.componentId}-all-airports-${airportCode}`;
149
- }
150
- getClosestAirportsAirportId(airportCode) {
151
- return `nas-airport-select-dropdown-airport-${this.componentId}-closest-airports-${airportCode}`;
152
- }
153
- getLatestSearchesAirportId(airportCode) {
154
- return `nas-airport-select-dropdown-airport-${this.componentId}-latest-searches-${airportCode}`;
155
- }
156
- updateCurrentPosition() {
157
- if (this.geolocationState === GeolocationState.denied
158
- || this.geolocationState === GeolocationState.unknown) {
159
- return;
160
- }
161
- this.geolocationService.getCurrentPosition().subscribe((x) => {
162
- this.positionChange.emit(x);
163
- }, (error) => {
164
- if (error.PERMISSION_DENIED) {
165
- this.geolocationState = GeolocationState.denied;
166
- }
167
- });
168
- }
169
- setOpen() {
170
- if (this.open) {
171
- return;
172
- }
173
- this.open = true;
174
- this.openChange.emit(true);
175
- }
176
- onGeolocationHover(hover) {
177
- if (hover && this.geolocationState !== GeolocationState.denied) {
178
- this.focusOnGeolocation = true;
179
- }
180
- else {
181
- this.focusOnGeolocation = false;
182
- }
183
- }
184
- blur() {
185
- if (this.keepSelection) {
186
- this.selectedModel = this.lastSelectedModel;
187
- }
188
- this.open = false;
189
- this.openChange.emit(false);
190
- if (this.selectedModel === this.lastSelectedModel) {
191
- return;
192
- }
193
- if (this.selectedModel) {
194
- if (this.filteredAirports) {
195
- let airport = this.filteredAirports.find(x => x.name === this.selectedModel);
196
- if (!airport) {
197
- airport = this.filteredAirports[0];
198
- }
199
- this.updateSelected(airport);
200
- }
201
- }
202
- else {
203
- this.updateSelected({
204
- airportName: '',
205
- code: '',
206
- countryName: '',
207
- displayName: '',
208
- name: '',
209
- normalizedAirportName: ''
210
- });
211
- }
212
- }
213
- filter() {
214
- let isEmpty = false;
215
- if (!this.nasFormGroup || !this.nasFormControlName) {
216
- if (!this.selectedModel) {
217
- this.resetFilter();
218
- isEmpty = true;
219
- }
220
- else {
221
- this.focusedAirportIndex = 0;
222
- this.filteredAirports = this.selectService.filter(this.airports, this.selectedModel);
223
- this.focusedAirportCode = this.filteredAirports[0]?.code;
224
- }
225
- }
226
- else {
227
- const control = this.nasFormGroup.get(this.nasFormControlName);
228
- if (!control || !control.value) {
229
- this.resetFilter();
230
- isEmpty = true;
231
- }
232
- else {
233
- this.focusedAirportIndex = 0;
234
- this.filteredAirports = this.selectService.filter(this.airports, control.value);
235
- this.focusedAirportCode = this.filteredAirports[0]?.code;
236
- }
237
- }
238
- this.displayLatestSearches = isEmpty;
239
- this.displayClosestAirports = isEmpty;
240
- this.displayAllAirportsLabel = isEmpty;
241
- }
242
- clearSelected(event) {
243
- event.preventDefault();
244
- if (this.keepSelection) {
245
- this.lastSelectedModel = this.airport.name;
246
- }
247
- this.selectedModel = '';
248
- this.updateSelected({
249
- name: '',
250
- countryName: '',
251
- code: '',
252
- displayName: '',
253
- airportName: '',
254
- normalizedAirportName: ''
255
- });
256
- this.focusedAirportIndex = -1;
257
- this.focusedLatestSearchesIndex = -1;
258
- this.focusedClosestAirportIndex = -1;
259
- this.focusedAirportCode = '';
260
- this.focusedLatestSearchesAirportCode = '';
261
- this.focusedClosestAirportCode = '';
262
- this.filteredAirports = this.airports;
263
- this.open = true;
264
- this.displayLatestSearches = true;
265
- this.displayClosestAirports = true;
266
- this.displayAllAirportsLabel = true;
267
- this.openChange.emit(this.open);
268
- this.clearedSelection.emit();
269
- }
270
- focusDown() {
271
- const hasLatestSearches = this.airportSelectDropdownService
272
- .hasLatestSearches(this.exists(this.displayLatestSearches), this.latestSearches);
273
- const hasClosestAirports = this.airportSelectDropdownService
274
- .hasClosestAirports(this.exists(this.displayClosestAirports), this.closestAirports);
275
- if (this.geolocationState !== null &&
276
- this.geolocationState !== GeolocationState.granted &&
277
- this.geolocationState !== GeolocationState.denied &&
278
- !this.focusOnGeolocation &&
279
- this.focusedAirportIndex === -1 &&
280
- this.focusedLatestSearchesIndex === -1) {
281
- this.focusOnGeolocation = true;
282
- }
283
- else if (hasLatestSearches && this.focusedLatestSearchesIndex < this.latestSearches.length - 1) {
284
- this.focusDownLatestSearches();
285
- }
286
- else if (hasClosestAirports
287
- && this.airportSelectDropdownService.isIndexInClosestAirports(this.focusedClosestAirportIndex, this.closestAirports)) {
288
- this.focusDownClosestAirports();
289
- }
290
- else {
291
- this.focusDownAirports(hasClosestAirports, hasLatestSearches);
292
- }
293
- this.autoScroll(66);
294
- }
295
- focusUp() {
296
- const hasLatestSearches = this.airportSelectDropdownService
297
- .hasLatestSearches(this.exists(this.displayLatestSearches), this.latestSearches);
298
- const hasClosestAirports = this.airportSelectDropdownService
299
- .hasClosestAirports(this.exists(this.displayClosestAirports), this.closestAirports);
300
- const hasGeolocation = this.geolocationState !== null &&
301
- this.geolocationState !== GeolocationState.granted &&
302
- this.geolocationState !== GeolocationState.denied &&
303
- !this.focusOnGeolocation;
304
- if (this.focusedAirportIndex > 0) {
305
- this.focusUpAirports(hasClosestAirports, hasLatestSearches);
306
- }
307
- else if (hasClosestAirports && this.focusedAirportIndex <= 0 && this.focusedClosestAirportIndex > 0) {
308
- this.focusUpClosestAirports(hasLatestSearches);
309
- }
310
- else if (hasLatestSearches && hasClosestAirports && this.focusedClosestAirportIndex <= 0
311
- || hasLatestSearches && !hasClosestAirports && this.focusedAirportIndex <= 0) {
312
- this.focusUpLatestSearches();
313
- }
314
- else if (hasGeolocation && hasLatestSearches && this.focusedLatestSearchesIndex <= 0
315
- || hasGeolocation && !hasLatestSearches && this.focusedAirportIndex <= 0) {
316
- this.focusOnGeolocation = true;
317
- this.focusedAirportCode = '';
318
- this.focusedLatestSearchesAirportCode = '';
319
- this.focusedLatestSearchesIndex = -1;
320
- this.focusedAirportIndex = -1;
321
- }
322
- else {
323
- this.blur();
324
- }
325
- this.autoScroll(66);
326
- }
327
- setSelected(airport) {
328
- this.updateSelected(airport);
329
- this.open = false;
330
- this.openChange.emit(false);
331
- }
332
- onKeyDown(event) {
333
- switch (event.key) {
334
- case 'Escape':
335
- this.open = false;
336
- if (this.keepSelection && !this.airport.name) {
337
- this.blur();
338
- }
339
- break;
340
- case 'Tab':
341
- case 'Enter':
342
- if (this.filteredAirports) {
343
- const airport = this.filteredAirports.find(x => x.code === this.focusedAirportCode) || this.filteredAirports[0];
344
- this.selectedModel = airport?.name || '';
345
- }
346
- if (this.focusOnGeolocation) {
347
- event.preventDefault();
348
- this.updateCurrentPosition();
349
- return;
350
- }
351
- else {
352
- this.blur();
353
- if (!event.shiftKey) {
354
- event.preventDefault();
355
- this.focusOnNext.emit(event);
356
- }
357
- else {
358
- this.focusOnPrevious.emit();
359
- }
360
- }
361
- if (!event.shiftKey) {
362
- event.preventDefault();
363
- setTimeout(() => {
364
- this.focusOnNext.emit(event);
365
- });
366
- }
367
- else {
368
- this.open = false;
369
- }
370
- break;
371
- case 'ArrowDown':
372
- case 'Down':
373
- this.focusDown();
374
- break;
375
- case 'ArrowUp':
376
- case 'Up':
377
- this.focusUp();
378
- break;
379
- case 'Backspace':
380
- case 'Delete':
381
- if (this.keepSelection) {
382
- this.lastSelectedModel = this.airport.name;
383
- }
384
- break;
385
- default:
386
- break;
387
- }
388
- }
389
- resetFilter() {
390
- this.focusedAirportIndex = -1;
391
- this.focusedLatestSearchesIndex = -1;
392
- this.focusedClosestAirportIndex = -1;
393
- this.focusedAirportCode = '';
394
- this.focusedLatestSearchesAirportCode = '';
395
- this.focusedClosestAirportCode = '';
396
- this.filteredAirports = this.airports;
397
- }
398
- updateSelected(airport) {
399
- this.selectedModel = airport.name;
400
- if (this.keepSelection && airport.name.length) {
401
- this.lastSelectedModel = airport.name;
402
- }
403
- this.selected.emit(airport);
404
- }
405
- focusDownLatestSearches() {
406
- this.focusOnGeolocation = false;
407
- let index = this.focusedLatestSearchesIndex;
408
- index = index + 1;
409
- const airport = this.latestSearches[index];
410
- this.focusedLatestSearchesIndex = index;
411
- this.focusedLatestSearchesAirportCode = airport.code;
412
- this.focusedAirportCode = '';
413
- this.focusedClosestAirportCode = '';
414
- this.updateSelected(airport);
415
- }
416
- focusDownClosestAirports() {
417
- let index = this.focusedClosestAirportIndex;
418
- index = index + 1;
419
- const airport = this.closestAirports[index];
420
- this.focusedClosestAirportIndex = index;
421
- this.focusedClosestAirportCode = airport.code || '';
422
- this.focusedAirportCode = '';
423
- this.focusedLatestSearchesAirportCode = '';
424
- this.updateSelected(airport);
425
- }
426
- focusDownAirports(hasClosestAirports, hasLatestSearches) {
427
- let index = this.focusedAirportIndex;
428
- this.focusOnGeolocation = false;
429
- index = index + 1;
430
- if (this.filteredAirports && index > this.filteredAirports.length - 1) {
431
- this.focusedClosestAirportIndex = -1;
432
- this.focusedLatestSearchesIndex = -1;
433
- this.focusedAirportIndex = -1;
434
- if (this.geolocationState !== GeolocationState.granted) {
435
- this.focusOnGeolocation = true;
436
- this.focusedAirportCode = '';
437
- this.focusedClosestAirportCode = '';
438
- this.focusedLatestSearchesAirportCode = '';
439
- return;
440
- }
441
- else if (hasLatestSearches) {
442
- this.focusDownLatestSearches();
443
- return;
444
- }
445
- else if (hasClosestAirports) {
446
- this.focusDownClosestAirports();
447
- return;
448
- }
449
- }
450
- this.focusedAirportIndex = index;
451
- if (this.filteredAirports) {
452
- const airport = this.filteredAirports[index];
453
- if (airport) {
454
- this.focusedAirportCode = airport.code;
455
- this.selectedModel = airport.name;
456
- }
457
- }
458
- this.focusedLatestSearchesAirportCode = '';
459
- this.focusedClosestAirportCode = '';
460
- }
461
- focusUpAirports(hasClosestAirports, hasLatestSearches) {
462
- let index = this.focusedAirportIndex;
463
- this.focusOnGeolocation = false;
464
- if (index - 1 < 0) {
465
- this.focusedAirportIndex = -1;
466
- this.focusedAirportCode = '';
467
- this.blur();
468
- if (!hasClosestAirports) {
469
- this.focusedClosestAirportCode = '';
470
- }
471
- if (!hasLatestSearches) {
472
- this.focusedClosestAirportCode = '';
473
- }
474
- return;
475
- }
476
- index = index - 1;
477
- this.focusedAirportIndex = index;
478
- this.focusedLatestSearchesAirportCode = '';
479
- this.focusedClosestAirportCode = '';
480
- if (this.filteredAirports) {
481
- const airport = this.filteredAirports[index];
482
- if (airport) {
483
- this.focusedAirportCode = airport.code;
484
- this.selectedModel = airport.name;
485
- }
486
- }
487
- }
488
- autoScroll(extraOffset) {
489
- if (!this.results) {
490
- return;
491
- }
492
- const results = this.results.nativeElement;
493
- const focusedItem = this.document.querySelector('.nas-airport-select__list-item--focus');
494
- if (focusedItem) {
495
- results.scrollTo(0, 0);
496
- results.scrollTo(0, focusedItem.offsetTop + extraOffset - results.clientHeight);
497
- }
498
- }
499
- focusUpLatestSearches() {
500
- this.focusOnGeolocation = false;
501
- let latestSearchesIndex = this.focusedLatestSearchesIndex;
502
- if (latestSearchesIndex < 0) {
503
- this.focusedLatestSearchesIndex = -1;
504
- this.focusedLatestSearchesAirportCode = '';
505
- this.blur();
506
- return;
507
- }
508
- const closestAirportIndex = this.focusedClosestAirportIndex;
509
- const airportsIndex = this.focusedAirportIndex;
510
- if (closestAirportIndex < 0 && airportsIndex < 0) {
511
- latestSearchesIndex = latestSearchesIndex - 1;
512
- if (latestSearchesIndex < 0) {
513
- this.focusedLatestSearchesIndex = -1;
514
- this.focusedLatestSearchesAirportCode = '';
515
- this.blur();
516
- return;
517
- }
518
- }
519
- const airport = this.latestSearches[latestSearchesIndex];
520
- this.focusedLatestSearchesIndex = latestSearchesIndex;
521
- this.focusedLatestSearchesAirportCode = airport.code;
522
- this.focusedClosestAirportCode = '';
523
- this.focusedClosestAirportIndex = -1;
524
- this.focusedAirportCode = '';
525
- this.focusedAirportIndex = -1;
526
- this.updateSelected(airport);
527
- }
528
- focusUpClosestAirports(hasLatestSearches) {
529
- let closestAirportIndex = this.focusedClosestAirportIndex;
530
- if (!hasLatestSearches && closestAirportIndex <= 0) {
531
- this.focusedClosestAirportIndex = -1;
532
- this.blur();
533
- return;
534
- }
535
- if (closestAirportIndex - 1 < 0) {
536
- this.focusedClosestAirportIndex = -1;
537
- this.focusedClosestAirportCode = '';
538
- return;
539
- }
540
- if (this.focusedAirportIndex < 0) {
541
- closestAirportIndex = closestAirportIndex - 1;
542
- }
543
- const airport = this.closestAirports[closestAirportIndex];
544
- this.focusedClosestAirportIndex = closestAirportIndex;
545
- this.focusedClosestAirportCode = airport.code;
546
- this.focusedAirportCode = '';
547
- this.focusedAirportIndex = -1;
548
- this.updateSelected(airport);
549
- }
550
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AirportSelectDropdownComponent, deps: [{ token: DOCUMENT }, { token: i1.AirportSelectService }, { token: i2.AirportSelectDropdownService }, { token: i3.GeolocationService }], target: i0.ɵɵFactoryTarget.Component }); }
551
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AirportSelectDropdownComponent, selector: "nas-airport-select-dropdown", inputs: { id: "id", displayLatestSearches: "displayLatestSearches", displayClosestAirports: "displayClosestAirports", latestSearches: "latestSearches", resultsLabels: "resultsLabels", airportSelectLabel: "airportSelectLabel", airportSelectPlaceholder: "airportSelectPlaceholder", airportSelectIconModifier: "airportSelectIconModifier", labelOutside: "labelOutside", keepSelection: "keepSelection", nasFormControlName: "nasFormControlName", nasFormGroup: "nasFormGroup", enableGeolocation: "enableGeolocation", ariaLabelClear: "ariaLabelClear", ariaLabelBackdrop: "ariaLabelBackdrop", isValid: "isValid", invalidText: "invalidText", noAirportsAvailable: "noAirportsAvailable", closestAirports: "closestAirports", airport: "airport", open: "open", airports: "airports" }, outputs: { selected: "selected", openChange: "openChange", focusOnNext: "focusOnNext", focusOnPrevious: "focusOnPrevious", positionChange: "positionChange", clearedSelection: "clearedSelection" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["airportSelect"], descendants: true }, { propertyName: "results", first: true, predicate: ["results"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!nasFormControlName; else reactiveForm\">\n <label [id]=\"labelId\" [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled', exists(labelOutside) && 'label-outside'])\">\n <span [nasClass]=\"getClass('label')\">\n <ng-container *ngIf=\"airportSelectLabel; else emptyLabel\">{{airportSelectLabel}}</ng-container>\n <ng-template #emptyLabel>&nbsp;</ng-template>\n </span>\n <input #airportSelect type=\"text\" role=\"combobox\" autocomplete=\"off\" aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\" [id]=\"inputId\" [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\" [attr.aria-owns]=\"resultsId\" [nasClass]=\"getClass('input')\"\n [placeholder]=\"airportSelectPlaceholder\" (focus)=\"setOpen()\" (mousedown)=\"setOpen()\" (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\" [(ngModel)]=\"selectedModel\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\" role=\"button\" tabindex=\"-1\" *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\" (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\" [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-container>\n<ng-template #reactiveForm>\n <label [id]=\"labelId\" [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled', exists(labelOutside) && 'label-outside'])\"\n [formGroup]=\"nasFormGroup\">\n <span [nasClass]=\"getClass('label')\" *ngIf=\"airportSelectLabel\">{{airportSelectLabel}}</span>\n <input #airportSelect type=\"text\" role=\"combobox\" autocomplete=\"off\" aria-autocomplete=\"none\" [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\" [attr.aria-expanded]=\"open ? 'true' : 'false'\" [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\" [formControlName]=\"nasFormControlName\" [placeholder]=\"airportSelectPlaceholder\"\n (mousedown)=\"setOpen()\" (focus)=\"setOpen()\" (input)=\"filter()\" (keydown)=\"onKeyDown($event)\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\" role=\"button\" tabindex=\"-1\" *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\" (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\" [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-template>\n<div [nasClass]=\"getClass('results-wrapper', exists(labelOutside) && 'label-outside')\" [id]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\">\n <ul #results role=\"listbox\" *ngIf=\"open\" [attr.aria-labelledby]=\"labelId\" [nasClass]=\"getClass('results')\">\n <ng-container *ngIf=\"exists(enableGeolocation) && geolocationState !== null && geolocationState !== 0 && isValid\">\n <li role=\"option\">\n <nas-button link secondary [disabled]=\"geolocationState === 2\"\n [cssStyle]=\"{'height': '66px', 'text-decoration': 'underline', 'display': 'flex', 'justify-content': 'space-between'}\"\n [cssClass]=\"getClass('item', ['geolocation', focusOnGeolocation && geolocationState !== 2 && 'focus', geolocationState === 2 && 'disabled'])\"\n [tabindex]=\"-1\" (clickChange)=\"updateCurrentPosition()\" (mouseenter)=\"onGeolocationHover(true)\"\n (mouseleave)=\"onGeolocationHover(false)\">\n <nas-icon [nasClass]=\"getClass('geolocation', 'icon')\" [type]=\"geolocationIcon\"></nas-icon>\n <span *ngIf=\"geolocationState === 1; else geolocationDenied\"\n [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocation}}</span>\n <ng-template #geolocationDenied>\n <span [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocationDenied}}</span>\n </ng-template>\n </nas-button>\n </li>\n </ng-container>\n <li role=\"separator\" [nasClass]=\"getClass('list-section-label')\" *ngIf=\"latestSearches?.length > 0\n && exists(displayLatestSearches)\n && resultsLabels?.latestSearches\n && isValid\">\n <span>{{resultsLabels?.latestSearches}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayLatestSearches) && isValid\">\n <li role=\"option\" *ngFor=\"let airport of latestSearches\" [id]=\"getLatestSearchesAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedLatestSearchesAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedLatestSearchesAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedLatestSearchesAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\" tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\" *ngIf=\"exists(displayClosestAirports)\n && geolocationState !== null\n && geolocationState === 0\n && closestAirports?.length > 0\n && resultsLabels?.closestAirports\n && isValid\" [nasClass]=\"getClass('list-section-label')\">\n <span>{{resultsLabels?.closestAirports}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayClosestAirports) && geolocationState === 0 && isValid\">\n <li role=\"option\" *ngFor=\"let airport of closestAirports\" [id]=\"getClosestAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedClosestAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedClosestAirportCode && 'focus')\">\n <button type=\"button\" [nasClass]=\"getClass('item', airport.code === focusedClosestAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\" tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\" [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"displayAllAirportsLabel && resultsLabels?.allAirports && isValid && !noAirportsAvailable\">\n <span>{{resultsLabels?.allAirports}}</span>\n </li>\n <ng-container *ngIf=\"isValid\">\n <li role=\"option\" *ngFor=\"let airport of filteredAirports\" [id]=\"getAllAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedAirportCode && 'focus')\">\n <button type=\"button\" [nasClass]=\"getClass('item', airport.code === focusedAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\" tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li *ngIf=\"!isValid\" role=\"listitem\">\n <span [nasClass]=\"getClass('name', 'invalid')\">{{invalidText}}</span>\n </li>\n <li *ngIf=\"resultsLabels?.noAirports && noAirportsAvailable\" role=\"listitem\">\n <span [nasClass]=\"getClass('empty-list')\">{{resultsLabels.noAirports}}</span>\n </li>\n </ul>\n</div>\n<button type=\"button\" tabindex=\"0\" *ngIf=\"open\" [attr.aria-label]=\"ariaLabelBackdrop\" [nasClass]=\"getClass('backdrop')\"\n (click)=\"blur()\"></button>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NasClassDirective, selector: "[nasClass]", inputs: ["nasClass", "attr.class"] }, { kind: "component", type: i7.IconComponent, selector: "nas-icon", inputs: ["icon", "type", "isIndicator", "lightCircularBackground", "cssClass"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.ButtonComponent, selector: "nas-button", inputs: ["primary", "secondary", "tertiary", "link", "light", "large", "block", "flex", "compact", "right", "spaceless", "href", "trackingvalue", "canContinueOnDisabled", "disabled", "type", "cssClass", "ariaLabel", "cssStyle", "tabindex", "overrideBaseCssClass", "useRouterLink", "id", "target", "icon", "iconLeft", "iconType", "buttonlink"], outputs: ["clickChange", "focusOnNext"] }], encapsulation: i0.ViewEncapsulation.None }); }
552
- }
553
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AirportSelectDropdownComponent, decorators: [{
554
- type: Component,
555
- args: [{ selector: 'nas-airport-select-dropdown', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"!nasFormControlName; else reactiveForm\">\n <label [id]=\"labelId\" [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled', exists(labelOutside) && 'label-outside'])\">\n <span [nasClass]=\"getClass('label')\">\n <ng-container *ngIf=\"airportSelectLabel; else emptyLabel\">{{airportSelectLabel}}</ng-container>\n <ng-template #emptyLabel>&nbsp;</ng-template>\n </span>\n <input #airportSelect type=\"text\" role=\"combobox\" autocomplete=\"off\" aria-haspopup=\"listbox\"\n aria-autocomplete=\"none\" [id]=\"inputId\" [attr.aria-controls]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\" [attr.aria-owns]=\"resultsId\" [nasClass]=\"getClass('input')\"\n [placeholder]=\"airportSelectPlaceholder\" (focus)=\"setOpen()\" (mousedown)=\"setOpen()\" (input)=\"filter()\"\n (keydown)=\"onKeyDown($event)\" [(ngModel)]=\"selectedModel\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\" role=\"button\" tabindex=\"-1\" *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\" (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\" [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-container>\n<ng-template #reactiveForm>\n <label [id]=\"labelId\" [attr.aria-label]=\"airportSelectLabel\"\n [nasClass]=\"getClass('wrapper', [open && 'active', selectedModel && 'filled', exists(labelOutside) && 'label-outside'])\"\n [formGroup]=\"nasFormGroup\">\n <span [nasClass]=\"getClass('label')\" *ngIf=\"airportSelectLabel\">{{airportSelectLabel}}</span>\n <input #airportSelect type=\"text\" role=\"combobox\" autocomplete=\"off\" aria-autocomplete=\"none\" [id]=\"inputId\"\n [attr.aria-controls]=\"resultsId\" [attr.aria-expanded]=\"open ? 'true' : 'false'\" [attr.aria-owns]=\"resultsId\"\n [nasClass]=\"getClass('input')\" [formControlName]=\"nasFormControlName\" [placeholder]=\"airportSelectPlaceholder\"\n (mousedown)=\"setOpen()\" (focus)=\"setOpen()\" (input)=\"filter()\" (keydown)=\"onKeyDown($event)\" />\n <span [nasClass]=\"getClass('icon')\">\n <button type=\"button\" role=\"button\" tabindex=\"-1\" *ngIf=\"selectedModel; else isEmpty\"\n [attr.aria-label]=\"ariaLabelClear\" (click)=\"clearSelected($event)\">\n <nas-icon [type]=\"selectedModel ? 'remove--secondary' : 'remove'\"></nas-icon>\n </button>\n <ng-template #isEmpty>\n <nas-icon [type]=\"'small'\" [icon]=\"airportSelectIconModifier\"></nas-icon>\n </ng-template>\n </span>\n </label>\n</ng-template>\n<div [nasClass]=\"getClass('results-wrapper', exists(labelOutside) && 'label-outside')\" [id]=\"resultsId\"\n [attr.aria-expanded]=\"open ? 'true' : 'false'\">\n <ul #results role=\"listbox\" *ngIf=\"open\" [attr.aria-labelledby]=\"labelId\" [nasClass]=\"getClass('results')\">\n <ng-container *ngIf=\"exists(enableGeolocation) && geolocationState !== null && geolocationState !== 0 && isValid\">\n <li role=\"option\">\n <nas-button link secondary [disabled]=\"geolocationState === 2\"\n [cssStyle]=\"{'height': '66px', 'text-decoration': 'underline', 'display': 'flex', 'justify-content': 'space-between'}\"\n [cssClass]=\"getClass('item', ['geolocation', focusOnGeolocation && geolocationState !== 2 && 'focus', geolocationState === 2 && 'disabled'])\"\n [tabindex]=\"-1\" (clickChange)=\"updateCurrentPosition()\" (mouseenter)=\"onGeolocationHover(true)\"\n (mouseleave)=\"onGeolocationHover(false)\">\n <nas-icon [nasClass]=\"getClass('geolocation', 'icon')\" [type]=\"geolocationIcon\"></nas-icon>\n <span *ngIf=\"geolocationState === 1; else geolocationDenied\"\n [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocation}}</span>\n <ng-template #geolocationDenied>\n <span [nasClass]=\"getClass('geolocation', 'label')\">{{resultsLabels?.geolocationDenied}}</span>\n </ng-template>\n </nas-button>\n </li>\n </ng-container>\n <li role=\"separator\" [nasClass]=\"getClass('list-section-label')\" *ngIf=\"latestSearches?.length > 0\n && exists(displayLatestSearches)\n && resultsLabels?.latestSearches\n && isValid\">\n <span>{{resultsLabels?.latestSearches}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayLatestSearches) && isValid\">\n <li role=\"option\" *ngFor=\"let airport of latestSearches\" [id]=\"getLatestSearchesAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedLatestSearchesAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedLatestSearchesAirportCode && 'focus')\">\n <button type=\"button\"\n [nasClass]=\"getClass('item', airport.code === focusedLatestSearchesAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\" tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\" *ngIf=\"exists(displayClosestAirports)\n && geolocationState !== null\n && geolocationState === 0\n && closestAirports?.length > 0\n && resultsLabels?.closestAirports\n && isValid\" [nasClass]=\"getClass('list-section-label')\">\n <span>{{resultsLabels?.closestAirports}}</span>\n </li>\n <ng-container *ngIf=\"exists(displayClosestAirports) && geolocationState === 0 && isValid\">\n <li role=\"option\" *ngFor=\"let airport of closestAirports\" [id]=\"getClosestAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedClosestAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedClosestAirportCode && 'focus')\">\n <button type=\"button\" [nasClass]=\"getClass('item', airport.code === focusedClosestAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\" tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li role=\"separator\" [nasClass]=\"getClass('list-section-label')\"\n *ngIf=\"displayAllAirportsLabel && resultsLabels?.allAirports && isValid && !noAirportsAvailable\">\n <span>{{resultsLabels?.allAirports}}</span>\n </li>\n <ng-container *ngIf=\"isValid\">\n <li role=\"option\" *ngFor=\"let airport of filteredAirports\" [id]=\"getAllAirportsAirportId(airport.code)\"\n [attr.aria-selected]=\"airport.code === focusedAirportCode\"\n [nasClass]=\"getClass('list-item', airport.code === focusedAirportCode && 'focus')\">\n <button type=\"button\" [nasClass]=\"getClass('item', airport.code === focusedAirportCode && 'focus')\"\n (click)=\"setSelected(airport)\" tabindex=\"-1\">\n <span [nasClass]=\"getClass('name')\">{{airport.name}}</span>\n <span [nasClass]=\"getClass('code')\"></span>\n <span [nasClass]=\"getClass('country')\">{{airport.countryName}}</span>\n </button>\n </li>\n </ng-container>\n <li *ngIf=\"!isValid\" role=\"listitem\">\n <span [nasClass]=\"getClass('name', 'invalid')\">{{invalidText}}</span>\n </li>\n <li *ngIf=\"resultsLabels?.noAirports && noAirportsAvailable\" role=\"listitem\">\n <span [nasClass]=\"getClass('empty-list')\">{{resultsLabels.noAirports}}</span>\n </li>\n </ul>\n</div>\n<button type=\"button\" tabindex=\"0\" *ngIf=\"open\" [attr.aria-label]=\"ariaLabelBackdrop\" [nasClass]=\"getClass('backdrop')\"\n (click)=\"blur()\"></button>" }]
556
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
557
- type: Inject,
558
- args: [DOCUMENT]
559
- }] }, { type: i1.AirportSelectService }, { type: i2.AirportSelectDropdownService }, { type: i3.GeolocationService }]; }, propDecorators: { input: [{
560
- type: ViewChild,
561
- args: ['airportSelect']
562
- }], results: [{
563
- type: ViewChild,
564
- args: ['results']
565
- }], id: [{
566
- type: Input
567
- }], displayLatestSearches: [{
568
- type: Input
569
- }], displayClosestAirports: [{
570
- type: Input
571
- }], latestSearches: [{
572
- type: Input
573
- }], resultsLabels: [{
574
- type: Input
575
- }], airportSelectLabel: [{
576
- type: Input
577
- }], airportSelectPlaceholder: [{
578
- type: Input
579
- }], airportSelectIconModifier: [{
580
- type: Input
581
- }], labelOutside: [{
582
- type: Input
583
- }], keepSelection: [{
584
- type: Input
585
- }], nasFormControlName: [{
586
- type: Input
587
- }], nasFormGroup: [{
588
- type: Input
589
- }], enableGeolocation: [{
590
- type: Input
591
- }], ariaLabelClear: [{
592
- type: Input
593
- }], ariaLabelBackdrop: [{
594
- type: Input
595
- }], isValid: [{
596
- type: Input
597
- }], invalidText: [{
598
- type: Input
599
- }], noAirportsAvailable: [{
600
- type: Input
601
- }], closestAirports: [{
602
- type: Input
603
- }], airport: [{
604
- type: Input
605
- }], open: [{
606
- type: Input
607
- }], airports: [{
608
- type: Input
609
- }], selected: [{
610
- type: Output
611
- }], openChange: [{
612
- type: Output
613
- }], focusOnNext: [{
614
- type: Output
615
- }], focusOnPrevious: [{
616
- type: Output
617
- }], positionChange: [{
618
- type: Output
619
- }], clearedSelection: [{
620
- type: Output
621
- }] } });
622
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9haXJwb3J0LXNlbGVjdC9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2FpcnBvcnQtc2VsZWN0L2FpcnBvcnQtc2VsZWN0LWRyb3Bkb3duL2FpcnBvcnQtc2VsZWN0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBTXpFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7Ozs7Ozs7O0FBRTdGLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQVFmLE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxnQkFBZ0I7SUFzQ2xFLElBQ0ksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBSSxlQUFlLENBQUMsUUFBNkI7UUFDL0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDakMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFH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O2dCQWNGLE9BQU87c0JBRFYsS0FBSztnQkFlRixJQUFJO3NCQURQLEtBQUs7Z0JBb0JGLFFBQVE7c0JBRFgsS0FBSztnQkFTSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IE5vcndlZ2lhbiBBaXIgU2h1dHRsZS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqL1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmFzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvYmFzZS9uYXMtY29tcG9uZW50LmJhc2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9nZW9sb2NhdGlvbi9nZW9sb2NhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFpcnBvcnRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9haXJwb3J0Lm1vZGVsJztcbmltcG9ydCB7IFJlc3VsdHNMYWJlbHNNb2RlbCB9IGZyb20gJy4uL21vZGVscy9yZXN1bHRzLWxhYmVscy5tb2RlbCc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uc2VydmljZSc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FpcnBvcnQtc2VsZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TdGF0ZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24tc3RhdGUuZW51bSc7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWlycG9ydC1zZWxlY3QtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9haXJwb3J0LXNlbGVjdC1kcm9wZG93bi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEFpcnBvcnRTZWxlY3REcm9wZG93bkNvbXBvbmVudCBleHRlbmRzIE5hc0NvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGFpcnBvcnRWYWx1ZTogQWlycG9ydE1vZGVsO1xuICBhaXJwb3J0c1ZhbHVlOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBmb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gIGZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gIGZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gIGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGU6IHN0cmluZztcbiAgZm9jdXNlZEFpcnBvcnRDb2RlOiBzdHJpbmc7XG4gIGZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlOiBzdHJpbmc7XG4gIGZpbHRlcmVkQWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD4gPSB0aGlzLmFpcnBvcnRzO1xuICBkaXNwbGF5QWxsQWlycG9ydHNMYWJlbCA9IHRydWU7XG4gIG9wZW5WYWx1ZTogYm9vbGVhbjtcbiAgZm9jdXNPbkdlb2xvY2F0aW9uOiBib29sZWFuO1xuICBnZW9sb2NhdGlvblN0YXRlOiBHZW9sb2NhdGlvblN0YXRlID0gbnVsbDtcblxuICBAVmlld0NoaWxkKCdhaXJwb3J0U2VsZWN0JykgaW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3Jlc3VsdHMnKSByZXN1bHRzOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc3BsYXlMYXRlc3RTZWFyY2hlcz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRpc3BsYXlDbG9zZXN0QWlycG9ydHM/OiBib29sZWFuO1xuICBASW5wdXQoKSBsYXRlc3RTZWFyY2hlczogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgQElucHV0KCkgcmVzdWx0c0xhYmVsczogUmVzdWx0c0xhYmVsc01vZGVsO1xuICBASW5wdXQoKSBhaXJwb3J0U2VsZWN0TGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgYWlycG9ydFNlbGVjdFBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFpcnBvcnRTZWxlY3RJY29uTW9kaWZpZXI6IHN0cmluZztcbiAgQElucHV0KCkgbGFiZWxPdXRzaWRlOiBib29sZWFuO1xuICBASW5wdXQoKSBrZWVwU2VsZWN0aW9uOiBib29sZWFuO1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgbmFzRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGVuYWJsZUdlb2xvY2F0aW9uPzogYm9vbGVhbjtcbiAgQElucHV0KCkgYXJpYUxhYmVsQ2xlYXI6IHN0cmluZztcbiAgQElucHV0KCkgYXJpYUxhYmVsQmFja2Ryb3A6IHN0cmluZztcbiAgQElucHV0KCkgaXNWYWxpZCA9IHRydWU7XG4gIEBJbnB1dCgpIGludmFsaWRUZXh0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5vQWlycG9ydHNBdmFpbGFibGUgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBnZXQgY2xvc2VzdEFpcnBvcnRzKCkge1xuICAgIHJldHVybiB0aGlzLmNsb3Nlc3RBaXJwb3J0c1ZhbHVlO1xuICB9XG4gIHNldCBjbG9zZXN0QWlycG9ydHMoYWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD4pIHtcbiAgICBpZiAoIWFpcnBvcnRzIHx8ICFhaXJwb3J0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3Nlc3RBaXJwb3J0c1ZhbHVlID0gYWlycG9ydHM7XG4gICAgdGhpcy5nZW9sb2NhdGlvblN0YXRlID0gR2VvbG9jYXRpb25TdGF0ZS5ncmFudGVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGFpcnBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWlycG9ydFZhbHVlO1xuICB9XG4gIHNldCBhaXJwb3J0KGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCkge1xuICAgIGlmICghYWlycG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWlycG9ydFZhbHVlID0gYWlycG9ydDtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSBhaXJwb3J0Lm5hbWU7XG4gICAgdGhpcy5maWx0ZXJlZEFpcnBvcnRzID0gdGhpcy5zZWxlY3RTZXJ2aWNlLmZpbHRlcih0aGlzLmFpcnBvcnRzLCB0aGlzLnNlbGVjdGVkTW9kZWwpO1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IG9wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMub3BlblZhbHVlO1xuICB9XG4gIHNldCBvcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMub3BlblZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLmlucHV0U2VsZWN0aW9uVGltZW91dCk7XG4gICAgdGhpcy5vcGVuVmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5pbnB1dFNlbGVjdGlvblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBnZXQgYWlycG9ydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWlycG9ydHNWYWx1ZTtcbiAgfVxuICBzZXQgYWlycG9ydHMoYWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD4pIHtcbiAgICB0aGlzLmFpcnBvcnRzVmFsdWUgPSBhaXJwb3J0cztcbiAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLnNlbGVjdFNlcnZpY2UuZmlsdGVyKHRoaXMuYWlycG9ydHMsIHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gIH1cblxuICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEFpcnBvcnRNb2RlbD4oKTtcbiAgQE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBmb2N1c09uTmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGZvY3VzT25QcmV2aW91cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHBvc2l0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHZW9sb2NhdGlvblBvc2l0aW9uPigpO1xuICBAT3V0cHV0KCkgY2xlYXJlZFNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBnZXQgc2VsZWN0ZWRNb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE1vZGVsVmFsdWU7XG4gIH1cbiAgc2V0IHNlbGVjdGVkTW9kZWwobW9kZWw6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRNb2RlbFZhbHVlID0gbW9kZWw7XG5cbiAgICBpZiAoIXRoaXMubmFzRm9ybUdyb3VwIHx8ICF0aGlzLm5hc0Zvcm1Db250cm9sTmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQodGhpcy5uYXNGb3JtQ29udHJvbE5hbWUpO1xuXG4gICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC52YWx1ZSAhPT0gbW9kZWwpIHtcbiAgICAgIGNvbnRyb2wucGF0Y2hWYWx1ZShtb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlc3VsdHNJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbmFzLWFpcnBvcnQtc2VsZWN0LWRyb3Bkb3duLXJlc3VsdHMtJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cblxuICBnZXQgbGFiZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbmFzLWFpcnBvcnQtc2VsZWN0LWRyb3Bkb3duLWxhYmVsLSR7dGhpcy5jb21wb25lbnRJZH1gO1xuICB9XG5cbiAgZ2V0IGlucHV0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZCA/IHRoaXMuaWQgOiBgbmFzLWFpcnBvcnQtc2VsZWN0LWRyb3Bkb3duLWlucHV0LSR7dGhpcy5jb21wb25lbnRJZH1gO1xuICB9XG5cbiAgZ2V0IGdlb2xvY2F0aW9uSWNvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiAmJiB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkKSB7XG4gICAgICByZXR1cm4gJ2dlb2xvY2F0aW9uLS1saWdodCc7XG4gICAgfVxuICAgIGlmICh0aGlzLmdlb2xvY2F0aW9uU3RhdGUgPT09IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkKSB7XG4gICAgICByZXR1cm4gJ2dlb2xvY2F0aW9uLS1kaXNhYmxlZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdnZW9sb2NhdGlvbic7XG4gIH1cblxuICBwcml2YXRlIGxhc3RTZWxlY3RlZE1vZGVsOiBzdHJpbmc7XG4gIHByaXZhdGUgc2VsZWN0ZWRNb2RlbFZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgaW5wdXRTZWxlY3Rpb25UaW1lb3V0OiBhbnk7XG4gIHByaXZhdGUgY2xvc2VzdEFpcnBvcnRzVmFsdWU6IEFycmF5PEFpcnBvcnRNb2RlbD47XG4gIHByaXZhdGUgY29tcG9uZW50SWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXG4gICAgcHJpdmF0ZSBzZWxlY3RTZXJ2aWNlOiBBaXJwb3J0U2VsZWN0U2VydmljZSxcbiAgICBwcml2YXRlIGFpcnBvcnRTZWxlY3REcm9wZG93blNlcnZpY2U6IEFpcnBvcnRTZWxlY3REcm9wZG93blNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnZW9sb2NhdGlvblNlcnZpY2U6IEdlb2xvY2F0aW9uU2VydmljZSkge1xuICAgIHN1cGVyKCduYXMtYWlycG9ydC1zZWxlY3QnKTtcbiAgICB0aGlzLmNvbXBvbmVudElkID0gbmV4dElkKys7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXJpYUxhYmVsQ2xlYXIpIHtcbiAgICAgIHRoaXMud2Fybk1pc3NpbmdBY2Nlc3NpYmlsdHlJbnB1dCgnYXJpYUxhYmVsQ2xlYXInKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmFyaWFMYWJlbEJhY2tkcm9wKSB7XG4gICAgICB0aGlzLndhcm5NaXNzaW5nQWNjZXNzaWJpbHR5SW5wdXQoJ2FyaWFMYWJlbEJhY2tkcm9wJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gdGhpcy5haXJwb3J0ID8gdGhpcy5haXJwb3J0Lm5hbWUgOiAnJztcblxuICAgIGlmICh0aGlzLmV4aXN0cyh0aGlzLmRpc3BsYXlDbG9zZXN0QWlycG9ydHMpKSB7XG4gICAgICB0aGlzLmdlb2xvY2F0aW9uU2VydmljZS5nZXRTdGF0ZSgpLnN1YnNjcmliZSgoc3RhdGU6IEdlb2xvY2F0aW9uU3RhdGUpID0+IHtcbiAgICAgICAgdGhpcy5nZW9sb2NhdGlvblN0YXRlID0gc3RhdGU7XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSBHZW9sb2NhdGlvblN0YXRlLmdyYW50ZWQpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRNb2RlbCkge1xuICAgICAgdGhpcy5maWx0ZXJlZEFpcnBvcnRzID0gdGhpcy5zZWxlY3RTZXJ2aWNlLmZpbHRlcih0aGlzLmFpcnBvcnRzLCB0aGlzLnNlbGVjdGVkTW9kZWwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGxheUxhdGVzdFNlYXJjaGVzID0gZmFsc2U7XG4gICAgdGhpcy5kaXNwbGF5Q2xvc2VzdEFpcnBvcnRzID0gZmFsc2U7XG4gICAgdGhpcy5kaXNwbGF5QWxsQWlycG9ydHNMYWJlbCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmZpbHRlcmVkQWlycG9ydHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzLmZpbmQoeCA9PiB4Lm5hbWUgPT09IHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG5cbiAgICBpZiAoYWlycG9ydCkge1xuICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWxsQWlycG9ydHNBaXJwb3J0SWQoYWlycG9ydENvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24tYWlycG9ydC0ke3RoaXMuY29tcG9uZW50SWR9LWFsbC1haXJwb3J0cy0ke2FpcnBvcnRDb2RlfWA7XG4gIH1cblxuICBnZXRDbG9zZXN0QWlycG9ydHNBaXJwb3J0SWQoYWlycG9ydENvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24tYWlycG9ydC0ke3RoaXMuY29tcG9uZW50SWR9LWNsb3Nlc3QtYWlycG9ydHMtJHthaXJwb3J0Q29kZX1gO1xuICB9XG5cbiAgZ2V0TGF0ZXN0U2VhcmNoZXNBaXJwb3J0SWQoYWlycG9ydENvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuYXMtYWlycG9ydC1zZWxlY3QtZHJvcGRvd24tYWlycG9ydC0ke3RoaXMuY29tcG9uZW50SWR9LWxhdGVzdC1zZWFyY2hlcy0ke2FpcnBvcnRDb2RlfWA7XG4gIH1cblxuICB1cGRhdGVDdXJyZW50UG9zaXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSA9PT0gR2VvbG9jYXRpb25TdGF0ZS5kZW5pZWRcbiAgICAgIHx8IHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSA9PT0gR2VvbG9jYXRpb25TdGF0ZS51bmtub3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5nZW9sb2NhdGlvblNlcnZpY2UuZ2V0Q3VycmVudFBvc2l0aW9uKCkuc3Vic2NyaWJlKCh4OiBHZW9sb2NhdGlvblBvc2l0aW9uKSA9PiB7XG4gICAgICB0aGlzLnBvc2l0aW9uQ2hhbmdlLmVtaXQoeCk7XG4gICAgfSwgKGVycm9yOiBHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvci5QRVJNSVNTSU9OX0RFTklFRCkge1xuICAgICAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgPSBHZW9sb2NhdGlvblN0YXRlLmRlbmllZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldE9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBvbkdlb2xvY2F0aW9uSG92ZXIoaG92ZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaG92ZXIgJiYgdGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBHZW9sb2NhdGlvblN0YXRlLmRlbmllZCkge1xuICAgICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGJsdXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMua2VlcFNlbGVjdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gdGhpcy5sYXN0U2VsZWN0ZWRNb2RlbDtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGVsID09PSB0aGlzLmxhc3RTZWxlY3RlZE1vZGVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRNb2RlbCkge1xuICAgICAgaWYgKHRoaXMuZmlsdGVyZWRBaXJwb3J0cykge1xuICAgICAgICBsZXQgYWlycG9ydCA9IHRoaXMuZmlsdGVyZWRBaXJwb3J0cy5maW5kKHggPT4geC5uYW1lID09PSB0aGlzLnNlbGVjdGVkTW9kZWwpO1xuICAgICAgICBpZiAoIWFpcnBvcnQpIHtcbiAgICAgICAgICBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoe1xuICAgICAgICBhaXJwb3J0TmFtZTogJycsXG4gICAgICAgIGNvZGU6ICcnLFxuICAgICAgICBjb3VudHJ5TmFtZTogJycsXG4gICAgICAgIGRpc3BsYXlOYW1lOiAnJyxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIG5vcm1hbGl6ZWRBaXJwb3J0TmFtZTogJydcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZpbHRlcigpOiB2b2lkIHtcbiAgICBsZXQgaXNFbXB0eSA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLm5hc0Zvcm1Hcm91cCB8fCAhdGhpcy5uYXNGb3JtQ29udHJvbE5hbWUpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZE1vZGVsKSB7XG4gICAgICAgIHRoaXMucmVzZXRGaWx0ZXIoKTtcbiAgICAgICAgaXNFbXB0eSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAwO1xuICAgICAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLnNlbGVjdFNlcnZpY2UuZmlsdGVyKHRoaXMuYWlycG9ydHMsIHRoaXMuc2VsZWN0ZWRNb2RlbCk7XG4gICAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzWzBdPy5jb2RlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lKTtcblxuICAgICAgaWYgKCFjb250cm9sIHx8ICFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMucmVzZXRGaWx0ZXIoKTtcbiAgICAgICAgaXNFbXB0eSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAwO1xuICAgICAgICB0aGlzLmZpbHRlcmVkQWlycG9ydHMgPSB0aGlzLnNlbGVjdFNlcnZpY2UuZmlsdGVyKHRoaXMuYWlycG9ydHMsIGNvbnRyb2wudmFsdWUpO1xuICAgICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9IHRoaXMuZmlsdGVyZWRBaXJwb3J0c1swXT8uY29kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRpc3BsYXlMYXRlc3RTZWFyY2hlcyA9IGlzRW1wdHk7XG4gICAgdGhpcy5kaXNwbGF5Q2xvc2VzdEFpcnBvcnRzID0gaXNFbXB0eTtcbiAgICB0aGlzLmRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsID0gaXNFbXB0eTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLmtlZXBTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGVkTW9kZWwgPSB0aGlzLmFpcnBvcnQubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSAnJztcblxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoe1xuICAgICAgbmFtZTogJycsXG4gICAgICBjb3VudHJ5TmFtZTogJycsXG4gICAgICBjb2RlOiAnJyxcbiAgICAgIGRpc3BsYXlOYW1lOiAnJyxcbiAgICAgIGFpcnBvcnROYW1lOiAnJyxcbiAgICAgIG5vcm1hbGl6ZWRBaXJwb3J0TmFtZTogJydcbiAgICB9KTtcblxuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSAtMTtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5maWx0ZXJlZEFpcnBvcnRzID0gdGhpcy5haXJwb3J0cztcblxuICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgdGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMgPSB0cnVlO1xuICAgIHRoaXMuZGlzcGxheUNsb3Nlc3RBaXJwb3J0cyA9IHRydWU7XG4gICAgdGhpcy5kaXNwbGF5QWxsQWlycG9ydHNMYWJlbCA9IHRydWU7XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQodGhpcy5vcGVuKTtcbiAgICB0aGlzLmNsZWFyZWRTZWxlY3Rpb24uZW1pdCgpO1xuICB9XG5cbiAgZm9jdXNEb3duKCk6IHZvaWQge1xuICAgIGNvbnN0IGhhc0xhdGVzdFNlYXJjaGVzID0gdGhpcy5haXJwb3J0U2VsZWN0RHJvcGRvd25TZXJ2aWNlXG4gICAgICAuaGFzTGF0ZXN0U2VhcmNoZXModGhpcy5leGlzdHModGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMpLCB0aGlzLmxhdGVzdFNlYXJjaGVzKTtcblxuICAgIGNvbnN0IGhhc0Nsb3Nlc3RBaXJwb3J0cyA9IHRoaXMuYWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZVxuICAgICAgLmhhc0Nsb3Nlc3RBaXJwb3J0cyh0aGlzLmV4aXN0cyh0aGlzLmRpc3BsYXlDbG9zZXN0QWlycG9ydHMpLCB0aGlzLmNsb3Nlc3RBaXJwb3J0cyk7XG5cbiAgICBpZiAodGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBudWxsICYmXG4gICAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZ3JhbnRlZCAmJlxuICAgICAgdGhpcy5nZW9sb2NhdGlvblN0YXRlICE9PSBHZW9sb2NhdGlvblN0YXRlLmRlbmllZCAmJlxuICAgICAgIXRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uICYmXG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPT09IC0xICYmXG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID09PSAtMSkge1xuICAgICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoaGFzTGF0ZXN0U2VhcmNoZXMgJiYgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA8IHRoaXMubGF0ZXN0U2VhcmNoZXMubGVuZ3RoIC0gMSkge1xuICAgICAgdGhpcy5mb2N1c0Rvd25MYXRlc3RTZWFyY2hlcygpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ2xvc2VzdEFpcnBvcnRzXG4gICAgICAmJiB0aGlzLmFpcnBvcnRTZWxlY3REcm9wZG93blNlcnZpY2UuaXNJbmRleEluQ2xvc2VzdEFpcnBvcnRzKHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXgsIHRoaXMuY2xvc2VzdEFpcnBvcnRzKSkge1xuICAgICAgdGhpcy5mb2N1c0Rvd25DbG9zZXN0QWlycG9ydHMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c0Rvd25BaXJwb3J0cyhoYXNDbG9zZXN0QWlycG9ydHMsIGhhc0xhdGVzdFNlYXJjaGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLmF1dG9TY3JvbGwoNjYpO1xuICB9XG5cbiAgZm9jdXNVcCgpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNMYXRlc3RTZWFyY2hlcyA9IHRoaXMuYWlycG9ydFNlbGVjdERyb3Bkb3duU2VydmljZVxuICAgICAgLmhhc0xhdGVzdFNlYXJjaGVzKHRoaXMuZXhpc3RzKHRoaXMuZGlzcGxheUxhdGVzdFNlYXJjaGVzKSwgdGhpcy5sYXRlc3RTZWFyY2hlcyk7XG5cbiAgICBjb25zdCBoYXNDbG9zZXN0QWlycG9ydHMgPSB0aGlzLmFpcnBvcnRTZWxlY3REcm9wZG93blNlcnZpY2VcbiAgICAgIC5oYXNDbG9zZXN0QWlycG9ydHModGhpcy5leGlzdHModGhpcy5kaXNwbGF5Q2xvc2VzdEFpcnBvcnRzKSwgdGhpcy5jbG9zZXN0QWlycG9ydHMpO1xuXG4gICAgY29uc3QgaGFzR2VvbG9jYXRpb24gPSB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IG51bGwgJiZcbiAgICAgIHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gR2VvbG9jYXRpb25TdGF0ZS5ncmFudGVkICYmXG4gICAgICB0aGlzLmdlb2xvY2F0aW9uU3RhdGUgIT09IEdlb2xvY2F0aW9uU3RhdGUuZGVuaWVkICYmXG4gICAgICAhdGhpcy5mb2N1c09uR2VvbG9jYXRpb247XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID4gMCkge1xuICAgICAgdGhpcy5mb2N1c1VwQWlycG9ydHMoaGFzQ2xvc2VzdEFpcnBvcnRzLCBoYXNMYXRlc3RTZWFyY2hlcyk7XG4gICAgfSBlbHNlIGlmIChoYXNDbG9zZXN0QWlycG9ydHMgJiYgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4IDw9IDAgJiYgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA+IDApIHtcbiAgICAgIHRoaXMuZm9jdXNVcENsb3Nlc3RBaXJwb3J0cyhoYXNMYXRlc3RTZWFyY2hlcyk7XG4gICAgfSBlbHNlIGlmIChoYXNMYXRlc3RTZWFyY2hlcyAmJiBoYXNDbG9zZXN0QWlycG9ydHMgJiYgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA8PSAwXG4gICAgICB8fCBoYXNMYXRlc3RTZWFyY2hlcyAmJiAhaGFzQ2xvc2VzdEFpcnBvcnRzICYmIHRoaXMuZm9jdXNlZEFpcnBvcnRJbmRleCA8PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzVXBMYXRlc3RTZWFyY2hlcygpO1xuICAgIH0gZWxzZSBpZiAoaGFzR2VvbG9jYXRpb24gJiYgaGFzTGF0ZXN0U2VhcmNoZXMgJiYgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNJbmRleCA8PSAwXG4gICAgICB8fCBoYXNHZW9sb2NhdGlvbiAmJiAhaGFzTGF0ZXN0U2VhcmNoZXMgJiYgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4IDw9IDApIHtcbiAgICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gdHJ1ZTtcbiAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ibHVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRvU2Nyb2xsKDY2KTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkKGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uICYmICF0aGlzLmFpcnBvcnQubmFtZSkge1xuICAgICAgICAgIHRoaXMuYmx1cigpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRBaXJwb3J0cykge1xuICAgICAgICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHMuZmluZCh4ID0+IHguY29kZSA9PT0gdGhpcy5mb2N1c2VkQWlycG9ydENvZGUpIHx8IHRoaXMuZmlsdGVyZWRBaXJwb3J0c1swXTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTW9kZWwgPSBhaXJwb3J0Py5uYW1lIHx8ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRQb3NpdGlvbigpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uTmV4dC5lbWl0KGV2ZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uUHJldmlvdXMuZW1pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbk5leHQuZW1pdChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgY2FzZSAnRG93bic6XG4gICAgICAgIHRoaXMuZm9jdXNEb3duKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICBjYXNlICdVcCc6XG4gICAgICAgIHRoaXMuZm9jdXNVcCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICBjYXNlICdEZWxldGUnOlxuICAgICAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRNb2RlbCA9IHRoaXMuYWlycG9ydC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMuZmlsdGVyZWRBaXJwb3J0cyA9IHRoaXMuYWlycG9ydHM7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkKGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICBpZiAodGhpcy5rZWVwU2VsZWN0aW9uICYmIGFpcnBvcnQubmFtZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGFzdFNlbGVjdGVkTW9kZWwgPSBhaXJwb3J0Lm5hbWU7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChhaXJwb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNEb3duTGF0ZXN0U2VhcmNoZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGxldCBpbmRleCA9IHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXg7XG5cbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmxhdGVzdFNlYXJjaGVzW2luZGV4XTtcblxuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNEb3duQ2xvc2VzdEFpcnBvcnRzKCk6IHZvaWQge1xuICAgIGxldCBpbmRleCA9IHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0SW5kZXg7XG5cbiAgICBpbmRleCA9IGluZGV4ICsgMTtcblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmNsb3Nlc3RBaXJwb3J0c1tpbmRleF07XG5cbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gYWlycG9ydC5jb2RlIHx8ICcnO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSA9ICcnO1xuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzRG93bkFpcnBvcnRzKGhhc0Nsb3Nlc3RBaXJwb3J0czogYm9vbGVhbiwgaGFzTGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXg7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGluZGV4ID0gaW5kZXggKyAxO1xuXG4gICAgaWYgKHRoaXMuZmlsdGVyZWRBaXJwb3J0cyAmJiBpbmRleCA+IHRoaXMuZmlsdGVyZWRBaXJwb3J0cy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcblxuICAgICAgaWYgKHRoaXMuZ2VvbG9jYXRpb25TdGF0ZSAhPT0gR2VvbG9jYXRpb25TdGF0ZS5ncmFudGVkKSB7XG4gICAgICAgIHRoaXMuZm9jdXNPbkdlb2xvY2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChoYXNMYXRlc3RTZWFyY2hlcykge1xuICAgICAgICB0aGlzLmZvY3VzRG93bkxhdGVzdFNlYXJjaGVzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2xvc2VzdEFpcnBvcnRzKSB7XG4gICAgICAgIHRoaXMuZm9jdXNEb3duQ2xvc2VzdEFpcnBvcnRzKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSBpbmRleDtcblxuICAgIGlmICh0aGlzLmZpbHRlcmVkQWlycG9ydHMpIHtcbiAgICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmZpbHRlcmVkQWlycG9ydHNbaW5kZXhdO1xuXG4gICAgICBpZiAoYWlycG9ydCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0Q29kZSA9IGFpcnBvcnQuY29kZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gYWlycG9ydC5uYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNVcEFpcnBvcnRzKGhhc0Nsb3Nlc3RBaXJwb3J0czogYm9vbGVhbiwgaGFzTGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXg7XG4gICAgdGhpcy5mb2N1c09uR2VvbG9jYXRpb24gPSBmYWxzZTtcblxuICAgIGlmIChpbmRleCAtIDEgPCAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcbiAgICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICB0aGlzLmJsdXIoKTtcblxuICAgICAgaWYgKCFoYXNDbG9zZXN0QWlycG9ydHMpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgICB9XG4gICAgICBpZiAoIWhhc0xhdGVzdFNlYXJjaGVzKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSA9ICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW5kZXggPSBpbmRleCAtIDE7XG5cbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG5cbiAgICBpZiAodGhpcy5maWx0ZXJlZEFpcnBvcnRzKSB7XG4gICAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5maWx0ZXJlZEFpcnBvcnRzW2luZGV4XTtcblxuICAgICAgaWYgKGFpcnBvcnQpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb2RlbCA9IGFpcnBvcnQubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF1dG9TY3JvbGwoZXh0cmFPZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZXN1bHRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLnJlc3VsdHMubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBmb2N1c2VkSXRlbSA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hcy1haXJwb3J0LXNlbGVjdF9fbGlzdC1pdGVtLS1mb2N1cycpO1xuXG4gICAgaWYgKGZvY3VzZWRJdGVtKSB7XG4gICAgICByZXN1bHRzLnNjcm9sbFRvKDAsIDApO1xuICAgICAgcmVzdWx0cy5zY3JvbGxUbygwLCBmb2N1c2VkSXRlbS5vZmZzZXRUb3AgKyBleHRyYU9mZnNldCAtIHJlc3VsdHMuY2xpZW50SGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzVXBMYXRlc3RTZWFyY2hlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzT25HZW9sb2NhdGlvbiA9IGZhbHNlO1xuXG4gICAgbGV0IGxhdGVzdFNlYXJjaGVzSW5kZXggPSB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4O1xuXG4gICAgaWYgKGxhdGVzdFNlYXJjaGVzSW5kZXggPCAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0FpcnBvcnRDb2RlID0gJyc7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9zZXN0QWlycG9ydEluZGV4ID0gdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleDtcbiAgICBjb25zdCBhaXJwb3J0c0luZGV4ID0gdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4O1xuXG4gICAgaWYgKGNsb3Nlc3RBaXJwb3J0SW5kZXggPCAwICYmIGFpcnBvcnRzSW5kZXggPCAwKSB7XG4gICAgICBsYXRlc3RTZWFyY2hlc0luZGV4ID0gbGF0ZXN0U2VhcmNoZXNJbmRleCAtIDE7XG5cbiAgICAgIGlmIChsYXRlc3RTZWFyY2hlc0luZGV4IDwgMCkge1xuICAgICAgICB0aGlzLmZvY3VzZWRMYXRlc3RTZWFyY2hlc0luZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSAnJztcbiAgICAgICAgdGhpcy5ibHVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhaXJwb3J0ID0gdGhpcy5sYXRlc3RTZWFyY2hlc1tsYXRlc3RTZWFyY2hlc0luZGV4XTtcblxuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzSW5kZXggPSBsYXRlc3RTZWFyY2hlc0luZGV4O1xuICAgIHRoaXMuZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleCA9IC0xO1xuICAgIHRoaXMuZm9jdXNlZEFpcnBvcnRDb2RlID0gJyc7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydEluZGV4ID0gLTE7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZChhaXJwb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNVcENsb3Nlc3RBaXJwb3J0cyhoYXNMYXRlc3RTZWFyY2hlczogYm9vbGVhbik6IHZvaWQge1xuICAgIGxldCBjbG9zZXN0QWlycG9ydEluZGV4ID0gdGhpcy5mb2N1c2VkQ2xvc2VzdEFpcnBvcnRJbmRleDtcblxuICAgIGlmICghaGFzTGF0ZXN0U2VhcmNoZXMgJiYgY2xvc2VzdEFpcnBvcnRJbmRleCA8PSAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VzdEFpcnBvcnRJbmRleCAtIDEgPCAwKSB7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gLTE7XG4gICAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb2N1c2VkQWlycG9ydEluZGV4IDwgMCkge1xuICAgICAgY2xvc2VzdEFpcnBvcnRJbmRleCA9IGNsb3Nlc3RBaXJwb3J0SW5kZXggLSAxO1xuICAgIH1cblxuICAgIGNvbnN0IGFpcnBvcnQgPSB0aGlzLmNsb3Nlc3RBaXJwb3J0c1tjbG9zZXN0QWlycG9ydEluZGV4XTtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydEluZGV4ID0gY2xvc2VzdEFpcnBvcnRJbmRleDtcbiAgICB0aGlzLmZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgdGhpcy5mb2N1c2VkQWlycG9ydENvZGUgPSAnJztcbiAgICB0aGlzLmZvY3VzZWRBaXJwb3J0SW5kZXggPSAtMTtcblxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWQoYWlycG9ydCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhbmFzRm9ybUNvbnRyb2xOYW1lOyBlbHNlIHJlYWN0aXZlRm9ybVwiPlxuICA8bGFiZWwgW2lkXT1cImxhYmVsSWRcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImFpcnBvcnRTZWxlY3RMYWJlbFwiXG4gICAgW25hc0NsYXNzXT1cImdldENsYXNzKCd3cmFwcGVyJywgW29wZW4gJiYgJ2FjdGl2ZScsIHNlbGVjdGVkTW9kZWwgJiYgJ2ZpbGxlZCcsIGV4aXN0cyhsYWJlbE91dHNpZGUpICYmICdsYWJlbC1vdXRzaWRlJ10pXCI+XG4gICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdsYWJlbCcpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWlycG9ydFNlbGVjdExhYmVsOyBlbHNlIGVtcHR5TGFiZWxcIj57e2FpcnBvcnRTZWxlY3RMYWJlbH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2VtcHR5TGFiZWw+Jm5ic3A7PC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NwYW4+XG4gICAgPGlucHV0ICNhaXJwb3J0U2VsZWN0IHR5cGU9XCJ0ZXh0XCIgcm9sZT1cImNvbWJvYm94XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJub25lXCIgW2lkXT1cImlucHV0SWRcIiBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInJlc3VsdHNJZFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnXCIgW2F0dHIuYXJpYS1vd25zXT1cInJlc3VsdHNJZFwiIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaW5wdXQnKVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwiYWlycG9ydFNlbGVjdFBsYWNlaG9sZGVyXCIgKGZvY3VzKT1cInNldE9wZW4oKVwiIChtb3VzZWRvd24pPVwic2V0T3BlbigpXCIgKGlucHV0KT1cImZpbHRlcigpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZE1vZGVsXCIgLz5cbiAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2ljb24nKVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiAqbmdJZj1cInNlbGVjdGVkTW9kZWw7IGVsc2UgaXNFbXB0eVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsQ2xlYXJcIiAoY2xpY2spPVwiY2xlYXJTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgICAgIDxuYXMtaWNvbiBbdHlwZV09XCJzZWxlY3RlZE1vZGVsID8gJ3JlbW92ZS0tc2Vjb25kYXJ5JyA6ICdyZW1vdmUnXCI+PC9uYXMtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG5nLXRlbXBsYXRlICNpc0VtcHR5PlxuICAgICAgICA8bmFzLWljb24gW3R5cGVdPVwiJ3NtYWxsJ1wiIFtpY29uXT1cImFpcnBvcnRTZWxlY3RJY29uTW9kaWZpZXJcIj48L25hcy1pY29uPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NwYW4+XG4gIDwvbGFiZWw+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjcmVhY3RpdmVGb3JtPlxuICA8bGFiZWwgW2lkXT1cImxhYmVsSWRcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImFpcnBvcnRTZWxlY3RMYWJlbFwiXG4gICAgW25hc0NsYXNzXT1cImdldENsYXNzKCd3cmFwcGVyJywgW29wZW4gJiYgJ2FjdGl2ZScsIHNlbGVjdGVkTW9kZWwgJiYgJ2ZpbGxlZCcsIGV4aXN0cyhsYWJlbE91dHNpZGUpICYmICdsYWJlbC1vdXRzaWRlJ10pXCJcbiAgICBbZm9ybUdyb3VwXT1cIm5hc0Zvcm1Hcm91cFwiPlxuICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbGFiZWwnKVwiICpuZ0lmPVwiYWlycG9ydFNlbGVjdExhYmVsXCI+e3thaXJwb3J0U2VsZWN0TGFiZWx9fTwvc3Bhbj5cbiAgICA8aW5wdXQgI2FpcnBvcnRTZWxlY3QgdHlwZT1cInRleHRcIiByb2xlPVwiY29tYm9ib3hcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBhcmlhLWF1dG9jb21wbGV0ZT1cIm5vbmVcIiBbaWRdPVwiaW5wdXRJZFwiXG4gICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInJlc3VsdHNJZFwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlbiA/ICd0cnVlJyA6ICdmYWxzZSdcIiBbYXR0ci5hcmlhLW93bnNdPVwicmVzdWx0c0lkXCJcbiAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaW5wdXQnKVwiIFtmb3JtQ29udHJvbE5hbWVdPVwibmFzRm9ybUNvbnRyb2xOYW1lXCIgW3BsYWNlaG9sZGVyXT1cImFpcnBvcnRTZWxlY3RQbGFjZWhvbGRlclwiXG4gICAgICAobW91c2Vkb3duKT1cInNldE9wZW4oKVwiIChmb2N1cyk9XCJzZXRPcGVuKClcIiAoaW5wdXQpPVwiZmlsdGVyKClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIC8+XG4gICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdpY29uJylcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCIgKm5nSWY9XCJzZWxlY3RlZE1vZGVsOyBlbHNlIGlzRW1wdHlcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbENsZWFyXCIgKGNsaWNrKT1cImNsZWFyU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICA8bmFzLWljb24gW3R5cGVdPVwic2VsZWN0ZWRNb2RlbCA/ICdyZW1vdmUtLXNlY29uZGFyeScgOiAncmVtb3ZlJ1wiPjwvbmFzLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjaXNFbXB0eT5cbiAgICAgICAgPG5hcy1pY29uIFt0eXBlXT1cIidzbWFsbCdcIiBbaWNvbl09XCJhaXJwb3J0U2VsZWN0SWNvbk1vZGlmaWVyXCI+PC9uYXMtaWNvbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9zcGFuPlxuICA8L2xhYmVsPlxuPC9uZy10ZW1wbGF0ZT5cbjxkaXYgW25hc0NsYXNzXT1cImdldENsYXNzKCdyZXN1bHRzLXdyYXBwZXInLCBleGlzdHMobGFiZWxPdXRzaWRlKSAmJiAnbGFiZWwtb3V0c2lkZScpXCIgW2lkXT1cInJlc3VsdHNJZFwiXG4gIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3BlbiA/ICd0cnVlJyA6ICdmYWxzZSdcIj5cbiAgPHVsICNyZXN1bHRzIHJvbGU9XCJsaXN0Ym94XCIgKm5nSWY9XCJvcGVuXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImxhYmVsSWRcIiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3Jlc3VsdHMnKVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleGlzdHMoZW5hYmxlR2VvbG9jYXRpb24pICYmIGdlb2xvY2F0aW9uU3RhdGUgIT09IG51bGwgJiYgZ2VvbG9jYXRpb25TdGF0ZSAhPT0gMCAmJiBpc1ZhbGlkXCI+XG4gICAgICA8bGkgcm9sZT1cIm9wdGlvblwiPlxuICAgICAgICA8bmFzLWJ1dHRvbiBsaW5rIHNlY29uZGFyeSBbZGlzYWJsZWRdPVwiZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMlwiXG4gICAgICAgICAgW2Nzc1N0eWxlXT1cInsnaGVpZ2h0JzogJzY2cHgnLCAndGV4dC1kZWNvcmF0aW9uJzogJ3VuZGVybGluZScsICdkaXNwbGF5JzogJ2ZsZXgnLCAnanVzdGlmeS1jb250ZW50JzogJ3NwYWNlLWJldHdlZW4nfVwiXG4gICAgICAgICAgW2Nzc0NsYXNzXT1cImdldENsYXNzKCdpdGVtJywgWydnZW9sb2NhdGlvbicsIGZvY3VzT25HZW9sb2NhdGlvbiAmJiBnZW9sb2NhdGlvblN0YXRlICE9PSAyICYmICdmb2N1cycsIGdlb2xvY2F0aW9uU3RhdGUgPT09IDIgJiYgJ2Rpc2FibGVkJ10pXCJcbiAgICAgICAgICBbdGFiaW5kZXhdPVwiLTFcIiAoY2xpY2tDaGFuZ2UpPVwidXBkYXRlQ3VycmVudFBvc2l0aW9uKClcIiAobW91c2VlbnRlcik9XCJvbkdlb2xvY2F0aW9uSG92ZXIodHJ1ZSlcIlxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uR2VvbG9jYXRpb25Ib3ZlcihmYWxzZSlcIj5cbiAgICAgICAgICA8bmFzLWljb24gW25hc0NsYXNzXT1cImdldENsYXNzKCdnZW9sb2NhdGlvbicsICdpY29uJylcIiBbdHlwZV09XCJnZW9sb2NhdGlvbkljb25cIj48L25hcy1pY29uPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMTsgZWxzZSBnZW9sb2NhdGlvbkRlbmllZFwiXG4gICAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2dlb2xvY2F0aW9uJywgJ2xhYmVsJylcIj57e3Jlc3VsdHNMYWJlbHM/Lmdlb2xvY2F0aW9ufX08L3NwYW4+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNnZW9sb2NhdGlvbkRlbmllZD5cbiAgICAgICAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnZ2VvbG9jYXRpb24nLCAnbGFiZWwnKVwiPnt7cmVzdWx0c0xhYmVscz8uZ2VvbG9jYXRpb25EZW5pZWR9fTwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25hcy1idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxsaSByb2xlPVwic2VwYXJhdG9yXCIgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LXNlY3Rpb24tbGFiZWwnKVwiICpuZ0lmPVwibGF0ZXN0U2VhcmNoZXM/Lmxlbmd0aCA+IDBcbiAgICAgICYmIGV4aXN0cyhkaXNwbGF5TGF0ZXN0U2VhcmNoZXMpXG4gICAgICAmJiByZXN1bHRzTGFiZWxzPy5sYXRlc3RTZWFyY2hlc1xuICAgICAgJiYgaXNWYWxpZFwiPlxuICAgICAgPHNwYW4+e3tyZXN1bHRzTGFiZWxzPy5sYXRlc3RTZWFyY2hlc319PC9zcGFuPlxuICAgIDwvbGk+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4aXN0cyhkaXNwbGF5TGF0ZXN0U2VhcmNoZXMpICYmIGlzVmFsaWRcIj5cbiAgICAgIDxsaSByb2xlPVwib3B0aW9uXCIgKm5nRm9yPVwibGV0IGFpcnBvcnQgb2YgbGF0ZXN0U2VhcmNoZXNcIiBbaWRdPVwiZ2V0TGF0ZXN0U2VhcmNoZXNBaXJwb3J0SWQoYWlycG9ydC5jb2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYWlycG9ydC5jb2RlID09PSBmb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZVwiXG4gICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnbGlzdC1pdGVtJywgYWlycG9ydC5jb2RlID09PSBmb2N1c2VkTGF0ZXN0U2VhcmNoZXNBaXJwb3J0Q29kZSAmJiAnZm9jdXMnKVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZExhdGVzdFNlYXJjaGVzQWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZChhaXJwb3J0KVwiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ25hbWUnKVwiPnt7YWlycG9ydC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb2RlJylcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb3VudHJ5JylcIj57e2FpcnBvcnQuY291bnRyeU5hbWV9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxsaSByb2xlPVwic2VwYXJhdG9yXCIgKm5nSWY9XCJleGlzdHMoZGlzcGxheUNsb3Nlc3RBaXJwb3J0cylcbiAgICAgICAmJiBnZW9sb2NhdGlvblN0YXRlICE9PSBudWxsXG4gICAgICAgJiYgZ2VvbG9jYXRpb25TdGF0ZSA9PT0gMFxuICAgICAgICYmIGNsb3Nlc3RBaXJwb3J0cz8ubGVuZ3RoID4gMFxuICAgICAgICYmIHJlc3VsdHNMYWJlbHM/LmNsb3Nlc3RBaXJwb3J0c1xuICAgICAgICYmIGlzVmFsaWRcIiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xpc3Qtc2VjdGlvbi1sYWJlbCcpXCI+XG4gICAgICA8c3Bhbj57e3Jlc3VsdHNMYWJlbHM/LmNsb3Nlc3RBaXJwb3J0c319PC9zcGFuPlxuICAgIDwvbGk+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4aXN0cyhkaXNwbGF5Q2xvc2VzdEFpcnBvcnRzKSAmJiBnZW9sb2NhdGlvblN0YXRlID09PSAwICYmIGlzVmFsaWRcIj5cbiAgICAgIDxsaSByb2xlPVwib3B0aW9uXCIgKm5nRm9yPVwibGV0IGFpcnBvcnQgb2YgY2xvc2VzdEFpcnBvcnRzXCIgW2lkXT1cImdldENsb3Nlc3RBaXJwb3J0c0FpcnBvcnRJZChhaXJwb3J0LmNvZGUpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJhaXJwb3J0LmNvZGUgPT09IGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGVcIlxuICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xpc3QtaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZENsb3Nlc3RBaXJwb3J0Q29kZSAmJiAnZm9jdXMnKVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2l0ZW0nLCBhaXJwb3J0LmNvZGUgPT09IGZvY3VzZWRDbG9zZXN0QWlycG9ydENvZGUgJiYgJ2ZvY3VzJylcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZChhaXJwb3J0KVwiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICA8c3BhbiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ25hbWUnKVwiPnt7YWlycG9ydC5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb2RlJylcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCdjb3VudHJ5JylcIj57e2FpcnBvcnQuY291bnRyeU5hbWV9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2xpPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxsaSByb2xlPVwic2VwYXJhdG9yXCIgW25hc0NsYXNzXT1cImdldENsYXNzKCdsaXN0LXNlY3Rpb24tbGFiZWwnKVwiXG4gICAgICAqbmdJZj1cImRpc3BsYXlBbGxBaXJwb3J0c0xhYmVsICYmIHJlc3VsdHNMYWJlbHM/LmFsbEFpcnBvcnRzICYmIGlzVmFsaWQgJiYgIW5vQWlycG9ydHNBdmFpbGFibGVcIj5cbiAgICAgIDxzcGFuPnt7cmVzdWx0c0xhYmVscz8uYWxsQWlycG9ydHN9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ZhbGlkXCI+XG4gICAgICA8bGkgcm9sZT1cIm9wdGlvblwiICpuZ0Zvcj1cImxldCBhaXJwb3J0IG9mIGZpbHRlcmVkQWlycG9ydHNcIiBbaWRdPVwiZ2V0QWxsQWlycG9ydHNBaXJwb3J0SWQoYWlycG9ydC5jb2RlKVwiXG4gICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiYWlycG9ydC5jb2RlID09PSBmb2N1c2VkQWlycG9ydENvZGVcIlxuICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xpc3QtaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZEFpcnBvcnRDb2RlICYmICdmb2N1cycpXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtuYXNDbGFzc109XCJnZXRDbGFzcygnaXRlbScsIGFpcnBvcnQuY29kZSA9PT0gZm9jdXNlZEFpcnBvcnRDb2RlICYmICdmb2N1cycpXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0U2VsZWN0ZWQoYWlycG9ydClcIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCduYW1lJylcIj57e2FpcnBvcnQubmFtZX19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnY29kZScpXCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnY291bnRyeScpXCI+e3thaXJwb3J0LmNvdW50cnlOYW1lfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9saT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bGkgKm5nSWY9XCIhaXNWYWxpZFwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgPHNwYW4gW25hc0NsYXNzXT1cImdldENsYXNzKCduYW1lJywgJ2ludmFsaWQnKVwiPnt7aW52YWxpZFRleHR9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICAgICA8bGkgKm5nSWY9XCJyZXN1bHRzTGFiZWxzPy5ub0FpcnBvcnRzICYmIG5vQWlycG9ydHNBdmFpbGFibGVcIiByb2xlPVwibGlzdGl0ZW1cIj5cbiAgICAgIDxzcGFuIFtuYXNDbGFzc109XCJnZXRDbGFzcygnZW1wdHktbGlzdCcpXCI+e3tyZXN1bHRzTGFiZWxzLm5vQWlycG9ydHN9fTwvc3Bhbj5cbiAgICA8L2xpPlxuICA8L3VsPlxuPC9kaXY+XG48YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIiAqbmdJZj1cIm9wZW5cIiBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbEJhY2tkcm9wXCIgW25hc0NsYXNzXT1cImdldENsYXNzKCdiYWNrZHJvcCcpXCJcbiAgKGNsaWNrKT1cImJsdXIoKVwiPjwvYnV0dG9uPiJdfQ==