@colijnit/transaction 12.1.8 → 12.1.11

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 (302) hide show
  1. package/bundles/colijnit-transaction.umd.js +6370 -3457
  2. package/bundles/colijnit-transaction.umd.js.map +1 -1
  3. package/colijnit-transaction.d.ts +84 -23
  4. package/colijnit-transaction.metadata.json +1 -1
  5. package/esm2015/colijnit-transaction.js +85 -24
  6. package/esm2015/lib/assets/dictionary/text.properties.js +118 -8
  7. package/esm2015/lib/component/checkout/checkout-overview-delivery-address/checkout-overview-delivery-address.component.js +1 -1
  8. package/esm2015/lib/component/checkout/checkout-overview-delivery-edit/checkout-overview-delivery-edit.component.js +120 -288
  9. package/esm2015/lib/component/checkout/checkout-overview-relation-edit/checkout-overview-relation-edit.component.js +279 -112
  10. package/esm2015/lib/component/checkout/checkout-relation-suggestions-list/checkout-relation-suggestions-list.component.js +2 -2
  11. package/esm2015/lib/component/checkout/checkout.component.js +64 -34
  12. package/esm2015/lib/component/checkout/checkout.module.js +11 -2
  13. package/esm2015/lib/component/confirmation-dialog/confirmation-dialog.component.js +17 -3
  14. package/esm2015/lib/component/core/base/default-ok-cancel-buttons.component.js +41 -0
  15. package/esm2015/lib/component/core/base/transaction-base.component.js +7 -9
  16. package/esm2015/lib/component/core/core.module.js +6 -3
  17. package/esm2015/lib/component/core/enum/app-popup-type.enum.js +8 -0
  18. package/esm2015/lib/component/core/relation/customer-groups.component.js +4 -3
  19. package/esm2015/lib/component/core/stock-status-indicator/stock-status-indicator.component.js +1 -1
  20. package/esm2015/lib/component/delivery-type-tile/delivery-type-tile.component.js +40 -0
  21. package/esm2015/lib/component/delivery-type-tile/delivery-type-tile.module.js +26 -0
  22. package/esm2015/lib/component/order-confirmation-grid.component/order-confirmation-grid.component.js +70 -0
  23. package/esm2015/lib/component/order-confirmation-grid.component/order-confirmation-grid.module.js +29 -0
  24. package/esm2015/lib/component/order-grid/order-grid.component.js +99 -0
  25. package/esm2015/lib/component/order-grid/order-grid.module.js +28 -0
  26. package/esm2015/lib/component/payment/payment.component.js +73 -0
  27. package/esm2015/lib/component/payment/payment.module.js +27 -0
  28. package/esm2015/lib/component/payment-tile/payment-tile.component.js +32 -0
  29. package/esm2015/lib/component/payment-tile/payment-tile.module.js +25 -0
  30. package/esm2015/lib/component/relation-address-select/relation-address-select.component.js +1 -1
  31. package/esm2015/lib/component/relation-address-tile/relation-address-tile.component.js +12 -24
  32. package/esm2015/lib/component/relation-address-tile/relation-address-tile.module.js +4 -2
  33. package/esm2015/lib/component/seller-information/seller-information.component.js +61 -0
  34. package/esm2015/lib/component/seller-information/seller-information.module.js +21 -0
  35. package/esm2015/lib/component/shared/transaction-article-text/transaction-article-text.module.js +1 -1
  36. package/esm2015/lib/component/shopping-cart-preview/shopping-cart-preview.component.js +7 -3
  37. package/esm2015/lib/component/stepper/component/stepper-step.component.js +3 -3
  38. package/esm2015/lib/component/stepper/stepper.component.js +39 -41
  39. package/esm2015/lib/component/stepper/stepper.module.js +6 -3
  40. package/esm2015/lib/component/tile/tile.component.js +32 -0
  41. package/esm2015/lib/component/tile/tile.module.js +19 -0
  42. package/esm2015/lib/component/transaction/transaction.component.js +72 -14
  43. package/esm2015/lib/component/transaction/transaction.module.js +10 -2
  44. package/esm2015/lib/component/transaction-commit-bar/transaction-commit-bar.component.js +46 -0
  45. package/esm2015/lib/component/transaction-commit-bar/transaction-commit-bar.module.js +27 -0
  46. package/esm2015/lib/component/transaction-confirmation-history/transaction-confirmation-history.component.js +28 -0
  47. package/esm2015/lib/component/transaction-confirmation-history/transaction-confirmation-history.module.js +27 -0
  48. package/esm2015/lib/component/transaction-header/transaction-header.component.js +14 -4
  49. package/esm2015/lib/component/transaction-header-delivery/transaction-header-delivery.component.js +5 -2
  50. package/esm2015/lib/component/transaction-history-grid/transaction-history-grid.component.js +47 -0
  51. package/esm2015/lib/component/transaction-history-grid/transaction-history-grid.module.js +27 -0
  52. package/esm2015/lib/component/transaction-history-grid-status/transaction-history-grid-status.component.js +36 -0
  53. package/esm2015/lib/component/transaction-history-grid-status/transaction-history-grid-status.module.js +23 -0
  54. package/esm2015/lib/component/transaction-line/transaction-line.component.js +36 -4
  55. package/esm2015/lib/component/transaction-line-fields/transaction-line-commission-code.component.js +49 -0
  56. package/esm2015/lib/component/transaction-line-fields/transaction-line-commission-code.module.js +23 -0
  57. package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-date.component.js +40 -0
  58. package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-date.module.js +23 -0
  59. package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-method.component.js +48 -0
  60. package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-method.module.js +23 -0
  61. package/esm2015/lib/component/transaction-line-fields/transaction-line-discount-amount.component.js +50 -0
  62. package/esm2015/lib/component/transaction-line-fields/transaction-line-discount-amount.module.js +23 -0
  63. package/esm2015/lib/component/transaction-line-fields/transaction-line-fields-base.component.js +22 -0
  64. package/esm2015/lib/component/transaction-line-fields/transaction-line-line-discount.component.js +50 -0
  65. package/esm2015/lib/component/transaction-line-fields/transaction-line-line-discount.module.js +23 -0
  66. package/esm2015/lib/component/transaction-line-fields/transaction-line-price-list.component.js +49 -0
  67. package/esm2015/lib/component/transaction-line-fields/transaction-line-price-list.module.js +23 -0
  68. package/esm2015/lib/component/transaction-line-fields/transaction-line-price.component.js +49 -0
  69. package/esm2015/lib/component/transaction-line-fields/transaction-line-price.module.js +23 -0
  70. package/esm2015/lib/component/transaction-line-fields/transaction-line-quantity.component.js +36 -0
  71. package/esm2015/lib/component/transaction-line-fields/transaction-line-quantity.module.js +23 -0
  72. package/esm2015/lib/component/transaction-line-fields/transaction-line-quantum-discount.component.js +50 -0
  73. package/esm2015/lib/component/transaction-line-fields/transaction-line-quantum-discount.module.js +23 -0
  74. package/esm2015/lib/component/transaction-line-fields/transaction-line-reference.component.js +48 -0
  75. package/esm2015/lib/component/transaction-line-fields/transaction-line-reference.module.js +23 -0
  76. package/esm2015/lib/component/transaction-line-fields/transaction-line-special-discount.component.js +50 -0
  77. package/esm2015/lib/component/transaction-line-fields/transaction-line-special-discount.module.js +23 -0
  78. package/esm2015/lib/component/transaction-line-fields/transaction-line-vat.component.js +49 -0
  79. package/esm2015/lib/component/transaction-line-fields/transaction-line-vat.module.js +23 -0
  80. package/esm2015/lib/component/transaction-line-fields/transaction-line-warehouse.component.js +49 -0
  81. package/esm2015/lib/component/transaction-line-fields/transaction-line-warehouse.module.js +24 -0
  82. package/esm2015/lib/component/transaction-line-side-panel/transaction-line-side-panel.component.js +91 -0
  83. package/esm2015/lib/component/transaction-line-side-panel/transaction-line-side-panel.module.js +36 -0
  84. package/esm2015/lib/component/transaction-line-side-panel-default/transaction-line-side-panel-default.component.js +134 -0
  85. package/esm2015/lib/component/transaction-line-side-panel-default/transaction-line-side-panel-default.module.js +56 -0
  86. package/esm2015/lib/component/transaction-lines/transaction-lines.component.js +14 -3
  87. package/esm2015/lib/component/transaction-lines-grid/transaction-lines-grid.component.js +16 -11
  88. package/esm2015/lib/component/transaction-lines-grid/transaction-lines-grid.module.js +4 -3
  89. package/esm2015/lib/component/transaction-nav-bar/transaction-nav-bar-button/transaction-nav-bar-button.component.js +29 -0
  90. package/esm2015/lib/component/transaction-nav-bar/transaction-nav-bar.component.js +65 -0
  91. package/esm2015/lib/component/transaction-nav-bar/transaction-nav-bar.module.js +26 -0
  92. package/esm2015/lib/component/transaction-receiving-goods-details/transaction-receiving-goods-details.component.js +39 -0
  93. package/esm2015/lib/component/transaction-receiving-goods-details/transaction-receiving-goods-details.module.js +25 -0
  94. package/esm2015/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.component.js +28 -0
  95. package/esm2015/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.module.js +27 -0
  96. package/esm2015/lib/enum/icon.enum.js +12 -1
  97. package/esm2015/lib/enum/status-type.enum.js +5 -0
  98. package/esm2015/lib/enum/tab-category.enum.js +10 -0
  99. package/esm2015/lib/model/delivery-type.js +3 -0
  100. package/esm2015/lib/model/icon-svg.js +13 -2
  101. package/esm2015/lib/pipe/date-duration.pipe.js +1 -1
  102. package/esm2015/lib/pipe/delivery-time.pipe.js +4 -1
  103. package/esm2015/lib/pipe/localize.pipe.js +1 -1
  104. package/esm2015/lib/pipe/safe-html.pipe.js +1 -1
  105. package/esm2015/lib/pipe/safe-style.pipe.js +1 -1
  106. package/esm2015/lib/service/dialog.service.js +14 -3
  107. package/esm2015/lib/service/dictionary.service.js +1 -1
  108. package/esm2015/lib/service/ione-connector-adapter.service.js +273 -15
  109. package/esm2015/lib/service/pending-reason.service.js +21 -9
  110. package/esm2015/lib/service/transaction.service.js +195 -29
  111. package/fesm2015/colijnit-transaction.js +4156 -1296
  112. package/fesm2015/colijnit-transaction.js.map +1 -1
  113. package/lib/component/checkout/checkout-overview-delivery-edit/checkout-overview-delivery-edit.component.d.ts +8 -45
  114. package/lib/component/checkout/checkout-overview-delivery-edit/style/_layout.scss +13 -6
  115. package/lib/component/checkout/checkout-overview-delivery-edit/style/material.scss +1 -2
  116. package/lib/component/checkout/checkout-overview-relation-edit/checkout-overview-relation-edit.component.d.ts +31 -3
  117. package/lib/component/checkout/checkout-overview-relation-edit/style/_layout.scss +28 -0
  118. package/lib/component/checkout/checkout-overview-relation-edit/style/_material-definition.scss +1 -0
  119. package/lib/component/checkout/checkout-overview-relation-edit/style/material.scss +4 -0
  120. package/lib/component/checkout/checkout-relation-suggestions-list/style/_layout.scss +1 -0
  121. package/lib/component/checkout/checkout.component.d.ts +10 -1
  122. package/lib/component/checkout/style/_layout.scss +25 -0
  123. package/lib/component/checkout/style/_material-definition.scss +5 -0
  124. package/lib/component/checkout/style/material.scss +2 -0
  125. package/lib/component/confirmation-dialog/confirmation-dialog.component.d.ts +4 -0
  126. package/lib/component/confirmation-dialog/style/material.scss +1 -0
  127. package/lib/component/core/base/default-ok-cancel-buttons.component.d.ts +13 -0
  128. package/lib/component/core/enum/app-popup-type.enum.d.ts +6 -0
  129. package/lib/component/core/image-display/style/_layout.scss +2 -4
  130. package/lib/component/core/relation/relation-customer-groups.component.scss +6 -0
  131. package/lib/component/delivery-type-tile/delivery-type-tile.component.d.ts +10 -0
  132. package/lib/component/delivery-type-tile/delivery-type-tile.module.d.ts +2 -0
  133. package/lib/component/delivery-type-tile/style/_layout.scss +35 -0
  134. package/lib/component/delivery-type-tile/style/_material-definition.scss +16 -0
  135. package/lib/component/delivery-type-tile/style/_theme.scss +6 -0
  136. package/lib/component/delivery-type-tile/style/material.scss +5 -0
  137. package/lib/component/order-confirmation-create/style/_layout.scss +5 -0
  138. package/lib/component/order-confirmation-create/style/_material-definition.scss +1 -0
  139. package/lib/component/order-confirmation-create/style/_theme.scss +5 -0
  140. package/lib/component/order-confirmation-create/style/material.scss +4 -0
  141. package/lib/component/order-confirmation-grid.component/order-confirmation-grid.component.d.ts +15 -0
  142. package/lib/component/order-confirmation-grid.component/order-confirmation-grid.module.d.ts +2 -0
  143. package/lib/component/order-confirmation-grid.component/style/_layout.scss +5 -0
  144. package/lib/component/order-confirmation-grid.component/style/_material-definition.scss +1 -0
  145. package/lib/component/order-confirmation-grid.component/style/_theme.scss +5 -0
  146. package/lib/component/order-confirmation-grid.component/style/material.scss +4 -0
  147. package/lib/component/order-grid/order-grid.component.d.ts +23 -0
  148. package/lib/component/order-grid/order-grid.module.d.ts +2 -0
  149. package/lib/component/order-grid/style/_layout.scss +21 -0
  150. package/lib/component/order-grid/style/_material-definition.scss +2 -0
  151. package/lib/component/order-grid/style/_theme.scss +6 -0
  152. package/lib/component/order-grid/style/material.scss +4 -0
  153. package/lib/component/payment/payment.component.d.ts +18 -0
  154. package/lib/component/payment/payment.module.d.ts +2 -0
  155. package/lib/component/payment/style/_layout.scss +54 -0
  156. package/lib/component/payment/style/_material-definition.scss +17 -0
  157. package/lib/component/payment/style/_theme.scss +16 -0
  158. package/lib/component/payment/style/material.scss +5 -0
  159. package/lib/component/payment-tile/payment-tile.component.d.ts +9 -0
  160. package/lib/component/payment-tile/payment-tile.module.d.ts +2 -0
  161. package/lib/component/payment-tile/style/_layout.scss +22 -0
  162. package/lib/component/{service-order/transaction-edit-article-text/transaction-edit-article-text.component.scss → payment-tile/style/_material-definition.scss} +0 -0
  163. package/lib/component/payment-tile/style/_theme.scss +6 -0
  164. package/lib/component/payment-tile/style/material.scss +5 -0
  165. package/lib/component/relation-address/style/_layout.scss +5 -0
  166. package/lib/component/relation-address-tile/relation-address-tile.component.d.ts +1 -0
  167. package/lib/component/relation-address-tile/style/_layout.scss +0 -21
  168. package/lib/component/relation-address-tile/style/_material-definition.scss +2 -1
  169. package/lib/component/relation-address-tile/style/_theme.scss +0 -30
  170. package/lib/component/relation-address-tile/style/material.scss +1 -0
  171. package/lib/component/seller-information/seller-information.component.d.ts +13 -0
  172. package/lib/component/seller-information/seller-information.module.d.ts +2 -0
  173. package/lib/component/seller-information/style/_layout.scss +21 -0
  174. package/lib/component/seller-information/style/_material-definition.scss +2 -0
  175. package/lib/component/seller-information/style/_theme.scss +7 -0
  176. package/lib/component/seller-information/style/material.scss +4 -0
  177. package/lib/component/shopping-cart-preview/shopping-cart-preview.component.d.ts +2 -0
  178. package/lib/component/shopping-cart-preview/style/_layout.scss +6 -2
  179. package/lib/component/shopping-cart-preview/style/_material-definition.scss +1 -1
  180. package/lib/component/stepper/component/stepper-step.component.d.ts +1 -1
  181. package/lib/component/stepper/stepper.component.d.ts +10 -5
  182. package/lib/component/stepper/style/_layout.scss +52 -20
  183. package/lib/component/stepper/style/_material-definition.scss +9 -2
  184. package/lib/component/stepper/style/_theme.scss +36 -0
  185. package/lib/component/tile/style/_layout.scss +36 -0
  186. package/lib/component/tile/style/_material-definition.scss +16 -0
  187. package/lib/component/tile/style/_theme.scss +36 -0
  188. package/lib/component/tile/style/material.scss +4 -0
  189. package/lib/component/tile/tile.component.d.ts +6 -0
  190. package/lib/component/tile/tile.module.d.ts +2 -0
  191. package/lib/component/transaction/style/_layout.scss +6 -0
  192. package/lib/component/transaction/style/material.scss +3 -0
  193. package/lib/component/transaction/transaction.component.d.ts +16 -1
  194. package/lib/component/transaction-commit-bar/style/_layout.scss +16 -0
  195. package/lib/component/transaction-commit-bar/style/_material-definition.scss +1 -0
  196. package/lib/component/transaction-commit-bar/style/_theme.scss +7 -0
  197. package/lib/component/transaction-commit-bar/style/material.scss +4 -0
  198. package/lib/component/transaction-commit-bar/transaction-commit-bar.component.d.ts +11 -0
  199. package/lib/component/transaction-commit-bar/transaction-commit-bar.module.d.ts +2 -0
  200. package/lib/component/transaction-confirmation-history/style/_layout.scss +7 -0
  201. package/lib/component/transaction-confirmation-history/style/_material-definition.scss +1 -0
  202. package/lib/component/transaction-confirmation-history/style/_theme.scss +7 -0
  203. package/lib/component/transaction-confirmation-history/style/material.scss +4 -0
  204. package/lib/component/transaction-confirmation-history/transaction-confirmation-history.component.d.ts +5 -0
  205. package/lib/component/transaction-confirmation-history/transaction-confirmation-history.module.d.ts +2 -0
  206. package/lib/component/transaction-header/transaction-header.component.d.ts +4 -1
  207. package/lib/component/transaction-history-grid/style/_layout.scss +7 -0
  208. package/lib/component/transaction-history-grid/style/_material-definition.scss +0 -0
  209. package/lib/component/transaction-history-grid/style/_theme.scss +7 -0
  210. package/lib/component/transaction-history-grid/style/material.scss +4 -0
  211. package/lib/component/transaction-history-grid/transaction-history-grid.component.d.ts +14 -0
  212. package/lib/component/transaction-history-grid/transaction-history-grid.module.d.ts +2 -0
  213. package/lib/component/transaction-history-grid-status/style/_layout.scss +28 -0
  214. package/lib/component/{service-order/transaction-sidebar/transaction-line-accordion.component.scss → transaction-history-grid-status/style/_material-definition.scss} +0 -0
  215. package/lib/component/transaction-history-grid-status/style/_theme.scss +7 -0
  216. package/lib/component/transaction-history-grid-status/style/material.scss +4 -0
  217. package/lib/component/transaction-history-grid-status/transaction-history-grid-status.component.d.ts +9 -0
  218. package/lib/component/transaction-history-grid-status/transaction-history-grid-status.module.d.ts +2 -0
  219. package/lib/component/transaction-line/style/_theme.scss +5 -0
  220. package/lib/component/transaction-line/style/material.scss +1 -0
  221. package/lib/component/transaction-line/transaction-line.component.d.ts +8 -2
  222. package/lib/component/transaction-line-fields/transaction-line-commission-code.component.d.ts +12 -0
  223. package/lib/component/transaction-line-fields/transaction-line-commission-code.module.d.ts +2 -0
  224. package/lib/component/transaction-line-fields/transaction-line-delivery-date.component.d.ts +7 -0
  225. package/lib/component/transaction-line-fields/transaction-line-delivery-date.module.d.ts +2 -0
  226. package/lib/component/transaction-line-fields/transaction-line-delivery-method.component.d.ts +12 -0
  227. package/lib/component/transaction-line-fields/transaction-line-delivery-method.module.d.ts +2 -0
  228. package/lib/component/transaction-line-fields/transaction-line-discount-amount.component.d.ts +10 -0
  229. package/lib/component/transaction-line-fields/transaction-line-discount-amount.module.d.ts +2 -0
  230. package/lib/component/transaction-line-fields/transaction-line-fields-base.component.d.ts +6 -0
  231. package/lib/component/transaction-line-fields/transaction-line-line-discount.component.d.ts +10 -0
  232. package/lib/component/transaction-line-fields/transaction-line-line-discount.module.d.ts +2 -0
  233. package/lib/component/transaction-line-fields/transaction-line-price-list.component.d.ts +12 -0
  234. package/lib/component/transaction-line-fields/transaction-line-price-list.module.d.ts +2 -0
  235. package/lib/component/transaction-line-fields/transaction-line-price.component.d.ts +10 -0
  236. package/lib/component/transaction-line-fields/transaction-line-price.module.d.ts +2 -0
  237. package/lib/component/transaction-line-fields/transaction-line-quantity.component.d.ts +7 -0
  238. package/lib/component/transaction-line-fields/transaction-line-quantity.module.d.ts +2 -0
  239. package/lib/component/transaction-line-fields/transaction-line-quantum-discount.component.d.ts +10 -0
  240. package/lib/component/transaction-line-fields/transaction-line-quantum-discount.module.d.ts +2 -0
  241. package/lib/component/transaction-line-fields/transaction-line-reference.component.d.ts +10 -0
  242. package/lib/component/transaction-line-fields/transaction-line-reference.module.d.ts +2 -0
  243. package/lib/component/transaction-line-fields/transaction-line-special-discount.component.d.ts +10 -0
  244. package/lib/component/transaction-line-fields/transaction-line-special-discount.module.d.ts +2 -0
  245. package/lib/component/transaction-line-fields/transaction-line-vat.component.d.ts +12 -0
  246. package/lib/component/transaction-line-fields/transaction-line-vat.module.d.ts +2 -0
  247. package/lib/component/transaction-line-fields/transaction-line-warehouse.component.d.ts +12 -0
  248. package/lib/component/transaction-line-fields/transaction-line-warehouse.module.d.ts +2 -0
  249. package/lib/component/transaction-line-side-panel/style/_layout.scss +64 -0
  250. package/lib/component/transaction-line-side-panel/style/_material-definition.scss +8 -0
  251. package/lib/component/transaction-line-side-panel/style/_theme.scss +9 -0
  252. package/lib/component/transaction-line-side-panel/style/material.scss +9 -0
  253. package/lib/component/transaction-line-side-panel/transaction-line-side-panel.component.d.ts +18 -0
  254. package/lib/component/transaction-line-side-panel/transaction-line-side-panel.module.d.ts +2 -0
  255. package/lib/component/transaction-line-side-panel-default/style/_layout.scss +29 -0
  256. package/lib/component/transaction-line-side-panel-default/style/_material-definition.scss +10 -0
  257. package/lib/component/transaction-line-side-panel-default/style/_theme.scss +7 -0
  258. package/lib/component/transaction-line-side-panel-default/style/material.scss +4 -0
  259. package/lib/component/transaction-line-side-panel-default/transaction-line-side-panel-default.component.d.ts +16 -0
  260. package/lib/component/transaction-line-side-panel-default/transaction-line-side-panel-default.module.d.ts +2 -0
  261. package/lib/component/transaction-lines/transaction-lines.component.d.ts +6 -0
  262. package/lib/component/transaction-lines-grid/transaction-lines-grid.component.d.ts +4 -1
  263. package/lib/component/transaction-nav-bar/style/_layout.scss +13 -0
  264. package/lib/component/transaction-nav-bar/style/_material-definition.scss +1 -0
  265. package/lib/component/transaction-nav-bar/style/_theme.scss +7 -0
  266. package/lib/component/transaction-nav-bar/style/material.scss +4 -0
  267. package/lib/component/transaction-nav-bar/transaction-nav-bar-button/transaction-nav-bar-button.component.d.ts +14 -0
  268. package/lib/component/transaction-nav-bar/transaction-nav-bar-button/transaction-nav-bar-button.component.scss +23 -0
  269. package/lib/component/transaction-nav-bar/transaction-nav-bar.component.d.ts +18 -0
  270. package/lib/component/transaction-nav-bar/transaction-nav-bar.module.d.ts +2 -0
  271. package/lib/component/transaction-receiving-goods-details/style/_layout.scss +38 -0
  272. package/lib/component/transaction-receiving-goods-details/style/_material-definition.scss +1 -0
  273. package/lib/component/transaction-receiving-goods-details/style/_theme.scss +7 -0
  274. package/lib/component/transaction-receiving-goods-details/style/material.scss +4 -0
  275. package/lib/component/transaction-receiving-goods-details/transaction-receiving-goods-details.component.d.ts +6 -0
  276. package/lib/component/transaction-receiving-goods-details/transaction-receiving-goods-details.module.d.ts +2 -0
  277. package/lib/component/transaction-receiving-goods-history/style/_layout.scss +7 -0
  278. package/lib/component/transaction-receiving-goods-history/style/_material-definition.scss +1 -0
  279. package/lib/component/transaction-receiving-goods-history/style/_theme.scss +7 -0
  280. package/lib/component/transaction-receiving-goods-history/style/material.scss +4 -0
  281. package/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.component.d.ts +5 -0
  282. package/lib/component/transaction-receiving-goods-history/transaction-receiving-goods-history.module.d.ts +2 -0
  283. package/lib/enum/icon.enum.d.ts +12 -1
  284. package/lib/enum/status-type.enum.d.ts +3 -0
  285. package/lib/enum/tab-category.enum.d.ts +8 -0
  286. package/lib/model/delivery-type.d.ts +7 -0
  287. package/lib/service/dialog.service.d.ts +1 -0
  288. package/lib/service/ione-connector-adapter.service.d.ts +27 -8
  289. package/lib/service/pending-reason.service.d.ts +3 -2
  290. package/lib/service/transaction.service.d.ts +25 -9
  291. package/lib/style/_variables.scss +10 -2
  292. package/package.json +2 -2
  293. package/lib/component/service-order/service-order.component.scss +0 -154
  294. package/lib/component/service-order/summary/transaction-delivery-summary.component.scss +0 -22
  295. package/lib/component/service-order/summary/transaction-summary-block.component.scss +0 -109
  296. package/lib/component/service-order/transaction-manager/transaction-manager.component.scss +0 -54
  297. package/lib/component/service-order/transaction-order-line-view/transaction-order-line-view.component.scss +0 -90
  298. package/lib/component/service-order/transaction-order-lines/transaction-order-lines.component.scss +0 -85
  299. package/lib/component/service-order/transaction-order-totals/transaction-order-totals.component.scss +0 -26
  300. package/lib/component/service-order/transaction-relation/transaction-relation-edit.component.scss +0 -24
  301. package/lib/component/service-order/transaction-sidebar/transaction-sidebar-right.component.scss +0 -17
  302. package/lib/component/service-order/warehouse/warehouse.component.scss +0 -54
@@ -3,17 +3,20 @@ import { Injectable } from "@angular/core";
3
3
  import { CustomerFullObject } from "@colijnit/transactionapi/build/model/customer-full-object.bo";
4
4
  import { TransactionInfoResponse } from "@colijnit/transactionapi/build/model/transaction-info-response.bo";
5
5
  import { RelationPrivacySetting } from "@colijnit/transactionapi/build/model/relation-privacy-setting.bo";
6
+ import { DeliveryMethod } from "@colijnit/transactionapi/build/model/delivery-method.bo";
6
7
  import { GetPostalCodeRetrievalOutputParams } from "@colijnit/transactionapi/build/model/get-postal-code-retrieval-output-params";
7
8
  import { RelationListObject } from "@colijnit/transactionapi/build/model/relation-list-object.bo";
8
9
  import { CoDomainValue } from "@colijnit/transactionapi/build/model/co-domain-value.bo";
9
10
  import { ArticleFullObject } from "@colijnit/transactionapi/build/model/article-full-object";
10
- import { LineOperationResponse } from "@colijnit/transactionapi/build/model/line-operation-response.bo";
11
11
  import { Transaction } from "@colijnit/transactionapi/build/transaction";
12
12
  import { BusinessObjectFactory } from "../factory/business-object-factory";
13
13
  import { ImageUtils } from "@colijnit/transactionapi/build/utils/image-utils";
14
14
  import { StandardText } from "../model/standard-text";
15
15
  import { TransactionLineInfo } from "@colijnit/transactionapi/build/model/transaction-line-info.bo";
16
16
  import { OptionsService } from "./options.service";
17
+ import { CashRegister } from "@colijnit/transactionapi/build/model/cash-register";
18
+ import { PriceList } from "@colijnit/transactionapi/build/model/price-list";
19
+ import { Vat } from "@colijnit/transactionapi/build/model/vat";
17
20
  import * as i0 from "@angular/core";
18
21
  import * as i1 from "./options.service";
19
22
  export class IOneConnectorAdapterService {
@@ -59,7 +62,7 @@ export class IOneConnectorAdapterService {
59
62
  return new Promise((resolve, reject) => {
60
63
  return this.connector.getSingleImage(nodeId, publication, includeMimetype, thumb).then((result) => {
61
64
  if (result.validationResult && result.validationResult.success) {
62
- if (result.resultObject && result.resultObject.filePath !== null && result.resultObject.filePath !== "") {
65
+ if (result.resultObject && result.resultObject.filePath !== null && result.resultObject.filePath !== undefined && result.resultObject.filePath !== "") {
63
66
  return resolve(ImageUtils.getFixedImageFilepathUrl(result.resultObject.filePath));
64
67
  }
65
68
  else {
@@ -69,8 +72,8 @@ export class IOneConnectorAdapterService {
69
72
  }
70
73
  return resolve(thumb ? result.resultObject.thumbnailBody : result.resultObject.documentBody);
71
74
  }
72
- else {
73
- reject(result.validationMessagesAsString);
75
+ else { // no image
76
+ resolve("");
74
77
  }
75
78
  }
76
79
  }
@@ -80,7 +83,7 @@ export class IOneConnectorAdapterService {
80
83
  });
81
84
  });
82
85
  }
83
- getDocumentContent(id, thumbnail) {
86
+ getDocumentContent(id, thumbnail = true) {
84
87
  return new Promise((resolve, reject) => {
85
88
  return this.connector.getDocumentContent(id, thumbnail).then((result) => {
86
89
  if (result.validationResult && result.validationResult.success) {
@@ -236,6 +239,17 @@ export class IOneConnectorAdapterService {
236
239
  });
237
240
  });
238
241
  }
242
+ getCashRegisters(branch, group) {
243
+ return __awaiter(this, void 0, void 0, function* () {
244
+ const response = yield this.connector.getCashRegister(branch, group);
245
+ if (response.validationResult && response.validationResult.success) {
246
+ return this._boFactory.makeBOArrayFromRawBackendDataArray(CashRegister, response.resultObjects);
247
+ }
248
+ else {
249
+ return [];
250
+ }
251
+ });
252
+ }
239
253
  getRelationNumber(relationId) {
240
254
  return __awaiter(this, void 0, void 0, function* () {
241
255
  return new Promise((resolve, reject) => {
@@ -250,6 +264,28 @@ export class IOneConnectorAdapterService {
250
264
  });
251
265
  });
252
266
  }
267
+ getPriceLists(code) {
268
+ return __awaiter(this, void 0, void 0, function* () {
269
+ const response = yield this.connector.getPriceLists(code);
270
+ if (response.validationResult && response.validationResult.success) {
271
+ return this._boFactory.makeBOArrayFromRawBackendDataArray(PriceList, response.resultObjects);
272
+ }
273
+ else {
274
+ return []; // todo: handle error messages in a good way
275
+ }
276
+ });
277
+ }
278
+ getVatList(onlyValid = false) {
279
+ return __awaiter(this, void 0, void 0, function* () {
280
+ const response = yield this.connector.getVatList(onlyValid);
281
+ if (response.validationResult && response.validationResult.success) {
282
+ return this._boFactory.makeBOArrayFromRawBackendDataArray(Vat, response.resultObjects);
283
+ }
284
+ else {
285
+ return []; // todo: handle error messages in a good way
286
+ }
287
+ });
288
+ }
253
289
  getSequenceValue(sequenceName) {
254
290
  return __awaiter(this, void 0, void 0, function* () {
255
291
  return new Promise((resolve, reject) => {
@@ -297,7 +333,7 @@ export class IOneConnectorAdapterService {
297
333
  return new Promise((resolve, reject) => {
298
334
  return this.connector.getDeliveryMethods().then((result) => {
299
335
  if (result.validationResult && result.validationResult.success) {
300
- resolve(result.resultObjects);
336
+ resolve(this._boFactory.makeBOArrayFromRawBackendDataArray(DeliveryMethod, result.resultObjects));
301
337
  }
302
338
  else {
303
339
  reject(result.validationMessagesAsString);
@@ -311,7 +347,7 @@ export class IOneConnectorAdapterService {
311
347
  return new Promise((resolve, reject) => {
312
348
  return this.connector.getDeliveryOptions().then((result) => {
313
349
  if (result.validationResult && result.validationResult.success) {
314
- resolve(result.resultObjects);
350
+ resolve(this._boFactory.makeBOArrayFromRawBackendDataArray(DeliveryMethod, result.resultObjects));
315
351
  }
316
352
  else {
317
353
  reject(result.validationMessagesAsString);
@@ -325,7 +361,7 @@ export class IOneConnectorAdapterService {
325
361
  return new Promise((resolve, reject) => {
326
362
  return this.connector.addRelationToTransaction(uuid, relationId).then((result) => {
327
363
  if (result.validationResult && result.validationResult.success) {
328
- resolve(result.resultObject);
364
+ resolve(this._boFactory.makeWithRawBackendData(TransactionInfoResponse, result.resultObject));
329
365
  }
330
366
  else {
331
367
  reject(result.validationMessagesAsString);
@@ -339,7 +375,7 @@ export class IOneConnectorAdapterService {
339
375
  return new Promise((resolve, reject) => {
340
376
  return this.connector.setTransactionDeliveryOptions(transactionDeliveryOptionsRequest).then((result) => {
341
377
  if (result.validationResult && result.validationResult.success) {
342
- resolve(result.resultObject);
378
+ resolve(this._boFactory.makeWithRawBackendData(TransactionInfoResponse, result.resultObject));
343
379
  }
344
380
  else {
345
381
  reject(result.validationMessagesAsString);
@@ -386,7 +422,7 @@ export class IOneConnectorAdapterService {
386
422
  return new Promise((resolve, reject) => {
387
423
  return this.connector.addTransactionLine(uuid, articleLine, articleNo, amount, warehouseNo, commissionCode, isReturn, aboveLineNr, belowLineNr).then((result) => {
388
424
  if (result.validationResult && result.validationResult.success) {
389
- resolve(this._boFactory.makeWithRawBackendData(LineOperationResponse, result.resultObject));
425
+ resolve(this._boFactory.makeWithRawBackendData(TransactionInfoResponse, result.resultObject));
390
426
  }
391
427
  else {
392
428
  reject(result.validationMessagesAsString);
@@ -400,7 +436,7 @@ export class IOneConnectorAdapterService {
400
436
  return new Promise((resolve, reject) => {
401
437
  return this.connector.addTextLineToTransaction(uuid, showOnDocuments, text, amount, articleBound, refArticleLineNr, aboveLineNr, belowLineNr).then((result) => {
402
438
  if (result.validationResult && result.validationResult.success) {
403
- resolve(this._boFactory.makeWithRawBackendData(LineOperationResponse, result.resultObject));
439
+ resolve(this._boFactory.makeWithRawBackendData(TransactionInfoResponse, result.resultObject));
404
440
  }
405
441
  else {
406
442
  reject(result.validationMessagesAsString);
@@ -412,9 +448,15 @@ export class IOneConnectorAdapterService {
412
448
  changeLineSequence(uuid, lineUuid, aboveLineNr, belowLineNr) {
413
449
  return __awaiter(this, void 0, void 0, function* () {
414
450
  return new Promise((resolve, reject) => {
415
- return this.connector.changeLineSequence(uuid, lineUuid, aboveLineNr, belowLineNr).then((result) => {
451
+ const request = {
452
+ transactionUuid: uuid,
453
+ lineUuid: lineUuid,
454
+ aboveLineNr: aboveLineNr,
455
+ belowLineNr: belowLineNr
456
+ };
457
+ return this.connector.changeLineSequence(request).then((result) => {
416
458
  if (result.validationResult && result.validationResult.success) {
417
- resolve(this._boFactory.makeWithRawBackendData(LineOperationResponse, result.resultObject));
459
+ resolve(this._boFactory.makeWithRawBackendData(TransactionInfoResponse, result.resultObject));
418
460
  }
419
461
  else {
420
462
  reject(result.validationMessagesAsString);
@@ -454,7 +496,12 @@ export class IOneConnectorAdapterService {
454
496
  changeTransactionLineQuantity(uuid, lineUuid, newQuantity) {
455
497
  return __awaiter(this, void 0, void 0, function* () {
456
498
  return new Promise((resolve, reject) => {
457
- return this.connector.changeTransactionLineQuantity(uuid, lineUuid, newQuantity).then((result) => {
499
+ const request = {
500
+ transactionUuid: uuid,
501
+ lineUuid: lineUuid,
502
+ newQuantity: newQuantity
503
+ };
504
+ return this.connector.changeTransactionLineQuantity(request).then((result) => {
458
505
  if (result.validationResult && result.validationResult.success) {
459
506
  resolve(this._boFactory.makeWithRawBackendData(TransactionInfoResponse, result.resultObject));
460
507
  }
@@ -565,6 +612,217 @@ export class IOneConnectorAdapterService {
565
612
  });
566
613
  });
567
614
  }
615
+ changeTransactionLineCommissionCode(uuid, lineUuid, code) {
616
+ return __awaiter(this, void 0, void 0, function* () {
617
+ const request = {
618
+ transactionUuid: uuid,
619
+ lineUuid: lineUuid,
620
+ newCommissionCode: code
621
+ };
622
+ const response = yield this.connector.changeTransactionLineCommissionCode(request);
623
+ if (response && response.validationResult && response.validationResult.success) {
624
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
625
+ }
626
+ else {
627
+ return Promise.reject(response.validationMessagesAsString);
628
+ }
629
+ });
630
+ }
631
+ changeTransactionLineWarehouse(uuid, lineUuid, warehouseNumber) {
632
+ return __awaiter(this, void 0, void 0, function* () {
633
+ const request = {
634
+ transactionUuid: uuid,
635
+ lineUuid: lineUuid,
636
+ newWarehouseNumber: warehouseNumber
637
+ };
638
+ const response = yield this.connector.changeTransactionLineWarehouse(request);
639
+ if (response && response.validationResult && response.validationResult.success) {
640
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
641
+ }
642
+ else {
643
+ return Promise.reject(response.validationMessagesAsString);
644
+ }
645
+ });
646
+ }
647
+ changeTransactionLinePrice(uuid, lineUuid, price) {
648
+ return __awaiter(this, void 0, void 0, function* () {
649
+ const request = {
650
+ transactionUuid: uuid,
651
+ lineUuid: lineUuid,
652
+ newPrice: price
653
+ };
654
+ const response = yield this.connector.changeTransactionLinePrice(request);
655
+ if (response && response.validationResult && response.validationResult.success) {
656
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
657
+ }
658
+ else {
659
+ return Promise.reject(response.validationMessagesAsString);
660
+ }
661
+ });
662
+ }
663
+ changeTransactionLinePriceList(uuid, lineUuid, priceList) {
664
+ return __awaiter(this, void 0, void 0, function* () {
665
+ const request = {
666
+ transactionUuid: uuid,
667
+ lineUuid: lineUuid,
668
+ newPriceListCode: priceList
669
+ };
670
+ const response = yield this.connector.changeTransactionLinePriceList(request);
671
+ if (response && response.validationResult && response.validationResult.success) {
672
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
673
+ }
674
+ else {
675
+ return Promise.reject(response.validationMessagesAsString);
676
+ }
677
+ });
678
+ }
679
+ changeTransactionLineVat(uuid, lineUuid, id) {
680
+ return __awaiter(this, void 0, void 0, function* () {
681
+ const request = {
682
+ transactionUuid: uuid,
683
+ lineUuid: lineUuid,
684
+ newVatId: id
685
+ };
686
+ const response = yield this.connector.changeTransactionLineVat(request);
687
+ if (response && response.validationResult && response.validationResult.success) {
688
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
689
+ }
690
+ else {
691
+ return Promise.reject(response.validationMessagesAsString);
692
+ }
693
+ });
694
+ }
695
+ changeTransactionLineLineDiscount(uuid, lineUuid, type, discount, reason, code) {
696
+ return __awaiter(this, void 0, void 0, function* () {
697
+ const request = {
698
+ transactionUuid: uuid,
699
+ lineUuid: lineUuid,
700
+ discountType: type,
701
+ newDiscount: discount,
702
+ newDiscountReason: reason,
703
+ newDiscountCode: code
704
+ };
705
+ const response = yield this.connector.changeTransactionLineDiscount(request);
706
+ if (response && response.validationResult && response.validationResult.success) {
707
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
708
+ }
709
+ else {
710
+ return Promise.reject(response.validationMessagesAsString);
711
+ }
712
+ });
713
+ }
714
+ changeTransactionLineDeliveryMethod(uuid, lineUuid, method) {
715
+ return __awaiter(this, void 0, void 0, function* () {
716
+ const request = {
717
+ transactionUuid: uuid,
718
+ lineUuid: lineUuid,
719
+ newDeliveryMethodCode: method
720
+ };
721
+ const response = yield this.connector.changeTransactionLineDeliveryMethod(request);
722
+ if (response && response.validationResult && response.validationResult.success) {
723
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
724
+ }
725
+ else {
726
+ return Promise.reject(response.validationMessagesAsString);
727
+ }
728
+ });
729
+ }
730
+ changeTransactionLineDeliveryDate(uuid, lineUuid, date) {
731
+ return __awaiter(this, void 0, void 0, function* () {
732
+ const request = {
733
+ transactionUuid: uuid,
734
+ lineUuid: lineUuid,
735
+ newDeliveryDate: date
736
+ };
737
+ const response = yield this.connector.changeTransactionLineDeliveryDate(request);
738
+ if (response && response.validationResult && response.validationResult.success) {
739
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
740
+ }
741
+ else {
742
+ return Promise.reject(response.validationMessagesAsString);
743
+ }
744
+ });
745
+ }
746
+ changeTransactionLineAssemblyTime(uuid, lineUuid, time) {
747
+ return __awaiter(this, void 0, void 0, function* () {
748
+ const request = {
749
+ transactionUuid: uuid,
750
+ lineUuid: lineUuid,
751
+ newAssemblyTime: time
752
+ };
753
+ const response = yield this.connector.changeTransactionLineAssemblyTime(request);
754
+ if (response && response.validationResult && response.validationResult.success) {
755
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
756
+ }
757
+ else {
758
+ return Promise.reject(response.validationMessagesAsString);
759
+ }
760
+ });
761
+ }
762
+ changeTransactionLineEditTime(uuid, lineUuid, time) {
763
+ return __awaiter(this, void 0, void 0, function* () {
764
+ const request = {
765
+ transactionUuid: uuid,
766
+ lineUuid: lineUuid,
767
+ newEditTime: time
768
+ };
769
+ const response = yield this.connector.changeTransactionLineEditTime(request);
770
+ if (response && response.validationResult && response.validationResult.success) {
771
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
772
+ }
773
+ else {
774
+ return Promise.reject(response.validationMessagesAsString);
775
+ }
776
+ });
777
+ }
778
+ changeTransactionLineSupplierArticleNumber(uuid, lineUuid, articleNumber) {
779
+ return __awaiter(this, void 0, void 0, function* () {
780
+ const request = {
781
+ transactionUuid: uuid,
782
+ lineUuid: lineUuid,
783
+ newSupplierArticleNumber: articleNumber
784
+ };
785
+ const response = yield this.connector.changeTransactionLineSupplierArticleNumber(request);
786
+ if (response && response.validationResult && response.validationResult.success) {
787
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
788
+ }
789
+ else {
790
+ return Promise.reject(response.validationMessagesAsString);
791
+ }
792
+ });
793
+ }
794
+ changeTransactionLineReference(uuid, lineUuid, reference) {
795
+ return __awaiter(this, void 0, void 0, function* () {
796
+ const request = {
797
+ transactionUuid: uuid,
798
+ lineUuid: lineUuid,
799
+ newReference: reference
800
+ };
801
+ const response = yield this.connector.changeTransactionLineReference(request);
802
+ if (response && response.validationResult && response.validationResult.success) {
803
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
804
+ }
805
+ else {
806
+ return Promise.reject(response.validationMessagesAsString);
807
+ }
808
+ });
809
+ }
810
+ changeTransactionLineCollectionCode(uuid, lineUuid, code) {
811
+ return __awaiter(this, void 0, void 0, function* () {
812
+ const request = {
813
+ transactionUuid: uuid,
814
+ lineUuid: lineUuid,
815
+ newCollectionCode: code
816
+ };
817
+ const response = yield this.connector.changeTransactionLineCollectionCode(request);
818
+ if (response && response.validationResult && response.validationResult.success) {
819
+ return this._boFactory.makeWithRawBackendData(TransactionInfoResponse, response.resultObject);
820
+ }
821
+ else {
822
+ return Promise.reject(response.validationMessagesAsString);
823
+ }
824
+ });
825
+ }
568
826
  }
569
827
  IOneConnectorAdapterService.ɵprov = i0.ɵɵdefineInjectable({ factory: function IOneConnectorAdapterService_Factory() { return new IOneConnectorAdapterService(i0.ɵɵinject(i1.OptionsService)); }, token: IOneConnectorAdapterService, providedIn: "root" });
570
828
  IOneConnectorAdapterService.decorators = [
@@ -575,4 +833,4 @@ IOneConnectorAdapterService.decorators = [
575
833
  IOneConnectorAdapterService.ctorParameters = () => [
576
834
  { type: OptionsService }
577
835
  ];
578
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uZS1jb25uZWN0b3ItYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJhbnNhY3Rpb24vc3JjL2xpYi9zZXJ2aWNlL2lvbmUtY29ubmVjdG9yLWFkYXB0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw4REFBOEQsQ0FBQztBQUNoRyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtRUFBbUUsQ0FBQztBQUkxRyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxrRUFBa0UsQ0FBQztBQUt4RyxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSw4RUFBOEUsQ0FBQztBQUNoSSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw4REFBOEQsQ0FBQztBQUloRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seURBQXlELENBQUM7QUFFdEYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDM0YsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0saUVBQWlFLENBQUM7QUFFdEcsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBRXZFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM1RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFcEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sK0RBQStELENBQUM7QUFDbEcsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDOzs7QUFLakQsTUFBTSxPQUFPLDJCQUEyQjtJQU10QyxZQUFvQixlQUErQjtR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TCxDQUFDO0tBQUE7Ozs7WUF0Z0JGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBSk8sY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7TWFya2V0aW5nfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL21hcmtldGluZy5ib1wiO1xuaW1wb3J0IHtDdXN0b21lckZ1bGxPYmplY3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvY3VzdG9tZXItZnVsbC1vYmplY3QuYm9cIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2V9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24taW5mby1yZXNwb25zZS5ib1wiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbktpbmR9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvZW51bS90cmFuc2FjdGlvbi1raW5kLmVudW1cIjtcbmltcG9ydCB7Q291bnRyeX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9jb3VudHJ5LmJvXCI7XG5pbXBvcnQge1ByaXZhY3lTZXR0aW5nfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3ByaXZhY3ktc2V0dGluZy5ib1wiO1xuaW1wb3J0IHtSZWxhdGlvblByaXZhY3lTZXR0aW5nfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3JlbGF0aW9uLXByaXZhY3ktc2V0dGluZy5ib1wiO1xuaW1wb3J0IHtTZXF1ZW5jZU5hbWV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvZW51bS9zZXF1ZW5jZS1uYW1lLmVudW1cIjtcbmltcG9ydCB7RGVsaXZlcnlNZXRob2R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZGVsaXZlcnktbWV0aG9kLmJvXCI7XG5pbXBvcnQge0RlbGl2ZXJ5T3B0aW9ufSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2RlbGl2ZXJ5LW9wdGlvbi5ib1wiO1xuaW1wb3J0IHtTZXRUcmFuc2FjdGlvbkRlbGl2ZXJ5T3B0aW9uc1JlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvc2V0LXRyYW5zYWN0aW9uLWRlbGl2ZXJ5LW9wdGlvbnMtcmVxdWVzdC5ib1wiO1xuaW1wb3J0IHtHZXRQb3N0YWxDb2RlUmV0cmlldmFsT3V0cHV0UGFyYW1zfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2dldC1wb3N0YWwtY29kZS1yZXRyaWV2YWwtb3V0cHV0LXBhcmFtc1wiO1xuaW1wb3J0IHtSZWxhdGlvbkxpc3RPYmplY3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tbGlzdC1vYmplY3QuYm9cIjtcbmltcG9ydCB7UmVsYXRpb25SZXF1ZXN0fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3JlbGF0aW9uLXJlcXVlc3RcIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25MaW5lVHlwZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3RyYW5zYWN0aW9uLWxpbmUtdHlwZS5lbnVtXCI7XG5pbXBvcnQge1Jlc29sdmVQZW5kaW5nTGluZVJlYXNvblJlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVzb2x2ZS1wZW5kaW5nLXJlYXNvbi1yZXF1ZXN0LmJvXCI7XG5pbXBvcnQge0NvRG9tYWluVmFsdWV9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvY28tZG9tYWluLXZhbHVlLmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uQXJ0aWNsZVdhcmVob3VzZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1hcnRpY2xlLXdhcmVob3VzZS5ib1wiO1xuaW1wb3J0IHtBcnRpY2xlRnVsbE9iamVjdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlLWZ1bGwtb2JqZWN0XCI7XG5pbXBvcnQge0xpbmVPcGVyYXRpb25SZXNwb25zZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9saW5lLW9wZXJhdGlvbi1yZXNwb25zZS5ib1wiO1xuaW1wb3J0IHtUcmFuc2FjdGlvblJlc3BvbnNlQmFzZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1yZXNwb25zZS1iYXNlLmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9ufSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL3RyYW5zYWN0aW9uXCI7XG5pbXBvcnQge0RhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhXCI7XG5pbXBvcnQge0J1c2luZXNzT2JqZWN0RmFjdG9yeX0gZnJvbSBcIi4uL2ZhY3RvcnkvYnVzaW5lc3Mtb2JqZWN0LWZhY3RvcnlcIjtcbmltcG9ydCB7SW1hZ2VVdGlsc30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC91dGlscy9pbWFnZS11dGlsc1wiO1xuaW1wb3J0IHtTdGFuZGFyZFRleHR9IGZyb20gXCIuLi9tb2RlbC9zdGFuZGFyZC10ZXh0XCI7XG5pbXBvcnQge0N1c3RvbWVyR3JvdXB9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvY3VzdG9tZXItZ3JvdXAuYm9cIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25MaW5lSW5mb30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1saW5lLWluZm8uYm9cIjtcbmltcG9ydCB7T3B0aW9uc1NlcnZpY2V9IGZyb20gXCIuL29wdGlvbnMuc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiXG59KVxuZXhwb3J0IGNsYXNzIElPbmVDb25uZWN0b3JBZGFwdGVyU2VydmljZSB7XG4gIHB1YmxpYyBjb25uZWN0b3I6IFRyYW5zYWN0aW9uO1xuXG4gIHByaXZhdGUgX2JvRmFjdG9yeTogQnVzaW5lc3NPYmplY3RGYWN0b3J5ID0gbmV3IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSgpO1xuICBwcml2YXRlIF9jb3VudHJ5TGlzdDogQ291bnRyeVtdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlKSB7fVxuXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY29ubmVjdG9yID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFydGljbGVGdWxsT2JqZWN0KGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxBcnRpY2xlRnVsbE9iamVjdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRBcnRpY2xlRnVsbE9iamVjdChnb29kSWQpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdE9iamVjdCkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlRnVsbE9iamVjdCwgcmVzdWx0LnJlc3VsdE9iamVjdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRHb29kSWRGcm9tQXJ0aWNsZU5yKGFydGljbGVOcjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0R29vZElkRnJvbUFydGljbGVOcihhcnRpY2xlTnIpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdC5yZXN1bHRPYmplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTaW5nbGVJbWFnZShub2RlSWQ6IG51bWJlciB8IHN0cmluZywgcHVibGljYXRpb246IG51bWJlciwgaW5jbHVkZU1pbWV0eXBlOiBib29sZWFuLCB0aHVtYjogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldFNpbmdsZUltYWdlKG5vZGVJZCwgcHVibGljYXRpb24sIGluY2x1ZGVNaW1ldHlwZSwgdGh1bWIpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdE9iamVjdCAmJiByZXN1bHQucmVzdWx0T2JqZWN0LmZpbGVQYXRoICE9PSBudWxsICYmIHJlc3VsdC5yZXN1bHRPYmplY3QuZmlsZVBhdGggIT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKEltYWdlVXRpbHMuZ2V0Rml4ZWRJbWFnZUZpbGVwYXRoVXJsKHJlc3VsdC5yZXN1bHRPYmplY3QuZmlsZVBhdGgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHRPYmplY3QpIHtcbiAgICAgICAgICAgICAgaWYgKGluY2x1ZGVNaW1ldHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKEltYWdlVXRpbHMuZ2V0RG9jQm9keVdpdGhNaW1lVHlwZURlZmluaXRpb24ocmVzdWx0LnJlc3VsdE9iamVjdC5maWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgIHRodW1iID8gcmVzdWx0LnJlc3VsdE9iamVjdC50aHVtYm5haWxCb2R5IDogcmVzdWx0LnJlc3VsdE9iamVjdC5kb2N1bWVudEJvZHkpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0aHVtYiA/IHJlc3VsdC5yZXN1bHRPYmplY3QudGh1bWJuYWlsQm9keSA6IHJlc3VsdC5yZXN1bHRPYmplY3QuZG9jdW1lbnRCb2R5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERvY3VtZW50Q29udGVudChpZDogbnVtYmVyLCB0aHVtYm5haWw6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXREb2N1bWVudENvbnRlbnQoaWQsIHRodW1ibmFpbCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0LnJlc3VsdE9iamVjdC5kb2N1bWVudENvbnRlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb3VudHJpZXMoKTogUHJvbWlzZTxDb3VudHJ5W10+IHtcbiAgICBpZiAodGhpcy5fY291bnRyeUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbikgPT4ge1xuICAgICAgICByZXNvbHZlKHRoaXMuX2NvdW50cnlMaXN0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRDb3VudHJpZXMoKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5fY291bnRyeUxpc3QgPSByZXN1bHQucmVzdWx0T2JqZWN0cztcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdC5yZXN1bHRPYmplY3RzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q3VzdG9tZXJHcm91cHMoKTogUHJvbWlzZTxDdXN0b21lckdyb3VwW10+IHtcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRDdXN0b21lckdyb3VwcygpO1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdE9iamVjdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q291bnRyeShjb3VudHJ5Q29kZTogc3RyaW5nKTogQ291bnRyeSB7XG4gICAgdGhpcy5nZXRDb3VudHJpZXMoKTtcbiAgICByZXR1cm4gdGhpcy5fY291bnRyeUxpc3QuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PT0gY291bnRyeUNvZGUpO1xuICB9XG5cbiAgcHVibGljIGdldFByaXZhY3lTZXR0aW5ncygpOiBQcm9taXNlPFByaXZhY3lTZXR0aW5nW10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0UHJpdmFjeVNldHRpbmdzKCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUoPFByaXZhY3lTZXR0aW5nW10+cmVzdWx0LnJlc3VsdE9iamVjdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRSZWxhdGlvblByaXZhY3lTZXR0aW5ncygpOiBQcm9taXNlPFJlbGF0aW9uUHJpdmFjeVNldHRpbmdbXT4ge1xuICAgIGNvbnN0IHByaXZhY3lTZXR0aW5nczogUmVsYXRpb25Qcml2YWN5U2V0dGluZ1tdID0gW107XG5cbiAgICBjb25zdCBiYXNlUHJpdmFjeVNldHRpbmdzOiBQcml2YWN5U2V0dGluZ1tdID0gYXdhaXQgdGhpcy5nZXRQcml2YWN5U2V0dGluZ3MoKTtcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwLCBsZW46IG51bWJlciA9IGJhc2VQcml2YWN5U2V0dGluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGJhc2VQcml2U2V0dGluZzogUHJpdmFjeVNldHRpbmcgPSBiYXNlUHJpdmFjeVNldHRpbmdzW2ldO1xuICAgICAgY29uc3QgbmV3UmVsUHJpdlNldDogUmVsYXRpb25Qcml2YWN5U2V0dGluZyA9IDxSZWxhdGlvblByaXZhY3lTZXR0aW5nPjx1bmtub3duPnRoaXMuX2JvRmFjdG9yeS5pbnN0YW50aWF0ZU5ld0JvKFJlbGF0aW9uUHJpdmFjeVNldHRpbmcpO1xuICAgICAgbmV3UmVsUHJpdlNldC5hcHBseUJhc2VQcml2YWN5U2V0dGluZ1ZhbHVlcyhiYXNlUHJpdlNldHRpbmcpO1xuICAgICAgcHJpdmFjeVNldHRpbmdzLnB1c2gobmV3UmVsUHJpdlNldCk7XG4gICAgfVxuICAgIHJldHVybiBwcml2YWN5U2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya2V0aW5nQ29kZXMoKTogUHJvbWlzZTxNYXJrZXRpbmdbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRNYXJrZXRpbmdDb2RlcygpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKDxDb0RvbWFpblZhbHVlW10+cmVzdWx0LnJlc3VsdE9iamVjdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVUcmFuc2FjdGlvbihraW5kOiBUcmFuc2FjdGlvbktpbmQsIGJyYW5jaE5yOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmNyZWF0ZVRyYW5zYWN0aW9uKGtpbmQsIGJyYW5jaE5yKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShUcmFuc2FjdGlvbkluZm9SZXNwb25zZSwgcmVzdWx0LnJlc3VsdE9iamVjdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlQm91bmRUZXh0TGluZXNPZkFydGljbGVMaW5lKGFydGljbGVMaW5lVXVpZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbkxpbmVJbmZvW10+IHtcbiAgICBjb25zdCByZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0QXJ0aWNsZUJvdW5kVGV4dExpbmVzT2ZBcnRpY2xlTGluZShhcnRpY2xlTGluZVV1aWQpO1xuICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gPFRyYW5zYWN0aW9uTGluZUluZm9bXT48dW5rbm93bj50aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShUcmFuc2FjdGlvbkxpbmVJbmZvLCByZXN1bHQucmVzdWx0T2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkJ5TnJBbmRLaW5kKGtpbmQ6IFRyYW5zYWN0aW9uS2luZCwgdHJhbnNhY3Rpb25ObzogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRUcmFuc2FjdGlvbkJ5TnJBbmRLaW5kKGtpbmQsIHRyYW5zYWN0aW9uTm8pLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFRyYW5zYWN0aW9uQnlJZCh0cmFuc2FjdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldFRyYW5zYWN0aW9uQnlJZCh0cmFuc2FjdGlvbklkKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShUcmFuc2FjdGlvbkluZm9SZXNwb25zZSwgcmVzdWx0LnJlc3VsdE9iamVjdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjb21taXQoKTogUHJvbWlzZTxEYXRhU2VydmljZVJlc3BvbnNlRGF0YT4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5jb21taXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlVHJhbnNhY3Rpb24odXVpZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5zYXZlVHJhbnNhY3Rpb24odXVpZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tZXJGdWxsT2JqZWN0KHJlbGF0aW9uTm86IG51bWJlcik6IFByb21pc2U8Q3VzdG9tZXJGdWxsT2JqZWN0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldEN1c3RvbWVyRnVsbE9iamVjdChyZWxhdGlvbk5vKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShDdXN0b21lckZ1bGxPYmplY3QsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRpb25OdW1iZXIocmVsYXRpb25JZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0UmVsYXRpb25OdW1iZXIocmVsYXRpb25JZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0LnJlc3VsdE9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNlcXVlbmNlVmFsdWUoc2VxdWVuY2VOYW1lOiBTZXF1ZW5jZU5hbWUpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRTZXF1ZW5jZVZhbHVlKHNlcXVlbmNlTmFtZSkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0LnJlc3VsdE9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGluc2VydEN1c3RvbWVyKHJlbGF0aW9uOiBDdXN0b21lckZ1bGxPYmplY3QpOiBQcm9taXNlPEN1c3RvbWVyRnVsbE9iamVjdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5pbnNlcnRDdXN0b21lcihyZWxhdGlvbikudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQ3VzdG9tZXJGdWxsT2JqZWN0LCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHVwZGF0ZUN1c3RvbWVyKHJlbGF0aW9uOiBDdXN0b21lckZ1bGxPYmplY3QpOiBQcm9taXNlPEN1c3RvbWVyRnVsbE9iamVjdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci51cGRhdGVDdXN0b21lcihyZWxhdGlvbikudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQ3VzdG9tZXJGdWxsT2JqZWN0LCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERlbGl2ZXJ5TWV0aG9kcygpOiBQcm9taXNlPERlbGl2ZXJ5TWV0aG9kW10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0RGVsaXZlcnlNZXRob2RzKCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUoPERlbGl2ZXJ5TWV0aG9kW10+cmVzdWx0LnJlc3VsdE9iamVjdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZWxpdmVyeU9wdGlvbnMoKTogUHJvbWlzZTxEZWxpdmVyeU9wdGlvbltdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldERlbGl2ZXJ5T3B0aW9ucygpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKDxEZWxpdmVyeU1ldGhvZFtdPnJlc3VsdC5yZXN1bHRPYmplY3RzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkUmVsYXRpb25Ub1RyYW5zYWN0aW9uKHV1aWQ6IHN0cmluZywgcmVsYXRpb25JZDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5hZGRSZWxhdGlvblRvVHJhbnNhY3Rpb24odXVpZCwgcmVsYXRpb25JZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0LnJlc3VsdE9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldFRyYW5zYWN0aW9uRGVsaXZlcnlPcHRpb25zKHRyYW5zYWN0aW9uRGVsaXZlcnlPcHRpb25zUmVxdWVzdDogU2V0VHJhbnNhY3Rpb25EZWxpdmVyeU9wdGlvbnNSZXF1ZXN0KTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3BvbnNlQmFzZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5zZXRUcmFuc2FjdGlvbkRlbGl2ZXJ5T3B0aW9ucyh0cmFuc2FjdGlvbkRlbGl2ZXJ5T3B0aW9uc1JlcXVlc3QpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdC5yZXN1bHRPYmplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRQb3N0YWxDb2RlUmV0cmlldmFsKHBvc3RjYWxDb2RlOiBzdHJpbmcsIGhvdXNlTm86IHN0cmluZyk6IFByb21pc2U8R2V0UG9zdGFsQ29kZVJldHJpZXZhbE91dHB1dFBhcmFtcz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRQb3N0YWxDb2RlUmV0cmlldmFsKHBvc3RjYWxDb2RlLCBob3VzZU5vKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0UGFyYW1zOiBHZXRQb3N0YWxDb2RlUmV0cmlldmFsT3V0cHV0UGFyYW1zID0gbmV3IEdldFBvc3RhbENvZGVSZXRyaWV2YWxPdXRwdXRQYXJhbXMoKTtcbiAgICAgICAgICBvdXRwdXRQYXJhbXMuY2l0eSA9IHJlc3VsdC5yZXN1bHRPYmplY3QuY2l0eTtcbiAgICAgICAgICBvdXRwdXRQYXJhbXMuc3RyZWV0ID0gcmVzdWx0LnJlc3VsdE9iamVjdC5zdHJlZXQ7XG4gICAgICAgICAgb3V0cHV0UGFyYW1zLnN0YXR1cyA9IHJlc3VsdC5yZXN1bHRPYmplY3Quc3RhdHVzO1xuICAgICAgICAgIG91dHB1dFBhcmFtcy5uZXROdW1iZXIgPSByZXN1bHQucmVzdWx0T2JqZWN0Lm5ldE51bWJlcjtcbiAgICAgICAgICByZXNvbHZlKG91dHB1dFBhcmFtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFJlbGF0aW9uTGlzdE9iamVjdHMocmVsYXRpb25SZXF1ZXN0OiBSZWxhdGlvblJlcXVlc3QpOiBQcm9taXNlPFJlbGF0aW9uTGlzdE9iamVjdFtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldFJlbGF0aW9uTGlzdE9iamVjdHMocmVsYXRpb25SZXF1ZXN0KS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShSZWxhdGlvbkxpc3RPYmplY3QsIHJlc3VsdC5yZXN1bHRPYmplY3RzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFRyYW5zYWN0aW9uTGluZShcbiAgICB1dWlkOiBzdHJpbmcsXG4gICAgYXJ0aWNsZUxpbmU6IFRyYW5zYWN0aW9uTGluZVR5cGUsXG4gICAgYXJ0aWNsZU5vOiBzdHJpbmcsXG4gICAgYW1vdW50OiBudW1iZXIsXG4gICAgd2FyZWhvdXNlTm86IG51bWJlcixcbiAgICBjb21taXNzaW9uQ29kZTogc3RyaW5nLFxuICAgIGlzUmV0dXJuOiBib29sZWFuLFxuICAgIGFib3ZlTGluZU5yOiBudW1iZXIsXG4gICAgYmVsb3dMaW5lTnI6IG51bWJlclxuICApOlxuICAgIFByb21pc2U8TGluZU9wZXJhdGlvblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmFkZFRyYW5zYWN0aW9uTGluZSh1dWlkLCBhcnRpY2xlTGluZSwgYXJ0aWNsZU5vLCBhbW91bnQsIHdhcmVob3VzZU5vLCBjb21taXNzaW9uQ29kZSwgaXNSZXR1cm4sIGFib3ZlTGluZU5yLCBiZWxvd0xpbmVOcikudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoTGluZU9wZXJhdGlvblJlc3BvbnNlLCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFkZFRleHRMaW5lVG9UcmFuc2FjdGlvbih1dWlkOiBzdHJpbmcsIHNob3dPbkRvY3VtZW50czogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGFtb3VudDogbnVtYmVyLCBhcnRpY2xlQm91bmQ6IGJvb2xlYW4sIHJlZkFydGljbGVMaW5lTnI6IG51bWJlciwgYWJvdmVMaW5lTnI/OiBudW1iZXIsIGJlbG93TGluZU5yPzogbnVtYmVyKTpcbiAgICBQcm9taXNlPExpbmVPcGVyYXRpb25SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5hZGRUZXh0TGluZVRvVHJhbnNhY3Rpb24odXVpZCwgc2hvd09uRG9jdW1lbnRzLCB0ZXh0LCBhbW91bnQsIGFydGljbGVCb3VuZCwgcmVmQXJ0aWNsZUxpbmVOciwgYWJvdmVMaW5lTnIsIGJlbG93TGluZU5yKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShMaW5lT3BlcmF0aW9uUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2hhbmdlTGluZVNlcXVlbmNlKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgYWJvdmVMaW5lTnI/OiBudW1iZXIsIGJlbG93TGluZU5yPzogbnVtYmVyKTpcbiAgICBQcm9taXNlPExpbmVPcGVyYXRpb25SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5jaGFuZ2VMaW5lU2VxdWVuY2UodXVpZCwgbGluZVV1aWQsIGFib3ZlTGluZU5yLCBiZWxvd0xpbmVOcikudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoTGluZU9wZXJhdGlvblJlc3BvbnNlLCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNhbmNlbEFkZFRyYW5zYWN0aW9uTGluZShsaW5lVXVpZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5jYW5jZWxBZGRUcmFuc2FjdGlvbkxpbmUobGluZVV1aWQpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVHJhbnNhY3Rpb25MaW5lKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZGVsZXRlVHJhbnNhY3Rpb25MaW5lKHV1aWQsIGxpbmVVdWlkKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShUcmFuc2FjdGlvbkluZm9SZXNwb25zZSwgcmVzdWx0LnJlc3VsdE9iamVjdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZVF1YW50aXR5KHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgbmV3UXVhbnRpdHk6IG51bWJlcik6IFByb21pc2U8TGluZU9wZXJhdGlvblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZVF1YW50aXR5KHV1aWQsIGxpbmVVdWlkLCBuZXdRdWFudGl0eSkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uKHBlbmRpbmdMaW5lVmFsdWVzOiBSZXNvbHZlUGVuZGluZ0xpbmVSZWFzb25SZXF1ZXN0KTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24ocGVuZGluZ0xpbmVWYWx1ZXMpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENvbW1pc3Npb25Db2RlcyhsYW5ndWFnZUNvZGU6IHN0cmluZyk6IFByb21pc2U8Q29Eb21haW5WYWx1ZVtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldENvbW1pc3Npb25Db2RlcyhsYW5ndWFnZUNvZGUpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKDxDb0RvbWFpblZhbHVlW10+cmVzdWx0LnJlc3VsdE9iamVjdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEluT3V0Q29sbGVjdGlvbihsYW5ndWFnZUNvZGU6IHN0cmluZyk6IFByb21pc2U8Q29Eb21haW5WYWx1ZVtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldEluT3V0Q29sbGVjdGlvbihsYW5ndWFnZUNvZGUpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKDxDb0RvbWFpblZhbHVlW10+cmVzdWx0LnJlc3VsdE9iamVjdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzKGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzKGdvb2RJZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUoPFRyYW5zYWN0aW9uQXJ0aWNsZVdhcmVob3VzZVtdPnJlc3VsdC5yZXN1bHRPYmplY3RzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0UmVsYXRpb25CeVVzZXIodXVpZDogc3RyaW5nLCB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnNldFJlbGF0aW9uQnlVc2VyKHV1aWQsIHVzZXJuYW1lLCBwYXNzd29yZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFRleHRUeXBlcyhsYW5ndWFnZUNvZGU6IHN0cmluZyk6IFByb21pc2U8Q29Eb21haW5WYWx1ZVtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldFRleHRUeXBlcyhsYW5ndWFnZUNvZGUpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0czogQ29Eb21haW5WYWx1ZVtdID0gPENvRG9tYWluVmFsdWVbXT48dW5rbm93bj50aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShDb0RvbWFpblZhbHVlLCByZXN1bHQucmVzdWx0T2JqZWN0cyk7XG4gICAgICAgICAgdGV4dHMuc29ydCgoYSwgYikgPT4gYS5zZXF1ZW5jZSA+IGIuc2VxdWVuY2UgPyAxIDogLTEpO1xuICAgICAgICAgIHJlc29sdmUodGV4dHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTdGFuZGFyZFRleHRzKGxhbmd1YWdlQ29kZTogc3RyaW5nKTogUHJvbWlzZTxTdGFuZGFyZFRleHRbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRTdGFuZGFyZFRleHRzKGxhbmd1YWdlQ29kZSkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoU3RhbmRhcmRUZXh0LCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
836
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9uZS1jb25uZWN0b3ItYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJhbnNhY3Rpb24vc3JjL2xpYi9zZXJ2aWNlL2lvbmUtY29ubmVjdG9yLWFkYXB0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw4REFBOEQsQ0FBQztBQUNoRyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtRUFBbUUsQ0FBQztBQUkxRyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxrRUFBa0UsQ0FBQztBQUV4RyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0seURBQXlELENBQUM7QUFHdkYsT0FBTyxFQUFDLGtDQUFrQyxFQUFDLE1BQU0sOEVBQThFLENBQUM7QUFDaEksT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sOERBQThELENBQUM7QUFHaEcsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHlEQUF5RCxDQUFDO0FBRXRGLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBRzNGLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUV2RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sa0RBQWtELENBQUM7QUFDNUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtEQUErRCxDQUFDO0FBQ2xHLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0RBQW9ELENBQUM7QUFH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LEVBQUUsSUFBSTtnQkFDckIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLGlCQUFpQixFQUFFLElBQUk7YUFDeEIsQ0FBQztZQUNGLE1BQU0sUUFBUSxHQUE0QixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsbUNBQW1DLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUcsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQzlFLE9BQXlDLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2pJO2lCQUFNO2dCQUNMLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQzthQUM1RDtRQUNILENBQUM7S0FBQTs7OztZQXJ1QkYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUFWTyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtNYXJrZXRpbmd9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvbWFya2V0aW5nLmJvXCI7XG5pbXBvcnQge0N1c3RvbWVyRnVsbE9iamVjdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9jdXN0b21lci1mdWxsLW9iamVjdC5ib1wiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbkluZm9SZXNwb25zZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1pbmZvLXJlc3BvbnNlLmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uS2luZH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3RyYW5zYWN0aW9uLWtpbmQuZW51bVwiO1xuaW1wb3J0IHtDb3VudHJ5fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2NvdW50cnkuYm9cIjtcbmltcG9ydCB7UHJpdmFjeVNldHRpbmd9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcHJpdmFjeS1zZXR0aW5nLmJvXCI7XG5pbXBvcnQge1JlbGF0aW9uUHJpdmFjeVNldHRpbmd9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tcHJpdmFjeS1zZXR0aW5nLmJvXCI7XG5pbXBvcnQge1NlcXVlbmNlTmFtZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3NlcXVlbmNlLW5hbWUuZW51bVwiO1xuaW1wb3J0IHtEZWxpdmVyeU1ldGhvZH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9kZWxpdmVyeS1tZXRob2QuYm9cIjtcbmltcG9ydCB7RGVsaXZlcnlPcHRpb259IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZGVsaXZlcnktb3B0aW9uLmJvXCI7XG5pbXBvcnQge1NldFRyYW5zYWN0aW9uRGVsaXZlcnlPcHRpb25zUmVxdWVzdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9zZXQtdHJhbnNhY3Rpb24tZGVsaXZlcnktb3B0aW9ucy1yZXF1ZXN0LmJvXCI7XG5pbXBvcnQge0dldFBvc3RhbENvZGVSZXRyaWV2YWxPdXRwdXRQYXJhbXN9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZ2V0LXBvc3RhbC1jb2RlLXJldHJpZXZhbC1vdXRwdXQtcGFyYW1zXCI7XG5pbXBvcnQge1JlbGF0aW9uTGlzdE9iamVjdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9yZWxhdGlvbi1saXN0LW9iamVjdC5ib1wiO1xuaW1wb3J0IHtSZWxhdGlvblJlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tcmVxdWVzdFwiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbkxpbmVUeXBlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL2VudW0vdHJhbnNhY3Rpb24tbGluZS10eXBlLmVudW1cIjtcbmltcG9ydCB7Q29Eb21haW5WYWx1ZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9jby1kb21haW4tdmFsdWUuYm9cIjtcbmltcG9ydCB7VHJhbnNhY3Rpb25BcnRpY2xlV2FyZWhvdXNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWFydGljbGUtd2FyZWhvdXNlLmJvXCI7XG5pbXBvcnQge0FydGljbGVGdWxsT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2FydGljbGUtZnVsbC1vYmplY3RcIjtcbmltcG9ydCB7TGluZU9wZXJhdGlvblJlc3BvbnNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2xpbmUtb3BlcmF0aW9uLXJlc3BvbnNlLmJvXCI7XG5pbXBvcnQge1RyYW5zYWN0aW9uUmVzcG9uc2VCYXNlfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLXJlc3BvbnNlLWJhc2UuYm9cIjtcbmltcG9ydCB7VHJhbnNhY3Rpb259IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvdHJhbnNhY3Rpb25cIjtcbmltcG9ydCB7RGF0YVNlcnZpY2VSZXNwb25zZURhdGF9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZGF0YS1zZXJ2aWNlLXJlc3BvbnNlLWRhdGFcIjtcbmltcG9ydCB7QnVzaW5lc3NPYmplY3RGYWN0b3J5fSBmcm9tIFwiLi4vZmFjdG9yeS9idXNpbmVzcy1vYmplY3QtZmFjdG9yeVwiO1xuaW1wb3J0IHtJbWFnZVV0aWxzfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL3V0aWxzL2ltYWdlLXV0aWxzXCI7XG5pbXBvcnQge1N0YW5kYXJkVGV4dH0gZnJvbSBcIi4uL21vZGVsL3N0YW5kYXJkLXRleHRcIjtcbmltcG9ydCB7Q3VzdG9tZXJHcm91cH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9jdXN0b21lci1ncm91cC5ib1wiO1xuaW1wb3J0IHtUcmFuc2FjdGlvbkxpbmVJbmZvfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWxpbmUtaW5mby5ib1wiO1xuaW1wb3J0IHtPcHRpb25zU2VydmljZX0gZnJvbSBcIi4vb3B0aW9ucy5zZXJ2aWNlXCI7XG5pbXBvcnQge0Nhc2hSZWdpc3Rlcn0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9jYXNoLXJlZ2lzdGVyXCI7XG5pbXBvcnQge0NoYW5nZUxpbmVTZXF1ZW5jZVJlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvY2hhbmdlLWxpbmUtc2VxdWVuY2UtcmVxdWVzdFwiO1xuaW1wb3J0IHtSZXNvbHZlTGluZVBlbmRpbmdSZWFzb25SZXF1ZXN0fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3Jlc29sdmUtcGVuZGluZy1yZWFzb24tcmVxdWVzdC5ib1wiO1xuaW1wb3J0IHtQcmljZUxpc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcHJpY2UtbGlzdFwiO1xuaW1wb3J0IHtWYXR9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdmF0XCI7XG5pbXBvcnQge0Rpc2NvdW50VHlwZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL2Rpc2NvdW50LXR5cGUuZW51bVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46IFwicm9vdFwiXG59KVxuZXhwb3J0IGNsYXNzIElPbmVDb25uZWN0b3JBZGFwdGVyU2VydmljZSB7XG4gIHB1YmxpYyBjb25uZWN0b3I6IFRyYW5zYWN0aW9uO1xuXG4gIHByaXZhdGUgX2JvRmFjdG9yeTogQnVzaW5lc3NPYmplY3RGYWN0b3J5ID0gbmV3IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSgpO1xuICBwcml2YXRlIF9jb3VudHJ5TGlzdDogQ291bnRyeVtdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlKSB7fVxuXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY29ubmVjdG9yID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFydGljbGVGdWxsT2JqZWN0KGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxBcnRpY2xlRnVsbE9iamVjdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRBcnRpY2xlRnVsbE9iamVjdChnb29kSWQpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdE9iamVjdCkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlRnVsbE9iamVjdCwgcmVzdWx0LnJlc3VsdE9iamVjdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRHb29kSWRGcm9tQXJ0aWNsZU5yKGFydGljbGVOcjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0R29vZElkRnJvbUFydGljbGVOcihhcnRpY2xlTnIpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdC5yZXN1bHRPYmplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTaW5nbGVJbWFnZShub2RlSWQ6IG51bWJlciB8IHN0cmluZywgcHVibGljYXRpb246IG51bWJlciwgaW5jbHVkZU1pbWV0eXBlOiBib29sZWFuLCB0aHVtYjogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldFNpbmdsZUltYWdlKG5vZGVJZCwgcHVibGljYXRpb24sIGluY2x1ZGVNaW1ldHlwZSwgdGh1bWIpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdE9iamVjdCAmJiByZXN1bHQucmVzdWx0T2JqZWN0LmZpbGVQYXRoICE9PSBudWxsICYmIHJlc3VsdC5yZXN1bHRPYmplY3QuZmlsZVBhdGggIT09IHVuZGVmaW5lZCAmJiByZXN1bHQucmVzdWx0T2JqZWN0LmZpbGVQYXRoICE9PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShJbWFnZVV0aWxzLmdldEZpeGVkSW1hZ2VGaWxlcGF0aFVybChyZXN1bHQucmVzdWx0T2JqZWN0LmZpbGVQYXRoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0T2JqZWN0KSB7XG4gICAgICAgICAgICAgIGlmIChpbmNsdWRlTWltZXR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShJbWFnZVV0aWxzLmdldERvY0JvZHlXaXRoTWltZVR5cGVEZWZpbml0aW9uKHJlc3VsdC5yZXN1bHRPYmplY3QuZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICB0aHVtYiA/IHJlc3VsdC5yZXN1bHRPYmplY3QudGh1bWJuYWlsQm9keSA6IHJlc3VsdC5yZXN1bHRPYmplY3QuZG9jdW1lbnRCb2R5KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUodGh1bWIgPyByZXN1bHQucmVzdWx0T2JqZWN0LnRodW1ibmFpbEJvZHkgOiByZXN1bHQucmVzdWx0T2JqZWN0LmRvY3VtZW50Qm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gbm8gaW1hZ2VcbiAgICAgICAgICAgICAgcmVzb2x2ZShcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERvY3VtZW50Q29udGVudChpZDogbnVtYmVyLCB0aHVtYm5haWw6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0RG9jdW1lbnRDb250ZW50KGlkLCB0aHVtYm5haWwpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdC5yZXN1bHRPYmplY3QuZG9jdW1lbnRDb250ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q291bnRyaWVzKCk6IFByb21pc2U8Q291bnRyeVtdPiB7XG4gICAgaWYgKHRoaXMuX2NvdW50cnlMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24pID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLl9jb3VudHJ5TGlzdCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0Q291bnRyaWVzKCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuX2NvdW50cnlMaXN0ID0gcmVzdWx0LnJlc3VsdE9iamVjdHM7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQucmVzdWx0T2JqZWN0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEN1c3RvbWVyR3JvdXBzKCk6IFByb21pc2U8Q3VzdG9tZXJHcm91cFtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0Q3VzdG9tZXJHcm91cHMoKTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHRPYmplY3RzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENvdW50cnkoY291bnRyeUNvZGU6IHN0cmluZyk6IENvdW50cnkge1xuICAgIHRoaXMuZ2V0Q291bnRyaWVzKCk7XG4gICAgcmV0dXJuIHRoaXMuX2NvdW50cnlMaXN0LmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT09IGNvdW50cnlDb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQcml2YWN5U2V0dGluZ3MoKTogUHJvbWlzZTxQcml2YWN5U2V0dGluZ1tdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldFByaXZhY3lTZXR0aW5ncygpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKDxQcml2YWN5U2V0dGluZ1tdPnJlc3VsdC5yZXN1bHRPYmplY3RzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRpb25Qcml2YWN5U2V0dGluZ3MoKTogUHJvbWlzZTxSZWxhdGlvblByaXZhY3lTZXR0aW5nW10+IHtcbiAgICBjb25zdCBwcml2YWN5U2V0dGluZ3M6IFJlbGF0aW9uUHJpdmFjeVNldHRpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgYmFzZVByaXZhY3lTZXR0aW5nczogUHJpdmFjeVNldHRpbmdbXSA9IGF3YWl0IHRoaXMuZ2V0UHJpdmFjeVNldHRpbmdzKCk7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMCwgbGVuOiBudW1iZXIgPSBiYXNlUHJpdmFjeVNldHRpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBiYXNlUHJpdlNldHRpbmc6IFByaXZhY3lTZXR0aW5nID0gYmFzZVByaXZhY3lTZXR0aW5nc1tpXTtcbiAgICAgIGNvbnN0IG5ld1JlbFByaXZTZXQ6IFJlbGF0aW9uUHJpdmFjeVNldHRpbmcgPSA8UmVsYXRpb25Qcml2YWN5U2V0dGluZz48dW5rbm93bj50aGlzLl9ib0ZhY3RvcnkuaW5zdGFudGlhdGVOZXdCbyhSZWxhdGlvblByaXZhY3lTZXR0aW5nKTtcbiAgICAgIG5ld1JlbFByaXZTZXQuYXBwbHlCYXNlUHJpdmFjeVNldHRpbmdWYWx1ZXMoYmFzZVByaXZTZXR0aW5nKTtcbiAgICAgIHByaXZhY3lTZXR0aW5ncy5wdXNoKG5ld1JlbFByaXZTZXQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJpdmFjeVNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIGdldE1hcmtldGluZ0NvZGVzKCk6IFByb21pc2U8TWFya2V0aW5nW10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0TWFya2V0aW5nQ29kZXMoKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSg8Q29Eb21haW5WYWx1ZVtdPnJlc3VsdC5yZXN1bHRPYmplY3RzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVHJhbnNhY3Rpb24oa2luZDogVHJhbnNhY3Rpb25LaW5kLCBicmFuY2hOcjogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5jcmVhdGVUcmFuc2FjdGlvbihraW5kLCBicmFuY2hOcikudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXJ0aWNsZUJvdW5kVGV4dExpbmVzT2ZBcnRpY2xlTGluZShhcnRpY2xlTGluZVV1aWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25MaW5lSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldEFydGljbGVCb3VuZFRleHRMaW5lc09mQXJ0aWNsZUxpbmUoYXJ0aWNsZUxpbmVVdWlkKTtcbiAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIDxUcmFuc2FjdGlvbkxpbmVJbmZvW10+PHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoVHJhbnNhY3Rpb25MaW5lSW5mbywgcmVzdWx0LnJlc3VsdE9iamVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VHJhbnNhY3Rpb25CeU5yQW5kS2luZChraW5kOiBUcmFuc2FjdGlvbktpbmQsIHRyYW5zYWN0aW9uTm86IG51bWJlcik6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0VHJhbnNhY3Rpb25CeU5yQW5kS2luZChraW5kLCB0cmFuc2FjdGlvbk5vKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShUcmFuc2FjdGlvbkluZm9SZXNwb25zZSwgcmVzdWx0LnJlc3VsdE9iamVjdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkJ5SWQodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRUcmFuc2FjdGlvbkJ5SWQodHJhbnNhY3Rpb25JZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY29tbWl0KCk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuY29tbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVRyYW5zYWN0aW9uKHV1aWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3Iuc2F2ZVRyYW5zYWN0aW9uKHV1aWQpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1c3RvbWVyRnVsbE9iamVjdChyZWxhdGlvbk5vOiBudW1iZXIpOiBQcm9taXNlPEN1c3RvbWVyRnVsbE9iamVjdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRDdXN0b21lckZ1bGxPYmplY3QocmVsYXRpb25ObykudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoQ3VzdG9tZXJGdWxsT2JqZWN0LCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENhc2hSZWdpc3RlcnMoYnJhbmNoPzogc3RyaW5nLCBncm91cD86IG51bWJlcik6IFByb21pc2U8Q2FzaFJlZ2lzdGVyW10+IHtcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRDYXNoUmVnaXN0ZXIoYnJhbmNoLCBncm91cCk7XG4gICAgaWYgKHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gPENhc2hSZWdpc3RlcltdPjx1bmtub3duPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KENhc2hSZWdpc3RlciwgcmVzcG9uc2UucmVzdWx0T2JqZWN0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRpb25OdW1iZXIocmVsYXRpb25JZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0UmVsYXRpb25OdW1iZXIocmVsYXRpb25JZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0LnJlc3VsdE9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFByaWNlTGlzdHMoY29kZT86IHN0cmluZyk6IFByb21pc2U8UHJpY2VMaXN0W10+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFByaWNlTGlzdHMoY29kZSk7XG4gICAgaWYgKHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gPHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoUHJpY2VMaXN0LCByZXNwb25zZS5yZXN1bHRPYmplY3RzKSBhcyBQcmljZUxpc3RbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdOyAvLyB0b2RvOiBoYW5kbGUgZXJyb3IgbWVzc2FnZXMgaW4gYSBnb29kIHdheVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRWYXRMaXN0KG9ubHlWYWxpZDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxWYXRbXT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0VmF0TGlzdChvbmx5VmFsaWQpO1xuICAgIGlmIChyZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIDx1bmtub3duPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KFZhdCwgcmVzcG9uc2UucmVzdWx0T2JqZWN0cykgYXMgVmF0W107XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTsgLy8gdG9kbzogaGFuZGxlIGVycm9yIG1lc3NhZ2VzIGluIGEgZ29vZCB3YXlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U2VxdWVuY2VWYWx1ZShzZXF1ZW5jZU5hbWU6IFNlcXVlbmNlTmFtZSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldFNlcXVlbmNlVmFsdWUoc2VxdWVuY2VOYW1lKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQucmVzdWx0T2JqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW5zZXJ0Q3VzdG9tZXIocmVsYXRpb246IEN1c3RvbWVyRnVsbE9iamVjdCk6IFByb21pc2U8Q3VzdG9tZXJGdWxsT2JqZWN0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmluc2VydEN1c3RvbWVyKHJlbGF0aW9uKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShDdXN0b21lckZ1bGxPYmplY3QsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlQ3VzdG9tZXIocmVsYXRpb246IEN1c3RvbWVyRnVsbE9iamVjdCk6IFByb21pc2U8Q3VzdG9tZXJGdWxsT2JqZWN0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnVwZGF0ZUN1c3RvbWVyKHJlbGF0aW9uKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShDdXN0b21lckZ1bGxPYmplY3QsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsaXZlcnlNZXRob2RzKCk6IFByb21pc2U8RGVsaXZlcnlNZXRob2RbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXREZWxpdmVyeU1ldGhvZHMoKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShEZWxpdmVyeU1ldGhvZCwgcmVzdWx0LnJlc3VsdE9iamVjdHMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsaXZlcnlPcHRpb25zKCk6IFByb21pc2U8RGVsaXZlcnlPcHRpb25bXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXREZWxpdmVyeU9wdGlvbnMoKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShEZWxpdmVyeU1ldGhvZCwgcmVzdWx0LnJlc3VsdE9iamVjdHMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkUmVsYXRpb25Ub1RyYW5zYWN0aW9uKHV1aWQ6IHN0cmluZywgcmVsYXRpb25JZDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5hZGRSZWxhdGlvblRvVHJhbnNhY3Rpb24odXVpZCwgcmVsYXRpb25JZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0VHJhbnNhY3Rpb25EZWxpdmVyeU9wdGlvbnModHJhbnNhY3Rpb25EZWxpdmVyeU9wdGlvbnNSZXF1ZXN0OiBTZXRUcmFuc2FjdGlvbkRlbGl2ZXJ5T3B0aW9uc1JlcXVlc3QpOiBQcm9taXNlPFRyYW5zYWN0aW9uUmVzcG9uc2VCYXNlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnNldFRyYW5zYWN0aW9uRGVsaXZlcnlPcHRpb25zKHRyYW5zYWN0aW9uRGVsaXZlcnlPcHRpb25zUmVxdWVzdCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UG9zdGFsQ29kZVJldHJpZXZhbChwb3N0Y2FsQ29kZTogc3RyaW5nLCBob3VzZU5vOiBzdHJpbmcpOiBQcm9taXNlPEdldFBvc3RhbENvZGVSZXRyaWV2YWxPdXRwdXRQYXJhbXM+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZ2V0UG9zdGFsQ29kZVJldHJpZXZhbChwb3N0Y2FsQ29kZSwgaG91c2VObykudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnN0IG91dHB1dFBhcmFtczogR2V0UG9zdGFsQ29kZVJldHJpZXZhbE91dHB1dFBhcmFtcyA9IG5ldyBHZXRQb3N0YWxDb2RlUmV0cmlldmFsT3V0cHV0UGFyYW1zKCk7XG4gICAgICAgICAgb3V0cHV0UGFyYW1zLmNpdHkgPSByZXN1bHQucmVzdWx0T2JqZWN0LmNpdHk7XG4gICAgICAgICAgb3V0cHV0UGFyYW1zLnN0cmVldCA9IHJlc3VsdC5yZXN1bHRPYmplY3Quc3RyZWV0O1xuICAgICAgICAgIG91dHB1dFBhcmFtcy5zdGF0dXMgPSByZXN1bHQucmVzdWx0T2JqZWN0LnN0YXR1cztcbiAgICAgICAgICBvdXRwdXRQYXJhbXMubmV0TnVtYmVyID0gcmVzdWx0LnJlc3VsdE9iamVjdC5uZXROdW1iZXI7XG4gICAgICAgICAgcmVzb2x2ZShvdXRwdXRQYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRSZWxhdGlvbkxpc3RPYmplY3RzKHJlbGF0aW9uUmVxdWVzdDogUmVsYXRpb25SZXF1ZXN0KTogUHJvbWlzZTxSZWxhdGlvbkxpc3RPYmplY3RbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRSZWxhdGlvbkxpc3RPYmplY3RzKHJlbGF0aW9uUmVxdWVzdCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoUmVsYXRpb25MaXN0T2JqZWN0LCByZXN1bHQucmVzdWx0T2JqZWN0cykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGRUcmFuc2FjdGlvbkxpbmUoXG4gICAgdXVpZDogc3RyaW5nLFxuICAgIGFydGljbGVMaW5lOiBUcmFuc2FjdGlvbkxpbmVUeXBlLFxuICAgIGFydGljbGVObzogc3RyaW5nLFxuICAgIGFtb3VudDogbnVtYmVyLFxuICAgIHdhcmVob3VzZU5vOiBudW1iZXIsXG4gICAgY29tbWlzc2lvbkNvZGU6IHN0cmluZyxcbiAgICBpc1JldHVybjogYm9vbGVhbixcbiAgICBhYm92ZUxpbmVOcjogbnVtYmVyLFxuICAgIGJlbG93TGluZU5yOiBudW1iZXJcbiAgKTpcbiAgICBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmFkZFRyYW5zYWN0aW9uTGluZSh1dWlkLCBhcnRpY2xlTGluZSwgYXJ0aWNsZU5vLCBhbW91bnQsIHdhcmVob3VzZU5vLCBjb21taXNzaW9uQ29kZSwgaXNSZXR1cm4sIGFib3ZlTGluZU5yLCBiZWxvd0xpbmVOcikudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkVGV4dExpbmVUb1RyYW5zYWN0aW9uKHV1aWQ6IHN0cmluZywgc2hvd09uRG9jdW1lbnRzOiBudW1iZXIsIHRleHQ6IHN0cmluZywgYW1vdW50OiBudW1iZXIsIGFydGljbGVCb3VuZDogYm9vbGVhbiwgcmVmQXJ0aWNsZUxpbmVOcjogbnVtYmVyLCBhYm92ZUxpbmVOcj86IG51bWJlciwgYmVsb3dMaW5lTnI/OiBudW1iZXIpOlxuICAgIFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuYWRkVGV4dExpbmVUb1RyYW5zYWN0aW9uKHV1aWQsIHNob3dPbkRvY3VtZW50cywgdGV4dCwgYW1vdW50LCBhcnRpY2xlQm91bmQsIHJlZkFydGljbGVMaW5lTnIsIGFib3ZlTGluZU5yLCBiZWxvd0xpbmVOcikudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2hhbmdlTGluZVNlcXVlbmNlKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgYWJvdmVMaW5lTnI/OiBudW1iZXIsIGJlbG93TGluZU5yPzogbnVtYmVyKTpcbiAgICBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdDogQ2hhbmdlTGluZVNlcXVlbmNlUmVxdWVzdCA9IHtcbiAgICAgICAgdHJhbnNhY3Rpb25VdWlkOiB1dWlkLFxuICAgICAgICBsaW5lVXVpZDogbGluZVV1aWQsXG4gICAgICAgIGFib3ZlTGluZU5yOiBhYm92ZUxpbmVOcixcbiAgICAgICAgYmVsb3dMaW5lTnI6IGJlbG93TGluZU5yXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuY2hhbmdlTGluZVNlcXVlbmNlKHJlcXVlc3QpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNhbmNlbEFkZFRyYW5zYWN0aW9uTGluZShsaW5lVXVpZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5jYW5jZWxBZGRUcmFuc2FjdGlvbkxpbmUobGluZVV1aWQpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlVHJhbnNhY3Rpb25MaW5lKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuZGVsZXRlVHJhbnNhY3Rpb25MaW5lKHV1aWQsIGxpbmVVdWlkKS50aGVuKChyZXN1bHQ6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQudmFsaWRhdGlvblJlc3VsdCAmJiByZXN1bHQudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShUcmFuc2FjdGlvbkluZm9SZXNwb25zZSwgcmVzdWx0LnJlc3VsdE9iamVjdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZVF1YW50aXR5KHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgbmV3UXVhbnRpdHk6IG51bWJlcik6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICB0cmFuc2FjdGlvblV1aWQ6IHV1aWQsXG4gICAgICAgIGxpbmVVdWlkOiBsaW5lVXVpZCxcbiAgICAgICAgbmV3UXVhbnRpdHk6IG5ld1F1YW50aXR5XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lUXVhbnRpdHkocmVxdWVzdCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3VsdC5yZXN1bHRPYmplY3QpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZVBlbmRpbmdMaW5lUmVhc29uKHBlbmRpbmdMaW5lVmFsdWVzOiBSZXNvbHZlTGluZVBlbmRpbmdSZWFzb25SZXF1ZXN0KTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5yZXNvbHZlUGVuZGluZ0xpbmVSZWFzb24ocGVuZGluZ0xpbmVWYWx1ZXMpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENvbW1pc3Npb25Db2RlcyhsYW5ndWFnZUNvZGU6IHN0cmluZyk6IFByb21pc2U8Q29Eb21haW5WYWx1ZVtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldENvbW1pc3Npb25Db2RlcyhsYW5ndWFnZUNvZGUpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKDxDb0RvbWFpblZhbHVlW10+cmVzdWx0LnJlc3VsdE9iamVjdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEluT3V0Q29sbGVjdGlvbihsYW5ndWFnZUNvZGU6IHN0cmluZyk6IFByb21pc2U8Q29Eb21haW5WYWx1ZVtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldEluT3V0Q29sbGVjdGlvbihsYW5ndWFnZUNvZGUpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXNvbHZlKDxDb0RvbWFpblZhbHVlW10+cmVzdWx0LnJlc3VsdE9iamVjdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzKGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRUcmFuc2FjdGlvbkFydGljbGVXYXJlaG91c2VzKGdvb2RJZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUoPFRyYW5zYWN0aW9uQXJ0aWNsZVdhcmVob3VzZVtdPnJlc3VsdC5yZXN1bHRPYmplY3RzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVzdWx0LnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0UmVsYXRpb25CeVVzZXIodXVpZDogc3RyaW5nLCB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLnNldFJlbGF0aW9uQnlVc2VyKHV1aWQsIHVzZXJuYW1lLCBwYXNzd29yZCkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFRleHRUeXBlcyhsYW5ndWFnZUNvZGU6IHN0cmluZyk6IFByb21pc2U8Q29Eb21haW5WYWx1ZVtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdG9yLmdldFRleHRUeXBlcyhsYW5ndWFnZUNvZGUpLnRoZW4oKHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3VsdC52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0czogQ29Eb21haW5WYWx1ZVtdID0gPENvRG9tYWluVmFsdWVbXT48dW5rbm93bj50aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShDb0RvbWFpblZhbHVlLCByZXN1bHQucmVzdWx0T2JqZWN0cyk7XG4gICAgICAgICAgdGV4dHMuc29ydCgoYSwgYikgPT4gYS5zZXF1ZW5jZSA+IGIuc2VxdWVuY2UgPyAxIDogLTEpO1xuICAgICAgICAgIHJlc29sdmUodGV4dHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXN1bHQudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTdGFuZGFyZFRleHRzKGxhbmd1YWdlQ29kZTogc3RyaW5nKTogUHJvbWlzZTxTdGFuZGFyZFRleHRbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5nZXRTdGFuZGFyZFRleHRzKGxhbmd1YWdlQ29kZSkudGhlbigocmVzdWx0OiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzdWx0LnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlc29sdmUodGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoU3RhbmRhcmRUZXh0LCByZXN1bHQucmVzdWx0T2JqZWN0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3VsdC52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZUNvbW1pc3Npb25Db2RlKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgY29kZTogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICB0cmFuc2FjdGlvblV1aWQ6IHV1aWQsXG4gICAgICBsaW5lVXVpZDogbGluZVV1aWQsXG4gICAgICBuZXdDb21taXNzaW9uQ29kZTogY29kZVxuICAgIH07XG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lQ29tbWlzc2lvbkNvZGUocmVxdWVzdCk7XG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPjx1bmtub3duPnRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXNwb25zZS5yZXN1bHRPYmplY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzcG9uc2UudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjaGFuZ2VUcmFuc2FjdGlvbkxpbmVXYXJlaG91c2UodXVpZDogc3RyaW5nLCBsaW5lVXVpZDogc3RyaW5nLCB3YXJlaG91c2VOdW1iZXI6IG51bWJlcik6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgdHJhbnNhY3Rpb25VdWlkOiB1dWlkLFxuICAgICAgbGluZVV1aWQ6IGxpbmVVdWlkLFxuICAgICAgbmV3V2FyZWhvdXNlTnVtYmVyOiB3YXJlaG91c2VOdW1iZXJcbiAgICB9O1xuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZVdhcmVob3VzZShyZXF1ZXN0KTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiA8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+PHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZS52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZVByaWNlKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgcHJpY2U6IG51bWJlcik6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgdHJhbnNhY3Rpb25VdWlkOiB1dWlkLFxuICAgICAgbGluZVV1aWQ6IGxpbmVVdWlkLFxuICAgICAgbmV3UHJpY2U6IHByaWNlXG4gICAgfTtcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5jaGFuZ2VUcmFuc2FjdGlvbkxpbmVQcmljZShyZXF1ZXN0KTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiA8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+PHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZS52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZVByaWNlTGlzdCh1dWlkOiBzdHJpbmcsIGxpbmVVdWlkOiBzdHJpbmcsIHByaWNlTGlzdDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICB0cmFuc2FjdGlvblV1aWQ6IHV1aWQsXG4gICAgICBsaW5lVXVpZDogbGluZVV1aWQsXG4gICAgICBuZXdQcmljZUxpc3RDb2RlOiBwcmljZUxpc3RcbiAgICB9O1xuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZVByaWNlTGlzdChyZXF1ZXN0KTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiA8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+PHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZS52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZVZhdCh1dWlkOiBzdHJpbmcsIGxpbmVVdWlkOiBzdHJpbmcsIGlkOiBudW1iZXIpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHRyYW5zYWN0aW9uVXVpZDogdXVpZCxcbiAgICAgIGxpbmVVdWlkOiBsaW5lVXVpZCxcbiAgICAgIG5ld1ZhdElkOiBpZFxuICAgIH07XG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lVmF0KHJlcXVlc3QpO1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIDxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT48dW5rbm93bj50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShUcmFuc2FjdGlvbkluZm9SZXNwb25zZSwgcmVzcG9uc2UucmVzdWx0T2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlLnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2hhbmdlVHJhbnNhY3Rpb25MaW5lTGluZURpc2NvdW50KHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgdHlwZTogRGlzY291bnRUeXBlLCBkaXNjb3VudDogbnVtYmVyLCByZWFzb246IHN0cmluZywgY29kZTogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICB0cmFuc2FjdGlvblV1aWQ6IHV1aWQsXG4gICAgICBsaW5lVXVpZDogbGluZVV1aWQsXG4gICAgICBkaXNjb3VudFR5cGU6IHR5cGUsXG4gICAgICBuZXdEaXNjb3VudDogZGlzY291bnQsXG4gICAgICBuZXdEaXNjb3VudFJlYXNvbjogcmVhc29uLFxuICAgICAgbmV3RGlzY291bnRDb2RlOiBjb2RlXG4gICAgfTtcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5jaGFuZ2VUcmFuc2FjdGlvbkxpbmVEaXNjb3VudChyZXF1ZXN0KTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiA8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+PHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZS52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZURlbGl2ZXJ5TWV0aG9kKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHRyYW5zYWN0aW9uVXVpZDogdXVpZCxcbiAgICAgIGxpbmVVdWlkOiBsaW5lVXVpZCxcbiAgICAgIG5ld0RlbGl2ZXJ5TWV0aG9kQ29kZTogbWV0aG9kXG4gICAgfTtcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5jaGFuZ2VUcmFuc2FjdGlvbkxpbmVEZWxpdmVyeU1ldGhvZChyZXF1ZXN0KTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiA8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+PHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZS52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZURlbGl2ZXJ5RGF0ZSh1dWlkOiBzdHJpbmcsIGxpbmVVdWlkOiBzdHJpbmcsIGRhdGU6IERhdGUpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHRyYW5zYWN0aW9uVXVpZDogdXVpZCxcbiAgICAgIGxpbmVVdWlkOiBsaW5lVXVpZCxcbiAgICAgIG5ld0RlbGl2ZXJ5RGF0ZTogZGF0ZVxuICAgIH07XG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lRGVsaXZlcnlEYXRlKHJlcXVlc3QpO1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIDxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT48dW5rbm93bj50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShUcmFuc2FjdGlvbkluZm9SZXNwb25zZSwgcmVzcG9uc2UucmVzdWx0T2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlLnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2hhbmdlVHJhbnNhY3Rpb25MaW5lQXNzZW1ibHlUaW1lKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgdGltZTogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICB0cmFuc2FjdGlvblV1aWQ6IHV1aWQsXG4gICAgICBsaW5lVXVpZDogbGluZVV1aWQsXG4gICAgICBuZXdBc3NlbWJseVRpbWU6IHRpbWVcbiAgICB9O1xuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZUFzc2VtYmx5VGltZShyZXF1ZXN0KTtcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiA8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+PHVua25vd24+dGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZS52YWxpZGF0aW9uTWVzc2FnZXNBc1N0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVRyYW5zYWN0aW9uTGluZUVkaXRUaW1lKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgdGltZTogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICB0cmFuc2FjdGlvblV1aWQ6IHV1aWQsXG4gICAgICBsaW5lVXVpZDogbGluZVV1aWQsXG4gICAgICBuZXdFZGl0VGltZTogdGltZVxuICAgIH07XG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lRWRpdFRpbWUocmVxdWVzdCk7XG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPjx1bmtub3duPnRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXNwb25zZS5yZXN1bHRPYmplY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzcG9uc2UudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjaGFuZ2VUcmFuc2FjdGlvbkxpbmVTdXBwbGllckFydGljbGVOdW1iZXIodXVpZDogc3RyaW5nLCBsaW5lVXVpZDogc3RyaW5nLCBhcnRpY2xlTnVtYmVyOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHRyYW5zYWN0aW9uVXVpZDogdXVpZCxcbiAgICAgIGxpbmVVdWlkOiBsaW5lVXVpZCxcbiAgICAgIG5ld1N1cHBsaWVyQXJ0aWNsZU51bWJlcjogYXJ0aWNsZU51bWJlclxuICAgIH07XG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuY2hhbmdlVHJhbnNhY3Rpb25MaW5lU3VwcGxpZXJBcnRpY2xlTnVtYmVyKHJlcXVlc3QpO1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIDxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT48dW5rbm93bj50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShUcmFuc2FjdGlvbkluZm9SZXNwb25zZSwgcmVzcG9uc2UucmVzdWx0T2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlLnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2hhbmdlVHJhbnNhY3Rpb25MaW5lUmVmZXJlbmNlKHV1aWQ6IHN0cmluZywgbGluZVV1aWQ6IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHRyYW5zYWN0aW9uVXVpZDogdXVpZCxcbiAgICAgIGxpbmVVdWlkOiBsaW5lVXVpZCxcbiAgICAgIG5ld1JlZmVyZW5jZTogcmVmZXJlbmNlXG4gICAgfTtcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNvbm5lY3Rvci5jaGFuZ2VUcmFuc2FjdGlvbkxpbmVSZWZlcmVuY2UocmVxdWVzdCk7XG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gPFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPjx1bmtub3duPnRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLCByZXNwb25zZS5yZXN1bHRPYmplY3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVzcG9uc2UudmFsaWRhdGlvbk1lc3NhZ2VzQXNTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjaGFuZ2VUcmFuc2FjdGlvbkxpbmVDb2xsZWN0aW9uQ29kZSh1dWlkOiBzdHJpbmcsIGxpbmVVdWlkOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgdHJhbnNhY3Rpb25VdWlkOiB1dWlkLFxuICAgICAgbGluZVV1aWQ6IGxpbmVVdWlkLFxuICAgICAgbmV3Q29sbGVjdGlvbkNvZGU6IGNvZGVcbiAgICB9O1xuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLmNoYW5nZVRyYW5zYWN0aW9uTGluZUNvbGxlY3Rpb25Db2RlKHJlcXVlc3QpO1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIDxUcmFuc2FjdGlvbkluZm9SZXNwb25zZT48dW5rbm93bj50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShUcmFuc2FjdGlvbkluZm9SZXNwb25zZSwgcmVzcG9uc2UucmVzdWx0T2JqZWN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlLnZhbGlkYXRpb25NZXNzYWdlc0FzU3RyaW5nKTtcbiAgICB9XG4gIH1cblxufVxuIl19