ng-easycommerce 0.0.594 → 0.0.595

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 (592) hide show
  1. package/README.md +915 -912
  2. package/assets/bamboo.html +145 -145
  3. package/assets/bancardCatastro.html +49 -49
  4. package/assets/bancardFrameBase.html +104 -104
  5. package/assets/cecaFrameRedirectBase.html +172 -172
  6. package/assets/decidirFormEc.html +516 -516
  7. package/assets/docs/COOKIES.md +158 -158
  8. package/assets/docs/Parametros-Frontend.md +56 -56
  9. package/assets/ec-i18n/ct.json +282 -282
  10. package/assets/ec-i18n/en.json +3 -1
  11. package/assets/ec-i18n/es.json +393 -391
  12. package/assets/ec-i18n/fr.json +0 -0
  13. package/assets/ec-i18n/gl.json +282 -282
  14. package/assets/ec-i18n/pr.json +282 -282
  15. package/assets/images/whatsapp.png +0 -0
  16. package/assets/mpFrameRedirectBase.html +114 -114
  17. package/assets/recaptcha/recaptcha-site-keys.json +3 -3
  18. package/assets/recaptcha/recaptcha-sites-prod.json +38 -38
  19. package/assets/recaptcha/recaptcha-sites.json +52 -52
  20. package/assets/redirect.html +62 -62
  21. package/assets/redsysAuthVdosBase.html +78 -78
  22. package/assets/redsysAuthVunoBase.html +84 -84
  23. package/assets/redsysFrameRedirectBase.html +102 -102
  24. package/assets/redsysFrameRedirectOutBase.html +102 -102
  25. package/assets/redsysFrameSendBase.html +71 -71
  26. package/assets/redsysProBase.html +399 -399
  27. package/assets/redsysStateBase.html +63 -63
  28. package/assets/scss/_colors.scss +17 -17
  29. package/assets/scss/_styles.scss +22 -22
  30. package/assets/svg/chevron-left-black.svg +61 -61
  31. package/assets/svg/chevron-right-black.svg +61 -61
  32. package/bundles/ng-easycommerce.umd.js +19241 -19230
  33. package/bundles/ng-easycommerce.umd.js.map +1 -1
  34. package/bundles/ng-easycommerce.umd.min.js +1 -1
  35. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  36. package/esm2015/lib/api/connection.service.js +77 -77
  37. package/esm2015/lib/classes/checkout/step-service.js +39 -39
  38. package/esm2015/lib/classes/checkout/step.js +22 -22
  39. package/esm2015/lib/classes/checkout-process-state.js +2 -2
  40. package/esm2015/lib/classes/component-helper.js +14 -14
  41. package/esm2015/lib/classes/filters/AttributesFilter.js +61 -61
  42. package/esm2015/lib/classes/filters/CategoryFilter.js +54 -54
  43. package/esm2015/lib/classes/filters/DinamycsFilter.js +58 -58
  44. package/esm2015/lib/classes/filters/Filter.js +75 -75
  45. package/esm2015/lib/classes/filters/PriceRangeFilter.js +51 -51
  46. package/esm2015/lib/classes/filters/SortFilter.js +79 -79
  47. package/esm2015/lib/classes/user-role-type.js +1 -1
  48. package/esm2015/lib/classes/user.js +108 -108
  49. package/esm2015/lib/core.consts.js +402 -402
  50. package/esm2015/lib/ec-component/account-ec/account-ec.component.js +45 -45
  51. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +112 -112
  52. package/esm2015/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +188 -188
  53. package/esm2015/lib/ec-component/auth-ec/auth-ec.component.js +115 -115
  54. package/esm2015/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +44 -44
  55. package/esm2015/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +58 -58
  56. package/esm2015/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +108 -108
  57. package/esm2015/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +166 -166
  58. package/esm2015/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +165 -165
  59. package/esm2015/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +78 -78
  60. package/esm2015/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +138 -138
  61. package/esm2015/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +110 -110
  62. package/esm2015/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +138 -138
  63. package/esm2015/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +38 -38
  64. package/esm2015/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +152 -152
  65. package/esm2015/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +119 -119
  66. package/esm2015/lib/ec-component/blocks-ec/blocks-ec.component.js +70 -70
  67. package/esm2015/lib/ec-component/build-your-ec/build-your-ec.component.js +305 -305
  68. package/esm2015/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +85 -85
  69. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +383 -383
  70. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +146 -146
  71. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +354 -354
  72. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +78 -78
  73. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +127 -127
  74. package/esm2015/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +112 -112
  75. package/esm2015/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +53 -53
  76. package/esm2015/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +65 -65
  77. package/esm2015/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +80 -80
  78. package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +220 -220
  79. package/esm2015/lib/ec-component/compared-products-ec/compared-products-ec.component.js +186 -186
  80. package/esm2015/lib/ec-component/cookies-ec/cookies-ec.component.js +109 -109
  81. package/esm2015/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +32 -32
  82. package/esm2015/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +34 -34
  83. package/esm2015/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +34 -34
  84. package/esm2015/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +35 -35
  85. package/esm2015/lib/ec-component/coupon-ec/coupon-ec.component.js +53 -53
  86. package/esm2015/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +49 -49
  87. package/esm2015/lib/ec-component/filters-ec/filters-ec.component.js +152 -152
  88. package/esm2015/lib/ec-component/filters-top-ec/filters-top-ec.component.js +102 -102
  89. package/esm2015/lib/ec-component/footer-ec/footer-ec.component.js +80 -80
  90. package/esm2015/lib/ec-component/header-ec/header-ec.component.js +186 -186
  91. package/esm2015/lib/ec-component/home-ec/home-ec.component.js +37 -37
  92. package/esm2015/lib/ec-component/index.js +241 -241
  93. package/esm2015/lib/ec-component/login-ec/login-ec.component.js +102 -102
  94. package/esm2015/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +90 -90
  95. package/esm2015/lib/ec-component/password-reset-ec/password-reset-ec.component.js +103 -103
  96. package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +165 -165
  97. package/esm2015/lib/ec-component/product-ec/product-ec.component.js +123 -123
  98. package/esm2015/lib/ec-component/related-products-ec/related-products-ec.component.js +94 -94
  99. package/esm2015/lib/ec-component/reviews-ec/reviews-ec.component.js +69 -69
  100. package/esm2015/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +138 -138
  101. package/esm2015/lib/ec-component/section-container-ec/section-container-ec.component.js +86 -86
  102. package/esm2015/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +130 -130
  103. package/esm2015/lib/ec-component/share-block-ec/share-block-ec.component.js +149 -149
  104. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +117 -117
  105. package/esm2015/lib/ec-component/stores-ec/stores-ec.component.js +192 -192
  106. package/esm2015/lib/ec-component/variants-ec/variants-ec.component.js +56 -56
  107. package/esm2015/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +205 -205
  108. package/esm2015/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +296 -296
  109. package/esm2015/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +154 -154
  110. package/esm2015/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +144 -144
  111. package/esm2015/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +49 -49
  112. package/esm2015/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +133 -133
  113. package/esm2015/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +152 -152
  114. package/esm2015/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +175 -175
  115. package/esm2015/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +30 -30
  116. package/esm2015/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +26 -26
  117. package/esm2015/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +21 -21
  118. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +156 -156
  119. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +368 -368
  120. package/esm2015/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +151 -151
  121. package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +178 -178
  122. package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +44 -44
  123. package/esm2015/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +83 -83
  124. package/esm2015/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +50 -50
  125. package/esm2015/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +90 -90
  126. package/esm2015/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +143 -143
  127. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +128 -128
  128. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +145 -145
  129. package/esm2015/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +167 -167
  130. package/esm2015/lib/ec-directive/add-action-redirect.directive.js +85 -85
  131. package/esm2015/lib/ec-directive/auth-wholesaler.directive.js +54 -54
  132. package/esm2015/lib/ec-directive/index.js +36 -36
  133. package/esm2015/lib/ec-directive/product-mini-standard.directive.js +65 -65
  134. package/esm2015/lib/ec-directive/product-off.directive.js +144 -144
  135. package/esm2015/lib/ec-directive/product-stock.directive.js +75 -75
  136. package/esm2015/lib/ec-directive/reload-view.directive.js +34 -34
  137. package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +72 -72
  138. package/esm2015/lib/ec-pipe/ec-sanitizer-html.pipe.js +26 -26
  139. package/esm2015/lib/ec-pipe/ec-sanitizer-url.pipe.js +26 -26
  140. package/esm2015/lib/ec-pipe/index.js +13 -13
  141. package/esm2015/lib/guards/able-buyer-guard.service.js +36 -36
  142. package/esm2015/lib/guards/auth-guard.service.js +36 -36
  143. package/esm2015/lib/guards/checkout-ready.service.js +36 -36
  144. package/esm2015/lib/guards/loggedin-guard.service.js +36 -36
  145. package/esm2015/lib/guards/user-role-guard.service.js +38 -38
  146. package/esm2015/lib/interceptors/auth.interceptor.js +55 -55
  147. package/esm2015/lib/interceptors/customer.interceptor.js +48 -48
  148. package/esm2015/lib/interfaces/Script.js +1 -1
  149. package/esm2015/lib/interfaces/analytics/event-key.model.js +1 -1
  150. package/esm2015/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  151. package/esm2015/lib/interfaces/analytics/gtm-config.js +1 -1
  152. package/esm2015/lib/interfaces/analytics/metricool-pixel.js +1 -1
  153. package/esm2015/lib/interfaces/block.js +1 -1
  154. package/esm2015/lib/interfaces/cart/cart-affordable.js +1 -1
  155. package/esm2015/lib/interfaces/checkout/checkout-error.js +1 -1
  156. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  157. package/esm2015/lib/interfaces/choose-options/filter-option.js +6 -6
  158. package/esm2015/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  159. package/esm2015/lib/interfaces/cookies.js +1 -1
  160. package/esm2015/lib/interfaces/core.interfaces.js +1 -1
  161. package/esm2015/lib/interfaces/coupon.js +1 -1
  162. package/esm2015/lib/interfaces/deserializable.js +1 -1
  163. package/esm2015/lib/interfaces/faqs.js +1 -1
  164. package/esm2015/lib/interfaces/filter.js +1 -1
  165. package/esm2015/lib/interfaces/filterStep.js +1 -1
  166. package/esm2015/lib/interfaces/observable-error.interface.js +1 -1
  167. package/esm2015/lib/interfaces/paginate.js +1 -1
  168. package/esm2015/lib/interfaces/parameters.js +1 -1
  169. package/esm2015/lib/interfaces/selection.js +4 -4
  170. package/esm2015/lib/interfaces/step.js +1 -1
  171. package/esm2015/lib/interfaces/store.js +1 -1
  172. package/esm2015/lib/ng-easycommerce.module.js +179 -179
  173. package/esm2015/lib/pipes/order-by.pipe.js +101 -101
  174. package/esm2015/lib/services/account/orders.service.js +102 -102
  175. package/esm2015/lib/services/analytics.service.js +57 -57
  176. package/esm2015/lib/services/auth.service.js +339 -339
  177. package/esm2015/lib/services/banner.service.js +72 -72
  178. package/esm2015/lib/services/blocks/blocks-repository.service.js +62 -62
  179. package/esm2015/lib/services/blocks/blocks.service.js +71 -71
  180. package/esm2015/lib/services/captcha.service.js +130 -130
  181. package/esm2015/lib/services/cart.service.js +572 -563
  182. package/esm2015/lib/services/channel-config.service.js +105 -105
  183. package/esm2015/lib/services/checkout/addressing.service.js +222 -222
  184. package/esm2015/lib/services/checkout/checkout.service.js +233 -233
  185. package/esm2015/lib/services/checkout/error-handler.service.js +81 -81
  186. package/esm2015/lib/services/checkout/payment.service.js +77 -77
  187. package/esm2015/lib/services/checkout/shipment.service.js +183 -183
  188. package/esm2015/lib/services/concatenated-associations.service.js +120 -120
  189. package/esm2015/lib/services/cookies.service.js +208 -208
  190. package/esm2015/lib/services/currency.service.js +161 -161
  191. package/esm2015/lib/services/dataform.service.js +46 -46
  192. package/esm2015/lib/services/filters.service.js +122 -122
  193. package/esm2015/lib/services/gift-card.service.js +61 -61
  194. package/esm2015/lib/services/ip-address.service.js +34 -34
  195. package/esm2015/lib/services/options.service.js +275 -275
  196. package/esm2015/lib/services/pagination.service.js +73 -73
  197. package/esm2015/lib/services/parameters.service.js +72 -72
  198. package/esm2015/lib/services/products/product-detail.service.js +429 -429
  199. package/esm2015/lib/services/products/products.service.js +287 -287
  200. package/esm2015/lib/services/reviews.service.js +107 -107
  201. package/esm2015/lib/services/stores.service.js +37 -37
  202. package/esm2015/lib/services/windows.service.js +52 -52
  203. package/esm2015/lib/services/wishlist.service.js +70 -70
  204. package/esm2015/lib/strategies/standard.strategy.js +43 -43
  205. package/esm2015/lib/utils/analytics/doppler.service.js +37 -37
  206. package/esm2015/lib/utils/analytics/facebook-pixel.service.js +141 -141
  207. package/esm2015/lib/utils/analytics/google-analytics.service.js +265 -265
  208. package/esm2015/lib/utils/analytics/gtm.service.js +341 -341
  209. package/esm2015/lib/utils/analytics/metricool-pixel.service.js +48 -48
  210. package/esm2015/lib/utils/options-of-product-list-data.service.js +96 -96
  211. package/esm2015/lib/utils/order-util.service.js +72 -72
  212. package/esm2015/lib/utils/payment-utils.service.js +35 -35
  213. package/esm2015/lib/utils/shipment-transformer.service.js +66 -66
  214. package/esm2015/lib/utils/toast.service.js +42 -42
  215. package/esm2015/lib/utils/utils.service.js +20 -20
  216. package/esm2015/ng-easycommerce.js +33 -33
  217. package/esm2015/public-api.js +146 -146
  218. package/esm5/lib/api/connection.service.js +90 -90
  219. package/esm5/lib/classes/checkout/step-service.js +74 -74
  220. package/esm5/lib/classes/checkout/step.js +25 -25
  221. package/esm5/lib/classes/checkout-process-state.js +2 -2
  222. package/esm5/lib/classes/component-helper.js +18 -18
  223. package/esm5/lib/classes/filters/AttributesFilter.js +79 -79
  224. package/esm5/lib/classes/filters/CategoryFilter.js +72 -72
  225. package/esm5/lib/classes/filters/DinamycsFilter.js +76 -76
  226. package/esm5/lib/classes/filters/Filter.js +78 -78
  227. package/esm5/lib/classes/filters/PriceRangeFilter.js +68 -68
  228. package/esm5/lib/classes/filters/SortFilter.js +97 -97
  229. package/esm5/lib/classes/user-role-type.js +1 -1
  230. package/esm5/lib/classes/user.js +120 -120
  231. package/esm5/lib/core.consts.js +422 -422
  232. package/esm5/lib/ec-component/account-ec/account-ec.component.js +62 -62
  233. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +166 -166
  234. package/esm5/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +205 -205
  235. package/esm5/lib/ec-component/auth-ec/auth-ec.component.js +132 -132
  236. package/esm5/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +60 -60
  237. package/esm5/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +74 -74
  238. package/esm5/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +125 -125
  239. package/esm5/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +183 -183
  240. package/esm5/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +182 -182
  241. package/esm5/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +106 -106
  242. package/esm5/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +166 -166
  243. package/esm5/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +138 -138
  244. package/esm5/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +165 -165
  245. package/esm5/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +54 -54
  246. package/esm5/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +180 -180
  247. package/esm5/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +146 -146
  248. package/esm5/lib/ec-component/blocks-ec/blocks-ec.component.js +90 -90
  249. package/esm5/lib/ec-component/build-your-ec/build-your-ec.component.js +327 -327
  250. package/esm5/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +112 -112
  251. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +467 -467
  252. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +163 -163
  253. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +439 -439
  254. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +95 -95
  255. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +217 -217
  256. package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +162 -162
  257. package/esm5/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +69 -69
  258. package/esm5/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +82 -82
  259. package/esm5/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +97 -97
  260. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +261 -261
  261. package/esm5/lib/ec-component/compared-products-ec/compared-products-ec.component.js +209 -209
  262. package/esm5/lib/ec-component/cookies-ec/cookies-ec.component.js +126 -126
  263. package/esm5/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +34 -34
  264. package/esm5/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +36 -36
  265. package/esm5/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +36 -36
  266. package/esm5/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +37 -37
  267. package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +71 -71
  268. package/esm5/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +66 -66
  269. package/esm5/lib/ec-component/filters-ec/filters-ec.component.js +168 -168
  270. package/esm5/lib/ec-component/filters-top-ec/filters-top-ec.component.js +118 -118
  271. package/esm5/lib/ec-component/footer-ec/footer-ec.component.js +109 -109
  272. package/esm5/lib/ec-component/header-ec/header-ec.component.js +245 -245
  273. package/esm5/lib/ec-component/home-ec/home-ec.component.js +53 -53
  274. package/esm5/lib/ec-component/index.js +241 -241
  275. package/esm5/lib/ec-component/login-ec/login-ec.component.js +118 -118
  276. package/esm5/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +106 -106
  277. package/esm5/lib/ec-component/password-reset-ec/password-reset-ec.component.js +119 -119
  278. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +192 -192
  279. package/esm5/lib/ec-component/product-ec/product-ec.component.js +141 -141
  280. package/esm5/lib/ec-component/related-products-ec/related-products-ec.component.js +111 -111
  281. package/esm5/lib/ec-component/reviews-ec/reviews-ec.component.js +85 -85
  282. package/esm5/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +155 -155
  283. package/esm5/lib/ec-component/section-container-ec/section-container-ec.component.js +103 -103
  284. package/esm5/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +149 -149
  285. package/esm5/lib/ec-component/share-block-ec/share-block-ec.component.js +166 -166
  286. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +120 -120
  287. package/esm5/lib/ec-component/stores-ec/stores-ec.component.js +214 -214
  288. package/esm5/lib/ec-component/variants-ec/variants-ec.component.js +72 -72
  289. package/esm5/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +221 -221
  290. package/esm5/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +313 -313
  291. package/esm5/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +170 -170
  292. package/esm5/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +160 -160
  293. package/esm5/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +83 -83
  294. package/esm5/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +149 -149
  295. package/esm5/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +156 -156
  296. package/esm5/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +192 -192
  297. package/esm5/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +46 -46
  298. package/esm5/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +42 -42
  299. package/esm5/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +23 -23
  300. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +174 -174
  301. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +396 -396
  302. package/esm5/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +167 -167
  303. package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +231 -231
  304. package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +60 -60
  305. package/esm5/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +100 -100
  306. package/esm5/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +53 -53
  307. package/esm5/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +124 -124
  308. package/esm5/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +159 -159
  309. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +144 -144
  310. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +162 -162
  311. package/esm5/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +181 -181
  312. package/esm5/lib/ec-directive/add-action-redirect.directive.js +104 -104
  313. package/esm5/lib/ec-directive/auth-wholesaler.directive.js +60 -60
  314. package/esm5/lib/ec-directive/index.js +36 -36
  315. package/esm5/lib/ec-directive/product-mini-standard.directive.js +72 -72
  316. package/esm5/lib/ec-directive/product-off.directive.js +163 -163
  317. package/esm5/lib/ec-directive/product-stock.directive.js +81 -81
  318. package/esm5/lib/ec-directive/reload-view.directive.js +35 -35
  319. package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +74 -74
  320. package/esm5/lib/ec-pipe/ec-sanitizer-html.pipe.js +27 -27
  321. package/esm5/lib/ec-pipe/ec-sanitizer-url.pipe.js +27 -27
  322. package/esm5/lib/ec-pipe/index.js +13 -13
  323. package/esm5/lib/guards/able-buyer-guard.service.js +37 -37
  324. package/esm5/lib/guards/auth-guard.service.js +37 -37
  325. package/esm5/lib/guards/checkout-ready.service.js +37 -37
  326. package/esm5/lib/guards/loggedin-guard.service.js +37 -37
  327. package/esm5/lib/guards/user-role-guard.service.js +39 -39
  328. package/esm5/lib/interceptors/auth.interceptor.js +57 -57
  329. package/esm5/lib/interceptors/customer.interceptor.js +50 -50
  330. package/esm5/lib/interfaces/Script.js +1 -1
  331. package/esm5/lib/interfaces/analytics/event-key.model.js +1 -1
  332. package/esm5/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  333. package/esm5/lib/interfaces/analytics/gtm-config.js +1 -1
  334. package/esm5/lib/interfaces/analytics/metricool-pixel.js +1 -1
  335. package/esm5/lib/interfaces/block.js +1 -1
  336. package/esm5/lib/interfaces/cart/cart-affordable.js +1 -1
  337. package/esm5/lib/interfaces/checkout/checkout-error.js +1 -1
  338. package/esm5/lib/interfaces/checkout-data.js +1 -1
  339. package/esm5/lib/interfaces/choose-options/filter-option.js +6 -6
  340. package/esm5/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  341. package/esm5/lib/interfaces/cookies.js +1 -1
  342. package/esm5/lib/interfaces/core.interfaces.js +1 -1
  343. package/esm5/lib/interfaces/coupon.js +1 -1
  344. package/esm5/lib/interfaces/deserializable.js +1 -1
  345. package/esm5/lib/interfaces/faqs.js +1 -1
  346. package/esm5/lib/interfaces/filter.js +1 -1
  347. package/esm5/lib/interfaces/filterStep.js +1 -1
  348. package/esm5/lib/interfaces/observable-error.interface.js +1 -1
  349. package/esm5/lib/interfaces/paginate.js +1 -1
  350. package/esm5/lib/interfaces/parameters.js +1 -1
  351. package/esm5/lib/interfaces/selection.js +4 -4
  352. package/esm5/lib/interfaces/step.js +1 -1
  353. package/esm5/lib/interfaces/store.js +1 -1
  354. package/esm5/lib/ng-easycommerce.module.js +183 -183
  355. package/esm5/lib/pipes/order-by.pipe.js +106 -106
  356. package/esm5/lib/services/account/orders.service.js +120 -120
  357. package/esm5/lib/services/analytics.service.js +60 -60
  358. package/esm5/lib/services/auth.service.js +413 -413
  359. package/esm5/lib/services/banner.service.js +81 -81
  360. package/esm5/lib/services/blocks/blocks-repository.service.js +94 -94
  361. package/esm5/lib/services/blocks/blocks.service.js +79 -79
  362. package/esm5/lib/services/captcha.service.js +132 -132
  363. package/esm5/lib/services/cart.service.js +701 -690
  364. package/esm5/lib/services/channel-config.service.js +107 -107
  365. package/esm5/lib/services/checkout/addressing.service.js +280 -280
  366. package/esm5/lib/services/checkout/checkout.service.js +316 -316
  367. package/esm5/lib/services/checkout/error-handler.service.js +83 -83
  368. package/esm5/lib/services/checkout/payment.service.js +125 -125
  369. package/esm5/lib/services/checkout/shipment.service.js +265 -265
  370. package/esm5/lib/services/concatenated-associations.service.js +162 -162
  371. package/esm5/lib/services/cookies.service.js +222 -222
  372. package/esm5/lib/services/currency.service.js +205 -205
  373. package/esm5/lib/services/dataform.service.js +48 -48
  374. package/esm5/lib/services/filters.service.js +125 -125
  375. package/esm5/lib/services/gift-card.service.js +63 -63
  376. package/esm5/lib/services/ip-address.service.js +35 -35
  377. package/esm5/lib/services/options.service.js +376 -376
  378. package/esm5/lib/services/pagination.service.js +79 -79
  379. package/esm5/lib/services/parameters.service.js +74 -74
  380. package/esm5/lib/services/products/product-detail.service.js +494 -494
  381. package/esm5/lib/services/products/products.service.js +345 -345
  382. package/esm5/lib/services/reviews.service.js +116 -116
  383. package/esm5/lib/services/stores.service.js +39 -39
  384. package/esm5/lib/services/windows.service.js +79 -79
  385. package/esm5/lib/services/wishlist.service.js +71 -71
  386. package/esm5/lib/strategies/standard.strategy.js +44 -44
  387. package/esm5/lib/utils/analytics/doppler.service.js +39 -39
  388. package/esm5/lib/utils/analytics/facebook-pixel.service.js +145 -145
  389. package/esm5/lib/utils/analytics/google-analytics.service.js +280 -280
  390. package/esm5/lib/utils/analytics/gtm.service.js +358 -358
  391. package/esm5/lib/utils/analytics/metricool-pixel.service.js +40 -40
  392. package/esm5/lib/utils/options-of-product-list-data.service.js +98 -98
  393. package/esm5/lib/utils/order-util.service.js +75 -75
  394. package/esm5/lib/utils/payment-utils.service.js +37 -37
  395. package/esm5/lib/utils/shipment-transformer.service.js +78 -78
  396. package/esm5/lib/utils/toast.service.js +61 -61
  397. package/esm5/lib/utils/utils.service.js +22 -22
  398. package/esm5/ng-easycommerce.js +33 -33
  399. package/esm5/public-api.js +146 -146
  400. package/fesm2015/ng-easycommerce.js +16252 -16243
  401. package/fesm2015/ng-easycommerce.js.map +1 -1
  402. package/fesm5/ng-easycommerce.js +19245 -19234
  403. package/fesm5/ng-easycommerce.js.map +1 -1
  404. package/lib/api/connection.service.d.ts +28 -28
  405. package/lib/classes/checkout/step-service.d.ts +28 -28
  406. package/lib/classes/checkout/step.d.ts +14 -14
  407. package/lib/classes/checkout-process-state.d.ts +12 -12
  408. package/lib/classes/component-helper.d.ts +8 -8
  409. package/lib/classes/filters/AttributesFilter.d.ts +18 -18
  410. package/lib/classes/filters/CategoryFilter.d.ts +17 -17
  411. package/lib/classes/filters/DinamycsFilter.d.ts +15 -15
  412. package/lib/classes/filters/Filter.d.ts +19 -19
  413. package/lib/classes/filters/PriceRangeFilter.d.ts +18 -18
  414. package/lib/classes/filters/SortFilter.d.ts +15 -15
  415. package/lib/classes/user-role-type.d.ts +5 -5
  416. package/lib/classes/user.d.ts +68 -68
  417. package/lib/core.consts.d.ts +211 -211
  418. package/lib/ec-component/account-ec/account-ec.component.d.ts +13 -13
  419. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +31 -31
  420. package/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.d.ts +82 -82
  421. package/lib/ec-component/auth-ec/auth-ec.component.d.ts +35 -35
  422. package/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +13 -13
  423. package/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +16 -16
  424. package/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.d.ts +26 -26
  425. package/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.d.ts +34 -34
  426. package/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.d.ts +42 -42
  427. package/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.d.ts +23 -23
  428. package/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.d.ts +34 -34
  429. package/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.d.ts +27 -27
  430. package/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.d.ts +34 -34
  431. package/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.d.ts +10 -10
  432. package/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.d.ts +40 -40
  433. package/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.d.ts +25 -25
  434. package/lib/ec-component/blocks-ec/blocks-ec.component.d.ts +24 -24
  435. package/lib/ec-component/build-your-ec/build-your-ec.component.d.ts +122 -122
  436. package/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.d.ts +41 -41
  437. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +52 -52
  438. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +42 -42
  439. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +92 -92
  440. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +20 -20
  441. package/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.d.ts +51 -51
  442. package/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.d.ts +34 -34
  443. package/lib/ec-component/checkout-ec/step-ec/step-ec.component.d.ts +18 -18
  444. package/lib/ec-component/checkout-ec/success-ec/success-ec.component.d.ts +32 -32
  445. package/lib/ec-component/checkout-error-ec/checkout-error-ec.component.d.ts +25 -25
  446. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +67 -67
  447. package/lib/ec-component/compared-products-ec/compared-products-ec.component.d.ts +70 -70
  448. package/lib/ec-component/cookies-ec/cookies-ec.component.d.ts +44 -44
  449. package/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.d.ts +10 -10
  450. package/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.d.ts +8 -8
  451. package/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.d.ts +9 -9
  452. package/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.d.ts +9 -9
  453. package/lib/ec-component/coupon-ec/coupon-ec.component.d.ts +17 -17
  454. package/lib/ec-component/faqs-content-ec/faqs-content-ec.component.d.ts +15 -15
  455. package/lib/ec-component/filters-ec/filters-ec.component.d.ts +33 -33
  456. package/lib/ec-component/filters-top-ec/filters-top-ec.component.d.ts +23 -23
  457. package/lib/ec-component/footer-ec/footer-ec.component.d.ts +30 -30
  458. package/lib/ec-component/header-ec/header-ec.component.d.ts +65 -65
  459. package/lib/ec-component/home-ec/home-ec.component.d.ts +13 -13
  460. package/lib/ec-component/index.d.ts +80 -80
  461. package/lib/ec-component/login-ec/login-ec.component.d.ts +26 -26
  462. package/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.d.ts +28 -28
  463. package/lib/ec-component/password-reset-ec/password-reset-ec.component.d.ts +27 -27
  464. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +58 -58
  465. package/lib/ec-component/product-ec/product-ec.component.d.ts +46 -46
  466. package/lib/ec-component/related-products-ec/related-products-ec.component.d.ts +22 -22
  467. package/lib/ec-component/reviews-ec/reviews-ec.component.d.ts +29 -29
  468. package/lib/ec-component/reviews-form-ec/reviews-form-ec.component.d.ts +61 -61
  469. package/lib/ec-component/section-container-ec/section-container-ec.component.d.ts +22 -22
  470. package/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.d.ts +37 -37
  471. package/lib/ec-component/share-block-ec/share-block-ec.component.d.ts +26 -26
  472. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +23 -23
  473. package/lib/ec-component/stores-ec/stores-ec.component.d.ts +54 -54
  474. package/lib/ec-component/variants-ec/variants-ec.component.d.ts +14 -14
  475. package/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.d.ts +60 -60
  476. package/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.d.ts +105 -105
  477. package/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.d.ts +46 -46
  478. package/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.d.ts +44 -44
  479. package/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.d.ts +14 -14
  480. package/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.d.ts +38 -38
  481. package/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.d.ts +38 -38
  482. package/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.d.ts +53 -53
  483. package/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.d.ts +6 -6
  484. package/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.d.ts +5 -5
  485. package/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.d.ts +5 -5
  486. package/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.d.ts +43 -43
  487. package/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.d.ts +64 -64
  488. package/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.d.ts +46 -46
  489. package/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.d.ts +41 -41
  490. package/lib/ec-component/widgets-ec/price-ec/price-ec.component.d.ts +12 -12
  491. package/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.d.ts +28 -28
  492. package/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.d.ts +24 -24
  493. package/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.d.ts +14 -14
  494. package/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.d.ts +44 -44
  495. package/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.d.ts +38 -38
  496. package/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.d.ts +42 -42
  497. package/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.d.ts +66 -66
  498. package/lib/ec-directive/add-action-redirect.directive.d.ts +26 -26
  499. package/lib/ec-directive/auth-wholesaler.directive.d.ts +17 -17
  500. package/lib/ec-directive/index.d.ts +6 -6
  501. package/lib/ec-directive/product-mini-standard.directive.d.ts +19 -19
  502. package/lib/ec-directive/product-off.directive.d.ts +22 -22
  503. package/lib/ec-directive/product-stock.directive.d.ts +15 -15
  504. package/lib/ec-directive/reload-view.directive.d.ts +8 -8
  505. package/lib/ec-pipe/ec-currency-symbol.pipe.d.ts +19 -19
  506. package/lib/ec-pipe/ec-sanitizer-html.pipe.d.ts +7 -7
  507. package/lib/ec-pipe/ec-sanitizer-url.pipe.d.ts +7 -7
  508. package/lib/ec-pipe/index.d.ts +4 -4
  509. package/lib/guards/able-buyer-guard.service.d.ts +8 -8
  510. package/lib/guards/auth-guard.service.d.ts +8 -8
  511. package/lib/guards/checkout-ready.service.d.ts +8 -8
  512. package/lib/guards/loggedin-guard.service.d.ts +8 -8
  513. package/lib/guards/user-role-guard.service.d.ts +8 -8
  514. package/lib/interceptors/auth.interceptor.d.ts +9 -9
  515. package/lib/interceptors/customer.interceptor.d.ts +9 -9
  516. package/lib/interfaces/Script.d.ts +5 -5
  517. package/lib/interfaces/analytics/event-key.model.d.ts +1 -1
  518. package/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.d.ts +5 -5
  519. package/lib/interfaces/analytics/gtm-config.d.ts +6 -6
  520. package/lib/interfaces/analytics/metricool-pixel.d.ts +3 -3
  521. package/lib/interfaces/block.d.ts +33 -33
  522. package/lib/interfaces/cart/cart-affordable.d.ts +8 -8
  523. package/lib/interfaces/cart-item.d.ts +8 -8
  524. package/lib/interfaces/checkout/checkout-error.d.ts +7 -7
  525. package/lib/interfaces/checkout-data.d.ts +6 -6
  526. package/lib/interfaces/choose-options/filter-option.d.ts +16 -16
  527. package/lib/interfaces/choose-options/options-of-product-list.d.ts +5 -5
  528. package/lib/interfaces/cookies.d.ts +49 -49
  529. package/lib/interfaces/core.interfaces.d.ts +4 -4
  530. package/lib/interfaces/coupon.d.ts +5 -5
  531. package/lib/interfaces/currencyConfig.d.ts +10 -10
  532. package/lib/interfaces/deserializable.d.ts +3 -3
  533. package/lib/interfaces/faqs.d.ts +12 -12
  534. package/lib/interfaces/filter.d.ts +51 -51
  535. package/lib/interfaces/filterStep.d.ts +29 -29
  536. package/lib/interfaces/navbar-items.d.ts +9 -9
  537. package/lib/interfaces/observable-error.interface.d.ts +5 -5
  538. package/lib/interfaces/paginate.d.ts +1 -1
  539. package/lib/interfaces/parameters.d.ts +10 -10
  540. package/lib/interfaces/paramsInterfaces/paramsProductsWithUniqueVariant.d.ts +6 -6
  541. package/lib/interfaces/product.d.ts +46 -46
  542. package/lib/interfaces/selection.d.ts +10 -10
  543. package/lib/interfaces/step.d.ts +8 -8
  544. package/lib/interfaces/store.d.ts +17 -17
  545. package/lib/ng-easycommerce.module.d.ts +5 -5
  546. package/lib/pipes/order-by.pipe.d.ts +5 -5
  547. package/lib/services/account/orders.service.d.ts +29 -29
  548. package/lib/services/analytics.service.d.ts +21 -21
  549. package/lib/services/auth.service.d.ts +116 -116
  550. package/lib/services/banner.service.d.ts +26 -26
  551. package/lib/services/blocks/blocks-repository.service.d.ts +19 -19
  552. package/lib/services/blocks/blocks.service.d.ts +25 -25
  553. package/lib/services/captcha.service.d.ts +76 -76
  554. package/lib/services/cart.service.d.ts +139 -139
  555. package/lib/services/channel-config.service.d.ts +35 -35
  556. package/lib/services/checkout/addressing.service.d.ts +239 -239
  557. package/lib/services/checkout/checkout.service.d.ts +71 -71
  558. package/lib/services/checkout/error-handler.service.d.ts +19 -19
  559. package/lib/services/checkout/payment.service.d.ts +32 -32
  560. package/lib/services/checkout/shipment.service.d.ts +58 -58
  561. package/lib/services/concatenated-associations.service.d.ts +57 -57
  562. package/lib/services/cookies.service.d.ts +66 -66
  563. package/lib/services/currency.service.d.ts +65 -65
  564. package/lib/services/dataform.service.d.ts +13 -13
  565. package/lib/services/filters.service.d.ts +48 -48
  566. package/lib/services/gift-card.service.d.ts +19 -19
  567. package/lib/services/ip-address.service.d.ts +10 -10
  568. package/lib/services/options.service.d.ts +61 -61
  569. package/lib/services/pagination.service.d.ts +30 -30
  570. package/lib/services/parameters.service.d.ts +18 -18
  571. package/lib/services/products/product-detail.service.d.ts +115 -115
  572. package/lib/services/products/products.service.d.ts +101 -101
  573. package/lib/services/reviews.service.d.ts +71 -71
  574. package/lib/services/stores.service.d.ts +11 -11
  575. package/lib/services/windows.service.d.ts +13 -13
  576. package/lib/services/wishlist.service.d.ts +13 -13
  577. package/lib/strategies/standard.strategy.d.ts +12 -12
  578. package/lib/utils/analytics/doppler.service.d.ts +9 -9
  579. package/lib/utils/analytics/facebook-pixel.service.d.ts +23 -23
  580. package/lib/utils/analytics/google-analytics.service.d.ts +30 -30
  581. package/lib/utils/analytics/gtm.service.d.ts +34 -34
  582. package/lib/utils/analytics/metricool-pixel.service.d.ts +9 -9
  583. package/lib/utils/options-of-product-list-data.service.d.ts +5 -5
  584. package/lib/utils/order-util.service.d.ts +12 -12
  585. package/lib/utils/payment-utils.service.d.ts +5 -5
  586. package/lib/utils/shipment-transformer.service.d.ts +8 -8
  587. package/lib/utils/toast.service.d.ts +15 -15
  588. package/lib/utils/utils.service.d.ts +4 -4
  589. package/ng-easycommerce.d.ts +33 -33
  590. package/ng-easycommerce.metadata.json +1 -1
  591. package/package.json +1 -1
  592. package/public-api.d.ts +144 -144
@@ -1,413 +1,413 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
13
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
- return c > 3 && r && Object.defineProperty(target, key, r), r;
17
- };
18
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
19
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
20
- return new (P || (P = Promise))(function (resolve, reject) {
21
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
22
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
24
- step((generator = generator.apply(thisArg, _arguments || [])).next());
25
- });
26
- };
27
- var __generator = (this && this.__generator) || function (thisArg, body) {
28
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
29
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
30
- function verb(n) { return function (v) { return step([n, v]); }; }
31
- function step(op) {
32
- if (f) throw new TypeError("Generator is already executing.");
33
- while (_) try {
34
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
35
- if (y = 0, t) op = [op[0] & 2, t.value];
36
- switch (op[0]) {
37
- case 0: case 1: t = op; break;
38
- case 4: _.label++; return { value: op[1], done: false };
39
- case 5: _.label++; y = op[1]; op = [0]; continue;
40
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
41
- default:
42
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
43
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
44
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
45
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
46
- if (t[2]) _.ops.pop();
47
- _.trys.pop(); continue;
48
- }
49
- op = body.call(thisArg, _);
50
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
51
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
52
- }
53
- };
54
- var __read = (this && this.__read) || function (o, n) {
55
- var m = typeof Symbol === "function" && o[Symbol.iterator];
56
- if (!m) return o;
57
- var i = m.call(o), r, ar = [], e;
58
- try {
59
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
60
- }
61
- catch (error) { e = { error: error }; }
62
- finally {
63
- try {
64
- if (r && !r.done && (m = i["return"])) m.call(i);
65
- }
66
- finally { if (e) throw e.error; }
67
- }
68
- return ar;
69
- };
70
- var __spread = (this && this.__spread) || function () {
71
- for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
72
- return ar;
73
- };
74
- import { Injectable, Injector } from '@angular/core';
75
- import { ConnectionService } from '../api/connection.service';
76
- import { Observable, BehaviorSubject, of } from 'rxjs';
77
- import { User } from '../classes/user';
78
- import 'rxjs/add/observable/of';
79
- import { ToastrService } from 'ngx-toastr';
80
- import { Constants } from '../core.consts';
81
- import { map, mapTo, catchError } from 'rxjs/operators';
82
- import * as moment from "moment";
83
- import { ChannelConfigService } from './channel-config.service';
84
- import { CartService } from './cart.service';
85
- import * as i0 from "@angular/core";
86
- import * as i1 from "../../public-api";
87
- import * as i2 from "ngx-toastr";
88
- var AuthService = /** @class */ (function () {
89
- function AuthService(connection, toastrService, constants, injector) {
90
- var _this = this;
91
- this.connection = connection;
92
- this.toastrService = toastrService;
93
- this.constants = constants;
94
- this.injector = injector;
95
- this.JWT_TOKEN = 'JWT_TOKEN';
96
- this.REFRESH_TOKEN = 'REFRESH_TOKEN';
97
- this.EXPIRATES_IN = 'EXPIRATES_IN';
98
- this.USER = 'USER';
99
- this.MAIL = 'mail';
100
- this.LOCALE = 'LOCALE';
101
- this.CHANNEL = 'CHANNEL';
102
- this.CUSTOMER = 'CUSTOMER';
103
- this.CHANNELSELLER = 'CHANNELSELLER';
104
- /* activeChannelSwitch? */
105
- this.activeChannelChange = false;
106
- this.loggedInSubject = new BehaviorSubject(false);
107
- this.loggingInSubject = new BehaviorSubject(false);
108
- this.userInSubject = new BehaviorSubject(null);
109
- this.channelsUserSubject = new BehaviorSubject([]);
110
- /* private customerSubject = new BehaviorSubject<any>(null) */
111
- this.user = null;
112
- // APIS
113
- this.tokenApi = function () { return 'shop-api/login_check'; };
114
- this.registerApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/register'; };
115
- this.registerWholesalerApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/register-wholesaler'; };
116
- this.confirmAccountApi = function (token) { return 'shop-api/' + _this.constants.getChannel() + '/verify-account?token=' + token; };
117
- this.resetPasswordApi = function (token) { return 'shop-api/' + _this.constants.getChannel() + '/password-reset/' + token; };
118
- this.recoverPasswordApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/request-password-reset'; };
119
- this.countriesApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/countries'; };
120
- // Atributos utiles
121
- this.waiting = false;
122
- this.loggedIn = this.loggedInSubject.asObservable();
123
- this.loggingIn = this.loggingInSubject.asObservable();
124
- this.userAuth = this.userInSubject.asObservable();
125
- this.channelsUser = this.channelsUserSubject.asObservable();
126
- /* private customer = this.channelsUserSubject.asObservable() */
127
- this.customer = null;
128
- this.channel = null;
129
- this.channels = [];
130
- this.homeResolver = null;
131
- this.channelAccessPermission = function (res) {
132
- var _a, _b, _c;
133
- _this.channelsUserSubject.next([]);
134
- /* Please remove this ASAP - Needs *channels* array in user object ALWAYS */
135
- /* if (UserRoleType.SELLER == res.type as UserRoleType) return true */
136
- /* No authorized channels */
137
- if (((_a = res.channels) === null || _a === void 0 ? void 0 : _a.length) == 0) {
138
- return false;
139
- }
140
- /* Some authorized channel(s) including current channel */
141
- if (res.channels.find(function (userchannel) { return userchannel.code === _this.channel.code; })) {
142
- /* Multiple authorized channels including current channel */
143
- if (((_b = res.channels) === null || _b === void 0 ? void 0 : _b.length) > 1 && _this.activeChannelChange)
144
- _this.channelsUserSubject.next(res.channels);
145
- return true;
146
- }
147
- /* One authorized channel not including current channel */
148
- if (((_c = res.channels) === null || _c === void 0 ? void 0 : _c.length) == 1 && _this.activeChannelChange) {
149
- delete res.password;
150
- _this.channelAccess(res.channels[0], res);
151
- return true;
152
- }
153
- /* Multiple authorized channels not including current channel */
154
- if (_this.activeChannelChange) {
155
- _this.channelsUserSubject.next(res.channels);
156
- return true;
157
- }
158
- return false;
159
- };
160
- this.channelAccess = function (channel, user) {
161
- if (user === void 0) { user = null; }
162
- if (window.location.hostname != channel.hostname) {
163
- var encoded = btoa(JSON.stringify(user != null ? user : _this.user));
164
- window.location.replace(window.location.protocol + "//" + channel.hostname + "/auth/redirect/" + encoded);
165
- }
166
- else {
167
- _this.constants.modifyChannelConfig(channel);
168
- window.location.reload();
169
- }
170
- };
171
- /**
172
- * @desc Devuelve una promesa
173
- * @param user Objeto que contiene username y password
174
- */
175
- this.doLogin = function (user) {
176
- _this.loggingInSubject.next(true);
177
- user = __assign(__assign({}, user), _this.constants.loginExtraData());
178
- return _this.connection.post(_this.tokenApi(), user).pipe(map(function (res) { return _this.doLoginUser(res); }), mapTo('ok'), catchError(function (err) {
179
- _this.loggingInSubject.next(false);
180
- return of(err.toString());
181
- })).toPromise();
182
- };
183
- this.signUp = function (data) { return _this.connection.post(_this.registerApi(), data); };
184
- this.confirmAccount = function (token) {
185
- return _this.connection.get(_this.confirmAccountApi(token));
186
- };
187
- this.passwordReset = function (new_password, token) {
188
- var data = { password: { first: new_password, second: new_password } };
189
- return _this.connection.put(_this.resetPasswordApi(token), data);
190
- };
191
- this.recoverPassword = function (email) {
192
- return _this.connection.put(_this.recoverPasswordApi(), { email: email });
193
- };
194
- this.isTokenExpired = function () {
195
- var fecha_expiracion = _this.getExpiratesAt();
196
- var result = moment() >= moment(fecha_expiracion);
197
- return result;
198
- };
199
- this.getExpiratesAt = function () { return localStorage.getItem(_this.EXPIRATES_IN); };
200
- this.hasToRefresh = function () { return _this.getRefreshToken(); };
201
- this.signUpWholesaler = function (data) { return _this.connection.post(_this.registerWholesalerApi(), data); };
202
- this.getCountriesData = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
203
- return [2 /*return*/, this.connection.get(this.countriesApi()).pipe(map(function (res) { return res._embedded.items; })).toPromise()];
204
- }); }); };
205
- this.setActiveChannelChange = function (activelyChangeChannelsOnLogin) { return _this.activeChannelChange = activelyChangeChannelsOnLogin; };
206
- this.isAllowedRole = function (allowedRoles, role) {
207
- return allowedRoles.length
208
- ? allowedRoles.includes(role)
209
- : true;
210
- };
211
- /* Please remove this ASAP - Needs *channels* array in user object ALWAYS */
212
- this.forceChannelsForSeller = function (tokens) {
213
- var _a;
214
- var _b;
215
- if ("seller" /* SELLER */ == tokens.type)
216
- ((_b = _this.channels) === null || _b === void 0 ? void 0 : _b.length) ? (_a = _this.user).setChannels.apply(_a, __spread(_this.channels)) : _this.user.setChannels(_this.channel);
217
- };
218
- /**
219
- * @description Cambia de canal
220
- * @param channelConfig debe ser un objeto que contenga al menos las keys channel y locale.
221
- */
222
- this.changeChannel = function (channelConfig) {
223
- _this.constants.modifyChannelConfig({
224
- channel: channelConfig.channel,
225
- locale: channelConfig.locale
226
- });
227
- };
228
- /**
229
- * @description Carga el cliente con el que se realizaran pedidos. Si recibe el valor null
230
- * se vuelve a cargar el vendedor para su uso.
231
- * @param customer
232
- */
233
- this.setCustomer = function (customer) {
234
- var refreshPage = false;
235
- _this.customer = customer;
236
- localStorage.setItem(_this.CUSTOMER, JSON.stringify(customer));
237
- var sameChannel = customer ? _this.sameChannel(customer.channels[0].code, customer.channels[0].locales.code) : null;
238
- if (customer) {
239
- if (!sameChannel) {
240
- !localStorage.getItem(_this.CHANNELSELLER) ?
241
- localStorage.setItem(_this.CHANNELSELLER, JSON.stringify({
242
- channel: _this.constants.getChannel(),
243
- locale: _this.constants.getLocale()
244
- })) : null;
245
- _this.changeChannel({
246
- channel: customer.channels[0].code,
247
- locale: customer.channels[0].locales.code
248
- });
249
- refreshPage = true;
250
- }
251
- }
252
- else {
253
- var res = JSON.parse(localStorage.getItem(_this.CHANNELSELLER));
254
- if (res) {
255
- if (!_this.sameChannel(res.channel, res.locale)) {
256
- _this.changeChannel(res);
257
- refreshPage = true;
258
- }
259
- localStorage.removeItem(_this.CHANNELSELLER);
260
- }
261
- }
262
- _this.injector.get(CartService).clearAndResetCustomerCart();
263
- refreshPage ? location.href = location.href : null;
264
- };
265
- /**
266
- * @description Comprueba si los valores del canal actual son iguales a los ingresado por parametros.
267
- * @param {string} channel Nombre del canal
268
- * @param {string} locale Locale del canal
269
- * @returns {boolean} True si es el mismo canal, False caso contrario.
270
- */
271
- this.sameChannel = function (channel, locale) { return (channel == _this.constants.getChannel()) && (locale == _this.constants.getLocale()); };
272
- /* public getCustomer = () => Observable.of(JSON.parse(localStorage.getItem(this.CUSTOMER))) */
273
- this.getCustomer = function () {
274
- /* this.customerSubject.next(JSON.parse(localStorage.getItem(this.CUSTOMER)))
275
- return this.customer */
276
- return _this.customer || JSON.parse(localStorage.getItem(_this.CUSTOMER));
277
- };
278
- this.setHomeResolver = function (resolverFunction) { return _this.homeResolver = resolverFunction; };
279
- this.getHomeResolver = function () { return _this.homeResolver; };
280
- this.isAbleToBuy = function () { var _a; return !((_a = _this.getUserProfileAsUser()) === null || _a === void 0 ? void 0 : _a.isSeller()) || !!_this.getCustomer(); };
281
- /**
282
- * @description Evalua si el valor que ingresa por parámetro es mayor o igual al mínimo de compra
283
- * que el usuario tiene asignado a ese canal, diferenciando si es mayorista o minorista.
284
- * @param {number} value
285
- * @returns {boolean} true si excede el monto, false caso contrario
286
- */
287
- this.exceedsMinimumAmount = function (value) {
288
- if (value === void 0) { value = 0; }
289
- return _this.user.isWholesaler() ? _this.user.channels.find(function (channel) { return _this.constants.getChannel() == channel.code; }).wholesalerMinimumPurchaseAmount <= value
290
- : _this.user.channels.find(function (channel) { return _this.constants.getChannel() == channel.code; }).retailerMinimumPurchaseAmount <= value;
291
- };
292
- this.isAuthenticated() && this.loggedInSubject.next(true);
293
- }
294
- /**
295
- * @desc Devuelve un observable
296
- * @param user Objeto que contiene username y password
297
- */
298
- AuthService.prototype.login = function (user, withRoles) {
299
- var _this = this;
300
- if (withRoles === void 0) { withRoles = []; }
301
- this.injector.get(ChannelConfigService).channelConfig$.subscribe(function (ch) { return _this.channel = ch; });
302
- this.injector.get(ChannelConfigService).channels.subscribe(function (ch) { return _this.channels = ch; });
303
- this.loggingInSubject.next(true);
304
- user = __assign(__assign({}, user), this.constants.loginExtraData());
305
- var result = this.connection.post(this.tokenApi(), user).pipe(map(function (res) {
306
- if (_this.channelAccessPermission(__assign(__assign({}, user), res)) && _this.isAllowedRole(withRoles, res.type)) {
307
- _this.doLoginUser(__assign(__assign({}, user), res));
308
- return 'ok';
309
- }
310
- return 'error';
311
- }), catchError(function (err) {
312
- _this.loggingInSubject.next(false);
313
- return of(err.toString());
314
- }));
315
- return result;
316
- };
317
- AuthService.prototype.getUserProfile = function () {
318
- return (this.user && Observable.of(this.user)) || this.getCurrentUser();
319
- };
320
- AuthService.prototype.getUserProfileAsUser = function () {
321
- return this.user || this.getCurrentUserAsUser();
322
- };
323
- AuthService.prototype.getCurrentUserAsUser = function () {
324
- var _this = this;
325
- var _a;
326
- this.user = new User();
327
- if (!this.user.loadFromStorage()) {
328
- this.user = null;
329
- }
330
- else if ((_a = this.user) === null || _a === void 0 ? void 0 : _a.channels.find(function (userchannel) { var _a; return ((_a = userchannel) === null || _a === void 0 ? void 0 : _a.code) === _this.constants.getChannel(); })) {
331
- return this.user;
332
- }
333
- else {
334
- this.logout();
335
- }
336
- return this.user;
337
- };
338
- AuthService.prototype.getCurrentUser = function () {
339
- this.user = new User();
340
- if (!this.user.loadFromStorage()) {
341
- this.user = null;
342
- }
343
- return Observable.of(this.user);
344
- };
345
- AuthService.prototype.isAuthenticated = function () {
346
- if (this.isTokenExpired()) {
347
- this.doLogoutUser();
348
- }
349
- this.getCurrentUserAsUser();
350
- this.userInSubject.next(this.user);
351
- return this.getToken() && !this.isTokenExpired() && this.user != null;
352
- };
353
- /* TOKEN */
354
- AuthService.prototype.logout = function () {
355
- this.doLogoutUser();
356
- };
357
- AuthService.prototype.refreshToken = function () {
358
- var _this = this;
359
- var data = __assign(__assign({}, this.constants.loginExtraData()), { refresh_token: this.getRefreshToken() });
360
- return this.connection.post(this.tokenApi(), data).pipe(map(function (res) { return _this.doLoginUser(res); }));
361
- };
362
- AuthService.prototype.getToken = function () {
363
- return localStorage.getItem(this.JWT_TOKEN);
364
- };
365
- AuthService.prototype.doLoginUser = function (tokens) {
366
- this.user = new User();
367
- this.user.initilized(tokens);
368
- this.forceChannelsForSeller(tokens);
369
- this.user.persistInStorage();
370
- localStorage.setItem(this.EXPIRATES_IN, moment(tokens.expires_in).add(1, 'h').format());
371
- localStorage.setItem(this.REFRESH_TOKEN, moment(tokens.expires_in).add(1, 'h').format());
372
- localStorage.setItem(this.JWT_TOKEN, tokens.token);
373
- localStorage.setItem(this.MAIL, tokens.username);
374
- this.userInSubject.next(this.user);
375
- this.loggedInSubject.next(true);
376
- this.loggingInSubject.next(false);
377
- };
378
- AuthService.prototype.doLogoutUser = function () {
379
- this.user = null;
380
- localStorage.removeItem(this.USER);
381
- localStorage.removeItem(this.EXPIRATES_IN);
382
- localStorage.removeItem(this.JWT_TOKEN);
383
- localStorage.removeItem(this.REFRESH_TOKEN);
384
- localStorage.removeItem('cart_token');
385
- localStorage.removeItem(this.MAIL);
386
- localStorage.removeItem(this.CHANNEL);
387
- localStorage.removeItem(this.CHANNELSELLER);
388
- localStorage.removeItem(this.LOCALE);
389
- localStorage.removeItem(this.CUSTOMER);
390
- localStorage.removeItem('MASTER_CHANNEL');
391
- this.loggedInSubject.next(false);
392
- this.userInSubject.next(this.user);
393
- this.channelsUserSubject.next([]);
394
- };
395
- AuthService.prototype.getRefreshToken = function () {
396
- return localStorage.getItem(this.REFRESH_TOKEN);
397
- };
398
- AuthService.ctorParameters = function () { return [
399
- { type: ConnectionService },
400
- { type: ToastrService },
401
- { type: Constants },
402
- { type: Injector }
403
- ]; };
404
- AuthService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AuthService_Factory() { return new i1.AuthService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i2.ToastrService), i0.ɵɵinject(i1.Constants), i0.ɵɵinject(i0.INJECTOR)); }, token: i1.AuthService, providedIn: "root" });
405
- AuthService = __decorate([
406
- Injectable({
407
- providedIn: 'root'
408
- })
409
- ], AuthService);
410
- return AuthService;
411
- }());
412
- export { AuthService };
413
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQU83QztJQTBDSSxxQkFBb0IsVUFBNkIsRUFDckMsYUFBNEIsRUFDNUIsU0FBb0IsRUFDcEIsUUFBa0I7UUFIOUIsaUJBTUM7UUFObUIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDckMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBM0NiLGNBQVMs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QUFZLENBQUMsQ0FBQztRQUN0QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxZQUFZLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUVPLHFDQUFlLEdBQXZCO1FBQ0ksT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRCxDQUFDOztnQkF6TStCLGlCQUFpQjtnQkFDdEIsYUFBYTtnQkFDakIsU0FBUztnQkFDVixRQUFROzs7SUE3Q3JCLFdBQVc7UUFIdkIsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztPQUNXLFdBQVcsQ0E2VnZCO3NCQS9XRDtDQStXQyxBQTdWRCxJQTZWQztTQTdWWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hcGkvY29ubmVjdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vY2xhc3Nlcy91c2VyJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vYnNlcnZhYmxlL29mJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi9jb3JlLmNvbnN0cyc7XHJcbmltcG9ydCB7IG1hcCwgbWFwVG8sIGNhdGNoRXJyb3IsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy1jb21wYXQvb3BlcmF0b3IvdGFrZSc7XHJcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBVc2VyUm9sZVR5cGUgfSBmcm9tICcuLi9jbGFzc2VzL3VzZXItcm9sZS10eXBlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgSldUX1RPS0VOID0gJ0pXVF9UT0tFTidcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgUkVGUkVTSF9UT0tFTiA9ICdSRUZSRVNIX1RPS0VOJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBFWFBJUkFURVNfSU4gPSAnRVhQSVJBVEVTX0lOJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBVU0VSID0gJ1VTRVInXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IE1BSUwgPSAnbWFpbCdcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgTE9DQUxFID0gJ0xPQ0FMRSdcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgQ0hBTk5FTCA9ICdDSEFOTkVMJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBDVVNUT01FUiA9ICdDVVNUT01FUidcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgQ0hBTk5FTFNFTExFUiA9ICdDSEFOTkVMU0VMTEVSJ1xyXG5cclxuICAgIC8qIGFjdGl2ZUNoYW5uZWxTd2l0Y2g/ICovXHJcbiAgICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxDaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgcHJpdmF0ZSBsb2dnZWRJblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oZmFsc2UpXHJcbiAgICBwcml2YXRlIGxvZ2dpbmdJblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oZmFsc2UpXHJcbiAgICBwcml2YXRlIHVzZXJJblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVzZXI+KG51bGwpXHJcbiAgICBwcml2YXRlIGNoYW5uZWxzVXNlclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSlcclxuICAgIC8qIHByaXZhdGUgY3VzdG9tZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpICovXHJcbiAgICBwcml2YXRlIHVzZXI6IFVzZXIgPSBudWxsXHJcblxyXG4gICAgLy8gQVBJU1xyXG4gICAgcHVibGljIHRva2VuQXBpID0gKCkgPT4gJ3Nob3AtYXBpL2xvZ2luX2NoZWNrJztcclxuICAgIHB1YmxpYyByZWdpc3RlckFwaSA9ICgpID0+ICdzaG9wLWFwaS8nICsgdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpICsgJy9yZWdpc3Rlcic7XHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJXaG9sZXNhbGVyQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3JlZ2lzdGVyLXdob2xlc2FsZXInO1xyXG4gICAgcHVibGljIGNvbmZpcm1BY2NvdW50QXBpID0gKHRva2VuKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RhbnRzLmdldENoYW5uZWwoKSArICcvdmVyaWZ5LWFjY291bnQ/dG9rZW49JyArIHRva2VuO1xyXG4gICAgcHVibGljIHJlc2V0UGFzc3dvcmRBcGkgPSAodG9rZW4pID0+ICdzaG9wLWFwaS8nICsgdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpICsgJy9wYXNzd29yZC1yZXNldC8nICsgdG9rZW47XHJcbiAgICBwdWJsaWMgcmVjb3ZlclBhc3N3b3JkQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQnO1xyXG4gICAgcHVibGljIGNvdW50cmllc0FwaSA9ICgpID0+ICdzaG9wLWFwaS8nICsgdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpICsgJy9jb3VudHJpZXMnO1xyXG5cclxuICAgIC8vIEF0cmlidXRvcyB1dGlsZXNcclxuICAgIHB1YmxpYyB3YWl0aW5nID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgbG9nZ2VkSW4gPSB0aGlzLmxvZ2dlZEluU3ViamVjdC5hc09ic2VydmFibGUoKVxyXG4gICAgcHVibGljIGxvZ2dpbmdJbiA9IHRoaXMubG9nZ2luZ0luU3ViamVjdC5hc09ic2VydmFibGUoKVxyXG4gICAgcHVibGljIHVzZXJBdXRoID0gdGhpcy51c2VySW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpXHJcbiAgICBwdWJsaWMgY2hhbm5lbHNVc2VyID0gdGhpcy5jaGFubmVsc1VzZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAvKiBwcml2YXRlIGN1c3RvbWVyID0gdGhpcy5jaGFubmVsc1VzZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpICovXHJcbiAgICBwcml2YXRlIGN1c3RvbWVyID0gbnVsbFxyXG4gICAgcHVibGljIGNoYW5uZWwgPSBudWxsXHJcbiAgICBwdWJsaWMgY2hhbm5lbHMgPSBbXVxyXG4gICAgcHJpdmF0ZSBob21lUmVzb2x2ZXIgPSBudWxsXHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0clNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb25zdGFudHM6IENvbnN0YW50cyxcclxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmxvZ2dlZEluU3ViamVjdC5uZXh0KHRydWUpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzYyBEZXZ1ZWx2ZSB1biBvYnNlcnZhYmxlXHJcbiAgICAgKiBAcGFyYW0gdXNlciBPYmpldG8gcXVlIGNvbnRpZW5lIHVzZXJuYW1lIHkgcGFzc3dvcmQgXHJcbiAgICAgKi9cclxuICAgIGxvZ2luKHVzZXI6IHsgdXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyB9LCB3aXRoUm9sZXM6IFVzZXJSb2xlVHlwZVtdID0gW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KENoYW5uZWxDb25maWdTZXJ2aWNlKS5jaGFubmVsQ29uZmlnJC5zdWJzY3JpYmUoY2ggPT4gdGhpcy5jaGFubmVsID0gY2gpXHJcbiAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoQ2hhbm5lbENvbmZpZ1NlcnZpY2UpLmNoYW5uZWxzLnN1YnNjcmliZShjaCA9PiB0aGlzLmNoYW5uZWxzID0gY2gpXHJcbiAgICAgICAgdGhpcy5sb2dnaW5nSW5TdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdXNlciA9IHsgLi4udXNlciwgLi4udGhpcy5jb25zdGFudHMubG9naW5FeHRyYURhdGEoKSB9O1xyXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnRva2VuQXBpKCksIHVzZXIpLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhbm5lbEFjY2Vzc1Blcm1pc3Npb24oeyAuLi51c2VyLCAuLi5yZXMgfSkgJiYgdGhpcy5pc0FsbG93ZWRSb2xlKHdpdGhSb2xlcywgcmVzLnR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0xvZ2luVXNlcih7IC4uLnVzZXIsIC4uLnJlcyB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2snXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Vycm9yJ1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnaW5nSW5TdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGVyci50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgIH1cclxuXHJcbiAgICBjaGFubmVsQWNjZXNzUGVybWlzc2lvbiA9IChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QubmV4dChbXSlcclxuXHJcbiAgICAgICAgLyogUGxlYXNlIHJlbW92ZSB0aGlzIEFTQVAgLSBOZWVkcyAqY2hhbm5lbHMqIGFycmF5IGluIHVzZXIgb2JqZWN0IEFMV0FZUyAqL1xyXG4gICAgICAgIC8qIGlmIChVc2VyUm9sZVR5cGUuU0VMTEVSID09IHJlcy50eXBlIGFzIFVzZXJSb2xlVHlwZSkgcmV0dXJuIHRydWUgKi9cclxuXHJcbiAgICAgICAgLyogTm8gYXV0aG9yaXplZCBjaGFubmVscyAqL1xyXG4gICAgICAgIGlmIChyZXMuY2hhbm5lbHM/Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICAvKiBTb21lIGF1dGhvcml6ZWQgY2hhbm5lbChzKSBpbmNsdWRpbmcgY3VycmVudCBjaGFubmVsICovXHJcbiAgICAgICAgaWYgKHJlcy5jaGFubmVscy5maW5kKHVzZXJjaGFubmVsID0+IHVzZXJjaGFubmVsLmNvZGUgPT09IHRoaXMuY2hhbm5lbC5jb2RlKSkge1xyXG4gICAgICAgICAgICAvKiBNdWx0aXBsZSBhdXRob3JpemVkIGNoYW5uZWxzIGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cclxuICAgICAgICAgICAgaWYgKHJlcy5jaGFubmVscz8ubGVuZ3RoID4gMSAmJiB0aGlzLmFjdGl2ZUNoYW5uZWxDaGFuZ2UpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QubmV4dChyZXMuY2hhbm5lbHMpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIE9uZSBhdXRob3JpemVkIGNoYW5uZWwgbm90IGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cclxuICAgICAgICBpZiAocmVzLmNoYW5uZWxzPy5sZW5ndGggPT0gMSAmJiB0aGlzLmFjdGl2ZUNoYW5uZWxDaGFuZ2UpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHJlcy5wYXNzd29yZFxyXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxBY2Nlc3MocmVzLmNoYW5uZWxzWzBdLCByZXMpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIE11bHRpcGxlIGF1dGhvcml6ZWQgY2hhbm5lbHMgbm90IGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVDaGFubmVsQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KHJlcy5jaGFubmVscylcclxuICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgY2hhbm5lbEFjY2VzcyA9IChjaGFubmVsLCB1c2VyID0gbnVsbCkgPT4ge1xyXG4gICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgIT0gY2hhbm5lbC5ob3N0bmFtZSkge1xyXG4gICAgICAgICAgICBsZXQgZW5jb2RlZCA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkodXNlciAhPSBudWxsID8gdXNlciA6IHRoaXMudXNlcikpXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKGAke3dpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0vLyR7Y2hhbm5lbC5ob3N0bmFtZX0vYXV0aC9yZWRpcmVjdC8ke2VuY29kZWR9YClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnN0YW50cy5tb2RpZnlDaGFubmVsQ29uZmlnKGNoYW5uZWwpXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjIERldnVlbHZlIHVuYSBwcm9tZXNhXHJcbiAgICAgKiBAcGFyYW0gdXNlciBPYmpldG8gcXVlIGNvbnRpZW5lIHVzZXJuYW1lIHkgcGFzc3dvcmQgXHJcbiAgICAgKi9cclxuICAgIGRvTG9naW4gPSAodXNlcjogeyB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nIH0pID0+IHtcclxuICAgICAgICB0aGlzLmxvZ2dpbmdJblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgICB1c2VyID0geyAuLi51c2VyLCAuLi50aGlzLmNvbnN0YW50cy5sb2dpbkV4dHJhRGF0YSgpIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMudG9rZW5BcGkoKSwgdXNlcikucGlwZShcclxuICAgICAgICAgICAgbWFwKHJlcyA9PiB0aGlzLmRvTG9naW5Vc2VyKHJlcykpLFxyXG4gICAgICAgICAgICBtYXBUbygnb2snKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnaW5nSW5TdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGVyci50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJQcm9maWxlKCk6IE9ic2VydmFibGU8VXNlcj4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy51c2VyICYmIE9ic2VydmFibGUub2YodGhpcy51c2VyKSkgfHwgdGhpcy5nZXRDdXJyZW50VXNlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJQcm9maWxlQXNVc2VyKCk6IFVzZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVzZXIgfHwgdGhpcy5nZXRDdXJyZW50VXNlckFzVXNlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJBc1VzZXIoKTogVXNlciB7XHJcbiAgICAgICAgdGhpcy51c2VyID0gbmV3IFVzZXIoKTtcclxuICAgICAgICBpZiAoIXRoaXMudXNlci5sb2FkRnJvbVN0b3JhZ2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXIgPSBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudXNlcj8uY2hhbm5lbHMuZmluZCh1c2VyY2hhbm5lbCA9PiB1c2VyY2hhbm5lbD8uY29kZSA9PT0gdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy51c2VyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nb3V0KClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEN1cnJlbnRVc2VyKCk6IE9ic2VydmFibGU8VXNlcj4ge1xyXG4gICAgICAgIHRoaXMudXNlciA9IG5ldyBVc2VyKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIubG9hZEZyb21TdG9yYWdlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy51c2VyID0gbnVsbFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZih0aGlzLnVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25VcCA9IChkYXRhKSA9PiB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnJlZ2lzdGVyQXBpKCksIGRhdGEpO1xyXG5cclxuICAgIGlzQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZCgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZG9Mb2dvdXRVc2VyKClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRDdXJyZW50VXNlckFzVXNlcigpXHJcbiAgICAgICAgdGhpcy51c2VySW5TdWJqZWN0Lm5leHQodGhpcy51c2VyKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbigpICYmICF0aGlzLmlzVG9rZW5FeHBpcmVkKCkgJiYgdGhpcy51c2VyICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlybUFjY291bnQgPSAodG9rZW46IHN0cmluZykgPT5cclxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZ2V0KHRoaXMuY29uZmlybUFjY291bnRBcGkodG9rZW4pKTtcclxuXHJcbiAgICBwYXNzd29yZFJlc2V0ID0gKG5ld19wYXNzd29yZCwgdG9rZW4pID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0geyBwYXNzd29yZDogeyBmaXJzdDogbmV3X3Bhc3N3b3JkLCBzZWNvbmQ6IG5ld19wYXNzd29yZCB9IH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5wdXQodGhpcy5yZXNldFBhc3N3b3JkQXBpKHRva2VuKSwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVjb3ZlclBhc3N3b3JkID0gKGVtYWlsOiBzdHJpbmcpID0+XHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnB1dCh0aGlzLnJlY292ZXJQYXNzd29yZEFwaSgpLCB7IGVtYWlsIH0pO1xyXG5cclxuICAgIC8qIFRPS0VOICovXHJcblxyXG4gICAgbG9nb3V0KCkge1xyXG4gICAgICAgIHRoaXMuZG9Mb2dvdXRVc2VyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFRva2VuKCkge1xyXG4gICAgICAgIGxldCBkYXRhID0geyAuLi50aGlzLmNvbnN0YW50cy5sb2dpbkV4dHJhRGF0YSgpLCByZWZyZXNoX3Rva2VuOiB0aGlzLmdldFJlZnJlc2hUb2tlbigpIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy50b2tlbkFwaSgpLCBkYXRhKS5waXBlKG1hcChcclxuICAgICAgICAgICAgcmVzID0+IHRoaXMuZG9Mb2dpblVzZXIocmVzKVxyXG4gICAgICAgICkpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG9rZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuSldUX1RPS0VOKTtcclxuICAgIH1cclxuXHJcbiAgICBpc1Rva2VuRXhwaXJlZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBmZWNoYV9leHBpcmFjaW9uID0gdGhpcy5nZXRFeHBpcmF0ZXNBdCgpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG1vbWVudCgpID49IG1vbWVudChmZWNoYV9leHBpcmFjaW9uKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEV4cGlyYXRlc0F0ID0gKCkgPT4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5FWFBJUkFURVNfSU4pO1xyXG5cclxuICAgIHB1YmxpYyBkb0xvZ2luVXNlcih0b2tlbnMpIHtcclxuICAgICAgICB0aGlzLnVzZXIgPSBuZXcgVXNlcigpXHJcbiAgICAgICAgdGhpcy51c2VyLmluaXRpbGl6ZWQodG9rZW5zKVxyXG4gICAgICAgIHRoaXMuZm9yY2VDaGFubmVsc0ZvclNlbGxlcih0b2tlbnMpXHJcbiAgICAgICAgdGhpcy51c2VyLnBlcnNpc3RJblN0b3JhZ2UoKVxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuRVhQSVJBVEVTX0lOLCBtb21lbnQodG9rZW5zLmV4cGlyZXNfaW4pLmFkZCgxLCAnaCcpLmZvcm1hdCgpKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlJFRlJFU0hfVE9LRU4sIG1vbWVudCh0b2tlbnMuZXhwaXJlc19pbikuYWRkKDEsICdoJykuZm9ybWF0KCkpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuSldUX1RPS0VOLCB0b2tlbnMudG9rZW4pO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuTUFJTCwgdG9rZW5zLnVzZXJuYW1lKTtcclxuICAgICAgICB0aGlzLnVzZXJJblN1YmplY3QubmV4dCh0aGlzLnVzZXIpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VkSW5TdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5sb2dnaW5nSW5TdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkb0xvZ291dFVzZXIoKSB7XHJcbiAgICAgICAgdGhpcy51c2VyID0gbnVsbFxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuVVNFUik7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5FWFBJUkFURVNfSU4pO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuSldUX1RPS0VOKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlJFRlJFU0hfVE9LRU4pO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjYXJ0X3Rva2VuJyk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5NQUlMKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUwpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUik7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5MT0NBTEUpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ1VTVE9NRVIpO1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdNQVNURVJfQ0hBTk5FTCcpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VkSW5TdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMudXNlckluU3ViamVjdC5uZXh0KHRoaXMudXNlcik7XHJcbiAgICAgICAgdGhpcy5jaGFubmVsc1VzZXJTdWJqZWN0Lm5leHQoW10pXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRSZWZyZXNoVG9rZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTik7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzVG9SZWZyZXNoID0gKCkgPT4gdGhpcy5nZXRSZWZyZXNoVG9rZW4oKTtcclxuXHJcbiAgICBzaWduVXBXaG9sZXNhbGVyID0gKGRhdGEpID0+IHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMucmVnaXN0ZXJXaG9sZXNhbGVyQXBpKCksIGRhdGEpO1xyXG5cclxuICAgIGdldENvdW50cmllc0RhdGEgPSBhc3luYyAoKSA9PlxyXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXQodGhpcy5jb3VudHJpZXNBcGkoKSkucGlwZShtYXAocmVzID0+IHJlcy5fZW1iZWRkZWQuaXRlbXMpKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICBwdWJsaWMgc2V0QWN0aXZlQ2hhbm5lbENoYW5nZSA9IChhY3RpdmVseUNoYW5nZUNoYW5uZWxzT25Mb2dpbjogYm9vbGVhbikgPT4gdGhpcy5hY3RpdmVDaGFubmVsQ2hhbmdlID0gYWN0aXZlbHlDaGFuZ2VDaGFubmVsc09uTG9naW5cclxuXHJcbiAgICBwcml2YXRlIGlzQWxsb3dlZFJvbGUgPSAoYWxsb3dlZFJvbGVzOiBVc2VyUm9sZVR5cGVbXSwgcm9sZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGFsbG93ZWRSb2xlcy5sZW5ndGhcclxuICAgICAgICAgICAgPyBhbGxvd2VkUm9sZXMuaW5jbHVkZXMocm9sZSBhcyBVc2VyUm9sZVR5cGUpXHJcbiAgICAgICAgICAgIDogdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8qIFBsZWFzZSByZW1vdmUgdGhpcyBBU0FQIC0gTmVlZHMgKmNoYW5uZWxzKiBhcnJheSBpbiB1c2VyIG9iamVjdCBBTFdBWVMgKi9cclxuICAgIHByaXZhdGUgZm9yY2VDaGFubmVsc0ZvclNlbGxlciA9IHRva2VucyA9PiB7XHJcbiAgICAgICAgaWYgKFVzZXJSb2xlVHlwZS5TRUxMRVIgPT0gdG9rZW5zLnR5cGUgYXMgVXNlclJvbGVUeXBlKVxyXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzPy5sZW5ndGhcclxuICAgICAgICAgICAgICAgID8gdGhpcy51c2VyLnNldENoYW5uZWxzKC4uLnRoaXMuY2hhbm5lbHMpXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMudXNlci5zZXRDaGFubmVscyh0aGlzLmNoYW5uZWwpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2FtYmlhIGRlIGNhbmFsXHJcbiAgICAgKiBAcGFyYW0gY2hhbm5lbENvbmZpZyBkZWJlIHNlciB1biBvYmpldG8gcXVlIGNvbnRlbmdhIGFsIG1lbm9zIGxhcyBrZXlzIGNoYW5uZWwgeSBsb2NhbGUuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2hhbmdlQ2hhbm5lbCA9IChjaGFubmVsQ29uZmlnOmFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY29uc3RhbnRzLm1vZGlmeUNoYW5uZWxDb25maWcoe1xyXG4gICAgICAgICAgICBjaGFubmVsOiBjaGFubmVsQ29uZmlnLmNoYW5uZWwsXHJcbiAgICAgICAgICAgIGxvY2FsZTogY2hhbm5lbENvbmZpZy5sb2NhbGVcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENhcmdhIGVsIGNsaWVudGUgY29uIGVsIHF1ZSBzZSByZWFsaXphcmFuIHBlZGlkb3MuIFNpIHJlY2liZSBlbCB2YWxvciBudWxsXHJcbiAgICAgKiBzZSB2dWVsdmUgYSBjYXJnYXIgZWwgdmVuZGVkb3IgcGFyYSBzdSB1c28uICBcclxuICAgICAqIEBwYXJhbSBjdXN0b21lciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEN1c3RvbWVyID0gY3VzdG9tZXIgPT4ge1xyXG4gICAgICAgIGxldCByZWZyZXNoUGFnZSA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy5jdXN0b21lciA9IGN1c3RvbWVyXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5DVVNUT01FUiwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tZXIpKVxyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBzYW1lQ2hhbm5lbCA9IGN1c3RvbWVyID8gdGhpcy5zYW1lQ2hhbm5lbChjdXN0b21lci5jaGFubmVsc1swXS5jb2RlLCBjdXN0b21lci5jaGFubmVsc1swXS5sb2NhbGVzLmNvZGUpIDogbnVsbFxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChjdXN0b21lcikge1xyXG4gICAgICAgICAgICBpZighc2FtZUNoYW5uZWwpe1xyXG4gICAgICAgICAgICAgICAgIWxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUikgP1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUiwgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsOiB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5jb25zdGFudHMuZ2V0TG9jYWxlKClcclxuICAgICAgICAgICAgICAgICAgICB9KSkgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDaGFubmVsKHtcclxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsOiBjdXN0b21lci5jaGFubmVsc1swXS5jb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogY3VzdG9tZXIuY2hhbm5lbHNbMF0ubG9jYWxlcy5jb2RlXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UgPSB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcmVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUxTRUxMRVIpKVxyXG4gICAgICAgICAgICBpZihyZXMpe1xyXG4gICAgICAgICAgICAgICAgaWYoIXRoaXMuc2FtZUNoYW5uZWwocmVzLmNoYW5uZWwsIHJlcy5sb2NhbGUpKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUNoYW5uZWwocmVzKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5DSEFOTkVMU0VMTEVSKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluamVjdG9yLmdldChDYXJ0U2VydmljZSkuY2xlYXJBbmRSZXNldEN1c3RvbWVyQ2FydCgpXHJcbiAgICAgICAgcmVmcmVzaFBhZ2UgPyBsb2NhdGlvbi5ocmVmID0gbG9jYXRpb24uaHJlZiA6IG51bGxcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDb21wcnVlYmEgc2kgbG9zIHZhbG9yZXMgZGVsIGNhbmFsIGFjdHVhbCBzb24gaWd1YWxlcyBhIGxvcyBpbmdyZXNhZG8gcG9yIHBhcmFtZXRyb3MuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCBOb21icmUgZGVsIGNhbmFsXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlICBMb2NhbGUgZGVsIGNhbmFsXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBzaSBlcyBlbCBtaXNtbyBjYW5hbCwgRmFsc2UgY2FzbyBjb250cmFyaW8uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2FtZUNoYW5uZWwgPSAoY2hhbm5lbDpzdHJpbmcsIGxvY2FsZTpzdHJpbmcpOmJvb2xlYW4gPT4gKGNoYW5uZWwgPT0gdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpKSAmJiAobG9jYWxlID09IHRoaXMuY29uc3RhbnRzLmdldExvY2FsZSgpKVxyXG5cclxuICAgIC8qIHB1YmxpYyBnZXRDdXN0b21lciA9ICgpID0+IE9ic2VydmFibGUub2YoSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVU1RPTUVSKSkpICovXHJcblxyXG4gICAgcHVibGljIGdldEN1c3RvbWVyID0gKCkgPT4ge1xyXG4gICAgICAgIC8qIHRoaXMuY3VzdG9tZXJTdWJqZWN0Lm5leHQoSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVU1RPTUVSKSkpXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tZXIgKi9cclxuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21lciB8fCBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ1VTVE9NRVIpKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRIb21lUmVzb2x2ZXIgPSByZXNvbHZlckZ1bmN0aW9uID0+IHRoaXMuaG9tZVJlc29sdmVyID0gcmVzb2x2ZXJGdW5jdGlvblxyXG5cclxuICAgIHB1YmxpYyBnZXRIb21lUmVzb2x2ZXIgPSAoKSA9PiB0aGlzLmhvbWVSZXNvbHZlclxyXG5cclxuICAgIHB1YmxpYyBpc0FibGVUb0J1eSA9ICgpOiBib29sZWFuID0+ICF0aGlzLmdldFVzZXJQcm9maWxlQXNVc2VyKCk/LmlzU2VsbGVyKCkgfHwgISF0aGlzLmdldEN1c3RvbWVyKClcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFdmFsdWEgc2kgZWwgdmFsb3IgcXVlIGluZ3Jlc2EgcG9yIHBhcsOhbWV0cm8gZXMgbWF5b3IgbyBpZ3VhbCBhbCBtw61uaW1vIGRlIGNvbXByYVxyXG4gICAgICogcXVlIGVsIHVzdWFyaW8gdGllbmUgYXNpZ25hZG8gYSBlc2UgY2FuYWwsIGRpZmVyZW5jaWFuZG8gc2kgZXMgbWF5b3Jpc3RhIG8gbWlub3Jpc3RhLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgc2kgZXhjZWRlIGVsIG1vbnRvLCBmYWxzZSBjYXNvIGNvbnRyYXJpb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhjZWVkc01pbmltdW1BbW91bnQgPSAodmFsdWU6bnVtYmVyPTApOmJvb2xlYW4gPT4gIFxyXG4gICAgICAgIHRoaXMudXNlci5pc1dob2xlc2FsZXIoKSA/IHRoaXMudXNlci5jaGFubmVscy5maW5kKCBjaGFubmVsID0+IHRoaXMuY29uc3RhbnRzLmdldENoYW5uZWwoKSA9PSBjaGFubmVsLmNvZGUpLndob2xlc2FsZXJNaW5pbXVtUHVyY2hhc2VBbW91bnQgPD0gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnVzZXIuY2hhbm5lbHMuZmluZCggY2hhbm5lbCA9PiB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgPT0gY2hhbm5lbC5jb2RlKS5yZXRhaWxlck1pbmltdW1QdXJjaGFzZUFtb3VudCA8PSB2YWx1ZVxyXG59Il19
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
13
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
17
+ };
18
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
19
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
20
+ return new (P || (P = Promise))(function (resolve, reject) {
21
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
22
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
24
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
25
+ });
26
+ };
27
+ var __generator = (this && this.__generator) || function (thisArg, body) {
28
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
29
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
30
+ function verb(n) { return function (v) { return step([n, v]); }; }
31
+ function step(op) {
32
+ if (f) throw new TypeError("Generator is already executing.");
33
+ while (_) try {
34
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
35
+ if (y = 0, t) op = [op[0] & 2, t.value];
36
+ switch (op[0]) {
37
+ case 0: case 1: t = op; break;
38
+ case 4: _.label++; return { value: op[1], done: false };
39
+ case 5: _.label++; y = op[1]; op = [0]; continue;
40
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
41
+ default:
42
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
43
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
44
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
45
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
46
+ if (t[2]) _.ops.pop();
47
+ _.trys.pop(); continue;
48
+ }
49
+ op = body.call(thisArg, _);
50
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
51
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
52
+ }
53
+ };
54
+ var __read = (this && this.__read) || function (o, n) {
55
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
56
+ if (!m) return o;
57
+ var i = m.call(o), r, ar = [], e;
58
+ try {
59
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
60
+ }
61
+ catch (error) { e = { error: error }; }
62
+ finally {
63
+ try {
64
+ if (r && !r.done && (m = i["return"])) m.call(i);
65
+ }
66
+ finally { if (e) throw e.error; }
67
+ }
68
+ return ar;
69
+ };
70
+ var __spread = (this && this.__spread) || function () {
71
+ for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
72
+ return ar;
73
+ };
74
+ import { Injectable, Injector } from '@angular/core';
75
+ import { ConnectionService } from '../api/connection.service';
76
+ import { Observable, BehaviorSubject, of } from 'rxjs';
77
+ import { User } from '../classes/user';
78
+ import 'rxjs/add/observable/of';
79
+ import { ToastrService } from 'ngx-toastr';
80
+ import { Constants } from '../core.consts';
81
+ import { map, mapTo, catchError } from 'rxjs/operators';
82
+ import * as moment from "moment";
83
+ import { ChannelConfigService } from './channel-config.service';
84
+ import { CartService } from './cart.service';
85
+ import * as i0 from "@angular/core";
86
+ import * as i1 from "../../public-api";
87
+ import * as i2 from "ngx-toastr";
88
+ var AuthService = /** @class */ (function () {
89
+ function AuthService(connection, toastrService, constants, injector) {
90
+ var _this = this;
91
+ this.connection = connection;
92
+ this.toastrService = toastrService;
93
+ this.constants = constants;
94
+ this.injector = injector;
95
+ this.JWT_TOKEN = 'JWT_TOKEN';
96
+ this.REFRESH_TOKEN = 'REFRESH_TOKEN';
97
+ this.EXPIRATES_IN = 'EXPIRATES_IN';
98
+ this.USER = 'USER';
99
+ this.MAIL = 'mail';
100
+ this.LOCALE = 'LOCALE';
101
+ this.CHANNEL = 'CHANNEL';
102
+ this.CUSTOMER = 'CUSTOMER';
103
+ this.CHANNELSELLER = 'CHANNELSELLER';
104
+ /* activeChannelSwitch? */
105
+ this.activeChannelChange = false;
106
+ this.loggedInSubject = new BehaviorSubject(false);
107
+ this.loggingInSubject = new BehaviorSubject(false);
108
+ this.userInSubject = new BehaviorSubject(null);
109
+ this.channelsUserSubject = new BehaviorSubject([]);
110
+ /* private customerSubject = new BehaviorSubject<any>(null) */
111
+ this.user = null;
112
+ // APIS
113
+ this.tokenApi = function () { return 'shop-api/login_check'; };
114
+ this.registerApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/register'; };
115
+ this.registerWholesalerApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/register-wholesaler'; };
116
+ this.confirmAccountApi = function (token) { return 'shop-api/' + _this.constants.getChannel() + '/verify-account?token=' + token; };
117
+ this.resetPasswordApi = function (token) { return 'shop-api/' + _this.constants.getChannel() + '/password-reset/' + token; };
118
+ this.recoverPasswordApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/request-password-reset'; };
119
+ this.countriesApi = function () { return 'shop-api/' + _this.constants.getChannel() + '/countries'; };
120
+ // Atributos utiles
121
+ this.waiting = false;
122
+ this.loggedIn = this.loggedInSubject.asObservable();
123
+ this.loggingIn = this.loggingInSubject.asObservable();
124
+ this.userAuth = this.userInSubject.asObservable();
125
+ this.channelsUser = this.channelsUserSubject.asObservable();
126
+ /* private customer = this.channelsUserSubject.asObservable() */
127
+ this.customer = null;
128
+ this.channel = null;
129
+ this.channels = [];
130
+ this.homeResolver = null;
131
+ this.channelAccessPermission = function (res) {
132
+ var _a, _b, _c;
133
+ _this.channelsUserSubject.next([]);
134
+ /* Please remove this ASAP - Needs *channels* array in user object ALWAYS */
135
+ /* if (UserRoleType.SELLER == res.type as UserRoleType) return true */
136
+ /* No authorized channels */
137
+ if (((_a = res.channels) === null || _a === void 0 ? void 0 : _a.length) == 0) {
138
+ return false;
139
+ }
140
+ /* Some authorized channel(s) including current channel */
141
+ if (res.channels.find(function (userchannel) { return userchannel.code === _this.channel.code; })) {
142
+ /* Multiple authorized channels including current channel */
143
+ if (((_b = res.channels) === null || _b === void 0 ? void 0 : _b.length) > 1 && _this.activeChannelChange)
144
+ _this.channelsUserSubject.next(res.channels);
145
+ return true;
146
+ }
147
+ /* One authorized channel not including current channel */
148
+ if (((_c = res.channels) === null || _c === void 0 ? void 0 : _c.length) == 1 && _this.activeChannelChange) {
149
+ delete res.password;
150
+ _this.channelAccess(res.channels[0], res);
151
+ return true;
152
+ }
153
+ /* Multiple authorized channels not including current channel */
154
+ if (_this.activeChannelChange) {
155
+ _this.channelsUserSubject.next(res.channels);
156
+ return true;
157
+ }
158
+ return false;
159
+ };
160
+ this.channelAccess = function (channel, user) {
161
+ if (user === void 0) { user = null; }
162
+ if (window.location.hostname != channel.hostname) {
163
+ var encoded = btoa(JSON.stringify(user != null ? user : _this.user));
164
+ window.location.replace(window.location.protocol + "//" + channel.hostname + "/auth/redirect/" + encoded);
165
+ }
166
+ else {
167
+ _this.constants.modifyChannelConfig(channel);
168
+ window.location.reload();
169
+ }
170
+ };
171
+ /**
172
+ * @desc Devuelve una promesa
173
+ * @param user Objeto que contiene username y password
174
+ */
175
+ this.doLogin = function (user) {
176
+ _this.loggingInSubject.next(true);
177
+ user = __assign(__assign({}, user), _this.constants.loginExtraData());
178
+ return _this.connection.post(_this.tokenApi(), user).pipe(map(function (res) { return _this.doLoginUser(res); }), mapTo('ok'), catchError(function (err) {
179
+ _this.loggingInSubject.next(false);
180
+ return of(err.toString());
181
+ })).toPromise();
182
+ };
183
+ this.signUp = function (data) { return _this.connection.post(_this.registerApi(), data); };
184
+ this.confirmAccount = function (token) {
185
+ return _this.connection.get(_this.confirmAccountApi(token));
186
+ };
187
+ this.passwordReset = function (new_password, token) {
188
+ var data = { password: { first: new_password, second: new_password } };
189
+ return _this.connection.put(_this.resetPasswordApi(token), data);
190
+ };
191
+ this.recoverPassword = function (email) {
192
+ return _this.connection.put(_this.recoverPasswordApi(), { email: email });
193
+ };
194
+ this.isTokenExpired = function () {
195
+ var fecha_expiracion = _this.getExpiratesAt();
196
+ var result = moment() >= moment(fecha_expiracion);
197
+ return result;
198
+ };
199
+ this.getExpiratesAt = function () { return localStorage.getItem(_this.EXPIRATES_IN); };
200
+ this.hasToRefresh = function () { return _this.getRefreshToken(); };
201
+ this.signUpWholesaler = function (data) { return _this.connection.post(_this.registerWholesalerApi(), data); };
202
+ this.getCountriesData = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
203
+ return [2 /*return*/, this.connection.get(this.countriesApi()).pipe(map(function (res) { return res._embedded.items; })).toPromise()];
204
+ }); }); };
205
+ this.setActiveChannelChange = function (activelyChangeChannelsOnLogin) { return _this.activeChannelChange = activelyChangeChannelsOnLogin; };
206
+ this.isAllowedRole = function (allowedRoles, role) {
207
+ return allowedRoles.length
208
+ ? allowedRoles.includes(role)
209
+ : true;
210
+ };
211
+ /* Please remove this ASAP - Needs *channels* array in user object ALWAYS */
212
+ this.forceChannelsForSeller = function (tokens) {
213
+ var _a;
214
+ var _b;
215
+ if ("seller" /* SELLER */ == tokens.type)
216
+ ((_b = _this.channels) === null || _b === void 0 ? void 0 : _b.length) ? (_a = _this.user).setChannels.apply(_a, __spread(_this.channels)) : _this.user.setChannels(_this.channel);
217
+ };
218
+ /**
219
+ * @description Cambia de canal
220
+ * @param channelConfig debe ser un objeto que contenga al menos las keys channel y locale.
221
+ */
222
+ this.changeChannel = function (channelConfig) {
223
+ _this.constants.modifyChannelConfig({
224
+ channel: channelConfig.channel,
225
+ locale: channelConfig.locale
226
+ });
227
+ };
228
+ /**
229
+ * @description Carga el cliente con el que se realizaran pedidos. Si recibe el valor null
230
+ * se vuelve a cargar el vendedor para su uso.
231
+ * @param customer
232
+ */
233
+ this.setCustomer = function (customer) {
234
+ var refreshPage = false;
235
+ _this.customer = customer;
236
+ localStorage.setItem(_this.CUSTOMER, JSON.stringify(customer));
237
+ var sameChannel = customer ? _this.sameChannel(customer.channels[0].code, customer.channels[0].locales.code) : null;
238
+ if (customer) {
239
+ if (!sameChannel) {
240
+ !localStorage.getItem(_this.CHANNELSELLER) ?
241
+ localStorage.setItem(_this.CHANNELSELLER, JSON.stringify({
242
+ channel: _this.constants.getChannel(),
243
+ locale: _this.constants.getLocale()
244
+ })) : null;
245
+ _this.changeChannel({
246
+ channel: customer.channels[0].code,
247
+ locale: customer.channels[0].locales.code
248
+ });
249
+ refreshPage = true;
250
+ }
251
+ }
252
+ else {
253
+ var res = JSON.parse(localStorage.getItem(_this.CHANNELSELLER));
254
+ if (res) {
255
+ if (!_this.sameChannel(res.channel, res.locale)) {
256
+ _this.changeChannel(res);
257
+ refreshPage = true;
258
+ }
259
+ localStorage.removeItem(_this.CHANNELSELLER);
260
+ }
261
+ }
262
+ _this.injector.get(CartService).clearAndResetCustomerCart();
263
+ refreshPage ? location.href = location.href : null;
264
+ };
265
+ /**
266
+ * @description Comprueba si los valores del canal actual son iguales a los ingresado por parametros.
267
+ * @param {string} channel Nombre del canal
268
+ * @param {string} locale Locale del canal
269
+ * @returns {boolean} True si es el mismo canal, False caso contrario.
270
+ */
271
+ this.sameChannel = function (channel, locale) { return (channel == _this.constants.getChannel()) && (locale == _this.constants.getLocale()); };
272
+ /* public getCustomer = () => Observable.of(JSON.parse(localStorage.getItem(this.CUSTOMER))) */
273
+ this.getCustomer = function () {
274
+ /* this.customerSubject.next(JSON.parse(localStorage.getItem(this.CUSTOMER)))
275
+ return this.customer */
276
+ return _this.customer || JSON.parse(localStorage.getItem(_this.CUSTOMER));
277
+ };
278
+ this.setHomeResolver = function (resolverFunction) { return _this.homeResolver = resolverFunction; };
279
+ this.getHomeResolver = function () { return _this.homeResolver; };
280
+ this.isAbleToBuy = function () { var _a; return !((_a = _this.getUserProfileAsUser()) === null || _a === void 0 ? void 0 : _a.isSeller()) || !!_this.getCustomer(); };
281
+ /**
282
+ * @description Evalua si el valor que ingresa por parámetro es mayor o igual al mínimo de compra
283
+ * que el usuario tiene asignado a ese canal, diferenciando si es mayorista o minorista.
284
+ * @param {number} value
285
+ * @returns {boolean} true si excede el monto, false caso contrario
286
+ */
287
+ this.exceedsMinimumAmount = function (value) {
288
+ if (value === void 0) { value = 0; }
289
+ return _this.user.isWholesaler() ? _this.user.channels.find(function (channel) { return _this.constants.getChannel() == channel.code; }).wholesalerMinimumPurchaseAmount <= value
290
+ : _this.user.channels.find(function (channel) { return _this.constants.getChannel() == channel.code; }).retailerMinimumPurchaseAmount <= value;
291
+ };
292
+ this.isAuthenticated() && this.loggedInSubject.next(true);
293
+ }
294
+ /**
295
+ * @desc Devuelve un observable
296
+ * @param user Objeto que contiene username y password
297
+ */
298
+ AuthService.prototype.login = function (user, withRoles) {
299
+ var _this = this;
300
+ if (withRoles === void 0) { withRoles = []; }
301
+ this.injector.get(ChannelConfigService).channelConfig$.subscribe(function (ch) { return _this.channel = ch; });
302
+ this.injector.get(ChannelConfigService).channels.subscribe(function (ch) { return _this.channels = ch; });
303
+ this.loggingInSubject.next(true);
304
+ user = __assign(__assign({}, user), this.constants.loginExtraData());
305
+ var result = this.connection.post(this.tokenApi(), user).pipe(map(function (res) {
306
+ if (_this.channelAccessPermission(__assign(__assign({}, user), res)) && _this.isAllowedRole(withRoles, res.type)) {
307
+ _this.doLoginUser(__assign(__assign({}, user), res));
308
+ return 'ok';
309
+ }
310
+ return 'error';
311
+ }), catchError(function (err) {
312
+ _this.loggingInSubject.next(false);
313
+ return of(err.toString());
314
+ }));
315
+ return result;
316
+ };
317
+ AuthService.prototype.getUserProfile = function () {
318
+ return (this.user && Observable.of(this.user)) || this.getCurrentUser();
319
+ };
320
+ AuthService.prototype.getUserProfileAsUser = function () {
321
+ return this.user || this.getCurrentUserAsUser();
322
+ };
323
+ AuthService.prototype.getCurrentUserAsUser = function () {
324
+ var _this = this;
325
+ var _a;
326
+ this.user = new User();
327
+ if (!this.user.loadFromStorage()) {
328
+ this.user = null;
329
+ }
330
+ else if ((_a = this.user) === null || _a === void 0 ? void 0 : _a.channels.find(function (userchannel) { var _a; return ((_a = userchannel) === null || _a === void 0 ? void 0 : _a.code) === _this.constants.getChannel(); })) {
331
+ return this.user;
332
+ }
333
+ else {
334
+ this.logout();
335
+ }
336
+ return this.user;
337
+ };
338
+ AuthService.prototype.getCurrentUser = function () {
339
+ this.user = new User();
340
+ if (!this.user.loadFromStorage()) {
341
+ this.user = null;
342
+ }
343
+ return Observable.of(this.user);
344
+ };
345
+ AuthService.prototype.isAuthenticated = function () {
346
+ if (this.isTokenExpired()) {
347
+ this.doLogoutUser();
348
+ }
349
+ this.getCurrentUserAsUser();
350
+ this.userInSubject.next(this.user);
351
+ return this.getToken() && !this.isTokenExpired() && this.user != null;
352
+ };
353
+ /* TOKEN */
354
+ AuthService.prototype.logout = function () {
355
+ this.doLogoutUser();
356
+ };
357
+ AuthService.prototype.refreshToken = function () {
358
+ var _this = this;
359
+ var data = __assign(__assign({}, this.constants.loginExtraData()), { refresh_token: this.getRefreshToken() });
360
+ return this.connection.post(this.tokenApi(), data).pipe(map(function (res) { return _this.doLoginUser(res); }));
361
+ };
362
+ AuthService.prototype.getToken = function () {
363
+ return localStorage.getItem(this.JWT_TOKEN);
364
+ };
365
+ AuthService.prototype.doLoginUser = function (tokens) {
366
+ this.user = new User();
367
+ this.user.initilized(tokens);
368
+ this.forceChannelsForSeller(tokens);
369
+ this.user.persistInStorage();
370
+ localStorage.setItem(this.EXPIRATES_IN, moment(tokens.expires_in).add(1, 'h').format());
371
+ localStorage.setItem(this.REFRESH_TOKEN, moment(tokens.expires_in).add(1, 'h').format());
372
+ localStorage.setItem(this.JWT_TOKEN, tokens.token);
373
+ localStorage.setItem(this.MAIL, tokens.username);
374
+ this.userInSubject.next(this.user);
375
+ this.loggedInSubject.next(true);
376
+ this.loggingInSubject.next(false);
377
+ };
378
+ AuthService.prototype.doLogoutUser = function () {
379
+ this.user = null;
380
+ localStorage.removeItem(this.USER);
381
+ localStorage.removeItem(this.EXPIRATES_IN);
382
+ localStorage.removeItem(this.JWT_TOKEN);
383
+ localStorage.removeItem(this.REFRESH_TOKEN);
384
+ localStorage.removeItem('cart_token');
385
+ localStorage.removeItem(this.MAIL);
386
+ localStorage.removeItem(this.CHANNEL);
387
+ localStorage.removeItem(this.CHANNELSELLER);
388
+ localStorage.removeItem(this.LOCALE);
389
+ localStorage.removeItem(this.CUSTOMER);
390
+ localStorage.removeItem('MASTER_CHANNEL');
391
+ this.loggedInSubject.next(false);
392
+ this.userInSubject.next(this.user);
393
+ this.channelsUserSubject.next([]);
394
+ };
395
+ AuthService.prototype.getRefreshToken = function () {
396
+ return localStorage.getItem(this.REFRESH_TOKEN);
397
+ };
398
+ AuthService.ctorParameters = function () { return [
399
+ { type: ConnectionService },
400
+ { type: ToastrService },
401
+ { type: Constants },
402
+ { type: Injector }
403
+ ]; };
404
+ AuthService.ɵprov = i0.ɵɵdefineInjectable({ factory: function AuthService_Factory() { return new i1.AuthService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i2.ToastrService), i0.ɵɵinject(i1.Constants), i0.ɵɵinject(i0.INJECTOR)); }, token: i1.AuthService, providedIn: "root" });
405
+ AuthService = __decorate([
406
+ Injectable({
407
+ providedIn: 'root'
408
+ })
409
+ ], AuthService);
410
+ return AuthService;
411
+ }());
412
+ export { AuthService };
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBTyxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQU83QztJQTBDSSxxQkFBb0IsVUFBNkIsRUFDckMsYUFBNEIsRUFDNUIsU0FBb0IsRUFDcEIsUUFBa0I7UUFIOUIsaUJBTUM7UUFObUIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDckMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBM0NiLGNBQVMs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QUFZLENBQUMsQ0FBQztRQUN0QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1QyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxZQUFZLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUVPLHFDQUFlLEdBQXZCO1FBQ0ksT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRCxDQUFDOztnQkF6TStCLGlCQUFpQjtnQkFDdEIsYUFBYTtnQkFDakIsU0FBUztnQkFDVixRQUFROzs7SUE3Q3JCLFdBQVc7UUFIdkIsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztPQUNXLFdBQVcsQ0E2VnZCO3NCQS9XRDtDQStXQyxBQTdWRCxJQTZWQztTQTdWWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2Nvbm5lY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vY2xhc3Nlcy91c2VyJztcbmltcG9ydCAncnhqcy9hZGQvb2JzZXJ2YWJsZS9vZic7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBtYXAsIG1hcFRvLCBjYXRjaEVycm9yLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMtY29tcGF0L29wZXJhdG9yL3Rha2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuL2NhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVXNlclJvbGVUeXBlIH0gZnJvbSAnLi4vY2xhc3Nlcy91c2VyLXJvbGUtdHlwZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBKV1RfVE9LRU4gPSAnSldUX1RPS0VOJ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgUkVGUkVTSF9UT0tFTiA9ICdSRUZSRVNIX1RPS0VOJ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgRVhQSVJBVEVTX0lOID0gJ0VYUElSQVRFU19JTidcbiAgICBwcml2YXRlIHJlYWRvbmx5IFVTRVIgPSAnVVNFUidcbiAgICBwcml2YXRlIHJlYWRvbmx5IE1BSUwgPSAnbWFpbCdcbiAgICBwcml2YXRlIHJlYWRvbmx5IExPQ0FMRSA9ICdMT0NBTEUnXG4gICAgcHJpdmF0ZSByZWFkb25seSBDSEFOTkVMID0gJ0NIQU5ORUwnXG4gICAgcHJpdmF0ZSByZWFkb25seSBDVVNUT01FUiA9ICdDVVNUT01FUidcbiAgICBwcml2YXRlIHJlYWRvbmx5IENIQU5ORUxTRUxMRVIgPSAnQ0hBTk5FTFNFTExFUidcblxuICAgIC8qIGFjdGl2ZUNoYW5uZWxTd2l0Y2g/ICovXG4gICAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsQ2hhbmdlOiBib29sZWFuID0gZmFsc2VcbiAgICBwcml2YXRlIGxvZ2dlZEluU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihmYWxzZSlcbiAgICBwcml2YXRlIGxvZ2dpbmdJblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oZmFsc2UpXG4gICAgcHJpdmF0ZSB1c2VySW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyPihudWxsKVxuICAgIHByaXZhdGUgY2hhbm5lbHNVc2VyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKVxuICAgIC8qIHByaXZhdGUgY3VzdG9tZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpICovXG4gICAgcHJpdmF0ZSB1c2VyOiBVc2VyID0gbnVsbFxuXG4gICAgLy8gQVBJU1xuICAgIHB1YmxpYyB0b2tlbkFwaSA9ICgpID0+ICdzaG9wLWFwaS9sb2dpbl9jaGVjayc7XG4gICAgcHVibGljIHJlZ2lzdGVyQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3JlZ2lzdGVyJztcbiAgICBwdWJsaWMgcmVnaXN0ZXJXaG9sZXNhbGVyQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3JlZ2lzdGVyLXdob2xlc2FsZXInO1xuICAgIHB1YmxpYyBjb25maXJtQWNjb3VudEFwaSA9ICh0b2tlbikgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3ZlcmlmeS1hY2NvdW50P3Rva2VuPScgKyB0b2tlbjtcbiAgICBwdWJsaWMgcmVzZXRQYXNzd29yZEFwaSA9ICh0b2tlbikgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3Bhc3N3b3JkLXJlc2V0LycgKyB0b2tlbjtcbiAgICBwdWJsaWMgcmVjb3ZlclBhc3N3b3JkQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgKyAnL3JlcXVlc3QtcGFzc3dvcmQtcmVzZXQnO1xuICAgIHB1YmxpYyBjb3VudHJpZXNBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RhbnRzLmdldENoYW5uZWwoKSArICcvY291bnRyaWVzJztcblxuICAgIC8vIEF0cmlidXRvcyB1dGlsZXNcbiAgICBwdWJsaWMgd2FpdGluZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBsb2dnZWRJbiA9IHRoaXMubG9nZ2VkSW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpXG4gICAgcHVibGljIGxvZ2dpbmdJbiA9IHRoaXMubG9nZ2luZ0luU3ViamVjdC5hc09ic2VydmFibGUoKVxuICAgIHB1YmxpYyB1c2VyQXV0aCA9IHRoaXMudXNlckluU3ViamVjdC5hc09ic2VydmFibGUoKVxuICAgIHB1YmxpYyBjaGFubmVsc1VzZXIgPSB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QuYXNPYnNlcnZhYmxlKClcbiAgICAvKiBwcml2YXRlIGN1c3RvbWVyID0gdGhpcy5jaGFubmVsc1VzZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpICovXG4gICAgcHJpdmF0ZSBjdXN0b21lciA9IG51bGxcbiAgICBwdWJsaWMgY2hhbm5lbCA9IG51bGxcbiAgICBwdWJsaWMgY2hhbm5lbHMgPSBbXVxuICAgIHByaXZhdGUgaG9tZVJlc29sdmVyID0gbnVsbFxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdHJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbnN0YW50czogQ29uc3RhbnRzLFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICAgICkge1xuICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMubG9nZ2VkSW5TdWJqZWN0Lm5leHQodHJ1ZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXZ1ZWx2ZSB1biBvYnNlcnZhYmxlXG4gICAgICogQHBhcmFtIHVzZXIgT2JqZXRvIHF1ZSBjb250aWVuZSB1c2VybmFtZSB5IHBhc3N3b3JkIFxuICAgICAqL1xuICAgIGxvZ2luKHVzZXI6IHsgdXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyB9LCB3aXRoUm9sZXM6IFVzZXJSb2xlVHlwZVtdID0gW10pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICB0aGlzLmluamVjdG9yLmdldChDaGFubmVsQ29uZmlnU2VydmljZSkuY2hhbm5lbENvbmZpZyQuc3Vic2NyaWJlKGNoID0+IHRoaXMuY2hhbm5lbCA9IGNoKVxuICAgICAgICB0aGlzLmluamVjdG9yLmdldChDaGFubmVsQ29uZmlnU2VydmljZSkuY2hhbm5lbHMuc3Vic2NyaWJlKGNoID0+IHRoaXMuY2hhbm5lbHMgPSBjaClcbiAgICAgICAgdGhpcy5sb2dnaW5nSW5TdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHVzZXIgPSB7IC4uLnVzZXIsIC4uLnRoaXMuY29uc3RhbnRzLmxvZ2luRXh0cmFEYXRhKCkgfTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMudG9rZW5BcGkoKSwgdXNlcikucGlwZShcbiAgICAgICAgICAgIG1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoYW5uZWxBY2Nlc3NQZXJtaXNzaW9uKHsgLi4udXNlciwgLi4ucmVzIH0pICYmIHRoaXMuaXNBbGxvd2VkUm9sZSh3aXRoUm9sZXMsIHJlcy50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvTG9naW5Vc2VyKHsgLi4udXNlciwgLi4ucmVzIH0pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2snXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnZXJyb3InXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dpbmdJblN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGVyci50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBjaGFubmVsQWNjZXNzUGVybWlzc2lvbiA9IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5jaGFubmVsc1VzZXJTdWJqZWN0Lm5leHQoW10pXG5cbiAgICAgICAgLyogUGxlYXNlIHJlbW92ZSB0aGlzIEFTQVAgLSBOZWVkcyAqY2hhbm5lbHMqIGFycmF5IGluIHVzZXIgb2JqZWN0IEFMV0FZUyAqL1xuICAgICAgICAvKiBpZiAoVXNlclJvbGVUeXBlLlNFTExFUiA9PSByZXMudHlwZSBhcyBVc2VyUm9sZVR5cGUpIHJldHVybiB0cnVlICovXG5cbiAgICAgICAgLyogTm8gYXV0aG9yaXplZCBjaGFubmVscyAqL1xuICAgICAgICBpZiAocmVzLmNoYW5uZWxzPy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgLyogU29tZSBhdXRob3JpemVkIGNoYW5uZWwocykgaW5jbHVkaW5nIGN1cnJlbnQgY2hhbm5lbCAqL1xuICAgICAgICBpZiAocmVzLmNoYW5uZWxzLmZpbmQodXNlcmNoYW5uZWwgPT4gdXNlcmNoYW5uZWwuY29kZSA9PT0gdGhpcy5jaGFubmVsLmNvZGUpKSB7XG4gICAgICAgICAgICAvKiBNdWx0aXBsZSBhdXRob3JpemVkIGNoYW5uZWxzIGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cbiAgICAgICAgICAgIGlmIChyZXMuY2hhbm5lbHM/Lmxlbmd0aCA+IDEgJiYgdGhpcy5hY3RpdmVDaGFubmVsQ2hhbmdlKVxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KHJlcy5jaGFubmVscylcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgLyogT25lIGF1dGhvcml6ZWQgY2hhbm5lbCBub3QgaW5jbHVkaW5nIGN1cnJlbnQgY2hhbm5lbCAqL1xuICAgICAgICBpZiAocmVzLmNoYW5uZWxzPy5sZW5ndGggPT0gMSAmJiB0aGlzLmFjdGl2ZUNoYW5uZWxDaGFuZ2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSByZXMucGFzc3dvcmRcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbEFjY2VzcyhyZXMuY2hhbm5lbHNbMF0sIHJlcylcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgLyogTXVsdGlwbGUgYXV0aG9yaXplZCBjaGFubmVscyBub3QgaW5jbHVkaW5nIGN1cnJlbnQgY2hhbm5lbCAqL1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVDaGFubmVsQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QubmV4dChyZXMuY2hhbm5lbHMpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNoYW5uZWxBY2Nlc3MgPSAoY2hhbm5lbCwgdXNlciA9IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSAhPSBjaGFubmVsLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICBsZXQgZW5jb2RlZCA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkodXNlciAhPSBudWxsID8gdXNlciA6IHRoaXMudXNlcikpXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShgJHt3aW5kb3cubG9jYXRpb24ucHJvdG9jb2x9Ly8ke2NoYW5uZWwuaG9zdG5hbWV9L2F1dGgvcmVkaXJlY3QvJHtlbmNvZGVkfWApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbnN0YW50cy5tb2RpZnlDaGFubmVsQ29uZmlnKGNoYW5uZWwpXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjIERldnVlbHZlIHVuYSBwcm9tZXNhXG4gICAgICogQHBhcmFtIHVzZXIgT2JqZXRvIHF1ZSBjb250aWVuZSB1c2VybmFtZSB5IHBhc3N3b3JkIFxuICAgICAqL1xuICAgIGRvTG9naW4gPSAodXNlcjogeyB1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgdGhpcy5sb2dnaW5nSW5TdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHVzZXIgPSB7IC4uLnVzZXIsIC4uLnRoaXMuY29uc3RhbnRzLmxvZ2luRXh0cmFEYXRhKCkgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMudG9rZW5BcGkoKSwgdXNlcikucGlwZShcbiAgICAgICAgICAgIG1hcChyZXMgPT4gdGhpcy5kb0xvZ2luVXNlcihyZXMpKSxcbiAgICAgICAgICAgIG1hcFRvKCdvaycpLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2luZ0luU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoZXJyLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKS50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBnZXRVc2VyUHJvZmlsZSgpOiBPYnNlcnZhYmxlPFVzZXI+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnVzZXIgJiYgT2JzZXJ2YWJsZS5vZih0aGlzLnVzZXIpKSB8fCB0aGlzLmdldEN1cnJlbnRVc2VyKCk7XG4gICAgfVxuXG4gICAgZ2V0VXNlclByb2ZpbGVBc1VzZXIoKTogVXNlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXIgfHwgdGhpcy5nZXRDdXJyZW50VXNlckFzVXNlcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJBc1VzZXIoKTogVXNlciB7XG4gICAgICAgIHRoaXMudXNlciA9IG5ldyBVc2VyKCk7XG4gICAgICAgIGlmICghdGhpcy51c2VyLmxvYWRGcm9tU3RvcmFnZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXIgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy51c2VyPy5jaGFubmVscy5maW5kKHVzZXJjaGFubmVsID0+IHVzZXJjaGFubmVsPy5jb2RlID09PSB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51c2VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dvdXQoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnVzZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDdXJyZW50VXNlcigpOiBPYnNlcnZhYmxlPFVzZXI+IHtcbiAgICAgICAgdGhpcy51c2VyID0gbmV3IFVzZXIoKTtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIubG9hZEZyb21TdG9yYWdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudXNlciA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5vZih0aGlzLnVzZXIpO1xuICAgIH1cblxuICAgIHNpZ25VcCA9IChkYXRhKSA9PiB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnJlZ2lzdGVyQXBpKCksIGRhdGEpO1xuXG4gICAgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmRvTG9nb3V0VXNlcigpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZXRDdXJyZW50VXNlckFzVXNlcigpXG4gICAgICAgIHRoaXMudXNlckluU3ViamVjdC5uZXh0KHRoaXMudXNlcik7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRva2VuKCkgJiYgIXRoaXMuaXNUb2tlbkV4cGlyZWQoKSAmJiB0aGlzLnVzZXIgIT0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25maXJtQWNjb3VudCA9ICh0b2tlbjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZ2V0KHRoaXMuY29uZmlybUFjY291bnRBcGkodG9rZW4pKTtcblxuICAgIHBhc3N3b3JkUmVzZXQgPSAobmV3X3Bhc3N3b3JkLCB0b2tlbikgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0geyBwYXNzd29yZDogeyBmaXJzdDogbmV3X3Bhc3N3b3JkLCBzZWNvbmQ6IG5ld19wYXNzd29yZCB9IH07XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24ucHV0KHRoaXMucmVzZXRQYXNzd29yZEFwaSh0b2tlbiksIGRhdGEpO1xuICAgIH1cblxuICAgIHJlY292ZXJQYXNzd29yZCA9IChlbWFpbDogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucHV0KHRoaXMucmVjb3ZlclBhc3N3b3JkQXBpKCksIHsgZW1haWwgfSk7XG5cbiAgICAvKiBUT0tFTiAqL1xuXG4gICAgbG9nb3V0KCkge1xuICAgICAgICB0aGlzLmRvTG9nb3V0VXNlcigpO1xuICAgIH1cblxuICAgIHJlZnJlc2hUb2tlbigpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB7IC4uLnRoaXMuY29uc3RhbnRzLmxvZ2luRXh0cmFEYXRhKCksIHJlZnJlc2hfdG9rZW46IHRoaXMuZ2V0UmVmcmVzaFRva2VuKCkgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy50b2tlbkFwaSgpLCBkYXRhKS5waXBlKG1hcChcbiAgICAgICAgICAgIHJlcyA9PiB0aGlzLmRvTG9naW5Vc2VyKHJlcylcbiAgICAgICAgKSlcbiAgICB9XG5cbiAgICBnZXRUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuSldUX1RPS0VOKTtcbiAgICB9XG5cbiAgICBpc1Rva2VuRXhwaXJlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZmVjaGFfZXhwaXJhY2lvbiA9IHRoaXMuZ2V0RXhwaXJhdGVzQXQoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbW9tZW50KCkgPj0gbW9tZW50KGZlY2hhX2V4cGlyYWNpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldEV4cGlyYXRlc0F0ID0gKCkgPT4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5FWFBJUkFURVNfSU4pO1xuXG4gICAgcHVibGljIGRvTG9naW5Vc2VyKHRva2Vucykge1xuICAgICAgICB0aGlzLnVzZXIgPSBuZXcgVXNlcigpXG4gICAgICAgIHRoaXMudXNlci5pbml0aWxpemVkKHRva2VucylcbiAgICAgICAgdGhpcy5mb3JjZUNoYW5uZWxzRm9yU2VsbGVyKHRva2VucylcbiAgICAgICAgdGhpcy51c2VyLnBlcnNpc3RJblN0b3JhZ2UoKVxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkVYUElSQVRFU19JTiwgbW9tZW50KHRva2Vucy5leHBpcmVzX2luKS5hZGQoMSwgJ2gnKS5mb3JtYXQoKSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTiwgbW9tZW50KHRva2Vucy5leHBpcmVzX2luKS5hZGQoMSwgJ2gnKS5mb3JtYXQoKSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuSldUX1RPS0VOLCB0b2tlbnMudG9rZW4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLk1BSUwsIHRva2Vucy51c2VybmFtZSk7XG4gICAgICAgIHRoaXMudXNlckluU3ViamVjdC5uZXh0KHRoaXMudXNlcik7XG4gICAgICAgIHRoaXMubG9nZ2VkSW5TdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMubG9nZ2luZ0luU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZG9Mb2dvdXRVc2VyKCkge1xuICAgICAgICB0aGlzLnVzZXIgPSBudWxsXG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuVVNFUik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuRVhQSVJBVEVTX0lOKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5KV1RfVE9LRU4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlJFRlJFU0hfVE9LRU4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLk1BSUwpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUwpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUxTRUxMRVIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkxPQ0FMRSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ1VTVE9NRVIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnTUFTVEVSX0NIQU5ORUwnKTtcbiAgICAgICAgdGhpcy5sb2dnZWRJblN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMudXNlckluU3ViamVjdC5uZXh0KHRoaXMudXNlcik7XG4gICAgICAgIHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KFtdKVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVmcmVzaFRva2VuKCkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5SRUZSRVNIX1RPS0VOKTtcbiAgICB9XG5cbiAgICBoYXNUb1JlZnJlc2ggPSAoKSA9PiB0aGlzLmdldFJlZnJlc2hUb2tlbigpO1xuXG4gICAgc2lnblVwV2hvbGVzYWxlciA9IChkYXRhKSA9PiB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnJlZ2lzdGVyV2hvbGVzYWxlckFwaSgpLCBkYXRhKTtcblxuICAgIGdldENvdW50cmllc0RhdGEgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZ2V0KHRoaXMuY291bnRyaWVzQXBpKCkpLnBpcGUobWFwKHJlcyA9PiByZXMuX2VtYmVkZGVkLml0ZW1zKSkudG9Qcm9taXNlKCk7XG5cbiAgICBwdWJsaWMgc2V0QWN0aXZlQ2hhbm5lbENoYW5nZSA9IChhY3RpdmVseUNoYW5nZUNoYW5uZWxzT25Mb2dpbjogYm9vbGVhbikgPT4gdGhpcy5hY3RpdmVDaGFubmVsQ2hhbmdlID0gYWN0aXZlbHlDaGFuZ2VDaGFubmVsc09uTG9naW5cblxuICAgIHByaXZhdGUgaXNBbGxvd2VkUm9sZSA9IChhbGxvd2VkUm9sZXM6IFVzZXJSb2xlVHlwZVtdLCByb2xlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGFsbG93ZWRSb2xlcy5sZW5ndGhcbiAgICAgICAgICAgID8gYWxsb3dlZFJvbGVzLmluY2x1ZGVzKHJvbGUgYXMgVXNlclJvbGVUeXBlKVxuICAgICAgICAgICAgOiB0cnVlXG4gICAgfVxuXG4gICAgLyogUGxlYXNlIHJlbW92ZSB0aGlzIEFTQVAgLSBOZWVkcyAqY2hhbm5lbHMqIGFycmF5IGluIHVzZXIgb2JqZWN0IEFMV0FZUyAqL1xuICAgIHByaXZhdGUgZm9yY2VDaGFubmVsc0ZvclNlbGxlciA9IHRva2VucyA9PiB7XG4gICAgICAgIGlmIChVc2VyUm9sZVR5cGUuU0VMTEVSID09IHRva2Vucy50eXBlIGFzIFVzZXJSb2xlVHlwZSlcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHM/Lmxlbmd0aFxuICAgICAgICAgICAgICAgID8gdGhpcy51c2VyLnNldENoYW5uZWxzKC4uLnRoaXMuY2hhbm5lbHMpXG4gICAgICAgICAgICAgICAgOiB0aGlzLnVzZXIuc2V0Q2hhbm5lbHModGhpcy5jaGFubmVsKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDYW1iaWEgZGUgY2FuYWxcbiAgICAgKiBAcGFyYW0gY2hhbm5lbENvbmZpZyBkZWJlIHNlciB1biBvYmpldG8gcXVlIGNvbnRlbmdhIGFsIG1lbm9zIGxhcyBrZXlzIGNoYW5uZWwgeSBsb2NhbGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjaGFuZ2VDaGFubmVsID0gKGNoYW5uZWxDb25maWc6YW55KSA9PiB7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLm1vZGlmeUNoYW5uZWxDb25maWcoe1xuICAgICAgICAgICAgY2hhbm5lbDogY2hhbm5lbENvbmZpZy5jaGFubmVsLFxuICAgICAgICAgICAgbG9jYWxlOiBjaGFubmVsQ29uZmlnLmxvY2FsZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDYXJnYSBlbCBjbGllbnRlIGNvbiBlbCBxdWUgc2UgcmVhbGl6YXJhbiBwZWRpZG9zLiBTaSByZWNpYmUgZWwgdmFsb3IgbnVsbFxuICAgICAqIHNlIHZ1ZWx2ZSBhIGNhcmdhciBlbCB2ZW5kZWRvciBwYXJhIHN1IHVzby4gIFxuICAgICAqIEBwYXJhbSBjdXN0b21lciBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q3VzdG9tZXIgPSBjdXN0b21lciA9PiB7XG4gICAgICAgIGxldCByZWZyZXNoUGFnZSA9IGZhbHNlXG4gICAgICAgIHRoaXMuY3VzdG9tZXIgPSBjdXN0b21lclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNVU1RPTUVSLCBKU09OLnN0cmluZ2lmeShjdXN0b21lcikpXG4gICAgICAgIFxuICAgICAgICBsZXQgc2FtZUNoYW5uZWwgPSBjdXN0b21lciA/IHRoaXMuc2FtZUNoYW5uZWwoY3VzdG9tZXIuY2hhbm5lbHNbMF0uY29kZSwgY3VzdG9tZXIuY2hhbm5lbHNbMF0ubG9jYWxlcy5jb2RlKSA6IG51bGxcbiAgICAgICAgXG4gICAgICAgIGlmIChjdXN0b21lcikge1xuICAgICAgICAgICAgaWYoIXNhbWVDaGFubmVsKXtcbiAgICAgICAgICAgICAgICAhbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DSEFOTkVMU0VMTEVSKSA/XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUiwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmNvbnN0YW50cy5nZXRMb2NhbGUoKVxuICAgICAgICAgICAgICAgICAgICB9KSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ2hhbm5lbCh7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IGN1c3RvbWVyLmNoYW5uZWxzWzBdLmNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogY3VzdG9tZXIuY2hhbm5lbHNbMF0ubG9jYWxlcy5jb2RlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUikpXG4gICAgICAgICAgICBpZihyZXMpe1xuICAgICAgICAgICAgICAgIGlmKCF0aGlzLnNhbWVDaGFubmVsKHJlcy5jaGFubmVsLCByZXMubG9jYWxlKSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ2hhbm5lbChyZXMpXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUxTRUxMRVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KENhcnRTZXJ2aWNlKS5jbGVhckFuZFJlc2V0Q3VzdG9tZXJDYXJ0KClcbiAgICAgICAgcmVmcmVzaFBhZ2UgPyBsb2NhdGlvbi5ocmVmID0gbG9jYXRpb24uaHJlZiA6IG51bGxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29tcHJ1ZWJhIHNpIGxvcyB2YWxvcmVzIGRlbCBjYW5hbCBhY3R1YWwgc29uIGlndWFsZXMgYSBsb3MgaW5ncmVzYWRvIHBvciBwYXJhbWV0cm9zLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIE5vbWJyZSBkZWwgY2FuYWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlICBMb2NhbGUgZGVsIGNhbmFsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgc2kgZXMgZWwgbWlzbW8gY2FuYWwsIEZhbHNlIGNhc28gY29udHJhcmlvLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2FtZUNoYW5uZWwgPSAoY2hhbm5lbDpzdHJpbmcsIGxvY2FsZTpzdHJpbmcpOmJvb2xlYW4gPT4gKGNoYW5uZWwgPT0gdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpKSAmJiAobG9jYWxlID09IHRoaXMuY29uc3RhbnRzLmdldExvY2FsZSgpKVxuXG4gICAgLyogcHVibGljIGdldEN1c3RvbWVyID0gKCkgPT4gT2JzZXJ2YWJsZS5vZihKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ1VTVE9NRVIpKSkgKi9cblxuICAgIHB1YmxpYyBnZXRDdXN0b21lciA9ICgpID0+IHtcbiAgICAgICAgLyogdGhpcy5jdXN0b21lclN1YmplY3QubmV4dChKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ1VTVE9NRVIpKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tZXIgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tZXIgfHwgSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVU1RPTUVSKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SG9tZVJlc29sdmVyID0gcmVzb2x2ZXJGdW5jdGlvbiA9PiB0aGlzLmhvbWVSZXNvbHZlciA9IHJlc29sdmVyRnVuY3Rpb25cblxuICAgIHB1YmxpYyBnZXRIb21lUmVzb2x2ZXIgPSAoKSA9PiB0aGlzLmhvbWVSZXNvbHZlclxuXG4gICAgcHVibGljIGlzQWJsZVRvQnV5ID0gKCk6IGJvb2xlYW4gPT4gIXRoaXMuZ2V0VXNlclByb2ZpbGVBc1VzZXIoKT8uaXNTZWxsZXIoKSB8fCAhIXRoaXMuZ2V0Q3VzdG9tZXIoKVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEV2YWx1YSBzaSBlbCB2YWxvciBxdWUgaW5ncmVzYSBwb3IgcGFyw6FtZXRybyBlcyBtYXlvciBvIGlndWFsIGFsIG3DrW5pbW8gZGUgY29tcHJhXG4gICAgICogcXVlIGVsIHVzdWFyaW8gdGllbmUgYXNpZ25hZG8gYSBlc2UgY2FuYWwsIGRpZmVyZW5jaWFuZG8gc2kgZXMgbWF5b3Jpc3RhIG8gbWlub3Jpc3RhLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBzaSBleGNlZGUgZWwgbW9udG8sIGZhbHNlIGNhc28gY29udHJhcmlvXG4gICAgICovXG4gICAgcHVibGljIGV4Y2VlZHNNaW5pbXVtQW1vdW50ID0gKHZhbHVlOm51bWJlcj0wKTpib29sZWFuID0+ICBcbiAgICAgICAgdGhpcy51c2VyLmlzV2hvbGVzYWxlcigpID8gdGhpcy51c2VyLmNoYW5uZWxzLmZpbmQoIGNoYW5uZWwgPT4gdGhpcy5jb25zdGFudHMuZ2V0Q2hhbm5lbCgpID09IGNoYW5uZWwuY29kZSkud2hvbGVzYWxlck1pbmltdW1QdXJjaGFzZUFtb3VudCA8PSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnVzZXIuY2hhbm5lbHMuZmluZCggY2hhbm5lbCA9PiB0aGlzLmNvbnN0YW50cy5nZXRDaGFubmVsKCkgPT0gY2hhbm5lbC5jb2RlKS5yZXRhaWxlck1pbmltdW1QdXJjaGFzZUFtb3VudCA8PSB2YWx1ZVxufSJdfQ==