@snabcentr/client-ui 1.19.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (300) hide show
  1. package/accordion/sc-accordion-content.directive.d.ts +2 -2
  2. package/accordion/sc-accordion.component.d.ts +4 -4
  3. package/accordion/sc-accordion.module.d.ts +2 -2
  4. package/auth/index.d.ts +2 -1
  5. package/auth/interfaces/{ApiErrorResponse.d.ts → api-error-response.d.ts} +1 -3
  6. package/auth/interfaces/index.d.ts +3 -0
  7. package/auth/interfaces/sc-bank-account-form-group.d.ts +11 -0
  8. package/auth/interfaces/sc-contact-form-group.d.ts +10 -0
  9. package/auth/sc-auth.module.d.ts +14 -8
  10. package/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.d.ts +1 -1
  11. package/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.d.ts +1 -1
  12. package/auth/sc-sign-in-form/sc-sign-in-form.component.d.ts +1 -1
  13. package/auth/sign-up-form/sc-sign-up-form.component.d.ts +153 -0
  14. package/banner/sc-banner.component.d.ts +9 -5
  15. package/banner/sc-banner.module.d.ts +5 -4
  16. package/brands-list/index.d.ts +2 -0
  17. package/brands-list/sc-brands-list.component.d.ts +15 -0
  18. package/brands-list/sc-brands-list.module.d.ts +12 -0
  19. package/cart/cart-item-mobile/sc-cart-item-mobile.component.d.ts +16 -16
  20. package/cart/sc-cart.module.d.ts +3 -3
  21. package/catalog/categories-list/sc-categories-list.component.d.ts +9 -3
  22. package/catalog/category-card/sc-category-card.component.d.ts +1 -1
  23. package/catalog/input-quantity/sc-input-quantity.component.d.ts +6 -14
  24. package/catalog/price-card/sc-price-card.component.d.ts +11 -105
  25. package/catalog/price-history/sc-price-history.component.d.ts +11 -5
  26. package/catalog/price-list-pagination/sc-price-list-pagination.component.d.ts +10 -5
  27. package/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.d.ts +1 -1
  28. package/catalog/sc-catalog.module.d.ts +5 -4
  29. package/catalog/sc-favorite-btn/sc-favorite-btn.component.d.ts +1 -1
  30. package/contacts/add-contact-dialog/sc-add-contact-dialog.component.d.ts +11 -6
  31. package/contacts/contacts-accordion/sc-contacts-accordion.component.d.ts +1 -1
  32. package/contacts/new-contact-form/sc-new-contact-form.component.d.ts +1 -1
  33. package/contacts/sc-contacts.module.d.ts +6 -1
  34. package/contragents/add-contragent-bank-account-dialog/sc-add-contragent-bank-account-dialog.component.d.ts +3 -3
  35. package/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.d.ts +23 -15
  36. package/contragents/contragents-accordion/contragents-accordion-item/sc-contragents-accordion-item.component.d.ts +1 -1
  37. package/contragents/contragents-accordion/sc-contragents-accordion.component.d.ts +1 -1
  38. package/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.d.ts +1 -1
  39. package/contragents/new-contragent-form/sc-new-contragent-form.component.d.ts +31 -16
  40. package/contragents/sc-contragents.module.d.ts +6 -4
  41. package/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.d.ts +83 -8
  42. package/delivery-address/delivery-address-accordion/delivery-address-accordion-item/sc-delivery-address-accordion-item.component.d.ts +1 -1
  43. package/delivery-address/delivery-address-accordion/sc-delivery-address-accordion.component.d.ts +1 -1
  44. package/delivery-address/sc-delivery-address.module.d.ts +4 -2
  45. package/directives/abstract-price-card/abstract-sc-price-card.directive.d.ts +107 -0
  46. package/directives/index.d.ts +6 -2
  47. package/directives/next-input-focus/sc-next-input-focus.directive.d.ts +18 -0
  48. package/directives/next-input-focus/sc-next-input-focus.module.d.ts +10 -0
  49. package/directives/tel-link/sc-tel-link.directive.d.ts +27 -0
  50. package/directives/tel-link/sc-tel-link.module.d.ts +11 -0
  51. package/directives/terminal-link/sc-terminal-link.directive.d.ts +34 -0
  52. package/esm2022/accordion/sc-accordion-content.directive.mjs +17 -0
  53. package/esm2022/accordion/sc-accordion.component.mjs +88 -0
  54. package/esm2022/accordion/sc-accordion.module.mjs +26 -0
  55. package/esm2022/auth/index.mjs +8 -0
  56. package/esm2022/auth/interfaces/api-error-response.mjs +2 -0
  57. package/esm2022/auth/interfaces/index.mjs +4 -0
  58. package/esm2022/auth/interfaces/sc-bank-account-form-group.mjs +2 -0
  59. package/esm2022/auth/interfaces/sc-contact-form-group.mjs +2 -0
  60. package/esm2022/auth/sc-auth.module.mjs +98 -0
  61. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.mjs +72 -0
  62. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.mjs +70 -0
  63. package/{esm2020 → esm2022}/auth/sc-sign-in-form/sc-sign-in-form.component.mjs +6 -6
  64. package/esm2022/auth/sign-up-form/sc-sign-up-form.component.mjs +321 -0
  65. package/esm2022/banner/sc-banner.component.mjs +234 -0
  66. package/esm2022/banner/sc-banner.module.mjs +29 -0
  67. package/esm2022/brands-list/index.mjs +3 -0
  68. package/esm2022/brands-list/sc-brands-list.component.mjs +24 -0
  69. package/esm2022/brands-list/sc-brands-list.module.mjs +22 -0
  70. package/esm2022/cart/cart-item-mobile/sc-cart-item-mobile.component.mjs +121 -0
  71. package/esm2022/cart/sc-cart.module.mjs +54 -0
  72. package/esm2022/catalog/categories-list/sc-categories-list.component.mjs +92 -0
  73. package/esm2022/catalog/category-card/sc-category-card.component.mjs +120 -0
  74. package/esm2022/catalog/input-quantity/sc-input-quantity.component.mjs +141 -0
  75. package/esm2022/catalog/price-card/sc-price-card.component.mjs +64 -0
  76. package/esm2022/catalog/price-history/sc-price-history.component.mjs +126 -0
  77. package/esm2022/catalog/price-list-pagination/sc-price-list-pagination.component.mjs +49 -0
  78. package/{esm2020 → esm2022}/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.mjs +6 -6
  79. package/esm2022/catalog/sc-catalog.module.mjs +120 -0
  80. package/esm2022/catalog/sc-favorite-btn/sc-favorite-btn.component.mjs +42 -0
  81. package/esm2022/contacts/add-contact-dialog/sc-add-contact-dialog.component.mjs +89 -0
  82. package/esm2022/contacts/contacts-accordion/sc-contacts-accordion.component.mjs +38 -0
  83. package/esm2022/contacts/new-contact-form/sc-new-contact-form.component.mjs +30 -0
  84. package/esm2022/contacts/sc-contacts.module.mjs +88 -0
  85. package/esm2022/contragents/add-contragent-bank-account-dialog/sc-add-contragent-bank-account-dialog.component.mjs +80 -0
  86. package/esm2022/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.mjs +262 -0
  87. package/esm2022/contragents/contragents-accordion/contragents-accordion-item/sc-contragents-accordion-item.component.mjs +75 -0
  88. package/{esm2020 → esm2022}/contragents/contragents-accordion/sc-contragents-accordion.component.mjs +6 -6
  89. package/esm2022/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.mjs +64 -0
  90. package/esm2022/contragents/new-contragent-form/sc-new-contragent-form.component.mjs +220 -0
  91. package/esm2022/contragents/sc-contragents.module.mjs +110 -0
  92. package/esm2022/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.mjs +230 -0
  93. package/{esm2020 → esm2022}/delivery-address/delivery-address-accordion/delivery-address-accordion-item/sc-delivery-address-accordion-item.component.mjs +6 -6
  94. package/{esm2020 → esm2022}/delivery-address/delivery-address-accordion/sc-delivery-address-accordion.component.mjs +6 -6
  95. package/esm2022/delivery-address/sc-delivery-address.module.mjs +84 -0
  96. package/esm2022/directives/abstract-price-card/abstract-sc-price-card.directive.mjs +131 -0
  97. package/esm2022/directives/index.mjs +7 -0
  98. package/esm2022/directives/next-input-focus/sc-next-input-focus.directive.mjs +43 -0
  99. package/esm2022/directives/next-input-focus/sc-next-input-focus.module.mjs +19 -0
  100. package/esm2022/directives/tel-link/sc-tel-link.directive.mjs +58 -0
  101. package/esm2022/directives/tel-link/sc-tel-link.module.mjs +20 -0
  102. package/esm2022/directives/terminal-link/sc-terminal-link.directive.mjs +69 -0
  103. package/esm2022/files/directives/tree-top.directive.mjs +63 -0
  104. package/{esm2020 → esm2022}/files/directives/tree.directive.mjs +5 -5
  105. package/esm2022/files/file-tree-item/file-tree-item.component.mjs +18 -0
  106. package/esm2022/files/files-and-documents/files-and-documents.component.mjs +60 -0
  107. package/esm2022/files/files-and-documents.module.mjs +27 -0
  108. package/esm2022/files/services/tree-icon.service.mjs +49 -0
  109. package/{esm2020 → esm2022}/files/services/tree-loader.service.mjs +5 -5
  110. package/esm2022/form-fields/addresses-selection-field/sc-addresses-selection-field.component.mjs +128 -0
  111. package/esm2022/form-fields/form-fields.module.mjs +69 -0
  112. package/esm2022/form-fields/suggestion-field/sc-suggestion-field.component.mjs +134 -0
  113. package/{esm2020 → esm2022}/helpers/sc-px-converter.mjs +4 -4
  114. package/esm2022/helpers/sc-units-helper.mjs +45 -0
  115. package/{esm2020 → esm2022}/news/news-card/sc-news-card.component.mjs +4 -4
  116. package/{esm2020 → esm2022}/news/news-card-skeleton/sc-news-card-skeleton.component.mjs +4 -4
  117. package/{esm2020 → esm2022}/news/sc-news.module.mjs +5 -5
  118. package/esm2022/order/order-item-mobile/order-item-mobile.component.mjs +80 -0
  119. package/esm2022/order/sc-order.module.mjs +29 -0
  120. package/esm2022/order/sc-payment-status/sc-payment-status.component.mjs +35 -0
  121. package/esm2022/pipes/index.mjs +2 -0
  122. package/esm2022/pipes/sc-formatted-phone.mjs +34 -0
  123. package/esm2022/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.mjs +182 -0
  124. package/esm2022/profile/sc-profile.module.mjs +77 -0
  125. package/{esm2020 → esm2022}/providers/index.mjs +1 -2
  126. package/esm2022/providers/scUserProviders.mjs +27 -0
  127. package/esm2022/public-api.mjs +30 -0
  128. package/esm2022/qrcode/index.mjs +3 -0
  129. package/esm2022/qrcode/qrcode-dialog/sc-qrcode-dialog.component.mjs +58 -0
  130. package/esm2022/qrcode/sc-qrcode.module.mjs +25 -0
  131. package/esm2022/samples/ask-to-sample-form/sc-ask-to-sample-form.component.mjs +37 -0
  132. package/esm2022/samples/index.mjs +5 -0
  133. package/esm2022/samples/interfaces/sc-i-preview-sample.mjs +2 -0
  134. package/esm2022/samples/preview-sample/sc-preview-sample.component.mjs +83 -0
  135. package/esm2022/samples/sc-sample.module.mjs +59 -0
  136. package/{esm2020 → esm2022}/share-button/sc-share-button.component.mjs +5 -5
  137. package/esm2022/share-button/sc-share-button.module.mjs +22 -0
  138. package/esm2022/user/index.mjs +6 -0
  139. package/esm2022/user/reset-user-password/sc-reset-user-password.component.mjs +71 -0
  140. package/esm2022/user/sc-user.module.mjs +89 -0
  141. package/esm2022/user/update-user-info-dialog/sc-update-user-info-dialog.component.mjs +117 -0
  142. package/esm2022/user/user-managers/sc-user-managers.component.mjs +41 -0
  143. package/esm2022/user/user-phone-approve-dialog/sc-user-phone-approve-dialog.component.mjs +102 -0
  144. package/{esm2020 → esm2022}/validators/index.mjs +2 -2
  145. package/esm2022/validators/sc-password-confirm-matching-validator.mjs +17 -0
  146. package/esm2022/validators/stepValidator.mjs +18 -0
  147. package/esm2022/verification/sc-verification.module.mjs +68 -0
  148. package/esm2022/verification/verification-phone-check-form/sc-verification-phone-check-form.component.mjs +198 -0
  149. package/fesm2022/snabcentr-client-ui.mjs +5710 -0
  150. package/fesm2022/snabcentr-client-ui.mjs.map +1 -0
  151. package/files/directives/tree-top.directive.d.ts +1 -1
  152. package/files/directives/tree.directive.d.ts +1 -1
  153. package/files/file-tree-item/file-tree-item.component.d.ts +3 -3
  154. package/files/files-and-documents/files-and-documents.component.d.ts +1 -1
  155. package/files/files-and-documents.module.d.ts +1 -1
  156. package/form-fields/addresses-selection-field/sc-addresses-selection-field.component.d.ts +17 -11
  157. package/form-fields/form-fields.module.d.ts +5 -3
  158. package/form-fields/suggestion-field/sc-suggestion-field.component.d.ts +10 -2
  159. package/helpers/sc-units-helper.d.ts +6 -6
  160. package/news/news-card/sc-news-card.component.d.ts +1 -1
  161. package/news/news-card-skeleton/sc-news-card-skeleton.component.d.ts +1 -1
  162. package/order/order-item-mobile/order-item-mobile.component.d.ts +9 -9
  163. package/order/sc-order.module.d.ts +4 -2
  164. package/order/sc-payment-status/sc-payment-status.component.d.ts +1 -1
  165. package/package.json +42 -45
  166. package/pipes/index.d.ts +1 -0
  167. package/pipes/sc-formatted-phone.d.ts +19 -0
  168. package/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.d.ts +3 -3
  169. package/profile/sc-profile.module.d.ts +6 -4
  170. package/providers/index.d.ts +0 -1
  171. package/providers/scUserProviders.d.ts +2 -3
  172. package/public-api.d.ts +4 -0
  173. package/qrcode/index.d.ts +2 -0
  174. package/qrcode/qrcode-dialog/sc-qrcode-dialog.component.d.ts +37 -0
  175. package/qrcode/sc-qrcode.module.d.ts +14 -0
  176. package/samples/ask-to-sample-form/sc-ask-to-sample-form.component.d.ts +18 -0
  177. package/samples/index.d.ts +4 -0
  178. package/samples/interfaces/sc-i-preview-sample.d.ts +47 -0
  179. package/samples/preview-sample/sc-preview-sample.component.d.ts +48 -0
  180. package/samples/sc-sample.module.d.ts +19 -0
  181. package/share-button/sc-share-button.component.d.ts +1 -1
  182. package/share-button/sc-share-button.module.d.ts +1 -1
  183. package/styles/taiga/taiga-tailwind-preset.js +121 -0
  184. package/styles/taiga/variables.less +17 -14
  185. package/styles/tailwind/tailwind.scss +252 -61
  186. package/user/index.d.ts +1 -0
  187. package/user/reset-user-password/sc-reset-user-password.component.d.ts +3 -3
  188. package/user/sc-user.module.d.ts +12 -8
  189. package/user/update-user-info-dialog/sc-update-user-info-dialog.component.d.ts +13 -9
  190. package/user/user-managers/sc-user-managers.component.d.ts +26 -0
  191. package/user/user-phone-approve-dialog/sc-user-phone-approve-dialog.component.d.ts +13 -8
  192. package/validators/index.d.ts +1 -1
  193. package/validators/{scPasswordConfirmMatchingValidator.d.ts → sc-password-confirm-matching-validator.d.ts} +1 -1
  194. package/verification/sc-verification.module.d.ts +5 -4
  195. package/verification/verification-phone-check-form/sc-verification-phone-check-form.component.d.ts +18 -18
  196. package/directives/carousel-item-hidden/sc-carousel-item-hidden.directive.d.ts +0 -24
  197. package/directives/carousel-item-hidden/sc-carousel-item-hidden.module.d.ts +0 -11
  198. package/esm2020/accordion/sc-accordion-content.directive.mjs +0 -17
  199. package/esm2020/accordion/sc-accordion.component.mjs +0 -88
  200. package/esm2020/accordion/sc-accordion.module.mjs +0 -25
  201. package/esm2020/auth/index.mjs +0 -7
  202. package/esm2020/auth/interfaces/ApiErrorResponse.mjs +0 -2
  203. package/esm2020/auth/sc-auth.module.mjs +0 -79
  204. package/esm2020/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.mjs +0 -64
  205. package/esm2020/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.mjs +0 -63
  206. package/esm2020/banner/sc-banner.component.mjs +0 -234
  207. package/esm2020/banner/sc-banner.module.mjs +0 -26
  208. package/esm2020/cart/cart-item-mobile/sc-cart-item-mobile.component.mjs +0 -120
  209. package/esm2020/cart/sc-cart.module.mjs +0 -65
  210. package/esm2020/catalog/categories-list/sc-categories-list.component.mjs +0 -84
  211. package/esm2020/catalog/category-card/sc-category-card.component.mjs +0 -120
  212. package/esm2020/catalog/input-quantity/sc-input-quantity.component.mjs +0 -163
  213. package/esm2020/catalog/price-card/sc-price-card.component.mjs +0 -175
  214. package/esm2020/catalog/price-history/sc-price-history.component.mjs +0 -114
  215. package/esm2020/catalog/price-list-pagination/sc-price-list-pagination.component.mjs +0 -37
  216. package/esm2020/catalog/sc-catalog.module.mjs +0 -128
  217. package/esm2020/catalog/sc-favorite-btn/sc-favorite-btn.component.mjs +0 -41
  218. package/esm2020/contacts/add-contact-dialog/sc-add-contact-dialog.component.mjs +0 -71
  219. package/esm2020/contacts/contacts-accordion/sc-contacts-accordion.component.mjs +0 -35
  220. package/esm2020/contacts/new-contact-form/sc-new-contact-form.component.mjs +0 -28
  221. package/esm2020/contacts/sc-contacts.module.mjs +0 -92
  222. package/esm2020/contragents/add-contragent-bank-account-dialog/sc-add-contragent-bank-account-dialog.component.mjs +0 -71
  223. package/esm2020/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.mjs +0 -249
  224. package/esm2020/contragents/contragents-accordion/contragents-accordion-item/sc-contragents-accordion-item.component.mjs +0 -75
  225. package/esm2020/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.mjs +0 -61
  226. package/esm2020/contragents/new-contragent-form/sc-new-contragent-form.component.mjs +0 -183
  227. package/esm2020/contragents/sc-contragents.module.mjs +0 -103
  228. package/esm2020/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.mjs +0 -79
  229. package/esm2020/delivery-address/sc-delivery-address.module.mjs +0 -77
  230. package/esm2020/directives/carousel-item-hidden/sc-carousel-item-hidden.directive.mjs +0 -40
  231. package/esm2020/directives/carousel-item-hidden/sc-carousel-item-hidden.module.mjs +0 -21
  232. package/esm2020/directives/index.mjs +0 -3
  233. package/esm2020/files/directives/tree-top.directive.mjs +0 -63
  234. package/esm2020/files/file-tree-item/file-tree-item.component.mjs +0 -18
  235. package/esm2020/files/files-and-documents/files-and-documents.component.mjs +0 -60
  236. package/esm2020/files/files-and-documents.module.mjs +0 -26
  237. package/esm2020/files/services/tree-icon.service.mjs +0 -48
  238. package/esm2020/form-fields/addresses-selection-field/sc-addresses-selection-field.component.mjs +0 -122
  239. package/esm2020/form-fields/form-fields.module.mjs +0 -80
  240. package/esm2020/form-fields/suggestion-field/sc-suggestion-field.component.mjs +0 -116
  241. package/esm2020/helpers/sc-units-helper.mjs +0 -44
  242. package/esm2020/order/order-item-mobile/order-item-mobile.component.mjs +0 -79
  243. package/esm2020/order/sc-order.module.mjs +0 -25
  244. package/esm2020/order/sc-payment-status/sc-payment-status.component.mjs +0 -35
  245. package/esm2020/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.mjs +0 -177
  246. package/esm2020/profile/sc-profile.module.mjs +0 -80
  247. package/esm2020/providers/productsPagination.mjs +0 -99
  248. package/esm2020/providers/scUserProviders.mjs +0 -30
  249. package/esm2020/public-api.mjs +0 -26
  250. package/esm2020/share-button/sc-share-button.module.mjs +0 -22
  251. package/esm2020/user/index.mjs +0 -5
  252. package/esm2020/user/reset-user-password/sc-reset-user-password.component.mjs +0 -67
  253. package/esm2020/user/sc-user.module.mjs +0 -88
  254. package/esm2020/user/update-user-info-dialog/sc-update-user-info-dialog.component.mjs +0 -105
  255. package/esm2020/user/user-phone-approve-dialog/sc-user-phone-approve-dialog.component.mjs +0 -91
  256. package/esm2020/validators/scPasswordConfirmMatchingValidator.mjs +0 -17
  257. package/esm2020/validators/stepValidator.mjs +0 -18
  258. package/esm2020/verification/sc-verification.module.mjs +0 -73
  259. package/esm2020/verification/verification-phone-check-form/sc-verification-phone-check-form.component.mjs +0 -184
  260. package/fesm2015/snabcentr-client-ui.mjs +0 -4858
  261. package/fesm2015/snabcentr-client-ui.mjs.map +0 -1
  262. package/fesm2020/snabcentr-client-ui.mjs +0 -4778
  263. package/fesm2020/snabcentr-client-ui.mjs.map +0 -1
  264. package/providers/productsPagination.d.ts +0 -43
  265. /package/{esm2020 → esm2022}/accordion/index.mjs +0 -0
  266. /package/{esm2020 → esm2022}/auth/enums/auth-method.mjs +0 -0
  267. /package/{esm2020 → esm2022}/banner/index.mjs +0 -0
  268. /package/{esm2020 → esm2022}/cart/index.mjs +0 -0
  269. /package/{esm2020 → esm2022}/catalog/index.mjs +0 -0
  270. /package/{esm2020 → esm2022}/contacts/index.mjs +0 -0
  271. /package/{esm2020 → esm2022}/contragents/index.mjs +0 -0
  272. /package/{esm2020 → esm2022}/delivery-address/index.mjs +0 -0
  273. /package/{esm2020 → esm2022}/files/directives/index.mjs +0 -0
  274. /package/{esm2020 → esm2022}/files/index.mjs +0 -0
  275. /package/{esm2020 → esm2022}/files/interfaces/tree-node.mjs +0 -0
  276. /package/{esm2020 → esm2022}/files/services/index.mjs +0 -0
  277. /package/{esm2020 → esm2022}/form-fields/index.mjs +0 -0
  278. /package/{esm2020 → esm2022}/helpers/index.mjs +0 -0
  279. /package/{esm2020 → esm2022}/icons/index.mjs +0 -0
  280. /package/{esm2020 → esm2022}/icons/sc-client-ui-icons-name.mjs +0 -0
  281. /package/{esm2020 → esm2022}/loader/index.mjs +0 -0
  282. /package/{esm2020 → esm2022}/loader/sc-i-loader.mjs +0 -0
  283. /package/{esm2020 → esm2022}/masks/index.mjs +0 -0
  284. /package/{esm2020 → esm2022}/masks/sc-account-number-mask.mjs +0 -0
  285. /package/{esm2020 → esm2022}/masks/sc-bic-mask.mjs +0 -0
  286. /package/{esm2020 → esm2022}/masks/sc-correspondent-account-mask.mjs +0 -0
  287. /package/{esm2020 → esm2022}/masks/sc-inn-mask.mjs +0 -0
  288. /package/{esm2020 → esm2022}/masks/sc-kpp-mask.mjs +0 -0
  289. /package/{esm2020 → esm2022}/masks/sc-okpo-mask.mjs +0 -0
  290. /package/{esm2020 → esm2022}/masks/sc-phone-verification-code-mask.mjs +0 -0
  291. /package/{esm2020 → esm2022}/news/index.mjs +0 -0
  292. /package/{esm2020 → esm2022}/order/index.mjs +0 -0
  293. /package/{esm2020 → esm2022}/profile/index.mjs +0 -0
  294. /package/{esm2020 → esm2022}/share-button/index.mjs +0 -0
  295. /package/{esm2020 → esm2022}/snabcentr-client-ui.mjs +0 -0
  296. /package/{esm2020 → esm2022}/tokens/index.mjs +0 -0
  297. /package/{esm2020 → esm2022}/tokens/sc-linear-values-token.mjs +0 -0
  298. /package/{esm2020 → esm2022}/validators/scBicValidator.mjs +0 -0
  299. /package/{esm2020 → esm2022}/validators/scCorrespondentAccountValidator.mjs +0 -0
  300. /package/{esm2020 → esm2022}/verification/index.mjs +0 -0
@@ -0,0 +1,198 @@
1
+ /* eslint-disable no-underscore-dangle,lodash/prefer-constant */
2
+ import { HttpErrorResponse } from '@angular/common/http';
3
+ import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Output } from '@angular/core';
4
+ import { FormGroupDirective } from '@angular/forms';
5
+ import { tuiControlValue } from '@taiga-ui/cdk';
6
+ import { catchError, distinctUntilChanged, endWith, filter, finalize, map, of, scan, share, startWith, Subject, switchMap, takeWhile, tap, timer } from 'rxjs';
7
+ import { scPhoneVerificationCodeMask } from '../../masks';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@snabcentr/client-core";
10
+ import * as i2 from "@angular/common";
11
+ import * as i3 from "@angular/forms";
12
+ import * as i4 from "@taiga-ui/legacy/components/primitive-textfield";
13
+ import * as i5 from "@taiga-ui/legacy";
14
+ import * as i6 from "@taiga-ui/core";
15
+ import * as i7 from "@taiga-ui/cdk";
16
+ import * as i8 from "@maskito/angular";
17
+ import * as i9 from "@taiga-ui/kit";
18
+ /**
19
+ * Компонент формы проверки телефона и получения кода подтверждения.
20
+ */
21
+ export class ScVerificationPhoneCheckFormComponent {
22
+ /**
23
+ * Признак, следует ли отображать функционал кода подтверждения.
24
+ */
25
+ set showCodeFields(showCodeFields) {
26
+ this._showCodeFields = showCodeFields;
27
+ this.form.controls.verificationCode[showCodeFields ? 'enable' : 'disable']();
28
+ }
29
+ /**
30
+ * Признак, следует ли отображать функционал кода подтверждения.
31
+ */
32
+ get showCodeFields() {
33
+ return this._showCodeFields;
34
+ }
35
+ /**
36
+ * Инициализирует экземпляр класса {@link ScVerificationPhoneCheckFormComponent}.
37
+ *
38
+ * @param verificationService Сервис верификации.
39
+ * @param formGroupDirective Директива c `FormGroup` из DOM.
40
+ */
41
+ constructor(verificationService, formGroupDirective) {
42
+ this.verificationService = verificationService;
43
+ this.formGroupDirective = formGroupDirective;
44
+ /**
45
+ * Признак, что поле ввода телефона только для чтения.
46
+ */
47
+ this.readOnly = false;
48
+ /**
49
+ * Признак, следует ли телефону быть в системе. От этого признака зависит в каких случаях выдавать ошибку при проверки занятости телефона.
50
+ */
51
+ this.shouldBeBusy = true;
52
+ /**
53
+ * Признак, следует ли проверять подтверждён ли телефона в системе. При `true` будет вызывать ошибку при наличие телефона в системе без подтверждения.
54
+ */
55
+ this.shouldBeConfirmed = undefined;
56
+ /**
57
+ * Наличие кода подтверждения у пользователя.
58
+ */
59
+ this.haveCode = false;
60
+ /**
61
+ * Событие для обратной привязки наличия кода подтверждения
62
+ */
63
+ this.haveCodeChange = new EventEmitter();
64
+ /**
65
+ * {@link Subject} события отправки кода подтверждения.
66
+ */
67
+ this.onSendCode = new Subject();
68
+ /**
69
+ * {@link Observable} запроса данных получения кода подтверждения.
70
+ */
71
+ this.loadingApproveCode$ = this.onSendCode.pipe(map(() => this.phoneControl.value), filter((value) => this.phoneControl.valid), switchMap((value) => this.verificationService.sendPhoneApproveCode(value).pipe(tap(() => {
72
+ this.reloadTimer$.next(60);
73
+ }), map(() => false), catchError((error) => {
74
+ if (error instanceof HttpErrorResponse) {
75
+ const errorResponse = error.error;
76
+ const regex = /(\d{2}):\d{2}/;
77
+ const match = errorResponse.message.match(regex);
78
+ if (match && match.length > 1) {
79
+ const timeParts = match[0].split(':');
80
+ const seconds = Number.parseInt(timeParts[1], 10);
81
+ this.reloadTimer$.next(seconds);
82
+ }
83
+ else {
84
+ this.phoneControl.setErrors({ serverResponse: errorResponse.errors?.['phone'] ?? [errorResponse.message] });
85
+ }
86
+ }
87
+ return of(false);
88
+ }), finalize(() => {
89
+ this.setHaveCode(true);
90
+ }), startWith(true))), startWith(false), share());
91
+ /**
92
+ * Маска поля ввода кода для подтверждения.
93
+ */
94
+ this.verificationCodeMask = scPhoneVerificationCodeMask;
95
+ /**
96
+ * {@link Subject} события запуска/остановки таймера.
97
+ */
98
+ this.reloadTimer$ = new Subject();
99
+ /**
100
+ * {@link Observable} Таймера.
101
+ *
102
+ * TODO: Вынести таймер в отдельную директиву TASK:[#9260].
103
+ */
104
+ this.timer$ = this.reloadTimer$.pipe(switchMap((sec) => timer(0, 1000).pipe(scan((total) => -1 + total, sec), takeWhile((total) => total >= 0), map((total) => {
105
+ const minutes = Math.floor(total / 60);
106
+ const seconds = total % 60;
107
+ return `${Math.round(minutes).toString().padStart(2, '0')}:${Math.round(seconds).toString().padStart(2, '0')}`;
108
+ }), endWith(null), startWith(null), distinctUntilChanged())));
109
+ /**
110
+ * Признак, следует ли отображать функционал кода подтверждения.
111
+ */
112
+ this._showCodeFields = true;
113
+ }
114
+ /**
115
+ * Группа полей ввода для формы «Вход на сайт».
116
+ */
117
+ get form() {
118
+ return this.formGroupDirective?.form;
119
+ }
120
+ /**
121
+ * Поле ввода 'Номер телефона'.
122
+ */
123
+ get phoneControl() {
124
+ return this.form.controls.phone;
125
+ }
126
+ /** @inheritDoc */
127
+ ngOnInit() {
128
+ this.phoneCheck$ = tuiControlValue(this.phoneControl).pipe(tap(() => {
129
+ this.reloadTimer$.next(0);
130
+ }), switchMap((value) => {
131
+ if (this.phoneControl.valid && !!value) {
132
+ return this.verificationService.getPhoneCheck$(value).pipe(map((result) => {
133
+ if (this.shouldBeBusy !== result.isBusy) {
134
+ this.phoneControl.setErrors({
135
+ serverResponse: [
136
+ result.isBusy ? 'Пользователь с таким номером телефона уже существует' : 'Пользователя с таким номером телефона не существует',
137
+ ],
138
+ });
139
+ this.phoneControl.markAsTouched();
140
+ return false;
141
+ }
142
+ if (this.shouldBeConfirmed !== undefined && this.shouldBeConfirmed !== result.isConfirmed) {
143
+ this.phoneControl.setErrors({
144
+ serverResponse: [
145
+ result.isConfirmed
146
+ ? 'Телефон уже подтверждён'
147
+ : 'Номер телефона не подтверждён или вход по нему невозможен. Обратитесь к вашему персональному менеджеру или войдите с использованием e-mail и пароля.',
148
+ ],
149
+ });
150
+ this.phoneControl.markAsTouched();
151
+ return false;
152
+ }
153
+ return true;
154
+ }), catchError((error) => {
155
+ if (error instanceof HttpErrorResponse) {
156
+ const errorResponse = error.error;
157
+ this.phoneControl.setErrors({ serverResponse: errorResponse.errors?.['phone'] ?? [errorResponse.message] });
158
+ }
159
+ return of(false);
160
+ }), startWith(null));
161
+ }
162
+ this.setHaveCode(false);
163
+ return of(false);
164
+ }), share());
165
+ this.setHaveCode(false);
166
+ }
167
+ /**
168
+ * Устанавливает состояние наличия кода подтверждения у пользователя.
169
+ *
170
+ * @param haveCode Признак того есть ли код подтверждения или нет.
171
+ */
172
+ setHaveCode(haveCode) {
173
+ this.haveCode = haveCode;
174
+ this.haveCodeChange.emit(haveCode);
175
+ }
176
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScVerificationPhoneCheckFormComponent, deps: [{ token: i1.ScVerificationService }, { token: FormGroupDirective }], target: i0.ɵɵFactoryTarget.Component }); }
177
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: ScVerificationPhoneCheckFormComponent, selector: "sc-verification-phone-check-form", inputs: { showCodeFields: "showCodeFields", readOnly: "readOnly", shouldBeBusy: "shouldBeBusy", shouldBeConfirmed: "shouldBeConfirmed", haveCode: "haveCode" }, outputs: { haveCodeChange: "haveCodeChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" *tuiLet=\"(loadingApproveCode$ | async) as loadingApproveCode\" class=\"flex flex-col gap-3\">\n <label tuiLabel>\u041D\u043E\u043C\u0435\u0440 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430\n <tui-input-phone formControlName=\"phone\" [readOnly]=\"readOnly\" [tuiTextfieldCustomContent]=\"checkingPhone\">\n \u041D\u043E\u043C\u0435\u0440 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430\n <input tuiTextfieldLegacy autocomplete=\"phone\" />\n </tui-input-phone>\n <tui-error formControlName=\"phone\" [error]=\"[] | tuiFieldError | async\"></tui-error>\n </label>\n <ng-container *ngIf=\"showCodeFields && form.enabled\">\n <label *ngIf=\"loadingApproveCode === false && haveCode\" tuiLabel>\u041A\u043E\u0434 \u0438\u0437 \u0421\u041C\u0421\n <tui-input formControlName=\"verificationCode\">\n \u041A\u043E\u0434 \u0438\u0437 \u0421\u041C\u0421\n <input tuiTextfieldLegacy [maskito]=\"verificationCodeMask\" autocomplete=\"new-password\" />\n </tui-input>\n <tui-error formControlName=\"verificationCode\" [error]=\"[] | tuiFieldError | async\"></tui-error>\n </label>\n\n <div *tuiLet=\"!!loadingApproveCode as loadingApproveCode\" class=\"flex gap-4 justify-center\">\n <button\n *ngIf=\"!haveCode\"\n tuiButton\n (click)=\"onSendCode.next()\"\n [disabled]=\"loadingApproveCode || !!!(phoneCheck$ | async) || phoneControl.invalid\"\n [loading]=\"loadingApproveCode\"\n iconStart=\"scIconLogIn\"\n >\n \u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043A\u043E\u0434\n </button>\n <button *ngIf=\"!loadingApproveCode && !haveCode\" tuiLink [pseudo]=\"true\" [disabled]=\"!!!(phoneCheck$ | async) || phoneControl.invalid\" (click)=\"setHaveCode(true)\">\n \u0423 \u043C\u0435\u043D\u044F \u0435\u0441\u0442\u044C \u043A\u043E\u0434\n </button>\n\n <ng-container *tuiLet=\"timer$ | async as timer\">\n <tui-loader *ngIf=\"haveCode\" [showLoader]=\"loadingApproveCode\">\n <button tuiLink [pseudo]=\"true\" [disabled]=\"loadingApproveCode || timer\" (click)=\"onSendCode.next()\">\n \u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u043A\u043E\u0434\n <ng-container *ngIf=\"timer\" class=\"!text-tui-base-08\">(\u0447\u0435\u0440\u0435\u0437 {{ timer }})</ng-container>\n </button>\n </tui-loader>\n </ng-container>\n </div>\n </ng-container>\n</form>\n\n<ng-template #checkingPhone>\n <tui-loader *ngIf=\"!!!(phoneCheck$ | async) && phoneControl.valid\" class=\"w-4 h-4\"> </tui-loader>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.TuiTextfieldComponent, selector: "input[tuiTextfieldLegacy], textarea[tuiTextfieldLegacy]" }, { kind: "component", type: i5.TuiInputComponent, selector: "tui-input" }, { kind: "directive", type: i5.TuiInputDirective, selector: "tui-input" }, { kind: "directive", type: i5.TuiTextfieldCustomContentDirective, selector: "[tuiTextfieldCustomContent]", inputs: ["tuiTextfieldCustomContent"] }, { kind: "directive", type: i6.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: i6.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i6.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i6.TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "directive", type: i7.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "component", type: i6.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "component", type: i5.TuiInputPhoneComponent, selector: "tui-input-phone", inputs: ["phoneMaskAfterCountryCode", "allowText", "search", "countryCode"], outputs: ["searchChange"] }, { kind: "directive", type: i5.TuiInputPhoneDirective, selector: "tui-input-phone" }, { kind: "directive", type: i8.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "component", type: i9.TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TuiFieldErrorPipe, name: "tuiFieldError" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
178
+ }
179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScVerificationPhoneCheckFormComponent, decorators: [{
180
+ type: Component,
181
+ args: [{ selector: 'sc-verification-phone-check-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" *tuiLet=\"(loadingApproveCode$ | async) as loadingApproveCode\" class=\"flex flex-col gap-3\">\n <label tuiLabel>\u041D\u043E\u043C\u0435\u0440 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430\n <tui-input-phone formControlName=\"phone\" [readOnly]=\"readOnly\" [tuiTextfieldCustomContent]=\"checkingPhone\">\n \u041D\u043E\u043C\u0435\u0440 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0430\n <input tuiTextfieldLegacy autocomplete=\"phone\" />\n </tui-input-phone>\n <tui-error formControlName=\"phone\" [error]=\"[] | tuiFieldError | async\"></tui-error>\n </label>\n <ng-container *ngIf=\"showCodeFields && form.enabled\">\n <label *ngIf=\"loadingApproveCode === false && haveCode\" tuiLabel>\u041A\u043E\u0434 \u0438\u0437 \u0421\u041C\u0421\n <tui-input formControlName=\"verificationCode\">\n \u041A\u043E\u0434 \u0438\u0437 \u0421\u041C\u0421\n <input tuiTextfieldLegacy [maskito]=\"verificationCodeMask\" autocomplete=\"new-password\" />\n </tui-input>\n <tui-error formControlName=\"verificationCode\" [error]=\"[] | tuiFieldError | async\"></tui-error>\n </label>\n\n <div *tuiLet=\"!!loadingApproveCode as loadingApproveCode\" class=\"flex gap-4 justify-center\">\n <button\n *ngIf=\"!haveCode\"\n tuiButton\n (click)=\"onSendCode.next()\"\n [disabled]=\"loadingApproveCode || !!!(phoneCheck$ | async) || phoneControl.invalid\"\n [loading]=\"loadingApproveCode\"\n iconStart=\"scIconLogIn\"\n >\n \u041F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043A\u043E\u0434\n </button>\n <button *ngIf=\"!loadingApproveCode && !haveCode\" tuiLink [pseudo]=\"true\" [disabled]=\"!!!(phoneCheck$ | async) || phoneControl.invalid\" (click)=\"setHaveCode(true)\">\n \u0423 \u043C\u0435\u043D\u044F \u0435\u0441\u0442\u044C \u043A\u043E\u0434\n </button>\n\n <ng-container *tuiLet=\"timer$ | async as timer\">\n <tui-loader *ngIf=\"haveCode\" [showLoader]=\"loadingApproveCode\">\n <button tuiLink [pseudo]=\"true\" [disabled]=\"loadingApproveCode || timer\" (click)=\"onSendCode.next()\">\n \u041F\u043E\u0432\u0442\u043E\u0440\u043D\u043E \u043E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u043A\u043E\u0434\n <ng-container *ngIf=\"timer\" class=\"!text-tui-base-08\">(\u0447\u0435\u0440\u0435\u0437 {{ timer }})</ng-container>\n </button>\n </tui-loader>\n </ng-container>\n </div>\n </ng-container>\n</form>\n\n<ng-template #checkingPhone>\n <tui-loader *ngIf=\"!!!(phoneCheck$ | async) && phoneControl.valid\" class=\"w-4 h-4\"> </tui-loader>\n</ng-template>\n" }]
182
+ }], ctorParameters: () => [{ type: i1.ScVerificationService }, { type: i3.FormGroupDirective, decorators: [{
183
+ type: Inject,
184
+ args: [FormGroupDirective]
185
+ }] }], propDecorators: { showCodeFields: [{
186
+ type: Input
187
+ }], readOnly: [{
188
+ type: Input
189
+ }], shouldBeBusy: [{
190
+ type: Input
191
+ }], shouldBeConfirmed: [{
192
+ type: Input
193
+ }], haveCode: [{
194
+ type: Input
195
+ }], haveCodeChange: [{
196
+ type: Output
197
+ }] } });
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtdmVyaWZpY2F0aW9uLXBob25lLWNoZWNrLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL3ZlcmlmaWNhdGlvbi92ZXJpZmljYXRpb24tcGhvbmUtY2hlY2stZm9ybS9zYy12ZXJpZmljYXRpb24tcGhvbmUtY2hlY2stZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvdmVyaWZpY2F0aW9uL3ZlcmlmaWNhdGlvbi1waG9uZS1jaGVjay1mb3JtL3NjLXZlcmlmaWNhdGlvbi1waG9uZS1jaGVjay1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdFQUFnRTtBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSCxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUczSyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7Ozs7Ozs7O0FBRTFEOztHQUVHO0FBTUgsTUFBTSxPQUFPLHFDQUFxQztJQUM5Qzs7T0FFRztJQUNILElBQ1cs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O1FBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7OEdBMU9RLHFDQUFxQyx1REFnSmxDLGtCQUFrQjtrR0FoSnJCLHFDQUFxQyx1UkNyQmxELDQ0RkErQ0E7OzJGRDFCYSxxQ0FBcUM7a0JBTGpELFNBQVM7K0JBQ0ksa0NBQWtDLG1CQUUzQix1QkFBdUIsQ0FBQyxNQUFNOzswQkFrSjFDLE1BQU07MkJBQUMsa0JBQWtCO3lDQTNJbkIsY0FBYztzQkFEeEIsS0FBSztnQkFpQkMsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBT0MsaUJBQWlCO3NCQUR2QixLQUFLO2dCQU9DLFFBQVE7c0JBRGQsS0FBSztnQkFPQyxjQUFjO3NCQURwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUsbG9kYXNoL3ByZWZlci1jb25zdGFudCAqL1xuXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hc2tpdG9PcHRpb25zIH0gZnJvbSAnQG1hc2tpdG8vY29yZSc7XG5pbXBvcnQgeyBTY1ZlcmlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IHR1aUNvbnRyb2xWYWx1ZSB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGVuZFdpdGgsIGZpbHRlciwgZmluYWxpemUsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHNjYW4sIHNoYXJlLCBzdGFydFdpdGgsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVdoaWxlLCB0YXAsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFwaUVycm9yUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hdXRoL2ludGVyZmFjZXMvYXBpLWVycm9yLXJlc3BvbnNlJztcbmltcG9ydCB7IHNjUGhvbmVWZXJpZmljYXRpb25Db2RlTWFzayB9IGZyb20gJy4uLy4uL21hc2tzJztcblxuLyoqXG4gKiDQmtC+0LzQv9C+0L3QtdC90YIg0YTQvtGA0LzRiyDQv9GA0L7QstC10YDQutC4INGC0LXQu9C10YTQvtC90LAg0Lgg0L/QvtC70YPRh9C10L3QuNGPINC60L7QtNCwINC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNGPLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NjLXZlcmlmaWNhdGlvbi1waG9uZS1jaGVjay1mb3JtJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2MtdmVyaWZpY2F0aW9uLXBob25lLWNoZWNrLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTY1ZlcmlmaWNhdGlvblBob25lQ2hlY2tGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiwg0YHQu9C10LTRg9C10YIg0LvQuCDQvtGC0L7QsdGA0LDQttCw0YLRjCDRhNGD0L3QutGG0LjQvtC90LDQuyDQutC+0LTQsCDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc2hvd0NvZGVGaWVsZHMoc2hvd0NvZGVGaWVsZHM6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2hvd0NvZGVGaWVsZHMgPSBzaG93Q29kZUZpZWxkcztcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLnZlcmlmaWNhdGlvbkNvZGVbc2hvd0NvZGVGaWVsZHMgPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ10oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiwg0YHQu9C10LTRg9C10YIg0LvQuCDQvtGC0L7QsdGA0LDQttCw0YLRjCDRhNGD0L3QutGG0LjQvtC90LDQuyDQutC+0LTQsCDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dDb2RlRmllbGRzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd0NvZGVGaWVsZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQv9C+0LvQtSDQstCy0L7QtNCwINGC0LXQu9C10YTQvtC90LAg0YLQvtC70YzQutC+INC00LvRjyDRh9GC0LXQvdC40Y8uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRgdC70LXQtNGD0LXRgiDQu9C4INGC0LXQu9C10YTQvtC90YMg0LHRi9GC0Ywg0LIg0YHQuNGB0YLQtdC80LUuINCe0YIg0Y3RgtC+0LPQviDQv9GA0LjQt9C90LDQutCwINC30LDQstC40YHQuNGCINCyINC60LDQutC40YUg0YHQu9GD0YfQsNGP0YUg0LLRi9C00LDQstCw0YLRjCDQvtGI0LjQsdC60YMg0L/RgNC4INC/0YDQvtCy0LXRgNC60Lgg0LfQsNC90Y/RgtC+0YHRgtC4INGC0LXQu9C10YTQvtC90LAuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2hvdWxkQmVCdXN5OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRgdC70LXQtNGD0LXRgiDQu9C4INC/0YDQvtCy0LXRgNGP0YLRjCDQv9C+0LTRgtCy0LXRgNC20LTRkdC9INC70Lgg0YLQtdC70LXRhNC+0L3QsCDQsiDRgdC40YHRgtC10LzQtS4g0J/RgNC4IGB0cnVlYCDQsdGD0LTQtdGCINCy0YvQt9GL0LLQsNGC0Ywg0L7RiNC40LHQutGDINC/0YDQuCDQvdCw0LvQuNGH0LjQtSDRgtC10LvQtdGE0L7QvdCwINCyINGB0LjRgdGC0LXQvNC1INCx0LXQtyDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG91bGRCZUNvbmZpcm1lZD86IGJvb2xlYW4gPSB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiDQndCw0LvQuNGH0LjQtSDQutC+0LTQsCDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjyDRgyDQv9C+0LvRjNC30L7QstCw0YLQtdC70Y8uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGF2ZUNvZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC00LvRjyDQvtCx0YDQsNGC0L3QvtC5INC/0YDQuNCy0Y/Qt9C60Lgg0L3QsNC70LjRh9C40Y8g0LrQvtC00LAg0L/QvtC00YLQstC10YDQttC00LXQvdC40Y9cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgaGF2ZUNvZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0LfQsNC/0YDQvtGB0LAg0L/RgNC+0LLQtdGA0LrQuCDQvdC+0LzQtdGA0LAg0YLQtdC70LXRhNC+0L3QsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGhvbmVDaGVjayQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBudWxsPjtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBTdWJqZWN0fSDRgdC+0LHRi9GC0LjRjyDQvtGC0L/RgNCw0LLQutC4INC60L7QtNCwINC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNGPLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBvblNlbmRDb2RlOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDQt9Cw0L/RgNC+0YHQsCDQtNCw0L3QvdGL0YUg0L/QvtC70YPRh9C10L3QuNGPINC60L7QtNCwINC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNGPLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBsb2FkaW5nQXBwcm92ZUNvZGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5vblNlbmRDb2RlLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB0aGlzLnBob25lQ29udHJvbC52YWx1ZSksXG4gICAgICAgIGZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdGhpcy5waG9uZUNvbnRyb2wudmFsaWQpLFxuICAgICAgICBzd2l0Y2hNYXAoKHZhbHVlKSA9PlxuICAgICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25TZXJ2aWNlLnNlbmRQaG9uZUFwcHJvdmVDb2RlKHZhbHVlKS5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkVGltZXIkLm5leHQoNjApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiBmYWxzZSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yUmVzcG9uc2UgPSBlcnJvci5lcnJvciBhcyBBcGlFcnJvclJlc3BvbnNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IC8oXFxkezJ9KTpcXGR7Mn0vO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBlcnJvclJlc3BvbnNlLm1lc3NhZ2UubWF0Y2gocmVnZXgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVQYXJ0cyA9IG1hdGNoWzBdLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vjb25kcyA9IE51bWJlci5wYXJzZUludCh0aW1lUGFydHNbMV0sIDEwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkVGltZXIkLm5leHQoc2Vjb25kcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGhvbmVDb250cm9sLnNldEVycm9ycyh7IHNlcnZlclJlc3BvbnNlOiBlcnJvclJlc3BvbnNlLmVycm9ycz8uWydwaG9uZSddID8/IFtlcnJvclJlc3BvbnNlLm1lc3NhZ2VdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGF2ZUNvZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKHRydWUpXG4gICAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHN0YXJ0V2l0aChmYWxzZSksXG4gICAgICAgIHNoYXJlKClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0JzQsNGB0LrQsCDQv9C+0LvRjyDQstCy0L7QtNCwINC60L7QtNCwINC00LvRjyDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgdmVyaWZpY2F0aW9uQ29kZU1hc2s6IE1hc2tpdG9PcHRpb25zID0gc2NQaG9uZVZlcmlmaWNhdGlvbkNvZGVNYXNrO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIFN1YmplY3R9INGB0L7QsdGL0YLQuNGPINC30LDQv9GD0YHQutCwL9C+0YHRgtCw0L3QvtCy0LrQuCDRgtCw0LnQvNC10YDQsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVsb2FkVGltZXIkOiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0KLQsNC50LzQtdGA0LAuXG4gICAgICpcbiAgICAgKiBUT0RPOiDQktGL0L3QtdGB0YLQuCDRgtCw0LnQvNC10YAg0LIg0L7RgtC00LXQu9GM0L3Rg9GOINC00LjRgNC10LrRgtC40LLRgyBUQVNLOlsjOTI2MF0uXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHRpbWVyJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiA9IHRoaXMucmVsb2FkVGltZXIkLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoc2VjKSA9PlxuICAgICAgICAgICAgdGltZXIoMCwgMTAwMCkucGlwZShcbiAgICAgICAgICAgICAgICBzY2FuKCh0b3RhbCkgPT4gLTEgKyB0b3RhbCwgc2VjKSxcbiAgICAgICAgICAgICAgICB0YWtlV2hpbGUoKHRvdGFsKSA9PiB0b3RhbCA+PSAwKSxcbiAgICAgICAgICAgICAgICBtYXAoKHRvdGFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHRvdGFsIC8gNjApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWNvbmRzID0gdG90YWwgJSA2MDtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtaW51dGVzKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7TWF0aC5yb3VuZChzZWNvbmRzKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBlbmRXaXRoKG51bGwpLFxuICAgICAgICAgICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGB0LvQtdC00YPQtdGCINC70Lgg0L7RgtC+0LHRgNCw0LbQsNGC0Ywg0YTRg9C90LrRhtC40L7QvdCw0Lsg0LrQvtC00LAg0L/QvtC00YLQstC10YDQttC00LXQvdC40Y8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2hvd0NvZGVGaWVsZHM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIHtAbGluayBTY1ZlcmlmaWNhdGlvblBob25lQ2hlY2tGb3JtQ29tcG9uZW50fS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJpZmljYXRpb25TZXJ2aWNlINCh0LXRgNCy0LjRgSDQstC10YDQuNGE0LjQutCw0YbQuNC4LlxuICAgICAqIEBwYXJhbSBmb3JtR3JvdXBEaXJlY3RpdmUg0JTQuNGA0LXQutGC0LjQstCwIGMgYEZvcm1Hcm91cGAg0LjQtyBET00uXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHZlcmlmaWNhdGlvblNlcnZpY2U6IFNjVmVyaWZpY2F0aW9uU2VydmljZSxcbiAgICAgICAgQEluamVjdChGb3JtR3JvdXBEaXJlY3RpdmUpXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUdyb3VwRGlyZWN0aXZlPzogRm9ybUdyb3VwRGlyZWN0aXZlXG4gICAgKSB7fVxuXG4gICAgLyoqXG4gICAgICog0JPRgNGD0L/Qv9CwINC/0L7Qu9C10Lkg0LLQstC+0LTQsCDQtNC70Y8g0YTQvtGA0LzRiyDCq9CS0YXQvtC0INC90LAg0YHQsNC50YLCuy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZvcm0oKTogRm9ybUdyb3VwPHtcbiAgICAgICAgcGhvbmU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xuICAgICAgICB2ZXJpZmljYXRpb25Db2RlOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcbiAgICB9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cERpcmVjdGl2ZT8uZm9ybSBhcyBGb3JtR3JvdXA8e1xuICAgICAgICAgICAgcGhvbmU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xuICAgICAgICAgICAgdmVyaWZpY2F0aW9uQ29kZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XG4gICAgICAgIH0+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0L7Qu9C1INCy0LLQvtC00LAgJ9Cd0L7QvNC10YAg0YLQtdC70LXRhNC+0L3QsCcuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaG9uZUNvbnRyb2woKTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmNvbnRyb2xzLnBob25lO1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5waG9uZUNoZWNrJCA9IHR1aUNvbnRyb2xWYWx1ZTxzdHJpbmcgfCBudWxsPih0aGlzLnBob25lQ29udHJvbCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWRUaW1lciQubmV4dCgwKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3dpdGNoTWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBob25lQ29udHJvbC52YWxpZCAmJiAhIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcmlmaWNhdGlvblNlcnZpY2UuZ2V0UGhvbmVDaGVjayQodmFsdWUpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZEJlQnVzeSAhPT0gcmVzdWx0LmlzQnVzeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBob25lQ29udHJvbC5zZXRFcnJvcnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUmVzcG9uc2U6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaXNCdXN5ID8gJ9Cf0L7Qu9GM0LfQvtCy0LDRgtC10LvRjCDRgSDRgtCw0LrQuNC8INC90L7QvNC10YDQvtC8INGC0LXQu9C10YTQvtC90LAg0YPQttC1INGB0YPRidC10YHRgtCy0YPQtdGCJyA6ICfQn9C+0LvRjNC30L7QstCw0YLQtdC70Y8g0YEg0YLQsNC60LjQvCDQvdC+0LzQtdGA0L7QvCDRgtC10LvQtdGE0L7QvdCwINC90LUg0YHRg9GJ0LXRgdGC0LLRg9C10YInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGhvbmVDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkQmVDb25maXJtZWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnNob3VsZEJlQ29uZmlybWVkICE9PSByZXN1bHQuaXNDb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waG9uZUNvbnRyb2wuc2V0RXJyb3JzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlzQ29uZmlybWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ9Ci0LXQu9C10YTQvtC9INGD0LbQtSDQv9C+0LTRgtCy0LXRgNC20LTRkdC9J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICfQndC+0LzQtdGAINGC0LXQu9C10YTQvtC90LAg0L3QtSDQv9C+0LTRgtCy0LXRgNC20LTRkdC9INC40LvQuCDQstGF0L7QtCDQv9C+INC90LXQvNGDINC90LXQstC+0LfQvNC+0LbQtdC9LiDQntCx0YDQsNGC0LjRgtC10YHRjCDQuiDQstCw0YjQtdC80YMg0L/QtdGA0YHQvtC90LDQu9GM0L3QvtC80YMg0LzQtdC90LXQtNC20LXRgNGDINC40LvQuCDQstC+0LnQtNC40YLQtSDRgSDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtdC8IGUtbWFpbCDQuCDQv9Cw0YDQvtC70Y8uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBob25lQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yUmVzcG9uc2UgPSBlcnJvci5lcnJvciBhcyBBcGlFcnJvclJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBob25lQ29udHJvbC5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogZXJyb3JSZXNwb25zZS5lcnJvcnM/LlsncGhvbmUnXSA/PyBbZXJyb3JSZXNwb25zZS5tZXNzYWdlXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFdpdGgobnVsbClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNldEhhdmVDb2RlKGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNldEhhdmVDb2RlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiDRgdC+0YHRgtC+0Y/QvdC40LUg0L3QsNC70LjRh9C40Y8g0LrQvtC00LAg0L/QvtC00YLQstC10YDQttC00LXQvdC40Y8g0YMg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPLlxuICAgICAqXG4gICAgICogQHBhcmFtIGhhdmVDb2RlINCf0YDQuNC30L3QsNC6INGC0L7Qs9C+INC10YHRgtGMINC70Lgg0LrQvtC0INC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNGPINC40LvQuCDQvdC10YIuXG4gICAgICovXG4gICAgcHVibGljIHNldEhhdmVDb2RlKGhhdmVDb2RlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGF2ZUNvZGUgPSBoYXZlQ29kZTtcbiAgICAgICAgdGhpcy5oYXZlQ29kZUNoYW5nZS5lbWl0KGhhdmVDb2RlKTtcbiAgICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAqdHVpTGV0PVwiKGxvYWRpbmdBcHByb3ZlQ29kZSQgfCBhc3luYykgYXMgbG9hZGluZ0FwcHJvdmVDb2RlXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgPGxhYmVsIHR1aUxhYmVsPtCd0L7QvNC10YAg0YLQtdC70LXRhNC+0L3QsFxuICAgICAgICA8dHVpLWlucHV0LXBob25lIGZvcm1Db250cm9sTmFtZT1cInBob25lXCIgW3JlYWRPbmx5XT1cInJlYWRPbmx5XCIgW3R1aVRleHRmaWVsZEN1c3RvbUNvbnRlbnRdPVwiY2hlY2tpbmdQaG9uZVwiPlxuICAgICAgICAgICAg0J3QvtC80LXRgCDRgtC10LvQtdGE0L7QvdCwXG4gICAgICAgICAgICA8aW5wdXQgdHVpVGV4dGZpZWxkTGVnYWN5IGF1dG9jb21wbGV0ZT1cInBob25lXCIgLz5cbiAgICAgICAgPC90dWktaW5wdXQtcGhvbmU+XG4gICAgICAgIDx0dWktZXJyb3IgZm9ybUNvbnRyb2xOYW1lPVwicGhvbmVcIiBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIj48L3R1aS1lcnJvcj5cbiAgICA8L2xhYmVsPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Q29kZUZpZWxkcyAmJiBmb3JtLmVuYWJsZWRcIj5cbiAgICAgICAgPGxhYmVsICpuZ0lmPVwibG9hZGluZ0FwcHJvdmVDb2RlID09PSBmYWxzZSAmJiBoYXZlQ29kZVwiIHR1aUxhYmVsPtCa0L7QtCDQuNC3INCh0JzQoVxuICAgICAgICAgICAgPHR1aS1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ2ZXJpZmljYXRpb25Db2RlXCI+XG4gICAgICAgICAgICAgICAg0JrQvtC0INC40Lcg0KHQnNChXG4gICAgICAgICAgICAgICAgPGlucHV0IHR1aVRleHRmaWVsZExlZ2FjeSBbbWFza2l0b109XCJ2ZXJpZmljYXRpb25Db2RlTWFza1wiIGF1dG9jb21wbGV0ZT1cIm5ldy1wYXNzd29yZFwiIC8+XG4gICAgICAgICAgICA8L3R1aS1pbnB1dD5cbiAgICAgICAgICAgIDx0dWktZXJyb3IgZm9ybUNvbnRyb2xOYW1lPVwidmVyaWZpY2F0aW9uQ29kZVwiIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiPjwvdHVpLWVycm9yPlxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIDxkaXYgKnR1aUxldD1cIiEhbG9hZGluZ0FwcHJvdmVDb2RlIGFzIGxvYWRpbmdBcHByb3ZlQ29kZVwiIGNsYXNzPVwiZmxleCBnYXAtNCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWhhdmVDb2RlXCJcbiAgICAgICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZW5kQ29kZS5uZXh0KClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nQXBwcm92ZUNvZGUgfHwgISEhKHBob25lQ2hlY2skIHwgYXN5bmMpIHx8IHBob25lQ29udHJvbC5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJsb2FkaW5nQXBwcm92ZUNvZGVcIlxuICAgICAgICAgICAgICAgIGljb25TdGFydD1cInNjSWNvbkxvZ0luXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICDQn9C+0LvRg9GH0LjRgtGMINC60L7QtFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWxvYWRpbmdBcHByb3ZlQ29kZSAmJiAhaGF2ZUNvZGVcIiB0dWlMaW5rIFtwc2V1ZG9dPVwidHJ1ZVwiIFtkaXNhYmxlZF09XCIhISEocGhvbmVDaGVjayQgfCBhc3luYykgfHwgcGhvbmVDb250cm9sLmludmFsaWRcIiAoY2xpY2spPVwic2V0SGF2ZUNvZGUodHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICDQoyDQvNC10L3RjyDQtdGB0YLRjCDQutC+0LRcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICp0dWlMZXQ9XCJ0aW1lciQgfCBhc3luYyBhcyB0aW1lclwiPlxuICAgICAgICAgICAgICAgIDx0dWktbG9hZGVyICpuZ0lmPVwiaGF2ZUNvZGVcIiBbc2hvd0xvYWRlcl09XCJsb2FkaW5nQXBwcm92ZUNvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0dWlMaW5rIFtwc2V1ZG9dPVwidHJ1ZVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nQXBwcm92ZUNvZGUgfHwgdGltZXJcIiAoY2xpY2spPVwib25TZW5kQ29kZS5uZXh0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgINCf0L7QstGC0L7RgNC90L4g0L7RgtC/0YDQsNCy0LjRgtGMINC60L7QtFxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRpbWVyXCIgY2xhc3M9XCIhdGV4dC10dWktYmFzZS0wOFwiPijRh9C10YDQtdC3IHt7IHRpbWVyIH19KTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L3R1aS1sb2FkZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2Zvcm0+XG5cbjxuZy10ZW1wbGF0ZSAjY2hlY2tpbmdQaG9uZT5cbiAgICA8dHVpLWxvYWRlciAqbmdJZj1cIiEhIShwaG9uZUNoZWNrJCB8IGFzeW5jKSAmJiBwaG9uZUNvbnRyb2wudmFsaWRcIiBjbGFzcz1cInctNCBoLTRcIj4gPC90dWktbG9hZGVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==